@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.
Files changed (150) hide show
  1. package/README.md +185 -0
  2. package/dist/AnnotationCanvas.d.ts +11 -0
  3. package/dist/AnnotationCanvas.d.ts.map +1 -0
  4. package/dist/AnnotationCanvas.js +154 -0
  5. package/dist/AnnotationCanvas.js.map +1 -0
  6. package/dist/BugReportModal.d.ts +15 -0
  7. package/dist/BugReportModal.d.ts.map +1 -0
  8. package/dist/BugReportModal.js +303 -0
  9. package/dist/BugReportModal.js.map +1 -0
  10. package/dist/BugReportProvider.d.ts +19 -0
  11. package/dist/BugReportProvider.d.ts.map +1 -0
  12. package/dist/BugReportProvider.js +103 -0
  13. package/dist/BugReportProvider.js.map +1 -0
  14. package/dist/DeviceInfo.d.ts +3 -0
  15. package/dist/DeviceInfo.d.ts.map +1 -0
  16. package/dist/DeviceInfo.js +63 -0
  17. package/dist/DeviceInfo.js.map +1 -0
  18. package/dist/ErrorBoundary.d.ts +19 -0
  19. package/dist/ErrorBoundary.d.ts.map +1 -0
  20. package/dist/ErrorBoundary.js +79 -0
  21. package/dist/ErrorBoundary.js.map +1 -0
  22. package/dist/NavigationTracker.d.ts +7 -0
  23. package/dist/NavigationTracker.d.ts.map +1 -0
  24. package/dist/NavigationTracker.js +61 -0
  25. package/dist/NavigationTracker.js.map +1 -0
  26. package/dist/RingBuffer.d.ts +10 -0
  27. package/dist/RingBuffer.d.ts.map +1 -0
  28. package/dist/RingBuffer.js +26 -0
  29. package/dist/RingBuffer.js.map +1 -0
  30. package/dist/ScreenCapture.d.ts +3 -0
  31. package/dist/ScreenCapture.d.ts.map +1 -0
  32. package/dist/ScreenCapture.js +20 -0
  33. package/dist/ScreenCapture.js.map +1 -0
  34. package/dist/ShakeDetector.d.ts +5 -0
  35. package/dist/ShakeDetector.d.ts.map +1 -0
  36. package/dist/ShakeDetector.js +44 -0
  37. package/dist/ShakeDetector.js.map +1 -0
  38. package/dist/StateCapture.d.ts +13 -0
  39. package/dist/StateCapture.d.ts.map +1 -0
  40. package/dist/StateCapture.js +74 -0
  41. package/dist/StateCapture.js.map +1 -0
  42. package/dist/__tests__/DeviceInfo.test.d.ts +2 -0
  43. package/dist/__tests__/DeviceInfo.test.d.ts.map +1 -0
  44. package/dist/__tests__/DeviceInfo.test.js +63 -0
  45. package/dist/__tests__/DeviceInfo.test.js.map +1 -0
  46. package/dist/__tests__/ErrorBoundary.test.d.ts +2 -0
  47. package/dist/__tests__/ErrorBoundary.test.d.ts.map +1 -0
  48. package/dist/__tests__/ErrorBoundary.test.js +64 -0
  49. package/dist/__tests__/ErrorBoundary.test.js.map +1 -0
  50. package/dist/__tests__/NavigationTracker.test.d.ts +2 -0
  51. package/dist/__tests__/NavigationTracker.test.d.ts.map +1 -0
  52. package/dist/__tests__/NavigationTracker.test.js +54 -0
  53. package/dist/__tests__/NavigationTracker.test.js.map +1 -0
  54. package/dist/__tests__/RingBuffer.test.d.ts +2 -0
  55. package/dist/__tests__/RingBuffer.test.d.ts.map +1 -0
  56. package/dist/__tests__/RingBuffer.test.js +43 -0
  57. package/dist/__tests__/RingBuffer.test.js.map +1 -0
  58. package/dist/__tests__/ScreenCapture.test.d.ts +2 -0
  59. package/dist/__tests__/ScreenCapture.test.d.ts.map +1 -0
  60. package/dist/__tests__/ScreenCapture.test.js +27 -0
  61. package/dist/__tests__/ScreenCapture.test.js.map +1 -0
  62. package/dist/__tests__/ShakeDetector.test.d.ts +2 -0
  63. package/dist/__tests__/ShakeDetector.test.d.ts.map +1 -0
  64. package/dist/__tests__/ShakeDetector.test.js +65 -0
  65. package/dist/__tests__/ShakeDetector.test.js.map +1 -0
  66. package/dist/__tests__/StateCapture.test.d.ts +2 -0
  67. package/dist/__tests__/StateCapture.test.d.ts.map +1 -0
  68. package/dist/__tests__/StateCapture.test.js +128 -0
  69. package/dist/__tests__/StateCapture.test.js.map +1 -0
  70. package/dist/__tests__/__mocks__/expo-clipboard.d.ts +3 -0
  71. package/dist/__tests__/__mocks__/expo-clipboard.d.ts.map +1 -0
  72. package/dist/__tests__/__mocks__/expo-clipboard.js +6 -0
  73. package/dist/__tests__/__mocks__/expo-clipboard.js.map +1 -0
  74. package/dist/__tests__/__mocks__/expo-constants.d.ts +17 -0
  75. package/dist/__tests__/__mocks__/expo-constants.d.ts.map +1 -0
  76. package/dist/__tests__/__mocks__/expo-constants.js +8 -0
  77. package/dist/__tests__/__mocks__/expo-constants.js.map +1 -0
  78. package/dist/__tests__/__mocks__/expo-device.d.ts +2 -0
  79. package/dist/__tests__/__mocks__/expo-device.d.ts.map +1 -0
  80. package/dist/__tests__/__mocks__/expo-device.js +5 -0
  81. package/dist/__tests__/__mocks__/expo-device.js.map +1 -0
  82. package/dist/__tests__/__mocks__/expo-file-system-legacy.d.ts +8 -0
  83. package/dist/__tests__/__mocks__/expo-file-system-legacy.d.ts.map +1 -0
  84. package/dist/__tests__/__mocks__/expo-file-system-legacy.js +10 -0
  85. package/dist/__tests__/__mocks__/expo-file-system-legacy.js.map +1 -0
  86. package/dist/__tests__/__mocks__/expo-localization.d.ts +6 -0
  87. package/dist/__tests__/__mocks__/expo-localization.d.ts.map +1 -0
  88. package/dist/__tests__/__mocks__/expo-localization.js +7 -0
  89. package/dist/__tests__/__mocks__/expo-localization.js.map +1 -0
  90. package/dist/__tests__/__mocks__/expo-router.d.ts +5 -0
  91. package/dist/__tests__/__mocks__/expo-router.d.ts.map +1 -0
  92. package/dist/__tests__/__mocks__/expo-router.js +16 -0
  93. package/dist/__tests__/__mocks__/expo-router.js.map +1 -0
  94. package/dist/__tests__/__mocks__/expo-sensors.d.ts +17 -0
  95. package/dist/__tests__/__mocks__/expo-sensors.d.ts.map +1 -0
  96. package/dist/__tests__/__mocks__/expo-sensors.js +22 -0
  97. package/dist/__tests__/__mocks__/expo-sensors.js.map +1 -0
  98. package/dist/__tests__/__mocks__/react-native-gesture-handler.d.ts +11 -0
  99. package/dist/__tests__/__mocks__/react-native-gesture-handler.d.ts.map +1 -0
  100. package/dist/__tests__/__mocks__/react-native-gesture-handler.js +14 -0
  101. package/dist/__tests__/__mocks__/react-native-gesture-handler.js.map +1 -0
  102. package/dist/__tests__/__mocks__/react-native-svg.d.ts +4 -0
  103. package/dist/__tests__/__mocks__/react-native-svg.d.ts.map +1 -0
  104. package/dist/__tests__/__mocks__/react-native-svg.js +7 -0
  105. package/dist/__tests__/__mocks__/react-native-svg.js.map +1 -0
  106. package/dist/__tests__/__mocks__/react-native-view-shot.d.ts +2 -0
  107. package/dist/__tests__/__mocks__/react-native-view-shot.d.ts.map +1 -0
  108. package/dist/__tests__/__mocks__/react-native-view-shot.js +5 -0
  109. package/dist/__tests__/__mocks__/react-native-view-shot.js.map +1 -0
  110. package/dist/__tests__/__mocks__/react-native.d.ts +20 -0
  111. package/dist/__tests__/__mocks__/react-native.d.ts.map +1 -0
  112. package/dist/__tests__/__mocks__/react-native.js +14 -0
  113. package/dist/__tests__/__mocks__/react-native.js.map +1 -0
  114. package/dist/__tests__/fileToBase64.test.d.ts +2 -0
  115. package/dist/__tests__/fileToBase64.test.d.ts.map +1 -0
  116. package/dist/__tests__/fileToBase64.test.js +21 -0
  117. package/dist/__tests__/fileToBase64.test.js.map +1 -0
  118. package/dist/__tests__/integrations/slack.test.d.ts +2 -0
  119. package/dist/__tests__/integrations/slack.test.d.ts.map +1 -0
  120. package/dist/__tests__/integrations/slack.test.js +123 -0
  121. package/dist/__tests__/integrations/slack.test.js.map +1 -0
  122. package/dist/__tests__/integrations/webhook.test.d.ts +2 -0
  123. package/dist/__tests__/integrations/webhook.test.d.ts.map +1 -0
  124. package/dist/__tests__/integrations/webhook.test.js +98 -0
  125. package/dist/__tests__/integrations/webhook.test.js.map +1 -0
  126. package/dist/index.d.ts +8 -0
  127. package/dist/index.d.ts.map +1 -0
  128. package/dist/index.js +18 -0
  129. package/dist/index.js.map +1 -0
  130. package/dist/integrations/index.d.ts +4 -0
  131. package/dist/integrations/index.d.ts.map +1 -0
  132. package/dist/integrations/index.js +8 -0
  133. package/dist/integrations/index.js.map +1 -0
  134. package/dist/integrations/slack.d.ts +9 -0
  135. package/dist/integrations/slack.d.ts.map +1 -0
  136. package/dist/integrations/slack.js +136 -0
  137. package/dist/integrations/slack.js.map +1 -0
  138. package/dist/integrations/types.d.ts +53 -0
  139. package/dist/integrations/types.d.ts.map +1 -0
  140. package/dist/integrations/types.js +3 -0
  141. package/dist/integrations/types.js.map +1 -0
  142. package/dist/integrations/webhook.d.ts +8 -0
  143. package/dist/integrations/webhook.d.ts.map +1 -0
  144. package/dist/integrations/webhook.js +45 -0
  145. package/dist/integrations/webhook.js.map +1 -0
  146. package/dist/utils/fileToBase64.d.ts +2 -0
  147. package/dist/utils/fileToBase64.d.ts.map +1 -0
  148. package/dist/utils/fileToBase64.js +11 -0
  149. package/dist/utils/fileToBase64.js.map +1 -0
  150. 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,10 @@
1
+ export declare class RingBuffer<T> {
2
+ private buffer;
3
+ private readonly maxSize;
4
+ constructor(maxSize: number);
5
+ push(item: T): void;
6
+ getAll(): T[];
7
+ clear(): void;
8
+ get length(): number;
9
+ }
10
+ //# sourceMappingURL=RingBuffer.d.ts.map
@@ -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,3 @@
1
+ import { type RefObject } from 'react';
2
+ export declare function captureScreenshot(viewRef: RefObject<unknown>): Promise<string | null>;
3
+ //# sourceMappingURL=ScreenCapture.d.ts.map
@@ -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,5 @@
1
+ export declare function useShakeDetector(onShake: () => void, options?: {
2
+ threshold?: number;
3
+ enabled?: boolean;
4
+ }): void;
5
+ //# sourceMappingURL=ShakeDetector.d.ts.map
@@ -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":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=DeviceInfo.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ErrorBoundary.test.d.ts.map
@@ -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":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=NavigationTracker.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=RingBuffer.test.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=ScreenCapture.test.d.ts.map
@@ -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