execbro 1.10.25 → 1.11.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/README.md +1 -1
- package/build/__tests__/integration/native-logs.test.d.ts +2 -0
- package/build/__tests__/integration/native-logs.test.d.ts.map +1 -0
- package/build/__tests__/integration/native-logs.test.js +39 -0
- package/build/__tests__/integration/native-logs.test.js.map +1 -0
- package/build/__tests__/unit/clearLogsNative.test.d.ts +2 -0
- package/build/__tests__/unit/clearLogsNative.test.d.ts.map +1 -0
- package/build/__tests__/unit/clearLogsNative.test.js +43 -0
- package/build/__tests__/unit/clearLogsNative.test.js.map +1 -0
- package/build/__tests__/unit/componentFormatNaming.test.d.ts +2 -0
- package/build/__tests__/unit/componentFormatNaming.test.d.ts.map +1 -0
- package/build/__tests__/unit/componentFormatNaming.test.js +32 -0
- package/build/__tests__/unit/componentFormatNaming.test.js.map +1 -0
- package/build/__tests__/unit/getLogsEmptyContract.test.js +20 -7
- package/build/__tests__/unit/getLogsEmptyContract.test.js.map +1 -1
- package/build/__tests__/unit/getLogsNativeSource.test.d.ts +2 -0
- package/build/__tests__/unit/getLogsNativeSource.test.d.ts.map +1 -0
- package/build/__tests__/unit/getLogsNativeSource.test.js +138 -0
- package/build/__tests__/unit/getLogsNativeSource.test.js.map +1 -0
- package/build/__tests__/unit/jsLogEvents.test.d.ts +2 -0
- package/build/__tests__/unit/jsLogEvents.test.d.ts.map +1 -0
- package/build/__tests__/unit/jsLogEvents.test.js +58 -0
- package/build/__tests__/unit/jsLogEvents.test.js.map +1 -0
- package/build/__tests__/unit/logEventFormat.test.d.ts +2 -0
- package/build/__tests__/unit/logEventFormat.test.d.ts.map +1 -0
- package/build/__tests__/unit/logEventFormat.test.js +210 -0
- package/build/__tests__/unit/logEventFormat.test.js.map +1 -0
- package/build/__tests__/unit/logEvents.test.d.ts +2 -0
- package/build/__tests__/unit/logEvents.test.d.ts.map +1 -0
- package/build/__tests__/unit/logEvents.test.js +118 -0
- package/build/__tests__/unit/logEvents.test.js.map +1 -0
- package/build/__tests__/unit/logGrouping.test.d.ts +2 -0
- package/build/__tests__/unit/logGrouping.test.d.ts.map +1 -0
- package/build/__tests__/unit/logGrouping.test.js +104 -0
- package/build/__tests__/unit/logGrouping.test.js.map +1 -0
- package/build/__tests__/unit/logOwnership.test.d.ts +2 -0
- package/build/__tests__/unit/logOwnership.test.d.ts.map +1 -0
- package/build/__tests__/unit/logOwnership.test.js +118 -0
- package/build/__tests__/unit/logOwnership.test.js.map +1 -0
- package/build/__tests__/unit/logRelevance.test.d.ts +2 -0
- package/build/__tests__/unit/logRelevance.test.d.ts.map +1 -0
- package/build/__tests__/unit/logRelevance.test.js +30 -0
- package/build/__tests__/unit/logRelevance.test.js.map +1 -0
- package/build/__tests__/unit/logSourceAndroid.test.d.ts +2 -0
- package/build/__tests__/unit/logSourceAndroid.test.d.ts.map +1 -0
- package/build/__tests__/unit/logSourceAndroid.test.js +61 -0
- package/build/__tests__/unit/logSourceAndroid.test.js.map +1 -0
- package/build/__tests__/unit/logSourceIos.test.d.ts +2 -0
- package/build/__tests__/unit/logSourceIos.test.d.ts.map +1 -0
- package/build/__tests__/unit/logSourceIos.test.js +64 -0
- package/build/__tests__/unit/logSourceIos.test.js.map +1 -0
- package/build/__tests__/unit/logs.test.js +23 -0
- package/build/__tests__/unit/logs.test.js.map +1 -1
- package/build/__tests__/unit/nativeLogs.test.d.ts +2 -0
- package/build/__tests__/unit/nativeLogs.test.d.ts.map +1 -0
- package/build/__tests__/unit/nativeLogs.test.js +230 -0
- package/build/__tests__/unit/nativeLogs.test.js.map +1 -0
- package/build/__tests__/unit/toolsJson.test.js +11 -0
- package/build/__tests__/unit/toolsJson.test.js.map +1 -1
- package/build/core/componentSearch.d.ts +1 -1
- package/build/core/componentSearch.d.ts.map +1 -1
- package/build/core/componentSearch.js +8 -8
- package/build/core/componentSearch.js.map +1 -1
- package/build/core/componentTree.d.ts +1 -1
- package/build/core/componentTree.d.ts.map +1 -1
- package/build/core/componentTree.js +8 -8
- package/build/core/componentTree.js.map +1 -1
- package/build/core/guides.d.ts.map +1 -1
- package/build/core/guides.js +25 -0
- package/build/core/guides.js.map +1 -1
- package/build/core/index.d.ts +0 -2
- package/build/core/index.d.ts.map +1 -1
- package/build/core/index.js +0 -2
- package/build/core/index.js.map +1 -1
- package/build/core/jsLogEvents.d.ts +13 -0
- package/build/core/jsLogEvents.d.ts.map +1 -0
- package/build/core/jsLogEvents.js +65 -0
- package/build/core/jsLogEvents.js.map +1 -0
- package/build/core/logEventFormat.d.ts +14 -0
- package/build/core/logEventFormat.d.ts.map +1 -0
- package/build/core/logEventFormat.js +85 -0
- package/build/core/logEventFormat.js.map +1 -0
- package/build/core/logEvents.d.ts +115 -0
- package/build/core/logEvents.d.ts.map +1 -0
- package/build/core/logEvents.js +146 -0
- package/build/core/logEvents.js.map +1 -0
- package/build/core/logGrouping.d.ts +17 -0
- package/build/core/logGrouping.d.ts.map +1 -0
- package/build/core/logGrouping.js +134 -0
- package/build/core/logGrouping.js.map +1 -0
- package/build/core/logOwnership.d.ts +29 -0
- package/build/core/logOwnership.d.ts.map +1 -0
- package/build/core/logOwnership.js +83 -0
- package/build/core/logOwnership.js.map +1 -0
- package/build/core/logRelevance.d.ts +13 -0
- package/build/core/logRelevance.d.ts.map +1 -0
- package/build/core/logRelevance.js +23 -0
- package/build/core/logRelevance.js.map +1 -0
- package/build/core/logSourceAndroid.d.ts +27 -0
- package/build/core/logSourceAndroid.d.ts.map +1 -0
- package/build/core/logSourceAndroid.js +89 -0
- package/build/core/logSourceAndroid.js.map +1 -0
- package/build/core/logSourceIos.d.ts +26 -0
- package/build/core/logSourceIos.d.ts.map +1 -0
- package/build/core/logSourceIos.js +119 -0
- package/build/core/logSourceIos.js.map +1 -0
- package/build/core/logs.d.ts +5 -1
- package/build/core/logs.d.ts.map +1 -1
- package/build/core/logs.js +8 -1
- package/build/core/logs.js.map +1 -1
- package/build/core/nativeLogs.d.ts +75 -0
- package/build/core/nativeLogs.d.ts.map +1 -0
- package/build/core/nativeLogs.js +260 -0
- package/build/core/nativeLogs.js.map +1 -0
- package/build/core/screenLayout.d.ts +1 -1
- package/build/core/screenLayout.d.ts.map +1 -1
- package/build/core/screenLayout.js +3 -3
- package/build/core/screenLayout.js.map +1 -1
- package/build/core/types.d.ts +3 -2
- package/build/core/types.d.ts.map +1 -1
- package/build/tools/componentTools.js +6 -6
- package/build/tools/componentTools.js.map +1 -1
- package/build/tools/logTools.d.ts +25 -0
- package/build/tools/logTools.d.ts.map +1 -1
- package/build/tools/logTools.js +246 -70
- package/build/tools/logTools.js.map +1 -1
- package/build/tools/networkTools.d.ts.map +1 -1
- package/build/tools/networkTools.js +5 -44
- package/build/tools/networkTools.js.map +1 -1
- package/package.json +5 -4
- package/tools.json +447 -0
- package/build/core/format.d.ts +0 -8
- package/build/core/format.d.ts.map +0 -1
- package/build/core/format.js +0 -34
- package/build/core/format.js.map +0 -1
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
import { describe, it, expect } from "@jest/globals";
|
|
2
|
+
import { formatEventRow, formatEventDetails } from "../../core/logEventFormat.js";
|
|
3
|
+
const EVENT = {
|
|
4
|
+
id: "n7",
|
|
5
|
+
source: "native",
|
|
6
|
+
deviceKey: "emulator-5554",
|
|
7
|
+
deviceName: "Pixel",
|
|
8
|
+
ts: new Date("2026-07-29T19:11:05.015Z"),
|
|
9
|
+
level: "fatal",
|
|
10
|
+
kind: "crash",
|
|
11
|
+
title: "SIGABRT in libhermes.so (14 frames)",
|
|
12
|
+
owner: "com.rndebuggertestapp",
|
|
13
|
+
lineCount: 17,
|
|
14
|
+
byteSize: 2048,
|
|
15
|
+
fingerprint: "abc123",
|
|
16
|
+
lines: Array.from({ length: 17 }, (_, i) => ({
|
|
17
|
+
ts: new Date("2026-07-29T19:11:05.015Z"),
|
|
18
|
+
level: "fatal",
|
|
19
|
+
pid: 22617,
|
|
20
|
+
tag: "DEBUG",
|
|
21
|
+
message: `frame ${i}`,
|
|
22
|
+
raw: `F DEBUG : frame ${i}`,
|
|
23
|
+
})),
|
|
24
|
+
};
|
|
25
|
+
describe("formatEventRow", () => {
|
|
26
|
+
it("leads with the addressable id", () => {
|
|
27
|
+
expect(formatEventRow(EVENT, { showDevice: false })).toMatch(/^\[n7\]/);
|
|
28
|
+
});
|
|
29
|
+
it("includes level, owner and title", () => {
|
|
30
|
+
const row = formatEventRow(EVENT, { showDevice: false });
|
|
31
|
+
expect(row).toContain("FATAL");
|
|
32
|
+
expect(row).toContain("com.rndebuggertestapp");
|
|
33
|
+
expect(row).toContain("SIGABRT in libhermes.so (14 frames)");
|
|
34
|
+
});
|
|
35
|
+
it("adds the device column only when asked", () => {
|
|
36
|
+
expect(formatEventRow(EVENT, { showDevice: false })).not.toContain("Pixel");
|
|
37
|
+
expect(formatEventRow(EVENT, { showDevice: true })).toContain("Pixel");
|
|
38
|
+
});
|
|
39
|
+
it("shows a size hint for oversized payloads", () => {
|
|
40
|
+
// Non-message kind: sizeHint/frameHint decorate the one-line title.
|
|
41
|
+
// Message-kind rows render their own body instead — see the
|
|
42
|
+
// "message events" describe block below.
|
|
43
|
+
const heavy = { ...EVENT, kind: "exception", lineCount: 1, byteSize: 42_189 };
|
|
44
|
+
expect(formatEventRow(heavy, { showDevice: false })).toContain("[41.2 KB]");
|
|
45
|
+
});
|
|
46
|
+
it("omits the size hint for small payloads", () => {
|
|
47
|
+
const small = { ...EVENT, kind: "exception", lineCount: 1, byteSize: 80 };
|
|
48
|
+
expect(formatEventRow(small, { showDevice: false })).not.toContain("KB]");
|
|
49
|
+
});
|
|
50
|
+
it("keeps crash/anr/exception rows to a single line regardless of maxLength/verbose", () => {
|
|
51
|
+
// EVENT is a 17-line crash. Compactness matters here: get_log_details
|
|
52
|
+
// exists to expand it, so the row must stay the one-line title even
|
|
53
|
+
// when the caller asks for full messages.
|
|
54
|
+
const row = formatEventRow(EVENT, { showDevice: false, verbose: true, maxLength: 0 });
|
|
55
|
+
expect(row.split("\n")).toHaveLength(1);
|
|
56
|
+
expect(row).toContain("SIGABRT in libhermes.so (14 frames)");
|
|
57
|
+
expect(row).not.toContain("frame 0");
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
describe("formatEventRow — message events", () => {
|
|
61
|
+
// For these tests message === raw, as it is for a JS console entry
|
|
62
|
+
// (jsEventsFromEntries sets both to the same string) — they exercise
|
|
63
|
+
// verbose/truncation behavior, not the raw-vs-message distinction, which
|
|
64
|
+
// has its own describe block below.
|
|
65
|
+
const MESSAGE_EVENT = {
|
|
66
|
+
...EVENT,
|
|
67
|
+
kind: "message",
|
|
68
|
+
title: "line one of the message",
|
|
69
|
+
lineCount: 3,
|
|
70
|
+
lines: [
|
|
71
|
+
{ ts: EVENT.ts, level: "error", pid: 0, tag: "console", message: "line one of the message", raw: "line one of the message" },
|
|
72
|
+
{ ts: EVENT.ts, level: "error", pid: 0, tag: "console", message: "line two, much longer content", raw: "line two, much longer content" },
|
|
73
|
+
{ ts: EVENT.ts, level: "error", pid: 0, tag: "console", message: "line three, the end", raw: "line three, the end" },
|
|
74
|
+
],
|
|
75
|
+
};
|
|
76
|
+
it("renders the full multi-line payload when verbose", () => {
|
|
77
|
+
const row = formatEventRow(MESSAGE_EVENT, { showDevice: false, verbose: true });
|
|
78
|
+
expect(row).toContain("line one of the message");
|
|
79
|
+
expect(row).toContain("line two, much longer content");
|
|
80
|
+
expect(row).toContain("line three, the end");
|
|
81
|
+
});
|
|
82
|
+
it("honours maxLength (get_logs' maxMessageLength) when not verbose", () => {
|
|
83
|
+
const row = formatEventRow(MESSAGE_EVENT, { showDevice: false, verbose: false, maxLength: 10 });
|
|
84
|
+
expect(row).toContain("truncated");
|
|
85
|
+
expect(row).not.toContain("line three, the end");
|
|
86
|
+
});
|
|
87
|
+
it("defaults the truncation budget to 500, matching get_logs' schema default", () => {
|
|
88
|
+
const longRaw = "x".repeat(600);
|
|
89
|
+
const longEvent = {
|
|
90
|
+
...MESSAGE_EVENT,
|
|
91
|
+
lines: [{ ts: EVENT.ts, level: "error", pid: 0, tag: "console", message: longRaw, raw: longRaw }],
|
|
92
|
+
};
|
|
93
|
+
const row = formatEventRow(longEvent, { showDevice: false });
|
|
94
|
+
expect(row).toContain("truncated: 600 chars");
|
|
95
|
+
});
|
|
96
|
+
it("renders the parsed message, not the raw logcat line, for a native message event", () => {
|
|
97
|
+
// Live bug: a native message row showed the full logcat line
|
|
98
|
+
// (epoch/pid/tid/priority/tag) *in addition to* the row's own id/
|
|
99
|
+
// time/level/device columns, duplicating that metadata. The row
|
|
100
|
+
// must use `message`; `raw` belongs only in the detail view.
|
|
101
|
+
const nativeMessage = {
|
|
102
|
+
...EVENT,
|
|
103
|
+
kind: "message",
|
|
104
|
+
title: "ReconnectingWebSocket: connection error",
|
|
105
|
+
lineCount: 1,
|
|
106
|
+
lines: [{
|
|
107
|
+
ts: EVENT.ts,
|
|
108
|
+
level: "error",
|
|
109
|
+
pid: 23380,
|
|
110
|
+
tag: "unknown",
|
|
111
|
+
message: "ReconnectingWebSocket: connection error",
|
|
112
|
+
raw: "1785365084.082 23325 23380 E unknown:ReconnectingWebSocket: connection error",
|
|
113
|
+
}],
|
|
114
|
+
};
|
|
115
|
+
const row = formatEventRow(nativeMessage, { showDevice: false });
|
|
116
|
+
expect(row).toContain("ReconnectingWebSocket: connection error");
|
|
117
|
+
expect(row).not.toContain("1785365084.082");
|
|
118
|
+
expect(row).not.toContain("23380");
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
describe("formatEventRow — JS exception events", () => {
|
|
122
|
+
// Regression test: `verbose` promises full messages (schema text, design
|
|
123
|
+
// spec, guides.ts), but exception-kind rows used to always render
|
|
124
|
+
// titleFor() — first line only, stack discarded — because the row
|
|
125
|
+
// renderer only special-cased kind === "message".
|
|
126
|
+
const JS_EXCEPTION = {
|
|
127
|
+
...EVENT,
|
|
128
|
+
source: "js",
|
|
129
|
+
kind: "exception",
|
|
130
|
+
title: "TypeError: undefined is not an object (2 frames)",
|
|
131
|
+
lineCount: 1,
|
|
132
|
+
lines: [{
|
|
133
|
+
ts: EVENT.ts,
|
|
134
|
+
level: "error",
|
|
135
|
+
pid: 0,
|
|
136
|
+
tag: "console",
|
|
137
|
+
message: [
|
|
138
|
+
"TypeError: undefined is not an object (evaluating 'user.name')",
|
|
139
|
+
" at HomeScreen (app/index.tsx:24:11)",
|
|
140
|
+
" at renderWithHooks (react-dom.js:1234:5)",
|
|
141
|
+
].join("\n"),
|
|
142
|
+
raw: "irrelevant-for-row-rendering",
|
|
143
|
+
}],
|
|
144
|
+
};
|
|
145
|
+
it("renders the full stack when verbose", () => {
|
|
146
|
+
const row = formatEventRow(JS_EXCEPTION, { showDevice: false, verbose: true });
|
|
147
|
+
expect(row).toContain("at HomeScreen (app/index.tsx:24:11)");
|
|
148
|
+
expect(row).toContain("at renderWithHooks (react-dom.js:1234:5)");
|
|
149
|
+
});
|
|
150
|
+
it("stays a single-line title when not verbose", () => {
|
|
151
|
+
const row = formatEventRow(JS_EXCEPTION, { showDevice: false, verbose: false });
|
|
152
|
+
expect(row.split("\n")).toHaveLength(1);
|
|
153
|
+
expect(row).not.toContain("at HomeScreen");
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
describe("formatEventRow — native crash under verbose stays compact", () => {
|
|
157
|
+
it("does not expand a native crash even when verbose is requested", () => {
|
|
158
|
+
// EVENT is source: "native", kind: "crash". get_log_details is the
|
|
159
|
+
// documented expansion path for native rows; verbose must not bypass it.
|
|
160
|
+
const row = formatEventRow(EVENT, { showDevice: false, verbose: true });
|
|
161
|
+
expect(row.split("\n")).toHaveLength(1);
|
|
162
|
+
expect(row).not.toContain("frame 0");
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
describe("formatEventDetails", () => {
|
|
166
|
+
it("includes a header and every raw line", () => {
|
|
167
|
+
const out = formatEventDetails(EVENT, { maxLength: 0, verbose: true });
|
|
168
|
+
expect(out).toContain("n7");
|
|
169
|
+
expect(out).toContain("com.rndebuggertestapp");
|
|
170
|
+
expect(out).toContain("frame 0");
|
|
171
|
+
expect(out).toContain("frame 16");
|
|
172
|
+
});
|
|
173
|
+
it("truncates when not verbose", () => {
|
|
174
|
+
const out = formatEventDetails(EVENT, { maxLength: 60, verbose: false });
|
|
175
|
+
expect(out).toContain("truncated");
|
|
176
|
+
expect(out).not.toContain("frame 16");
|
|
177
|
+
});
|
|
178
|
+
it("separates the header from the payload with a blank line", () => {
|
|
179
|
+
// Regression test: filter(Boolean) used to drop the header's trailing
|
|
180
|
+
// "" separator (falsy, indistinguishable from an absent optional
|
|
181
|
+
// field), running "Lines: N" straight into the first payload line.
|
|
182
|
+
const out = formatEventDetails(EVENT, { maxLength: 0, verbose: true });
|
|
183
|
+
const headerEnd = out.indexOf("Lines: 17");
|
|
184
|
+
expect(headerEnd).toBeGreaterThan(-1);
|
|
185
|
+
const afterHeader = out.slice(headerEnd);
|
|
186
|
+
// "Lines: 17" then a blank line then the first payload row.
|
|
187
|
+
expect(afterHeader.startsWith("Lines: 17\n\nF DEBUG : frame 0")).toBe(true);
|
|
188
|
+
});
|
|
189
|
+
it("shows the full raw logcat line, unlike the row's parsed message", () => {
|
|
190
|
+
// formatEventRow strips the logcat prefix for compactness (see the
|
|
191
|
+
// "renders the parsed message..." test above); the detail view is
|
|
192
|
+
// where byte-fidelity is the point, so it must keep using `raw`.
|
|
193
|
+
const nativeMessage = {
|
|
194
|
+
...EVENT,
|
|
195
|
+
kind: "message",
|
|
196
|
+
lineCount: 1,
|
|
197
|
+
lines: [{
|
|
198
|
+
ts: EVENT.ts,
|
|
199
|
+
level: "error",
|
|
200
|
+
pid: 23380,
|
|
201
|
+
tag: "unknown",
|
|
202
|
+
message: "ReconnectingWebSocket: connection error",
|
|
203
|
+
raw: "1785365084.082 23325 23380 E unknown:ReconnectingWebSocket: connection error",
|
|
204
|
+
}],
|
|
205
|
+
};
|
|
206
|
+
const out = formatEventDetails(nativeMessage, { maxLength: 0, verbose: true });
|
|
207
|
+
expect(out).toContain("1785365084.082 23325 23380 E unknown:ReconnectingWebSocket: connection error");
|
|
208
|
+
});
|
|
209
|
+
});
|
|
210
|
+
//# sourceMappingURL=logEventFormat.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logEventFormat.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/logEventFormat.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAGlF,MAAM,KAAK,GAAa;IACpB,EAAE,EAAE,IAAI;IACR,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,eAAe;IAC1B,UAAU,EAAE,OAAO;IACnB,EAAE,EAAE,IAAI,IAAI,CAAC,0BAA0B,CAAC;IACxC,KAAK,EAAE,OAAO;IACd,IAAI,EAAE,OAAO;IACb,KAAK,EAAE,qCAAqC;IAC5C,KAAK,EAAE,uBAAuB;IAC9B,SAAS,EAAE,EAAE;IACb,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE,QAAQ;IACrB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QACzC,EAAE,EAAE,IAAI,IAAI,CAAC,0BAA0B,CAAC;QACxC,KAAK,EAAE,OAAgB;QACvB,GAAG,EAAE,KAAK;QACV,GAAG,EAAE,OAAO;QACZ,OAAO,EAAE,SAAS,CAAC,EAAE;QACrB,GAAG,EAAE,mBAAmB,CAAC,EAAE;KAC9B,CAAC,CAAC;CACN,CAAC;AAEF,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACrC,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACvC,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC/B,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAC9C,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC5E,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAChD,oEAAoE;QACpE,4DAA4D;QAC5D,yCAAyC;QACzC,MAAM,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,WAAoB,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;QACvF,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAC9C,MAAM,KAAK,GAAG,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,WAAoB,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;QACnF,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;QACvF,sEAAsE;QACtE,oEAAoE;QACpE,0CAA0C;QAC1C,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QACtF,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAC;QAC7D,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC7C,mEAAmE;IACnE,qEAAqE;IACrE,yEAAyE;IACzE,oCAAoC;IACpC,MAAM,aAAa,GAAa;QAC5B,GAAG,KAAK;QACR,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,yBAAyB;QAChC,SAAS,EAAE,CAAC;QACZ,KAAK,EAAE;YACH,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,yBAAyB,EAAE,GAAG,EAAE,yBAAyB,EAAE;YAC5H,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,+BAA+B,EAAE,GAAG,EAAE,+BAA+B,EAAE;YACxI,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,qBAAqB,EAAE,GAAG,EAAE,qBAAqB,EAAE;SACvH;KACJ,CAAC;IAEF,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QACxD,MAAM,GAAG,GAAG,cAAc,CAAC,aAAa,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAChF,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,yBAAyB,CAAC,CAAC;QACjD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,+BAA+B,CAAC,CAAC;QACvD,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACvE,MAAM,GAAG,GAAG,cAAc,CAAC,aAAa,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;QAChG,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAChF,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,SAAS,GAAa;YACxB,GAAG,aAAa;YAChB,KAAK,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;SACpG,CAAC;QACF,MAAM,GAAG,GAAG,cAAc,CAAC,SAAS,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7D,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;QACvF,6DAA6D;QAC7D,kEAAkE;QAClE,gEAAgE;QAChE,6DAA6D;QAC7D,MAAM,aAAa,GAAa;YAC5B,GAAG,KAAK;YACR,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,yCAAyC;YAChD,SAAS,EAAE,CAAC;YACZ,KAAK,EAAE,CAAC;oBACJ,EAAE,EAAE,KAAK,CAAC,EAAE;oBACZ,KAAK,EAAE,OAAO;oBACd,GAAG,EAAE,KAAK;oBACV,GAAG,EAAE,SAAS;oBACd,OAAO,EAAE,yCAAyC;oBAClD,GAAG,EAAE,8EAA8E;iBACtF,CAAC;SACL,CAAC;QACF,MAAM,GAAG,GAAG,cAAc,CAAC,aAAa,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;QACjE,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,yCAAyC,CAAC,CAAC;QACjE,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IAClD,yEAAyE;IACzE,kEAAkE;IAClE,kEAAkE;IAClE,kDAAkD;IAClD,MAAM,YAAY,GAAa;QAC3B,GAAG,KAAK;QACR,MAAM,EAAE,IAAI;QACZ,IAAI,EAAE,WAAW;QACjB,KAAK,EAAE,mDAAmD;QAC1D,SAAS,EAAE,CAAC;QACZ,KAAK,EAAE,CAAC;gBACJ,EAAE,EAAE,KAAK,CAAC,EAAE;gBACZ,KAAK,EAAE,OAAO;gBACd,GAAG,EAAE,CAAC;gBACN,GAAG,EAAE,SAAS;gBACd,OAAO,EAAE;oBACL,gEAAgE;oBAChE,yCAAyC;oBACzC,8CAA8C;iBACjD,CAAC,IAAI,CAAC,IAAI,CAAC;gBACZ,GAAG,EAAE,8BAA8B;aACtC,CAAC;KACL,CAAC;IAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC3C,MAAM,GAAG,GAAG,cAAc,CAAC,YAAY,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/E,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAC;QAC7D,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,0CAA0C,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QAClD,MAAM,GAAG,GAAG,cAAc,CAAC,YAAY,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QAChF,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,2DAA2D,EAAE,GAAG,EAAE;IACvE,EAAE,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACrE,mEAAmE;QACnE,yEAAyE;QACzE,MAAM,GAAG,GAAG,cAAc,CAAC,KAAK,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAChC,EAAE,CAAC,sCAAsC,EAAE,GAAG,EAAE;QAC5C,MAAM,GAAG,GAAG,kBAAkB,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QAC/C,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACjC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QAClC,MAAM,GAAG,GAAG,kBAAkB,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;QACzE,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QAC/D,sEAAsE;QACtE,iEAAiE;QACjE,mEAAmE;QACnE,MAAM,GAAG,GAAG,kBAAkB,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QAC3C,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACzC,4DAA4D;QAC5D,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,gCAAgC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iEAAiE,EAAE,GAAG,EAAE;QACvE,mEAAmE;QACnE,kEAAkE;QAClE,iEAAiE;QACjE,MAAM,aAAa,GAAa;YAC5B,GAAG,KAAK;YACR,IAAI,EAAE,SAAS;YACf,SAAS,EAAE,CAAC;YACZ,KAAK,EAAE,CAAC;oBACJ,EAAE,EAAE,KAAK,CAAC,EAAE;oBACZ,KAAK,EAAE,OAAO;oBACd,GAAG,EAAE,KAAK;oBACV,GAAG,EAAE,SAAS;oBACd,OAAO,EAAE,yCAAyC;oBAClD,GAAG,EAAE,8EAA8E;iBACtF,CAAC;SACL,CAAC;QACF,MAAM,GAAG,GAAG,kBAAkB,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/E,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,8EAA8E,CAAC,CAAC;IAC1G,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logEvents.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/logEvents.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from "@jest/globals";
|
|
2
|
+
import { fingerprintEvent, LEVEL_RANK, NativeLogBuffer, getNativeLogBuffer, findNativeEvent, __resetNativeLogBuffers, } from "../../core/logEvents.js";
|
|
3
|
+
function line(over = {}) {
|
|
4
|
+
return {
|
|
5
|
+
ts: new Date("2026-07-29T22:11:05.015Z"),
|
|
6
|
+
level: "fatal",
|
|
7
|
+
pid: 22617,
|
|
8
|
+
tag: "DEBUG",
|
|
9
|
+
message: "signal 6 (SIGABRT), code -1",
|
|
10
|
+
raw: "F DEBUG : signal 6 (SIGABRT), code -1",
|
|
11
|
+
...over,
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
describe("fingerprintEvent", () => {
|
|
15
|
+
it("is stable for identical input", () => {
|
|
16
|
+
expect(fingerprintEvent([line()], "emulator-5554"))
|
|
17
|
+
.toBe(fingerprintEvent([line()], "emulator-5554"));
|
|
18
|
+
});
|
|
19
|
+
it("differs across devices", () => {
|
|
20
|
+
expect(fingerprintEvent([line()], "emulator-5554"))
|
|
21
|
+
.not.toBe(fingerprintEvent([line()], "emulator-5556"));
|
|
22
|
+
});
|
|
23
|
+
it("differs when the timestamp differs", () => {
|
|
24
|
+
const later = line({ ts: new Date("2026-07-29T22:11:06.015Z") });
|
|
25
|
+
expect(fingerprintEvent([line()], "d")).not.toBe(fingerprintEvent([later], "d"));
|
|
26
|
+
});
|
|
27
|
+
it("ignores lines after the first, so a truncated refetch still matches", () => {
|
|
28
|
+
// logcat -T is inclusive and the tail may be cut short mid-backtrace;
|
|
29
|
+
// identity must come from the header line alone.
|
|
30
|
+
const withTail = [line(), line({ message: " #00 pc 707b0 libc.so" })];
|
|
31
|
+
expect(fingerprintEvent(withTail, "d")).toBe(fingerprintEvent([line()], "d"));
|
|
32
|
+
});
|
|
33
|
+
it("handles an empty line list without throwing", () => {
|
|
34
|
+
expect(() => fingerprintEvent([], "emulator-5554")).not.toThrow();
|
|
35
|
+
});
|
|
36
|
+
it("cannot be forged by a separator inside a field", () => {
|
|
37
|
+
// A raw join("|") would make these two collide.
|
|
38
|
+
const a = fingerprintEvent([line({ tag: "Foo|bar", message: "x" })], "d");
|
|
39
|
+
const b = fingerprintEvent([line({ tag: "Foo", message: "bar|x" })], "d");
|
|
40
|
+
expect(a).not.toBe(b);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe("LEVEL_RANK", () => {
|
|
44
|
+
it("orders levels from debug up to fatal", () => {
|
|
45
|
+
expect(LEVEL_RANK.debug).toBeLessThan(LEVEL_RANK.info);
|
|
46
|
+
expect(LEVEL_RANK.info).toBeLessThan(LEVEL_RANK.warn);
|
|
47
|
+
expect(LEVEL_RANK.warn).toBeLessThan(LEVEL_RANK.error);
|
|
48
|
+
expect(LEVEL_RANK.error).toBeLessThan(LEVEL_RANK.fatal);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
function draft(over = {}) {
|
|
52
|
+
const lines = over.lines ?? [line()];
|
|
53
|
+
return {
|
|
54
|
+
source: "native",
|
|
55
|
+
deviceKey: "emulator-5554",
|
|
56
|
+
deviceName: "Pixel",
|
|
57
|
+
ts: lines[0].ts,
|
|
58
|
+
level: "fatal",
|
|
59
|
+
kind: "crash",
|
|
60
|
+
title: "SIGABRT in libhermes.so (14 frames)",
|
|
61
|
+
owner: "com.rndebuggertestapp",
|
|
62
|
+
lineCount: lines.length,
|
|
63
|
+
byteSize: 400,
|
|
64
|
+
fingerprint: fingerprintEvent(lines, over.deviceKey ?? "emulator-5554"),
|
|
65
|
+
lines,
|
|
66
|
+
...over,
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
describe("NativeLogBuffer", () => {
|
|
70
|
+
beforeEach(() => __resetNativeLogBuffers());
|
|
71
|
+
it("assigns sequential n-prefixed ids", () => {
|
|
72
|
+
const buf = new NativeLogBuffer(50);
|
|
73
|
+
const [a, b] = buf.ingest([draft(), draft({ lines: [line({ pid: 99 })] })]);
|
|
74
|
+
expect(a.id).toMatch(/^n\d+$/);
|
|
75
|
+
expect(b.id).not.toBe(a.id);
|
|
76
|
+
});
|
|
77
|
+
it("drops events already ingested", () => {
|
|
78
|
+
const buf = new NativeLogBuffer(50);
|
|
79
|
+
expect(buf.ingest([draft()])).toHaveLength(1);
|
|
80
|
+
expect(buf.ingest([draft()])).toHaveLength(0); // the inclusive -T repeat
|
|
81
|
+
expect(buf.size).toBe(1);
|
|
82
|
+
});
|
|
83
|
+
it("advances the watermark to the newest ingested timestamp", () => {
|
|
84
|
+
const buf = new NativeLogBuffer(50);
|
|
85
|
+
const older = line({ ts: new Date("2026-07-29T22:00:00.000Z") });
|
|
86
|
+
const newer = line({ ts: new Date("2026-07-29T22:30:00.000Z"), pid: 2 });
|
|
87
|
+
buf.ingest([draft({ lines: [older], ts: older.ts }), draft({ lines: [newer], ts: newer.ts })]);
|
|
88
|
+
expect(buf.watermark?.toISOString()).toBe(newer.ts.toISOString());
|
|
89
|
+
});
|
|
90
|
+
it("keeps the watermark after clear so cleared events do not return", () => {
|
|
91
|
+
const buf = new NativeLogBuffer(50);
|
|
92
|
+
buf.ingest([draft()]);
|
|
93
|
+
const mark = buf.watermark;
|
|
94
|
+
expect(buf.clear()).toBe(1);
|
|
95
|
+
expect(buf.size).toBe(0);
|
|
96
|
+
expect(buf.watermark).toEqual(mark);
|
|
97
|
+
expect(buf.ingest([draft()])).toHaveLength(0);
|
|
98
|
+
});
|
|
99
|
+
it("resolves ids across devices without a device argument", () => {
|
|
100
|
+
const a = getNativeLogBuffer("emulator-5554");
|
|
101
|
+
const b = getNativeLogBuffer("F93612A3-0042-4BDC-855F-8CAB1BDD76C6");
|
|
102
|
+
const [ea] = a.ingest([draft({ deviceKey: "emulator-5554" })]);
|
|
103
|
+
const [eb] = b.ingest([draft({ deviceKey: "F93612A3-0042-4BDC-855F-8CAB1BDD76C6", lines: [line({ pid: 7 })] })]);
|
|
104
|
+
expect(ea.id).not.toBe(eb.id);
|
|
105
|
+
expect(findNativeEvent(ea.id)?.deviceKey).toBe("emulator-5554");
|
|
106
|
+
expect(findNativeEvent(eb.id)?.deviceKey).toBe("F93612A3-0042-4BDC-855F-8CAB1BDD76C6");
|
|
107
|
+
});
|
|
108
|
+
it("bounds the fingerprint set instead of growing forever", () => {
|
|
109
|
+
const buf = new NativeLogBuffer(5);
|
|
110
|
+
for (let i = 0; i < 200; i++) {
|
|
111
|
+
buf.ingest([draft({ lines: [line({ pid: i, message: `crash-${i}` })] })]);
|
|
112
|
+
}
|
|
113
|
+
expect(buf.size).toBe(5);
|
|
114
|
+
// 5 events * 4 retention = 20 fingerprints retained, not 200.
|
|
115
|
+
expect(buf.seenSize).toBeLessThanOrEqual(20);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
//# sourceMappingURL=logEvents.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logEvents.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/logEvents.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logGrouping.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/logGrouping.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { describe, it, expect } from "@jest/globals";
|
|
2
|
+
import { groupIntoEvents } from "../../core/logGrouping.js";
|
|
3
|
+
const CTX = { deviceKey: "emulator-5554", deviceName: "Pixel", source: "native" };
|
|
4
|
+
let clock = 0;
|
|
5
|
+
function line(over) {
|
|
6
|
+
clock += 1;
|
|
7
|
+
return {
|
|
8
|
+
ts: new Date(Date.UTC(2026, 6, 29, 22, 11, 5, clock)),
|
|
9
|
+
level: "info",
|
|
10
|
+
pid: 22617,
|
|
11
|
+
tid: 22617,
|
|
12
|
+
tag: "DEBUG",
|
|
13
|
+
message: "",
|
|
14
|
+
raw: "",
|
|
15
|
+
...over,
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
describe("groupIntoEvents", () => {
|
|
19
|
+
it("collapses a native backtrace into one crash event", () => {
|
|
20
|
+
const lines = [
|
|
21
|
+
line({ level: "fatal", message: "Cmdline: com.rndebuggertestapp", subject: "com.rndebuggertestapp" }),
|
|
22
|
+
line({ level: "fatal", message: "pid: 17782, tid: 17832 >>> com.rndebuggertestapp <<<" }),
|
|
23
|
+
line({ level: "fatal", message: "signal 6 (SIGABRT), code -1" }),
|
|
24
|
+
...Array.from({ length: 14 }, (_, i) => line({ level: "fatal", message: ` #${String(i).padStart(2, "0")} pc 707b0 /apex/libc.so (abort+156)` })),
|
|
25
|
+
];
|
|
26
|
+
const events = groupIntoEvents(lines, CTX);
|
|
27
|
+
expect(events).toHaveLength(1);
|
|
28
|
+
expect(events[0].kind).toBe("crash");
|
|
29
|
+
expect(events[0].lineCount).toBe(17);
|
|
30
|
+
expect(events[0].owner).toBe("com.rndebuggertestapp");
|
|
31
|
+
expect(events[0].level).toBe("fatal");
|
|
32
|
+
});
|
|
33
|
+
it("keeps one event when foreign pids interleave the backtrace", () => {
|
|
34
|
+
// logcat interleaves processes, so adjacency cannot define a group.
|
|
35
|
+
const lines = [
|
|
36
|
+
line({ level: "fatal", message: "Cmdline: com.rndebuggertestapp", subject: "com.rndebuggertestapp" }),
|
|
37
|
+
line({ pid: 660, tid: 813, tag: "ConnectivityService", message: "NetReassign [no changes]" }),
|
|
38
|
+
line({ level: "fatal", message: "signal 6 (SIGABRT), code -1" }),
|
|
39
|
+
line({ pid: 1210, tid: 13886, tag: "NearbyMediums", message: "Wifi changed" }),
|
|
40
|
+
line({ level: "fatal", message: " #00 pc 707b0 /apex/libc.so (abort+156)" }),
|
|
41
|
+
];
|
|
42
|
+
const events = groupIntoEvents(lines, CTX);
|
|
43
|
+
const crash = events.find((e) => e.kind === "crash");
|
|
44
|
+
expect(crash).toBeDefined();
|
|
45
|
+
expect(crash.lineCount).toBe(3);
|
|
46
|
+
expect(events.filter((e) => e.kind === "message")).toHaveLength(2);
|
|
47
|
+
});
|
|
48
|
+
it("collapses a java FATAL EXCEPTION with its stack", () => {
|
|
49
|
+
const lines = [
|
|
50
|
+
line({ tag: "AndroidRuntime", level: "error", message: "FATAL EXCEPTION: main" }),
|
|
51
|
+
line({ tag: "AndroidRuntime", level: "error", message: "Process: com.rndebuggertestapp, PID: 23325", subject: "com.rndebuggertestapp" }),
|
|
52
|
+
line({ tag: "AndroidRuntime", level: "error", message: "java.lang.NullPointerException" }),
|
|
53
|
+
line({ tag: "AndroidRuntime", level: "error", message: "\tat com.example.Foo.bar(Foo.java:42)" }),
|
|
54
|
+
line({ tag: "AndroidRuntime", level: "error", message: "Caused by: java.lang.IllegalStateException" }),
|
|
55
|
+
];
|
|
56
|
+
const events = groupIntoEvents(lines, CTX);
|
|
57
|
+
expect(events).toHaveLength(1);
|
|
58
|
+
expect(events[0].kind).toBe("crash");
|
|
59
|
+
expect(events[0].title).toContain("NullPointerException");
|
|
60
|
+
});
|
|
61
|
+
it("recognizes an ANR", () => {
|
|
62
|
+
const events = groupIntoEvents([
|
|
63
|
+
line({ tag: "ActivityManager", level: "error", pid: 660, message: "ANR in com.rndebuggertestapp" }),
|
|
64
|
+
], CTX);
|
|
65
|
+
expect(events[0].kind).toBe("anr");
|
|
66
|
+
});
|
|
67
|
+
it("emits one message event per unmatched line rather than dropping it", () => {
|
|
68
|
+
const events = groupIntoEvents([
|
|
69
|
+
line({ tag: "SoLoader", level: "warn", message: "couldn't find DSO to load" }),
|
|
70
|
+
], CTX);
|
|
71
|
+
expect(events).toHaveLength(1);
|
|
72
|
+
expect(events[0].kind).toBe("message");
|
|
73
|
+
expect(events[0].title).toContain("couldn't find DSO");
|
|
74
|
+
});
|
|
75
|
+
it("sets byteSize from the raw payload", () => {
|
|
76
|
+
const events = groupIntoEvents([line({ message: "hello", raw: "0123456789" })], CTX);
|
|
77
|
+
expect(events[0].byteSize).toBe(10);
|
|
78
|
+
});
|
|
79
|
+
it("names the culprit library, not the abort machinery", () => {
|
|
80
|
+
// Frame #00 of every abort is libc.so; the cause is deeper.
|
|
81
|
+
const lines = [
|
|
82
|
+
line({ level: "fatal", message: "Cmdline: com.rndebuggertestapp", subject: "com.rndebuggertestapp" }),
|
|
83
|
+
line({ level: "fatal", message: "signal 6 (SIGABRT), code -1" }),
|
|
84
|
+
line({ level: "fatal", message: " #00 pc 707b0 /apex/com.android.runtime/lib64/bionic/libc.so (abort+156)" }),
|
|
85
|
+
line({ level: "fatal", message: " #01 pc 8fdfc4 /apex/com.android.art/lib64/libart.so (art::Runtime::Abort+1008)" }),
|
|
86
|
+
line({ level: "fatal", message: " #02 pc 1654c /apex/com.android.art/lib64/libbase.so (android::base::SetAborter+80)" }),
|
|
87
|
+
line({ level: "fatal", message: " #03 pc d06d0c /apex/com.android.bt/lib64/libhermes.so (facebook::hermes::crash+836)" }),
|
|
88
|
+
];
|
|
89
|
+
const [event] = groupIntoEvents(lines, CTX);
|
|
90
|
+
expect(event.title).toContain("libhermes.so");
|
|
91
|
+
expect(event.title).not.toContain("libc.so");
|
|
92
|
+
expect(event.title).toContain("4 frames");
|
|
93
|
+
});
|
|
94
|
+
it("falls back to the first library when the whole backtrace is runtime machinery", () => {
|
|
95
|
+
const lines = [
|
|
96
|
+
line({ level: "fatal", message: "Cmdline: com.rndebuggertestapp", subject: "com.rndebuggertestapp" }),
|
|
97
|
+
line({ level: "fatal", message: "signal 6 (SIGABRT), code -1" }),
|
|
98
|
+
line({ level: "fatal", message: " #00 pc 707b0 /apex/com.android.runtime/lib64/bionic/libc.so (abort+156)" }),
|
|
99
|
+
];
|
|
100
|
+
const [event] = groupIntoEvents(lines, CTX);
|
|
101
|
+
expect(event.title).toContain("libc.so");
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
//# sourceMappingURL=logGrouping.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logGrouping.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/logGrouping.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logOwnership.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/logOwnership.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
// The adversarial cases here are verbatim from a live Android 16 emulator on
|
|
2
|
+
// 2026-07-29. Each one defeats an obvious-but-wrong ownership rule.
|
|
3
|
+
import { describe, it, expect } from "@jest/globals";
|
|
4
|
+
import { isOwned } from "../../core/logOwnership.js";
|
|
5
|
+
const APP = {
|
|
6
|
+
deviceKey: "emulator-5554",
|
|
7
|
+
platform: "android",
|
|
8
|
+
appId: "com.rndebuggertestapp",
|
|
9
|
+
pid: 23325,
|
|
10
|
+
};
|
|
11
|
+
function line(over) {
|
|
12
|
+
return {
|
|
13
|
+
ts: new Date("2026-07-29T22:11:05.015Z"),
|
|
14
|
+
level: "info",
|
|
15
|
+
pid: 1,
|
|
16
|
+
tag: "Unknown",
|
|
17
|
+
message: "",
|
|
18
|
+
raw: "",
|
|
19
|
+
...over,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
describe("isOwned", () => {
|
|
23
|
+
it("owns a tombstone the app did not write, via its declared subject", () => {
|
|
24
|
+
// Written by tombstoned (pid 22617); the dead app was 17782. Pid
|
|
25
|
+
// matching can never work here, which is why `declared` is rule 1.
|
|
26
|
+
const v = isOwned(line({
|
|
27
|
+
pid: 22617,
|
|
28
|
+
tag: "DEBUG",
|
|
29
|
+
level: "fatal",
|
|
30
|
+
subject: "com.rndebuggertestapp",
|
|
31
|
+
message: "pid: 17782, tid: 17832 >>> com.rndebuggertestapp <<<",
|
|
32
|
+
}), { ...APP, pid: undefined });
|
|
33
|
+
expect(v).toEqual({ owned: true, reason: "declared" });
|
|
34
|
+
});
|
|
35
|
+
it("owns lines from the live pid", () => {
|
|
36
|
+
expect(isOwned(line({ pid: 23325, tag: "ReactNative" }), APP))
|
|
37
|
+
.toEqual({ owned: true, reason: "pid" });
|
|
38
|
+
});
|
|
39
|
+
it("owns an ANR reported by ActivityManager", () => {
|
|
40
|
+
expect(isOwned(line({
|
|
41
|
+
pid: 660,
|
|
42
|
+
tag: "ActivityManager",
|
|
43
|
+
level: "error",
|
|
44
|
+
message: "ANR in com.rndebuggertestapp",
|
|
45
|
+
}), APP)).toEqual({ owned: true, reason: "verdict" });
|
|
46
|
+
});
|
|
47
|
+
it("rejects MMKV lines that contain the package as a FILESYSTEM PATH", () => {
|
|
48
|
+
expect(isOwned(line({
|
|
49
|
+
pid: 998,
|
|
50
|
+
tag: "MMKV",
|
|
51
|
+
message: "<MemoryFile.cpp:103::open> open fd[138] /data/data/com.rndebuggertestapp/files/mmkv",
|
|
52
|
+
}), { ...APP, pid: undefined })).toEqual({ owned: false });
|
|
53
|
+
});
|
|
54
|
+
it("rejects nativeloader apk paths from a foreign pid", () => {
|
|
55
|
+
expect(isOwned(line({
|
|
56
|
+
pid: 777,
|
|
57
|
+
tag: "nativeloader",
|
|
58
|
+
message: "Load /data/app/~~s-V8/com.rndebuggertestapp-Ht1RP33/base.apk!/lib/arm64-v8a/librnscreens.so: ok",
|
|
59
|
+
}), { ...APP, pid: undefined })).toEqual({ owned: false });
|
|
60
|
+
});
|
|
61
|
+
it("rejects ActivityThread lines emitted by OTHER apps' pids", () => {
|
|
62
|
+
expect(isOwned(line({
|
|
63
|
+
pid: 21908,
|
|
64
|
+
tag: "ActivityThread",
|
|
65
|
+
message: "Package [com.rndebuggertestapp] reported as REPLACED, but missing application info.",
|
|
66
|
+
}), { ...APP, pid: undefined })).toEqual({ owned: false });
|
|
67
|
+
});
|
|
68
|
+
it("rejects an allowlisted tag that names a DIFFERENT package", () => {
|
|
69
|
+
expect(isOwned(line({
|
|
70
|
+
pid: 660,
|
|
71
|
+
tag: "ActivityManager",
|
|
72
|
+
message: "ANR in com.google.android.apps.messaging",
|
|
73
|
+
}), APP)).toEqual({ owned: false });
|
|
74
|
+
});
|
|
75
|
+
it("rejects a sibling package that merely EXTENDS the app id", () => {
|
|
76
|
+
// Debug/release variants differing by applicationIdSuffix are normal.
|
|
77
|
+
expect(isOwned(line({
|
|
78
|
+
pid: 660,
|
|
79
|
+
tag: "ActivityManager",
|
|
80
|
+
level: "error",
|
|
81
|
+
message: "ANR in com.rndebuggertestapp.debug",
|
|
82
|
+
}), APP)).toEqual({ owned: false });
|
|
83
|
+
});
|
|
84
|
+
it("rejects a parent package when the app id is the longer one", () => {
|
|
85
|
+
expect(isOwned(line({
|
|
86
|
+
pid: 660,
|
|
87
|
+
tag: "ActivityManager",
|
|
88
|
+
level: "error",
|
|
89
|
+
message: "ANR in com.rndebuggertestapp",
|
|
90
|
+
}), { ...APP, appId: "com.rndebuggertestapp.debug" })).toEqual({ owned: false });
|
|
91
|
+
});
|
|
92
|
+
it("still owns an exact package match at end of message", () => {
|
|
93
|
+
expect(isOwned(line({
|
|
94
|
+
pid: 660,
|
|
95
|
+
tag: "ActivityManager",
|
|
96
|
+
level: "error",
|
|
97
|
+
message: "ANR in com.rndebuggertestapp",
|
|
98
|
+
}), APP)).toEqual({ owned: true, reason: "verdict" });
|
|
99
|
+
});
|
|
100
|
+
it("rejects a ReactNativeJS line from the app's own LIVE PID", () => {
|
|
101
|
+
// React Native mirrors console.* into logcat under this tag. It is
|
|
102
|
+
// already in the CDP console buffer, so owning it here would
|
|
103
|
+
// double-report under source:"all" — the pid match alone (rule 2)
|
|
104
|
+
// would otherwise happily claim it.
|
|
105
|
+
expect(isOwned(line({
|
|
106
|
+
pid: 23325,
|
|
107
|
+
tag: "ReactNativeJS",
|
|
108
|
+
message: "[TapTargetsScreen] Tapped: submit-btn",
|
|
109
|
+
}), APP)).toEqual({ owned: false });
|
|
110
|
+
});
|
|
111
|
+
it("still owns a non-mirrored tag from that same live pid", () => {
|
|
112
|
+
// Confirms the denylist targets the TAG, not the pid generally —
|
|
113
|
+
// ordinary native output from the same process is unaffected.
|
|
114
|
+
expect(isOwned(line({ pid: 23325, tag: "ReactNative" }), APP))
|
|
115
|
+
.toEqual({ owned: true, reason: "pid" });
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
//# sourceMappingURL=logOwnership.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logOwnership.test.js","sourceRoot":"","sources":["../../../src/__tests__/unit/logOwnership.test.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,oEAAoE;AAEpE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAGrD,MAAM,GAAG,GAAgB;IACrB,SAAS,EAAE,eAAe;IAC1B,QAAQ,EAAE,SAAS;IACnB,KAAK,EAAE,uBAAuB;IAC9B,GAAG,EAAE,KAAK;CACb,CAAC;AAEF,SAAS,IAAI,CAAC,IAAyB;IACnC,OAAO;QACH,EAAE,EAAE,IAAI,IAAI,CAAC,0BAA0B,CAAC;QACxC,KAAK,EAAE,MAAM;QACb,GAAG,EAAE,CAAC;QACN,GAAG,EAAE,SAAS;QACd,OAAO,EAAE,EAAE;QACX,GAAG,EAAE,EAAE;QACP,GAAG,IAAI;KACV,CAAC;AACN,CAAC;AAED,QAAQ,CAAC,SAAS,EAAE,GAAG,EAAE;IACrB,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QACxE,iEAAiE;QACjE,mEAAmE;QACnE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YACnB,GAAG,EAAE,KAAK;YACV,GAAG,EAAE,OAAO;YACZ,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,uBAAuB;YAChC,OAAO,EAAE,sDAAsD;SAClE,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;QAChC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;aACzD,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;YAChB,GAAG,EAAE,GAAG;YACR,GAAG,EAAE,iBAAiB;YACtB,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,8BAA8B;SAC1C,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QACxE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;YAChB,GAAG,EAAE,GAAG;YACR,GAAG,EAAE,MAAM;YACX,OAAO,EAAE,qFAAqF;SACjG,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;YAChB,GAAG,EAAE,GAAG;YACR,GAAG,EAAE,cAAc;YACnB,OAAO,EAAE,iGAAiG;SAC7G,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAChE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;YAChB,GAAG,EAAE,KAAK;YACV,GAAG,EAAE,gBAAgB;YACrB,OAAO,EAAE,qFAAqF;SACjG,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACjE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;YAChB,GAAG,EAAE,GAAG;YACR,GAAG,EAAE,iBAAiB;YACtB,OAAO,EAAE,0CAA0C;SACtD,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAChE,sEAAsE;QACtE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;YAChB,GAAG,EAAE,GAAG;YACR,GAAG,EAAE,iBAAiB;YACtB,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,oCAAoC;SAChD,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QAClE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;YAChB,GAAG,EAAE,GAAG;YACR,GAAG,EAAE,iBAAiB;YACtB,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,8BAA8B;SAC1C,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,KAAK,EAAE,6BAA6B,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;YAChB,GAAG,EAAE,GAAG;YACR,GAAG,EAAE,iBAAiB;YACtB,KAAK,EAAE,OAAO;YACd,OAAO,EAAE,8BAA8B;SAC1C,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAChE,mEAAmE;QACnE,6DAA6D;QAC7D,kEAAkE;QAClE,oCAAoC;QACpC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;YAChB,GAAG,EAAE,KAAK;YACV,GAAG,EAAE,eAAe;YACpB,OAAO,EAAE,uCAAuC;SACnD,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uDAAuD,EAAE,GAAG,EAAE;QAC7D,iEAAiE;QACjE,8DAA8D;QAC9D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;aACzD,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logRelevance.test.d.ts","sourceRoot":"","sources":["../../../src/__tests__/unit/logRelevance.test.ts"],"names":[],"mappings":""}
|