@plushanalytics/react-native-session-replay 1.2.5 → 3.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/README.md +85 -3
  2. package/lib/commonjs/adapters/mobileReplayAdapter.js +98 -0
  3. package/lib/commonjs/adapters/mobileReplayAdapter.js.map +1 -0
  4. package/lib/commonjs/client.js +41 -0
  5. package/lib/commonjs/client.js.map +1 -0
  6. package/lib/commonjs/index.js +31 -37
  7. package/lib/commonjs/index.js.map +1 -1
  8. package/lib/commonjs/nativeBridge.js +45 -0
  9. package/lib/commonjs/nativeBridge.js.map +1 -0
  10. package/lib/commonjs/provider.js +45 -0
  11. package/lib/commonjs/provider.js.map +1 -0
  12. package/lib/commonjs/types.js +6 -0
  13. package/lib/commonjs/types.js.map +1 -0
  14. package/lib/module/adapters/mobileReplayAdapter.js +93 -0
  15. package/lib/module/adapters/mobileReplayAdapter.js.map +1 -0
  16. package/lib/module/client.js +32 -0
  17. package/lib/module/client.js.map +1 -0
  18. package/lib/module/index.js +3 -33
  19. package/lib/module/index.js.map +1 -1
  20. package/lib/module/nativeBridge.js +36 -0
  21. package/lib/module/nativeBridge.js.map +1 -0
  22. package/lib/module/provider.js +39 -0
  23. package/lib/module/provider.js.map +1 -0
  24. package/lib/module/types.js +4 -0
  25. package/lib/module/types.js.map +1 -0
  26. package/lib/typescript/commonjs/src/adapters/mobileReplayAdapter.d.ts +8 -0
  27. package/lib/typescript/commonjs/src/adapters/mobileReplayAdapter.d.ts.map +1 -0
  28. package/lib/typescript/commonjs/src/client.d.ts +6 -0
  29. package/lib/typescript/commonjs/src/client.d.ts.map +1 -0
  30. package/lib/typescript/commonjs/src/index.d.ts +4 -28
  31. package/lib/typescript/commonjs/src/index.d.ts.map +1 -1
  32. package/lib/typescript/commonjs/src/nativeBridge.d.ts +29 -0
  33. package/lib/typescript/commonjs/src/nativeBridge.d.ts.map +1 -0
  34. package/lib/typescript/commonjs/src/provider.d.ts +12 -0
  35. package/lib/typescript/commonjs/src/provider.d.ts.map +1 -0
  36. package/lib/typescript/commonjs/src/types.d.ts +21 -0
  37. package/lib/typescript/commonjs/src/types.d.ts.map +1 -0
  38. package/lib/typescript/module/src/adapters/mobileReplayAdapter.d.ts +8 -0
  39. package/lib/typescript/module/src/adapters/mobileReplayAdapter.d.ts.map +1 -0
  40. package/lib/typescript/module/src/client.d.ts +6 -0
  41. package/lib/typescript/module/src/client.d.ts.map +1 -0
  42. package/lib/typescript/module/src/index.d.ts +4 -28
  43. package/lib/typescript/module/src/index.d.ts.map +1 -1
  44. package/lib/typescript/module/src/nativeBridge.d.ts +29 -0
  45. package/lib/typescript/module/src/nativeBridge.d.ts.map +1 -0
  46. package/lib/typescript/module/src/provider.d.ts +12 -0
  47. package/lib/typescript/module/src/provider.d.ts.map +1 -0
  48. package/lib/typescript/module/src/types.d.ts +21 -0
  49. package/lib/typescript/module/src/types.d.ts.map +1 -0
  50. package/package.json +22 -25
  51. package/src/adapters/mobileReplayAdapter.ts +113 -0
  52. package/src/client.ts +42 -0
  53. package/src/index.tsx +23 -79
  54. package/src/nativeBridge.ts +79 -0
  55. package/src/provider.tsx +46 -0
  56. package/src/types.ts +59 -0
  57. /package/{posthog-react-native-session-replay.podspec → plush-react-native-session-replay.podspec} +0 -0
package/README.md CHANGED
@@ -1,9 +1,91 @@
1
1
  # @plushanalytics/react-native-session-replay
2
2
 
3
- Session Replay for React Native (Android and iOS)
3
+ React Native SDK for Plush Analytics (events + session replay) with a React Provider/hook.
4
4
 
5
- ## Installation
5
+ ## Install
6
6
 
7
- ```sh
7
+ ```bash
8
8
  npm install @plushanalytics/react-native-session-replay
