sootsim 0.1.238 → 0.1.240
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/dist-cli/bin.js +4 -4
- package/dist-cli/chunks/{agent-VQVLJBBZ.js → agent-YS355M7O.js} +2 -2
- package/dist-cli/chunks/{agent-wrapper-ABFE7KJQ.js → agent-wrapper-DJJH2DE5.js} +2 -2
- package/dist-cli/chunks/{app-fonts-ODI2DJ7C.js → app-fonts-2KURCNO7.js} +2 -2
- package/dist-cli/chunks/{assert-ZXNN3U2C.js → assert-Y7SV6LAY.js} +2 -2
- package/dist-cli/chunks/{auth-LMHWH6T3.js → auth-5VMBSD6F.js} +2 -2
- package/dist-cli/chunks/beta-KMI4GCCN.js +2 -0
- package/dist-cli/chunks/{camera-VWTIE3VW.js → camera-WCQNMZRH.js} +2 -2
- package/dist-cli/chunks/{chunk-EGRRMDLA.js → chunk-2QILUPQJ.js} +1 -1
- package/dist-cli/chunks/{chunk-D5LYVGSE.js → chunk-2ZEVD46I.js} +3 -3
- package/dist-cli/chunks/{chunk-XUOCSWW4.js → chunk-3RYTIG4Y.js} +1 -1
- package/dist-cli/chunks/{chunk-XWGGIFDB.js → chunk-3ULI43M6.js} +16 -8
- package/dist-cli/chunks/{chunk-CDAMSEOW.js → chunk-4F63QBYN.js} +3 -3
- package/dist-cli/chunks/{chunk-6UMCNLKY.js → chunk-4FUKKXDQ.js} +2 -2
- package/dist-cli/chunks/{chunk-SCLKEUCN.js → chunk-5LCZXDDX.js} +1 -1
- package/dist-cli/chunks/{chunk-2PFG3UHP.js → chunk-6XHVSTMH.js} +2 -2
- package/dist-cli/chunks/{chunk-MT2HMCDI.js → chunk-7ZTOWAQF.js} +2 -2
- package/dist-cli/chunks/{chunk-6PYVHZVH.js → chunk-AX56F2Z5.js} +1 -1
- package/dist-cli/chunks/{chunk-IHEPAACR.js → chunk-BWR3AJZ3.js} +1 -1
- package/dist-cli/chunks/{chunk-2FFZXFDY.js → chunk-C4MSUAGM.js} +1 -1
- package/dist-cli/chunks/{chunk-LYSW5PTM.js → chunk-DEO54ZY3.js} +2 -2
- package/dist-cli/chunks/{chunk-HTTHCQQS.js → chunk-DQEI7LOC.js} +3 -3
- package/dist-cli/chunks/{chunk-HC6JXVIP.js → chunk-EJ6ULQFO.js} +2 -2
- package/dist-cli/chunks/{chunk-MD5GBDM4.js → chunk-GI36DI2I.js} +1 -1
- package/dist-cli/chunks/{chunk-6KMMJDSE.js → chunk-GW7REFUB.js} +1 -1
- package/dist-cli/chunks/{chunk-XOKMWX3P.js → chunk-GYWIGJB7.js} +2 -2
- package/dist-cli/chunks/{chunk-CXV3CSSF.js → chunk-H6GS5C4F.js} +2 -2
- package/dist-cli/chunks/{chunk-UYFE2VRP.js → chunk-HIFBYPJK.js} +2 -2
- package/dist-cli/chunks/{chunk-CU7M5IBW.js → chunk-ILU6JNUJ.js} +1 -1
- package/dist-cli/chunks/{chunk-5MQZW32V.js → chunk-JDRG4T3G.js} +2 -2
- package/dist-cli/chunks/{chunk-ECCUSCHO.js → chunk-KENWUOKC.js} +2 -2
- package/dist-cli/chunks/{chunk-7OQU5M3J.js → chunk-KY2HHVDG.js} +2 -2
- package/dist-cli/chunks/{chunk-OHLPCYOM.js → chunk-LBOSTYWQ.js} +1 -1
- package/dist-cli/chunks/{chunk-4DN5YMPS.js → chunk-M2MJXMTO.js} +1 -1
- package/dist-cli/chunks/{chunk-QGCNRLCM.js → chunk-M2OTE66X.js} +2 -2
- package/dist-cli/chunks/{chunk-5MFTB3S4.js → chunk-M3VY5LEN.js} +1 -1
- package/dist-cli/chunks/{chunk-NCJGR7VZ.js → chunk-NJYDI627.js} +1 -1
- package/dist-cli/chunks/{chunk-YK4NG4BL.js → chunk-OBQJXFV3.js} +1 -1
- package/dist-cli/chunks/{chunk-GI4YPHU6.js → chunk-OKHNWLZ7.js} +2 -2
- package/dist-cli/chunks/{chunk-CGQTOBHQ.js → chunk-OUW757HM.js} +128 -87
- package/dist-cli/chunks/chunk-R54EGANH.js +1 -0
- package/dist-cli/chunks/{chunk-54XALXOI.js → chunk-SFNTUDIP.js} +2 -2
- package/dist-cli/chunks/{chunk-KGAN3JXK.js → chunk-SW5HPJC7.js} +2 -2
- package/dist-cli/chunks/{chunk-YNSDDYLM.js → chunk-T7BLBFPG.js} +2 -2
- package/dist-cli/chunks/{chunk-3KVQ35TN.js → chunk-TFXCEOCW.js} +1 -1
- package/dist-cli/chunks/chunk-U3VMQUN6.js +1 -0
- package/dist-cli/chunks/{chunk-RTMLR7KA.js → chunk-VU5WTUZJ.js} +2 -2
- package/dist-cli/chunks/{chunk-DMSG7ESJ.js → chunk-WYT6JDAV.js} +1 -1
- package/dist-cli/chunks/{chunk-A46S76WN.js → chunk-XSSTKHK7.js} +2 -2
- package/dist-cli/chunks/{chunk-4DPHH2DS.js → chunk-XV4VXQDA.js} +2 -2
- package/dist-cli/chunks/{chunk-VTY35NKD.js → chunk-XVE2O2IR.js} +2 -2
- package/dist-cli/chunks/{chunk-QGFPGXNJ.js → chunk-ZYMOUSJC.js} +1 -1
- package/dist-cli/chunks/cli-version-2BXTYTLJ.js +2 -0
- package/dist-cli/chunks/{compat-JZPFXICF.js → compat-LUERFKMW.js} +3 -3
- package/dist-cli/chunks/{config-UL7HLQDC.js → config-U4Z6TYT6.js} +2 -2
- package/dist-cli/chunks/{control-QKU5C5S2.js → control-I5YB63IZ.js} +2 -2
- package/dist-cli/chunks/daemon-VTG3XKWA.js +2 -0
- package/dist-cli/chunks/{debug-H5DH3AQF.js → debug-HXECWDLV.js} +3 -3
- package/dist-cli/chunks/{desktop-6KNJHXC3.js → desktop-NZJLDJIO.js} +3 -3
- package/dist-cli/chunks/{detox-GGHGQ4ZT.js → detox-LUOT4TIA.js} +2 -2
- package/dist-cli/chunks/{device-BRDNCJVC.js → device-7TZ7BD36.js} +2 -2
- package/dist-cli/chunks/{diagnose-YYUH2HKW.js → diagnose-DW2ANEGF.js} +2 -2
- package/dist-cli/chunks/drivers-RDXY5SDO.js +2 -0
- package/dist-cli/chunks/{film-ZCOJKWH3.js → film-6MYMKZ3N.js} +3 -3
- package/dist-cli/chunks/flow-KS77CBEA.js +2 -0
- package/dist-cli/chunks/help-H3ZD3LVG.js +2 -0
- package/dist-cli/chunks/{hidden-runtime-alias-FKPQZHNW.js → hidden-runtime-alias-FUDVEMFB.js} +2 -2
- package/dist-cli/chunks/{home-paths-XVONOHWM.js → home-paths-KU4MY22X.js} +2 -2
- package/dist-cli/chunks/inspect-ACDDO276.js +2 -0
- package/dist-cli/chunks/install-desktop-UQVXJAXS.js +2 -0
- package/dist-cli/chunks/{login-4DXNKRVF.js → login-EVS4SZQN.js} +4 -4
- package/dist-cli/chunks/{logout-ARENLQQ5.js → logout-K5MLSAWM.js} +2 -2
- package/dist-cli/chunks/{maestro-G7VNKI32.js → maestro-OEDT2T7V.js} +3 -3
- package/dist-cli/chunks/{maestro-generate-U3YRKKPN.js → maestro-generate-T4RZSVSM.js} +3 -3
- package/dist-cli/chunks/{mode-FNLKDZKM.js → mode-TZU7JML2.js} +2 -2
- package/dist-cli/chunks/optional-demo-registry-NIJ3MA5N.js +2 -0
- package/dist-cli/chunks/{perf-C3O4QGRB.js → perf-YNBU57WH.js} +2 -2
- package/dist-cli/chunks/{record-YEOZEOTK.js → record-V6T2INPF.js} +3 -3
- package/dist-cli/chunks/runtime-7XBSKGNO.js +2 -0
- package/dist-cli/chunks/{screenshot-command-CCVMBNZ7.js → screenshot-command-CZZ6IXSD.js} +3 -3
- package/dist-cli/chunks/{screenshots-capture-GIVPWSQG.js → screenshots-capture-WVR5FCHX.js} +2 -2
- package/dist-cli/chunks/serve-6I35UUFI.js +41 -0
- package/dist-cli/chunks/{setup-OQ7EMGIY.js → setup-O7GD6GME.js} +3 -3
- package/dist-cli/chunks/{skills-Z25AHTRM.js → skills-GBTBS2OK.js} +2 -2
- package/dist-cli/chunks/{storage-EDYGSOMU.js → storage-FI2YOPQE.js} +2 -2
- package/dist-cli/chunks/store-FU7T5NPV.js +2 -0
- package/dist-cli/chunks/telemetry-REPVX6LA.js +2 -0
- package/dist-cli/chunks/{timeline-FTAZATIZ.js → timeline-E5DVVATK.js} +2 -2
- package/dist-cli/chunks/{upgrade-JBRL4AHX.js → upgrade-QKOI3Q4U.js} +2 -2
- package/dist-cli/chunks/upload-IFQM3FG4.js +2 -0
- package/dist-cli/chunks/{version-H6PRWWUE.js → version-UANAPNZM.js} +2 -2
- package/dist-cli/chunks/web-4LZ7DUUS.js +2 -0
- package/dist-cli/chunks/{what-happened-A7IDSBXP.js → what-happened-JOLNICMX.js} +2 -2
- package/dist-lib/agent-daemon-client.cjs +1 -1
- package/dist-lib/agent-events.cjs +1 -1
- package/dist-lib/agent-identity.cjs +1 -1
- package/dist-lib/agent-sessions.cjs +1 -1
- package/dist-lib/attached-projects.cjs +1 -1
- package/dist-lib/auth/shared-session.cjs +1 -1
- 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 +1 -1
- package/dist-lib/cli-constants.cjs +1 -1
- package/dist-lib/config.cjs +1 -1
- package/dist-lib/detox/index.cjs +1 -1
- package/dist-lib/dev-bundle-resolution.cjs +1 -1
- package/dist-lib/home-paths.cjs +1 -1
- package/dist-lib/host/bridge-host.cjs +77 -33
- package/dist-lib/host/fetch-proxy-handler.cjs +77 -33
- package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
- package/dist-lib/host/websocket-proxy.cjs +1 -1
- package/dist-lib/index.cjs +1 -1
- package/dist-lib/jump-to-source-babel.cjs +1 -1
- package/dist-lib/menu.cjs +1 -1
- package/dist-lib/menu.mjs +1 -1
- package/dist-lib/metro.cjs +1 -1
- package/dist-lib/profiles.cjs +1 -1
- package/dist-lib/render-mode.cjs +1 -1
- package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
- package/dist-lib/sdk.cjs +91 -4
- package/dist-lib/sdk.mjs +91 -4
- package/dist-lib/skills.cjs +105 -40
- package/dist-lib/vite.cjs +1 -1
- package/package.json +1 -1
- package/src/host/fetch-proxy-handler.ts +104 -52
- package/dist-cli/chunks/beta-TN34R6YC.js +0 -2
- package/dist-cli/chunks/chunk-QAKSIRZO.js +0 -1
- package/dist-cli/chunks/chunk-UV4NF53M.js +0 -1
- package/dist-cli/chunks/cli-version-JMIF5EGD.js +0 -2
- package/dist-cli/chunks/daemon-IREYS2N7.js +0 -2
- package/dist-cli/chunks/drivers-IHDBZZUB.js +0 -2
- package/dist-cli/chunks/flow-TXWXTHAY.js +0 -2
- package/dist-cli/chunks/help-TAORLP73.js +0 -2
- package/dist-cli/chunks/inspect-ALJUDST3.js +0 -2
- package/dist-cli/chunks/install-desktop-W5JGGPCV.js +0 -2
- package/dist-cli/chunks/optional-demo-registry-Y5KQWQ6V.js +0 -2
- package/dist-cli/chunks/runtime-VCWHZCYU.js +0 -2
- package/dist-cli/chunks/serve-KYU7THWX.js +0 -41
- package/dist-cli/chunks/store-BP3EICTQ.js +0 -2
- package/dist-cli/chunks/telemetry-K2S6RLSW.js +0 -2
- package/dist-cli/chunks/upload-JVFQZS5Z.js +0 -2
- package/dist-cli/chunks/web-D45A6FKK.js +0 -2
package/dist-lib/sdk.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.240 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
|
|
3
3
|
// cli/commands/inspect/core.ts
|
|
4
4
|
function resolveMaxMsFlag(args, fallbackMs) {
|
|
@@ -250,6 +250,14 @@ function layoutGetNativeEval(opts = {}) {
|
|
|
250
250
|
const abs = n.absolute || n.absolutePosition || { x: layout.x, y: layout.y }
|
|
251
251
|
const text = typeof n.text === 'string' && n.text.trim() ? n.text.trim() : undefined
|
|
252
252
|
const base = {
|
|
253
|
+
...(typeof n.nodeId === 'number'
|
|
254
|
+
? {
|
|
255
|
+
nodeId: n.nodeId,
|
|
256
|
+
ancestorIds: Array.isArray(n.ancestors)
|
|
257
|
+
? n.ancestors.map((ancestor) => ancestor && ancestor.nodeId).filter((id) => typeof id === 'number')
|
|
258
|
+
: [],
|
|
259
|
+
}
|
|
260
|
+
: {}),
|
|
253
261
|
testID: n.testID || n.testId || undefined,
|
|
254
262
|
role: n.accessibilityRole || n.role || undefined,
|
|
255
263
|
type: typeof n.type === 'string' ? n.type : 'node',
|
|
@@ -959,7 +967,13 @@ async function inspectScrollStateAt(bridge, x, y) {
|
|
|
959
967
|
path: "__sootsimTest.getScrollStateAt",
|
|
960
968
|
args: [x, y]
|
|
961
969
|
});
|
|
962
|
-
|
|
970
|
+
if (!result || typeof result !== "object") return null;
|
|
971
|
+
const state = result;
|
|
972
|
+
return {
|
|
973
|
+
...state,
|
|
974
|
+
scrollOffsetX: typeof state.scrollOffsetX === "number" ? state.scrollOffsetX : state.offsetX,
|
|
975
|
+
scrollOffsetY: typeof state.scrollOffsetY === "number" ? state.scrollOffsetY : state.offsetY
|
|
976
|
+
};
|
|
963
977
|
}
|
|
964
978
|
async function inspectLogs(bridge) {
|
|
965
979
|
const res = await bridge.send({
|
|
@@ -1469,6 +1483,7 @@ function tapTiming(agent, opts = {}) {
|
|
|
1469
1483
|
}
|
|
1470
1484
|
function isTapSuccess(result) {
|
|
1471
1485
|
if (!result || result.hit === false || result.ok === false) return false;
|
|
1486
|
+
if (result.requestedTargetMatched === false) return false;
|
|
1472
1487
|
if (result.pointerTapHandled === false && !result.keyboardOpened && !result.isTextInput) {
|
|
1473
1488
|
return false;
|
|
1474
1489
|
}
|
|
@@ -1476,6 +1491,7 @@ function isTapSuccess(result) {
|
|
|
1476
1491
|
}
|
|
1477
1492
|
function tapTargetFromPayload(payload, textFallback) {
|
|
1478
1493
|
return {
|
|
1494
|
+
nodeId: payload.target?.nodeId ?? payload.match?.nodeId ?? payload.node?.nodeId ?? null,
|
|
1479
1495
|
id: payload.target?.id ?? payload.match?.id ?? payload.node?.id ?? null,
|
|
1480
1496
|
testID: payload.target?.testID ?? payload.match?.testID ?? payload.node?.testID ?? null,
|
|
1481
1497
|
text: payload.target?.text ?? payload.target?.accessibilityLabel ?? payload.match?.text ?? payload.match?.accessibilityLabel ?? payload.node?.text ?? textFallback ?? null,
|
|
@@ -1521,12 +1537,83 @@ async function tapResolvedTarget(bridge, args) {
|
|
|
1521
1537
|
lastOffscreenAt = at;
|
|
1522
1538
|
} else {
|
|
1523
1539
|
lastOffscreenAt = null;
|
|
1524
|
-
const
|
|
1540
|
+
const requestedTarget = tapTargetFromPayload(payload, args.textFallback);
|
|
1541
|
+
const verification = await bridge.send({
|
|
1542
|
+
type: "evaluate",
|
|
1543
|
+
code: `(async () => {
|
|
1544
|
+
const t = window.__sootsimTest
|
|
1545
|
+
if (
|
|
1546
|
+
!t ||
|
|
1547
|
+
typeof t.inspectAt !== 'function' ||
|
|
1548
|
+
typeof t.resolveTapTarget !== 'function'
|
|
1549
|
+
) {
|
|
1550
|
+
return { error: 'tap-target-inspection-unavailable' }
|
|
1551
|
+
}
|
|
1552
|
+
const requestedTarget = ${JSON.stringify(requestedTarget)}
|
|
1553
|
+
const inspected = await t.inspectAt(${payload.cx}, ${payload.cy})
|
|
1554
|
+
const resolved =
|
|
1555
|
+
inspected && typeof inspected.nodeId === 'number'
|
|
1556
|
+
? await t.resolveTapTarget(inspected.nodeId)
|
|
1557
|
+
: null
|
|
1558
|
+
const node = (resolved && resolved.target) || inspected
|
|
1559
|
+
const coordinateTarget = node
|
|
1560
|
+
? {
|
|
1561
|
+
nodeId: node.nodeId ?? null,
|
|
1562
|
+
id: node.id ?? null,
|
|
1563
|
+
testID: node.testID ?? null,
|
|
1564
|
+
text: node.text ?? node.accessibilityLabel ?? null,
|
|
1565
|
+
type: node.type ?? null,
|
|
1566
|
+
}
|
|
1567
|
+
: null
|
|
1568
|
+
const requestedTargetMatched =
|
|
1569
|
+
coordinateTarget === null
|
|
1570
|
+
? false
|
|
1571
|
+
: typeof requestedTarget.nodeId === 'number' &&
|
|
1572
|
+
typeof coordinateTarget.nodeId === 'number'
|
|
1573
|
+
? requestedTarget.nodeId === coordinateTarget.nodeId
|
|
1574
|
+
: requestedTarget.testID && coordinateTarget.testID
|
|
1575
|
+
? requestedTarget.testID === coordinateTarget.testID
|
|
1576
|
+
: requestedTarget.id && coordinateTarget.id
|
|
1577
|
+
? requestedTarget.id === coordinateTarget.id
|
|
1578
|
+
: false
|
|
1579
|
+
return {
|
|
1580
|
+
requestedTargetMatched,
|
|
1581
|
+
requestedTarget,
|
|
1582
|
+
coordinateTarget,
|
|
1583
|
+
}
|
|
1584
|
+
})()`
|
|
1585
|
+
});
|
|
1586
|
+
if (verification?.error) {
|
|
1587
|
+
return {
|
|
1588
|
+
payload,
|
|
1589
|
+
result: {
|
|
1590
|
+
hit: false,
|
|
1591
|
+
reason: verification.error,
|
|
1592
|
+
requestedTarget
|
|
1593
|
+
},
|
|
1594
|
+
attempts,
|
|
1595
|
+
failure: "special"
|
|
1596
|
+
};
|
|
1597
|
+
}
|
|
1598
|
+
if (verification?.requestedTargetMatched === false) {
|
|
1599
|
+
return {
|
|
1600
|
+
payload,
|
|
1601
|
+
result: {
|
|
1602
|
+
hit: false,
|
|
1603
|
+
reason: "target-covered",
|
|
1604
|
+
...verification
|
|
1605
|
+
},
|
|
1606
|
+
attempts,
|
|
1607
|
+
failure: "missed"
|
|
1608
|
+
};
|
|
1609
|
+
}
|
|
1610
|
+
const dispatched = await bridge.send({
|
|
1525
1611
|
type: "tap",
|
|
1526
1612
|
x: payload.cx,
|
|
1527
1613
|
y: payload.cy,
|
|
1528
|
-
target:
|
|
1614
|
+
target: requestedTarget
|
|
1529
1615
|
});
|
|
1616
|
+
const result = dispatched && typeof dispatched === "object" ? { ...dispatched, ...verification } : { hit: !!dispatched, ...verification };
|
|
1530
1617
|
lastResult = result;
|
|
1531
1618
|
if (isTapSuccess(result)) return { payload, result, attempts };
|
|
1532
1619
|
}
|
package/dist-lib/skills.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.240 | (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;
|
|
@@ -498,10 +498,10 @@ var init_registry = __esm({
|
|
|
498
498
|
{ range: ">=3.0.0 <4.0.0", coverage: 0.6, note: "basic screen container" },
|
|
499
499
|
{
|
|
500
500
|
range: ">=4.0.0",
|
|
501
|
-
coverage: 0.
|
|
501
|
+
coverage: 0.9,
|
|
502
502
|
note: "screen container, stack, header config, search bar, navigation props",
|
|
503
|
-
working: "Screen, ScreenContainer, ScreenStack, enableFreeze/freezeEnabled with delayed React freeze, Android modal/pageSheet push fallback, Android statusBarHidden/statusBarStyle/navigationBarHidden traits, push/pop slide, zoom/fade/fade_from_bottom transitions, edge swipe-back, parallax behind-screen, large title collapse, header (back button, inline/large title, custom left/center/right/search bar subviews, crossfade), useHeaderHeight, useTransitionProgress, FullWindowOverlay, SearchBar, Tabs.Host/Screen, lifecycle callbacks (onAppear/onDisappear/onWillAppear/onWillDisappear), onDismissed",
|
|
504
|
-
missing: "statusBarColor/navigationBarColor/navigationBarTranslucent ignored, replaceAnimation differentiation, formSheet
|
|
503
|
+
working: "Screen, ScreenContainer, ScreenStack, enableFreeze/freezeEnabled with delayed React freeze, Android modal/pageSheet push fallback, Android statusBarHidden/statusBarStyle/navigationBarHidden traits, push/pop slide, zoom/fade/fade_from_bottom transitions, edge swipe-back, parallax behind-screen, large title collapse, header (back button, inline/large title, custom left/center/right/search bar subviews, native header bar buttons/menus/badges, crossfade), formSheet custom initial detents/corner radius/grabber/undimmed range and stacked sheets, useHeaderHeight, useTransitionProgress, FullWindowOverlay, SearchBar, Tabs.Host/Screen, lifecycle callbacks (onAppear/onDisappear/onWillAppear/onWillDisappear), onDismissed",
|
|
504
|
+
missing: "statusBarColor/navigationBarColor/navigationBarTranslucent ignored, replaceAnimation differentiation, interactive drag between formSheet detents, integrated search bar placements"
|
|
505
505
|
}
|
|
506
506
|
]
|
|
507
507
|
},
|
|
@@ -3844,6 +3844,19 @@ var init_registry = __esm({
|
|
|
3844
3844
|
]
|
|
3845
3845
|
},
|
|
3846
3846
|
// --- react-navigation: pure JS, runs as-is on top of stubbed screens/gesture-handler/safe-area ---
|
|
3847
|
+
"@vxrn/native": {
|
|
3848
|
+
category: "Navigation",
|
|
3849
|
+
stubType: "native",
|
|
3850
|
+
versions: [
|
|
3851
|
+
{
|
|
3852
|
+
range: ">=1.21.0",
|
|
3853
|
+
coverage: 0.72,
|
|
3854
|
+
note: "native-seam only for toolbar/menu host views. the real @vxrn/native StackToolbar and MenuAction React code runs from the bundle and converts its public composition API into native host props and native-stack header items.",
|
|
3855
|
+
working: "StackToolbar header and bottom placements, Button, Label, Icon with SF Symbols/image sources, Badge, fixed/fluid Spacer, View children, nested Menu/MenuAction trees, disabled/selected/destructive actions, visible action callbacks, and native-stack header bar item integration",
|
|
3856
|
+
missing: "Color and zoom-transition native hosts, SplitView gamma host, bottom SearchBarSlot integration with a configured native search controller, exact UIKit shared-background grouping"
|
|
3857
|
+
}
|
|
3858
|
+
]
|
|
3859
|
+
},
|
|
3847
3860
|
"@react-navigation/native": {
|
|
3848
3861
|
category: "Navigation",
|
|
3849
3862
|
stubType: "works",
|
|
@@ -3862,10 +3875,10 @@ var init_registry = __esm({
|
|
|
3862
3875
|
versions: [
|
|
3863
3876
|
{
|
|
3864
3877
|
range: ">=6.0.0",
|
|
3865
|
-
coverage: 0.
|
|
3878
|
+
coverage: 0.93,
|
|
3866
3879
|
note: "pure JS wrapper around react-native-screens (stubbed); push/pop, header, modals, large titles all flow through screens stub",
|
|
3867
|
-
working: "createNativeStackNavigator, Screen, Group, Navigator, header config (title, back button, large title, search bar, custom left/right), Android modal/pageSheet push fallback, modal/formSheet/pageSheet presentation, push/pop animations, gesture-driven back, freezeOnBlur via react-native-screens, useHeaderHeight",
|
|
3868
|
-
missing: "fidelity bound by react-native-screens stub \u2014 formSheet
|
|
3880
|
+
working: "createNativeStackNavigator, Screen, Group, Navigator, header config (title, back button, large title, search bar, custom left/right, unstable native header button/menu items), Android modal/pageSheet push fallback, modal/formSheet/pageSheet presentation, formSheet initial custom detents/corner radius/grabber/undimmed range and stacked sheets, push/pop animations, gesture-driven back, freezeOnBlur via react-native-screens, useHeaderHeight",
|
|
3881
|
+
missing: "fidelity bound by react-native-screens stub \u2014 interactive drag between formSheet detents and integrated search bar placements"
|
|
3869
3882
|
}
|
|
3870
3883
|
]
|
|
3871
3884
|
},
|
|
@@ -12881,12 +12894,6 @@ function formatFetchProxyError(targetUrl, err) {
|
|
|
12881
12894
|
}
|
|
12882
12895
|
return message;
|
|
12883
12896
|
}
|
|
12884
|
-
function isTextProxyContentType(contentType) {
|
|
12885
|
-
const value = Array.isArray(contentType) ? contentType[0] : contentType;
|
|
12886
|
-
const normalized = value?.split(";", 1)[0]?.trim().toLowerCase();
|
|
12887
|
-
if (!normalized) return false;
|
|
12888
|
-
return normalized.startsWith("text/") || normalized === "application/json" || normalized.endsWith("+json") || normalized === "application/x-www-form-urlencoded" || normalized === "application/xml" || normalized.endsWith("+xml") || normalized === "application/javascript" || normalized === "application/graphql";
|
|
12889
|
-
}
|
|
12890
12897
|
function buildFetchProxyHeaders(reqHeaders, targetUrl) {
|
|
12891
12898
|
const headers = {};
|
|
12892
12899
|
for (const [key, value] of Object.entries(reqHeaders)) {
|
|
@@ -12945,7 +12952,6 @@ async function handleFetchProxyRequest(req, res) {
|
|
|
12945
12952
|
res.end("invalid url param");
|
|
12946
12953
|
return;
|
|
12947
12954
|
}
|
|
12948
|
-
const headers = buildFetchProxyHeaders(req.headers, upstreamUrl);
|
|
12949
12955
|
let body;
|
|
12950
12956
|
if (req.method !== "GET" && req.method !== "HEAD") {
|
|
12951
12957
|
const chunks = [];
|
|
@@ -12953,39 +12959,89 @@ async function handleFetchProxyRequest(req, res) {
|
|
|
12953
12959
|
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
|
|
12954
12960
|
}
|
|
12955
12961
|
if (chunks.length > 0) {
|
|
12956
|
-
|
|
12957
|
-
body = isTextProxyContentType(req.headers["content-type"]) ? bytes.toString("utf8") : bytes;
|
|
12962
|
+
body = Buffer.concat(chunks);
|
|
12958
12963
|
}
|
|
12959
12964
|
}
|
|
12960
|
-
|
|
12961
|
-
|
|
12962
|
-
|
|
12963
|
-
|
|
12964
|
-
|
|
12965
|
-
|
|
12966
|
-
|
|
12965
|
+
const originalMethod = req.method || "GET";
|
|
12966
|
+
const proxy = async (targetUrl2, method, nextBody, redirects) => {
|
|
12967
|
+
const transport = targetUrl2.protocol === "https:" ? import_https.default : import_http2.default;
|
|
12968
|
+
const targetHeaders = buildFetchProxyHeaders(req.headers, targetUrl2);
|
|
12969
|
+
if (targetUrl2.origin !== upstreamUrl.origin) {
|
|
12970
|
+
delete targetHeaders.authorization;
|
|
12971
|
+
delete targetHeaders["proxy-authorization"];
|
|
12972
|
+
}
|
|
12973
|
+
if (method === "GET" || method === "HEAD") {
|
|
12974
|
+
delete targetHeaders["content-length"];
|
|
12975
|
+
delete targetHeaders["content-type"];
|
|
12976
|
+
} else if (nextBody) {
|
|
12977
|
+
targetHeaders["content-length"] = String(nextBody.byteLength);
|
|
12978
|
+
}
|
|
12979
|
+
const proxyRes = await new Promise((resolve5, reject) => {
|
|
12980
|
+
const proxyReq = transport.request(
|
|
12981
|
+
{
|
|
12982
|
+
hostname: targetUrl2.hostname,
|
|
12983
|
+
port: targetUrl2.port || (targetUrl2.protocol === "https:" ? 443 : 80),
|
|
12984
|
+
path: targetUrl2.pathname + targetUrl2.search,
|
|
12985
|
+
method,
|
|
12986
|
+
headers: targetHeaders
|
|
12987
|
+
},
|
|
12988
|
+
resolve5
|
|
12989
|
+
);
|
|
12990
|
+
const abort = () => proxyReq.destroy(new Error("fetch proxy client disconnected"));
|
|
12991
|
+
req.once("aborted", abort);
|
|
12992
|
+
proxyReq.once("close", () => req.off("aborted", abort));
|
|
12993
|
+
proxyReq.once("error", reject);
|
|
12994
|
+
if (nextBody === void 0) proxyReq.end();
|
|
12995
|
+
else proxyReq.end(nextBody);
|
|
12967
12996
|
});
|
|
12997
|
+
const status = proxyRes.statusCode ?? 502;
|
|
12998
|
+
const location = proxyRes.headers.location;
|
|
12999
|
+
if (location && (status === 301 || status === 302 || status === 303 || status === 307 || status === 308)) {
|
|
13000
|
+
if (redirects >= 10) {
|
|
13001
|
+
proxyRes.destroy();
|
|
13002
|
+
throw new Error("too many redirects");
|
|
13003
|
+
}
|
|
13004
|
+
const switchToGet = (status === 301 || status === 302) && method === "POST" || status === 303 && method !== "GET" && method !== "HEAD";
|
|
13005
|
+
const redirectUrl = new URL(location, targetUrl2);
|
|
13006
|
+
proxyRes.resume();
|
|
13007
|
+
await (0, import_promises2.finished)(proxyRes);
|
|
13008
|
+
await proxy(
|
|
13009
|
+
redirectUrl,
|
|
13010
|
+
switchToGet ? "GET" : method,
|
|
13011
|
+
switchToGet ? void 0 : nextBody,
|
|
13012
|
+
redirects + 1
|
|
13013
|
+
);
|
|
13014
|
+
return;
|
|
13015
|
+
}
|
|
13016
|
+
for (const [key, value] of Object.entries(proxyRes.headers)) {
|
|
13017
|
+
const lowerKey = key.toLowerCase();
|
|
13018
|
+
if (value === void 0 || lowerKey === "set-cookie" || lowerKey === "connection" || lowerKey === "keep-alive" || lowerKey === "proxy-authenticate" || lowerKey === "proxy-authorization" || lowerKey === "te" || lowerKey === "trailer" || lowerKey === "transfer-encoding" || lowerKey === "upgrade" || lowerKey.startsWith("access-control-")) {
|
|
13019
|
+
continue;
|
|
13020
|
+
}
|
|
13021
|
+
res.setHeader(key, value);
|
|
13022
|
+
}
|
|
13023
|
+
applyFetchProxyCors(res);
|
|
13024
|
+
const setCookie = proxyRes.headers["set-cookie"] ?? [];
|
|
13025
|
+
if (setCookie.length > 0) {
|
|
13026
|
+
res.setHeader(
|
|
13027
|
+
"x-sootsim-set-cookie",
|
|
13028
|
+
(Array.isArray(setCookie) ? setCookie : [setCookie]).join(", ")
|
|
13029
|
+
);
|
|
13030
|
+
}
|
|
13031
|
+
res.statusCode = status;
|
|
13032
|
+
await (0, import_promises2.pipeline)(proxyRes, res);
|
|
13033
|
+
};
|
|
13034
|
+
try {
|
|
13035
|
+
await proxy(upstreamUrl, originalMethod, body, 0);
|
|
12968
13036
|
} catch (err) {
|
|
13037
|
+
if (res.headersSent) {
|
|
13038
|
+
res.destroy(err instanceof Error ? err : new Error(String(err)));
|
|
13039
|
+
return;
|
|
13040
|
+
}
|
|
12969
13041
|
applyFetchProxyCors(res);
|
|
12970
13042
|
res.writeHead(502, { "Content-Type": "text/plain" });
|
|
12971
13043
|
res.end(`fetch proxy error: ${formatFetchProxyError(upstreamUrl.href, err)}`);
|
|
12972
|
-
return;
|
|
12973
13044
|
}
|
|
12974
|
-
upstream.headers.forEach((value, key) => {
|
|
12975
|
-
const lowerKey = key.toLowerCase();
|
|
12976
|
-
if (lowerKey === "content-encoding" || lowerKey === "transfer-encoding" || lowerKey === "content-length" || lowerKey === "set-cookie" || lowerKey.startsWith("access-control-")) {
|
|
12977
|
-
return;
|
|
12978
|
-
}
|
|
12979
|
-
res.setHeader(key, value);
|
|
12980
|
-
});
|
|
12981
|
-
applyFetchProxyCors(res);
|
|
12982
|
-
const setCookie = upstream.headers.getSetCookie?.() ?? [];
|
|
12983
|
-
if (setCookie.length > 0) {
|
|
12984
|
-
res.setHeader("x-sootsim-set-cookie", setCookie.join(", "));
|
|
12985
|
-
}
|
|
12986
|
-
res.statusCode = upstream.status;
|
|
12987
|
-
const buf = Buffer.from(await upstream.arrayBuffer());
|
|
12988
|
-
res.end(buf);
|
|
12989
13045
|
}
|
|
12990
13046
|
function handleAppApiRequest(req, res) {
|
|
12991
13047
|
const reqUrl = req.url || "";
|
|
@@ -13055,12 +13111,13 @@ function handleAppApiRequest(req, res) {
|
|
|
13055
13111
|
req.pipe(proxyReq);
|
|
13056
13112
|
return true;
|
|
13057
13113
|
}
|
|
13058
|
-
var import_http2, import_https, STRIP_FETCH_PROXY_HEADERS, FETCH_PROXY_CORS_HEADERS, APP_API_HEADER_REWRITES;
|
|
13114
|
+
var import_http2, import_https, import_promises2, STRIP_FETCH_PROXY_HEADERS, FETCH_PROXY_CORS_HEADERS, APP_API_HEADER_REWRITES;
|
|
13059
13115
|
var init_fetch_proxy_handler = __esm({
|
|
13060
13116
|
"src/host/fetch-proxy-handler.ts"() {
|
|
13061
13117
|
"use strict";
|
|
13062
13118
|
import_http2 = __toESM(require("http"), 1);
|
|
13063
13119
|
import_https = __toESM(require("https"), 1);
|
|
13120
|
+
import_promises2 = require("stream/promises");
|
|
13064
13121
|
init_fetch_proxy_overrides();
|
|
13065
13122
|
STRIP_FETCH_PROXY_HEADERS = /* @__PURE__ */ new Set([
|
|
13066
13123
|
"host",
|
|
@@ -16476,6 +16533,14 @@ function layoutGetNativeEval(opts = {}) {
|
|
|
16476
16533
|
const abs = n.absolute || n.absolutePosition || { x: layout.x, y: layout.y }
|
|
16477
16534
|
const text = typeof n.text === 'string' && n.text.trim() ? n.text.trim() : undefined
|
|
16478
16535
|
const base = {
|
|
16536
|
+
...(typeof n.nodeId === 'number'
|
|
16537
|
+
? {
|
|
16538
|
+
nodeId: n.nodeId,
|
|
16539
|
+
ancestorIds: Array.isArray(n.ancestors)
|
|
16540
|
+
? n.ancestors.map((ancestor) => ancestor && ancestor.nodeId).filter((id) => typeof id === 'number')
|
|
16541
|
+
: [],
|
|
16542
|
+
}
|
|
16543
|
+
: {}),
|
|
16479
16544
|
testID: n.testID || n.testId || undefined,
|
|
16480
16545
|
role: n.accessibilityRole || n.role || undefined,
|
|
16481
16546
|
type: typeof n.type === 'string' ? n.type : 'node',
|
package/dist-lib/vite.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! sootsim v0.1.
|
|
1
|
+
/*! sootsim v0.1.240 | (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/package.json
CHANGED
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
|
|
26
26
|
import http, { type IncomingMessage, type ServerResponse } from 'http'
|
|
27
27
|
import https from 'https'
|
|
28
|
+
import { finished, pipeline } from 'stream/promises'
|
|
28
29
|
import {
|
|
29
30
|
FETCH_PROXY_BROWSER_USER_AGENT,
|
|
30
31
|
getFetchProxyTargetHeaders,
|
|
@@ -98,22 +99,6 @@ function formatFetchProxyError(targetUrl: string, err: unknown): string {
|
|
|
98
99
|
return message
|
|
99
100
|
}
|
|
100
101
|
|
|
101
|
-
function isTextProxyContentType(contentType: string | string[] | undefined): boolean {
|
|
102
|
-
const value = Array.isArray(contentType) ? contentType[0] : contentType
|
|
103
|
-
const normalized = value?.split(';', 1)[0]?.trim().toLowerCase()
|
|
104
|
-
if (!normalized) return false
|
|
105
|
-
return (
|
|
106
|
-
normalized.startsWith('text/') ||
|
|
107
|
-
normalized === 'application/json' ||
|
|
108
|
-
normalized.endsWith('+json') ||
|
|
109
|
-
normalized === 'application/x-www-form-urlencoded' ||
|
|
110
|
-
normalized === 'application/xml' ||
|
|
111
|
-
normalized.endsWith('+xml') ||
|
|
112
|
-
normalized === 'application/javascript' ||
|
|
113
|
-
normalized === 'application/graphql'
|
|
114
|
-
)
|
|
115
|
-
}
|
|
116
|
-
|
|
117
102
|
export function buildFetchProxyHeaders(
|
|
118
103
|
reqHeaders: Record<string, string | string[] | undefined>,
|
|
119
104
|
targetUrl?: URL,
|
|
@@ -190,60 +175,127 @@ export async function handleFetchProxyRequest(
|
|
|
190
175
|
return
|
|
191
176
|
}
|
|
192
177
|
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
let body: BodyInit | undefined
|
|
178
|
+
let body: Buffer | undefined
|
|
196
179
|
if (req.method !== 'GET' && req.method !== 'HEAD') {
|
|
197
180
|
const chunks: Buffer[] = []
|
|
198
181
|
for await (const chunk of req) {
|
|
199
182
|
chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))
|
|
200
183
|
}
|
|
201
184
|
if (chunks.length > 0) {
|
|
202
|
-
|
|
203
|
-
body = isTextProxyContentType(req.headers['content-type'])
|
|
204
|
-
? bytes.toString('utf8')
|
|
205
|
-
: bytes
|
|
185
|
+
body = Buffer.concat(chunks)
|
|
206
186
|
}
|
|
207
187
|
}
|
|
208
188
|
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
189
|
+
const originalMethod = req.method || 'GET'
|
|
190
|
+
const proxy = async (
|
|
191
|
+
targetUrl: URL,
|
|
192
|
+
method: string,
|
|
193
|
+
nextBody: Buffer | undefined,
|
|
194
|
+
redirects: number,
|
|
195
|
+
): Promise<void> => {
|
|
196
|
+
const transport = targetUrl.protocol === 'https:' ? https : http
|
|
197
|
+
const targetHeaders = buildFetchProxyHeaders(req.headers, targetUrl)
|
|
198
|
+
if (targetUrl.origin !== upstreamUrl.origin) {
|
|
199
|
+
delete targetHeaders.authorization
|
|
200
|
+
delete targetHeaders['proxy-authorization']
|
|
201
|
+
}
|
|
202
|
+
if (method === 'GET' || method === 'HEAD') {
|
|
203
|
+
delete targetHeaders['content-length']
|
|
204
|
+
delete targetHeaders['content-type']
|
|
205
|
+
} else if (nextBody) {
|
|
206
|
+
targetHeaders['content-length'] = String(nextBody.byteLength)
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
const proxyRes = await new Promise<IncomingMessage>((resolve, reject) => {
|
|
210
|
+
const proxyReq = transport.request(
|
|
211
|
+
{
|
|
212
|
+
hostname: targetUrl.hostname,
|
|
213
|
+
port: targetUrl.port || (targetUrl.protocol === 'https:' ? 443 : 80),
|
|
214
|
+
path: targetUrl.pathname + targetUrl.search,
|
|
215
|
+
method,
|
|
216
|
+
headers: targetHeaders,
|
|
217
|
+
},
|
|
218
|
+
resolve,
|
|
219
|
+
)
|
|
220
|
+
const abort = () => proxyReq.destroy(new Error('fetch proxy client disconnected'))
|
|
221
|
+
req.once('aborted', abort)
|
|
222
|
+
proxyReq.once('close', () => req.off('aborted', abort))
|
|
223
|
+
proxyReq.once('error', reject)
|
|
224
|
+
if (nextBody === undefined) proxyReq.end()
|
|
225
|
+
else proxyReq.end(nextBody)
|
|
216
226
|
})
|
|
217
|
-
} catch (err) {
|
|
218
|
-
applyFetchProxyCors(res)
|
|
219
|
-
res.writeHead(502, { 'Content-Type': 'text/plain' })
|
|
220
|
-
res.end(`fetch proxy error: ${formatFetchProxyError(upstreamUrl.href, err)}`)
|
|
221
|
-
return
|
|
222
|
-
}
|
|
223
227
|
|
|
224
|
-
|
|
225
|
-
const
|
|
228
|
+
const status = proxyRes.statusCode ?? 502
|
|
229
|
+
const location = proxyRes.headers.location
|
|
226
230
|
if (
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
231
|
+
location &&
|
|
232
|
+
(status === 301 ||
|
|
233
|
+
status === 302 ||
|
|
234
|
+
status === 303 ||
|
|
235
|
+
status === 307 ||
|
|
236
|
+
status === 308)
|
|
232
237
|
) {
|
|
238
|
+
if (redirects >= 10) {
|
|
239
|
+
proxyRes.destroy()
|
|
240
|
+
throw new Error('too many redirects')
|
|
241
|
+
}
|
|
242
|
+
const switchToGet =
|
|
243
|
+
((status === 301 || status === 302) && method === 'POST') ||
|
|
244
|
+
(status === 303 && method !== 'GET' && method !== 'HEAD')
|
|
245
|
+
const redirectUrl = new URL(location, targetUrl)
|
|
246
|
+
proxyRes.resume()
|
|
247
|
+
await finished(proxyRes)
|
|
248
|
+
await proxy(
|
|
249
|
+
redirectUrl,
|
|
250
|
+
switchToGet ? 'GET' : method,
|
|
251
|
+
switchToGet ? undefined : nextBody,
|
|
252
|
+
redirects + 1,
|
|
253
|
+
)
|
|
233
254
|
return
|
|
234
255
|
}
|
|
235
|
-
res.setHeader(key, value)
|
|
236
|
-
})
|
|
237
|
-
applyFetchProxyCors(res)
|
|
238
256
|
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
257
|
+
for (const [key, value] of Object.entries(proxyRes.headers)) {
|
|
258
|
+
const lowerKey = key.toLowerCase()
|
|
259
|
+
if (
|
|
260
|
+
value === undefined ||
|
|
261
|
+
lowerKey === 'set-cookie' ||
|
|
262
|
+
lowerKey === 'connection' ||
|
|
263
|
+
lowerKey === 'keep-alive' ||
|
|
264
|
+
lowerKey === 'proxy-authenticate' ||
|
|
265
|
+
lowerKey === 'proxy-authorization' ||
|
|
266
|
+
lowerKey === 'te' ||
|
|
267
|
+
lowerKey === 'trailer' ||
|
|
268
|
+
lowerKey === 'transfer-encoding' ||
|
|
269
|
+
lowerKey === 'upgrade' ||
|
|
270
|
+
lowerKey.startsWith('access-control-')
|
|
271
|
+
) {
|
|
272
|
+
continue
|
|
273
|
+
}
|
|
274
|
+
res.setHeader(key, value)
|
|
275
|
+
}
|
|
276
|
+
applyFetchProxyCors(res)
|
|
277
|
+
const setCookie = proxyRes.headers['set-cookie'] ?? []
|
|
278
|
+
if (setCookie.length > 0) {
|
|
279
|
+
res.setHeader(
|
|
280
|
+
'x-sootsim-set-cookie',
|
|
281
|
+
(Array.isArray(setCookie) ? setCookie : [setCookie]).join(', '),
|
|
282
|
+
)
|
|
283
|
+
}
|
|
284
|
+
res.statusCode = status
|
|
285
|
+
await pipeline(proxyRes, res)
|
|
242
286
|
}
|
|
243
287
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
288
|
+
try {
|
|
289
|
+
await proxy(upstreamUrl, originalMethod, body, 0)
|
|
290
|
+
} catch (err) {
|
|
291
|
+
if (res.headersSent) {
|
|
292
|
+
res.destroy(err instanceof Error ? err : new Error(String(err)))
|
|
293
|
+
return
|
|
294
|
+
}
|
|
295
|
+
applyFetchProxyCors(res)
|
|
296
|
+
res.writeHead(502, { 'Content-Type': 'text/plain' })
|
|
297
|
+
res.end(`fetch proxy error: ${formatFetchProxyError(upstreamUrl.href, err)}`)
|
|
298
|
+
}
|
|
247
299
|
}
|
|
248
300
|
|
|
249
301
|
export function handleAppApiRequest(req: IncomingMessage, res: ServerResponse): boolean {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.238 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.238 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.238 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a,b,c,d,e}from"./chunk-5MQZW32V.js";import"./chunk-6UMCNLKY.js";import"./chunk-HC6JXVIP.js";import"./chunk-KGAN3JXK.js";import"./chunk-4DPHH2DS.js";import"./chunk-RTMLR7KA.js";import"./chunk-YNSDDYLM.js";import"./chunk-6PYVHZVH.js";import"./chunk-NCJGR7VZ.js";import"./chunk-XUOCSWW4.js";import"./chunk-DMSG7ESJ.js";import"./chunk-OHLPCYOM.js";import"./chunk-SCLKEUCN.js";import"./chunk-2FFZXFDY.js";import"./chunk-YK4NG4BL.js";export{c as daemonInstall,b as getDaemonServiceStatus,a as runDaemon,d as teardownDaemonService,e as teardownSootsimHome};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.238 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import"./chunk-UV4NF53M.js";import{f as a,g as b,h as c,i as d,j as e,k as f,l as g,m as h,n as i}from"./chunk-7OQU5M3J.js";import"./chunk-3KVQ35TN.js";import"./chunk-IHEPAACR.js";import"./chunk-NCJGR7VZ.js";import"./chunk-DMSG7ESJ.js";import"./chunk-YK4NG4BL.js";export{e as ALL_DRIVERS,i as buildDriverListRows,a as chromiumDriver,b as electronDriver,f as getAllDrivers,g as getDriver,c as playwrightDriver,h as resolveDriver,d as systemDriver};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.238 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{c,d,e,f,g,h}from"./chunk-CDAMSEOW.js";import"./chunk-XOKMWX3P.js";import"./chunk-MD5GBDM4.js";import{c as a,d as b}from"./chunk-CGQTOBHQ.js";import"./chunk-UYFE2VRP.js";import"./chunk-MT2HMCDI.js";import"./chunk-LYSW5PTM.js";import"./chunk-A46S76WN.js";import"./chunk-ECCUSCHO.js";import"./chunk-QAKSIRZO.js";import"./chunk-7OQU5M3J.js";import"./chunk-3KVQ35TN.js";import"./chunk-CU7M5IBW.js";import"./chunk-5MFTB3S4.js";import"./chunk-IHEPAACR.js";import"./chunk-EGRRMDLA.js";import"./chunk-54XALXOI.js";import"./chunk-XWGGIFDB.js";import"./chunk-CXV3CSSF.js";import"./chunk-QGFPGXNJ.js";import"./chunk-6UMCNLKY.js";import"./chunk-HC6JXVIP.js";import"./chunk-RTMLR7KA.js";import"./chunk-YNSDDYLM.js";import"./chunk-6PYVHZVH.js";import"./chunk-NCJGR7VZ.js";import"./chunk-XUOCSWW4.js";import"./chunk-DMSG7ESJ.js";import"./chunk-QGCNRLCM.js";import"./chunk-2FFZXFDY.js";import"./chunk-YK4NG4BL.js";export{e as discoverSootsimUrl,c as getLastFlowPreviewUploadResult,d as getLastFlowTraceSteps,g as hoistLeadingSimFlag,a as parseFlowFile,f as runFlowPlayback,h as runMaestroAuthoring,b as validateFlowFile};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.238 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a,b,c}from"./chunk-KGAN3JXK.js";import"./chunk-4DPHH2DS.js";import"./chunk-RTMLR7KA.js";import"./chunk-YNSDDYLM.js";import"./chunk-6PYVHZVH.js";import"./chunk-NCJGR7VZ.js";import"./chunk-XUOCSWW4.js";import"./chunk-DMSG7ESJ.js";import"./chunk-OHLPCYOM.js";import"./chunk-SCLKEUCN.js";import"./chunk-2FFZXFDY.js";import"./chunk-YK4NG4BL.js";export{c as printCommandHelp,b as printGroupHelp,a as printHelp};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.238 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{j as a,k as b}from"./chunk-CGQTOBHQ.js";import"./chunk-UYFE2VRP.js";import"./chunk-A46S76WN.js";import"./chunk-ECCUSCHO.js";import"./chunk-QAKSIRZO.js";import"./chunk-7OQU5M3J.js";import"./chunk-3KVQ35TN.js";import"./chunk-CU7M5IBW.js";import"./chunk-5MFTB3S4.js";import"./chunk-IHEPAACR.js";import"./chunk-EGRRMDLA.js";import"./chunk-54XALXOI.js";import"./chunk-XWGGIFDB.js";import"./chunk-CXV3CSSF.js";import"./chunk-QGFPGXNJ.js";import"./chunk-RTMLR7KA.js";import"./chunk-YNSDDYLM.js";import"./chunk-6PYVHZVH.js";import"./chunk-NCJGR7VZ.js";import"./chunk-XUOCSWW4.js";import"./chunk-DMSG7ESJ.js";import"./chunk-QGCNRLCM.js";import"./chunk-2FFZXFDY.js";import"./chunk-YK4NG4BL.js";export{a as printShellPerfReport,b as runInspect};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
/*! sootsim v0.1.238 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
|
-
import{a}from"./chunk-D5LYVGSE.js";import"./chunk-GI4YPHU6.js";import"./chunk-CXV3CSSF.js";import"./chunk-6PYVHZVH.js";import"./chunk-NCJGR7VZ.js";import"./chunk-DMSG7ESJ.js";import"./chunk-YK4NG4BL.js";export{a as runRuntime};
|