@bugpulse/react-native 0.1.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 +185 -0
- package/dist/AnnotationCanvas.d.ts +11 -0
- package/dist/AnnotationCanvas.d.ts.map +1 -0
- package/dist/AnnotationCanvas.js +154 -0
- package/dist/AnnotationCanvas.js.map +1 -0
- package/dist/BugReportModal.d.ts +15 -0
- package/dist/BugReportModal.d.ts.map +1 -0
- package/dist/BugReportModal.js +303 -0
- package/dist/BugReportModal.js.map +1 -0
- package/dist/BugReportProvider.d.ts +19 -0
- package/dist/BugReportProvider.d.ts.map +1 -0
- package/dist/BugReportProvider.js +103 -0
- package/dist/BugReportProvider.js.map +1 -0
- package/dist/DeviceInfo.d.ts +3 -0
- package/dist/DeviceInfo.d.ts.map +1 -0
- package/dist/DeviceInfo.js +63 -0
- package/dist/DeviceInfo.js.map +1 -0
- package/dist/ErrorBoundary.d.ts +19 -0
- package/dist/ErrorBoundary.d.ts.map +1 -0
- package/dist/ErrorBoundary.js +79 -0
- package/dist/ErrorBoundary.js.map +1 -0
- package/dist/NavigationTracker.d.ts +7 -0
- package/dist/NavigationTracker.d.ts.map +1 -0
- package/dist/NavigationTracker.js +61 -0
- package/dist/NavigationTracker.js.map +1 -0
- package/dist/RingBuffer.d.ts +10 -0
- package/dist/RingBuffer.d.ts.map +1 -0
- package/dist/RingBuffer.js +26 -0
- package/dist/RingBuffer.js.map +1 -0
- package/dist/ScreenCapture.d.ts +3 -0
- package/dist/ScreenCapture.d.ts.map +1 -0
- package/dist/ScreenCapture.js +20 -0
- package/dist/ScreenCapture.js.map +1 -0
- package/dist/ShakeDetector.d.ts +5 -0
- package/dist/ShakeDetector.d.ts.map +1 -0
- package/dist/ShakeDetector.js +44 -0
- package/dist/ShakeDetector.js.map +1 -0
- package/dist/StateCapture.d.ts +13 -0
- package/dist/StateCapture.d.ts.map +1 -0
- package/dist/StateCapture.js +74 -0
- package/dist/StateCapture.js.map +1 -0
- package/dist/__tests__/DeviceInfo.test.d.ts +2 -0
- package/dist/__tests__/DeviceInfo.test.d.ts.map +1 -0
- package/dist/__tests__/DeviceInfo.test.js +63 -0
- package/dist/__tests__/DeviceInfo.test.js.map +1 -0
- package/dist/__tests__/ErrorBoundary.test.d.ts +2 -0
- package/dist/__tests__/ErrorBoundary.test.d.ts.map +1 -0
- package/dist/__tests__/ErrorBoundary.test.js +64 -0
- package/dist/__tests__/ErrorBoundary.test.js.map +1 -0
- package/dist/__tests__/NavigationTracker.test.d.ts +2 -0
- package/dist/__tests__/NavigationTracker.test.d.ts.map +1 -0
- package/dist/__tests__/NavigationTracker.test.js +54 -0
- package/dist/__tests__/NavigationTracker.test.js.map +1 -0
- package/dist/__tests__/RingBuffer.test.d.ts +2 -0
- package/dist/__tests__/RingBuffer.test.d.ts.map +1 -0
- package/dist/__tests__/RingBuffer.test.js +43 -0
- package/dist/__tests__/RingBuffer.test.js.map +1 -0
- package/dist/__tests__/ScreenCapture.test.d.ts +2 -0
- package/dist/__tests__/ScreenCapture.test.d.ts.map +1 -0
- package/dist/__tests__/ScreenCapture.test.js +27 -0
- package/dist/__tests__/ScreenCapture.test.js.map +1 -0
- package/dist/__tests__/ShakeDetector.test.d.ts +2 -0
- package/dist/__tests__/ShakeDetector.test.d.ts.map +1 -0
- package/dist/__tests__/ShakeDetector.test.js +65 -0
- package/dist/__tests__/ShakeDetector.test.js.map +1 -0
- package/dist/__tests__/StateCapture.test.d.ts +2 -0
- package/dist/__tests__/StateCapture.test.d.ts.map +1 -0
- package/dist/__tests__/StateCapture.test.js +128 -0
- package/dist/__tests__/StateCapture.test.js.map +1 -0
- package/dist/__tests__/__mocks__/expo-clipboard.d.ts +3 -0
- package/dist/__tests__/__mocks__/expo-clipboard.d.ts.map +1 -0
- package/dist/__tests__/__mocks__/expo-clipboard.js +6 -0
- package/dist/__tests__/__mocks__/expo-clipboard.js.map +1 -0
- package/dist/__tests__/__mocks__/expo-constants.d.ts +17 -0
- package/dist/__tests__/__mocks__/expo-constants.d.ts.map +1 -0
- package/dist/__tests__/__mocks__/expo-constants.js +8 -0
- package/dist/__tests__/__mocks__/expo-constants.js.map +1 -0
- package/dist/__tests__/__mocks__/expo-device.d.ts +2 -0
- package/dist/__tests__/__mocks__/expo-device.d.ts.map +1 -0
- package/dist/__tests__/__mocks__/expo-device.js +5 -0
- package/dist/__tests__/__mocks__/expo-device.js.map +1 -0
- package/dist/__tests__/__mocks__/expo-file-system-legacy.d.ts +8 -0
- package/dist/__tests__/__mocks__/expo-file-system-legacy.d.ts.map +1 -0
- package/dist/__tests__/__mocks__/expo-file-system-legacy.js +10 -0
- package/dist/__tests__/__mocks__/expo-file-system-legacy.js.map +1 -0
- package/dist/__tests__/__mocks__/expo-localization.d.ts +6 -0
- package/dist/__tests__/__mocks__/expo-localization.d.ts.map +1 -0
- package/dist/__tests__/__mocks__/expo-localization.js +7 -0
- package/dist/__tests__/__mocks__/expo-localization.js.map +1 -0
- package/dist/__tests__/__mocks__/expo-router.d.ts +5 -0
- package/dist/__tests__/__mocks__/expo-router.d.ts.map +1 -0
- package/dist/__tests__/__mocks__/expo-router.js +16 -0
- package/dist/__tests__/__mocks__/expo-router.js.map +1 -0
- package/dist/__tests__/__mocks__/expo-sensors.d.ts +17 -0
- package/dist/__tests__/__mocks__/expo-sensors.d.ts.map +1 -0
- package/dist/__tests__/__mocks__/expo-sensors.js +22 -0
- package/dist/__tests__/__mocks__/expo-sensors.js.map +1 -0
- package/dist/__tests__/__mocks__/react-native-gesture-handler.d.ts +11 -0
- package/dist/__tests__/__mocks__/react-native-gesture-handler.d.ts.map +1 -0
- package/dist/__tests__/__mocks__/react-native-gesture-handler.js +14 -0
- package/dist/__tests__/__mocks__/react-native-gesture-handler.js.map +1 -0
- package/dist/__tests__/__mocks__/react-native-svg.d.ts +4 -0
- package/dist/__tests__/__mocks__/react-native-svg.d.ts.map +1 -0
- package/dist/__tests__/__mocks__/react-native-svg.js +7 -0
- package/dist/__tests__/__mocks__/react-native-svg.js.map +1 -0
- package/dist/__tests__/__mocks__/react-native-view-shot.d.ts +2 -0
- package/dist/__tests__/__mocks__/react-native-view-shot.d.ts.map +1 -0
- package/dist/__tests__/__mocks__/react-native-view-shot.js +5 -0
- package/dist/__tests__/__mocks__/react-native-view-shot.js.map +1 -0
- package/dist/__tests__/__mocks__/react-native.d.ts +20 -0
- package/dist/__tests__/__mocks__/react-native.d.ts.map +1 -0
- package/dist/__tests__/__mocks__/react-native.js +14 -0
- package/dist/__tests__/__mocks__/react-native.js.map +1 -0
- package/dist/__tests__/fileToBase64.test.d.ts +2 -0
- package/dist/__tests__/fileToBase64.test.d.ts.map +1 -0
- package/dist/__tests__/fileToBase64.test.js +21 -0
- package/dist/__tests__/fileToBase64.test.js.map +1 -0
- package/dist/__tests__/integrations/slack.test.d.ts +2 -0
- package/dist/__tests__/integrations/slack.test.d.ts.map +1 -0
- package/dist/__tests__/integrations/slack.test.js +123 -0
- package/dist/__tests__/integrations/slack.test.js.map +1 -0
- package/dist/__tests__/integrations/webhook.test.d.ts +2 -0
- package/dist/__tests__/integrations/webhook.test.d.ts.map +1 -0
- package/dist/__tests__/integrations/webhook.test.js +98 -0
- package/dist/__tests__/integrations/webhook.test.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/index.d.ts +4 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +8 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/integrations/slack.d.ts +9 -0
- package/dist/integrations/slack.d.ts.map +1 -0
- package/dist/integrations/slack.js +136 -0
- package/dist/integrations/slack.js.map +1 -0
- package/dist/integrations/types.d.ts +53 -0
- package/dist/integrations/types.d.ts.map +1 -0
- package/dist/integrations/types.js +3 -0
- package/dist/integrations/types.js.map +1 -0
- package/dist/integrations/webhook.d.ts +8 -0
- package/dist/integrations/webhook.d.ts.map +1 -0
- package/dist/integrations/webhook.js +45 -0
- package/dist/integrations/webhook.js.map +1 -0
- package/dist/utils/fileToBase64.d.ts +2 -0
- package/dist/utils/fileToBase64.d.ts.map +1 -0
- package/dist/utils/fileToBase64.js +11 -0
- package/dist/utils/fileToBase64.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NavigationTracker.d.ts","sourceRoot":"","sources":["../src/NavigationTracker.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAQrD,wBAAgB,oBAAoB,IAAI,IAAI,CA4B3C;AAED,wBAAgB,gBAAgB,IAAI,IAAI,CAWvC;AAED,wBAAgB,aAAa,IAAI,QAAQ,EAAE,CAE1C;AAED,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED,wBAAgB,eAAe,IAAI,IAAI,CAGtC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useNavigationTracker = useNavigationTracker;
|
|
4
|
+
exports.freezeNavHistory = freezeNavHistory;
|
|
5
|
+
exports.getNavHistory = getNavHistory;
|
|
6
|
+
exports.clearNavHistory = clearNavHistory;
|
|
7
|
+
exports.resetNavTracker = resetNavTracker;
|
|
8
|
+
const react_1 = require("react");
|
|
9
|
+
const RingBuffer_1 = require("./RingBuffer");
|
|
10
|
+
const MAX_ENTRIES = 10;
|
|
11
|
+
const MAX_TOTAL_BYTES = 20 * 1024; // 20KB
|
|
12
|
+
const navBuffer = new RingBuffer_1.RingBuffer(MAX_ENTRIES);
|
|
13
|
+
let frozenHistory = null;
|
|
14
|
+
function useNavigationTracker() {
|
|
15
|
+
let usePathname;
|
|
16
|
+
let useSegments;
|
|
17
|
+
try {
|
|
18
|
+
// Optional import — graceful when expo-router is not installed
|
|
19
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
20
|
+
const expoRouter = require('expo-router');
|
|
21
|
+
usePathname = expoRouter.usePathname;
|
|
22
|
+
useSegments = expoRouter.useSegments;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
// expo-router not available — no-op
|
|
26
|
+
}
|
|
27
|
+
const pathname = usePathname?.() ?? null;
|
|
28
|
+
const segments = useSegments?.() ?? null;
|
|
29
|
+
const lastPathname = (0, react_1.useRef)(null);
|
|
30
|
+
(0, react_1.useEffect)(() => {
|
|
31
|
+
if (pathname === null || pathname === lastPathname.current)
|
|
32
|
+
return;
|
|
33
|
+
lastPathname.current = pathname;
|
|
34
|
+
navBuffer.push({
|
|
35
|
+
pathname,
|
|
36
|
+
segments: segments ?? [],
|
|
37
|
+
timestamp: new Date().toISOString(),
|
|
38
|
+
});
|
|
39
|
+
}, [pathname, segments]);
|
|
40
|
+
}
|
|
41
|
+
function freezeNavHistory() {
|
|
42
|
+
let entries = navBuffer.getAll();
|
|
43
|
+
// Enforce 20KB total cap — drop oldest entries until under limit
|
|
44
|
+
let totalBytes = JSON.stringify(entries).length;
|
|
45
|
+
while (totalBytes > MAX_TOTAL_BYTES && entries.length > 1) {
|
|
46
|
+
entries = entries.slice(1);
|
|
47
|
+
totalBytes = JSON.stringify(entries).length;
|
|
48
|
+
}
|
|
49
|
+
frozenHistory = entries;
|
|
50
|
+
}
|
|
51
|
+
function getNavHistory() {
|
|
52
|
+
return frozenHistory ?? [];
|
|
53
|
+
}
|
|
54
|
+
function clearNavHistory() {
|
|
55
|
+
frozenHistory = null;
|
|
56
|
+
}
|
|
57
|
+
function resetNavTracker() {
|
|
58
|
+
navBuffer.clear();
|
|
59
|
+
frozenHistory = null;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=NavigationTracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NavigationTracker.js","sourceRoot":"","sources":["../src/NavigationTracker.ts"],"names":[],"mappings":";;AAUA,oDA4BC;AAED,4CAWC;AAED,sCAEC;AAED,0CAEC;AAED,0CAGC;AAhED,iCAA0C;AAC1C,6CAA0C;AAG1C,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,eAAe,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO;AAE1C,MAAM,SAAS,GAAG,IAAI,uBAAU,CAAW,WAAW,CAAC,CAAC;AACxD,IAAI,aAAa,GAAsB,IAAI,CAAC;AAE5C,SAAgB,oBAAoB;IAClC,IAAI,WAAuC,CAAC;IAC5C,IAAI,WAAyC,CAAC;IAE9C,IAAI,CAAC;QACH,+DAA+D;QAC/D,8DAA8D;QAC9D,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;QAC1C,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC;QACrC,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,oCAAoC;IACtC,CAAC;IAED,MAAM,QAAQ,GAAG,WAAW,EAAE,EAAE,IAAI,IAAI,CAAC;IACzC,MAAM,QAAQ,GAAG,WAAW,EAAE,EAAE,IAAI,IAAI,CAAC;IACzC,MAAM,YAAY,GAAG,IAAA,cAAM,EAAgB,IAAI,CAAC,CAAC;IAEjD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,YAAY,CAAC,OAAO;YAAE,OAAO;QACnE,YAAY,CAAC,OAAO,GAAG,QAAQ,CAAC;QAEhC,SAAS,CAAC,IAAI,CAAC;YACb,QAAQ;YACR,QAAQ,EAAE,QAAQ,IAAI,EAAE;YACxB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC3B,CAAC;AAED,SAAgB,gBAAgB;IAC9B,IAAI,OAAO,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;IAEjC,iEAAiE;IACjE,IAAI,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAChD,OAAO,UAAU,GAAG,eAAe,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1D,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC3B,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IAC9C,CAAC;IAED,aAAa,GAAG,OAAO,CAAC;AAC1B,CAAC;AAED,SAAgB,aAAa;IAC3B,OAAO,aAAa,IAAI,EAAE,CAAC;AAC7B,CAAC;AAED,SAAgB,eAAe;IAC7B,aAAa,GAAG,IAAI,CAAC;AACvB,CAAC;AAED,SAAgB,eAAe;IAC7B,SAAS,CAAC,KAAK,EAAE,CAAC;IAClB,aAAa,GAAG,IAAI,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RingBuffer.d.ts","sourceRoot":"","sources":["../src/RingBuffer.ts"],"names":[],"mappings":"AAAA,qBAAa,UAAU,CAAC,CAAC;IACvB,OAAO,CAAC,MAAM,CAAW;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,EAAE,MAAM;IAI3B,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAOnB,MAAM,IAAI,CAAC,EAAE;IAIb,KAAK,IAAI,IAAI;IAIb,IAAI,MAAM,IAAI,MAAM,CAEnB;CACF"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RingBuffer = void 0;
|
|
4
|
+
class RingBuffer {
|
|
5
|
+
constructor(maxSize) {
|
|
6
|
+
this.buffer = [];
|
|
7
|
+
this.maxSize = maxSize;
|
|
8
|
+
}
|
|
9
|
+
push(item) {
|
|
10
|
+
if (this.buffer.length >= this.maxSize) {
|
|
11
|
+
this.buffer.shift();
|
|
12
|
+
}
|
|
13
|
+
this.buffer.push(item);
|
|
14
|
+
}
|
|
15
|
+
getAll() {
|
|
16
|
+
return [...this.buffer];
|
|
17
|
+
}
|
|
18
|
+
clear() {
|
|
19
|
+
this.buffer = [];
|
|
20
|
+
}
|
|
21
|
+
get length() {
|
|
22
|
+
return this.buffer.length;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.RingBuffer = RingBuffer;
|
|
26
|
+
//# sourceMappingURL=RingBuffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RingBuffer.js","sourceRoot":"","sources":["../src/RingBuffer.ts"],"names":[],"mappings":";;;AAAA,MAAa,UAAU;IAIrB,YAAY,OAAe;QAHnB,WAAM,GAAQ,EAAE,CAAC;QAIvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;IAED,IAAI,CAAC,IAAO;QACV,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YACvC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzB,CAAC;IAED,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;IACnB,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;IAC5B,CAAC;CACF;AA1BD,gCA0BC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScreenCapture.d.ts","sourceRoot":"","sources":["../src/ScreenCapture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAKvC,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,GAC1B,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAYxB"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.captureScreenshot = captureScreenshot;
|
|
4
|
+
const react_native_view_shot_1 = require("react-native-view-shot");
|
|
5
|
+
const CAPTURE_WIDTH = 720;
|
|
6
|
+
async function captureScreenshot(viewRef) {
|
|
7
|
+
try {
|
|
8
|
+
const uri = await (0, react_native_view_shot_1.captureRef)(viewRef, {
|
|
9
|
+
format: 'png',
|
|
10
|
+
quality: 0.8,
|
|
11
|
+
width: CAPTURE_WIDTH,
|
|
12
|
+
result: 'tmpfile',
|
|
13
|
+
});
|
|
14
|
+
return uri;
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=ScreenCapture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScreenCapture.js","sourceRoot":"","sources":["../src/ScreenCapture.ts"],"names":[],"mappings":";;AAKA,8CAcC;AAlBD,mEAAoD;AAEpD,MAAM,aAAa,GAAG,GAAG,CAAC;AAEnB,KAAK,UAAU,iBAAiB,CACrC,OAA2B;IAE3B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,IAAA,mCAAU,EAAC,OAAO,EAAE;YACpC,MAAM,EAAE,KAAK;YACb,OAAO,EAAE,GAAG;YACZ,KAAK,EAAE,aAAa;YACpB,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;QACH,OAAO,GAAG,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShakeDetector.d.ts","sourceRoot":"","sources":["../src/ShakeDetector.ts"],"names":[],"mappings":"AASA,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,IAAI,EACnB,OAAO,CAAC,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,GAClD,IAAI,CAwCN"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.useShakeDetector = useShakeDetector;
|
|
4
|
+
const react_1 = require("react");
|
|
5
|
+
const expo_sensors_1 = require("expo-sensors");
|
|
6
|
+
const DEFAULT_THRESHOLD = 1.8;
|
|
7
|
+
const SHAKE_COUNT_REQUIRED = 3;
|
|
8
|
+
const SHAKE_WINDOW_MS = 800;
|
|
9
|
+
const COOLDOWN_MS = 3000;
|
|
10
|
+
const UPDATE_INTERVAL_MS = 100;
|
|
11
|
+
function useShakeDetector(onShake, options) {
|
|
12
|
+
const onShakeRef = (0, react_1.useRef)(onShake);
|
|
13
|
+
const threshold = options?.threshold ?? DEFAULT_THRESHOLD;
|
|
14
|
+
const enabled = options?.enabled ?? true;
|
|
15
|
+
(0, react_1.useEffect)(() => {
|
|
16
|
+
onShakeRef.current = onShake;
|
|
17
|
+
}, [onShake]);
|
|
18
|
+
(0, react_1.useEffect)(() => {
|
|
19
|
+
if (!enabled)
|
|
20
|
+
return;
|
|
21
|
+
let shakeTimestamps = [];
|
|
22
|
+
let lastShakeTime = 0;
|
|
23
|
+
expo_sensors_1.Accelerometer.setUpdateInterval(UPDATE_INTERVAL_MS);
|
|
24
|
+
const subscription = expo_sensors_1.Accelerometer.addListener(({ x, y, z }) => {
|
|
25
|
+
const totalForce = Math.sqrt(x * x + y * y + z * z);
|
|
26
|
+
if (totalForce < threshold)
|
|
27
|
+
return;
|
|
28
|
+
const now = Date.now();
|
|
29
|
+
if (now - lastShakeTime < COOLDOWN_MS)
|
|
30
|
+
return;
|
|
31
|
+
shakeTimestamps.push(now);
|
|
32
|
+
shakeTimestamps = shakeTimestamps.filter((ts) => now - ts < SHAKE_WINDOW_MS);
|
|
33
|
+
if (shakeTimestamps.length >= SHAKE_COUNT_REQUIRED) {
|
|
34
|
+
lastShakeTime = now;
|
|
35
|
+
shakeTimestamps = [];
|
|
36
|
+
onShakeRef.current();
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
return () => {
|
|
40
|
+
subscription.remove();
|
|
41
|
+
};
|
|
42
|
+
}, [threshold, enabled]);
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=ShakeDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ShakeDetector.js","sourceRoot":"","sources":["../src/ShakeDetector.ts"],"names":[],"mappings":";;AASA,4CA2CC;AApDD,iCAA0C;AAC1C,+CAA6C;AAE7C,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAC9B,MAAM,oBAAoB,GAAG,CAAC,CAAC;AAC/B,MAAM,eAAe,GAAG,GAAG,CAAC;AAC5B,MAAM,WAAW,GAAG,IAAI,CAAC;AACzB,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAE/B,SAAgB,gBAAgB,CAC9B,OAAmB,EACnB,OAAmD;IAEnD,MAAM,UAAU,GAAG,IAAA,cAAM,EAAC,OAAO,CAAC,CAAC;IACnC,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,iBAAiB,CAAC;IAC1D,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC;IAEzC,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,UAAU,CAAC,OAAO,GAAG,OAAO,CAAC;IAC/B,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEd,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,CAAC,OAAO;YAAE,OAAO;QAErB,IAAI,eAAe,GAAa,EAAE,CAAC;QACnC,IAAI,aAAa,GAAG,CAAC,CAAC;QAEtB,4BAAa,CAAC,iBAAiB,CAAC,kBAAkB,CAAC,CAAC;QAEpD,MAAM,YAAY,GAAG,4BAAa,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE;YAC7D,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YACpD,IAAI,UAAU,GAAG,SAAS;gBAAE,OAAO;YAEnC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACvB,IAAI,GAAG,GAAG,aAAa,GAAG,WAAW;gBAAE,OAAO;YAE9C,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAC1B,eAAe,GAAG,eAAe,CAAC,MAAM,CACtC,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,GAAG,eAAe,CACnC,CAAC;YAEF,IAAI,eAAe,CAAC,MAAM,IAAI,oBAAoB,EAAE,CAAC;gBACnD,aAAa,GAAG,GAAG,CAAC;gBACpB,eAAe,GAAG,EAAE,CAAC;gBACrB,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,MAAM,EAAE,CAAC;QACxB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;AAC3B,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { StateSnapshot } from './integrations/types';
|
|
2
|
+
export declare function trackStore(store: {
|
|
3
|
+
subscribe: (listener: () => void) => () => void;
|
|
4
|
+
getState: () => unknown;
|
|
5
|
+
}, options: {
|
|
6
|
+
name: string;
|
|
7
|
+
}): void;
|
|
8
|
+
export declare function untrackStore(name: string): void;
|
|
9
|
+
export declare function freezeStateSnapshot(): void;
|
|
10
|
+
export declare function getStateSnapshot(): StateSnapshot[];
|
|
11
|
+
export declare function clearStateCapture(): void;
|
|
12
|
+
export declare function resetAllStores(): void;
|
|
13
|
+
//# sourceMappingURL=StateCapture.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StateCapture.d.ts","sourceRoot":"","sources":["../src/StateCapture.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAgC1D,wBAAgB,UAAU,CACxB,KAAK,EAAE;IAAE,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;IAAC,QAAQ,EAAE,MAAM,OAAO,CAAA;CAAE,EACnF,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GACxB,IAAI,CAkBN;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAM/C;AAED,wBAAgB,mBAAmB,IAAI,IAAI,CAO1C;AAED,wBAAgB,gBAAgB,IAAI,aAAa,EAAE,CAElD;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED,wBAAgB,cAAc,IAAI,IAAI,CAMrC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.trackStore = trackStore;
|
|
4
|
+
exports.untrackStore = untrackStore;
|
|
5
|
+
exports.freezeStateSnapshot = freezeStateSnapshot;
|
|
6
|
+
exports.getStateSnapshot = getStateSnapshot;
|
|
7
|
+
exports.clearStateCapture = clearStateCapture;
|
|
8
|
+
exports.resetAllStores = resetAllStores;
|
|
9
|
+
const RingBuffer_1 = require("./RingBuffer");
|
|
10
|
+
const MAX_ENTRIES = 10;
|
|
11
|
+
const MAX_SNAPSHOT_BYTES = 50 * 1024; // 50KB
|
|
12
|
+
const TRUNCATED_MARKER = '"[TRUNCATED]"';
|
|
13
|
+
const stores = new Map();
|
|
14
|
+
let frozenSnapshot = null;
|
|
15
|
+
function serializeState(state) {
|
|
16
|
+
let json;
|
|
17
|
+
try {
|
|
18
|
+
json = JSON.stringify(state);
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
console.warn('[expo-bug-report] Failed to serialize state (circular reference?). Skipping snapshot.');
|
|
22
|
+
return { json: TRUNCATED_MARKER, truncated: true };
|
|
23
|
+
}
|
|
24
|
+
if (json.length > MAX_SNAPSHOT_BYTES) {
|
|
25
|
+
// Truncate to valid JSON by wrapping in a string marker rather than slicing mid-JSON
|
|
26
|
+
return { json: JSON.stringify('[STATE TOO LARGE - ' + json.length + ' bytes]'), truncated: true };
|
|
27
|
+
}
|
|
28
|
+
return { json, truncated: false };
|
|
29
|
+
}
|
|
30
|
+
function trackStore(store, options) {
|
|
31
|
+
if (stores.has(options.name)) {
|
|
32
|
+
untrackStore(options.name);
|
|
33
|
+
}
|
|
34
|
+
const buffer = new RingBuffer_1.RingBuffer(MAX_ENTRIES);
|
|
35
|
+
const unsubscribe = store.subscribe(() => {
|
|
36
|
+
const { json, truncated } = serializeState(store.getState());
|
|
37
|
+
buffer.push({
|
|
38
|
+
name: options.name,
|
|
39
|
+
state: json,
|
|
40
|
+
timestamp: new Date().toISOString(),
|
|
41
|
+
truncated,
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
stores.set(options.name, { name: options.name, buffer, unsubscribe });
|
|
45
|
+
}
|
|
46
|
+
function untrackStore(name) {
|
|
47
|
+
const tracked = stores.get(name);
|
|
48
|
+
if (tracked) {
|
|
49
|
+
tracked.unsubscribe();
|
|
50
|
+
stores.delete(name);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function freezeStateSnapshot() {
|
|
54
|
+
const allSnapshots = [];
|
|
55
|
+
for (const tracked of stores.values()) {
|
|
56
|
+
allSnapshots.push(...tracked.buffer.getAll());
|
|
57
|
+
}
|
|
58
|
+
allSnapshots.sort((a, b) => a.timestamp.localeCompare(b.timestamp));
|
|
59
|
+
frozenSnapshot = allSnapshots;
|
|
60
|
+
}
|
|
61
|
+
function getStateSnapshot() {
|
|
62
|
+
return frozenSnapshot ?? [];
|
|
63
|
+
}
|
|
64
|
+
function clearStateCapture() {
|
|
65
|
+
frozenSnapshot = null;
|
|
66
|
+
}
|
|
67
|
+
function resetAllStores() {
|
|
68
|
+
for (const tracked of stores.values()) {
|
|
69
|
+
tracked.unsubscribe();
|
|
70
|
+
}
|
|
71
|
+
stores.clear();
|
|
72
|
+
frozenSnapshot = null;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=StateCapture.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StateCapture.js","sourceRoot":"","sources":["../src/StateCapture.ts"],"names":[],"mappings":";;AAiCA,gCAqBC;AAED,oCAMC;AAED,kDAOC;AAED,4CAEC;AAED,8CAEC;AAED,wCAMC;AAvFD,6CAA0C;AAG1C,MAAM,WAAW,GAAG,EAAE,CAAC;AACvB,MAAM,kBAAkB,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO;AAC7C,MAAM,gBAAgB,GAAG,eAAe,CAAC;AAQzC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAC;AAC/C,IAAI,cAAc,GAA2B,IAAI,CAAC;AAElD,SAAS,cAAc,CAAC,KAAc;IACpC,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,uFAAuF,CAAC,CAAC;QACtG,OAAO,EAAE,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACrD,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACrC,qFAAqF;QACrF,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,qBAAqB,GAAG,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACpG,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;AACpC,CAAC;AAED,SAAgB,UAAU,CACxB,KAAmF,EACnF,OAAyB;IAEzB,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC7B,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,uBAAU,CAAgB,WAAW,CAAC,CAAC;IAE1D,MAAM,WAAW,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACvC,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7D,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,KAAK,EAAE,IAAI;YACX,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,SAAS;SACV,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,SAAgB,YAAY,CAAC,IAAY;IACvC,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjC,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,WAAW,EAAE,CAAC;QACtB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,SAAgB,mBAAmB;IACjC,MAAM,YAAY,GAAoB,EAAE,CAAC;IACzC,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QACtC,YAAY,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAChD,CAAC;IACD,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IACpE,cAAc,GAAG,YAAY,CAAC;AAChC,CAAC;AAED,SAAgB,gBAAgB;IAC9B,OAAO,cAAc,IAAI,EAAE,CAAC;AAC9B,CAAC;AAED,SAAgB,iBAAiB;IAC/B,cAAc,GAAG,IAAI,CAAC;AACxB,CAAC;AAED,SAAgB,cAAc;IAC5B,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,MAAM,EAAE,EAAE,CAAC;QACtC,OAAO,CAAC,WAAW,EAAE,CAAC;IACxB,CAAC;IACD,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,cAAc,GAAG,IAAI,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeviceInfo.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/DeviceInfo.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const DeviceInfo_1 = require("../DeviceInfo");
|
|
37
|
+
const expo_localization_1 = require("expo-localization");
|
|
38
|
+
const Device = __importStar(require("expo-device"));
|
|
39
|
+
describe('collectDeviceInfo', () => {
|
|
40
|
+
it('returns all device fields populated', () => {
|
|
41
|
+
const info = (0, DeviceInfo_1.collectDeviceInfo)();
|
|
42
|
+
expect(info.model).toBe('iPhone 15 Pro');
|
|
43
|
+
expect(info.os).toBe('ios 17.0');
|
|
44
|
+
expect(info.appVersion).toBe('1.0.0');
|
|
45
|
+
expect(info.screenSize).toBe('390x844');
|
|
46
|
+
expect(info.locale).toBe('en-US');
|
|
47
|
+
expect(info.installationId).toBe('test-installation-id');
|
|
48
|
+
expect(info.expoConfig).toEqual({ name: 'TestApp', slug: 'test-app' });
|
|
49
|
+
});
|
|
50
|
+
it('falls back when modelName is null', () => {
|
|
51
|
+
const original = Device.modelName;
|
|
52
|
+
Device.modelName = null;
|
|
53
|
+
const info = (0, DeviceInfo_1.collectDeviceInfo)();
|
|
54
|
+
expect(info.model).toBe('ios device');
|
|
55
|
+
Device.modelName = original;
|
|
56
|
+
});
|
|
57
|
+
it('falls back when locales return empty languageTag', () => {
|
|
58
|
+
expo_localization_1.getLocales.mockReturnValueOnce([{ languageTag: undefined }]);
|
|
59
|
+
const info = (0, DeviceInfo_1.collectDeviceInfo)();
|
|
60
|
+
expect(info.locale).toBe('unknown');
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
//# sourceMappingURL=DeviceInfo.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DeviceInfo.test.js","sourceRoot":"","sources":["../../src/__tests__/DeviceInfo.test.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,8CAAkD;AAClD,yDAA+C;AAC/C,oDAAsC;AAEtC,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,IAAI,GAAG,IAAA,8BAAiB,GAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACzD,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IACzE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,QAAQ,GAAI,MAAc,CAAC,SAAS,CAAC;QAC1C,MAAc,CAAC,SAAS,GAAG,IAAI,CAAC;QACjC,MAAM,IAAI,GAAG,IAAA,8BAAiB,GAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACrC,MAAc,CAAC,SAAS,GAAG,QAAQ,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QACzD,8BAAwB,CAAC,mBAAmB,CAAC,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAC5E,MAAM,IAAI,GAAG,IAAA,8BAAiB,GAAE,CAAC;QACjC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorBoundary.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ErrorBoundary.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const react_1 = __importDefault(require("react"));
|
|
7
|
+
const react_test_renderer_1 = __importDefault(require("react-test-renderer"));
|
|
8
|
+
const react_native_1 = require("react-native");
|
|
9
|
+
const ErrorBoundary_1 = require("../ErrorBoundary");
|
|
10
|
+
function ThrowingComponent() {
|
|
11
|
+
throw new Error('Test error');
|
|
12
|
+
}
|
|
13
|
+
describe('BugPulseErrorBoundary', () => {
|
|
14
|
+
beforeEach(() => {
|
|
15
|
+
(0, ErrorBoundary_1.clearLastError)();
|
|
16
|
+
jest.spyOn(console, 'error').mockImplementation();
|
|
17
|
+
});
|
|
18
|
+
afterEach(() => {
|
|
19
|
+
console.error.mockRestore();
|
|
20
|
+
});
|
|
21
|
+
it('renders children when no error', () => {
|
|
22
|
+
const tree = react_test_renderer_1.default.create(<ErrorBoundary_1.BugPulseErrorBoundary>
|
|
23
|
+
<react_native_1.Text>Hello</react_native_1.Text>
|
|
24
|
+
</ErrorBoundary_1.BugPulseErrorBoundary>);
|
|
25
|
+
const json = tree.toJSON();
|
|
26
|
+
expect(json.children).toContain('Hello');
|
|
27
|
+
});
|
|
28
|
+
it('renders fallback on error', () => {
|
|
29
|
+
const tree = react_test_renderer_1.default.create(<ErrorBoundary_1.BugPulseErrorBoundary>
|
|
30
|
+
<ThrowingComponent />
|
|
31
|
+
</ErrorBoundary_1.BugPulseErrorBoundary>);
|
|
32
|
+
const json = tree.toJSON();
|
|
33
|
+
// Should render the fallback View > Text with "Something went wrong"
|
|
34
|
+
expect(JSON.stringify(json)).toContain('Something went wrong');
|
|
35
|
+
});
|
|
36
|
+
it('renders custom fallback on error', () => {
|
|
37
|
+
const tree = react_test_renderer_1.default.create(<ErrorBoundary_1.BugPulseErrorBoundary fallback={<react_native_1.Text>Custom fallback</react_native_1.Text>}>
|
|
38
|
+
<ThrowingComponent />
|
|
39
|
+
</ErrorBoundary_1.BugPulseErrorBoundary>);
|
|
40
|
+
const json = tree.toJSON();
|
|
41
|
+
expect(json.children).toContain('Custom fallback');
|
|
42
|
+
});
|
|
43
|
+
it('stores error info via getLastError', () => {
|
|
44
|
+
react_test_renderer_1.default.create(<ErrorBoundary_1.BugPulseErrorBoundary>
|
|
45
|
+
<ThrowingComponent />
|
|
46
|
+
</ErrorBoundary_1.BugPulseErrorBoundary>);
|
|
47
|
+
const error = (0, ErrorBoundary_1.getLastError)();
|
|
48
|
+
expect(error).not.toBeNull();
|
|
49
|
+
expect(error.message).toBe('Test error');
|
|
50
|
+
expect(error.timestamp).toBeDefined();
|
|
51
|
+
});
|
|
52
|
+
it('getLastError returns null when no errors', () => {
|
|
53
|
+
expect((0, ErrorBoundary_1.getLastError)()).toBeNull();
|
|
54
|
+
});
|
|
55
|
+
it('clearLastError resets stored error', () => {
|
|
56
|
+
react_test_renderer_1.default.create(<ErrorBoundary_1.BugPulseErrorBoundary>
|
|
57
|
+
<ThrowingComponent />
|
|
58
|
+
</ErrorBoundary_1.BugPulseErrorBoundary>);
|
|
59
|
+
expect((0, ErrorBoundary_1.getLastError)()).not.toBeNull();
|
|
60
|
+
(0, ErrorBoundary_1.clearLastError)();
|
|
61
|
+
expect((0, ErrorBoundary_1.getLastError)()).toBeNull();
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
//# sourceMappingURL=ErrorBoundary.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorBoundary.test.js","sourceRoot":"","sources":["../../src/__tests__/ErrorBoundary.test.tsx"],"names":[],"mappings":";;;;;AAAA,kDAA0B;AAC1B,8EAA2C;AAC3C,+CAAoC;AACpC,oDAAuF;AAEvF,SAAS,iBAAiB;IACxB,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;AAChC,CAAC;AAED,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,UAAU,CAAC,GAAG,EAAE;QACd,IAAA,8BAAc,GAAE,CAAC;QACjB,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACZ,OAAO,CAAC,KAAmB,CAAC,WAAW,EAAE,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,IAAI,GAAG,6BAAQ,CAAC,MAAM,CAC1B,CAAC,qCAAqB,CACpB;QAAA,CAAC,mBAAI,CAAC,KAAK,EAAE,mBAAI,CACnB;MAAA,EAAE,qCAAqB,CAAC,CACzB,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAS,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,IAAI,GAAG,6BAAQ,CAAC,MAAM,CAC1B,CAAC,qCAAqB,CACpB;QAAA,CAAC,iBAAiB,CAAC,AAAD,EACpB;MAAA,EAAE,qCAAqB,CAAC,CACzB,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAS,CAAC;QAClC,qEAAqE;QACrE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,sBAAsB,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,IAAI,GAAG,6BAAQ,CAAC,MAAM,CAC1B,CAAC,qCAAqB,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAI,CAAC,eAAe,EAAE,mBAAI,CAAC,CAAC,CAC5D;QAAA,CAAC,iBAAiB,CAAC,AAAD,EACpB;MAAA,EAAE,qCAAqB,CAAC,CACzB,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,EAAS,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,6BAAQ,CAAC,MAAM,CACb,CAAC,qCAAqB,CACpB;QAAA,CAAC,iBAAiB,CAAC,AAAD,EACpB;MAAA,EAAE,qCAAqB,CAAC,CACzB,CAAC;QAEF,MAAM,KAAK,GAAG,IAAA,4BAAY,GAAE,CAAC;QAC7B,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC7B,MAAM,CAAC,KAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1C,MAAM,CAAC,KAAM,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,CAAC,IAAA,4BAAY,GAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;QAC5C,6BAAQ,CAAC,MAAM,CACb,CAAC,qCAAqB,CACpB;QAAA,CAAC,iBAAiB,CAAC,AAAD,EACpB;MAAA,EAAE,qCAAqB,CAAC,CACzB,CAAC;QAEF,MAAM,CAAC,IAAA,4BAAY,GAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC;QACtC,IAAA,8BAAc,GAAE,CAAC;QACjB,MAAM,CAAC,IAAA,4BAAY,GAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NavigationTracker.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/NavigationTracker.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const react_native_1 = require("@testing-library/react-native");
|
|
4
|
+
const NavigationTracker_1 = require("../NavigationTracker");
|
|
5
|
+
// expo-router is already mocked via jest.config.js moduleNameMapper
|
|
6
|
+
const expo_router_1 = require("../__tests__/__mocks__/expo-router");
|
|
7
|
+
describe('NavigationTracker', () => {
|
|
8
|
+
afterEach(() => {
|
|
9
|
+
(0, NavigationTracker_1.resetNavTracker)();
|
|
10
|
+
(0, expo_router_1.__setPathname)('/');
|
|
11
|
+
(0, expo_router_1.__setSegments)([]);
|
|
12
|
+
});
|
|
13
|
+
it('records pathname changes', () => {
|
|
14
|
+
(0, expo_router_1.__setPathname)('/home');
|
|
15
|
+
(0, expo_router_1.__setSegments)(['home']);
|
|
16
|
+
(0, react_native_1.renderHook)(() => (0, NavigationTracker_1.useNavigationTracker)());
|
|
17
|
+
(0, NavigationTracker_1.freezeNavHistory)();
|
|
18
|
+
const history = (0, NavigationTracker_1.getNavHistory)();
|
|
19
|
+
expect(history).toHaveLength(1);
|
|
20
|
+
expect(history[0].pathname).toBe('/home');
|
|
21
|
+
expect(history[0].segments).toEqual(['home']);
|
|
22
|
+
});
|
|
23
|
+
it('does not record duplicate pathnames', () => {
|
|
24
|
+
(0, expo_router_1.__setPathname)('/home');
|
|
25
|
+
const { rerender } = (0, react_native_1.renderHook)(() => (0, NavigationTracker_1.useNavigationTracker)());
|
|
26
|
+
rerender({});
|
|
27
|
+
(0, NavigationTracker_1.freezeNavHistory)();
|
|
28
|
+
expect((0, NavigationTracker_1.getNavHistory)()).toHaveLength(1);
|
|
29
|
+
});
|
|
30
|
+
it('returns empty after reset', () => {
|
|
31
|
+
(0, expo_router_1.__setPathname)('/page');
|
|
32
|
+
(0, react_native_1.renderHook)(() => (0, NavigationTracker_1.useNavigationTracker)());
|
|
33
|
+
(0, NavigationTracker_1.resetNavTracker)();
|
|
34
|
+
(0, NavigationTracker_1.freezeNavHistory)();
|
|
35
|
+
expect((0, NavigationTracker_1.getNavHistory)()).toEqual([]);
|
|
36
|
+
});
|
|
37
|
+
it('clearNavHistory resets frozen snapshot', () => {
|
|
38
|
+
(0, expo_router_1.__setPathname)('/test');
|
|
39
|
+
(0, react_native_1.renderHook)(() => (0, NavigationTracker_1.useNavigationTracker)());
|
|
40
|
+
(0, NavigationTracker_1.freezeNavHistory)();
|
|
41
|
+
expect((0, NavigationTracker_1.getNavHistory)()).toHaveLength(1);
|
|
42
|
+
(0, NavigationTracker_1.clearNavHistory)();
|
|
43
|
+
expect((0, NavigationTracker_1.getNavHistory)()).toEqual([]);
|
|
44
|
+
});
|
|
45
|
+
it('freezeNavHistory creates independent copy', () => {
|
|
46
|
+
(0, expo_router_1.__setPathname)('/first');
|
|
47
|
+
(0, react_native_1.renderHook)(() => (0, NavigationTracker_1.useNavigationTracker)());
|
|
48
|
+
(0, NavigationTracker_1.freezeNavHistory)();
|
|
49
|
+
const frozen = (0, NavigationTracker_1.getNavHistory)();
|
|
50
|
+
expect(frozen).toHaveLength(1);
|
|
51
|
+
expect(frozen[0].pathname).toBe('/first');
|
|
52
|
+
});
|
|
53
|
+
});
|
|
54
|
+
//# sourceMappingURL=NavigationTracker.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NavigationTracker.test.js","sourceRoot":"","sources":["../../src/__tests__/NavigationTracker.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RingBuffer.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/RingBuffer.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const RingBuffer_1 = require("../RingBuffer");
|
|
4
|
+
describe('RingBuffer', () => {
|
|
5
|
+
it('stores items up to max size', () => {
|
|
6
|
+
const buffer = new RingBuffer_1.RingBuffer(3);
|
|
7
|
+
buffer.push(1);
|
|
8
|
+
buffer.push(2);
|
|
9
|
+
buffer.push(3);
|
|
10
|
+
expect(buffer.getAll()).toEqual([1, 2, 3]);
|
|
11
|
+
expect(buffer.length).toBe(3);
|
|
12
|
+
});
|
|
13
|
+
it('evicts oldest item when full', () => {
|
|
14
|
+
const buffer = new RingBuffer_1.RingBuffer(3);
|
|
15
|
+
buffer.push(1);
|
|
16
|
+
buffer.push(2);
|
|
17
|
+
buffer.push(3);
|
|
18
|
+
buffer.push(4);
|
|
19
|
+
expect(buffer.getAll()).toEqual([2, 3, 4]);
|
|
20
|
+
expect(buffer.length).toBe(3);
|
|
21
|
+
});
|
|
22
|
+
it('returns empty array when no items', () => {
|
|
23
|
+
const buffer = new RingBuffer_1.RingBuffer(5);
|
|
24
|
+
expect(buffer.getAll()).toEqual([]);
|
|
25
|
+
expect(buffer.length).toBe(0);
|
|
26
|
+
});
|
|
27
|
+
it('returns a copy, not a reference', () => {
|
|
28
|
+
const buffer = new RingBuffer_1.RingBuffer(3);
|
|
29
|
+
buffer.push(1);
|
|
30
|
+
const copy = buffer.getAll();
|
|
31
|
+
copy.push(999);
|
|
32
|
+
expect(buffer.getAll()).toEqual([1]);
|
|
33
|
+
});
|
|
34
|
+
it('clears all items', () => {
|
|
35
|
+
const buffer = new RingBuffer_1.RingBuffer(3);
|
|
36
|
+
buffer.push(1);
|
|
37
|
+
buffer.push(2);
|
|
38
|
+
buffer.clear();
|
|
39
|
+
expect(buffer.getAll()).toEqual([]);
|
|
40
|
+
expect(buffer.length).toBe(0);
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
//# sourceMappingURL=RingBuffer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RingBuffer.test.js","sourceRoot":"","sources":["../../src/__tests__/RingBuffer.test.ts"],"names":[],"mappings":";;AAAA,8CAA2C;AAE3C,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,MAAM,GAAG,IAAI,uBAAU,CAAS,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,MAAM,GAAG,IAAI,uBAAU,CAAS,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC3C,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,MAAM,GAAG,IAAI,uBAAU,CAAS,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,MAAM,GAAG,IAAI,uBAAU,CAAS,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC1B,MAAM,MAAM,GAAG,IAAI,uBAAU,CAAS,CAAC,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACf,MAAM,CAAC,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScreenCapture.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/ScreenCapture.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const ScreenCapture_1 = require("../ScreenCapture");
|
|
4
|
+
const react_native_view_shot_1 = require("react-native-view-shot");
|
|
5
|
+
describe('captureScreenshot', () => {
|
|
6
|
+
beforeEach(() => {
|
|
7
|
+
jest.clearAllMocks();
|
|
8
|
+
});
|
|
9
|
+
it('returns URI on success', async () => {
|
|
10
|
+
const ref = { current: {} };
|
|
11
|
+
const result = await (0, ScreenCapture_1.captureScreenshot)(ref);
|
|
12
|
+
expect(result).toBe('file:///tmp/screenshot.png');
|
|
13
|
+
expect(react_native_view_shot_1.captureRef).toHaveBeenCalledWith(ref, {
|
|
14
|
+
format: 'png',
|
|
15
|
+
quality: 0.8,
|
|
16
|
+
width: 720,
|
|
17
|
+
result: 'tmpfile',
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
it('returns null on error (Expo Go)', async () => {
|
|
21
|
+
react_native_view_shot_1.captureRef.mockRejectedValueOnce(new Error('Not available'));
|
|
22
|
+
const ref = { current: {} };
|
|
23
|
+
const result = await (0, ScreenCapture_1.captureScreenshot)(ref);
|
|
24
|
+
expect(result).toBeNull();
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=ScreenCapture.test.js.map
|