@crumbsdk/react-native 0.0.1-rc.3

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 (67) hide show
  1. package/CrumbReactNative.podspec +38 -0
  2. package/LICENSE +201 -0
  3. package/README.md +109 -0
  4. package/android/CMakeLists.txt +20 -0
  5. package/android/build.gradle +118 -0
  6. package/android/src/main/AndroidManifest.xml +2 -0
  7. package/android/src/main/cpp/cpp-adapter.cpp +10 -0
  8. package/android/src/main/java/com/margelo/nitro/crumbsdk/reactnative/CrumbReactNative.kt +228 -0
  9. package/android/src/main/java/com/margelo/nitro/crumbsdk/reactnative/ReactNativePackage.kt +22 -0
  10. package/ios/CrumbReactNative.swift +283 -0
  11. package/lib/module/CrumbReactNative.nitro.js +4 -0
  12. package/lib/module/CrumbReactNative.nitro.js.map +1 -0
  13. package/lib/module/NativeCrumbReactNative.js +5 -0
  14. package/lib/module/NativeCrumbReactNative.js.map +1 -0
  15. package/lib/module/NativeCrumbReactNative.web.js +18 -0
  16. package/lib/module/NativeCrumbReactNative.web.js.map +1 -0
  17. package/lib/module/index.js +60 -0
  18. package/lib/module/index.js.map +1 -0
  19. package/lib/module/log-buffer.js +200 -0
  20. package/lib/module/log-buffer.js.map +1 -0
  21. package/lib/module/package.json +1 -0
  22. package/lib/module/types.js +2 -0
  23. package/lib/module/types.js.map +1 -0
  24. package/lib/typescript/package.json +1 -0
  25. package/lib/typescript/src/CrumbReactNative.nitro.d.ts +12 -0
  26. package/lib/typescript/src/CrumbReactNative.nitro.d.ts.map +1 -0
  27. package/lib/typescript/src/NativeCrumbReactNative.d.ts +4 -0
  28. package/lib/typescript/src/NativeCrumbReactNative.d.ts.map +1 -0
  29. package/lib/typescript/src/NativeCrumbReactNative.web.d.ts +4 -0
  30. package/lib/typescript/src/NativeCrumbReactNative.web.d.ts.map +1 -0
  31. package/lib/typescript/src/index.d.ts +19 -0
  32. package/lib/typescript/src/index.d.ts.map +1 -0
  33. package/lib/typescript/src/log-buffer.d.ts +8 -0
  34. package/lib/typescript/src/log-buffer.d.ts.map +1 -0
  35. package/lib/typescript/src/types.d.ts +55 -0
  36. package/lib/typescript/src/types.d.ts.map +1 -0
  37. package/nitro.json +24 -0
  38. package/nitrogen/generated/.gitattributes +1 -0
  39. package/nitrogen/generated/android/c++/JHybridCrumbReactNativeSpec.cpp +94 -0
  40. package/nitrogen/generated/android/c++/JHybridCrumbReactNativeSpec.hpp +67 -0
  41. package/nitrogen/generated/android/crumbsdk_reactnative+autolinking.cmake +81 -0
  42. package/nitrogen/generated/android/crumbsdk_reactnative+autolinking.gradle +27 -0
  43. package/nitrogen/generated/android/crumbsdk_reactnativeOnLoad.cpp +54 -0
  44. package/nitrogen/generated/android/crumbsdk_reactnativeOnLoad.hpp +34 -0
  45. package/nitrogen/generated/android/kotlin/com/margelo/nitro/crumbsdk/reactnative/HybridCrumbReactNativeSpec.kt +73 -0
  46. package/nitrogen/generated/android/kotlin/com/margelo/nitro/crumbsdk/reactnative/crumbsdk_reactnativeOnLoad.kt +35 -0
  47. package/nitrogen/generated/ios/CrumbReactNative+autolinking.rb +62 -0
  48. package/nitrogen/generated/ios/CrumbReactNative-Swift-Cxx-Bridge.cpp +49 -0
  49. package/nitrogen/generated/ios/CrumbReactNative-Swift-Cxx-Bridge.hpp +119 -0
  50. package/nitrogen/generated/ios/CrumbReactNative-Swift-Cxx-Umbrella.hpp +45 -0
  51. package/nitrogen/generated/ios/CrumbReactNativeAutolinking.mm +33 -0
  52. package/nitrogen/generated/ios/CrumbReactNativeAutolinking.swift +26 -0
  53. package/nitrogen/generated/ios/c++/HybridCrumbReactNativeSpecSwift.cpp +11 -0
  54. package/nitrogen/generated/ios/c++/HybridCrumbReactNativeSpecSwift.hpp +109 -0
  55. package/nitrogen/generated/ios/swift/Func_void_bool.swift +46 -0
  56. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +46 -0
  57. package/nitrogen/generated/ios/swift/HybridCrumbReactNativeSpec.swift +59 -0
  58. package/nitrogen/generated/ios/swift/HybridCrumbReactNativeSpec_cxx.swift +197 -0
  59. package/nitrogen/generated/shared/c++/HybridCrumbReactNativeSpec.cpp +25 -0
  60. package/nitrogen/generated/shared/c++/HybridCrumbReactNativeSpec.hpp +67 -0
  61. package/package.json +138 -0
  62. package/src/CrumbReactNative.nitro.ts +12 -0
  63. package/src/NativeCrumbReactNative.ts +6 -0
  64. package/src/NativeCrumbReactNative.web.ts +20 -0
  65. package/src/index.ts +115 -0
  66. package/src/log-buffer.ts +265 -0
  67. package/src/types.ts +70 -0