9
9
  ```
10
+
11
+ > [!NOTE]
12
+ > This package includes native code and is not compatible with Expo Go. Use development builds:
13
+
14
+ ```bash
15
+ npx expo run:ios
16
+ npx expo run:android
17
+ ```
18
+
19
+ ## Quick Setup (Provider + Hook)
20
+
21
+ ```tsx
22
+ import React from "react";
23
+ import { Button } from "react-native";
24
+ import { PlushAnalyticsProvider, usePlushAnalytics } from "@plushanalytics/react-native-session-replay";
25
+
26
+ function CheckoutButton(): JSX.Element {
27
+ const analytics = usePlushAnalytics();
28
+ return (
29
+ <Button
30
+ title="Purchase"
31
+ onPress={() => {
32
+ void analytics.track("purchase_clicked", { properties: { plan: "pro" } });
33
+ }}
34
+ />
35
+ );
36
+ }
37
+
38
+ export default function App(): JSX.Element {
39
+ return (
40
+ <PlushAnalyticsProvider
41
+ config={{
42
+ apiKey: "plsh_live_...",
43
+ projectId: "mobile_app",
44
+ context: { platform: "react-native" }
45
+ }}
46
+ >
47
+ <CheckoutButton />
48
+ </PlushAnalyticsProvider>
49
+ );
50
+ }
51
+ ```
52
+
53
+ ## Direct Client Usage (No React)
54
+
55
+ ```ts
56
+ import { createPlushAnalyticsClient } from "@plushanalytics/react-native-session-replay";
57
+
58
+ const analytics = createPlushAnalyticsClient({
59
+ apiKey: "plsh_live_...",
60
+ projectId: "mobile_app"
61
+ });
62
+
63
+ await analytics.track("app_opened");
64
+ await analytics.shutdown();
65
+ ```
66
+
67
+ ## Common Usage
68
+
69
+ ```ts
70
+ await analytics.track("cta_clicked", { properties: { plan: "pro" } });
71
+ await analytics.identify("user_123", { traits: { plan: "pro" } });
72
+ await analytics.screen("Settings", { properties: { tab: "billing" } });
73
+ await analytics.group("org_456", { traits: { tier: "enterprise" } });
74
+
75
+ await analytics.flush();
76
+ await analytics.reset();
77
+
78
+ await analytics.startSessionRecording();
79
+ await analytics.flushSessionRecording();
80
+ await analytics.stopSessionRecording();
81
+
82
+ analytics.setProject("mobile_app");
83
+ analytics.setContext({ build: 42 });
84
+ ```
85
+
86
+ ## API Surface
87
+
88
+ - `PlushAnalyticsProvider`
89
+ - `usePlushAnalytics()`
90
+ - `createPlushAnalyticsClient(config)`
91
+ - `PlushAnalyticsClient`
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.createMobileReplayRecorderAdapter = createMobileReplayRecorderAdapter;
7
+ var replayModule = _interopRequireWildcard(require("../nativeBridge.js"));
8
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
9
+ const DEFAULT_SNAPSHOT_PATH = "/v1/events/batch";
10
+ const UUID_PATTERN = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;
11
+ function assertNonEmpty(value, field) {
12
+ if (!value || !value.trim()) {
13
+ throw new Error(`${field} is required.`);
14
+ }
15
+ }
16
+ function normalizeHost(value) {
17
+ return value.replace(/\/+$/, "");
18
+ }
19
+ function normalizeSnapshotPath(value) {
20
+ const trimmed = value?.trim();
21
+ if (!trimmed) return DEFAULT_SNAPSHOT_PATH;
22
+ return trimmed.startsWith("/") ? trimmed : `/${trimmed}`;
23
+ }
24
+ function isUuid(value) {
25
+ return UUID_PATTERN.test(value);
26
+ }
27
+ function generateUuid() {
28
+ const cryptoApi = globalThis.crypto;
29
+ if (cryptoApi?.randomUUID) return cryptoApi.randomUUID();
30
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, char => {
31
+ const random = Math.floor(Math.random() * 16);
32
+ const value = char === "x" ? random : random & 0x3 | 0x8;
33
+ return value.toString(16);
34
+ });
35
+ }
36
+ function normalizeReplayConfig(config) {
37
+ return {
38
+ maskAllTextInputs: config?.maskAllTextInputs ?? true,
39
+ maskAllImages: config?.maskAllImages ?? true,
40
+ maskAllSandboxedViews: config?.maskAllSandboxedViews ?? true,
41
+ captureLog: config?.captureLog ?? true,
42
+ captureNetworkTelemetry: config?.captureNetworkTelemetry ?? true,
43
+ throttleDelayMs: config?.throttleDelayMs ?? 1000
44
+ };
45
+ }
46
+ function resolveSessionId(options) {
47
+ const requestedSessionId = options?.sessionId?.trim();
48
+ if (requestedSessionId && isUuid(requestedSessionId)) {
49
+ return requestedSessionId;
50
+ }
51
+ return generateUuid();
52
+ }
53
+ function assertNoPosthogDotCom(host) {
54
+ const lowered = host.toLowerCase();
55
+ const hostName = (() => {
56
+ try {
57
+ return new URL(host).hostname.toLowerCase();
58
+ } catch {
59
+ return lowered;
60
+ }
61
+ })();
62
+ if (hostName === "posthog.com" || hostName.endsWith(".posthog.com")) {
63
+ throw new Error("replayHost must not point to posthog.com (or a subdomain).");
64
+ }
65
+ }
66
+ function createMobileReplayRecorderAdapter(defaults) {
67
+ assertNonEmpty(defaults.apiKey, "apiKey");
68
+ assertNonEmpty(defaults.endpoint, "endpoint");
69
+ return {
70
+ start: async ({
71
+ onSessionId,
72
+ options
73
+ }) => {
74
+ const host = normalizeHost(options?.replayHost?.trim() || defaults.endpoint);
75
+ assertNoPosthogDotCom(host);
76
+ const snapshotPath = normalizeSnapshotPath(options?.replaySnapshotPath);
77
+ const activeSessionId = resolveSessionId(options);
78
+ const sdkOptions = {
79
+ apiKey: defaults.apiKey,
80
+ host,
81
+ debug: false,
82
+ distinctId: options?.userId?.trim() || "",
83
+ anonymousId: "",
84
+ sdkVersion: "plushanalytics-react-native",
85
+ flushAt: 20
86
+ };
87
+ await replayModule.start(activeSessionId, sdkOptions, normalizeReplayConfig(options?.replayConfig), {
88
+ endpoint: snapshotPath
89
+ });
90
+ await replayModule.startSession(activeSessionId);
91
+ onSessionId?.(activeSessionId);
92
+ return () => {
93
+ void replayModule.endSession();
94
+ };
95
+ }
96
+ };
97
+ }
98
+ //# sourceMappingURL=mobileReplayAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["replayModule","_interopRequireWildcard","require","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","DEFAULT_SNAPSHOT_PATH","UUID_PATTERN","assertNonEmpty","value","field","trim","Error","normalizeHost","replace","normalizeSnapshotPath","trimmed","startsWith","isUuid","test","generateUuid","cryptoApi","globalThis","crypto","randomUUID","char","random","Math","floor","toString","normalizeReplayConfig","config","maskAllTextInputs","maskAllImages","maskAllSandboxedViews","captureLog","captureNetworkTelemetry","throttleDelayMs","resolveSessionId","options","requestedSessionId","sessionId","assertNoPosthogDotCom","host","lowered","toLowerCase","hostName","URL","hostname","endsWith","createMobileReplayRecorderAdapter","defaults","apiKey","endpoint","start","onSessionId","replayHost","snapshotPath","replaySnapshotPath","activeSessionId","sdkOptions","debug","distinctId","userId","anonymousId","sdkVersion","flushAt","replayConfig","startSession","endSession"],"sourceRoot":"../../../src","sources":["adapters/mobileReplayAdapter.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "PlushAnalyticsClient", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _javascript.PlushAnalyticsClient;
10
+ }
11
+ });
12
+ exports.createPlushAnalyticsClient = createPlushAnalyticsClient;
13
+ var _javascript = require("@plushanalytics/javascript");
14
+ var _mobileReplayAdapter = require("./adapters/mobileReplayAdapter.js");
15
+ const DEFAULT_ENDPOINT = "https://apim-plushanalytics-prod-rwth6ltqgdxg2.azure-api.net/api";
16
+ function normalizeSource(value) {
17
+ if (typeof value !== "string") return undefined;
18
+ const trimmed = value.trim();
19
+ if (!trimmed) return undefined;
20
+ return trimmed.length > 64 ? trimmed.slice(0, 64) : trimmed;
21
+ }
22
+ function createPlushAnalyticsClient(config) {
23
+ const endpoint = config.endpoint ?? DEFAULT_ENDPOINT;
24
+ const source = normalizeSource(config.source) ?? "mobile";
25
+ const wrapped = {
26
+ ...config,
27
+ endpoint,
28
+ source,
29
+ replay: {
30
+ ...(config.replay ?? {}),
31
+ defaultRecorder: config.replay?.defaultRecorder ?? (0, _mobileReplayAdapter.createMobileReplayRecorderAdapter)({
32
+ apiKey: config.apiKey,
33
+ endpoint
34
+ })
35
+ }
36
+ };
37
+ return (0, _javascript.createPlushAnalyticsClient)(wrapped);
38
+ }
39
+
40
+ // Re-export the type so consumers can pass platform-specific options while using the core surface.
41
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_javascript","require","_mobileReplayAdapter","DEFAULT_ENDPOINT","normalizeSource","value","undefined","trimmed","trim","length","slice","createPlushAnalyticsClient","config","endpoint","source","wrapped","replay","defaultRecorder","createMobileReplayRecorderAdapter","apiKey","createCoreClient"],"sourceRoot":"../../src","sources":["client.ts"],"mappings":";;;;;;;;;;;;AAAA,IAAAA,WAAA,GAAAC,OAAA;AAIA,IAAAC,oBAAA,GAAAD,OAAA;AAKA,MAAME,gBAAgB,GAAG,kEAAkE;AAE3F,SAASC,eAAeA,CAACC,KAAc,EAAsB;EAC3D,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE,OAAOC,SAAS;EAC/C,MAAMC,OAAO,GAAGF,KAAK,CAACG,IAAI,CAAC,CAAC;EAC5B,IAAI,CAACD,OAAO,EAAE,OAAOD,SAAS;EAC9B,OAAOC,OAAO,CAACE,MAAM,GAAG,EAAE,GAAGF,OAAO,CAACG,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAGH,OAAO;AAC7D;AAEO,SAASI,0BAA0BA,CAACC,MAA4B,EAAwB;EAC7F,MAAMC,QAAQ,GAAGD,MAAM,CAACC,QAAQ,IAAIV,gBAAgB;EACpD,MAAMW,MAAM,GAAGV,eAAe,CAACQ,MAAM,CAACE,MAAM,CAAC,IAAI,QAAQ;EAEzD,MAAMC,OAA6B,GAAG;IACpC,GAAGH,MAAM;IACTC,QAAQ;IACRC,MAAM;IACNE,MAAM,EAAE;MACN,IAAIJ,MAAM,CAACI,MAAM,IAAI,CAAC,CAAC,CAAC;MACxBC,eAAe,EACbL,MAAM,CAACI,MAAM,EAAEC,eAAe,IAC9B,IAAAC,sDAAiC,EAAC;QAChCC,MAAM,EAAEP,MAAM,CAACO,MAAM;QACrBN;MACF,CAAC;IACL;EACF,CAAC;EAED,OAAO,IAAAO,sCAAgB,EAACL,OAAO,CAAC;AAClC;;AAEA","ignoreList":[]}
@@ -3,43 +3,37 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.default = void 0;
7
- exports.endSession = endSession;
8
- exports.identify = identify;
9
- exports.isEnabled = isEnabled;
10
- exports.start = start;
11
- exports.startSession = startSession;
12
- var _reactNative = require("react-native");
13
- const LINKING_ERROR = `The package '@plushanalytics/react-native-session-replay' doesn't seem to be linked. Make sure: \n\n` + _reactNative.Platform.select({
14
- ios: "- You have run 'pod install'\n",
15
- default: ''
16
- }) + '- You rebuilt the app after installing the package\n' + '- You are not using Expo Go\n';
17
- const PosthogReactNativeSessionReplay = _reactNative.NativeModules.PosthogReactNativeSessionReplay ? _reactNative.NativeModules.PosthogReactNativeSessionReplay : new Proxy({}, {
18
- get() {
19
- throw new Error(LINKING_ERROR);
6
+ Object.defineProperty(exports, "PlushAnalyticsClient", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _client.PlushAnalyticsClient;
20
10
  }
21
11
  });
22
- function start(sessionId, sdkOptions, sdkReplayConfig, decideReplayConfig) {
23
- return PosthogReactNativeSessionReplay.start(sessionId, sdkOptions, sdkReplayConfig, decideReplayConfig);
24
- }
25
- function startSession(sessionId) {
26
- return PosthogReactNativeSessionReplay.startSession(sessionId);
27
- }
28
- function endSession() {
29
- return PosthogReactNativeSessionReplay.endSession();
30
- }
31
- function isEnabled() {
32
- return PosthogReactNativeSessionReplay.isEnabled();
33
- }
34
- function identify(distinctId, anonymousId) {
35
- return PosthogReactNativeSessionReplay.identify(distinctId, anonymousId);
36
- }
37
- const PostHogReactNativeSessionReplay = {
38
- start,
39
- startSession,
40
- endSession,
41
- isEnabled,
42
- identify
43
- };
44
- var _default = exports.default = PostHogReactNativeSessionReplay;
12
+ Object.defineProperty(exports, "PlushAnalyticsProvider", {
13
+ enumerable: true,
14
+ get: function () {
15
+ return _provider.PlushAnalyticsProvider;
16
+ }
17
+ });
18
+ Object.defineProperty(exports, "createMobileReplayRecorderAdapter", {
19
+ enumerable: true,
20
+ get: function () {
21
+ return _mobileReplayAdapter.createMobileReplayRecorderAdapter;
22
+ }
23
+ });
24
+ Object.defineProperty(exports, "createPlushAnalyticsClient", {
25
+ enumerable: true,
26
+ get: function () {
27
+ return _client.createPlushAnalyticsClient;
28
+ }
29
+ });
30
+ Object.defineProperty(exports, "usePlushAnalytics", {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _provider.usePlushAnalytics;
34
+ }
35
+ });
36
+ var _client = require("./client.js");
37
+ var _mobileReplayAdapter = require("./adapters/mobileReplayAdapter.js");
38
+ var _provider = require("./provider.js");
45
39
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_reactNative","require","LINKING_ERROR","Platform","select","ios","default","PosthogReactNativeSessionReplay","NativeModules","Proxy","get","Error","start","sessionId","sdkOptions","sdkReplayConfig","decideReplayConfig","startSession","endSession","isEnabled","identify","distinctId","anonymousId","PostHogReactNativeSessionReplay","_default","exports"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAEA,MAAMC,aAAa,GACjB,sGAAsG,GACtGC,qBAAQ,CAACC,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;AAEjC,MAAMC,+BAA+B,GACnCC,0BAAa,CAACD,+BAA+B,GACzCC,0BAAa,CAACD,+BAA+B,GAC7C,IAAIE,KAAK,CACP,CAAC,CAAC,EACF;EACEC,GAAGA,CAAA,EAAG;IACJ,MAAM,IAAIC,KAAK,CAACT,aAAa,CAAC;EAChC;AACF,CACF,CAAC;AAEA,SAASU,KAAKA,CACnBC,SAAiB,EACjBC,UAAkC,EAClCC,eAAuC,EACvCC,kBAA0C,EAC3B;EACf,OAAOT,+BAA+B,CAACK,KAAK,CAC1CC,SAAS,EACTC,UAAU,EACVC,eAAe,EACfC,kBACF,CAAC;AACH;AAEO,SAASC,YAAYA,CAACJ,SAAiB,EAAiB;EAC7D,OAAON,+BAA+B,CAACU,YAAY,CAACJ,SAAS,CAAC;AAChE;AAEO,SAASK,UAAUA,CAAA,EAAkB;EAC1C,OAAOX,+BAA+B,CAACW,UAAU,CAAC,CAAC;AACrD;AAEO,SAASC,SAASA,CAAA,EAAqB;EAC5C,OAAOZ,+BAA+B,CAACY,SAAS,CAAC,CAAC;AACpD;AAEO,SAASC,QAAQA,CACtBC,UAAkB,EAClBC,WAAmB,EACJ;EACf,OAAOf,+BAA+B,CAACa,QAAQ,CAACC,UAAU,EAAEC,WAAW,CAAC;AAC1E;AAmBA,MAAMC,+BAAsE,GAAG;EAC7EX,KAAK;EACLK,YAAY;EACZC,UAAU;EACVC,SAAS;EACTC;AACF,CAAC;AAAC,IAAAI,QAAA,GAAAC,OAAA,CAAAnB,OAAA,GAEaiB,+BAA+B","ignoreList":[]}
1
+ {"version":3,"names":["_client","require","_mobileReplayAdapter","_provider"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,oBAAA,GAAAD,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA","ignoreList":[]}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ exports.endSession = endSession;
8
+ exports.identify = identify;
9
+ exports.isEnabled = isEnabled;
10
+ exports.start = start;
11
+ exports.startSession = startSession;
12
+ var _reactNative = require("react-native");
13
+ const LINKING_ERROR = `The package '@plushanalytics/react-native-session-replay' doesn't seem to be linked. Make sure: \n\n` + _reactNative.Platform.select({
14
+ ios: "- You have run 'pod install'\n",
15
+ default: ''
16
+ }) + '- You rebuilt the app after installing the package\n' + '- You are not using Expo Go\n';
17
+ const PosthogReactNativeSessionReplay = _reactNative.NativeModules.PosthogReactNativeSessionReplay ? _reactNative.NativeModules.PosthogReactNativeSessionReplay : new Proxy({}, {
18
+ get() {
19
+ throw new Error(LINKING_ERROR);
20
+ }
21
+ });
22
+ function start(sessionId, sdkOptions, sdkReplayConfig, decideReplayConfig) {
23
+ return PosthogReactNativeSessionReplay.start(sessionId, sdkOptions, sdkReplayConfig, decideReplayConfig);
24
+ }
25
+ function startSession(sessionId) {
26
+ return PosthogReactNativeSessionReplay.startSession(sessionId);
27
+ }
28
+ function endSession() {
29
+ return PosthogReactNativeSessionReplay.endSession();
30
+ }
31
+ function isEnabled() {
32
+ return PosthogReactNativeSessionReplay.isEnabled();
33
+ }
34
+ function identify(distinctId, anonymousId) {
35
+ return PosthogReactNativeSessionReplay.identify(distinctId, anonymousId);
36
+ }
37
+ const PostHogReactNativeSessionReplay = {
38
+ start,
39
+ startSession,
40
+ endSession,
41
+ isEnabled,
42
+ identify
43
+ };
44
+ var _default = exports.default = PostHogReactNativeSessionReplay;
45
+ //# sourceMappingURL=nativeBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reactNative","require","LINKING_ERROR","Platform","select","ios","default","PosthogReactNativeSessionReplay","NativeModules","Proxy","get","Error","start","sessionId","sdkOptions","sdkReplayConfig","decideReplayConfig","startSession","endSession","isEnabled","identify","distinctId","anonymousId","PostHogReactNativeSessionReplay","_default","exports"],"sourceRoot":"../../src","sources":["nativeBridge.ts"],"mappings":";;;;;;;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AAEA,MAAMC,aAAa,GACjB,sGAAsG,GACtGC,qBAAQ,CAACC,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;AAEjC,MAAMC,+BAA+B,GACnCC,0BAAa,CAACD,+BAA+B,GACzCC,0BAAa,CAACD,+BAA+B,GAC7C,IAAIE,KAAK,CACP,CAAC,CAAC,EACF;EACEC,GAAGA,CAAA,EAAG;IACJ,MAAM,IAAIC,KAAK,CAACT,aAAa,CAAC;EAChC;AACF,CACF,CAAC;AAEA,SAASU,KAAKA,CACnBC,SAAiB,EACjBC,UAAkC,EAClCC,eAAuC,EACvCC,kBAA0C,EAC3B;EACf,OAAOT,+BAA+B,CAACK,KAAK,CAC1CC,SAAS,EACTC,UAAU,EACVC,eAAe,EACfC,kBACF,CAAC;AACH;AAEO,SAASC,YAAYA,CAACJ,SAAiB,EAAiB;EAC7D,OAAON,+BAA+B,CAACU,YAAY,CAACJ,SAAS,CAAC;AAChE;AAEO,SAASK,UAAUA,CAAA,EAAkB;EAC1C,OAAOX,+BAA+B,CAACW,UAAU,CAAC,CAAC;AACrD;AAEO,SAASC,SAASA,CAAA,EAAqB;EAC5C,OAAOZ,+BAA+B,CAACY,SAAS,CAAC,CAAC;AACpD;AAEO,SAASC,QAAQA,CACtBC,UAAkB,EAClBC,WAAmB,EACJ;EACf,OAAOf,+BAA+B,CAACa,QAAQ,CAACC,UAAU,EAAEC,WAAW,CAAC;AAC1E;AAmBA,MAAMC,+BAAsE,GAAG;EAC7EX,KAAK;EACLK,YAAY;EACZC,UAAU;EACVC,SAAS;EACTC;AACF,CAAC;AAAC,IAAAI,QAAA,GAAAC,OAAA,CAAAnB,OAAA,GAEaiB,+BAA+B","ignoreList":[]}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.PlushAnalyticsProvider = PlushAnalyticsProvider;
7
+ exports.usePlushAnalytics = usePlushAnalytics;
8
+ var _react = _interopRequireWildcard(require("react"));
9
+ var _client = require("./client.js");
10
+ var _jsxRuntime = require("react/jsx-runtime");
11
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
12
+ const PlushAnalyticsContext = /*#__PURE__*/(0, _react.createContext)(null);
13
+ function PlushAnalyticsProvider({
14
+ children,
15
+ config,
16
+ client
17
+ }) {
18
+ const clientRef = (0, _react.useRef)(null);
19
+ if (!clientRef.current) {
20
+ if (client) {
21
+ clientRef.current = client;
22
+ } else if (config) {
23
+ clientRef.current = (0, _client.createPlushAnalyticsClient)(config);
24
+ } else {
25
+ throw new Error("PlushAnalyticsProvider requires either a `client` or `config` prop.");
26
+ }
27
+ }
28
+ (0, _react.useEffect)(() => {
29
+ return () => {
30
+ void clientRef.current?.shutdown();
31
+ };
32
+ }, []);
33
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(PlushAnalyticsContext.Provider, {
34
+ value: clientRef.current,
35
+ children: children
36
+ });
37
+ }
38
+ function usePlushAnalytics() {
39
+ const context = (0, _react.useContext)(PlushAnalyticsContext);
40
+ if (!context) {
41
+ throw new Error("usePlushAnalytics must be used inside PlushAnalyticsProvider.");
42
+ }
43
+ return context;
44
+ }
45
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_client","_jsxRuntime","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","PlushAnalyticsContext","createContext","PlushAnalyticsProvider","children","config","client","clientRef","useRef","current","createPlushAnalyticsClient","Error","useEffect","shutdown","jsx","Provider","value","usePlushAnalytics","context","useContext"],"sourceRoot":"../../src","sources":["provider.tsx"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,OAAA,GAAAD,OAAA;AAAiF,IAAAE,WAAA,GAAAF,OAAA;AAAA,SAAAD,wBAAAI,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAN,uBAAA,YAAAA,CAAAI,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AASjF,MAAMkB,qBAAqB,gBAAG,IAAAC,oBAAa,EAAwB,IAAI,CAAC;AAEjE,SAASC,sBAAsBA,CAAC;EACrCC,QAAQ;EACRC,MAAM;EACNC;AAC2B,CAAC,EAAsB;EAClD,MAAMC,SAAS,GAAG,IAAAC,aAAM,EAA8B,IAAI,CAAC;EAE3D,IAAI,CAACD,SAAS,CAACE,OAAO,EAAE;IACtB,IAAIH,MAAM,EAAE;MACVC,SAAS,CAACE,OAAO,GAAGH,MAAM;IAC5B,CAAC,MAAM,IAAID,MAAM,EAAE;MACjBE,SAAS,CAACE,OAAO,GAAG,IAAAC,kCAA0B,EAACL,MAAM,CAAC;IACxD,CAAC,MAAM;MACL,MAAM,IAAIM,KAAK,CAAC,qEAAqE,CAAC;IACxF;EACF;EAEA,IAAAC,gBAAS,EAAC,MAAM;IACd,OAAO,MAAM;MACX,KAAKL,SAAS,CAACE,OAAO,EAAEI,QAAQ,CAAC,CAAC;IACpC,CAAC;EACH,CAAC,EAAE,EAAE,CAAC;EAEN,oBAAO,IAAAhC,WAAA,CAAAiC,GAAA,EAACb,qBAAqB,CAACc,QAAQ;IAACC,KAAK,EAAET,SAAS,CAACE,OAAQ;IAAAL,QAAA,EAAEA;EAAQ,CAAiC,CAAC;AAC9G;AAEO,SAASa,iBAAiBA,CAAA,EAAmB;EAClD,MAAMC,OAAO,GAAG,IAAAC,iBAAU,EAAClB,qBAAqB,CAAC;EACjD,IAAI,CAACiB,OAAO,EAAE;IACZ,MAAM,IAAIP,KAAK,CAAC,+DAA+D,CAAC;EAClF;EAEA,OAAOO,OAAO;AAChB","ignoreList":[]}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":[],"sourceRoot":"../../src","sources":["types.ts"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+
3
+ import * as replayModule from "../nativeBridge.js";
4
+ const DEFAULT_SNAPSHOT_PATH = "/v1/events/batch";
5
+ const UUID_PATTERN = /^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$/;
6
+ function assertNonEmpty(value, field) {
7
+ if (!value || !value.trim()) {
8
+ throw new Error(`${field} is required.`);
9
+ }
10
+ }
11
+ function normalizeHost(value) {
12
+ return value.replace(/\/+$/, "");
13
+ }
14
+ function normalizeSnapshotPath(value) {
15
+ const trimmed = value?.trim();
16
+ if (!trimmed) return DEFAULT_SNAPSHOT_PATH;
17
+ return trimmed.startsWith("/") ? trimmed : `/${trimmed}`;
18
+ }
19
+ function isUuid(value) {
20
+ return UUID_PATTERN.test(value);
21
+ }
22
+ function generateUuid() {
23
+ const cryptoApi = globalThis.crypto;
24
+ if (cryptoApi?.randomUUID) return cryptoApi.randomUUID();
25
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, char => {
26
+ const random = Math.floor(Math.random() * 16);
27
+ const value = char === "x" ? random : random & 0x3 | 0x8;
28
+ return value.toString(16);
29
+ });
30
+ }
31
+ function normalizeReplayConfig(config) {
32
+ return {
33
+ maskAllTextInputs: config?.maskAllTextInputs ?? true,
34
+ maskAllImages: config?.maskAllImages ?? true,
35
+ maskAllSandboxedViews: config?.maskAllSandboxedViews ?? true,
36
+ captureLog: config?.captureLog ?? true,
37
+ captureNetworkTelemetry: config?.captureNetworkTelemetry ?? true,
38
+ throttleDelayMs: config?.throttleDelayMs ?? 1000
39
+ };
40
+ }
41
+ function resolveSessionId(options) {
42
+ const requestedSessionId = options?.sessionId?.trim();
43
+ if (requestedSessionId && isUuid(requestedSessionId)) {
44
+ return requestedSessionId;
45
+ }
46
+ return generateUuid();
47
+ }
48
+ function assertNoPosthogDotCom(host) {
49
+ const lowered = host.toLowerCase();
50
+ const hostName = (() => {
51
+ try {
52
+ return new URL(host).hostname.toLowerCase();
53
+ } catch {
54
+ return lowered;
55
+ }
56
+ })();
57
+ if (hostName === "posthog.com" || hostName.endsWith(".posthog.com")) {
58
+ throw new Error("replayHost must not point to posthog.com (or a subdomain).");
59
+ }
60
+ }
61
+ export function createMobileReplayRecorderAdapter(defaults) {
62
+ assertNonEmpty(defaults.apiKey, "apiKey");
63
+ assertNonEmpty(defaults.endpoint, "endpoint");
64
+ return {
65
+ start: async ({
66
+ onSessionId,
67
+ options
68
+ }) => {
69
+ const host = normalizeHost(options?.replayHost?.trim() || defaults.endpoint);
70
+ assertNoPosthogDotCom(host);
71
+ const snapshotPath = normalizeSnapshotPath(options?.replaySnapshotPath);
72
+ const activeSessionId = resolveSessionId(options);
73
+ const sdkOptions = {
74
+ apiKey: defaults.apiKey,
75
+ host,
76
+ debug: false,
77
+ distinctId: options?.userId?.trim() || "",
78
+ anonymousId: "",
79
+ sdkVersion: "plushanalytics-react-native",
80
+ flushAt: 20
81
+ };
82
+ await replayModule.start(activeSessionId, sdkOptions, normalizeReplayConfig(options?.replayConfig), {
83
+ endpoint: snapshotPath
84
+ });
85
+ await replayModule.startSession(activeSessionId);
86
+ onSessionId?.(activeSessionId);
87
+ return () => {
88
+ void replayModule.endSession();
89
+ };
90
+ }
91
+ };
92
+ }
93
+ //# sourceMappingURL=mobileReplayAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["replayModule","DEFAULT_SNAPSHOT_PATH","UUID_PATTERN","assertNonEmpty","value","field","trim","Error","normalizeHost","replace","normalizeSnapshotPath","trimmed","startsWith","isUuid","test","generateUuid","cryptoApi","globalThis","crypto","randomUUID","char","random","Math","floor","toString","normalizeReplayConfig","config","maskAllTextInputs","maskAllImages","maskAllSandboxedViews","captureLog","captureNetworkTelemetry","throttleDelayMs","resolveSessionId","options","requestedSessionId","sessionId","assertNoPosthogDotCom","host","lowered","toLowerCase","hostName","URL","hostname","endsWith","createMobileReplayRecorderAdapter","defaults","apiKey","endpoint","start","onSessionId","replayHost","snapshotPath","replaySnapshotPath","activeSessionId","sdkOptions","debug","distinctId","userId","anonymousId","sdkVersion","flushAt","replayConfig","startSession","endSession"],"sourceRoot":"../../../src","sources":["adapters/mobileReplayAdapter.ts"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+
3
+ import { createPlushAnalyticsClient as createCoreClient, PlushAnalyticsClient } from "@plushanalytics/javascript";
4
+ import { createMobileReplayRecorderAdapter } from "./adapters/mobileReplayAdapter.js";
5
+ export { PlushAnalyticsClient };
6
+ const DEFAULT_ENDPOINT = "https://apim-plushanalytics-prod-rwth6ltqgdxg2.azure-api.net/api";
7
+ function normalizeSource(value) {
8
+ if (typeof value !== "string") return undefined;
9
+ const trimmed = value.trim();
10
+ if (!trimmed) return undefined;
11
+ return trimmed.length > 64 ? trimmed.slice(0, 64) : trimmed;
12
+ }
13
+ export function createPlushAnalyticsClient(config) {
14
+ const endpoint = config.endpoint ?? DEFAULT_ENDPOINT;
15
+ const source = normalizeSource(config.source) ?? "mobile";
16
+ const wrapped = {
17
+ ...config,
18
+ endpoint,
19
+ source,
20
+ replay: {
21
+ ...(config.replay ?? {}),
22
+ defaultRecorder: config.replay?.defaultRecorder ?? createMobileReplayRecorderAdapter({
23
+ apiKey: config.apiKey,
24
+ endpoint
25
+ })
26
+ }
27
+ };
28
+ return createCoreClient(wrapped);
29
+ }
30
+
31
+ // Re-export the type so consumers can pass platform-specific options while using the core surface.
32
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createPlushAnalyticsClient","createCoreClient","PlushAnalyticsClient","createMobileReplayRecorderAdapter","DEFAULT_ENDPOINT","normalizeSource","value","undefined","trimmed","trim","length","slice","config","endpoint","source","wrapped","replay","defaultRecorder","apiKey"],"sourceRoot":"../../src","sources":["client.ts"],"mappings":";;AAAA,SACEA,0BAA0B,IAAIC,gBAAgB,EAC9CC,oBAAoB,QACf,4BAA4B;AACnC,SAASC,iCAAiC,QAAQ,mCAAgC;AAGlF,SAASD,oBAAoB;AAE7B,MAAME,gBAAgB,GAAG,kEAAkE;AAE3F,SAASC,eAAeA,CAACC,KAAc,EAAsB;EAC3D,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE,OAAOC,SAAS;EAC/C,MAAMC,OAAO,GAAGF,KAAK,CAACG,IAAI,CAAC,CAAC;EAC5B,IAAI,CAACD,OAAO,EAAE,OAAOD,SAAS;EAC9B,OAAOC,OAAO,CAACE,MAAM,GAAG,EAAE,GAAGF,OAAO,CAACG,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAGH,OAAO;AAC7D;AAEA,OAAO,SAASR,0BAA0BA,CAACY,MAA4B,EAAwB;EAC7F,MAAMC,QAAQ,GAAGD,MAAM,CAACC,QAAQ,IAAIT,gBAAgB;EACpD,MAAMU,MAAM,GAAGT,eAAe,CAACO,MAAM,CAACE,MAAM,CAAC,IAAI,QAAQ;EAEzD,MAAMC,OAA6B,GAAG;IACpC,GAAGH,MAAM;IACTC,QAAQ;IACRC,MAAM;IACNE,MAAM,EAAE;MACN,IAAIJ,MAAM,CAACI,MAAM,IAAI,CAAC,CAAC,CAAC;MACxBC,eAAe,EACbL,MAAM,CAACI,MAAM,EAAEC,eAAe,IAC9Bd,iCAAiC,CAAC;QAChCe,MAAM,EAAEN,MAAM,CAACM,MAAM;QACrBL;MACF,CAAC;IACL;EACF,CAAC;EAED,OAAOZ,gBAAgB,CAACc,OAAO,CAAC;AAClC;;AAEA","ignoreList":[]}
@@ -1,36 +1,6 @@
1
1
  "use strict";
