@ytspar/sweetlink 1.21.0 → 1.22.0
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/browser/consoleCapture.js +1 -1
- package/dist/browser/consoleCapture.js.map +1 -1
- package/dist/browser/earlyConsoleCapture.d.ts +1 -1
- package/dist/browser/earlyConsoleCapture.d.ts.map +1 -1
- package/dist/cli/sweetlink.js +136 -64
- package/dist/cli/sweetlink.js.map +1 -1
- package/dist/daemon/demo.d.ts.map +1 -1
- package/dist/daemon/demo.js +3 -19
- package/dist/daemon/demo.js.map +1 -1
- package/dist/daemon/recording.d.ts +1 -1
- package/dist/daemon/recording.d.ts.map +1 -1
- package/dist/daemon/recording.js +1 -19
- package/dist/daemon/recording.js.map +1 -1
- package/dist/daemon/server.js +5 -9
- package/dist/daemon/server.js.map +1 -1
- package/dist/daemon/session.d.ts +8 -1
- package/dist/daemon/session.d.ts.map +1 -1
- package/dist/daemon/types.d.ts +7 -2
- package/dist/daemon/types.d.ts.map +1 -1
- package/dist/daemon/types.js.map +1 -1
- package/dist/daemon/utils.d.ts +22 -0
- package/dist/daemon/utils.d.ts.map +1 -0
- package/dist/daemon/utils.js +44 -0
- package/dist/daemon/utils.js.map +1 -0
- package/dist/daemon/viewer.d.ts.map +1 -1
- package/dist/daemon/viewer.js +2 -8
- package/dist/daemon/viewer.js.map +1 -1
- package/dist/daemon/visualDiff.d.ts +9 -0
- package/dist/daemon/visualDiff.d.ts.map +1 -1
- package/dist/daemon/visualDiff.js +12 -1
- package/dist/daemon/visualDiff.js.map +1 -1
- package/dist/runs.d.ts +15 -3
- package/dist/runs.d.ts.map +1 -1
- package/dist/runs.js +29 -13
- package/dist/runs.js.map +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/simulator/android.d.ts +6 -0
- package/dist/simulator/android.d.ts.map +1 -1
- package/dist/simulator/android.js +81 -4
- package/dist/simulator/android.js.map +1 -1
- package/dist/simulator/androidTaps.d.ts +12 -2
- package/dist/simulator/androidTaps.d.ts.map +1 -1
- package/dist/simulator/androidTaps.js +57 -11
- package/dist/simulator/androidTaps.js.map +1 -1
- package/dist/simulator/ios.d.ts +7 -0
- package/dist/simulator/ios.d.ts.map +1 -1
- package/dist/simulator/ios.js +70 -25
- package/dist/simulator/ios.js.map +1 -1
- package/dist/term/cast.d.ts +24 -0
- package/dist/term/cast.d.ts.map +1 -0
- package/dist/term/cast.js +24 -0
- package/dist/term/cast.js.map +1 -0
- package/dist/term/player.d.ts.map +1 -1
- package/dist/term/player.js +36 -14
- package/dist/term/player.js.map +1 -1
- package/dist/term/recorder.d.ts +7 -0
- package/dist/term/recorder.d.ts.map +1 -1
- package/dist/term/recorder.js +35 -1
- package/dist/term/recorder.js.map +1 -1
- package/dist/types.d.ts +2 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
- package/dist/term/ansi.d.ts +0 -37
- package/dist/term/ansi.d.ts.map +0 -1
- package/dist/term/ansi.js +0 -205
- package/dist/term/ansi.js.map +0 -1
|
@@ -12,6 +12,15 @@ export interface VisualDiffResult {
|
|
|
12
12
|
/** Path to the interactive HTML viewer with side-by-side + overlay views. */
|
|
13
13
|
diffViewerPath?: string;
|
|
14
14
|
pass: boolean;
|
|
15
|
+
/**
|
|
16
|
+
* When the comparison failed for IO/permission reasons (NOT a real pixel
|
|
17
|
+
* mismatch), this carries the error message. CI users debugging "100%
|
|
18
|
+
* mismatch" can check this to distinguish a real regression from a typo
|
|
19
|
+
* in baselineDir or a missing baseline.
|
|
20
|
+
*/
|
|
21
|
+
error?: string;
|
|
22
|
+
/** True when the baseline was not found (vs. a real error). */
|
|
23
|
+
baselineMissing?: boolean;
|
|
15
24
|
}
|
|
16
25
|
/**
|
|
17
26
|
* Simple visual diff using Playwright's built-in comparison.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"visualDiff.d.ts","sourceRoot":"","sources":["../../src/daemon/visualDiff.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,WAAW,gBAAgB;IAC/B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"visualDiff.d.ts","sourceRoot":"","sources":["../../src/daemon/visualDiff.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,WAAW,gBAAgB;IAC/B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6EAA6E;IAC7E,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,OAAO,CAAC;IACd;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,+DAA+D;IAC/D,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAMD;;;;;;GAMG;AACH,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GACA,OAAO,CAAC,gBAAgB,CAAC,CA+F3B;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC/B,OAAO,CAAC,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,gBAAgB,CAAA;CAAE,CAAC,CAAC,CAwC5D"}
|
|
@@ -122,7 +122,14 @@ export async function diffDirectory(baselineDir, currentDir, options) {
|
|
|
122
122
|
const result = await visualDiff(baseline, current, options);
|
|
123
123
|
results.push({ file, result });
|
|
124
124
|
}
|
|
125
|
-
catch {
|
|
125
|
+
catch (err) {
|
|
126
|
+
// Distinguish baseline-missing (the common new-screenshot case where
|
|
127
|
+
// the user is approving a new view) from real IO/permission errors.
|
|
128
|
+
// Without this distinction, both surface as "100% mismatch" — leaving
|
|
129
|
+
// CI users debugging a "visual regression" that's really a permissions
|
|
130
|
+
// typo or a path mistake.
|
|
131
|
+
const e = err;
|
|
132
|
+
const baselineMissing = e?.code === 'ENOENT' && e.path === baselinePath;
|
|
126
133
|
results.push({
|
|
127
134
|
file,
|
|
128
135
|
result: {
|
|
@@ -130,6 +137,10 @@ export async function diffDirectory(baselineDir, currentDir, options) {
|
|
|
130
137
|
mismatchCount: 0,
|
|
131
138
|
totalPixels: 0,
|
|
132
139
|
pass: false,
|
|
140
|
+
error: baselineMissing
|
|
141
|
+
? `Baseline not found: ${baselinePath}`
|
|
142
|
+
: `${e?.code ?? 'Error'}: ${e?.message ?? String(err)}`,
|
|
143
|
+
baselineMissing,
|
|
133
144
|
},
|
|
134
145
|
});
|
|
135
146
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"visualDiff.js","sourceRoot":"","sources":["../../src/daemon/visualDiff.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"visualDiff.js","sourceRoot":"","sources":["../../src/daemon/visualDiff.ts"],"names":[],"mappings":"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"}
|
package/dist/runs.d.ts
CHANGED
|
@@ -20,15 +20,27 @@ export interface RunSlotOptions {
|
|
|
20
20
|
app?: string;
|
|
21
21
|
/** Override the run identifier. Defaults to env SWEETLINK_RUN or HHMM. */
|
|
22
22
|
run?: string;
|
|
23
|
-
/** Subdirectory inside the run slot
|
|
24
|
-
kind?: 'term' | 'sim' | 'session'
|
|
23
|
+
/** Subdirectory inside the run slot. Omit for the session root. */
|
|
24
|
+
kind?: 'term' | 'sim' | 'session';
|
|
25
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Slugify a user-supplied namespace segment into something safe to use as a
|
|
28
|
+
* directory name. Without this, `--app ../../../tmp/x` would let a malicious
|
|
29
|
+
* caller (CI template, package.json script, batch JSON producer) write
|
|
30
|
+
* artifacts anywhere the user can write — including ~/.ssh/authorized_keys
|
|
31
|
+
* or LaunchAgents. Limited charset matches the existing --label slugifier.
|
|
32
|
+
*/
|
|
33
|
+
export declare function slugifyNamespace(value: string): string;
|
|
26
34
|
/**
|
|
27
35
|
* Resolve the artifact directory for a capture.
|
|
28
36
|
* - With `app`: <base>/<app>/<YYYYMMDD>/<run>[/<kind>]
|
|
29
37
|
* - Without: <base>[/<kindMap>] (back-compat with .sweetlink/term, etc.)
|
|
38
|
+
*
|
|
39
|
+
* `app` and `run` are slugified to prevent path traversal — anyone who can
|
|
40
|
+
* influence a sweetlink invocation (npm script, CI template, batch stdin)
|
|
41
|
+
* could otherwise pass `../../../tmp/x` and target arbitrary writable paths.
|
|
30
42
|
*/
|
|
31
43
|
export declare function runSlot(options: RunSlotOptions): string;
|
|
32
|
-
/** Reset
|
|
44
|
+
/** Reset internal caches — kept for back-compat with existing tests; now a no-op. */
|
|
33
45
|
export declare function _resetRunCache(): void;
|
|
34
46
|
//# sourceMappingURL=runs.d.ts.map
|
package/dist/runs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../src/runs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,MAAM,WAAW,cAAc;IAC7B,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,
|
|
1
|
+
{"version":3,"file":"runs.d.ts","sourceRoot":"","sources":["../src/runs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,MAAM,WAAW,cAAc;IAC7B,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,8EAA8E;IAC9E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,0EAA0E;IAC1E,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,CAAC;CACnC;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWtD;AAiBD;;;;;;;;GAQG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAevD;AAED,qFAAqF;AACrF,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
|
package/dist/runs.js
CHANGED
|
@@ -14,20 +14,31 @@
|
|
|
14
14
|
* working unchanged.
|
|
15
15
|
*/
|
|
16
16
|
import * as path from 'path';
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
17
|
+
/**
|
|
18
|
+
* Slugify a user-supplied namespace segment into something safe to use as a
|
|
19
|
+
* directory name. Without this, `--app ../../../tmp/x` would let a malicious
|
|
20
|
+
* caller (CI template, package.json script, batch JSON producer) write
|
|
21
|
+
* artifacts anywhere the user can write — including ~/.ssh/authorized_keys
|
|
22
|
+
* or LaunchAgents. Limited charset matches the existing --label slugifier.
|
|
23
|
+
*/
|
|
24
|
+
export function slugifyNamespace(value) {
|
|
25
|
+
const cleaned = value
|
|
26
|
+
.replace(/[^A-Za-z0-9_-]/g, '-')
|
|
27
|
+
.replace(/^-+|-+$/g, '')
|
|
28
|
+
.slice(0, 64);
|
|
29
|
+
if (!cleaned) {
|
|
30
|
+
throw new Error(`Invalid namespace "${value}" — must contain at least one alphanumeric, dash, or underscore character`);
|
|
24
31
|
}
|
|
32
|
+
return cleaned;
|
|
33
|
+
}
|
|
34
|
+
function defaultRunId() {
|
|
35
|
+
if (process.env.SWEETLINK_RUN)
|
|
36
|
+
return slugifyNamespace(process.env.SWEETLINK_RUN);
|
|
25
37
|
const d = new Date();
|
|
26
38
|
const pad = (n) => String(n).padStart(2, '0');
|
|
27
39
|
// HHMM-SS — short and human-readable. The date component lives in the
|
|
28
40
|
// parent directory, so duplicating it here would be noise.
|
|
29
|
-
|
|
30
|
-
return _cachedRun;
|
|
41
|
+
return `${pad(d.getHours())}${pad(d.getMinutes())}-${pad(d.getSeconds())}`;
|
|
31
42
|
}
|
|
32
43
|
function todayYmd() {
|
|
33
44
|
const d = new Date();
|
|
@@ -38,6 +49,10 @@ function todayYmd() {
|
|
|
38
49
|
* Resolve the artifact directory for a capture.
|
|
39
50
|
* - With `app`: <base>/<app>/<YYYYMMDD>/<run>[/<kind>]
|
|
40
51
|
* - Without: <base>[/<kindMap>] (back-compat with .sweetlink/term, etc.)
|
|
52
|
+
*
|
|
53
|
+
* `app` and `run` are slugified to prevent path traversal — anyone who can
|
|
54
|
+
* influence a sweetlink invocation (npm script, CI template, batch stdin)
|
|
55
|
+
* could otherwise pass `../../../tmp/x` and target arbitrary writable paths.
|
|
41
56
|
*/
|
|
42
57
|
export function runSlot(options) {
|
|
43
58
|
const baseDir = options.baseDir.endsWith('.sweetlink')
|
|
@@ -48,14 +63,15 @@ export function runSlot(options) {
|
|
|
48
63
|
return baseDir;
|
|
49
64
|
return path.join(baseDir, options.kind);
|
|
50
65
|
}
|
|
51
|
-
const
|
|
52
|
-
const
|
|
66
|
+
const safeApp = slugifyNamespace(options.app);
|
|
67
|
+
const safeRun = options.run ? slugifyNamespace(options.run) : defaultRunId();
|
|
68
|
+
const head = path.join(baseDir, safeApp, todayYmd(), safeRun);
|
|
53
69
|
if (!options.kind || options.kind === 'session')
|
|
54
70
|
return head;
|
|
55
71
|
return path.join(head, options.kind);
|
|
56
72
|
}
|
|
57
|
-
/** Reset
|
|
73
|
+
/** Reset internal caches — kept for back-compat with existing tests; now a no-op. */
|
|
58
74
|
export function _resetRunCache() {
|
|
59
|
-
|
|
75
|
+
/* no-op: runIds are no longer cached at module level */
|
|
60
76
|
}
|
|
61
77
|
//# sourceMappingURL=runs.js.map
|
package/dist/runs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runs.js","sourceRoot":"","sources":["../src/runs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAa7B,
|
|
1
|
+
{"version":3,"file":"runs.js","sourceRoot":"","sources":["../src/runs.ts"],"names":[],"mappings":"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"}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { WebSocketServer } from 'ws';
|
|
7
7
|
import type { ConsoleLog, HmrScreenshotData, SweetlinkCommand, SweetlinkResponse } from '../types.js';
|
|
8
|
-
export type {
|
|
8
|
+
export type { ConsoleLog, HmrScreenshotData, SweetlinkCommand, SweetlinkResponse };
|
|
9
9
|
/**
|
|
10
10
|
* Get the project root directory (where the server was started)
|
|
11
11
|
* This is captured at server initialization time for consistency
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAa,eAAe,EAAE,MAAM,IAAI,CAAC;AAGhD,OAAO,KAAK,EAGV,UAAU,EAEV,iBAAiB,EAMjB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAoErB,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAa,eAAe,EAAE,MAAM,IAAI,CAAC;AAGhD,OAAO,KAAK,EAGV,UAAU,EAEV,iBAAiB,EAMjB,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,aAAa,CAAC;AAoErB,YAAY,EAAE,UAAU,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,CAAC;AAqFnF;;;GAGG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,qFAAqF;IACrF,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,kEAAkE;IAClE,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,wGAAwG;IACxG,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC,CAiGrF;AAED,4CAA4C;AAC5C,wBAAgB,gBAAgB,IAAI,MAAM,GAAG,IAAI,CAEhD;AAED,kCAAkC;AAClC,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,IAAI,CAEpD;AAED,kCAAkC;AAClC,wBAAgB,YAAY,IAAI,MAAM,GAAG,SAAS,CAEjD;AAED,uBAAuB;AACvB,wBAAgB,UAAU,IAAI,MAAM,GAAG,SAAS,CAE/C;AAi0BD,wBAAgB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CA2C9C"}
|
|
@@ -28,6 +28,12 @@ export interface AndroidRecordOptions {
|
|
|
28
28
|
* missing — the raw recording is still produced.
|
|
29
29
|
*/
|
|
30
30
|
overlays?: boolean;
|
|
31
|
+
/**
|
|
32
|
+
* When true, the spawned command sees the full process.env. Default
|
|
33
|
+
* false: only a minimal allowlist is forwarded to keep secrets out of
|
|
34
|
+
* the recorded artifact.
|
|
35
|
+
*/
|
|
36
|
+
inheritEnv?: boolean;
|
|
31
37
|
}
|
|
32
38
|
export interface AndroidRecordResult {
|
|
33
39
|
output: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"android.d.ts","sourceRoot":"","sources":["../../src/simulator/android.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"android.d.ts","sourceRoot":"","sources":["../../src/simulator/android.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,yEAAyE;IACzE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;OAIG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAwDD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,OAAO,CAAC;IACzB,8CAA8C;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mEAAmE;IACnE,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAmBD,4FAA4F;AAC5F,wBAAsB,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAanF;AAED,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,mBAAmB,CAAC,CA6L9B"}
|
|
@@ -15,6 +15,57 @@
|
|
|
15
15
|
import { execFile, spawn } from 'child_process';
|
|
16
16
|
import { promises as fs } from 'fs';
|
|
17
17
|
import * as path from 'path';
|
|
18
|
+
const MINIMAL_ENV_KEYS = [
|
|
19
|
+
'PATH',
|
|
20
|
+
'HOME',
|
|
21
|
+
'USER',
|
|
22
|
+
'LANG',
|
|
23
|
+
'LC_ALL',
|
|
24
|
+
'LC_CTYPE',
|
|
25
|
+
'TERM',
|
|
26
|
+
'SHELL',
|
|
27
|
+
'TZ',
|
|
28
|
+
'TMPDIR',
|
|
29
|
+
'PWD',
|
|
30
|
+
];
|
|
31
|
+
function pickMinimalEnv() {
|
|
32
|
+
const out = {};
|
|
33
|
+
for (const key of MINIMAL_ENV_KEYS) {
|
|
34
|
+
const v = process.env[key];
|
|
35
|
+
if (typeof v === 'string')
|
|
36
|
+
out[key] = v;
|
|
37
|
+
}
|
|
38
|
+
return out;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Poll `adb shell stat -c %s <remotePath>` until the size is stable across
|
|
42
|
+
* two consecutive checks (or until we run out of attempts). Replaces a
|
|
43
|
+
* blind 500ms sleep — on slow physical devices, fuse-backed /sdcard, or
|
|
44
|
+
* USB-1 connections, the H.264 trailer can take several seconds to flush.
|
|
45
|
+
*/
|
|
46
|
+
async function waitForStableSize(device, remotePath) {
|
|
47
|
+
let last = -1;
|
|
48
|
+
for (let i = 0; i < 20; i++) {
|
|
49
|
+
try {
|
|
50
|
+
const out = await new Promise((resolve, reject) => {
|
|
51
|
+
execFile('adb', ['-s', device, 'shell', 'stat', '-c', '%s', remotePath], { encoding: 'utf-8' }, (err, stdout) => {
|
|
52
|
+
if (err)
|
|
53
|
+
reject(err);
|
|
54
|
+
else
|
|
55
|
+
resolve(stdout);
|
|
56
|
+
});
|
|
57
|
+
});
|
|
58
|
+
const size = parseInt(out.trim(), 10);
|
|
59
|
+
if (Number.isFinite(size) && size > 0 && size === last)
|
|
60
|
+
return;
|
|
61
|
+
last = size;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// stat occasionally races screenrecord's create; keep polling.
|
|
65
|
+
}
|
|
66
|
+
await new Promise((r) => setTimeout(r, 250));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
18
69
|
function adb(args) {
|
|
19
70
|
return new Promise((resolve, reject) => {
|
|
20
71
|
execFile('adb', args, { encoding: 'utf-8' }, (err, stdout, stderr) => {
|
|
@@ -91,6 +142,15 @@ export async function recordAndroidEmulator(options) {
|
|
|
91
142
|
const child = spawn(options.shell ?? '/bin/sh', ['-c', options.command], {
|
|
92
143
|
cwd: options.cwd,
|
|
93
144
|
stdio: 'inherit',
|
|
145
|
+
env: options.inheritEnv
|
|
146
|
+
? process.env
|
|
147
|
+
: pickMinimalEnv(),
|
|
148
|
+
});
|
|
149
|
+
// Without an `error` handler, a missing shell or bad cwd would crash
|
|
150
|
+
// the parent process and orphan recProc + tapCapture.proc on the device.
|
|
151
|
+
child.on('error', (err) => {
|
|
152
|
+
console.error(`[Sweetlink] Failed to spawn user command: ${err.message}`);
|
|
153
|
+
resolve({ exitCode: 127 });
|
|
94
154
|
});
|
|
95
155
|
child.on('close', (code) => resolve({ exitCode: code ?? 0 }));
|
|
96
156
|
});
|
|
@@ -124,8 +184,11 @@ export async function recordAndroidEmulator(options) {
|
|
|
124
184
|
/* ignore */
|
|
125
185
|
}
|
|
126
186
|
});
|
|
127
|
-
// Pull the file off the device.
|
|
128
|
-
|
|
187
|
+
// Pull the file off the device. Poll for stat-size stability — a fixed
|
|
188
|
+
// sleep is unreliable on slow devices, USB-1, or fuse-backed /sdcard.
|
|
189
|
+
// Without this, `adb pull` happily copies a partial file and silently
|
|
190
|
+
// hands the user a truncated .mp4.
|
|
191
|
+
await waitForStableSize(device, remotePath);
|
|
129
192
|
await adb(['-s', device, 'pull', remotePath, options.output]);
|
|
130
193
|
// Best-effort cleanup on the device.
|
|
131
194
|
try {
|
|
@@ -145,8 +208,22 @@ export async function recordAndroidEmulator(options) {
|
|
|
145
208
|
catch {
|
|
146
209
|
/* ignore */
|
|
147
210
|
}
|
|
148
|
-
//
|
|
149
|
-
|
|
211
|
+
// Wait for the listener to actually exit + flush its trailing buffer
|
|
212
|
+
// (taps that landed in the last few hundred ms before SIGTERM). If it
|
|
213
|
+
// doesn't close in 2s, force-kill so we don't hang the CLI on a
|
|
214
|
+
// wedged adb shell.
|
|
215
|
+
await Promise.race([
|
|
216
|
+
tapCapture.done,
|
|
217
|
+
new Promise((resolve) => setTimeout(() => {
|
|
218
|
+
try {
|
|
219
|
+
tapCapture?.proc.kill('SIGKILL');
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
/* ignore */
|
|
223
|
+
}
|
|
224
|
+
resolve();
|
|
225
|
+
}, 2_000)),
|
|
226
|
+
]);
|
|
150
227
|
const taps = tapCapture.taps;
|
|
151
228
|
tapCount = taps.length;
|
|
152
229
|
// Sidecar JSON (always written when capture was attempted).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"android.js","sourceRoot":"","sources":["../../src/simulator/android.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAqB,QAAQ,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"android.js","sourceRoot":"","sources":["../../src/simulator/android.ts"],"names":[],"mappings":"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"}
|
|
@@ -86,14 +86,24 @@ export interface ParseState {
|
|
|
86
86
|
downAtMs: number | null;
|
|
87
87
|
}
|
|
88
88
|
export declare function freshParseState(): ParseState;
|
|
89
|
-
export declare function processGetEventChunk(text: string, state: ParseState, scaleX: number, scaleY: number, startMs: number, nowMs: number
|
|
89
|
+
export declare function processGetEventChunk(text: string, state: ParseState, scaleX: number, scaleY: number, startMs: number, nowMs: number, bounds?: {
|
|
90
|
+
maxX: number;
|
|
91
|
+
maxY: number;
|
|
92
|
+
screenWidth: number;
|
|
93
|
+
screenHeight: number;
|
|
94
|
+
}): TapEvent[];
|
|
90
95
|
/**
|
|
91
96
|
* Spawn a `getevent -l` listener for the given input path. Returns the
|
|
92
97
|
* child process plus a live array of tap events that the caller can read
|
|
93
|
-
* after they
|
|
98
|
+
* after they await `done` (or kill the process and await close).
|
|
99
|
+
*
|
|
100
|
+
* `done` resolves once the proc 'close' event fires AND the trailing
|
|
101
|
+
* buffered partial line has been processed — without it, taps in the final
|
|
102
|
+
* milliseconds before SIGTERM are silently dropped.
|
|
94
103
|
*/
|
|
95
104
|
export declare function captureTapsLive(deviceSerial: string, info: TouchDeviceInfo, startMs: number): {
|
|
96
105
|
proc: ChildProcess;
|
|
97
106
|
taps: TapEvent[];
|
|
107
|
+
done: Promise<void>;
|
|
98
108
|
};
|
|
99
109
|
//# sourceMappingURL=androidTaps.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"androidTaps.d.ts","sourceRoot":"","sources":["../../src/simulator/androidTaps.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,KAAK,YAAY,EAAmB,MAAM,eAAe,CAAC;AAEnE,MAAM,WAAW,QAAQ;IACvB,8CAA8C;IAC9C,CAAC,EAAE,MAAM,CAAC;IACV,8CAA8C;IAC9C,CAAC,EAAE,MAAM,CAAC;IACV,qCAAqC;IACrC,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,eAAe;IAC9B,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;CACtB;AAWD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAMjF;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,GACV,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAAC,CAgB3E;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAqBpF;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AACD,wBAAgB,eAAe,IAAI,UAAU,CAE5C;
|
|
1
|
+
{"version":3,"file":"androidTaps.d.ts","sourceRoot":"","sources":["../../src/simulator/androidTaps.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,KAAK,YAAY,EAAmB,MAAM,eAAe,CAAC;AAEnE,MAAM,WAAW,QAAQ;IACvB,8CAA8C;IAC9C,CAAC,EAAE,MAAM,CAAC;IACV,8CAA8C;IAC9C,CAAC,EAAE,MAAM,CAAC;IACV,qCAAqC;IACrC,CAAC,EAAE,MAAM,CAAC;CACX;AAED,MAAM,WAAW,eAAe;IAC9B,8BAA8B;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,WAAW,EAAE,MAAM,CAAC;IACpB,gCAAgC;IAChC,YAAY,EAAE,MAAM,CAAC;CACtB;AAWD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAMjF;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,GACV,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,CAAC,CAgB3E;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAqBpF;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AACD,wBAAgB,eAAe,IAAI,UAAU,CAE5C;AAgBD,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,UAAU,EACjB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,GACjF,QAAQ,EAAE,CAkCZ;AAED;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,eAAe,EACrB,OAAO,EAAE,MAAM,GACd;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAiD/D"}
|
|
@@ -99,7 +99,23 @@ export async function findTouchDevice(deviceSerial) {
|
|
|
99
99
|
export function freshParseState() {
|
|
100
100
|
return { curX: null, curY: null, downAtMs: null };
|
|
101
101
|
}
|
|
102
|
-
|
|
102
|
+
/**
|
|
103
|
+
* Parse a hex value from `getevent` output. A hostile / unusual adb daemon
|
|
104
|
+
* (manufacturer firmware, network adb at 5555) can emit non-hex tokens or
|
|
105
|
+
* extra-large values; reject those rather than letting NaN/huge numbers
|
|
106
|
+
* propagate into the overlay filter and silently break ffmpeg.
|
|
107
|
+
*/
|
|
108
|
+
function safeHex(value, max) {
|
|
109
|
+
if (!value)
|
|
110
|
+
return null;
|
|
111
|
+
if (!/^[0-9a-fA-F]+$/.test(value))
|
|
112
|
+
return null;
|
|
113
|
+
const n = parseInt(value, 16);
|
|
114
|
+
if (!Number.isFinite(n) || n < 0 || n > max)
|
|
115
|
+
return null;
|
|
116
|
+
return n;
|
|
117
|
+
}
|
|
118
|
+
export function processGetEventChunk(text, state, scaleX, scaleY, startMs, nowMs, bounds) {
|
|
103
119
|
const out = [];
|
|
104
120
|
for (const line of text.split('\n')) {
|
|
105
121
|
const m = line.match(/^\/dev\/input\/\S+:\s+(EV_\w+)\s+(\w+)\s+(\w+)/);
|
|
@@ -107,10 +123,14 @@ export function processGetEventChunk(text, state, scaleX, scaleY, startMs, nowMs
|
|
|
107
123
|
continue;
|
|
108
124
|
const [, evType, evCode, valueStr] = m;
|
|
109
125
|
if (evType === 'EV_ABS' && evCode === 'ABS_MT_POSITION_X') {
|
|
110
|
-
|
|
126
|
+
const v = safeHex(valueStr, bounds?.maxX ?? Number.MAX_SAFE_INTEGER);
|
|
127
|
+
if (v !== null)
|
|
128
|
+
state.curX = v;
|
|
111
129
|
}
|
|
112
130
|
else if (evType === 'EV_ABS' && evCode === 'ABS_MT_POSITION_Y') {
|
|
113
|
-
|
|
131
|
+
const v = safeHex(valueStr, bounds?.maxY ?? Number.MAX_SAFE_INTEGER);
|
|
132
|
+
if (v !== null)
|
|
133
|
+
state.curY = v;
|
|
114
134
|
}
|
|
115
135
|
else if (evType === 'EV_KEY' && evCode === 'BTN_TOUCH') {
|
|
116
136
|
if (valueStr === 'DOWN') {
|
|
@@ -118,11 +138,15 @@ export function processGetEventChunk(text, state, scaleX, scaleY, startMs, nowMs
|
|
|
118
138
|
}
|
|
119
139
|
else if (valueStr === 'UP') {
|
|
120
140
|
if (state.curX !== null && state.curY !== null && state.downAtMs !== null) {
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
141
|
+
const px = Math.round(state.curX * scaleX);
|
|
142
|
+
const py = Math.round(state.curY * scaleY);
|
|
143
|
+
const sw = bounds?.screenWidth;
|
|
144
|
+
const sh = bounds?.screenHeight;
|
|
145
|
+
const x = sw ? Math.max(0, Math.min(sw, px)) : px;
|
|
146
|
+
const y = sh ? Math.max(0, Math.min(sh, py)) : py;
|
|
147
|
+
if (Number.isFinite(x) && Number.isFinite(y)) {
|
|
148
|
+
out.push({ x, y, t: (state.downAtMs - startMs) / 1000 });
|
|
149
|
+
}
|
|
126
150
|
}
|
|
127
151
|
state.curX = null;
|
|
128
152
|
state.curY = null;
|
|
@@ -135,16 +159,27 @@ export function processGetEventChunk(text, state, scaleX, scaleY, startMs, nowMs
|
|
|
135
159
|
/**
|
|
136
160
|
* Spawn a `getevent -l` listener for the given input path. Returns the
|
|
137
161
|
* child process plus a live array of tap events that the caller can read
|
|
138
|
-
* after they
|
|
162
|
+
* after they await `done` (or kill the process and await close).
|
|
163
|
+
*
|
|
164
|
+
* `done` resolves once the proc 'close' event fires AND the trailing
|
|
165
|
+
* buffered partial line has been processed — without it, taps in the final
|
|
166
|
+
* milliseconds before SIGTERM are silently dropped.
|
|
139
167
|
*/
|
|
140
168
|
export function captureTapsLive(deviceSerial, info, startMs) {
|
|
141
169
|
const taps = [];
|
|
142
170
|
const state = freshParseState();
|
|
143
171
|
const scaleX = info.screenWidth / info.maxX;
|
|
144
172
|
const scaleY = info.screenHeight / info.maxY;
|
|
173
|
+
const bounds = {
|
|
174
|
+
maxX: info.maxX,
|
|
175
|
+
maxY: info.maxY,
|
|
176
|
+
screenWidth: info.screenWidth,
|
|
177
|
+
screenHeight: info.screenHeight,
|
|
178
|
+
};
|
|
145
179
|
const proc = spawn('adb', ['-s', deviceSerial, 'shell', 'getevent', '-l', info.path], {
|
|
146
180
|
stdio: ['ignore', 'pipe', 'pipe'],
|
|
147
181
|
});
|
|
182
|
+
proc.unref(); // don't keep the parent process alive past its main work
|
|
148
183
|
let buffer = '';
|
|
149
184
|
proc.stdout?.on('data', (chunk) => {
|
|
150
185
|
buffer += chunk.toString();
|
|
@@ -154,9 +189,20 @@ export function captureTapsLive(deviceSerial, info, startMs) {
|
|
|
154
189
|
return;
|
|
155
190
|
const ready = buffer.slice(0, lastNl);
|
|
156
191
|
buffer = buffer.slice(lastNl + 1);
|
|
157
|
-
const newTaps = processGetEventChunk(ready, state, scaleX, scaleY, startMs, Date.now());
|
|
192
|
+
const newTaps = processGetEventChunk(ready, state, scaleX, scaleY, startMs, Date.now(), bounds);
|
|
158
193
|
taps.push(...newTaps);
|
|
159
194
|
});
|
|
160
|
-
|
|
195
|
+
const done = new Promise((resolve) => {
|
|
196
|
+
proc.on('close', () => {
|
|
197
|
+
// Flush trailing buffer — anything that didn't end with \n.
|
|
198
|
+
if (buffer.length > 0) {
|
|
199
|
+
const newTaps = processGetEventChunk(buffer, state, scaleX, scaleY, startMs, Date.now(), bounds);
|
|
200
|
+
taps.push(...newTaps);
|
|
201
|
+
buffer = '';
|
|
202
|
+
}
|
|
203
|
+
resolve();
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
return { proc, taps, done };
|
|
161
207
|
}
|
|
162
208
|
//# sourceMappingURL=androidTaps.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"androidTaps.js","sourceRoot":"","sources":["../../src/simulator/androidTaps.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"androidTaps.js","sourceRoot":"","sources":["../../src/simulator/androidTaps.ts"],"names":[],"mappings":"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"}
|
package/dist/simulator/ios.d.ts
CHANGED
|
@@ -18,6 +18,13 @@ export interface IosRecordOptions {
|
|
|
18
18
|
cwd?: string;
|
|
19
19
|
/** Override shell. */
|
|
20
20
|
shell?: string;
|
|
21
|
+
/**
|
|
22
|
+
* When true, the spawned command sees the full process.env. Default false:
|
|
23
|
+
* only a small allowlist (PATH/HOME/USER/LANG/SHELL/etc.) is forwarded so
|
|
24
|
+
* secrets in env (NPM_TOKEN, GH_TOKEN, ANTHROPIC_API_KEY, ...) cannot leak
|
|
25
|
+
* into the recorded .mp4 via stack traces or test logs.
|
|
26
|
+
*/
|
|
27
|
+
inheritEnv?: boolean;
|
|
21
28
|
}
|
|
22
29
|
export interface IosRecordResult {
|
|
23
30
|
output: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ios.d.ts","sourceRoot":"","sources":["../../src/simulator/ios.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,WAAW,gBAAgB;IAC/B,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"ios.d.ts","sourceRoot":"","sources":["../../src/simulator/ios.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAMH,MAAM,WAAW,gBAAgB;IAC/B,4CAA4C;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,oEAAoE;IACpE,MAAM,EAAE,MAAM,CAAC;IACf,6EAA6E;IAC7E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,sBAAsB;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAyBD,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,4EAA4E;IAC5E,eAAe,EAAE,OAAO,CAAC;CAC1B;AAoBD;;;GAGG;AACH,wBAAsB,aAAa,CACjC,UAAU,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CAqBhD;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAuG5F"}
|