@fixprompt/react-native 0.0.2 → 0.0.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.
- package/dist/breadcrumbs.d.ts +22 -0
- package/dist/console.d.ts +9 -0
- package/dist/index.cjs +77 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +77 -4
- package/dist/index.js.map +1 -1
- package/dist/state.d.ts +1 -0
- package/dist/version.d.ts +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory ring buffer of the most recent console log lines.
|
|
3
|
+
*
|
|
4
|
+
* NEVER streamed to Loki on its own (would balloon volume + cost). Every
|
|
5
|
+
* outgoing event attaches the current buffer as `attrs.breadcrumbs`, giving
|
|
6
|
+
* the broker the lines that ran in the seconds before the error fired.
|
|
7
|
+
*
|
|
8
|
+
* That context is what the Fix Prompt template surfaces to Cursor/Claude
|
|
9
|
+
* — "this error happened, and HERE'S WHAT THE APP WAS DOING right before
|
|
10
|
+
* it." Without it, the AI just sees a stack trace with no surrounding state.
|
|
11
|
+
*/
|
|
12
|
+
export interface Breadcrumb {
|
|
13
|
+
/** Wall-clock ms timestamp. */
|
|
14
|
+
ts: number;
|
|
15
|
+
/** One of the four console levels (log / info / warn / error). */
|
|
16
|
+
level: 'log' | 'info' | 'warn' | 'error';
|
|
17
|
+
/** Stringified console args, capped at 500 chars. */
|
|
18
|
+
message: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function pushBreadcrumb(level: Breadcrumb['level'], args: any[]): void;
|
|
21
|
+
export declare function getBreadcrumbs(): Breadcrumb[];
|
|
22
|
+
export declare function clearBreadcrumbs(): void;
|
package/dist/console.d.ts
CHANGED
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
import type { ResolvedConfig } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Patches all four console levels (log / info / warn / error) to push entries
|
|
4
|
+
* into the breadcrumb ring buffer. Forwarding patches below are installed on
|
|
5
|
+
* top of these — they snapshot the buffer BEFORE pushing the current call,
|
|
6
|
+
* so the forwarded event sees the lines that ran before it.
|
|
7
|
+
*
|
|
8
|
+
* No-op-on-failure; never throws.
|
|
9
|
+
*/
|
|
10
|
+
export declare function patchConsoleForBreadcrumbs(): () => void;
|
|
2
11
|
/**
|
|
3
12
|
* Wrap console.error so tagged calls forward to the broker as warning-severity
|
|
4
13
|
* events. The original console.error still runs (so RedBox / Metro logs still
|
package/dist/index.cjs
CHANGED
|
@@ -494,9 +494,48 @@ function getDeviceAttrs() {
|
|
|
494
494
|
return attrs;
|
|
495
495
|
}
|
|
496
496
|
|
|
497
|
+
// src/breadcrumbs.ts
|
|
498
|
+
var MAX_BREADCRUMBS = 50;
|
|
499
|
+
var MAX_MESSAGE_CHARS = 500;
|
|
500
|
+
var buffer = [];
|
|
501
|
+
function pushBreadcrumb(level, args) {
|
|
502
|
+
try {
|
|
503
|
+
const message = stringifyArgs(args);
|
|
504
|
+
buffer.push({ ts: Date.now(), level, message });
|
|
505
|
+
if (buffer.length > MAX_BREADCRUMBS) buffer.shift();
|
|
506
|
+
} catch {
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
function getBreadcrumbs() {
|
|
510
|
+
return [...buffer];
|
|
511
|
+
}
|
|
512
|
+
function clearBreadcrumbs() {
|
|
513
|
+
buffer.length = 0;
|
|
514
|
+
}
|
|
515
|
+
function stringifyArgs(args) {
|
|
516
|
+
const parts = [];
|
|
517
|
+
for (const a of args) {
|
|
518
|
+
if (a instanceof Error) {
|
|
519
|
+
parts.push(`${a.name}: ${a.message}`);
|
|
520
|
+
} else if (typeof a === "string") {
|
|
521
|
+
parts.push(a);
|
|
522
|
+
} else if (a == null) {
|
|
523
|
+
parts.push(String(a));
|
|
524
|
+
} else {
|
|
525
|
+
try {
|
|
526
|
+
parts.push(JSON.stringify(a));
|
|
527
|
+
} catch {
|
|
528
|
+
parts.push(String(a));
|
|
529
|
+
}
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
const joined = parts.join(" ");
|
|
533
|
+
return joined.length > MAX_MESSAGE_CHARS ? joined.slice(0, MAX_MESSAGE_CHARS) + "\u2026" : joined;
|
|
534
|
+
}
|
|
535
|
+
|
|
497
536
|
// src/version.ts
|
|
498
537
|
var SDK_NAME = "@fixprompt/react-native";
|
|
499
|
-
var SDK_VERSION = "0.0.
|
|
538
|
+
var SDK_VERSION = "0.0.3";
|
|
500
539
|
|
|
501
540
|
// src/transport.ts
|
|
502
541
|
var REQUEST_TIMEOUT_MS = 8e3;
|
|
@@ -518,7 +557,8 @@ function sendEvent(config, payload) {
|
|
|
518
557
|
session_id: state.sessionId,
|
|
519
558
|
device_id: state.deviceId,
|
|
520
559
|
user_id: state.user?.id,
|
|
521
|
-
user_email: state.user?.email
|
|
560
|
+
user_email: state.user?.email,
|
|
561
|
+
breadcrumbs: getBreadcrumbs()
|
|
522
562
|
},
|
|
523
563
|
synthetic: payload.synthetic
|
|
524
564
|
};
|
|
@@ -669,6 +709,36 @@ function safeJson(v) {
|
|
|
669
709
|
}
|
|
670
710
|
|
|
671
711
|
// src/console.ts
|
|
712
|
+
function patchConsoleForBreadcrumbs() {
|
|
713
|
+
const originals = {
|
|
714
|
+
log: console.log.bind(console),
|
|
715
|
+
info: console.info.bind(console),
|
|
716
|
+
warn: console.warn.bind(console),
|
|
717
|
+
error: console.error.bind(console)
|
|
718
|
+
};
|
|
719
|
+
console.log = (...args) => {
|
|
720
|
+
pushBreadcrumb("log", args);
|
|
721
|
+
return originals.log(...args);
|
|
722
|
+
};
|
|
723
|
+
console.info = (...args) => {
|
|
724
|
+
pushBreadcrumb("info", args);
|
|
725
|
+
return originals.info(...args);
|
|
726
|
+
};
|
|
727
|
+
console.warn = (...args) => {
|
|
728
|
+
pushBreadcrumb("warn", args);
|
|
729
|
+
return originals.warn(...args);
|
|
730
|
+
};
|
|
731
|
+
console.error = (...args) => {
|
|
732
|
+
pushBreadcrumb("error", args);
|
|
733
|
+
return originals.error(...args);
|
|
734
|
+
};
|
|
735
|
+
return () => {
|
|
736
|
+
console.log = originals.log;
|
|
737
|
+
console.info = originals.info;
|
|
738
|
+
console.warn = originals.warn;
|
|
739
|
+
console.error = originals.error;
|
|
740
|
+
};
|
|
741
|
+
}
|
|
672
742
|
function shouldCapture(args, patterns) {
|
|
673
743
|
if (patterns.length === 0) return true;
|
|
674
744
|
const first = typeof args[0] === "string" ? args[0] : "";
|
|
@@ -771,6 +841,7 @@ function initFixPrompt(opts) {
|
|
|
771
841
|
const config = resolveConfig(opts);
|
|
772
842
|
state.config = config;
|
|
773
843
|
state.sessionId = newSessionId();
|
|
844
|
+
state.cleanup.restoreBreadcrumbConsole = patchConsoleForBreadcrumbs();
|
|
774
845
|
state.cleanup.removeErrorHandler = installGlobalErrorHandler(config);
|
|
775
846
|
state.cleanup.removeRejectionHandler = installRejectionHandler(config);
|
|
776
847
|
if (config.patchConsoleError) {
|
|
@@ -833,16 +904,18 @@ function setUser(user) {
|
|
|
833
904
|
}
|
|
834
905
|
function _resetForTests() {
|
|
835
906
|
const state = getState();
|
|
836
|
-
state.cleanup.removeErrorHandler?.();
|
|
837
|
-
state.cleanup.removeRejectionHandler?.();
|
|
838
907
|
state.cleanup.restoreConsoleError?.();
|
|
839
908
|
state.cleanup.restoreConsoleWarn?.();
|
|
909
|
+
state.cleanup.restoreBreadcrumbConsole?.();
|
|
910
|
+
state.cleanup.removeErrorHandler?.();
|
|
911
|
+
state.cleanup.removeRejectionHandler?.();
|
|
840
912
|
state.initialized = false;
|
|
841
913
|
state.config = null;
|
|
842
914
|
state.sessionId = null;
|
|
843
915
|
state.deviceId = null;
|
|
844
916
|
state.user = null;
|
|
845
917
|
state.cleanup = {};
|
|
918
|
+
clearBreadcrumbs();
|
|
846
919
|
}
|
|
847
920
|
// Annotate the CommonJS export names for ESM import in node:
|
|
848
921
|
0 && (module.exports = {
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../node_modules/promise/setimmediate/core.js","../node_modules/promise/setimmediate/rejection-tracking.js","../src/index.ts","../src/state.ts","../src/session.ts","../src/buffer.ts","../src/device.ts","../src/version.ts","../src/transport.ts","../src/handlers.ts","../src/console.ts","../src/init.ts"],"sourcesContent":["'use strict';\n\n\n\nfunction noop() {}\n\n// States:\n//\n// 0 - pending\n// 1 - fulfilled with _value\n// 2 - rejected with _value\n// 3 - adopted the state of another promise, _value\n//\n// once the state is no longer pending (0) it is immutable\n\n// All `_` prefixed properties will be reduced to `_{random number}`\n// at build time to obfuscate them and discourage their use.\n// We don't use symbols or Object.defineProperty to fully hide them\n// because the performance isn't good enough.\n\n\n// to avoid using try/catch inside critical functions, we\n// extract them to here.\nvar LAST_ERROR = null;\nvar IS_ERROR = {};\nfunction getThen(obj) {\n try {\n return obj.then;\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\n\nfunction tryCallOne(fn, a) {\n try {\n return fn(a);\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\nfunction tryCallTwo(fn, a, b) {\n try {\n fn(a, b);\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\n\nmodule.exports = Promise;\n\nfunction Promise(fn) {\n if (typeof this !== 'object') {\n throw new TypeError('Promises must be constructed via new');\n }\n if (typeof fn !== 'function') {\n throw new TypeError('Promise constructor\\'s argument is not a function');\n }\n this._x = 0;\n this._y = 0;\n this._z = null;\n this._A = null;\n if (fn === noop) return;\n doResolve(fn, this);\n}\nPromise._B = null;\nPromise._C = null;\nPromise._D = noop;\n\nPromise.prototype.then = function(onFulfilled, onRejected) {\n if (this.constructor !== Promise) {\n return safeThen(this, onFulfilled, onRejected);\n }\n var res = new Promise(noop);\n handle(this, new Handler(onFulfilled, onRejected, res));\n return res;\n};\n\nfunction safeThen(self, onFulfilled, onRejected) {\n return new self.constructor(function (resolve, reject) {\n var res = new Promise(noop);\n res.then(resolve, reject);\n handle(self, new Handler(onFulfilled, onRejected, res));\n });\n}\nfunction handle(self, deferred) {\n while (self._y === 3) {\n self = self._z;\n }\n if (Promise._B) {\n Promise._B(self);\n }\n if (self._y === 0) {\n if (self._x === 0) {\n self._x = 1;\n self._A = deferred;\n return;\n }\n if (self._x === 1) {\n self._x = 2;\n self._A = [self._A, deferred];\n return;\n }\n self._A.push(deferred);\n return;\n }\n handleResolved(self, deferred);\n}\n\nfunction handleResolved(self, deferred) {\n setImmediate(function() {\n var cb = self._y === 1 ? deferred.onFulfilled : deferred.onRejected;\n if (cb === null) {\n if (self._y === 1) {\n resolve(deferred.promise, self._z);\n } else {\n reject(deferred.promise, self._z);\n }\n return;\n }\n var ret = tryCallOne(cb, self._z);\n if (ret === IS_ERROR) {\n reject(deferred.promise, LAST_ERROR);\n } else {\n resolve(deferred.promise, ret);\n }\n });\n}\nfunction resolve(self, newValue) {\n // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n if (newValue === self) {\n return reject(\n self,\n new TypeError('A promise cannot be resolved with itself.')\n );\n }\n if (\n newValue &&\n (typeof newValue === 'object' || typeof newValue === 'function')\n ) {\n var then = getThen(newValue);\n if (then === IS_ERROR) {\n return reject(self, LAST_ERROR);\n }\n if (\n then === self.then &&\n newValue instanceof Promise\n ) {\n self._y = 3;\n self._z = newValue;\n finale(self);\n return;\n } else if (typeof then === 'function') {\n doResolve(then.bind(newValue), self);\n return;\n }\n }\n self._y = 1;\n self._z = newValue;\n finale(self);\n}\n\nfunction reject(self, newValue) {\n self._y = 2;\n self._z = newValue;\n if (Promise._C) {\n Promise._C(self, newValue);\n }\n finale(self);\n}\nfunction finale(self) {\n if (self._x === 1) {\n handle(self, self._A);\n self._A = null;\n }\n if (self._x === 2) {\n for (var i = 0; i < self._A.length; i++) {\n handle(self, self._A[i]);\n }\n self._A = null;\n }\n}\n\nfunction Handler(onFulfilled, onRejected, promise){\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.promise = promise;\n}\n\n/**\n * Take a potentially misbehaving resolver function and make sure\n * onFulfilled and onRejected are only called once.\n *\n * Makes no guarantees about asynchrony.\n */\nfunction doResolve(fn, promise) {\n var done = false;\n var res = tryCallTwo(fn, function (value) {\n if (done) return;\n done = true;\n resolve(promise, value);\n }, function (reason) {\n if (done) return;\n done = true;\n reject(promise, reason);\n });\n if (!done && res === IS_ERROR) {\n done = true;\n reject(promise, LAST_ERROR);\n }\n}\n","'use strict';\n\nvar Promise = require('./core');\n\nvar DEFAULT_WHITELIST = [\n ReferenceError,\n TypeError,\n RangeError\n];\n\nvar enabled = false;\nexports.disable = disable;\nfunction disable() {\n enabled = false;\n Promise._B = null;\n Promise._C = null;\n}\n\nexports.enable = enable;\nfunction enable(options) {\n options = options || {};\n if (enabled) disable();\n enabled = true;\n var id = 0;\n var displayId = 0;\n var rejections = {};\n Promise._B = function (promise) {\n if (\n promise._y === 2 && // IS REJECTED\n rejections[promise._E]\n ) {\n if (rejections[promise._E].logged) {\n onHandled(promise._E);\n } else {\n clearTimeout(rejections[promise._E].timeout);\n }\n delete rejections[promise._E];\n }\n };\n Promise._C = function (promise, err) {\n if (promise._x === 0) { // not yet handled\n promise._E = id++;\n rejections[promise._E] = {\n displayId: null,\n error: err,\n timeout: setTimeout(\n onUnhandled.bind(null, promise._E),\n // For reference errors and type errors, this almost always\n // means the programmer made a mistake, so log them after just\n // 100ms\n // otherwise, wait 2 seconds to see if they get handled\n matchWhitelist(err, DEFAULT_WHITELIST)\n ? 100\n : 2000\n ),\n logged: false\n };\n }\n };\n function onUnhandled(id) {\n if (\n options.allRejections ||\n matchWhitelist(\n rejections[id].error,\n options.whitelist || DEFAULT_WHITELIST\n )\n ) {\n rejections[id].displayId = displayId++;\n if (options.onUnhandled) {\n rejections[id].logged = true;\n options.onUnhandled(\n rejections[id].displayId,\n rejections[id].error\n );\n } else {\n rejections[id].logged = true;\n logError(\n rejections[id].displayId,\n rejections[id].error\n );\n }\n }\n }\n function onHandled(id) {\n if (rejections[id].logged) {\n if (options.onHandled) {\n options.onHandled(rejections[id].displayId, rejections[id].error);\n } else if (!rejections[id].onUnhandled) {\n console.warn(\n 'Promise Rejection Handled (id: ' + rejections[id].displayId + '):'\n );\n console.warn(\n ' This means you can ignore any previous messages of the form \"Possible Unhandled Promise Rejection\" with id ' +\n rejections[id].displayId + '.'\n );\n }\n }\n }\n}\n\nfunction logError(id, error) {\n console.warn('Possible Unhandled Promise Rejection (id: ' + id + '):');\n var errStr = (error && (error.stack || error)) + '';\n errStr.split('\\n').forEach(function (line) {\n console.warn(' ' + line);\n });\n}\n\nfunction matchWhitelist(error, list) {\n return list.some(function (cls) {\n return error instanceof cls;\n });\n}","export { initFixPrompt, captureException, setUser, _resetForTests } from './init';\nexport type {\n InitOptions,\n ResolvedConfig,\n EventPayload,\n Severity,\n LogLevel,\n} from './types';\nexport { SDK_NAME, SDK_VERSION } from './version';\n","import type { ResolvedConfig } from './types';\n\nexport interface UserContext {\n id?: string;\n email?: string;\n [k: string]: any;\n}\n\ninterface CleanupHooks {\n removeErrorHandler?: () => void;\n removeRejectionHandler?: () => void;\n restoreConsoleError?: () => void;\n restoreConsoleWarn?: () => void;\n}\n\ninterface SdkState {\n initialized: boolean;\n config: ResolvedConfig | null;\n sessionId: string | null;\n deviceId: string | null;\n user: UserContext | null;\n cleanup: CleanupHooks;\n}\n\nconst STATE_KEY = '__fixprompt_rn_state__';\n\nfunction globalScope(): any {\n if (typeof globalThis !== 'undefined') return globalThis;\n return {};\n}\n\nexport function getState(): SdkState {\n const g = globalScope();\n if (!g[STATE_KEY]) {\n g[STATE_KEY] = {\n initialized: false,\n config: null,\n sessionId: null,\n deviceId: null,\n user: null,\n cleanup: {},\n } satisfies SdkState;\n }\n return g[STATE_KEY] as SdkState;\n}\n\nexport function resetStateForTests(): void {\n const g = globalScope();\n delete g[STATE_KEY];\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\n\nconst DEVICE_KEY = '@fixprompt/device_id';\n\nfunction uuid(): string {\n if (typeof globalThis.crypto?.randomUUID === 'function') {\n return globalThis.crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * One uuid per cold start. Lives in memory; resets when the app restarts.\n */\nexport function newSessionId(): string {\n return uuid();\n}\n\n/**\n * Stable per-device uuid. Tries expo-secure-store first (keychain-backed),\n * falls back to AsyncStorage. Generated lazily on first call.\n *\n * We deliberately don't use OS-provided device IDs (IDFV/Android ID) —\n * Apple flags them on review and they reset on reinstall anyway.\n */\nexport async function getDeviceId(): Promise<string> {\n // Optional expo-secure-store path\n try {\n // dynamic import so we don't crash when SecureStore isn't installed\n const SecureStore = await tryImport<any>('expo-secure-store');\n if (SecureStore) {\n const existing = await SecureStore.getItemAsync('fixprompt_device_id');\n if (existing) return existing;\n const fresh = uuid();\n await SecureStore.setItemAsync('fixprompt_device_id', fresh);\n return fresh;\n }\n } catch {\n // ignore — fall through to AsyncStorage\n }\n\n try {\n const existing = await AsyncStorage.getItem(DEVICE_KEY);\n if (existing) return existing;\n const fresh = uuid();\n await AsyncStorage.setItem(DEVICE_KEY, fresh);\n return fresh;\n } catch {\n // Final fallback — in-memory only (lost on reinstall)\n return uuid();\n }\n}\n\nasync function tryImport<T>(spec: string): Promise<T | null> {\n try {\n // require keeps Metro bundler quiet when the package isn't installed\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require(spec) as T;\n } catch {\n return null;\n }\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport type { EventPayload } from './types';\n\nconst STORAGE_KEY = '@fixprompt/buffer';\nconst MAX_BUFFER = 200;\nconst MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n\ninterface BufferedEvent {\n ts: number;\n payload: EventPayload;\n}\n\n/**\n * In-memory ring buffer with AsyncStorage persistence.\n *\n * Events accumulate when the broker is unreachable (network error / 5xx /\n * timeout). On the next successful send, the whole buffer drains in order.\n * On cold start, any persisted buffer from a prior crash is replayed.\n */\nclass OfflineBuffer {\n private items: BufferedEvent[] = [];\n private loaded = false;\n private persistTimer: ReturnType<typeof setTimeout> | null = null;\n\n /** Load the persisted buffer once, on first use. */\n async load(): Promise<void> {\n if (this.loaded) return;\n this.loaded = true;\n try {\n const raw = await AsyncStorage.getItem(STORAGE_KEY);\n if (!raw) return;\n const parsed = JSON.parse(raw) as BufferedEvent[];\n const cutoff = Date.now() - MAX_AGE_MS;\n this.items = parsed.filter((e) => e?.ts > cutoff).slice(-MAX_BUFFER);\n } catch {\n this.items = [];\n }\n }\n\n push(payload: EventPayload): void {\n this.items.push({ ts: Date.now(), payload });\n if (this.items.length > MAX_BUFFER) this.items.shift();\n this.schedulePersist();\n }\n\n async drain(): Promise<EventPayload[]> {\n if (!this.loaded) await this.load();\n const out = this.items.map((e) => e.payload);\n this.items = [];\n this.schedulePersist();\n return out;\n }\n\n size(): number {\n return this.items.length;\n }\n\n private schedulePersist() {\n if (this.persistTimer) return;\n this.persistTimer = setTimeout(async () => {\n this.persistTimer = null;\n try {\n await AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(this.items));\n } catch {\n // swallow — buffer survives in memory at least\n }\n }, 500);\n }\n\n /** Tests only. */\n _resetForTests(): void {\n this.items = [];\n this.loaded = false;\n if (this.persistTimer) {\n clearTimeout(this.persistTimer);\n this.persistTimer = null;\n }\n }\n}\n\nexport const offlineBuffer = new OfflineBuffer();\n","import { Platform } from 'react-native';\n\nexport interface DeviceAttrs {\n platform: string; // 'ios' | 'android' | 'web' | 'windows' | 'macos'\n os_version: string;\n /** RN runtime version (Hermes / JSC). Used for triage. */\n rn_version?: string;\n\n /** App version (e.g. \"1.2.3\") from expo-constants or native build. */\n app_version?: string;\n /** Build number (CFBundleVersion / versionCode) from expo-constants. */\n build_number?: string;\n\n /** OTA bundle id (Updates.updateId) from expo-updates, if active. */\n ota_id?: string;\n /** OTA runtime version (Updates.runtimeVersion) from expo-updates. */\n runtime_version?: string;\n /** OTA channel (Updates.channel) — e.g. \"production\", \"preview\". */\n ota_channel?: string;\n}\n\nfunction tryRequire<T = any>(spec: string): T | null {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require(spec) as T;\n } catch {\n return null;\n }\n}\n\n// Cache at module load. Both packages are optional peer deps — bare RN\n// (or sideloaded Expo) projects without them get the basic platform attrs.\nconst ConstantsMod: any = tryRequire('expo-constants');\nconst Constants: any = ConstantsMod?.default ?? ConstantsMod ?? null;\nconst Updates: any = tryRequire('expo-updates');\n\nexport function getDeviceAttrs(): DeviceAttrs {\n const attrs: DeviceAttrs = {\n platform: String(Platform.OS),\n os_version: String((Platform as any).Version ?? 'unknown'),\n rn_version: (Platform as any).constants?.reactNativeVersion\n ? Object.values((Platform as any).constants.reactNativeVersion).join('.')\n : undefined,\n };\n\n // expo-constants: app version + native build number\n if (Constants) {\n const cfg = Constants.expoConfig ?? Constants.manifest ?? null;\n if (cfg?.version) attrs.app_version = String(cfg.version);\n if (cfg?.ios?.buildNumber) {\n attrs.build_number = String(cfg.ios.buildNumber);\n } else if (cfg?.android?.versionCode != null) {\n attrs.build_number = String(cfg.android.versionCode);\n }\n // Fall back to native values when running on a binary build\n if (!attrs.app_version && Constants.nativeAppVersion) {\n attrs.app_version = String(Constants.nativeAppVersion);\n }\n if (!attrs.build_number && Constants.nativeBuildVersion) {\n attrs.build_number = String(Constants.nativeBuildVersion);\n }\n }\n\n // expo-updates: OTA bundle id + channel\n if (Updates) {\n if (Updates.updateId) attrs.ota_id = String(Updates.updateId);\n if (Updates.runtimeVersion) attrs.runtime_version = String(Updates.runtimeVersion);\n if (Updates.channel) attrs.ota_channel = String(Updates.channel);\n }\n\n return attrs;\n}\n","export const SDK_NAME = '@fixprompt/react-native';\nexport const SDK_VERSION = '0.0.2';\n","import type { EventPayload, ResolvedConfig } from './types';\nimport { offlineBuffer } from './buffer';\nimport { getState } from './state';\nimport { getDeviceAttrs } from './device';\nimport { SDK_NAME, SDK_VERSION } from './version';\n\nconst REQUEST_TIMEOUT_MS = 8_000;\n\n/**\n * Sends one event. On network failure (timeout / 5xx / no-network) the event\n * gets buffered; the buffer drains on the next successful send.\n *\n * Never throws — RN apps don't want their event loop killed by a logger.\n */\nexport function sendEvent(\n config: ResolvedConfig,\n payload: Omit<EventPayload, 'service' | 'app' | 'env' | 'attrs'> & {\n attrs?: Record<string, any>;\n service?: string;\n app?: string;\n env?: string;\n },\n): void {\n const state = getState();\n\n const event: EventPayload = {\n service: payload.service ?? config.service,\n app: payload.app ?? config.app,\n env: payload.env ?? config.env,\n level: payload.level,\n message: payload.message,\n stack: payload.stack,\n attrs: {\n ...(payload.attrs ?? {}),\n ...getDeviceAttrs(),\n sdk: SDK_NAME,\n sdk_version: SDK_VERSION,\n release: config.release,\n session_id: state.sessionId,\n device_id: state.deviceId,\n user_id: state.user?.id,\n user_email: state.user?.email,\n },\n synthetic: payload.synthetic,\n };\n\n // Strip undefined attrs (broker accepts strings/numbers, not nulls/undef)\n for (const k of Object.keys(event.attrs)) {\n if (event.attrs[k] === undefined || event.attrs[k] === null) {\n delete event.attrs[k];\n }\n }\n\n void postOrBuffer(config, event);\n}\n\nasync function postOrBuffer(\n config: ResolvedConfig,\n event: EventPayload,\n): Promise<void> {\n // Always drain the buffer first so order is preserved.\n if (!(await tryPost(config, event, /* throwOnFail */ true))) {\n offlineBuffer.push(event);\n return;\n }\n\n // Successfully delivered this one — try to drain any backlog too.\n if (offlineBuffer.size() === 0) return;\n const queued = await offlineBuffer.drain();\n for (const buffered of queued) {\n if (!(await tryPost(config, buffered, true))) {\n // Re-buffer the rest including this one\n offlineBuffer.push(buffered);\n for (let i = queued.indexOf(buffered) + 1; i < queued.length; i++) {\n offlineBuffer.push(queued[i]);\n }\n return;\n }\n }\n}\n\nasync function tryPost(\n config: ResolvedConfig,\n event: EventPayload,\n throwOnFail: boolean,\n): Promise<boolean> {\n try {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), REQUEST_TIMEOUT_MS);\n try {\n const res = await fetch(`${config.endpoint.replace(/\\/$/, '')}/ingest/log`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-loghub-source': config.source,\n 'x-loghub-key': config.projectKey,\n },\n body: JSON.stringify(event),\n signal: ctrl.signal,\n });\n // 4xx → bug on our side; drop, don't buffer\n if (res.status >= 400 && res.status < 500) {\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.warn(`[fixprompt] ${res.status} from broker — dropping event`);\n }\n return true; // \"delivered\" in the sense that we won't re-try\n }\n return res.ok;\n } finally {\n clearTimeout(timer);\n }\n } catch (err) {\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.warn(`[fixprompt] transport error: ${(err as Error).message}`);\n }\n return false;\n }\n}\n","import { sendEvent } from './transport';\nimport type { ResolvedConfig } from './types';\n\n/**\n * Returns the project's user-code stack frame (skips node_modules and the\n * SDK itself). Falls back to the raw stack.\n */\nfunction topStackFrame(stack: string | undefined): string {\n if (!stack) return '';\n for (const raw of stack.split('\\n')) {\n const line = raw.trim();\n if (!line) continue;\n if (line.startsWith('Error')) continue;\n if (/node_modules|@fixprompt/.test(line)) continue;\n return line.slice(0, 200);\n }\n return stack.split('\\n')[0]?.slice(0, 200) ?? '';\n}\n\nexport function installGlobalErrorHandler(config: ResolvedConfig): () => void {\n // ErrorUtils is a React Native global; not present in plain Node tests.\n const ErrorUtils: any = (globalThis as any).ErrorUtils;\n if (!ErrorUtils?.setGlobalHandler) {\n return () => undefined;\n }\n\n const previous = ErrorUtils.getGlobalHandler?.();\n\n const handler = (error: Error, isFatal?: boolean) => {\n try {\n sendEvent(config, {\n level: isFatal ? 'error' : 'warn',\n message: error?.message ?? 'Uncaught error',\n stack: typeof error?.stack === 'string' ? error.stack : undefined,\n attrs: {\n kind: 'rn.globalError',\n severity: isFatal ? 'critical' : 'error',\n error_name: error?.name,\n top_frame: topStackFrame(error?.stack),\n fatal: !!isFatal,\n },\n });\n } catch {\n // never let logger crash propagate\n }\n previous?.(error, isFatal);\n };\n\n ErrorUtils.setGlobalHandler(handler);\n\n return () => {\n if (previous) ErrorUtils.setGlobalHandler(previous);\n };\n}\n\n/**\n * Hook unhandled-promise-rejection tracking. Uses the bundled\n * `promise/setimmediate/rejection-tracking` module that ships with RN.\n */\nexport function installRejectionHandler(config: ResolvedConfig): () => void {\n let tracking: any;\n try {\n // RN's bundled polyfill — present on every RN runtime.\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n tracking = require('promise/setimmediate/rejection-tracking');\n } catch {\n return () => undefined;\n }\n\n tracking.enable({\n allRejections: true,\n onUnhandled: (id: string, error: unknown) => {\n try {\n const isErr = error instanceof Error;\n sendEvent(config, {\n level: 'error',\n message: isErr ? error.message : safeJson(error),\n stack: isErr && typeof error.stack === 'string' ? error.stack : undefined,\n attrs: {\n kind: 'rn.unhandledrejection',\n severity: 'error',\n error_name: isErr ? error.name : typeof error,\n top_frame: isErr ? topStackFrame(error.stack) : '',\n },\n });\n } catch {\n // ignore\n }\n },\n onHandled: () => undefined,\n });\n\n return () => {\n try {\n tracking.disable();\n } catch {\n // ignore\n }\n };\n}\n\nfunction safeJson(v: unknown): string {\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n}\n","import { sendEvent } from './transport';\nimport type { ResolvedConfig } from './types';\n\nfunction shouldCapture(args: any[], patterns: RegExp[]): boolean {\n if (patterns.length === 0) return true; // empty list = capture everything\n const first = typeof args[0] === 'string' ? args[0] : '';\n return patterns.some((re) => re.test(first));\n}\n\nfunction stringify(args: any[]): { message: string; stack?: string } {\n const errArg = args.find((a) => a instanceof Error) as Error | undefined;\n const message = args\n .map((a) => {\n if (a instanceof Error) return a.message;\n if (typeof a === 'string') return a;\n try {\n return JSON.stringify(a);\n } catch {\n return String(a);\n }\n })\n .join(' ')\n .slice(0, 4000);\n return {\n message,\n stack: errArg && typeof errArg.stack === 'string' ? errArg.stack : undefined,\n };\n}\n\n/**\n * Wrap console.error so tagged calls forward to the broker as warning-severity\n * events. The original console.error still runs (so RedBox / Metro logs still\n * show up).\n *\n * Pattern is intentional — ProofPix's existing log lines look like\n * `console.error('[Analytics] tracking failure', err)`. Devs prefix their\n * intentional captures and the broker only sees tagged ones.\n */\nexport function patchConsoleError(config: ResolvedConfig): () => void {\n const original = console.error.bind(console);\n console.error = (...args: any[]) => {\n try {\n if (shouldCapture(args, config.captureTags)) {\n const { message, stack } = stringify(args);\n sendEvent(config, {\n level: 'warn',\n message,\n stack,\n attrs: {\n kind: 'console.error',\n severity: 'warning',\n },\n });\n }\n } catch {\n // never block user logs\n }\n return original(...args);\n };\n return () => {\n console.error = original;\n };\n}\n\nexport function patchConsoleWarn(config: ResolvedConfig): () => void {\n const original = console.warn.bind(console);\n console.warn = (...args: any[]) => {\n try {\n if (shouldCapture(args, config.captureTags)) {\n const { message, stack } = stringify(args);\n sendEvent(config, {\n level: 'warn',\n message,\n stack,\n attrs: {\n kind: 'console.warn',\n severity: 'warning',\n },\n });\n }\n } catch {\n // never block\n }\n return original(...args);\n };\n return () => {\n console.warn = original;\n };\n}\n","import { getState, type UserContext } from './state';\nimport { newSessionId, getDeviceId } from './session';\nimport { installGlobalErrorHandler, installRejectionHandler } from './handlers';\nimport { patchConsoleError, patchConsoleWarn } from './console';\nimport { sendEvent } from './transport';\nimport { offlineBuffer } from './buffer';\nimport type { InitOptions, ResolvedConfig } from './types';\n\nconst DEFAULT_ENDPOINT = 'https://geosloghub-production.up.railway.app';\n\nfunction resolveConfig(opts: InitOptions): ResolvedConfig {\n if (!opts?.projectKey) throw new Error('initFixPrompt: projectKey is required');\n if (!opts?.source) throw new Error('initFixPrompt: source is required');\n if (!opts?.service) throw new Error('initFixPrompt: service is required');\n if (!opts?.app) throw new Error('initFixPrompt: app is required');\n\n return {\n projectKey: opts.projectKey,\n source: opts.source,\n endpoint: (opts.endpoint ?? DEFAULT_ENDPOINT).replace(/\\/$/, ''),\n service: opts.service,\n app: opts.app,\n env: opts.env ?? 'prod',\n release: opts.release ?? null,\n captureTags: opts.captureTags ?? [],\n patchConsoleWarn: opts.patchConsoleWarn ?? false,\n patchConsoleError: opts.patchConsoleError ?? true,\n debug: opts.debug ?? false,\n };\n}\n\nexport function initFixPrompt(opts: InitOptions): void {\n const state = getState();\n if (state.initialized) {\n if (opts?.debug) {\n // eslint-disable-next-line no-console\n console.warn('[fixprompt] already initialized — call ignored');\n }\n return;\n }\n\n const config = resolveConfig(opts);\n state.config = config;\n state.sessionId = newSessionId();\n\n state.cleanup.removeErrorHandler = installGlobalErrorHandler(config);\n state.cleanup.removeRejectionHandler = installRejectionHandler(config);\n if (config.patchConsoleError) {\n state.cleanup.restoreConsoleError = patchConsoleError(config);\n }\n if (config.patchConsoleWarn) {\n state.cleanup.restoreConsoleWarn = patchConsoleWarn(config);\n }\n\n state.initialized = true;\n\n // Resolve device id + drain any pre-init buffer, async.\n void (async () => {\n try {\n state.deviceId = await getDeviceId();\n await offlineBuffer.load();\n if (offlineBuffer.size() > 0) {\n // Triggers a drain via the transport's natural retry path.\n const items = await offlineBuffer.drain();\n for (const ev of items) {\n // Re-buffer if delivery still fails — transport handles it\n offlineBuffer.push(ev);\n }\n // Kick a drain attempt\n sendEvent(config, {\n level: 'debug',\n message: '[fixprompt] resumed from offline buffer',\n attrs: { kind: 'sdk.startup', buffered: items.length },\n });\n }\n } catch (err) {\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.warn(`[fixprompt] init async setup failed: ${(err as Error).message}`);\n }\n }\n })();\n\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.log('[fixprompt] initialized', {\n endpoint: config.endpoint,\n service: config.service,\n env: config.env,\n session_id: state.sessionId,\n });\n }\n}\n\nexport function captureException(\n err: unknown,\n options: { synthetic?: boolean; attrs?: Record<string, any> } = {},\n): void {\n const state = getState();\n if (!state.initialized || !state.config) return;\n const isErr = err instanceof Error;\n sendEvent(state.config, {\n level: 'error',\n message: isErr ? err.message : String(err),\n stack: isErr && typeof err.stack === 'string' ? err.stack : undefined,\n attrs: {\n kind: 'captureException',\n severity: 'error',\n error_name: isErr ? err.name : typeof err,\n ...(options.attrs ?? {}),\n },\n synthetic: options.synthetic === true,\n });\n}\n\nexport function setUser(user: UserContext | null): void {\n const state = getState();\n state.user = user;\n}\n\n/** Tests + HMR only. Not part of the supported API. @internal */\nexport function _resetForTests(): void {\n const state = getState();\n state.cleanup.removeErrorHandler?.();\n state.cleanup.removeRejectionHandler?.();\n state.cleanup.restoreConsoleError?.();\n state.cleanup.restoreConsoleWarn?.();\n state.initialized = false;\n state.config = null;\n state.sessionId = null;\n state.deviceId = null;\n state.user = null;\n state.cleanup = {};\n}\n"],"mappings":"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","names":["exports","module","Promise","resolve","reject","exports","Promise","id","AsyncStorage","import_async_storage","AsyncStorage"]}
|
|
1
|
+
{"version":3,"sources":["../node_modules/promise/setimmediate/core.js","../node_modules/promise/setimmediate/rejection-tracking.js","../src/index.ts","../src/state.ts","../src/session.ts","../src/buffer.ts","../src/device.ts","../src/breadcrumbs.ts","../src/version.ts","../src/transport.ts","../src/handlers.ts","../src/console.ts","../src/init.ts"],"sourcesContent":["'use strict';\n\n\n\nfunction noop() {}\n\n// States:\n//\n// 0 - pending\n// 1 - fulfilled with _value\n// 2 - rejected with _value\n// 3 - adopted the state of another promise, _value\n//\n// once the state is no longer pending (0) it is immutable\n\n// All `_` prefixed properties will be reduced to `_{random number}`\n// at build time to obfuscate them and discourage their use.\n// We don't use symbols or Object.defineProperty to fully hide them\n// because the performance isn't good enough.\n\n\n// to avoid using try/catch inside critical functions, we\n// extract them to here.\nvar LAST_ERROR = null;\nvar IS_ERROR = {};\nfunction getThen(obj) {\n try {\n return obj.then;\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\n\nfunction tryCallOne(fn, a) {\n try {\n return fn(a);\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\nfunction tryCallTwo(fn, a, b) {\n try {\n fn(a, b);\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\n\nmodule.exports = Promise;\n\nfunction Promise(fn) {\n if (typeof this !== 'object') {\n throw new TypeError('Promises must be constructed via new');\n }\n if (typeof fn !== 'function') {\n throw new TypeError('Promise constructor\\'s argument is not a function');\n }\n this._x = 0;\n this._y = 0;\n this._z = null;\n this._A = null;\n if (fn === noop) return;\n doResolve(fn, this);\n}\nPromise._B = null;\nPromise._C = null;\nPromise._D = noop;\n\nPromise.prototype.then = function(onFulfilled, onRejected) {\n if (this.constructor !== Promise) {\n return safeThen(this, onFulfilled, onRejected);\n }\n var res = new Promise(noop);\n handle(this, new Handler(onFulfilled, onRejected, res));\n return res;\n};\n\nfunction safeThen(self, onFulfilled, onRejected) {\n return new self.constructor(function (resolve, reject) {\n var res = new Promise(noop);\n res.then(resolve, reject);\n handle(self, new Handler(onFulfilled, onRejected, res));\n });\n}\nfunction handle(self, deferred) {\n while (self._y === 3) {\n self = self._z;\n }\n if (Promise._B) {\n Promise._B(self);\n }\n if (self._y === 0) {\n if (self._x === 0) {\n self._x = 1;\n self._A = deferred;\n return;\n }\n if (self._x === 1) {\n self._x = 2;\n self._A = [self._A, deferred];\n return;\n }\n self._A.push(deferred);\n return;\n }\n handleResolved(self, deferred);\n}\n\nfunction handleResolved(self, deferred) {\n setImmediate(function() {\n var cb = self._y === 1 ? deferred.onFulfilled : deferred.onRejected;\n if (cb === null) {\n if (self._y === 1) {\n resolve(deferred.promise, self._z);\n } else {\n reject(deferred.promise, self._z);\n }\n return;\n }\n var ret = tryCallOne(cb, self._z);\n if (ret === IS_ERROR) {\n reject(deferred.promise, LAST_ERROR);\n } else {\n resolve(deferred.promise, ret);\n }\n });\n}\nfunction resolve(self, newValue) {\n // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n if (newValue === self) {\n return reject(\n self,\n new TypeError('A promise cannot be resolved with itself.')\n );\n }\n if (\n newValue &&\n (typeof newValue === 'object' || typeof newValue === 'function')\n ) {\n var then = getThen(newValue);\n if (then === IS_ERROR) {\n return reject(self, LAST_ERROR);\n }\n if (\n then === self.then &&\n newValue instanceof Promise\n ) {\n self._y = 3;\n self._z = newValue;\n finale(self);\n return;\n } else if (typeof then === 'function') {\n doResolve(then.bind(newValue), self);\n return;\n }\n }\n self._y = 1;\n self._z = newValue;\n finale(self);\n}\n\nfunction reject(self, newValue) {\n self._y = 2;\n self._z = newValue;\n if (Promise._C) {\n Promise._C(self, newValue);\n }\n finale(self);\n}\nfunction finale(self) {\n if (self._x === 1) {\n handle(self, self._A);\n self._A = null;\n }\n if (self._x === 2) {\n for (var i = 0; i < self._A.length; i++) {\n handle(self, self._A[i]);\n }\n self._A = null;\n }\n}\n\nfunction Handler(onFulfilled, onRejected, promise){\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.promise = promise;\n}\n\n/**\n * Take a potentially misbehaving resolver function and make sure\n * onFulfilled and onRejected are only called once.\n *\n * Makes no guarantees about asynchrony.\n */\nfunction doResolve(fn, promise) {\n var done = false;\n var res = tryCallTwo(fn, function (value) {\n if (done) return;\n done = true;\n resolve(promise, value);\n }, function (reason) {\n if (done) return;\n done = true;\n reject(promise, reason);\n });\n if (!done && res === IS_ERROR) {\n done = true;\n reject(promise, LAST_ERROR);\n }\n}\n","'use strict';\n\nvar Promise = require('./core');\n\nvar DEFAULT_WHITELIST = [\n ReferenceError,\n TypeError,\n RangeError\n];\n\nvar enabled = false;\nexports.disable = disable;\nfunction disable() {\n enabled = false;\n Promise._B = null;\n Promise._C = null;\n}\n\nexports.enable = enable;\nfunction enable(options) {\n options = options || {};\n if (enabled) disable();\n enabled = true;\n var id = 0;\n var displayId = 0;\n var rejections = {};\n Promise._B = function (promise) {\n if (\n promise._y === 2 && // IS REJECTED\n rejections[promise._E]\n ) {\n if (rejections[promise._E].logged) {\n onHandled(promise._E);\n } else {\n clearTimeout(rejections[promise._E].timeout);\n }\n delete rejections[promise._E];\n }\n };\n Promise._C = function (promise, err) {\n if (promise._x === 0) { // not yet handled\n promise._E = id++;\n rejections[promise._E] = {\n displayId: null,\n error: err,\n timeout: setTimeout(\n onUnhandled.bind(null, promise._E),\n // For reference errors and type errors, this almost always\n // means the programmer made a mistake, so log them after just\n // 100ms\n // otherwise, wait 2 seconds to see if they get handled\n matchWhitelist(err, DEFAULT_WHITELIST)\n ? 100\n : 2000\n ),\n logged: false\n };\n }\n };\n function onUnhandled(id) {\n if (\n options.allRejections ||\n matchWhitelist(\n rejections[id].error,\n options.whitelist || DEFAULT_WHITELIST\n )\n ) {\n rejections[id].displayId = displayId++;\n if (options.onUnhandled) {\n rejections[id].logged = true;\n options.onUnhandled(\n rejections[id].displayId,\n rejections[id].error\n );\n } else {\n rejections[id].logged = true;\n logError(\n rejections[id].displayId,\n rejections[id].error\n );\n }\n }\n }\n function onHandled(id) {\n if (rejections[id].logged) {\n if (options.onHandled) {\n options.onHandled(rejections[id].displayId, rejections[id].error);\n } else if (!rejections[id].onUnhandled) {\n console.warn(\n 'Promise Rejection Handled (id: ' + rejections[id].displayId + '):'\n );\n console.warn(\n ' This means you can ignore any previous messages of the form \"Possible Unhandled Promise Rejection\" with id ' +\n rejections[id].displayId + '.'\n );\n }\n }\n }\n}\n\nfunction logError(id, error) {\n console.warn('Possible Unhandled Promise Rejection (id: ' + id + '):');\n var errStr = (error && (error.stack || error)) + '';\n errStr.split('\\n').forEach(function (line) {\n console.warn(' ' + line);\n });\n}\n\nfunction matchWhitelist(error, list) {\n return list.some(function (cls) {\n return error instanceof cls;\n });\n}","export { initFixPrompt, captureException, setUser, _resetForTests } from './init';\nexport type {\n InitOptions,\n ResolvedConfig,\n EventPayload,\n Severity,\n LogLevel,\n} from './types';\nexport { SDK_NAME, SDK_VERSION } from './version';\n","import type { ResolvedConfig } from './types';\n\nexport interface UserContext {\n id?: string;\n email?: string;\n [k: string]: any;\n}\n\ninterface CleanupHooks {\n removeErrorHandler?: () => void;\n removeRejectionHandler?: () => void;\n restoreConsoleError?: () => void;\n restoreConsoleWarn?: () => void;\n restoreBreadcrumbConsole?: () => void;\n}\n\ninterface SdkState {\n initialized: boolean;\n config: ResolvedConfig | null;\n sessionId: string | null;\n deviceId: string | null;\n user: UserContext | null;\n cleanup: CleanupHooks;\n}\n\nconst STATE_KEY = '__fixprompt_rn_state__';\n\nfunction globalScope(): any {\n if (typeof globalThis !== 'undefined') return globalThis;\n return {};\n}\n\nexport function getState(): SdkState {\n const g = globalScope();\n if (!g[STATE_KEY]) {\n g[STATE_KEY] = {\n initialized: false,\n config: null,\n sessionId: null,\n deviceId: null,\n user: null,\n cleanup: {},\n } satisfies SdkState;\n }\n return g[STATE_KEY] as SdkState;\n}\n\nexport function resetStateForTests(): void {\n const g = globalScope();\n delete g[STATE_KEY];\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\n\nconst DEVICE_KEY = '@fixprompt/device_id';\n\nfunction uuid(): string {\n if (typeof globalThis.crypto?.randomUUID === 'function') {\n return globalThis.crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * One uuid per cold start. Lives in memory; resets when the app restarts.\n */\nexport function newSessionId(): string {\n return uuid();\n}\n\n/**\n * Stable per-device uuid. Tries expo-secure-store first (keychain-backed),\n * falls back to AsyncStorage. Generated lazily on first call.\n *\n * We deliberately don't use OS-provided device IDs (IDFV/Android ID) —\n * Apple flags them on review and they reset on reinstall anyway.\n */\nexport async function getDeviceId(): Promise<string> {\n // Optional expo-secure-store path\n try {\n // dynamic import so we don't crash when SecureStore isn't installed\n const SecureStore = await tryImport<any>('expo-secure-store');\n if (SecureStore) {\n const existing = await SecureStore.getItemAsync('fixprompt_device_id');\n if (existing) return existing;\n const fresh = uuid();\n await SecureStore.setItemAsync('fixprompt_device_id', fresh);\n return fresh;\n }\n } catch {\n // ignore — fall through to AsyncStorage\n }\n\n try {\n const existing = await AsyncStorage.getItem(DEVICE_KEY);\n if (existing) return existing;\n const fresh = uuid();\n await AsyncStorage.setItem(DEVICE_KEY, fresh);\n return fresh;\n } catch {\n // Final fallback — in-memory only (lost on reinstall)\n return uuid();\n }\n}\n\nasync function tryImport<T>(spec: string): Promise<T | null> {\n try {\n // require keeps Metro bundler quiet when the package isn't installed\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require(spec) as T;\n } catch {\n return null;\n }\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport type { EventPayload } from './types';\n\nconst STORAGE_KEY = '@fixprompt/buffer';\nconst MAX_BUFFER = 200;\nconst MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n\ninterface BufferedEvent {\n ts: number;\n payload: EventPayload;\n}\n\n/**\n * In-memory ring buffer with AsyncStorage persistence.\n *\n * Events accumulate when the broker is unreachable (network error / 5xx /\n * timeout). On the next successful send, the whole buffer drains in order.\n * On cold start, any persisted buffer from a prior crash is replayed.\n */\nclass OfflineBuffer {\n private items: BufferedEvent[] = [];\n private loaded = false;\n private persistTimer: ReturnType<typeof setTimeout> | null = null;\n\n /** Load the persisted buffer once, on first use. */\n async load(): Promise<void> {\n if (this.loaded) return;\n this.loaded = true;\n try {\n const raw = await AsyncStorage.getItem(STORAGE_KEY);\n if (!raw) return;\n const parsed = JSON.parse(raw) as BufferedEvent[];\n const cutoff = Date.now() - MAX_AGE_MS;\n this.items = parsed.filter((e) => e?.ts > cutoff).slice(-MAX_BUFFER);\n } catch {\n this.items = [];\n }\n }\n\n push(payload: EventPayload): void {\n this.items.push({ ts: Date.now(), payload });\n if (this.items.length > MAX_BUFFER) this.items.shift();\n this.schedulePersist();\n }\n\n async drain(): Promise<EventPayload[]> {\n if (!this.loaded) await this.load();\n const out = this.items.map((e) => e.payload);\n this.items = [];\n this.schedulePersist();\n return out;\n }\n\n size(): number {\n return this.items.length;\n }\n\n private schedulePersist() {\n if (this.persistTimer) return;\n this.persistTimer = setTimeout(async () => {\n this.persistTimer = null;\n try {\n await AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(this.items));\n } catch {\n // swallow — buffer survives in memory at least\n }\n }, 500);\n }\n\n /** Tests only. */\n _resetForTests(): void {\n this.items = [];\n this.loaded = false;\n if (this.persistTimer) {\n clearTimeout(this.persistTimer);\n this.persistTimer = null;\n }\n }\n}\n\nexport const offlineBuffer = new OfflineBuffer();\n","import { Platform } from 'react-native';\n\nexport interface DeviceAttrs {\n platform: string; // 'ios' | 'android' | 'web' | 'windows' | 'macos'\n os_version: string;\n /** RN runtime version (Hermes / JSC). Used for triage. */\n rn_version?: string;\n\n /** App version (e.g. \"1.2.3\") from expo-constants or native build. */\n app_version?: string;\n /** Build number (CFBundleVersion / versionCode) from expo-constants. */\n build_number?: string;\n\n /** OTA bundle id (Updates.updateId) from expo-updates, if active. */\n ota_id?: string;\n /** OTA runtime version (Updates.runtimeVersion) from expo-updates. */\n runtime_version?: string;\n /** OTA channel (Updates.channel) — e.g. \"production\", \"preview\". */\n ota_channel?: string;\n}\n\nfunction tryRequire<T = any>(spec: string): T | null {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require(spec) as T;\n } catch {\n return null;\n }\n}\n\n// Cache at module load. Both packages are optional peer deps — bare RN\n// (or sideloaded Expo) projects without them get the basic platform attrs.\nconst ConstantsMod: any = tryRequire('expo-constants');\nconst Constants: any = ConstantsMod?.default ?? ConstantsMod ?? null;\nconst Updates: any = tryRequire('expo-updates');\n\nexport function getDeviceAttrs(): DeviceAttrs {\n const attrs: DeviceAttrs = {\n platform: String(Platform.OS),\n os_version: String((Platform as any).Version ?? 'unknown'),\n rn_version: (Platform as any).constants?.reactNativeVersion\n ? Object.values((Platform as any).constants.reactNativeVersion).join('.')\n : undefined,\n };\n\n // expo-constants: app version + native build number\n if (Constants) {\n const cfg = Constants.expoConfig ?? Constants.manifest ?? null;\n if (cfg?.version) attrs.app_version = String(cfg.version);\n if (cfg?.ios?.buildNumber) {\n attrs.build_number = String(cfg.ios.buildNumber);\n } else if (cfg?.android?.versionCode != null) {\n attrs.build_number = String(cfg.android.versionCode);\n }\n // Fall back to native values when running on a binary build\n if (!attrs.app_version && Constants.nativeAppVersion) {\n attrs.app_version = String(Constants.nativeAppVersion);\n }\n if (!attrs.build_number && Constants.nativeBuildVersion) {\n attrs.build_number = String(Constants.nativeBuildVersion);\n }\n }\n\n // expo-updates: OTA bundle id + channel\n if (Updates) {\n if (Updates.updateId) attrs.ota_id = String(Updates.updateId);\n if (Updates.runtimeVersion) attrs.runtime_version = String(Updates.runtimeVersion);\n if (Updates.channel) attrs.ota_channel = String(Updates.channel);\n }\n\n return attrs;\n}\n","/**\n * In-memory ring buffer of the most recent console log lines.\n *\n * NEVER streamed to Loki on its own (would balloon volume + cost). Every\n * outgoing event attaches the current buffer as `attrs.breadcrumbs`, giving\n * the broker the lines that ran in the seconds before the error fired.\n *\n * That context is what the Fix Prompt template surfaces to Cursor/Claude\n * — \"this error happened, and HERE'S WHAT THE APP WAS DOING right before\n * it.\" Without it, the AI just sees a stack trace with no surrounding state.\n */\n\nconst MAX_BREADCRUMBS = 50;\nconst MAX_MESSAGE_CHARS = 500;\n\nexport interface Breadcrumb {\n /** Wall-clock ms timestamp. */\n ts: number;\n /** One of the four console levels (log / info / warn / error). */\n level: 'log' | 'info' | 'warn' | 'error';\n /** Stringified console args, capped at 500 chars. */\n message: string;\n}\n\nconst buffer: Breadcrumb[] = [];\n\nexport function pushBreadcrumb(level: Breadcrumb['level'], args: any[]): void {\n try {\n const message = stringifyArgs(args);\n buffer.push({ ts: Date.now(), level, message });\n if (buffer.length > MAX_BREADCRUMBS) buffer.shift();\n } catch {\n // never let breadcrumb collection crash user code\n }\n}\n\nexport function getBreadcrumbs(): Breadcrumb[] {\n return [...buffer];\n}\n\nexport function clearBreadcrumbs(): void {\n buffer.length = 0;\n}\n\nfunction stringifyArgs(args: any[]): string {\n const parts: string[] = [];\n for (const a of args) {\n if (a instanceof Error) {\n parts.push(`${a.name}: ${a.message}`);\n } else if (typeof a === 'string') {\n parts.push(a);\n } else if (a == null) {\n parts.push(String(a));\n } else {\n try {\n parts.push(JSON.stringify(a));\n } catch {\n parts.push(String(a));\n }\n }\n }\n const joined = parts.join(' ');\n return joined.length > MAX_MESSAGE_CHARS\n ? joined.slice(0, MAX_MESSAGE_CHARS) + '…'\n : joined;\n}\n","export const SDK_NAME = '@fixprompt/react-native';\nexport const SDK_VERSION = '0.0.3';\n","import type { EventPayload, ResolvedConfig } from './types';\nimport { offlineBuffer } from './buffer';\nimport { getState } from './state';\nimport { getDeviceAttrs } from './device';\nimport { getBreadcrumbs } from './breadcrumbs';\nimport { SDK_NAME, SDK_VERSION } from './version';\n\nconst REQUEST_TIMEOUT_MS = 8_000;\n\n/**\n * Sends one event. On network failure (timeout / 5xx / no-network) the event\n * gets buffered; the buffer drains on the next successful send.\n *\n * Never throws — RN apps don't want their event loop killed by a logger.\n */\nexport function sendEvent(\n config: ResolvedConfig,\n payload: Omit<EventPayload, 'service' | 'app' | 'env' | 'attrs'> & {\n attrs?: Record<string, any>;\n service?: string;\n app?: string;\n env?: string;\n },\n): void {\n const state = getState();\n\n const event: EventPayload = {\n service: payload.service ?? config.service,\n app: payload.app ?? config.app,\n env: payload.env ?? config.env,\n level: payload.level,\n message: payload.message,\n stack: payload.stack,\n attrs: {\n ...(payload.attrs ?? {}),\n ...getDeviceAttrs(),\n sdk: SDK_NAME,\n sdk_version: SDK_VERSION,\n release: config.release,\n session_id: state.sessionId,\n device_id: state.deviceId,\n user_id: state.user?.id,\n user_email: state.user?.email,\n breadcrumbs: getBreadcrumbs(),\n },\n synthetic: payload.synthetic,\n };\n\n // Strip undefined attrs (broker accepts strings/numbers, not nulls/undef)\n for (const k of Object.keys(event.attrs)) {\n if (event.attrs[k] === undefined || event.attrs[k] === null) {\n delete event.attrs[k];\n }\n }\n\n void postOrBuffer(config, event);\n}\n\nasync function postOrBuffer(\n config: ResolvedConfig,\n event: EventPayload,\n): Promise<void> {\n // Always drain the buffer first so order is preserved.\n if (!(await tryPost(config, event, /* throwOnFail */ true))) {\n offlineBuffer.push(event);\n return;\n }\n\n // Successfully delivered this one — try to drain any backlog too.\n if (offlineBuffer.size() === 0) return;\n const queued = await offlineBuffer.drain();\n for (const buffered of queued) {\n if (!(await tryPost(config, buffered, true))) {\n // Re-buffer the rest including this one\n offlineBuffer.push(buffered);\n for (let i = queued.indexOf(buffered) + 1; i < queued.length; i++) {\n offlineBuffer.push(queued[i]);\n }\n return;\n }\n }\n}\n\nasync function tryPost(\n config: ResolvedConfig,\n event: EventPayload,\n throwOnFail: boolean,\n): Promise<boolean> {\n try {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), REQUEST_TIMEOUT_MS);\n try {\n const res = await fetch(`${config.endpoint.replace(/\\/$/, '')}/ingest/log`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-loghub-source': config.source,\n 'x-loghub-key': config.projectKey,\n },\n body: JSON.stringify(event),\n signal: ctrl.signal,\n });\n // 4xx → bug on our side; drop, don't buffer\n if (res.status >= 400 && res.status < 500) {\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.warn(`[fixprompt] ${res.status} from broker — dropping event`);\n }\n return true; // \"delivered\" in the sense that we won't re-try\n }\n return res.ok;\n } finally {\n clearTimeout(timer);\n }\n } catch (err) {\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.warn(`[fixprompt] transport error: ${(err as Error).message}`);\n }\n return false;\n }\n}\n","import { sendEvent } from './transport';\nimport type { ResolvedConfig } from './types';\n\n/**\n * Returns the project's user-code stack frame (skips node_modules and the\n * SDK itself). Falls back to the raw stack.\n */\nfunction topStackFrame(stack: string | undefined): string {\n if (!stack) return '';\n for (const raw of stack.split('\\n')) {\n const line = raw.trim();\n if (!line) continue;\n if (line.startsWith('Error')) continue;\n if (/node_modules|@fixprompt/.test(line)) continue;\n return line.slice(0, 200);\n }\n return stack.split('\\n')[0]?.slice(0, 200) ?? '';\n}\n\nexport function installGlobalErrorHandler(config: ResolvedConfig): () => void {\n // ErrorUtils is a React Native global; not present in plain Node tests.\n const ErrorUtils: any = (globalThis as any).ErrorUtils;\n if (!ErrorUtils?.setGlobalHandler) {\n return () => undefined;\n }\n\n const previous = ErrorUtils.getGlobalHandler?.();\n\n const handler = (error: Error, isFatal?: boolean) => {\n try {\n sendEvent(config, {\n level: isFatal ? 'error' : 'warn',\n message: error?.message ?? 'Uncaught error',\n stack: typeof error?.stack === 'string' ? error.stack : undefined,\n attrs: {\n kind: 'rn.globalError',\n severity: isFatal ? 'critical' : 'error',\n error_name: error?.name,\n top_frame: topStackFrame(error?.stack),\n fatal: !!isFatal,\n },\n });\n } catch {\n // never let logger crash propagate\n }\n previous?.(error, isFatal);\n };\n\n ErrorUtils.setGlobalHandler(handler);\n\n return () => {\n if (previous) ErrorUtils.setGlobalHandler(previous);\n };\n}\n\n/**\n * Hook unhandled-promise-rejection tracking. Uses the bundled\n * `promise/setimmediate/rejection-tracking` module that ships with RN.\n */\nexport function installRejectionHandler(config: ResolvedConfig): () => void {\n let tracking: any;\n try {\n // RN's bundled polyfill — present on every RN runtime.\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n tracking = require('promise/setimmediate/rejection-tracking');\n } catch {\n return () => undefined;\n }\n\n tracking.enable({\n allRejections: true,\n onUnhandled: (id: string, error: unknown) => {\n try {\n const isErr = error instanceof Error;\n sendEvent(config, {\n level: 'error',\n message: isErr ? error.message : safeJson(error),\n stack: isErr && typeof error.stack === 'string' ? error.stack : undefined,\n attrs: {\n kind: 'rn.unhandledrejection',\n severity: 'error',\n error_name: isErr ? error.name : typeof error,\n top_frame: isErr ? topStackFrame(error.stack) : '',\n },\n });\n } catch {\n // ignore\n }\n },\n onHandled: () => undefined,\n });\n\n return () => {\n try {\n tracking.disable();\n } catch {\n // ignore\n }\n };\n}\n\nfunction safeJson(v: unknown): string {\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n}\n","import { sendEvent } from './transport';\nimport { pushBreadcrumb } from './breadcrumbs';\nimport type { ResolvedConfig } from './types';\n\n/**\n * Patches all four console levels (log / info / warn / error) to push entries\n * into the breadcrumb ring buffer. Forwarding patches below are installed on\n * top of these — they snapshot the buffer BEFORE pushing the current call,\n * so the forwarded event sees the lines that ran before it.\n *\n * No-op-on-failure; never throws.\n */\nexport function patchConsoleForBreadcrumbs(): () => void {\n const originals = {\n log: console.log.bind(console),\n info: console.info.bind(console),\n warn: console.warn.bind(console),\n error: console.error.bind(console),\n };\n\n console.log = (...args: any[]) => {\n pushBreadcrumb('log', args);\n return originals.log(...args);\n };\n console.info = (...args: any[]) => {\n pushBreadcrumb('info', args);\n return originals.info(...args);\n };\n console.warn = (...args: any[]) => {\n pushBreadcrumb('warn', args);\n return originals.warn(...args);\n };\n console.error = (...args: any[]) => {\n pushBreadcrumb('error', args);\n return originals.error(...args);\n };\n\n return () => {\n console.log = originals.log;\n console.info = originals.info;\n console.warn = originals.warn;\n console.error = originals.error;\n };\n}\n\nfunction shouldCapture(args: any[], patterns: RegExp[]): boolean {\n if (patterns.length === 0) return true; // empty list = capture everything\n const first = typeof args[0] === 'string' ? args[0] : '';\n return patterns.some((re) => re.test(first));\n}\n\nfunction stringify(args: any[]): { message: string; stack?: string } {\n const errArg = args.find((a) => a instanceof Error) as Error | undefined;\n const message = args\n .map((a) => {\n if (a instanceof Error) return a.message;\n if (typeof a === 'string') return a;\n try {\n return JSON.stringify(a);\n } catch {\n return String(a);\n }\n })\n .join(' ')\n .slice(0, 4000);\n return {\n message,\n stack: errArg && typeof errArg.stack === 'string' ? errArg.stack : undefined,\n };\n}\n\n/**\n * Wrap console.error so tagged calls forward to the broker as warning-severity\n * events. The original console.error still runs (so RedBox / Metro logs still\n * show up).\n *\n * Pattern is intentional — ProofPix's existing log lines look like\n * `console.error('[Analytics] tracking failure', err)`. Devs prefix their\n * intentional captures and the broker only sees tagged ones.\n */\nexport function patchConsoleError(config: ResolvedConfig): () => void {\n const original = console.error.bind(console);\n console.error = (...args: any[]) => {\n try {\n if (shouldCapture(args, config.captureTags)) {\n const { message, stack } = stringify(args);\n sendEvent(config, {\n level: 'warn',\n message,\n stack,\n attrs: {\n kind: 'console.error',\n severity: 'warning',\n },\n });\n }\n } catch {\n // never block user logs\n }\n return original(...args);\n };\n return () => {\n console.error = original;\n };\n}\n\nexport function patchConsoleWarn(config: ResolvedConfig): () => void {\n const original = console.warn.bind(console);\n console.warn = (...args: any[]) => {\n try {\n if (shouldCapture(args, config.captureTags)) {\n const { message, stack } = stringify(args);\n sendEvent(config, {\n level: 'warn',\n message,\n stack,\n attrs: {\n kind: 'console.warn',\n severity: 'warning',\n },\n });\n }\n } catch {\n // never block\n }\n return original(...args);\n };\n return () => {\n console.warn = original;\n };\n}\n","import { getState, type UserContext } from './state';\nimport { newSessionId, getDeviceId } from './session';\nimport { installGlobalErrorHandler, installRejectionHandler } from './handlers';\nimport {\n patchConsoleError,\n patchConsoleWarn,\n patchConsoleForBreadcrumbs,\n} from './console';\nimport { sendEvent } from './transport';\nimport { offlineBuffer } from './buffer';\nimport { clearBreadcrumbs } from './breadcrumbs';\nimport type { InitOptions, ResolvedConfig } from './types';\n\nconst DEFAULT_ENDPOINT = 'https://geosloghub-production.up.railway.app';\n\nfunction resolveConfig(opts: InitOptions): ResolvedConfig {\n if (!opts?.projectKey) throw new Error('initFixPrompt: projectKey is required');\n if (!opts?.source) throw new Error('initFixPrompt: source is required');\n if (!opts?.service) throw new Error('initFixPrompt: service is required');\n if (!opts?.app) throw new Error('initFixPrompt: app is required');\n\n return {\n projectKey: opts.projectKey,\n source: opts.source,\n endpoint: (opts.endpoint ?? DEFAULT_ENDPOINT).replace(/\\/$/, ''),\n service: opts.service,\n app: opts.app,\n env: opts.env ?? 'prod',\n release: opts.release ?? null,\n captureTags: opts.captureTags ?? [],\n patchConsoleWarn: opts.patchConsoleWarn ?? false,\n patchConsoleError: opts.patchConsoleError ?? true,\n debug: opts.debug ?? false,\n };\n}\n\nexport function initFixPrompt(opts: InitOptions): void {\n const state = getState();\n if (state.initialized) {\n if (opts?.debug) {\n // eslint-disable-next-line no-console\n console.warn('[fixprompt] already initialized — call ignored');\n }\n return;\n }\n\n const config = resolveConfig(opts);\n state.config = config;\n state.sessionId = newSessionId();\n\n // Install breadcrumb capture FIRST so the forwarding patches below wrap\n // these. When ProofPix calls console.warn('[CRM] sync failed'), the\n // captureTags-gated forwarder runs (snapshotting the buffer pre-this-call),\n // then the breadcrumb wrapper pushes the line. Next event ships with this\n // line included.\n state.cleanup.restoreBreadcrumbConsole = patchConsoleForBreadcrumbs();\n\n state.cleanup.removeErrorHandler = installGlobalErrorHandler(config);\n state.cleanup.removeRejectionHandler = installRejectionHandler(config);\n if (config.patchConsoleError) {\n state.cleanup.restoreConsoleError = patchConsoleError(config);\n }\n if (config.patchConsoleWarn) {\n state.cleanup.restoreConsoleWarn = patchConsoleWarn(config);\n }\n\n state.initialized = true;\n\n // Resolve device id + drain any pre-init buffer, async.\n void (async () => {\n try {\n state.deviceId = await getDeviceId();\n await offlineBuffer.load();\n if (offlineBuffer.size() > 0) {\n // Triggers a drain via the transport's natural retry path.\n const items = await offlineBuffer.drain();\n for (const ev of items) {\n // Re-buffer if delivery still fails — transport handles it\n offlineBuffer.push(ev);\n }\n // Kick a drain attempt\n sendEvent(config, {\n level: 'debug',\n message: '[fixprompt] resumed from offline buffer',\n attrs: { kind: 'sdk.startup', buffered: items.length },\n });\n }\n } catch (err) {\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.warn(`[fixprompt] init async setup failed: ${(err as Error).message}`);\n }\n }\n })();\n\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.log('[fixprompt] initialized', {\n endpoint: config.endpoint,\n service: config.service,\n env: config.env,\n session_id: state.sessionId,\n });\n }\n}\n\nexport function captureException(\n err: unknown,\n options: { synthetic?: boolean; attrs?: Record<string, any> } = {},\n): void {\n const state = getState();\n if (!state.initialized || !state.config) return;\n const isErr = err instanceof Error;\n sendEvent(state.config, {\n level: 'error',\n message: isErr ? err.message : String(err),\n stack: isErr && typeof err.stack === 'string' ? err.stack : undefined,\n attrs: {\n kind: 'captureException',\n severity: 'error',\n error_name: isErr ? err.name : typeof err,\n ...(options.attrs ?? {}),\n },\n synthetic: options.synthetic === true,\n });\n}\n\nexport function setUser(user: UserContext | null): void {\n const state = getState();\n state.user = user;\n}\n\n/** Tests + HMR only. Not part of the supported API. @internal */\nexport function _resetForTests(): void {\n const state = getState();\n // Reverse order — forwarding patches were installed AFTER breadcrumbs.\n state.cleanup.restoreConsoleError?.();\n state.cleanup.restoreConsoleWarn?.();\n state.cleanup.restoreBreadcrumbConsole?.();\n state.cleanup.removeErrorHandler?.();\n state.cleanup.removeRejectionHandler?.();\n state.initialized = false;\n state.config = null;\n state.sessionId = null;\n state.deviceId = null;\n state.user = null;\n state.cleanup = {};\n clearBreadcrumbs();\n}\n"],"mappings":"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","names":["exports","module","Promise","resolve","reject","exports","Promise","id","AsyncStorage","import_async_storage","AsyncStorage"]}
|
package/dist/index.js
CHANGED
|
@@ -461,9 +461,48 @@ function getDeviceAttrs() {
|
|
|
461
461
|
return attrs;
|
|
462
462
|
}
|
|
463
463
|
|
|
464
|
+
// src/breadcrumbs.ts
|
|
465
|
+
var MAX_BREADCRUMBS = 50;
|
|
466
|
+
var MAX_MESSAGE_CHARS = 500;
|
|
467
|
+
var buffer = [];
|
|
468
|
+
function pushBreadcrumb(level, args) {
|
|
469
|
+
try {
|
|
470
|
+
const message = stringifyArgs(args);
|
|
471
|
+
buffer.push({ ts: Date.now(), level, message });
|
|
472
|
+
if (buffer.length > MAX_BREADCRUMBS) buffer.shift();
|
|
473
|
+
} catch {
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
function getBreadcrumbs() {
|
|
477
|
+
return [...buffer];
|
|
478
|
+
}
|
|
479
|
+
function clearBreadcrumbs() {
|
|
480
|
+
buffer.length = 0;
|
|
481
|
+
}
|
|
482
|
+
function stringifyArgs(args) {
|
|
483
|
+
const parts = [];
|
|
484
|
+
for (const a of args) {
|
|
485
|
+
if (a instanceof Error) {
|
|
486
|
+
parts.push(`${a.name}: ${a.message}`);
|
|
487
|
+
} else if (typeof a === "string") {
|
|
488
|
+
parts.push(a);
|
|
489
|
+
} else if (a == null) {
|
|
490
|
+
parts.push(String(a));
|
|
491
|
+
} else {
|
|
492
|
+
try {
|
|
493
|
+
parts.push(JSON.stringify(a));
|
|
494
|
+
} catch {
|
|
495
|
+
parts.push(String(a));
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
const joined = parts.join(" ");
|
|
500
|
+
return joined.length > MAX_MESSAGE_CHARS ? joined.slice(0, MAX_MESSAGE_CHARS) + "\u2026" : joined;
|
|
501
|
+
}
|
|
502
|
+
|
|
464
503
|
// src/version.ts
|
|
465
504
|
var SDK_NAME = "@fixprompt/react-native";
|
|
466
|
-
var SDK_VERSION = "0.0.
|
|
505
|
+
var SDK_VERSION = "0.0.3";
|
|
467
506
|
|
|
468
507
|
// src/transport.ts
|
|
469
508
|
var REQUEST_TIMEOUT_MS = 8e3;
|
|
@@ -485,7 +524,8 @@ function sendEvent(config, payload) {
|
|
|
485
524
|
session_id: state.sessionId,
|
|
486
525
|
device_id: state.deviceId,
|
|
487
526
|
user_id: state.user?.id,
|
|
488
|
-
user_email: state.user?.email
|
|
527
|
+
user_email: state.user?.email,
|
|
528
|
+
breadcrumbs: getBreadcrumbs()
|
|
489
529
|
},
|
|
490
530
|
synthetic: payload.synthetic
|
|
491
531
|
};
|
|
@@ -636,6 +676,36 @@ function safeJson(v) {
|
|
|
636
676
|
}
|
|
637
677
|
|
|
638
678
|
// src/console.ts
|
|
679
|
+
function patchConsoleForBreadcrumbs() {
|
|
680
|
+
const originals = {
|
|
681
|
+
log: console.log.bind(console),
|
|
682
|
+
info: console.info.bind(console),
|
|
683
|
+
warn: console.warn.bind(console),
|
|
684
|
+
error: console.error.bind(console)
|
|
685
|
+
};
|
|
686
|
+
console.log = (...args) => {
|
|
687
|
+
pushBreadcrumb("log", args);
|
|
688
|
+
return originals.log(...args);
|
|
689
|
+
};
|
|
690
|
+
console.info = (...args) => {
|
|
691
|
+
pushBreadcrumb("info", args);
|
|
692
|
+
return originals.info(...args);
|
|
693
|
+
};
|
|
694
|
+
console.warn = (...args) => {
|
|
695
|
+
pushBreadcrumb("warn", args);
|
|
696
|
+
return originals.warn(...args);
|
|
697
|
+
};
|
|
698
|
+
console.error = (...args) => {
|
|
699
|
+
pushBreadcrumb("error", args);
|
|
700
|
+
return originals.error(...args);
|
|
701
|
+
};
|
|
702
|
+
return () => {
|
|
703
|
+
console.log = originals.log;
|
|
704
|
+
console.info = originals.info;
|
|
705
|
+
console.warn = originals.warn;
|
|
706
|
+
console.error = originals.error;
|
|
707
|
+
};
|
|
708
|
+
}
|
|
639
709
|
function shouldCapture(args, patterns) {
|
|
640
710
|
if (patterns.length === 0) return true;
|
|
641
711
|
const first = typeof args[0] === "string" ? args[0] : "";
|
|
@@ -738,6 +808,7 @@ function initFixPrompt(opts) {
|
|
|
738
808
|
const config = resolveConfig(opts);
|
|
739
809
|
state.config = config;
|
|
740
810
|
state.sessionId = newSessionId();
|
|
811
|
+
state.cleanup.restoreBreadcrumbConsole = patchConsoleForBreadcrumbs();
|
|
741
812
|
state.cleanup.removeErrorHandler = installGlobalErrorHandler(config);
|
|
742
813
|
state.cleanup.removeRejectionHandler = installRejectionHandler(config);
|
|
743
814
|
if (config.patchConsoleError) {
|
|
@@ -800,16 +871,18 @@ function setUser(user) {
|
|
|
800
871
|
}
|
|
801
872
|
function _resetForTests() {
|
|
802
873
|
const state = getState();
|
|
803
|
-
state.cleanup.removeErrorHandler?.();
|
|
804
|
-
state.cleanup.removeRejectionHandler?.();
|
|
805
874
|
state.cleanup.restoreConsoleError?.();
|
|
806
875
|
state.cleanup.restoreConsoleWarn?.();
|
|
876
|
+
state.cleanup.restoreBreadcrumbConsole?.();
|
|
877
|
+
state.cleanup.removeErrorHandler?.();
|
|
878
|
+
state.cleanup.removeRejectionHandler?.();
|
|
807
879
|
state.initialized = false;
|
|
808
880
|
state.config = null;
|
|
809
881
|
state.sessionId = null;
|
|
810
882
|
state.deviceId = null;
|
|
811
883
|
state.user = null;
|
|
812
884
|
state.cleanup = {};
|
|
885
|
+
clearBreadcrumbs();
|
|
813
886
|
}
|
|
814
887
|
export {
|
|
815
888
|
SDK_NAME,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../node_modules/promise/setimmediate/core.js","../node_modules/promise/setimmediate/rejection-tracking.js","../src/state.ts","../src/session.ts","../src/buffer.ts","../src/device.ts","../src/version.ts","../src/transport.ts","../src/handlers.ts","../src/console.ts","../src/init.ts"],"sourcesContent":["'use strict';\n\n\n\nfunction noop() {}\n\n// States:\n//\n// 0 - pending\n// 1 - fulfilled with _value\n// 2 - rejected with _value\n// 3 - adopted the state of another promise, _value\n//\n// once the state is no longer pending (0) it is immutable\n\n// All `_` prefixed properties will be reduced to `_{random number}`\n// at build time to obfuscate them and discourage their use.\n// We don't use symbols or Object.defineProperty to fully hide them\n// because the performance isn't good enough.\n\n\n// to avoid using try/catch inside critical functions, we\n// extract them to here.\nvar LAST_ERROR = null;\nvar IS_ERROR = {};\nfunction getThen(obj) {\n try {\n return obj.then;\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\n\nfunction tryCallOne(fn, a) {\n try {\n return fn(a);\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\nfunction tryCallTwo(fn, a, b) {\n try {\n fn(a, b);\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\n\nmodule.exports = Promise;\n\nfunction Promise(fn) {\n if (typeof this !== 'object') {\n throw new TypeError('Promises must be constructed via new');\n }\n if (typeof fn !== 'function') {\n throw new TypeError('Promise constructor\\'s argument is not a function');\n }\n this._x = 0;\n this._y = 0;\n this._z = null;\n this._A = null;\n if (fn === noop) return;\n doResolve(fn, this);\n}\nPromise._B = null;\nPromise._C = null;\nPromise._D = noop;\n\nPromise.prototype.then = function(onFulfilled, onRejected) {\n if (this.constructor !== Promise) {\n return safeThen(this, onFulfilled, onRejected);\n }\n var res = new Promise(noop);\n handle(this, new Handler(onFulfilled, onRejected, res));\n return res;\n};\n\nfunction safeThen(self, onFulfilled, onRejected) {\n return new self.constructor(function (resolve, reject) {\n var res = new Promise(noop);\n res.then(resolve, reject);\n handle(self, new Handler(onFulfilled, onRejected, res));\n });\n}\nfunction handle(self, deferred) {\n while (self._y === 3) {\n self = self._z;\n }\n if (Promise._B) {\n Promise._B(self);\n }\n if (self._y === 0) {\n if (self._x === 0) {\n self._x = 1;\n self._A = deferred;\n return;\n }\n if (self._x === 1) {\n self._x = 2;\n self._A = [self._A, deferred];\n return;\n }\n self._A.push(deferred);\n return;\n }\n handleResolved(self, deferred);\n}\n\nfunction handleResolved(self, deferred) {\n setImmediate(function() {\n var cb = self._y === 1 ? deferred.onFulfilled : deferred.onRejected;\n if (cb === null) {\n if (self._y === 1) {\n resolve(deferred.promise, self._z);\n } else {\n reject(deferred.promise, self._z);\n }\n return;\n }\n var ret = tryCallOne(cb, self._z);\n if (ret === IS_ERROR) {\n reject(deferred.promise, LAST_ERROR);\n } else {\n resolve(deferred.promise, ret);\n }\n });\n}\nfunction resolve(self, newValue) {\n // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n if (newValue === self) {\n return reject(\n self,\n new TypeError('A promise cannot be resolved with itself.')\n );\n }\n if (\n newValue &&\n (typeof newValue === 'object' || typeof newValue === 'function')\n ) {\n var then = getThen(newValue);\n if (then === IS_ERROR) {\n return reject(self, LAST_ERROR);\n }\n if (\n then === self.then &&\n newValue instanceof Promise\n ) {\n self._y = 3;\n self._z = newValue;\n finale(self);\n return;\n } else if (typeof then === 'function') {\n doResolve(then.bind(newValue), self);\n return;\n }\n }\n self._y = 1;\n self._z = newValue;\n finale(self);\n}\n\nfunction reject(self, newValue) {\n self._y = 2;\n self._z = newValue;\n if (Promise._C) {\n Promise._C(self, newValue);\n }\n finale(self);\n}\nfunction finale(self) {\n if (self._x === 1) {\n handle(self, self._A);\n self._A = null;\n }\n if (self._x === 2) {\n for (var i = 0; i < self._A.length; i++) {\n handle(self, self._A[i]);\n }\n self._A = null;\n }\n}\n\nfunction Handler(onFulfilled, onRejected, promise){\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.promise = promise;\n}\n\n/**\n * Take a potentially misbehaving resolver function and make sure\n * onFulfilled and onRejected are only called once.\n *\n * Makes no guarantees about asynchrony.\n */\nfunction doResolve(fn, promise) {\n var done = false;\n var res = tryCallTwo(fn, function (value) {\n if (done) return;\n done = true;\n resolve(promise, value);\n }, function (reason) {\n if (done) return;\n done = true;\n reject(promise, reason);\n });\n if (!done && res === IS_ERROR) {\n done = true;\n reject(promise, LAST_ERROR);\n }\n}\n","'use strict';\n\nvar Promise = require('./core');\n\nvar DEFAULT_WHITELIST = [\n ReferenceError,\n TypeError,\n RangeError\n];\n\nvar enabled = false;\nexports.disable = disable;\nfunction disable() {\n enabled = false;\n Promise._B = null;\n Promise._C = null;\n}\n\nexports.enable = enable;\nfunction enable(options) {\n options = options || {};\n if (enabled) disable();\n enabled = true;\n var id = 0;\n var displayId = 0;\n var rejections = {};\n Promise._B = function (promise) {\n if (\n promise._y === 2 && // IS REJECTED\n rejections[promise._E]\n ) {\n if (rejections[promise._E].logged) {\n onHandled(promise._E);\n } else {\n clearTimeout(rejections[promise._E].timeout);\n }\n delete rejections[promise._E];\n }\n };\n Promise._C = function (promise, err) {\n if (promise._x === 0) { // not yet handled\n promise._E = id++;\n rejections[promise._E] = {\n displayId: null,\n error: err,\n timeout: setTimeout(\n onUnhandled.bind(null, promise._E),\n // For reference errors and type errors, this almost always\n // means the programmer made a mistake, so log them after just\n // 100ms\n // otherwise, wait 2 seconds to see if they get handled\n matchWhitelist(err, DEFAULT_WHITELIST)\n ? 100\n : 2000\n ),\n logged: false\n };\n }\n };\n function onUnhandled(id) {\n if (\n options.allRejections ||\n matchWhitelist(\n rejections[id].error,\n options.whitelist || DEFAULT_WHITELIST\n )\n ) {\n rejections[id].displayId = displayId++;\n if (options.onUnhandled) {\n rejections[id].logged = true;\n options.onUnhandled(\n rejections[id].displayId,\n rejections[id].error\n );\n } else {\n rejections[id].logged = true;\n logError(\n rejections[id].displayId,\n rejections[id].error\n );\n }\n }\n }\n function onHandled(id) {\n if (rejections[id].logged) {\n if (options.onHandled) {\n options.onHandled(rejections[id].displayId, rejections[id].error);\n } else if (!rejections[id].onUnhandled) {\n console.warn(\n 'Promise Rejection Handled (id: ' + rejections[id].displayId + '):'\n );\n console.warn(\n ' This means you can ignore any previous messages of the form \"Possible Unhandled Promise Rejection\" with id ' +\n rejections[id].displayId + '.'\n );\n }\n }\n }\n}\n\nfunction logError(id, error) {\n console.warn('Possible Unhandled Promise Rejection (id: ' + id + '):');\n var errStr = (error && (error.stack || error)) + '';\n errStr.split('\\n').forEach(function (line) {\n console.warn(' ' + line);\n });\n}\n\nfunction matchWhitelist(error, list) {\n return list.some(function (cls) {\n return error instanceof cls;\n });\n}","import type { ResolvedConfig } from './types';\n\nexport interface UserContext {\n id?: string;\n email?: string;\n [k: string]: any;\n}\n\ninterface CleanupHooks {\n removeErrorHandler?: () => void;\n removeRejectionHandler?: () => void;\n restoreConsoleError?: () => void;\n restoreConsoleWarn?: () => void;\n}\n\ninterface SdkState {\n initialized: boolean;\n config: ResolvedConfig | null;\n sessionId: string | null;\n deviceId: string | null;\n user: UserContext | null;\n cleanup: CleanupHooks;\n}\n\nconst STATE_KEY = '__fixprompt_rn_state__';\n\nfunction globalScope(): any {\n if (typeof globalThis !== 'undefined') return globalThis;\n return {};\n}\n\nexport function getState(): SdkState {\n const g = globalScope();\n if (!g[STATE_KEY]) {\n g[STATE_KEY] = {\n initialized: false,\n config: null,\n sessionId: null,\n deviceId: null,\n user: null,\n cleanup: {},\n } satisfies SdkState;\n }\n return g[STATE_KEY] as SdkState;\n}\n\nexport function resetStateForTests(): void {\n const g = globalScope();\n delete g[STATE_KEY];\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\n\nconst DEVICE_KEY = '@fixprompt/device_id';\n\nfunction uuid(): string {\n if (typeof globalThis.crypto?.randomUUID === 'function') {\n return globalThis.crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * One uuid per cold start. Lives in memory; resets when the app restarts.\n */\nexport function newSessionId(): string {\n return uuid();\n}\n\n/**\n * Stable per-device uuid. Tries expo-secure-store first (keychain-backed),\n * falls back to AsyncStorage. Generated lazily on first call.\n *\n * We deliberately don't use OS-provided device IDs (IDFV/Android ID) —\n * Apple flags them on review and they reset on reinstall anyway.\n */\nexport async function getDeviceId(): Promise<string> {\n // Optional expo-secure-store path\n try {\n // dynamic import so we don't crash when SecureStore isn't installed\n const SecureStore = await tryImport<any>('expo-secure-store');\n if (SecureStore) {\n const existing = await SecureStore.getItemAsync('fixprompt_device_id');\n if (existing) return existing;\n const fresh = uuid();\n await SecureStore.setItemAsync('fixprompt_device_id', fresh);\n return fresh;\n }\n } catch {\n // ignore — fall through to AsyncStorage\n }\n\n try {\n const existing = await AsyncStorage.getItem(DEVICE_KEY);\n if (existing) return existing;\n const fresh = uuid();\n await AsyncStorage.setItem(DEVICE_KEY, fresh);\n return fresh;\n } catch {\n // Final fallback — in-memory only (lost on reinstall)\n return uuid();\n }\n}\n\nasync function tryImport<T>(spec: string): Promise<T | null> {\n try {\n // require keeps Metro bundler quiet when the package isn't installed\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require(spec) as T;\n } catch {\n return null;\n }\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport type { EventPayload } from './types';\n\nconst STORAGE_KEY = '@fixprompt/buffer';\nconst MAX_BUFFER = 200;\nconst MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n\ninterface BufferedEvent {\n ts: number;\n payload: EventPayload;\n}\n\n/**\n * In-memory ring buffer with AsyncStorage persistence.\n *\n * Events accumulate when the broker is unreachable (network error / 5xx /\n * timeout). On the next successful send, the whole buffer drains in order.\n * On cold start, any persisted buffer from a prior crash is replayed.\n */\nclass OfflineBuffer {\n private items: BufferedEvent[] = [];\n private loaded = false;\n private persistTimer: ReturnType<typeof setTimeout> | null = null;\n\n /** Load the persisted buffer once, on first use. */\n async load(): Promise<void> {\n if (this.loaded) return;\n this.loaded = true;\n try {\n const raw = await AsyncStorage.getItem(STORAGE_KEY);\n if (!raw) return;\n const parsed = JSON.parse(raw) as BufferedEvent[];\n const cutoff = Date.now() - MAX_AGE_MS;\n this.items = parsed.filter((e) => e?.ts > cutoff).slice(-MAX_BUFFER);\n } catch {\n this.items = [];\n }\n }\n\n push(payload: EventPayload): void {\n this.items.push({ ts: Date.now(), payload });\n if (this.items.length > MAX_BUFFER) this.items.shift();\n this.schedulePersist();\n }\n\n async drain(): Promise<EventPayload[]> {\n if (!this.loaded) await this.load();\n const out = this.items.map((e) => e.payload);\n this.items = [];\n this.schedulePersist();\n return out;\n }\n\n size(): number {\n return this.items.length;\n }\n\n private schedulePersist() {\n if (this.persistTimer) return;\n this.persistTimer = setTimeout(async () => {\n this.persistTimer = null;\n try {\n await AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(this.items));\n } catch {\n // swallow — buffer survives in memory at least\n }\n }, 500);\n }\n\n /** Tests only. */\n _resetForTests(): void {\n this.items = [];\n this.loaded = false;\n if (this.persistTimer) {\n clearTimeout(this.persistTimer);\n this.persistTimer = null;\n }\n }\n}\n\nexport const offlineBuffer = new OfflineBuffer();\n","import { Platform } from 'react-native';\n\nexport interface DeviceAttrs {\n platform: string; // 'ios' | 'android' | 'web' | 'windows' | 'macos'\n os_version: string;\n /** RN runtime version (Hermes / JSC). Used for triage. */\n rn_version?: string;\n\n /** App version (e.g. \"1.2.3\") from expo-constants or native build. */\n app_version?: string;\n /** Build number (CFBundleVersion / versionCode) from expo-constants. */\n build_number?: string;\n\n /** OTA bundle id (Updates.updateId) from expo-updates, if active. */\n ota_id?: string;\n /** OTA runtime version (Updates.runtimeVersion) from expo-updates. */\n runtime_version?: string;\n /** OTA channel (Updates.channel) — e.g. \"production\", \"preview\". */\n ota_channel?: string;\n}\n\nfunction tryRequire<T = any>(spec: string): T | null {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require(spec) as T;\n } catch {\n return null;\n }\n}\n\n// Cache at module load. Both packages are optional peer deps — bare RN\n// (or sideloaded Expo) projects without them get the basic platform attrs.\nconst ConstantsMod: any = tryRequire('expo-constants');\nconst Constants: any = ConstantsMod?.default ?? ConstantsMod ?? null;\nconst Updates: any = tryRequire('expo-updates');\n\nexport function getDeviceAttrs(): DeviceAttrs {\n const attrs: DeviceAttrs = {\n platform: String(Platform.OS),\n os_version: String((Platform as any).Version ?? 'unknown'),\n rn_version: (Platform as any).constants?.reactNativeVersion\n ? Object.values((Platform as any).constants.reactNativeVersion).join('.')\n : undefined,\n };\n\n // expo-constants: app version + native build number\n if (Constants) {\n const cfg = Constants.expoConfig ?? Constants.manifest ?? null;\n if (cfg?.version) attrs.app_version = String(cfg.version);\n if (cfg?.ios?.buildNumber) {\n attrs.build_number = String(cfg.ios.buildNumber);\n } else if (cfg?.android?.versionCode != null) {\n attrs.build_number = String(cfg.android.versionCode);\n }\n // Fall back to native values when running on a binary build\n if (!attrs.app_version && Constants.nativeAppVersion) {\n attrs.app_version = String(Constants.nativeAppVersion);\n }\n if (!attrs.build_number && Constants.nativeBuildVersion) {\n attrs.build_number = String(Constants.nativeBuildVersion);\n }\n }\n\n // expo-updates: OTA bundle id + channel\n if (Updates) {\n if (Updates.updateId) attrs.ota_id = String(Updates.updateId);\n if (Updates.runtimeVersion) attrs.runtime_version = String(Updates.runtimeVersion);\n if (Updates.channel) attrs.ota_channel = String(Updates.channel);\n }\n\n return attrs;\n}\n","export const SDK_NAME = '@fixprompt/react-native';\nexport const SDK_VERSION = '0.0.2';\n","import type { EventPayload, ResolvedConfig } from './types';\nimport { offlineBuffer } from './buffer';\nimport { getState } from './state';\nimport { getDeviceAttrs } from './device';\nimport { SDK_NAME, SDK_VERSION } from './version';\n\nconst REQUEST_TIMEOUT_MS = 8_000;\n\n/**\n * Sends one event. On network failure (timeout / 5xx / no-network) the event\n * gets buffered; the buffer drains on the next successful send.\n *\n * Never throws — RN apps don't want their event loop killed by a logger.\n */\nexport function sendEvent(\n config: ResolvedConfig,\n payload: Omit<EventPayload, 'service' | 'app' | 'env' | 'attrs'> & {\n attrs?: Record<string, any>;\n service?: string;\n app?: string;\n env?: string;\n },\n): void {\n const state = getState();\n\n const event: EventPayload = {\n service: payload.service ?? config.service,\n app: payload.app ?? config.app,\n env: payload.env ?? config.env,\n level: payload.level,\n message: payload.message,\n stack: payload.stack,\n attrs: {\n ...(payload.attrs ?? {}),\n ...getDeviceAttrs(),\n sdk: SDK_NAME,\n sdk_version: SDK_VERSION,\n release: config.release,\n session_id: state.sessionId,\n device_id: state.deviceId,\n user_id: state.user?.id,\n user_email: state.user?.email,\n },\n synthetic: payload.synthetic,\n };\n\n // Strip undefined attrs (broker accepts strings/numbers, not nulls/undef)\n for (const k of Object.keys(event.attrs)) {\n if (event.attrs[k] === undefined || event.attrs[k] === null) {\n delete event.attrs[k];\n }\n }\n\n void postOrBuffer(config, event);\n}\n\nasync function postOrBuffer(\n config: ResolvedConfig,\n event: EventPayload,\n): Promise<void> {\n // Always drain the buffer first so order is preserved.\n if (!(await tryPost(config, event, /* throwOnFail */ true))) {\n offlineBuffer.push(event);\n return;\n }\n\n // Successfully delivered this one — try to drain any backlog too.\n if (offlineBuffer.size() === 0) return;\n const queued = await offlineBuffer.drain();\n for (const buffered of queued) {\n if (!(await tryPost(config, buffered, true))) {\n // Re-buffer the rest including this one\n offlineBuffer.push(buffered);\n for (let i = queued.indexOf(buffered) + 1; i < queued.length; i++) {\n offlineBuffer.push(queued[i]);\n }\n return;\n }\n }\n}\n\nasync function tryPost(\n config: ResolvedConfig,\n event: EventPayload,\n throwOnFail: boolean,\n): Promise<boolean> {\n try {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), REQUEST_TIMEOUT_MS);\n try {\n const res = await fetch(`${config.endpoint.replace(/\\/$/, '')}/ingest/log`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-loghub-source': config.source,\n 'x-loghub-key': config.projectKey,\n },\n body: JSON.stringify(event),\n signal: ctrl.signal,\n });\n // 4xx → bug on our side; drop, don't buffer\n if (res.status >= 400 && res.status < 500) {\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.warn(`[fixprompt] ${res.status} from broker — dropping event`);\n }\n return true; // \"delivered\" in the sense that we won't re-try\n }\n return res.ok;\n } finally {\n clearTimeout(timer);\n }\n } catch (err) {\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.warn(`[fixprompt] transport error: ${(err as Error).message}`);\n }\n return false;\n }\n}\n","import { sendEvent } from './transport';\nimport type { ResolvedConfig } from './types';\n\n/**\n * Returns the project's user-code stack frame (skips node_modules and the\n * SDK itself). Falls back to the raw stack.\n */\nfunction topStackFrame(stack: string | undefined): string {\n if (!stack) return '';\n for (const raw of stack.split('\\n')) {\n const line = raw.trim();\n if (!line) continue;\n if (line.startsWith('Error')) continue;\n if (/node_modules|@fixprompt/.test(line)) continue;\n return line.slice(0, 200);\n }\n return stack.split('\\n')[0]?.slice(0, 200) ?? '';\n}\n\nexport function installGlobalErrorHandler(config: ResolvedConfig): () => void {\n // ErrorUtils is a React Native global; not present in plain Node tests.\n const ErrorUtils: any = (globalThis as any).ErrorUtils;\n if (!ErrorUtils?.setGlobalHandler) {\n return () => undefined;\n }\n\n const previous = ErrorUtils.getGlobalHandler?.();\n\n const handler = (error: Error, isFatal?: boolean) => {\n try {\n sendEvent(config, {\n level: isFatal ? 'error' : 'warn',\n message: error?.message ?? 'Uncaught error',\n stack: typeof error?.stack === 'string' ? error.stack : undefined,\n attrs: {\n kind: 'rn.globalError',\n severity: isFatal ? 'critical' : 'error',\n error_name: error?.name,\n top_frame: topStackFrame(error?.stack),\n fatal: !!isFatal,\n },\n });\n } catch {\n // never let logger crash propagate\n }\n previous?.(error, isFatal);\n };\n\n ErrorUtils.setGlobalHandler(handler);\n\n return () => {\n if (previous) ErrorUtils.setGlobalHandler(previous);\n };\n}\n\n/**\n * Hook unhandled-promise-rejection tracking. Uses the bundled\n * `promise/setimmediate/rejection-tracking` module that ships with RN.\n */\nexport function installRejectionHandler(config: ResolvedConfig): () => void {\n let tracking: any;\n try {\n // RN's bundled polyfill — present on every RN runtime.\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n tracking = require('promise/setimmediate/rejection-tracking');\n } catch {\n return () => undefined;\n }\n\n tracking.enable({\n allRejections: true,\n onUnhandled: (id: string, error: unknown) => {\n try {\n const isErr = error instanceof Error;\n sendEvent(config, {\n level: 'error',\n message: isErr ? error.message : safeJson(error),\n stack: isErr && typeof error.stack === 'string' ? error.stack : undefined,\n attrs: {\n kind: 'rn.unhandledrejection',\n severity: 'error',\n error_name: isErr ? error.name : typeof error,\n top_frame: isErr ? topStackFrame(error.stack) : '',\n },\n });\n } catch {\n // ignore\n }\n },\n onHandled: () => undefined,\n });\n\n return () => {\n try {\n tracking.disable();\n } catch {\n // ignore\n }\n };\n}\n\nfunction safeJson(v: unknown): string {\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n}\n","import { sendEvent } from './transport';\nimport type { ResolvedConfig } from './types';\n\nfunction shouldCapture(args: any[], patterns: RegExp[]): boolean {\n if (patterns.length === 0) return true; // empty list = capture everything\n const first = typeof args[0] === 'string' ? args[0] : '';\n return patterns.some((re) => re.test(first));\n}\n\nfunction stringify(args: any[]): { message: string; stack?: string } {\n const errArg = args.find((a) => a instanceof Error) as Error | undefined;\n const message = args\n .map((a) => {\n if (a instanceof Error) return a.message;\n if (typeof a === 'string') return a;\n try {\n return JSON.stringify(a);\n } catch {\n return String(a);\n }\n })\n .join(' ')\n .slice(0, 4000);\n return {\n message,\n stack: errArg && typeof errArg.stack === 'string' ? errArg.stack : undefined,\n };\n}\n\n/**\n * Wrap console.error so tagged calls forward to the broker as warning-severity\n * events. The original console.error still runs (so RedBox / Metro logs still\n * show up).\n *\n * Pattern is intentional — ProofPix's existing log lines look like\n * `console.error('[Analytics] tracking failure', err)`. Devs prefix their\n * intentional captures and the broker only sees tagged ones.\n */\nexport function patchConsoleError(config: ResolvedConfig): () => void {\n const original = console.error.bind(console);\n console.error = (...args: any[]) => {\n try {\n if (shouldCapture(args, config.captureTags)) {\n const { message, stack } = stringify(args);\n sendEvent(config, {\n level: 'warn',\n message,\n stack,\n attrs: {\n kind: 'console.error',\n severity: 'warning',\n },\n });\n }\n } catch {\n // never block user logs\n }\n return original(...args);\n };\n return () => {\n console.error = original;\n };\n}\n\nexport function patchConsoleWarn(config: ResolvedConfig): () => void {\n const original = console.warn.bind(console);\n console.warn = (...args: any[]) => {\n try {\n if (shouldCapture(args, config.captureTags)) {\n const { message, stack } = stringify(args);\n sendEvent(config, {\n level: 'warn',\n message,\n stack,\n attrs: {\n kind: 'console.warn',\n severity: 'warning',\n },\n });\n }\n } catch {\n // never block\n }\n return original(...args);\n };\n return () => {\n console.warn = original;\n };\n}\n","import { getState, type UserContext } from './state';\nimport { newSessionId, getDeviceId } from './session';\nimport { installGlobalErrorHandler, installRejectionHandler } from './handlers';\nimport { patchConsoleError, patchConsoleWarn } from './console';\nimport { sendEvent } from './transport';\nimport { offlineBuffer } from './buffer';\nimport type { InitOptions, ResolvedConfig } from './types';\n\nconst DEFAULT_ENDPOINT = 'https://geosloghub-production.up.railway.app';\n\nfunction resolveConfig(opts: InitOptions): ResolvedConfig {\n if (!opts?.projectKey) throw new Error('initFixPrompt: projectKey is required');\n if (!opts?.source) throw new Error('initFixPrompt: source is required');\n if (!opts?.service) throw new Error('initFixPrompt: service is required');\n if (!opts?.app) throw new Error('initFixPrompt: app is required');\n\n return {\n projectKey: opts.projectKey,\n source: opts.source,\n endpoint: (opts.endpoint ?? DEFAULT_ENDPOINT).replace(/\\/$/, ''),\n service: opts.service,\n app: opts.app,\n env: opts.env ?? 'prod',\n release: opts.release ?? null,\n captureTags: opts.captureTags ?? [],\n patchConsoleWarn: opts.patchConsoleWarn ?? false,\n patchConsoleError: opts.patchConsoleError ?? true,\n debug: opts.debug ?? false,\n };\n}\n\nexport function initFixPrompt(opts: InitOptions): void {\n const state = getState();\n if (state.initialized) {\n if (opts?.debug) {\n // eslint-disable-next-line no-console\n console.warn('[fixprompt] already initialized — call ignored');\n }\n return;\n }\n\n const config = resolveConfig(opts);\n state.config = config;\n state.sessionId = newSessionId();\n\n state.cleanup.removeErrorHandler = installGlobalErrorHandler(config);\n state.cleanup.removeRejectionHandler = installRejectionHandler(config);\n if (config.patchConsoleError) {\n state.cleanup.restoreConsoleError = patchConsoleError(config);\n }\n if (config.patchConsoleWarn) {\n state.cleanup.restoreConsoleWarn = patchConsoleWarn(config);\n }\n\n state.initialized = true;\n\n // Resolve device id + drain any pre-init buffer, async.\n void (async () => {\n try {\n state.deviceId = await getDeviceId();\n await offlineBuffer.load();\n if (offlineBuffer.size() > 0) {\n // Triggers a drain via the transport's natural retry path.\n const items = await offlineBuffer.drain();\n for (const ev of items) {\n // Re-buffer if delivery still fails — transport handles it\n offlineBuffer.push(ev);\n }\n // Kick a drain attempt\n sendEvent(config, {\n level: 'debug',\n message: '[fixprompt] resumed from offline buffer',\n attrs: { kind: 'sdk.startup', buffered: items.length },\n });\n }\n } catch (err) {\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.warn(`[fixprompt] init async setup failed: ${(err as Error).message}`);\n }\n }\n })();\n\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.log('[fixprompt] initialized', {\n endpoint: config.endpoint,\n service: config.service,\n env: config.env,\n session_id: state.sessionId,\n });\n }\n}\n\nexport function captureException(\n err: unknown,\n options: { synthetic?: boolean; attrs?: Record<string, any> } = {},\n): void {\n const state = getState();\n if (!state.initialized || !state.config) return;\n const isErr = err instanceof Error;\n sendEvent(state.config, {\n level: 'error',\n message: isErr ? err.message : String(err),\n stack: isErr && typeof err.stack === 'string' ? err.stack : undefined,\n attrs: {\n kind: 'captureException',\n severity: 'error',\n error_name: isErr ? err.name : typeof err,\n ...(options.attrs ?? {}),\n },\n synthetic: options.synthetic === true,\n });\n}\n\nexport function setUser(user: UserContext | null): void {\n const state = getState();\n state.user = user;\n}\n\n/** Tests + HMR only. Not part of the supported API. @internal */\nexport function _resetForTests(): void {\n const state = getState();\n state.cleanup.removeErrorHandler?.();\n state.cleanup.removeRejectionHandler?.();\n state.cleanup.restoreConsoleError?.();\n state.cleanup.restoreConsoleWarn?.();\n state.initialized = false;\n state.config = null;\n state.sessionId = null;\n state.deviceId = null;\n state.user = null;\n state.cleanup = {};\n}\n"],"mappings":"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","names":["Promise","resolve","reject","Promise","id","AsyncStorage"]}
|
|
1
|
+
{"version":3,"sources":["../node_modules/promise/setimmediate/core.js","../node_modules/promise/setimmediate/rejection-tracking.js","../src/state.ts","../src/session.ts","../src/buffer.ts","../src/device.ts","../src/breadcrumbs.ts","../src/version.ts","../src/transport.ts","../src/handlers.ts","../src/console.ts","../src/init.ts"],"sourcesContent":["'use strict';\n\n\n\nfunction noop() {}\n\n// States:\n//\n// 0 - pending\n// 1 - fulfilled with _value\n// 2 - rejected with _value\n// 3 - adopted the state of another promise, _value\n//\n// once the state is no longer pending (0) it is immutable\n\n// All `_` prefixed properties will be reduced to `_{random number}`\n// at build time to obfuscate them and discourage their use.\n// We don't use symbols or Object.defineProperty to fully hide them\n// because the performance isn't good enough.\n\n\n// to avoid using try/catch inside critical functions, we\n// extract them to here.\nvar LAST_ERROR = null;\nvar IS_ERROR = {};\nfunction getThen(obj) {\n try {\n return obj.then;\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\n\nfunction tryCallOne(fn, a) {\n try {\n return fn(a);\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\nfunction tryCallTwo(fn, a, b) {\n try {\n fn(a, b);\n } catch (ex) {\n LAST_ERROR = ex;\n return IS_ERROR;\n }\n}\n\nmodule.exports = Promise;\n\nfunction Promise(fn) {\n if (typeof this !== 'object') {\n throw new TypeError('Promises must be constructed via new');\n }\n if (typeof fn !== 'function') {\n throw new TypeError('Promise constructor\\'s argument is not a function');\n }\n this._x = 0;\n this._y = 0;\n this._z = null;\n this._A = null;\n if (fn === noop) return;\n doResolve(fn, this);\n}\nPromise._B = null;\nPromise._C = null;\nPromise._D = noop;\n\nPromise.prototype.then = function(onFulfilled, onRejected) {\n if (this.constructor !== Promise) {\n return safeThen(this, onFulfilled, onRejected);\n }\n var res = new Promise(noop);\n handle(this, new Handler(onFulfilled, onRejected, res));\n return res;\n};\n\nfunction safeThen(self, onFulfilled, onRejected) {\n return new self.constructor(function (resolve, reject) {\n var res = new Promise(noop);\n res.then(resolve, reject);\n handle(self, new Handler(onFulfilled, onRejected, res));\n });\n}\nfunction handle(self, deferred) {\n while (self._y === 3) {\n self = self._z;\n }\n if (Promise._B) {\n Promise._B(self);\n }\n if (self._y === 0) {\n if (self._x === 0) {\n self._x = 1;\n self._A = deferred;\n return;\n }\n if (self._x === 1) {\n self._x = 2;\n self._A = [self._A, deferred];\n return;\n }\n self._A.push(deferred);\n return;\n }\n handleResolved(self, deferred);\n}\n\nfunction handleResolved(self, deferred) {\n setImmediate(function() {\n var cb = self._y === 1 ? deferred.onFulfilled : deferred.onRejected;\n if (cb === null) {\n if (self._y === 1) {\n resolve(deferred.promise, self._z);\n } else {\n reject(deferred.promise, self._z);\n }\n return;\n }\n var ret = tryCallOne(cb, self._z);\n if (ret === IS_ERROR) {\n reject(deferred.promise, LAST_ERROR);\n } else {\n resolve(deferred.promise, ret);\n }\n });\n}\nfunction resolve(self, newValue) {\n // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure\n if (newValue === self) {\n return reject(\n self,\n new TypeError('A promise cannot be resolved with itself.')\n );\n }\n if (\n newValue &&\n (typeof newValue === 'object' || typeof newValue === 'function')\n ) {\n var then = getThen(newValue);\n if (then === IS_ERROR) {\n return reject(self, LAST_ERROR);\n }\n if (\n then === self.then &&\n newValue instanceof Promise\n ) {\n self._y = 3;\n self._z = newValue;\n finale(self);\n return;\n } else if (typeof then === 'function') {\n doResolve(then.bind(newValue), self);\n return;\n }\n }\n self._y = 1;\n self._z = newValue;\n finale(self);\n}\n\nfunction reject(self, newValue) {\n self._y = 2;\n self._z = newValue;\n if (Promise._C) {\n Promise._C(self, newValue);\n }\n finale(self);\n}\nfunction finale(self) {\n if (self._x === 1) {\n handle(self, self._A);\n self._A = null;\n }\n if (self._x === 2) {\n for (var i = 0; i < self._A.length; i++) {\n handle(self, self._A[i]);\n }\n self._A = null;\n }\n}\n\nfunction Handler(onFulfilled, onRejected, promise){\n this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null;\n this.onRejected = typeof onRejected === 'function' ? onRejected : null;\n this.promise = promise;\n}\n\n/**\n * Take a potentially misbehaving resolver function and make sure\n * onFulfilled and onRejected are only called once.\n *\n * Makes no guarantees about asynchrony.\n */\nfunction doResolve(fn, promise) {\n var done = false;\n var res = tryCallTwo(fn, function (value) {\n if (done) return;\n done = true;\n resolve(promise, value);\n }, function (reason) {\n if (done) return;\n done = true;\n reject(promise, reason);\n });\n if (!done && res === IS_ERROR) {\n done = true;\n reject(promise, LAST_ERROR);\n }\n}\n","'use strict';\n\nvar Promise = require('./core');\n\nvar DEFAULT_WHITELIST = [\n ReferenceError,\n TypeError,\n RangeError\n];\n\nvar enabled = false;\nexports.disable = disable;\nfunction disable() {\n enabled = false;\n Promise._B = null;\n Promise._C = null;\n}\n\nexports.enable = enable;\nfunction enable(options) {\n options = options || {};\n if (enabled) disable();\n enabled = true;\n var id = 0;\n var displayId = 0;\n var rejections = {};\n Promise._B = function (promise) {\n if (\n promise._y === 2 && // IS REJECTED\n rejections[promise._E]\n ) {\n if (rejections[promise._E].logged) {\n onHandled(promise._E);\n } else {\n clearTimeout(rejections[promise._E].timeout);\n }\n delete rejections[promise._E];\n }\n };\n Promise._C = function (promise, err) {\n if (promise._x === 0) { // not yet handled\n promise._E = id++;\n rejections[promise._E] = {\n displayId: null,\n error: err,\n timeout: setTimeout(\n onUnhandled.bind(null, promise._E),\n // For reference errors and type errors, this almost always\n // means the programmer made a mistake, so log them after just\n // 100ms\n // otherwise, wait 2 seconds to see if they get handled\n matchWhitelist(err, DEFAULT_WHITELIST)\n ? 100\n : 2000\n ),\n logged: false\n };\n }\n };\n function onUnhandled(id) {\n if (\n options.allRejections ||\n matchWhitelist(\n rejections[id].error,\n options.whitelist || DEFAULT_WHITELIST\n )\n ) {\n rejections[id].displayId = displayId++;\n if (options.onUnhandled) {\n rejections[id].logged = true;\n options.onUnhandled(\n rejections[id].displayId,\n rejections[id].error\n );\n } else {\n rejections[id].logged = true;\n logError(\n rejections[id].displayId,\n rejections[id].error\n );\n }\n }\n }\n function onHandled(id) {\n if (rejections[id].logged) {\n if (options.onHandled) {\n options.onHandled(rejections[id].displayId, rejections[id].error);\n } else if (!rejections[id].onUnhandled) {\n console.warn(\n 'Promise Rejection Handled (id: ' + rejections[id].displayId + '):'\n );\n console.warn(\n ' This means you can ignore any previous messages of the form \"Possible Unhandled Promise Rejection\" with id ' +\n rejections[id].displayId + '.'\n );\n }\n }\n }\n}\n\nfunction logError(id, error) {\n console.warn('Possible Unhandled Promise Rejection (id: ' + id + '):');\n var errStr = (error && (error.stack || error)) + '';\n errStr.split('\\n').forEach(function (line) {\n console.warn(' ' + line);\n });\n}\n\nfunction matchWhitelist(error, list) {\n return list.some(function (cls) {\n return error instanceof cls;\n });\n}","import type { ResolvedConfig } from './types';\n\nexport interface UserContext {\n id?: string;\n email?: string;\n [k: string]: any;\n}\n\ninterface CleanupHooks {\n removeErrorHandler?: () => void;\n removeRejectionHandler?: () => void;\n restoreConsoleError?: () => void;\n restoreConsoleWarn?: () => void;\n restoreBreadcrumbConsole?: () => void;\n}\n\ninterface SdkState {\n initialized: boolean;\n config: ResolvedConfig | null;\n sessionId: string | null;\n deviceId: string | null;\n user: UserContext | null;\n cleanup: CleanupHooks;\n}\n\nconst STATE_KEY = '__fixprompt_rn_state__';\n\nfunction globalScope(): any {\n if (typeof globalThis !== 'undefined') return globalThis;\n return {};\n}\n\nexport function getState(): SdkState {\n const g = globalScope();\n if (!g[STATE_KEY]) {\n g[STATE_KEY] = {\n initialized: false,\n config: null,\n sessionId: null,\n deviceId: null,\n user: null,\n cleanup: {},\n } satisfies SdkState;\n }\n return g[STATE_KEY] as SdkState;\n}\n\nexport function resetStateForTests(): void {\n const g = globalScope();\n delete g[STATE_KEY];\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\n\nconst DEVICE_KEY = '@fixprompt/device_id';\n\nfunction uuid(): string {\n if (typeof globalThis.crypto?.randomUUID === 'function') {\n return globalThis.crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\n/**\n * One uuid per cold start. Lives in memory; resets when the app restarts.\n */\nexport function newSessionId(): string {\n return uuid();\n}\n\n/**\n * Stable per-device uuid. Tries expo-secure-store first (keychain-backed),\n * falls back to AsyncStorage. Generated lazily on first call.\n *\n * We deliberately don't use OS-provided device IDs (IDFV/Android ID) —\n * Apple flags them on review and they reset on reinstall anyway.\n */\nexport async function getDeviceId(): Promise<string> {\n // Optional expo-secure-store path\n try {\n // dynamic import so we don't crash when SecureStore isn't installed\n const SecureStore = await tryImport<any>('expo-secure-store');\n if (SecureStore) {\n const existing = await SecureStore.getItemAsync('fixprompt_device_id');\n if (existing) return existing;\n const fresh = uuid();\n await SecureStore.setItemAsync('fixprompt_device_id', fresh);\n return fresh;\n }\n } catch {\n // ignore — fall through to AsyncStorage\n }\n\n try {\n const existing = await AsyncStorage.getItem(DEVICE_KEY);\n if (existing) return existing;\n const fresh = uuid();\n await AsyncStorage.setItem(DEVICE_KEY, fresh);\n return fresh;\n } catch {\n // Final fallback — in-memory only (lost on reinstall)\n return uuid();\n }\n}\n\nasync function tryImport<T>(spec: string): Promise<T | null> {\n try {\n // require keeps Metro bundler quiet when the package isn't installed\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require(spec) as T;\n } catch {\n return null;\n }\n}\n","import AsyncStorage from '@react-native-async-storage/async-storage';\nimport type { EventPayload } from './types';\n\nconst STORAGE_KEY = '@fixprompt/buffer';\nconst MAX_BUFFER = 200;\nconst MAX_AGE_MS = 7 * 24 * 60 * 60 * 1000;\n\ninterface BufferedEvent {\n ts: number;\n payload: EventPayload;\n}\n\n/**\n * In-memory ring buffer with AsyncStorage persistence.\n *\n * Events accumulate when the broker is unreachable (network error / 5xx /\n * timeout). On the next successful send, the whole buffer drains in order.\n * On cold start, any persisted buffer from a prior crash is replayed.\n */\nclass OfflineBuffer {\n private items: BufferedEvent[] = [];\n private loaded = false;\n private persistTimer: ReturnType<typeof setTimeout> | null = null;\n\n /** Load the persisted buffer once, on first use. */\n async load(): Promise<void> {\n if (this.loaded) return;\n this.loaded = true;\n try {\n const raw = await AsyncStorage.getItem(STORAGE_KEY);\n if (!raw) return;\n const parsed = JSON.parse(raw) as BufferedEvent[];\n const cutoff = Date.now() - MAX_AGE_MS;\n this.items = parsed.filter((e) => e?.ts > cutoff).slice(-MAX_BUFFER);\n } catch {\n this.items = [];\n }\n }\n\n push(payload: EventPayload): void {\n this.items.push({ ts: Date.now(), payload });\n if (this.items.length > MAX_BUFFER) this.items.shift();\n this.schedulePersist();\n }\n\n async drain(): Promise<EventPayload[]> {\n if (!this.loaded) await this.load();\n const out = this.items.map((e) => e.payload);\n this.items = [];\n this.schedulePersist();\n return out;\n }\n\n size(): number {\n return this.items.length;\n }\n\n private schedulePersist() {\n if (this.persistTimer) return;\n this.persistTimer = setTimeout(async () => {\n this.persistTimer = null;\n try {\n await AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(this.items));\n } catch {\n // swallow — buffer survives in memory at least\n }\n }, 500);\n }\n\n /** Tests only. */\n _resetForTests(): void {\n this.items = [];\n this.loaded = false;\n if (this.persistTimer) {\n clearTimeout(this.persistTimer);\n this.persistTimer = null;\n }\n }\n}\n\nexport const offlineBuffer = new OfflineBuffer();\n","import { Platform } from 'react-native';\n\nexport interface DeviceAttrs {\n platform: string; // 'ios' | 'android' | 'web' | 'windows' | 'macos'\n os_version: string;\n /** RN runtime version (Hermes / JSC). Used for triage. */\n rn_version?: string;\n\n /** App version (e.g. \"1.2.3\") from expo-constants or native build. */\n app_version?: string;\n /** Build number (CFBundleVersion / versionCode) from expo-constants. */\n build_number?: string;\n\n /** OTA bundle id (Updates.updateId) from expo-updates, if active. */\n ota_id?: string;\n /** OTA runtime version (Updates.runtimeVersion) from expo-updates. */\n runtime_version?: string;\n /** OTA channel (Updates.channel) — e.g. \"production\", \"preview\". */\n ota_channel?: string;\n}\n\nfunction tryRequire<T = any>(spec: string): T | null {\n try {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n return require(spec) as T;\n } catch {\n return null;\n }\n}\n\n// Cache at module load. Both packages are optional peer deps — bare RN\n// (or sideloaded Expo) projects without them get the basic platform attrs.\nconst ConstantsMod: any = tryRequire('expo-constants');\nconst Constants: any = ConstantsMod?.default ?? ConstantsMod ?? null;\nconst Updates: any = tryRequire('expo-updates');\n\nexport function getDeviceAttrs(): DeviceAttrs {\n const attrs: DeviceAttrs = {\n platform: String(Platform.OS),\n os_version: String((Platform as any).Version ?? 'unknown'),\n rn_version: (Platform as any).constants?.reactNativeVersion\n ? Object.values((Platform as any).constants.reactNativeVersion).join('.')\n : undefined,\n };\n\n // expo-constants: app version + native build number\n if (Constants) {\n const cfg = Constants.expoConfig ?? Constants.manifest ?? null;\n if (cfg?.version) attrs.app_version = String(cfg.version);\n if (cfg?.ios?.buildNumber) {\n attrs.build_number = String(cfg.ios.buildNumber);\n } else if (cfg?.android?.versionCode != null) {\n attrs.build_number = String(cfg.android.versionCode);\n }\n // Fall back to native values when running on a binary build\n if (!attrs.app_version && Constants.nativeAppVersion) {\n attrs.app_version = String(Constants.nativeAppVersion);\n }\n if (!attrs.build_number && Constants.nativeBuildVersion) {\n attrs.build_number = String(Constants.nativeBuildVersion);\n }\n }\n\n // expo-updates: OTA bundle id + channel\n if (Updates) {\n if (Updates.updateId) attrs.ota_id = String(Updates.updateId);\n if (Updates.runtimeVersion) attrs.runtime_version = String(Updates.runtimeVersion);\n if (Updates.channel) attrs.ota_channel = String(Updates.channel);\n }\n\n return attrs;\n}\n","/**\n * In-memory ring buffer of the most recent console log lines.\n *\n * NEVER streamed to Loki on its own (would balloon volume + cost). Every\n * outgoing event attaches the current buffer as `attrs.breadcrumbs`, giving\n * the broker the lines that ran in the seconds before the error fired.\n *\n * That context is what the Fix Prompt template surfaces to Cursor/Claude\n * — \"this error happened, and HERE'S WHAT THE APP WAS DOING right before\n * it.\" Without it, the AI just sees a stack trace with no surrounding state.\n */\n\nconst MAX_BREADCRUMBS = 50;\nconst MAX_MESSAGE_CHARS = 500;\n\nexport interface Breadcrumb {\n /** Wall-clock ms timestamp. */\n ts: number;\n /** One of the four console levels (log / info / warn / error). */\n level: 'log' | 'info' | 'warn' | 'error';\n /** Stringified console args, capped at 500 chars. */\n message: string;\n}\n\nconst buffer: Breadcrumb[] = [];\n\nexport function pushBreadcrumb(level: Breadcrumb['level'], args: any[]): void {\n try {\n const message = stringifyArgs(args);\n buffer.push({ ts: Date.now(), level, message });\n if (buffer.length > MAX_BREADCRUMBS) buffer.shift();\n } catch {\n // never let breadcrumb collection crash user code\n }\n}\n\nexport function getBreadcrumbs(): Breadcrumb[] {\n return [...buffer];\n}\n\nexport function clearBreadcrumbs(): void {\n buffer.length = 0;\n}\n\nfunction stringifyArgs(args: any[]): string {\n const parts: string[] = [];\n for (const a of args) {\n if (a instanceof Error) {\n parts.push(`${a.name}: ${a.message}`);\n } else if (typeof a === 'string') {\n parts.push(a);\n } else if (a == null) {\n parts.push(String(a));\n } else {\n try {\n parts.push(JSON.stringify(a));\n } catch {\n parts.push(String(a));\n }\n }\n }\n const joined = parts.join(' ');\n return joined.length > MAX_MESSAGE_CHARS\n ? joined.slice(0, MAX_MESSAGE_CHARS) + '…'\n : joined;\n}\n","export const SDK_NAME = '@fixprompt/react-native';\nexport const SDK_VERSION = '0.0.3';\n","import type { EventPayload, ResolvedConfig } from './types';\nimport { offlineBuffer } from './buffer';\nimport { getState } from './state';\nimport { getDeviceAttrs } from './device';\nimport { getBreadcrumbs } from './breadcrumbs';\nimport { SDK_NAME, SDK_VERSION } from './version';\n\nconst REQUEST_TIMEOUT_MS = 8_000;\n\n/**\n * Sends one event. On network failure (timeout / 5xx / no-network) the event\n * gets buffered; the buffer drains on the next successful send.\n *\n * Never throws — RN apps don't want their event loop killed by a logger.\n */\nexport function sendEvent(\n config: ResolvedConfig,\n payload: Omit<EventPayload, 'service' | 'app' | 'env' | 'attrs'> & {\n attrs?: Record<string, any>;\n service?: string;\n app?: string;\n env?: string;\n },\n): void {\n const state = getState();\n\n const event: EventPayload = {\n service: payload.service ?? config.service,\n app: payload.app ?? config.app,\n env: payload.env ?? config.env,\n level: payload.level,\n message: payload.message,\n stack: payload.stack,\n attrs: {\n ...(payload.attrs ?? {}),\n ...getDeviceAttrs(),\n sdk: SDK_NAME,\n sdk_version: SDK_VERSION,\n release: config.release,\n session_id: state.sessionId,\n device_id: state.deviceId,\n user_id: state.user?.id,\n user_email: state.user?.email,\n breadcrumbs: getBreadcrumbs(),\n },\n synthetic: payload.synthetic,\n };\n\n // Strip undefined attrs (broker accepts strings/numbers, not nulls/undef)\n for (const k of Object.keys(event.attrs)) {\n if (event.attrs[k] === undefined || event.attrs[k] === null) {\n delete event.attrs[k];\n }\n }\n\n void postOrBuffer(config, event);\n}\n\nasync function postOrBuffer(\n config: ResolvedConfig,\n event: EventPayload,\n): Promise<void> {\n // Always drain the buffer first so order is preserved.\n if (!(await tryPost(config, event, /* throwOnFail */ true))) {\n offlineBuffer.push(event);\n return;\n }\n\n // Successfully delivered this one — try to drain any backlog too.\n if (offlineBuffer.size() === 0) return;\n const queued = await offlineBuffer.drain();\n for (const buffered of queued) {\n if (!(await tryPost(config, buffered, true))) {\n // Re-buffer the rest including this one\n offlineBuffer.push(buffered);\n for (let i = queued.indexOf(buffered) + 1; i < queued.length; i++) {\n offlineBuffer.push(queued[i]);\n }\n return;\n }\n }\n}\n\nasync function tryPost(\n config: ResolvedConfig,\n event: EventPayload,\n throwOnFail: boolean,\n): Promise<boolean> {\n try {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), REQUEST_TIMEOUT_MS);\n try {\n const res = await fetch(`${config.endpoint.replace(/\\/$/, '')}/ingest/log`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-loghub-source': config.source,\n 'x-loghub-key': config.projectKey,\n },\n body: JSON.stringify(event),\n signal: ctrl.signal,\n });\n // 4xx → bug on our side; drop, don't buffer\n if (res.status >= 400 && res.status < 500) {\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.warn(`[fixprompt] ${res.status} from broker — dropping event`);\n }\n return true; // \"delivered\" in the sense that we won't re-try\n }\n return res.ok;\n } finally {\n clearTimeout(timer);\n }\n } catch (err) {\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.warn(`[fixprompt] transport error: ${(err as Error).message}`);\n }\n return false;\n }\n}\n","import { sendEvent } from './transport';\nimport type { ResolvedConfig } from './types';\n\n/**\n * Returns the project's user-code stack frame (skips node_modules and the\n * SDK itself). Falls back to the raw stack.\n */\nfunction topStackFrame(stack: string | undefined): string {\n if (!stack) return '';\n for (const raw of stack.split('\\n')) {\n const line = raw.trim();\n if (!line) continue;\n if (line.startsWith('Error')) continue;\n if (/node_modules|@fixprompt/.test(line)) continue;\n return line.slice(0, 200);\n }\n return stack.split('\\n')[0]?.slice(0, 200) ?? '';\n}\n\nexport function installGlobalErrorHandler(config: ResolvedConfig): () => void {\n // ErrorUtils is a React Native global; not present in plain Node tests.\n const ErrorUtils: any = (globalThis as any).ErrorUtils;\n if (!ErrorUtils?.setGlobalHandler) {\n return () => undefined;\n }\n\n const previous = ErrorUtils.getGlobalHandler?.();\n\n const handler = (error: Error, isFatal?: boolean) => {\n try {\n sendEvent(config, {\n level: isFatal ? 'error' : 'warn',\n message: error?.message ?? 'Uncaught error',\n stack: typeof error?.stack === 'string' ? error.stack : undefined,\n attrs: {\n kind: 'rn.globalError',\n severity: isFatal ? 'critical' : 'error',\n error_name: error?.name,\n top_frame: topStackFrame(error?.stack),\n fatal: !!isFatal,\n },\n });\n } catch {\n // never let logger crash propagate\n }\n previous?.(error, isFatal);\n };\n\n ErrorUtils.setGlobalHandler(handler);\n\n return () => {\n if (previous) ErrorUtils.setGlobalHandler(previous);\n };\n}\n\n/**\n * Hook unhandled-promise-rejection tracking. Uses the bundled\n * `promise/setimmediate/rejection-tracking` module that ships with RN.\n */\nexport function installRejectionHandler(config: ResolvedConfig): () => void {\n let tracking: any;\n try {\n // RN's bundled polyfill — present on every RN runtime.\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n tracking = require('promise/setimmediate/rejection-tracking');\n } catch {\n return () => undefined;\n }\n\n tracking.enable({\n allRejections: true,\n onUnhandled: (id: string, error: unknown) => {\n try {\n const isErr = error instanceof Error;\n sendEvent(config, {\n level: 'error',\n message: isErr ? error.message : safeJson(error),\n stack: isErr && typeof error.stack === 'string' ? error.stack : undefined,\n attrs: {\n kind: 'rn.unhandledrejection',\n severity: 'error',\n error_name: isErr ? error.name : typeof error,\n top_frame: isErr ? topStackFrame(error.stack) : '',\n },\n });\n } catch {\n // ignore\n }\n },\n onHandled: () => undefined,\n });\n\n return () => {\n try {\n tracking.disable();\n } catch {\n // ignore\n }\n };\n}\n\nfunction safeJson(v: unknown): string {\n try {\n return JSON.stringify(v);\n } catch {\n return String(v);\n }\n}\n","import { sendEvent } from './transport';\nimport { pushBreadcrumb } from './breadcrumbs';\nimport type { ResolvedConfig } from './types';\n\n/**\n * Patches all four console levels (log / info / warn / error) to push entries\n * into the breadcrumb ring buffer. Forwarding patches below are installed on\n * top of these — they snapshot the buffer BEFORE pushing the current call,\n * so the forwarded event sees the lines that ran before it.\n *\n * No-op-on-failure; never throws.\n */\nexport function patchConsoleForBreadcrumbs(): () => void {\n const originals = {\n log: console.log.bind(console),\n info: console.info.bind(console),\n warn: console.warn.bind(console),\n error: console.error.bind(console),\n };\n\n console.log = (...args: any[]) => {\n pushBreadcrumb('log', args);\n return originals.log(...args);\n };\n console.info = (...args: any[]) => {\n pushBreadcrumb('info', args);\n return originals.info(...args);\n };\n console.warn = (...args: any[]) => {\n pushBreadcrumb('warn', args);\n return originals.warn(...args);\n };\n console.error = (...args: any[]) => {\n pushBreadcrumb('error', args);\n return originals.error(...args);\n };\n\n return () => {\n console.log = originals.log;\n console.info = originals.info;\n console.warn = originals.warn;\n console.error = originals.error;\n };\n}\n\nfunction shouldCapture(args: any[], patterns: RegExp[]): boolean {\n if (patterns.length === 0) return true; // empty list = capture everything\n const first = typeof args[0] === 'string' ? args[0] : '';\n return patterns.some((re) => re.test(first));\n}\n\nfunction stringify(args: any[]): { message: string; stack?: string } {\n const errArg = args.find((a) => a instanceof Error) as Error | undefined;\n const message = args\n .map((a) => {\n if (a instanceof Error) return a.message;\n if (typeof a === 'string') return a;\n try {\n return JSON.stringify(a);\n } catch {\n return String(a);\n }\n })\n .join(' ')\n .slice(0, 4000);\n return {\n message,\n stack: errArg && typeof errArg.stack === 'string' ? errArg.stack : undefined,\n };\n}\n\n/**\n * Wrap console.error so tagged calls forward to the broker as warning-severity\n * events. The original console.error still runs (so RedBox / Metro logs still\n * show up).\n *\n * Pattern is intentional — ProofPix's existing log lines look like\n * `console.error('[Analytics] tracking failure', err)`. Devs prefix their\n * intentional captures and the broker only sees tagged ones.\n */\nexport function patchConsoleError(config: ResolvedConfig): () => void {\n const original = console.error.bind(console);\n console.error = (...args: any[]) => {\n try {\n if (shouldCapture(args, config.captureTags)) {\n const { message, stack } = stringify(args);\n sendEvent(config, {\n level: 'warn',\n message,\n stack,\n attrs: {\n kind: 'console.error',\n severity: 'warning',\n },\n });\n }\n } catch {\n // never block user logs\n }\n return original(...args);\n };\n return () => {\n console.error = original;\n };\n}\n\nexport function patchConsoleWarn(config: ResolvedConfig): () => void {\n const original = console.warn.bind(console);\n console.warn = (...args: any[]) => {\n try {\n if (shouldCapture(args, config.captureTags)) {\n const { message, stack } = stringify(args);\n sendEvent(config, {\n level: 'warn',\n message,\n stack,\n attrs: {\n kind: 'console.warn',\n severity: 'warning',\n },\n });\n }\n } catch {\n // never block\n }\n return original(...args);\n };\n return () => {\n console.warn = original;\n };\n}\n","import { getState, type UserContext } from './state';\nimport { newSessionId, getDeviceId } from './session';\nimport { installGlobalErrorHandler, installRejectionHandler } from './handlers';\nimport {\n patchConsoleError,\n patchConsoleWarn,\n patchConsoleForBreadcrumbs,\n} from './console';\nimport { sendEvent } from './transport';\nimport { offlineBuffer } from './buffer';\nimport { clearBreadcrumbs } from './breadcrumbs';\nimport type { InitOptions, ResolvedConfig } from './types';\n\nconst DEFAULT_ENDPOINT = 'https://geosloghub-production.up.railway.app';\n\nfunction resolveConfig(opts: InitOptions): ResolvedConfig {\n if (!opts?.projectKey) throw new Error('initFixPrompt: projectKey is required');\n if (!opts?.source) throw new Error('initFixPrompt: source is required');\n if (!opts?.service) throw new Error('initFixPrompt: service is required');\n if (!opts?.app) throw new Error('initFixPrompt: app is required');\n\n return {\n projectKey: opts.projectKey,\n source: opts.source,\n endpoint: (opts.endpoint ?? DEFAULT_ENDPOINT).replace(/\\/$/, ''),\n service: opts.service,\n app: opts.app,\n env: opts.env ?? 'prod',\n release: opts.release ?? null,\n captureTags: opts.captureTags ?? [],\n patchConsoleWarn: opts.patchConsoleWarn ?? false,\n patchConsoleError: opts.patchConsoleError ?? true,\n debug: opts.debug ?? false,\n };\n}\n\nexport function initFixPrompt(opts: InitOptions): void {\n const state = getState();\n if (state.initialized) {\n if (opts?.debug) {\n // eslint-disable-next-line no-console\n console.warn('[fixprompt] already initialized — call ignored');\n }\n return;\n }\n\n const config = resolveConfig(opts);\n state.config = config;\n state.sessionId = newSessionId();\n\n // Install breadcrumb capture FIRST so the forwarding patches below wrap\n // these. When ProofPix calls console.warn('[CRM] sync failed'), the\n // captureTags-gated forwarder runs (snapshotting the buffer pre-this-call),\n // then the breadcrumb wrapper pushes the line. Next event ships with this\n // line included.\n state.cleanup.restoreBreadcrumbConsole = patchConsoleForBreadcrumbs();\n\n state.cleanup.removeErrorHandler = installGlobalErrorHandler(config);\n state.cleanup.removeRejectionHandler = installRejectionHandler(config);\n if (config.patchConsoleError) {\n state.cleanup.restoreConsoleError = patchConsoleError(config);\n }\n if (config.patchConsoleWarn) {\n state.cleanup.restoreConsoleWarn = patchConsoleWarn(config);\n }\n\n state.initialized = true;\n\n // Resolve device id + drain any pre-init buffer, async.\n void (async () => {\n try {\n state.deviceId = await getDeviceId();\n await offlineBuffer.load();\n if (offlineBuffer.size() > 0) {\n // Triggers a drain via the transport's natural retry path.\n const items = await offlineBuffer.drain();\n for (const ev of items) {\n // Re-buffer if delivery still fails — transport handles it\n offlineBuffer.push(ev);\n }\n // Kick a drain attempt\n sendEvent(config, {\n level: 'debug',\n message: '[fixprompt] resumed from offline buffer',\n attrs: { kind: 'sdk.startup', buffered: items.length },\n });\n }\n } catch (err) {\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.warn(`[fixprompt] init async setup failed: ${(err as Error).message}`);\n }\n }\n })();\n\n if (config.debug) {\n // eslint-disable-next-line no-console\n console.log('[fixprompt] initialized', {\n endpoint: config.endpoint,\n service: config.service,\n env: config.env,\n session_id: state.sessionId,\n });\n }\n}\n\nexport function captureException(\n err: unknown,\n options: { synthetic?: boolean; attrs?: Record<string, any> } = {},\n): void {\n const state = getState();\n if (!state.initialized || !state.config) return;\n const isErr = err instanceof Error;\n sendEvent(state.config, {\n level: 'error',\n message: isErr ? err.message : String(err),\n stack: isErr && typeof err.stack === 'string' ? err.stack : undefined,\n attrs: {\n kind: 'captureException',\n severity: 'error',\n error_name: isErr ? err.name : typeof err,\n ...(options.attrs ?? {}),\n },\n synthetic: options.synthetic === true,\n });\n}\n\nexport function setUser(user: UserContext | null): void {\n const state = getState();\n state.user = user;\n}\n\n/** Tests + HMR only. Not part of the supported API. @internal */\nexport function _resetForTests(): void {\n const state = getState();\n // Reverse order — forwarding patches were installed AFTER breadcrumbs.\n state.cleanup.restoreConsoleError?.();\n state.cleanup.restoreConsoleWarn?.();\n state.cleanup.restoreBreadcrumbConsole?.();\n state.cleanup.removeErrorHandler?.();\n state.cleanup.removeRejectionHandler?.();\n state.initialized = false;\n state.config = null;\n state.sessionId = null;\n state.deviceId = null;\n state.user = null;\n state.cleanup = {};\n clearBreadcrumbs();\n}\n"],"mappings":"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","names":["Promise","resolve","reject","Promise","id","AsyncStorage"]}
|
package/dist/state.d.ts
CHANGED
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export declare const SDK_NAME = "@fixprompt/react-native";
|
|
2
|
-
export declare const SDK_VERSION = "0.0.
|
|
2
|
+
export declare const SDK_VERSION = "0.0.3";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@fixprompt/react-native",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "FixPrompt React Native SDK — captures uncaught JS errors, unhandled promise rejections, and tagged console output; buffers offline; forwards to the FixPrompt broker.",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"repository": {
|