peachsim 0.1.922 → 0.1.924
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/README.md +5 -4
- package/cli/commands/cpu-profile.ts +25 -0
- package/cli/commands/inspect/get-node.ts +66 -0
- package/cli/commands/inspect.ts +2 -57
- package/cli/drivers/playwright-provisioning.ts +29 -0
- 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/bridge-contract-input.cjs +1 -1
- package/dist-lib/bridge-contract-input.mjs +1 -1
- package/dist-lib/bridge-contract.cjs +1 -1
- package/dist-lib/bridge-contract.mjs +1 -1
- package/dist-lib/bundle-channel.cjs +1 -1
- package/dist-lib/capture-contract.cjs +1 -1
- package/dist-lib/capture-contract.mjs +1 -1
- package/dist-lib/cli-constants.cjs +1 -1
- package/dist-lib/cloud-contract.cjs +1 -1
- package/dist-lib/cloud-contract.mjs +1 -1
- package/dist-lib/cloud-test-args.cjs +1 -1
- package/dist-lib/cloud-test-args.mjs +1 -1
- package/dist-lib/cloud.cjs +1 -1
- package/dist-lib/cloud.mjs +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/expo-swift-bundle.cjs +1 -1
- package/dist-lib/expo-swift-metadata.cjs +1 -1
- package/dist-lib/expo-swift-metadata.mjs +1 -1
- package/dist-lib/home-paths.cjs +1 -1
- package/dist-lib/host/bridge-host.cjs +1 -1
- package/dist-lib/host/fetch-proxy-handler.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.cjs +1 -1
- package/dist-lib/host/fetch-proxy-overrides.mjs +1 -1
- package/dist-lib/host/replacement-module-handler.cjs +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/jump-to-source-native.cjs +1 -1
- package/dist-lib/kotlin-host.cjs +1 -1
- package/dist-lib/menu.cjs +1 -1
- package/dist-lib/menu.mjs +1 -1
- package/dist-lib/metro-fingerprint-registry.cjs +1 -1
- package/dist-lib/metro-fingerprint-registry.mjs +1 -1
- package/dist-lib/metro-production-bundle.cjs +1 -1
- package/dist-lib/metro-production-bundle.mjs +1 -1
- package/dist-lib/metro.cjs +1 -1
- package/dist-lib/native-app-identity.cjs +1 -1
- package/dist-lib/native-app-identity.mjs +1 -1
- package/dist-lib/native-firebase-metadata.cjs +1 -1
- package/dist-lib/native-firebase-metadata.mjs +1 -1
- package/dist-lib/plist.cjs +1 -1
- package/dist-lib/plist.mjs +1 -1
- package/dist-lib/profiles.cjs +1 -1
- package/dist-lib/public-brand.cjs +1 -1
- package/dist-lib/react-native-host-modules.cjs +1 -1
- package/dist-lib/react-native-host-modules.mjs +1 -1
- package/dist-lib/render-mode.cjs +1 -1
- package/dist-lib/scripts/dev-server-scanner.cjs +1 -1
- package/dist-lib/sdk.cjs +1 -1
- package/dist-lib/sdk.mjs +1 -1
- package/dist-lib/skills.cjs +21 -6
- package/dist-lib/swift-compile.cjs +1 -1
- package/dist-lib/swift-compile.mjs +1 -1
- package/dist-lib/swift-package.cjs +1 -1
- package/dist-lib/swift-package.mjs +1 -1
- package/dist-lib/swift-submit.cjs +1 -1
- package/dist-lib/swift-submit.mjs +1 -1
- package/dist-lib/swift-toolchain.cjs +1 -1
- package/dist-lib/swift.cjs +1 -1
- package/dist-lib/vite-swift.cjs +1 -1
- package/dist-lib/vite.cjs +1 -1
- package/dist-lib/worklet-executable.cjs +1 -1
- package/dist-lib/worklet-executable.mjs +1 -1
- package/package.json +1 -1
- package/skills/peach-debug/SKILL.md +4 -3
- package/skills/peach-debug/references/commands.md +1 -1
- package/skills/peach-perf/SKILL.md +3 -13
- package/skills/peach-setup/SKILL.md +5 -4
- package/skills/peach-test/SKILL.md +6 -6
- package/src/screenshots/compose.ts +2 -9
- package/src/screenshots/frame-compose.ts +2 -5
- package/src/screenshots/orchestrate.ts +3 -17
package/README.md
CHANGED
|
@@ -572,14 +572,15 @@ therefore prove that they are painting without weakening the boot-card guard.
|
|
|
572
572
|
withFrame: true
|
|
573
573
|
```
|
|
574
574
|
|
|
575
|
-
For plan-driven app-store exports, use `peach screenshot appstore
|
|
575
|
+
For plan-driven app-store exports, use `peach screenshot appstore`. The CLI
|
|
576
|
+
provisions its browser dependency. Paths resolve relative to the plan file:
|
|
576
577
|
|
|
577
578
|
```yaml
|
|
578
579
|
app: 8081
|
|
579
580
|
device: iphone-16
|
|
580
581
|
|
|
581
582
|
capture:
|
|
582
|
-
flow:
|
|
583
|
+
flow: ../.maestro/capture-app-store-screenshots.yaml
|
|
583
584
|
mode: raw+framed
|
|
584
585
|
|
|
585
586
|
compose:
|
|
@@ -607,8 +608,8 @@ instead of prepending `--screenshots <rawDir>`:
|
|
|
607
608
|
|
|
608
609
|
```yaml
|
|
609
610
|
capture:
|
|
610
|
-
flow:
|
|
611
|
-
from:
|
|
611
|
+
flow: ../.maestro/capture-app-store-screenshots.yaml
|
|
612
|
+
from: ../apps/app-store-screenshots/public/screenshots/apple/iphone/en
|
|
612
613
|
pathMode: flow
|
|
613
614
|
```
|
|
614
615
|
|
|
@@ -407,6 +407,31 @@ export async function runCpuProfile(
|
|
|
407
407
|
args: string[],
|
|
408
408
|
opts: ProfileOptions,
|
|
409
409
|
): Promise<number> {
|
|
410
|
+
if (args.includes('--help') || args.includes('-h')) {
|
|
411
|
+
console.log(`
|
|
412
|
+
peach perf cpu — capture CPU profiles for the page and every worker
|
|
413
|
+
|
|
414
|
+
usage:
|
|
415
|
+
peach perf cpu [options]
|
|
416
|
+
|
|
417
|
+
options:
|
|
418
|
+
--cdp-port <number> Chrome debugging port (default: PEACH_CDP_PORT or 9222)
|
|
419
|
+
--match <substring> page URL filter (default: /rn/)
|
|
420
|
+
--duration <seconds> capture duration (default: 5)
|
|
421
|
+
--sample-interval <ms> CPU sampling interval (default: 0.1)
|
|
422
|
+
--output, -o <path> profile path (default: /tmp/peach.cpuprofile)
|
|
423
|
+
--interaction-barrier wait for a workload's measured interaction
|
|
424
|
+
--interaction-barrier-timeout <seconds> barrier deadline (default: 90)
|
|
425
|
+
|
|
426
|
+
examples:
|
|
427
|
+
peach open 8081 --new --driver playwright --cdp-port 9222
|
|
428
|
+
peach perf cpu --cdp-port 9222 --match 8081 --duration 5
|
|
429
|
+
|
|
430
|
+
Writes a page profile, worker profiles, and a manifest alongside the output.
|
|
431
|
+
`)
|
|
432
|
+
return 0
|
|
433
|
+
}
|
|
434
|
+
|
|
410
435
|
const duration = Number(valueOf(args, '--duration') ?? '5')
|
|
411
436
|
if (!Number.isFinite(duration) || duration <= 0) {
|
|
412
437
|
console.error(' --duration must be a positive number (seconds)')
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// `peach get node` evaluate payload — resolve testID, id, then text, and
|
|
2
|
+
// report the node plus its parent chain from the live tree.
|
|
3
|
+
//
|
|
4
|
+
// engine identity is the numeric nodeId. the string/null id on a resolved
|
|
5
|
+
// node is a native id and must not drive the tree lookup, so the parent
|
|
6
|
+
// chain walk keys on nodeId on both sides.
|
|
7
|
+
|
|
8
|
+
export function buildGetNodeEval(matcher: string): string {
|
|
9
|
+
return `(async () => {
|
|
10
|
+
const t = window.__sootsimTest
|
|
11
|
+
const q = ${JSON.stringify(matcher)}
|
|
12
|
+
let node = null
|
|
13
|
+
let via = null
|
|
14
|
+
if (t.findByTestId) { node = await t.findByTestId(q); if (node) via = 'testID' }
|
|
15
|
+
if (!node && t.findById) { node = await t.findById(q); if (node) via = 'id' }
|
|
16
|
+
if (!node && t.findByText) { node = await t.findByText(q); if (node) via = 'text' }
|
|
17
|
+
if (!node) return { matcher: q, found: false }
|
|
18
|
+
|
|
19
|
+
// read the resolved transform (if any) off the style — useful
|
|
20
|
+
// because canvas nodes often animate via transform and describe
|
|
21
|
+
// output strips that.
|
|
22
|
+
const transform =
|
|
23
|
+
node.style && Array.isArray(node.style.transform)
|
|
24
|
+
? node.style.transform
|
|
25
|
+
: node.style && node.style.transform
|
|
26
|
+
? node.style.transform
|
|
27
|
+
: null
|
|
28
|
+
|
|
29
|
+
// parent chain — walk up from the node so the JSON dump is
|
|
30
|
+
// self-describing.
|
|
31
|
+
const parentChain = []
|
|
32
|
+
const root = window.__sootsimRoot
|
|
33
|
+
if (root && typeof node.nodeId === 'number') {
|
|
34
|
+
const findPath = (n, targetId, path) => {
|
|
35
|
+
if (!n) return null
|
|
36
|
+
if ((n.nodeId ?? n.id) === targetId) return path
|
|
37
|
+
if (n.children) {
|
|
38
|
+
for (const child of n.children) {
|
|
39
|
+
const nextPath = [
|
|
40
|
+
...path,
|
|
41
|
+
{
|
|
42
|
+
type: n.type || 'view',
|
|
43
|
+
testID: n.props?.testID || null,
|
|
44
|
+
text: n.text || null,
|
|
45
|
+
},
|
|
46
|
+
]
|
|
47
|
+
const found = findPath(child, targetId, nextPath)
|
|
48
|
+
if (found) return found
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return null
|
|
52
|
+
}
|
|
53
|
+
const chain = findPath(root, node.nodeId, [])
|
|
54
|
+
if (chain) parentChain.push(...chain)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
return {
|
|
58
|
+
matcher: q,
|
|
59
|
+
found: true,
|
|
60
|
+
resolvedVia: via,
|
|
61
|
+
node,
|
|
62
|
+
transform,
|
|
63
|
+
parentChain,
|
|
64
|
+
}
|
|
65
|
+
})()`
|
|
66
|
+
}
|
package/cli/commands/inspect.ts
CHANGED
|
@@ -66,6 +66,7 @@ import { runDescribeSubcommand } from './inspect/describe'
|
|
|
66
66
|
import { isAgentEnv } from './inspect/env'
|
|
67
67
|
import { runFindSubcommand } from './inspect/find'
|
|
68
68
|
import { runGetLayoutSubcommand } from './inspect/get-layout'
|
|
69
|
+
import { buildGetNodeEval } from './inspect/get-node'
|
|
69
70
|
import { runKeyboardSubcommand } from './inspect/keyboard'
|
|
70
71
|
import { runListSubcommand } from './inspect/list'
|
|
71
72
|
import { runMemorySubcommand } from './inspect/memory'
|
|
@@ -1941,63 +1942,7 @@ export async function runInspect(args: string[], opts: InspectOptions) {
|
|
|
1941
1942
|
// __sootsimRoot walk.
|
|
1942
1943
|
const result = await bridge.send({
|
|
1943
1944
|
type: 'evaluate',
|
|
1944
|
-
code:
|
|
1945
|
-
const t = window.__sootsimTest
|
|
1946
|
-
const q = ${JSON.stringify(matcher)}
|
|
1947
|
-
let node = null
|
|
1948
|
-
let via = null
|
|
1949
|
-
if (t.findByTestId) { node = await t.findByTestId(q); if (node) via = 'testID' }
|
|
1950
|
-
if (!node && t.findById) { node = await t.findById(q); if (node) via = 'id' }
|
|
1951
|
-
if (!node && t.findByText) { node = await t.findByText(q); if (node) via = 'text' }
|
|
1952
|
-
if (!node) return { matcher: q, found: false }
|
|
1953
|
-
|
|
1954
|
-
// read the resolved transform (if any) off the style — useful
|
|
1955
|
-
// because canvas nodes often animate via transform and describe
|
|
1956
|
-
// output strips that.
|
|
1957
|
-
const transform =
|
|
1958
|
-
node.style && Array.isArray(node.style.transform)
|
|
1959
|
-
? node.style.transform
|
|
1960
|
-
: node.style && node.style.transform
|
|
1961
|
-
? node.style.transform
|
|
1962
|
-
: null
|
|
1963
|
-
|
|
1964
|
-
// parent chain — walk up from the node so the JSON dump is
|
|
1965
|
-
// self-describing.
|
|
1966
|
-
const parentChain = []
|
|
1967
|
-
const root = window.__sootsimRoot
|
|
1968
|
-
if (root && node.id != null) {
|
|
1969
|
-
const findPath = (n, targetId, path) => {
|
|
1970
|
-
if (!n) return null
|
|
1971
|
-
if (n.id === targetId) return path
|
|
1972
|
-
if (n.children) {
|
|
1973
|
-
for (const child of n.children) {
|
|
1974
|
-
const nextPath = [
|
|
1975
|
-
...path,
|
|
1976
|
-
{
|
|
1977
|
-
type: n.type || 'view',
|
|
1978
|
-
testID: n.props?.testID || null,
|
|
1979
|
-
text: n.text || null,
|
|
1980
|
-
},
|
|
1981
|
-
]
|
|
1982
|
-
const found = findPath(child, targetId, nextPath)
|
|
1983
|
-
if (found) return found
|
|
1984
|
-
}
|
|
1985
|
-
}
|
|
1986
|
-
return null
|
|
1987
|
-
}
|
|
1988
|
-
const chain = findPath(root, node.id, [])
|
|
1989
|
-
if (chain) parentChain.push(...chain)
|
|
1990
|
-
}
|
|
1991
|
-
|
|
1992
|
-
return {
|
|
1993
|
-
matcher: q,
|
|
1994
|
-
found: true,
|
|
1995
|
-
resolvedVia: via,
|
|
1996
|
-
node,
|
|
1997
|
-
transform,
|
|
1998
|
-
parentChain,
|
|
1999
|
-
}
|
|
2000
|
-
})()`,
|
|
1945
|
+
code: buildGetNodeEval(matcher),
|
|
2001
1946
|
})
|
|
2002
1947
|
console.log(JSON.stringify(result, null, 2))
|
|
2003
1948
|
break
|
|
@@ -3,12 +3,17 @@ import { existsSync, readFileSync } from 'node:fs'
|
|
|
3
3
|
import { createRequire } from 'node:module'
|
|
4
4
|
import { dirname, join } from 'node:path'
|
|
5
5
|
import { installVerifiedTarball } from '@contrast/runtime-delivery'
|
|
6
|
+
import {
|
|
7
|
+
launchReapedChrome,
|
|
8
|
+
softwareChromeAllowed,
|
|
9
|
+
} from '../../../../scripts/lib/reap-browser'
|
|
6
10
|
import { playwrightCoreDir } from '../../src/home-paths'
|
|
7
11
|
import { isRecord } from '../../src/is-record'
|
|
8
12
|
import { RNX_INTERNAL_CHILDREN, RNX_INTERNAL_COMMAND } from '../internal-child'
|
|
9
13
|
import { rnxSelfInvocation } from '../self-invocation'
|
|
10
14
|
import { ensureLinuxBrowserLibraries } from './linux-browser-libs'
|
|
11
15
|
import { PINNED_PLAYWRIGHT_CORE } from './playwright-core-pin'
|
|
16
|
+
import type { Browser } from 'playwright-core'
|
|
12
17
|
|
|
13
18
|
export interface ResolvedPlaywright {
|
|
14
19
|
// package name that resolved (for human-facing messaging)
|
|
@@ -228,3 +233,27 @@ export async function ensurePlaywrightBrowser(
|
|
|
228
233
|
libraryPath: libraries.libraryPath,
|
|
229
234
|
}
|
|
230
235
|
}
|
|
236
|
+
|
|
237
|
+
// screenshot composers use the same verified package, browser and linux
|
|
238
|
+
// libraries as the CLI driver, including when no project dependencies exist.
|
|
239
|
+
export async function launchProvisionedPlaywright(): Promise<Browser> {
|
|
240
|
+
const resolved = await provisionPlaywright()
|
|
241
|
+
const env = { ...process.env }
|
|
242
|
+
const browser = await ensurePlaywrightBrowser(resolved, softwareChromeAllowed(), env)
|
|
243
|
+
if (!browser.ok) throw new Error(browser.message)
|
|
244
|
+
const playwright: typeof import('playwright-core') = createRequire(resolved.modulePath)(
|
|
245
|
+
resolved.modulePath,
|
|
246
|
+
)
|
|
247
|
+
const browserEnv = browser.libraryPath
|
|
248
|
+
? {
|
|
249
|
+
...env,
|
|
250
|
+
LD_LIBRARY_PATH: [browser.libraryPath, env.LD_LIBRARY_PATH]
|
|
251
|
+
.filter(Boolean)
|
|
252
|
+
.join(':'),
|
|
253
|
+
}
|
|
254
|
+
: env
|
|
255
|
+
return launchReapedChrome(
|
|
256
|
+
(options) => playwright.chromium.launch({ ...options, env: browserEnv }),
|
|
257
|
+
{ headless: true },
|
|
258
|
+
)
|
|
259
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/beta.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/beta.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/cloud.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/cloud.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
var __defProp = Object.defineProperty;
|
|
3
3
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
4
4
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
package/dist-lib/config.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/detox/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/home-paths.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
package/dist-lib/kotlin-host.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
package/dist-lib/menu.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/menu.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/metro.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/plist.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
package/dist-lib/plist.mjs
CHANGED
package/dist-lib/profiles.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/render-mode.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
package/dist-lib/sdk.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/sdk.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
var __defProp = Object.defineProperty;
|
|
3
3
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
4
4
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
package/dist-lib/skills.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -52645,6 +52645,23 @@ ${detail}` : ""}`
|
|
|
52645
52645
|
libraryPath: libraries.libraryPath
|
|
52646
52646
|
};
|
|
52647
52647
|
}
|
|
52648
|
+
async function launchProvisionedPlaywright() {
|
|
52649
|
+
const resolved = await provisionPlaywright();
|
|
52650
|
+
const env = { ...process.env };
|
|
52651
|
+
const browser = await ensurePlaywrightBrowser(resolved, softwareChromeAllowed(), env);
|
|
52652
|
+
if (!browser.ok) throw new Error(browser.message);
|
|
52653
|
+
const playwright = (0, import_node_module5.createRequire)(resolved.modulePath)(
|
|
52654
|
+
resolved.modulePath
|
|
52655
|
+
);
|
|
52656
|
+
const browserEnv = browser.libraryPath ? {
|
|
52657
|
+
...env,
|
|
52658
|
+
LD_LIBRARY_PATH: [browser.libraryPath, env.LD_LIBRARY_PATH].filter(Boolean).join(":")
|
|
52659
|
+
} : env;
|
|
52660
|
+
return launchReapedChrome(
|
|
52661
|
+
(options) => playwright.chromium.launch({ ...options, env: browserEnv }),
|
|
52662
|
+
{ headless: true }
|
|
52663
|
+
);
|
|
52664
|
+
}
|
|
52648
52665
|
var import_node_child_process15, import_node_fs40, import_node_module5, import_node_path42;
|
|
52649
52666
|
var init_playwright_provisioning = __esm({
|
|
52650
52667
|
"cli/drivers/playwright-provisioning.ts"() {
|
|
@@ -52654,6 +52671,7 @@ var init_playwright_provisioning = __esm({
|
|
|
52654
52671
|
import_node_module5 = require("node:module");
|
|
52655
52672
|
import_node_path42 = require("node:path");
|
|
52656
52673
|
init_src();
|
|
52674
|
+
init_reap_browser();
|
|
52657
52675
|
init_home_paths();
|
|
52658
52676
|
init_is_record();
|
|
52659
52677
|
init_internal_child();
|
|
@@ -55933,10 +55951,7 @@ function renderFrameHtml(layout, rawImageDataUrl) {
|
|
|
55933
55951
|
</html>`;
|
|
55934
55952
|
}
|
|
55935
55953
|
async function composeFramedScreenshot(rawPng, model) {
|
|
55936
|
-
const
|
|
55937
|
-
const browser = await launchReapedChrome((options) => chromium.launch(options), {
|
|
55938
|
-
headless: true
|
|
55939
|
-
});
|
|
55954
|
+
const browser = await launchProvisionedPlaywright();
|
|
55940
55955
|
try {
|
|
55941
55956
|
const composer = await createFramedScreenshotComposer(browser);
|
|
55942
55957
|
try {
|
|
@@ -55997,7 +56012,7 @@ var init_frame_compose = __esm({
|
|
|
55997
56012
|
import_chrome_metrics = require("peach-engine/ios/chrome-metrics");
|
|
55998
56013
|
import_duo_housing = require("peach-engine/ios/duo-housing");
|
|
55999
56014
|
import_devices3 = require("peach-engine/settings/devices");
|
|
56000
|
-
|
|
56015
|
+
init_playwright_provisioning();
|
|
56001
56016
|
METALLIC_RING_SHADOW = "inset 0 0 0 0.5px #000, inset 0 0 0 2px #757575, inset 0 0 0 5px #212121";
|
|
56002
56017
|
FRAME_OUTLINE_BLEED = 1;
|
|
56003
56018
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
package/dist-lib/swift.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/dist-lib/vite-swift.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
package/dist-lib/vite.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __create = Object.create;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/*! rnx v0.1.
|
|
1
|
+
/*! rnx v0.1.924 | (c) 2026 Tamagui LLC | Proprietary — see LICENSE */
|
|
2
2
|
let __sootsim_import_meta_url = '', __sootsim_import_meta_dirname = ''; try { __sootsim_import_meta_url = require('url').pathToFileURL(__filename).href; __sootsim_import_meta_dirname = __dirname; } catch {}
|
|
3
3
|
"use strict";
|
|
4
4
|
var __defProp = Object.defineProperty;
|
package/package.json
CHANGED
|
@@ -24,7 +24,8 @@ tree, `debug snapshot` + `debug diff` to capture before/after, `debug
|
|
|
24
24
|
recent` on a channel and `perf shell` for frame-by-frame stats, and the
|
|
25
25
|
timeline for "what just happened". **do not** debug these by eye with
|
|
26
26
|
screenshots, sprinkle `console.log` through the render path, or spin up a
|
|
27
|
-
one-off browser-automation script.
|
|
27
|
+
one-off browser-automation script. visual rendering uses canvas; the
|
|
28
|
+
accessibility mirror exposes semantic DOM. a
|
|
28
29
|
CLI capture is reproducible, diffable, and shareable in a way a screenshot
|
|
29
30
|
never is.
|
|
30
31
|
|
|
@@ -52,8 +53,8 @@ regression test. a pile of ad-hoc logs helps no one and gets deleted.
|
|
|
52
53
|
|
|
53
54
|
- **`a1`/`a2`/`b0` style ids mean Peach sims, never browser tabs.** when a user
|
|
54
55
|
says "look at a3", that's the `peach list` sim id. do not open chrome
|
|
55
|
-
MCP unless the user explicitly says "use chrome"
|
|
56
|
-
|
|
56
|
+
MCP unless the user explicitly says "use chrome". use Peach's node-tree
|
|
57
|
+
inspection for the visual surface and its accessibility tools for semantics.
|
|
57
58
|
- **the CLI auto-settles. don't add `sleep`.** every read waits up to
|
|
58
59
|
1800 ms for in-flight transitions to start; every write polls layout
|
|
59
60
|
hash until stable. if a read keeps racing its write, the fix is **never**
|
|
@@ -21,7 +21,7 @@ peach do type "hello world" # type into focused input
|
|
|
21
21
|
peach do type-into emailInput "a@b" # focus then type
|
|
22
22
|
peach do key return # special key (return, backspace, …)
|
|
23
23
|
peach do scroll feed-list 0 500 # scroll a testID to absolute x/y offsets
|
|
24
|
-
peach do swipe
|
|
24
|
+
peach do swipe 196 700 196 300 # swipe between screen coordinates
|
|
25
25
|
peach do long-press messageRow 800 # ms hold
|
|
26
26
|
```
|
|
27
27
|
|
|
@@ -234,19 +234,9 @@ engaged. preserve failed receipts instead of retrying them out of the data set.
|
|
|
234
234
|
|
|
235
235
|
### confirm which build you measured, every time
|
|
236
236
|
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
regression this way before the cause was found.
|
|
241
|
-
|
|
242
|
-
So make every capture say which build it came from, rather than assuming the
|
|
243
|
-
reload took. Put a marker in something the capture already returns - a counter
|
|
244
|
-
name in `saveLayerReasons`, a debug event, a log line - and treat a capture with
|
|
245
|
-
no marker as a capture of the wrong build. Reload twice and re-read the marker.
|
|
246
|
-
|
|
247
|
-
This costs one line and it is the difference between a measurement and a guess.
|
|
248
|
-
The same rule covers any A/B where you edit between arms: an arm you cannot
|
|
249
|
-
identify from its own output is not evidence.
|
|
237
|
+
Record the CLI and runtime versions with `peach version`. For a development
|
|
238
|
+
build, include a build marker in the capture and verify it after reloading.
|
|
239
|
+
An A/B measurement must identify each build from its own output.
|
|
250
240
|
|
|
251
241
|
|
|
252
242
|
deeper tools when the frame report isn't enough:
|
|
@@ -180,8 +180,9 @@ before launching. if open errors with "port unreachable": confirm your dev
|
|
|
180
180
|
server is actually serving — the bundler has to be up before Peach can
|
|
181
181
|
attach.
|
|
182
182
|
|
|
183
|
-
**two sims appear unexpectedly.**
|
|
184
|
-
|
|
183
|
+
**two sims appear unexpectedly.** `peach open --new` creates a separate sim;
|
|
184
|
+
`peach claim` only reserves an existing one. check ownership before closing
|
|
185
|
+
a sim left by your own earlier run:
|
|
185
186
|
|
|
186
187
|
```sh
|
|
187
188
|
peach list # note the stale id
|
|
@@ -192,8 +193,8 @@ peach close <id> # release it cleanly
|
|
|
192
193
|
Run `peach runtime install`, then retry `peach open <port>`.
|
|
193
194
|
|
|
194
195
|
**`peach open` times out ("timed out waiting for opened sim to connect").**
|
|
195
|
-
do not retry in a loop. verify the development server
|
|
196
|
-
|
|
196
|
+
do not retry in a loop. verify the app's development server is reachable and
|
|
197
|
+
`peach runtime list` shows an installed runtime. inspect the driver diagnostic
|
|
197
198
|
path printed by the failed command. restart the broken development stack at its
|
|
198
199
|
supervisor, then retry once. Peach owns the isolated browser profile and its
|
|
199
200
|
process tree; do not open the shell URL through an operating-system browser.
|
|
@@ -257,9 +257,9 @@ moduleNameMapper: {
|
|
|
257
257
|
}
|
|
258
258
|
```
|
|
259
259
|
|
|
260
|
-
keep the **preset**, not just the mapper
|
|
261
|
-
|
|
262
|
-
|
|
260
|
+
keep the **preset**, not just the mapper. its `setupFilesAfterEnv` hook closes
|
|
261
|
+
the driver's browser after each test file. mapper-only configs need their own
|
|
262
|
+
`afterAll` calling the driver's `cleanup()`.
|
|
263
263
|
|
|
264
264
|
### commands
|
|
265
265
|
|
|
@@ -269,8 +269,8 @@ peach detox --config my.cjs # use a specific jest config
|
|
|
269
269
|
peach detox --watch # jest watch mode
|
|
270
270
|
peach detox -t "login" # --testNamePattern
|
|
271
271
|
peach detox --headed # keep the shell window visible
|
|
272
|
-
peach detox --no-launch #
|
|
273
|
-
peach detox --port 5173 # explicit
|
|
272
|
+
peach detox --no-launch # skip the running-shell check
|
|
273
|
+
peach detox --port 5173 # explicit shell HTTP port for CI
|
|
274
274
|
peach detox init # scaffold config + e2e/example.test.ts
|
|
275
275
|
```
|
|
276
276
|
|
|
@@ -291,7 +291,7 @@ peach detox init # scaffold config + e2e/example.test.ts
|
|
|
291
291
|
| `.setColumnToValue(...)` | supported for uniquely named picker rows |
|
|
292
292
|
| `waitFor(...).toBeVisible().withTimeout(...)` | supported |
|
|
293
293
|
| `device.launchApp(...)` / `device.reloadReactNative()` | supported |
|
|
294
|
-
| `device.shake()` |
|
|
294
|
+
| `device.shake()` | no-op |
|
|
295
295
|
| `device.sendUserNotification(...)` | not yet |
|
|
296
296
|
|
|
297
297
|
### troubleshooting
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { mkdirSync, readFileSync, writeFileSync } from 'fs'
|
|
2
2
|
import path from 'path'
|
|
3
|
-
import {
|
|
3
|
+
import { launchProvisionedPlaywright } from '../../cli/drivers/playwright-provisioning'
|
|
4
4
|
import {
|
|
5
5
|
DEFAULT_FRAME_SHADOW,
|
|
6
6
|
toAssetKey,
|
|
@@ -343,14 +343,7 @@ export async function composeMarketingScreenshots(
|
|
|
343
343
|
browserOverride?: MarketingBrowserLike,
|
|
344
344
|
): Promise<ComposeResult> {
|
|
345
345
|
const entries: ComposeManifestEntry[] = []
|
|
346
|
-
const browser =
|
|
347
|
-
browserOverride ??
|
|
348
|
-
(await (async () => {
|
|
349
|
-
const { chromium } = await import('playwright')
|
|
350
|
-
return launchReapedChrome((options) => chromium.launch(options), {
|
|
351
|
-
headless: true,
|
|
352
|
-
})
|
|
353
|
-
})())
|
|
346
|
+
const browser = browserOverride ?? (await launchProvisionedPlaywright())
|
|
354
347
|
try {
|
|
355
348
|
// each slide's canvas width/height is the authored output raster (the
|
|
356
349
|
// composed image is written at exactly that size), so density stays 1:1
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
type CornerRadii,
|
|
21
21
|
type DeviceModel,
|
|
22
22
|
} from 'peach-engine/settings/devices'
|
|
23
|
-
import {
|
|
23
|
+
import { launchProvisionedPlaywright } from '../../cli/drivers/playwright-provisioning'
|
|
24
24
|
|
|
25
25
|
const METALLIC_RING_SHADOW =
|
|
26
26
|
'inset 0 0 0 0.5px #000, inset 0 0 0 2px #757575, inset 0 0 0 5px #212121'
|
|
@@ -410,10 +410,7 @@ export async function composeFramedScreenshot(
|
|
|
410
410
|
rawPng: Buffer,
|
|
411
411
|
model: DeviceModel,
|
|
412
412
|
): Promise<Buffer> {
|
|
413
|
-
const
|
|
414
|
-
const browser = await launchReapedChrome((options) => chromium.launch(options), {
|
|
415
|
-
headless: true,
|
|
416
|
-
})
|
|
413
|
+
const browser = await launchProvisionedPlaywright()
|
|
417
414
|
try {
|
|
418
415
|
const composer = await createFramedScreenshotComposer(browser)
|
|
419
416
|
try {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { mkdirSync, readFileSync, writeFileSync } from 'fs'
|
|
2
2
|
import { tmpdir } from 'os'
|
|
3
3
|
import path from 'path'
|
|
4
|
-
import { launchReapedChrome } from '../../../../scripts/lib/reap-browser'
|
|
5
4
|
import { runFlowPlayback } from '../../cli/commands/flow'
|
|
5
|
+
import { launchProvisionedPlaywright } from '../../cli/drivers/playwright-provisioning'
|
|
6
6
|
import {
|
|
7
7
|
composeMarketingScreenshots,
|
|
8
8
|
type MarketingBrowserLike,
|
|
@@ -100,14 +100,7 @@ async function buildFramedSources(
|
|
|
100
100
|
): Promise<Map<string, string>> {
|
|
101
101
|
const sources = new Map<string, string>()
|
|
102
102
|
mkdirSync(plan.capture.framedDir, { recursive: true })
|
|
103
|
-
const browser =
|
|
104
|
-
browserOverride ??
|
|
105
|
-
(await (async () => {
|
|
106
|
-
const { chromium } = await import('playwright')
|
|
107
|
-
return launchReapedChrome((options) => chromium.launch(options), {
|
|
108
|
-
headless: true,
|
|
109
|
-
})
|
|
110
|
-
})())
|
|
103
|
+
const browser = browserOverride ?? (await launchProvisionedPlaywright())
|
|
111
104
|
try {
|
|
112
105
|
const composer = await createFramedScreenshotComposer(browser)
|
|
113
106
|
try {
|
|
@@ -204,14 +197,7 @@ export async function runScreenshotsPlan(
|
|
|
204
197
|
plan.capture.mode !== 'raw' ||
|
|
205
198
|
(!overrides.captureOnly && plan.compose.frame.show === true)
|
|
206
199
|
const needsSharedBrowser = needsFramedSources || !overrides.captureOnly
|
|
207
|
-
const sharedBrowser = needsSharedBrowser
|
|
208
|
-
? await (async () => {
|
|
209
|
-
const { chromium } = await import('playwright')
|
|
210
|
-
return launchReapedChrome((options) => chromium.launch(options), {
|
|
211
|
-
headless: true,
|
|
212
|
-
})
|
|
213
|
-
})()
|
|
214
|
-
: null
|
|
200
|
+
const sharedBrowser = needsSharedBrowser ? await launchProvisionedPlaywright() : null
|
|
215
201
|
try {
|
|
216
202
|
const framedSources = needsFramedSources
|
|
217
203
|
? await buildFramedSources(plan, sharedBrowser ?? undefined)
|