2
2
 
3
- import { NativeModules, Platform } from 'react-native';
4
- const LINKING_ERROR = `The package '@plushanalytics/react-native-session-replay' doesn't seem to be linked. Make sure: \n\n` + Platform.select({
5
- ios: "- You have run 'pod install'\n",
6
- default: ''
7
- }) + '- You rebuilt the app after installing the package\n' + '- You are not using Expo Go\n';
8
- const PosthogReactNativeSessionReplay = NativeModules.PosthogReactNativeSessionReplay ? NativeModules.PosthogReactNativeSessionReplay : new Proxy({}, {
9
- get() {
10
- throw new Error(LINKING_ERROR);
11
- }
12
- });
13
- export function start(sessionId, sdkOptions, sdkReplayConfig, decideReplayConfig) {
14
- return PosthogReactNativeSessionReplay.start(sessionId, sdkOptions, sdkReplayConfig, decideReplayConfig);
15
- }
16
- export function startSession(sessionId) {
17
- return PosthogReactNativeSessionReplay.startSession(sessionId);
18
- }
19
- export function endSession() {
20
- return PosthogReactNativeSessionReplay.endSession();
21
- }
22
- export function isEnabled() {
23
- return PosthogReactNativeSessionReplay.isEnabled();
24
- }
25
- export function identify(distinctId, anonymousId) {
26
- return PosthogReactNativeSessionReplay.identify(distinctId, anonymousId);
27
- }
28
- const PostHogReactNativeSessionReplay = {
29
- start,
30
- startSession,
31
- endSession,
32
- isEnabled,
33
- identify
34
- };
35
- export default PostHogReactNativeSessionReplay;
3
+ export { createPlushAnalyticsClient, PlushAnalyticsClient } from "./client.js";
4
+ export { createMobileReplayRecorderAdapter } from "./adapters/mobileReplayAdapter.js";
5
+ export { PlushAnalyticsProvider, usePlushAnalytics } from "./provider.js";
36
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["NativeModules","Platform","LINKING_ERROR","select","ios","default","PosthogReactNativeSessionReplay","Proxy","get","Error","start","sessionId","sdkOptions","sdkReplayConfig","decideReplayConfig","startSession","endSession","isEnabled","identify","distinctId","anonymousId","PostHogReactNativeSessionReplay"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,aAAa,EAAEC,QAAQ,QAAQ,cAAc;AAEtD,MAAMC,aAAa,GACjB,sGAAsG,GACtGD,QAAQ,CAACE,MAAM,CAAC;EAAEC,GAAG,EAAE,gCAAgC;EAAEC,OAAO,EAAE;AAAG,CAAC,CAAC,GACvE,sDAAsD,GACtD,+BAA+B;AAEjC,MAAMC,+BAA+B,GACnCN,aAAa,CAACM,+BAA+B,GACzCN,aAAa,CAACM,+BAA+B,GAC7C,IAAIC,KAAK,CACP,CAAC,CAAC,EACF;EACEC,GAAGA,CAAA,EAAG;IACJ,MAAM,IAAIC,KAAK,CAACP,aAAa,CAAC;EAChC;AACF,CACF,CAAC;AAEP,OAAO,SAASQ,KAAKA,CACnBC,SAAiB,EACjBC,UAAkC,EAClCC,eAAuC,EACvCC,kBAA0C,EAC3B;EACf,OAAOR,+BAA+B,CAACI,KAAK,CAC1CC,SAAS,EACTC,UAAU,EACVC,eAAe,EACfC,kBACF,CAAC;AACH;AAEA,OAAO,SAASC,YAAYA,CAACJ,SAAiB,EAAiB;EAC7D,OAAOL,+BAA+B,CAACS,YAAY,CAACJ,SAAS,CAAC;AAChE;AAEA,OAAO,SAASK,UAAUA,CAAA,EAAkB;EAC1C,OAAOV,+BAA+B,CAACU,UAAU,CAAC,CAAC;AACrD;AAEA,OAAO,SAASC,SAASA,CAAA,EAAqB;EAC5C,OAAOX,+BAA+B,CAACW,SAAS,CAAC,CAAC;AACpD;AAEA,OAAO,SAASC,QAAQA,CACtBC,UAAkB,EAClBC,WAAmB,EACJ;EACf,OAAOd,+BAA+B,CAACY,QAAQ,CAACC,UAAU,EAAEC,WAAW,CAAC;AAC1E;AAmBA,MAAMC,+BAAsE,GAAG;EAC7EX,KAAK;EACLK,YAAY;EACZC,UAAU;EACVC,SAAS;EACTC;AACF,CAAC;AAED,eAAeG,+BAA+B","ignoreList":[]}
1
+ {"version":3,"names":["createPlushAnalyticsClient","PlushAnalyticsClient","createMobileReplayRecorderAdapter","PlushAnalyticsProvider","usePlushAnalytics"],"sourceRoot":"../../src","sources":["index.tsx"],"mappings":";;AAAA,SAASA,0BAA0B,EAAEC,oBAAoB,QAAQ,aAAU;AAC3E,SAASC,iCAAiC,QAAQ,mCAAgC;AAClF,SAASC,sBAAsB,EAAEC,iBAAiB,QAAQ,eAAY","ignoreList":[]}