@@ -0,0 +1,200 @@
1
+ "use strict";
2
+
3
+ import NativeCrumbReactNative from './NativeCrumbReactNative';
4
+ const DEFAULT_LOOKBACK_MS = 60_000;
5
+ const DEFAULT_MAXIMUM_ENTRIES = 200;
6
+ const DEFAULT_MAXIMUM_BYTES = 65_536;
7
+ const MAXIMUM_METADATA_DEPTH = 4;
8
+ const MAXIMUM_OBJECT_KEYS = 24;
9
+ const MAXIMUM_ARRAY_ITEMS = 24;
10
+ const MAXIMUM_STRING_LENGTH = 2_048;
11
+ const MAXIMUM_ENTRY_BYTES = 16_384;
12
+ let limits = {
13
+ lookbackMs: DEFAULT_LOOKBACK_MS,
14
+ maximumEntries: DEFAULT_MAXIMUM_ENTRIES,
15
+ maximumBytes: DEFAULT_MAXIMUM_BYTES
16
+ };
17
+ let entries = [];
18
+ let usedBytes = 0;
19
+ let nativeStarted = false;
20
+ let originalWarn;
21
+ let originalError;
22
+ let capturedWarn;
23
+ let capturedError;
24
+ export function configureLogBuffer(options) {
25
+ limits = {
26
+ lookbackMs: options?.lookbackMs ?? DEFAULT_LOOKBACK_MS,
27
+ maximumEntries: options?.maximumEntries ?? DEFAULT_MAXIMUM_ENTRIES,
28
+ maximumBytes: options?.maximumBytes ?? DEFAULT_MAXIMUM_BYTES
29
+ };
30
+ prune(Date.now());
31
+ }
32
+ export function markNativeStarted() {
33
+ nativeStarted = true;
34
+ NativeCrumbReactNative.clearLogs();
35
+ for (const entry of entries) {
36
+ NativeCrumbReactNative.addLog(JSON.stringify(entry));
37
+ }
38
+ }
39
+ export function clearLogs() {
40
+ entries = [];
41
+ usedBytes = 0;
42
+ if (nativeStarted) {
43
+ NativeCrumbReactNative.clearLogs();
44
+ }
45
+ }
46
+ export function writeLog(level, message, metadata, category = 'javascript') {
47
+ const timestampMs = Date.now();
48
+ const metadataText = metadata ? serializeMetadata(metadata) : undefined;
49
+ const entry = {
50
+ timestampMs,
51
+ level,
52
+ source: 'react-native',
53
+ category,
54
+ message: truncateUtf8(metadataText ? `${message}\nmetadata=${metadataText}` : message, MAXIMUM_ENTRY_BYTES)
55
+ };
56
+ const bytes = byteLength(JSON.stringify(entry));
57
+ entries.push(entry);
58
+ usedBytes += bytes;
59
+ prune(timestampMs);
60
+ if (nativeStarted && entries.includes(entry)) {
61
+ NativeCrumbReactNative.addLog(JSON.stringify(entry));
62
+ }
63
+ }
64
+ export function enableConsoleCapture() {
65
+ if (capturedWarn || capturedError) return;
66
+ originalWarn = console.warn;
67
+ originalError = console.error;
68
+ capturedWarn = (...data) => {
69
+ originalWarn?.apply(console, data);
70
+ writeConsoleLog('warning', data);
71
+ };
72
+ capturedError = (...data) => {
73
+ originalError?.apply(console, data);
74
+ writeConsoleLog('error', data);
75
+ };
76
+ console.warn = capturedWarn;
77
+ console.error = capturedError;
78
+ }
79
+ export function disableConsoleCapture() {
80
+ if (capturedWarn && console.warn === capturedWarn && originalWarn) {
81
+ console.warn = originalWarn;
82
+ }
83
+ if (capturedError && console.error === capturedError && originalError) {
84
+ console.error = originalError;
85
+ }
86
+ originalWarn = undefined;
87
+ originalError = undefined;
88
+ capturedWarn = undefined;
89
+ capturedError = undefined;
90
+ }
91
+ function writeConsoleLog(level, data) {
92
+ const suppliedError = data.find(value => value instanceof Error);
93
+ const rendered = data.map(renderConsoleValue).join(' ');
94
+ const stack = suppliedError?.stack ?? new Error(`console.${level}`).stack;
95
+ const message = stack ? `${rendered}\n${stack}` : rendered;
96
+ writeLog(level, message, undefined, 'console');
97
+ }
98
+ function renderConsoleValue(value) {
99
+ if (value instanceof Error) return value.stack ?? value.message;
100
+ if (typeof value === 'string') return value;
101
+ if (typeof value === 'number' || typeof value === 'boolean' || typeof value === 'bigint') {
102
+ return String(value);
103
+ }
104
+ if (value === null) return 'null';
105
+ if (value === undefined) return 'undefined';
106
+ return serializeMetadata({
107
+ value
108
+ });
109
+ }
110
+ function serializeMetadata(metadata) {
111
+ const seen = new WeakSet();
112
+ const bounded = boundValue(metadata, 0, seen);
113
+ try {
114
+ return truncateUtf8(JSON.stringify(bounded), MAXIMUM_ENTRY_BYTES / 2);
115
+ } catch {
116
+ return '"[Unserializable metadata]"';
117
+ }
118
+ }
119
+ function boundValue(value, depth, seen) {
120
+ if (value instanceof Error) {
121
+ return {
122
+ name: value.name,
123
+ message: truncateString(value.message),
124
+ stack: value.stack ? truncateString(value.stack) : undefined
125
+ };
126
+ }
127
+ if (typeof value === 'string') return truncateString(value);
128
+ if (value === null || typeof value === 'number' || typeof value === 'boolean') {
129
+ return value;
130
+ }
131
+ if (typeof value === 'bigint') return String(value);
132
+ if (typeof value === 'undefined') return '[Undefined]';
133
+ if (typeof value === 'function') return '[Function]';
134
+ if (typeof value === 'symbol') return String(value);
135
+ if (depth >= MAXIMUM_METADATA_DEPTH) return '[Max depth]';
136
+ if (typeof value !== 'object') return String(value);
137
+ if (seen.has(value)) return '[Circular]';
138
+ seen.add(value);
139
+ if (Array.isArray(value)) {
140
+ const result = value.slice(0, MAXIMUM_ARRAY_ITEMS).map(item => boundValue(item, depth + 1, seen));
141
+ seen.delete(value);
142
+ return result;
143
+ }
144
+ const result = {};
145
+ for (const key of Object.keys(value).slice(0, MAXIMUM_OBJECT_KEYS)) {
146
+ result[truncateString(key)] = boundValue(value[key], depth + 1, seen);
147
+ }
148
+ seen.delete(value);
149
+ return result;
150
+ }
151
+ function prune(now) {
152
+ const earliest = now - limits.lookbackMs;
153
+ while (entries[0] && entries[0].timestampMs < earliest) {
154
+ removeOldest();
155
+ }
156
+ while (entries.length > limits.maximumEntries || usedBytes > limits.maximumBytes) {
157
+ removeOldest();
158
+ }
159
+ }
160
+ function removeOldest() {
161
+ const removed = entries.shift();
162
+ if (!removed) return;
163
+ usedBytes -= byteLength(JSON.stringify(removed));
164
+ }
165
+ function truncateString(value) {
166
+ return value.length <= MAXIMUM_STRING_LENGTH ? value : `${value.slice(0, MAXIMUM_STRING_LENGTH)}…`;
167
+ }
168
+ function truncateUtf8(value, maximumBytes) {
169
+ if (byteLength(value) <= maximumBytes) return value;
170
+ let low = 0;
171
+ let high = value.length;
172
+ while (low < high) {
173
+ const middle = Math.ceil((low + high) / 2);
174
+ if (byteLength(value.slice(0, middle)) <= maximumBytes - 3) {
175
+ low = middle;
176
+ } else {
177
+ high = middle - 1;
178
+ }
179
+ }
180
+ return `${value.slice(0, low)}…`;
181
+ }
182
+ function byteLength(value) {
183
+ let bytes = 0;
184
+ for (let index = 0; index < value.length; index += 1) {
185
+ const code = value.charCodeAt(index);
186
+ if (code <= 0x7f) {
187
+ bytes += 1;
188
+ } else if (code <= 0x7ff) {
189
+ bytes += 2;
190
+ } else if (code >= 0xd800 && code <= 0xdbff) {
191
+ const next = value.charCodeAt(index + 1);
192
+ if (next >= 0xdc00 && next <= 0xdfff) index += 1;
193
+ bytes += 4;
194
+ } else {
195
+ bytes += 3;
196
+ }
197
+ }
198
+ return bytes;
199
+ }
200
+ //# sourceMappingURL=log-buffer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["NativeCrumbReactNative","DEFAULT_LOOKBACK_MS","DEFAULT_MAXIMUM_ENTRIES","DEFAULT_MAXIMUM_BYTES","MAXIMUM_METADATA_DEPTH","MAXIMUM_OBJECT_KEYS","MAXIMUM_ARRAY_ITEMS","MAXIMUM_STRING_LENGTH","MAXIMUM_ENTRY_BYTES","limits","lookbackMs","maximumEntries","maximumBytes","entries","usedBytes","nativeStarted","originalWarn","originalError","capturedWarn","capturedError","configureLogBuffer","options","prune","Date","now","markNativeStarted","clearLogs","entry","addLog","JSON","stringify","writeLog","level","message","metadata","category","timestampMs","metadataText","serializeMetadata","undefined","source","truncateUtf8","bytes","byteLength","push","includes","enableConsoleCapture","console","warn","error","data","apply","writeConsoleLog","disableConsoleCapture","suppliedError","find","value","Error","rendered","map","renderConsoleValue","join","stack","String","seen","WeakSet","bounded","boundValue","depth","name","truncateString","has","add","Array","isArray","result","slice","item","delete","key","Object","keys","earliest","removeOldest","length","removed","shift","low","high","middle","Math","ceil","index","code","charCodeAt","next"],"sourceRoot":"../../src","sources":["log-buffer.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../src","sources":["types.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1 @@
1
+ {"type":"module"}
@@ -0,0 +1,12 @@
1
+ import type { HybridObject } from 'react-native-nitro-modules';
2
+ export interface CrumbReactNative extends HybridObject<{
3
+ ios: 'swift';
4
+ android: 'kotlin';
5
+ }> {
6
+ start(configurationJson: string): void;
7
+ installReporter(): Promise<boolean>;
8
+ show(): Promise<boolean>;
9
+ addLog(entryJson: string): void;
10
+ clearLogs(): void;
11
+ }
12
+ //# sourceMappingURL=CrumbReactNative.nitro.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CrumbReactNative.nitro.d.ts","sourceRoot":"","sources":["../../../src/CrumbReactNative.nitro.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D,MAAM,WAAW,gBAAiB,SAAQ,YAAY,CAAC;IACrD,GAAG,EAAE,OAAO,CAAC;IACb,OAAO,EAAE,QAAQ,CAAC;CACnB,CAAC;IACA,KAAK,CAAC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC;IACzB,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,SAAS,IAAI,IAAI,CAAC;CACnB"}
@@ -0,0 +1,4 @@
1
+ import type { CrumbReactNative } from './CrumbReactNative.nitro.js';
2
+ declare const _default: CrumbReactNative;
3
+ export default _default;
4
+ //# sourceMappingURL=NativeCrumbReactNative.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeCrumbReactNative.d.ts","sourceRoot":"","sources":["../../../src/NativeCrumbReactNative.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA0B,CAAC;;AAEjE,wBAEE"}
@@ -0,0 +1,4 @@
1
+ import type { CrumbReactNative } from './CrumbReactNative.nitro.js';
2
+ declare const unsupportedModule: CrumbReactNative;
3
+ export default unsupportedModule;
4
+ //# sourceMappingURL=NativeCrumbReactNative.web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NativeCrumbReactNative.web.d.ts","sourceRoot":"","sources":["../../../src/NativeCrumbReactNative.web.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA0B,CAAC;AAKjE,QAAA,MAAM,iBAAiB,EAAE,gBAYxB,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { clearLogs, disableConsoleCapture, enableConsoleCapture } from './log-buffer.js';
2
+ import type { CrumbConfiguration, CrumbLogLevel, CrumbLogMetadata } from './types.js';
3
+ export type { CrumbCaptureOptions, CrumbConfiguration, CrumbDiagnosticsOptions, CrumbInvocation, CrumbLogLevel, CrumbLogMetadata, CrumbLogOptions, CrumbPrivacyOptions, CrumbRelease, CrumbUploadOptions, } from './types.js';
4
+ export declare function start(configuration: CrumbConfiguration): Promise<void>;
5
+ export declare function installReporter(): Promise<boolean>;
6
+ export declare function show(): Promise<boolean>;
7
+ export declare function log(level: CrumbLogLevel, message: string, metadata?: CrumbLogMetadata): void;
8
+ export { clearLogs, disableConsoleCapture, enableConsoleCapture };
9
+ declare const Crumb: Readonly<{
10
+ start: typeof start;
11
+ installReporter: typeof installReporter;
12
+ show: typeof show;
13
+ log: typeof log;
14
+ clearLogs: typeof clearLogs;
15
+ enableConsoleCapture: typeof enableConsoleCapture;
16
+ disableConsoleCapture: typeof disableConsoleCapture;
17
+ }>;
18
+ export default Crumb;
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,SAAS,EAET,qBAAqB,EACrB,oBAAoB,EAGrB,MAAM,iBAAc,CAAC;AACtB,OAAO,KAAK,EACV,kBAAkB,EAClB,aAAa,EACb,gBAAgB,EACjB,MAAM,YAAS,CAAC;AAEjB,YAAY,EACV,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACvB,eAAe,EACf,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,YAAY,EACZ,kBAAkB,GACnB,MAAM,YAAS,CAAC;AAEjB,wBAAsB,KAAK,CAAC,aAAa,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAY5E;AAED,wBAAgB,eAAe,IAAI,OAAO,CAAC,OAAO,CAAC,CAElD;AAED,wBAAgB,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAEvC;AAED,wBAAgB,GAAG,CACjB,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,gBAAgB,GAC1B,IAAI,CAKN;AAED,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,CAAC;AA2ClE,QAAA,MAAM,KAAK;;;;;;;;EAQT,CAAC;AAEH,eAAe,KAAK,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { CrumbLogEntry, CrumbLogLevel, CrumbLogMetadata, CrumbLogOptions } from './types.js';
2
+ export declare function configureLogBuffer(options: CrumbLogOptions | undefined): void;
3
+ export declare function markNativeStarted(): void;
4
+ export declare function clearLogs(): void;
5
+ export declare function writeLog(level: CrumbLogLevel, message: string, metadata?: CrumbLogMetadata, category?: CrumbLogEntry['category']): void;
6
+ export declare function enableConsoleCapture(): void;
7
+ export declare function disableConsoleCapture(): void;
8
+ //# sourceMappingURL=log-buffer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-buffer.d.ts","sourceRoot":"","sources":["../../../src/log-buffer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,eAAe,EAChB,MAAM,YAAS,CAAC;AAgCjB,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,SAAS,GAAG,IAAI,CAO7E;AAED,wBAAgB,iBAAiB,IAAI,IAAI,CAMxC;AAED,wBAAgB,SAAS,IAAI,IAAI,CAMhC;AAED,wBAAgB,QAAQ,CACtB,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,gBAAgB,EAC3B,QAAQ,GAAE,aAAa,CAAC,UAAU,CAAgB,GACjD,IAAI,CAsBN;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAe3C;AAED,wBAAgB,qBAAqB,IAAI,IAAI,CAW5C"}
@@ -0,0 +1,55 @@
1
+ export type CrumbInvocation = 'shake' | 'programmatic';
2
+ export type CrumbLogLevel = 'debug' | 'info' | 'notice' | 'warning' | 'error' | 'fault';
3
+ export interface CrumbRelease {
4
+ /** Defaults to the native bundle version name. */
5
+ appVersion?: string;
6
+ /** Defaults to the native bundle build number. */
7
+ nativeBuild?: string;
8
+ /** OTA or JavaScript bundle identity supplied by the host app. */
9
+ bundleVersion?: string;
10
+ }
11
+ export interface CrumbCaptureOptions {
12
+ screenshot?: boolean;
13
+ maximumScreenshotDimension?: number;
14
+ maximumScreenshotBytes?: number;
15
+ }
16
+ export interface CrumbLogOptions {
17
+ enabled?: boolean;
18
+ lookbackMs?: number;
19
+ maximumEntries?: number;
20
+ maximumBytes?: number;
21
+ /** Captures console.warn and console.error while preserving their behavior. */
22
+ captureConsole?: boolean;
23
+ }
24
+ export interface CrumbDiagnosticsOptions {
25
+ healthCheckUrl?: string;
26
+ timeoutMs?: number;
27
+ logs?: CrumbLogOptions;
28
+ }
29
+ export interface CrumbPrivacyOptions {
30
+ maskAllTextInputs?: boolean;
31
+ maskScreenshotsBeforeUpload?: boolean;
32
+ }
33
+ export interface CrumbUploadOptions {
34
+ /** Base URL of the Crumb ingestion API. Omit to keep reports local-only. */
35
+ ingestionUrl?: string;
36
+ }
37
+ export interface CrumbConfiguration {
38
+ projectKey: string;
39
+ environment: string;
40
+ release?: CrumbRelease;
41
+ invocation?: readonly CrumbInvocation[];
42
+ capture?: CrumbCaptureOptions;
43
+ diagnostics?: CrumbDiagnosticsOptions;
44
+ privacy?: CrumbPrivacyOptions;
45
+ upload?: CrumbUploadOptions;
46
+ }
47
+ export type CrumbLogMetadata = Readonly<Record<string, unknown>>;
48
+ export interface CrumbLogEntry {
49
+ timestampMs: number;
50
+ level: CrumbLogLevel;
51
+ source: 'react-native';
52
+ category: 'javascript' | 'console';
53
+ message: string;
54
+ }
55
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,cAAc,CAAC;AAEvD,MAAM,MAAM,aAAa,GACrB,OAAO,GACP,MAAM,GACN,QAAQ,GACR,SAAS,GACT,OAAO,GACP,OAAO,CAAC;AAEZ,MAAM,WAAW,YAAY;IAC3B,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kEAAkE;IAClE,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,sBAAsB,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,+EAA+E;IAC/E,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,uBAAuB;IACtC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,eAAe,CAAC;CACxB;AAED,MAAM,WAAW,mBAAmB;IAClC,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,2BAA2B,CAAC,EAAE,OAAO,CAAC;CACvC;AAED,MAAM,WAAW,kBAAkB;IACjC,4EAA4E;IAC5E,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,UAAU,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;IACxC,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,WAAW,CAAC,EAAE,uBAAuB,CAAC;IACtC,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,MAAM,CAAC,EAAE,kBAAkB,CAAC;CAC7B;AAED,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;AAEjE,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,YAAY,GAAG,SAAS,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;CACjB"}
package/nitro.json ADDED
@@ -0,0 +1,24 @@
1
+ {
2
+ "$schema": "https://nitro.margelo.com/nitro.schema.json",
3
+ "cxxNamespace": ["crumbsdk_reactnative"],
4
+ "ios": {
5
+ "iosModuleName": "CrumbReactNative"
6
+ },
7
+ "android": {
8
+ "androidNamespace": ["crumbsdk", "reactnative"],
9
+ "androidCxxLibName": "crumbsdk_reactnative"
10
+ },
11
+ "autolinking": {
12
+ "CrumbReactNative": {
13
+ "ios": {
14
+ "language": "swift",
15
+ "implementationClassName": "CrumbReactNative"
16
+ },
17
+ "android": {
18
+ "language": "kotlin",
19
+ "implementationClassName": "CrumbReactNative"
20
+ }
21
+ }
22
+ },
23
+ "ignorePaths": ["node_modules"]
24
+ }
@@ -0,0 +1 @@
1
+ ** linguist-generated=true
@@ -0,0 +1,94 @@
1
+ ///
2
+ /// JHybridCrumbReactNativeSpec.cpp
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ #include "JHybridCrumbReactNativeSpec.hpp"
9
+
10
+
11
+
12
+ #include <NitroModules/Promise.hpp>
13
+ #include <NitroModules/JPromise.hpp>
14
+ #include <string>
15
+
16
+ namespace margelo::nitro::crumbsdk_reactnative {
17
+
18
+ std::shared_ptr<JHybridCrumbReactNativeSpec> JHybridCrumbReactNativeSpec::JavaPart::getJHybridCrumbReactNativeSpec() {
19
+ auto hybridObject = JHybridObject::JavaPart::getJHybridObject();
20
+ auto castHybridObject = std::dynamic_pointer_cast<JHybridCrumbReactNativeSpec>(hybridObject);
21
+ if (castHybridObject == nullptr) [[unlikely]] {
22
+ throw std::runtime_error("Failed to downcast JHybridObject to JHybridCrumbReactNativeSpec!");
23
+ }
24
+ return castHybridObject;
25
+ }
26
+
27
+ jni::local_ref<JHybridCrumbReactNativeSpec::CxxPart::jhybriddata> JHybridCrumbReactNativeSpec::CxxPart::initHybrid(jni::alias_ref<jhybridobject> jThis) {
28
+ return makeCxxInstance(jThis);
29
+ }
30
+
31
+ std::shared_ptr<JHybridObject> JHybridCrumbReactNativeSpec::CxxPart::createHybridObject(const jni::local_ref<JHybridObject::JavaPart>& javaPart) {
32
+ auto castJavaPart = jni::dynamic_ref_cast<JHybridCrumbReactNativeSpec::JavaPart>(javaPart);
33
+ if (castJavaPart == nullptr) [[unlikely]] {
34
+ throw std::runtime_error("Failed to cast JHybridObject::JavaPart to JHybridCrumbReactNativeSpec::JavaPart!");
35
+ }
36
+ return std::make_shared<JHybridCrumbReactNativeSpec>(castJavaPart);
37
+ }
38
+
39
+ void JHybridCrumbReactNativeSpec::CxxPart::registerNatives() {
40
+ registerHybrid({
41
+ makeNativeMethod("initHybrid", JHybridCrumbReactNativeSpec::CxxPart::initHybrid),
42
+ });
43
+ }
44
+
45
+ // Properties
46
+
47
+
48
+ // Methods
49
+ void JHybridCrumbReactNativeSpec::start(const std::string& configurationJson) {
50
+ static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JString> /* configurationJson */)>("start");
51
+ method(_javaPart, jni::make_jstring(configurationJson));
52
+ }
53
+ std::shared_ptr<Promise<bool>> JHybridCrumbReactNativeSpec::installReporter() {
54
+ static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>()>("installReporter");
55
+ auto __result = method(_javaPart);
56
+ return [&]() {
57
+ auto __promise = Promise<bool>::create();
58
+ __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
59
+ auto __result = jni::static_ref_cast<jni::JBoolean>(__boxedResult);
60
+ __promise->resolve(static_cast<bool>(__result->value()));
61
+ });
62
+ __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
63
+ jni::JniException __jniError(__throwable);
64
+ __promise->reject(std::make_exception_ptr(__jniError));
65
+ });
66
+ return __promise;
67
+ }();
68
+ }
69
+ std::shared_ptr<Promise<bool>> JHybridCrumbReactNativeSpec::show() {
70
+ static const auto method = _javaPart->javaClassStatic()->getMethod<jni::local_ref<JPromise::javaobject>()>("show");
71
+ auto __result = method(_javaPart);
72
+ return [&]() {
73
+ auto __promise = Promise<bool>::create();
74
+ __result->cthis()->addOnResolvedListener([=](const jni::alias_ref<jni::JObject>& __boxedResult) {
75
+ auto __result = jni::static_ref_cast<jni::JBoolean>(__boxedResult);
76
+ __promise->resolve(static_cast<bool>(__result->value()));
77
+ });
78
+ __result->cthis()->addOnRejectedListener([=](const jni::alias_ref<jni::JThrowable>& __throwable) {
79
+ jni::JniException __jniError(__throwable);
80
+ __promise->reject(std::make_exception_ptr(__jniError));
81
+ });
82
+ return __promise;
83
+ }();
84
+ }
85
+ void JHybridCrumbReactNativeSpec::addLog(const std::string& entryJson) {
86
+ static const auto method = _javaPart->javaClassStatic()->getMethod<void(jni::alias_ref<jni::JString> /* entryJson */)>("addLog");
87
+ method(_javaPart, jni::make_jstring(entryJson));
88
+ }
89
+ void JHybridCrumbReactNativeSpec::clearLogs() {
90
+ static const auto method = _javaPart->javaClassStatic()->getMethod<void()>("clearLogs");
91
+ method(_javaPart);
92
+ }
93
+
94
+ } // namespace margelo::nitro::crumbsdk_reactnative
@@ -0,0 +1,67 @@
1
+ ///
2
+ /// HybridCrumbReactNativeSpec.hpp
3
+ /// This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ /// https://github.com/mrousavy/nitro
5
+ /// Copyright © Marc Rousavy @ Margelo
6
+ ///
7
+
8
+ #pragma once
9
+
10
+ #include <NitroModules/JHybridObject.hpp>
11
+ #include <fbjni/fbjni.h>
12
+ #include "HybridCrumbReactNativeSpec.hpp"
13
+
14
+
15
+
16
+
17
+ namespace margelo::nitro::crumbsdk_reactnative {
18
+
19
+ using namespace facebook;
20
+
21
+ class JHybridCrumbReactNativeSpec: public virtual HybridCrumbReactNativeSpec, public virtual JHybridObject {
22
+ public:
23
+ struct JavaPart: public jni::JavaClass<JavaPart, JHybridObject::JavaPart> {
24
+ static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/crumbsdk/reactnative/HybridCrumbReactNativeSpec;";
25
+ std::shared_ptr<JHybridCrumbReactNativeSpec> getJHybridCrumbReactNativeSpec();
26
+ };
27
+ struct CxxPart: public jni::HybridClass<CxxPart, JHybridObject::CxxPart> {
28
+ static constexpr auto kJavaDescriptor = "Lcom/margelo/nitro/crumbsdk/reactnative/HybridCrumbReactNativeSpec$CxxPart;";
29
+ static jni::local_ref<jhybriddata> initHybrid(jni::alias_ref<jhybridobject> jThis);
30
+ static void registerNatives();
31
+ using HybridBase::HybridBase;
32
+ protected:
33
+ std::shared_ptr<JHybridObject> createHybridObject(const jni::local_ref<JHybridObject::JavaPart>& javaPart) override;
34
+ };
35
+
36
+ public:
37
+ explicit JHybridCrumbReactNativeSpec(const jni::local_ref<JHybridCrumbReactNativeSpec::JavaPart>& javaPart):
38
+ HybridObject(HybridCrumbReactNativeSpec::TAG),
39
+ JHybridObject(javaPart),
40
+ _javaPart(jni::make_global(javaPart)) {}
41
+ ~JHybridCrumbReactNativeSpec() override {
42
+ // Hermes GC can destroy JS objects on a non-JNI Thread.
43
+ jni::ThreadScope::WithClassLoader([&] { _javaPart.reset(); });
44
+ }
45
+
46
+ public:
47
+ inline const jni::global_ref<JHybridCrumbReactNativeSpec::JavaPart>& getJavaPart() const noexcept {
48
+ return _javaPart;
49
+ }
50
+
51
+ public:
52
+ // Properties
53
+
54
+
55
+ public:
56
+ // Methods
57
+ void start(const std::string& configurationJson) override;
58
+ std::shared_ptr<Promise<bool>> installReporter() override;
59
+ std::shared_ptr<Promise<bool>> show() override;
60
+ void addLog(const std::string& entryJson) override;
61
+ void clearLogs() override;
62
+
63
+ private:
64
+ jni::global_ref<JHybridCrumbReactNativeSpec::JavaPart> _javaPart;
65
+ };
66
+
67
+ } // namespace margelo::nitro::crumbsdk_reactnative
@@ -0,0 +1,81 @@
1
+ #
2
+ # crumbsdk_reactnative+autolinking.cmake
3
+ # This file was generated by nitrogen. DO NOT MODIFY THIS FILE.
4
+ # https://github.com/mrousavy/nitro
5
+ # Copyright © Marc Rousavy @ Margelo
6
+ #
7
+
8
+ # This is a CMake file that adds all files generated by Nitrogen
9
+ # to the current CMake project.
10
+ #
11
+ # To use it, add this to your CMakeLists.txt:
12
+ # ```cmake
13
+ # include(${CMAKE_SOURCE_DIR}/../nitrogen/generated/android/crumbsdk_reactnative+autolinking.cmake)
14
+ # ```
15
+
16
+ # Define a flag to check if we are building properly
17
+ add_definitions(-DBUILDING_CRUMBSDKREACTNATIVE_WITH_GENERATED_CMAKE_PROJECT)
18
+
19
+ # Enable Raw Props parsing in react-native (for Nitro Views)
20
+ add_definitions(-DRN_SERIALIZABLE_STATE)
21
+
22
+ # Add all headers that were generated by Nitrogen
23
+ include_directories(
24
+ "../nitrogen/generated/shared/c++"
25
+ "../nitrogen/generated/android/c++"
26
+ "../nitrogen/generated/android/"
27
+ )
28
+
29
+ # Add all .cpp sources that were generated by Nitrogen
30
+ target_sources(
31
+ # CMake project name (Android C++ library name)
32
+ crumbsdk_reactnative PRIVATE
33
+ # Autolinking Setup
34
+ ../nitrogen/generated/android/crumbsdk_reactnativeOnLoad.cpp
35
+ # Shared Nitrogen C++ sources
36
+ ../nitrogen/generated/shared/c++/HybridCrumbReactNativeSpec.cpp
37
+ # Android-specific Nitrogen C++ sources
38
+ ../nitrogen/generated/android/c++/JHybridCrumbReactNativeSpec.cpp
39
+ )
40
+
41
+ # From node_modules/react-native/ReactAndroid/cmake-utils/folly-flags.cmake
42
+ # Used in node_modules/react-native/ReactAndroid/cmake-utils/ReactNative-application.cmake
43
+ target_compile_definitions(
44
+ crumbsdk_reactnative PRIVATE
45
+ -DFOLLY_NO_CONFIG=1
46
+ -DFOLLY_HAVE_CLOCK_GETTIME=1
47
+ -DFOLLY_USE_LIBCPP=1
48
+ -DFOLLY_CFG_NO_COROUTINES=1
49
+ -DFOLLY_MOBILE=1
50
+ -DFOLLY_HAVE_RECVMMSG=1
51
+ -DFOLLY_HAVE_PTHREAD=1
52
+ # Once we target android-23 above, we can comment
53
+ # the following line. NDK uses GNU style stderror_r() after API 23.
54
+ -DFOLLY_HAVE_XSI_STRERROR_R=1
55
+ )
56
+
57
+ # Add all libraries required by the generated specs
58
+ find_package(fbjni REQUIRED) # <-- Used for communication between Java <-> C++
59
+ find_package(ReactAndroid REQUIRED) # <-- Used to set up React Native bindings (e.g. CallInvoker/TurboModule)
60
+ find_package(react-native-nitro-modules REQUIRED) # <-- Used to create all HybridObjects and use the Nitro core library
61
+
62
+ # Link all libraries together
63
+ target_link_libraries(
64
+ crumbsdk_reactnative
65
+ fbjni::fbjni # <-- Facebook C++ JNI helpers
66
+ ReactAndroid::jsi # <-- RN: JSI
67
+ react-native-nitro-modules::NitroModules # <-- NitroModules Core :)
68
+ )
69
+
70
+ # Link react-native (different prefab between RN 0.75 and RN 0.76)
71
+ if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 76)
72
+ target_link_libraries(
73
+ crumbsdk_reactnative
74
+ ReactAndroid::reactnative # <-- RN: Native Modules umbrella prefab
75
+ )
76
+ else()
77
+ target_link_libraries(
78
+ crumbsdk_reactnative
79
+ ReactAndroid::react_nativemodule_core # <-- RN: TurboModules Core
80
+ )
81
+ endif()