@amplytools/react-native-amply-sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/LICENSE +178 -0
  2. package/README.md +714 -0
  3. package/android/build.gradle +90 -0
  4. package/android/consumer-rules.pro +1 -0
  5. package/android/gradle.properties +3 -0
  6. package/android/settings.gradle +9 -0
  7. package/android/src/main/AndroidManifest.xml +3 -0
  8. package/android/src/main/java/tools/amply/sdk/reactnative/AmplyModule.kt +384 -0
  9. package/android/src/main/java/tools/amply/sdk/reactnative/AmplyPackage.kt +39 -0
  10. package/android/src/main/java/tools/amply/sdk/reactnative/core/AmplyClient.kt +30 -0
  11. package/android/src/main/java/tools/amply/sdk/reactnative/core/DefaultAmplyClient.kt +296 -0
  12. package/android/src/main/java/tools/amply/sdk/reactnative/model/AmplyInitializationOptions.kt +10 -0
  13. package/android/src/main/java/tools/amply/sdk/reactnative/model/DataSetType.kt +42 -0
  14. package/android/src/main/java/tools/amply/sdk/reactnative/model/DataSetTypeMapper.kt +38 -0
  15. package/android/src/main/java/tools/amply/sdk/reactnative/model/DeepLinkPayload.kt +8 -0
  16. package/android/src/main/java/tools/amply/sdk/reactnative/model/EventEnvelope.kt +9 -0
  17. package/android/src/main/jni/AmplyTurboModule.cpp +29 -0
  18. package/android/src/main/jni/CMakeLists.txt +76 -0
  19. package/android/src/newarch/java/tools/amply/sdk/reactnative/NativeAmplyModuleSpec.java +75 -0
  20. package/android/src/newarch/jni/AmplyReactNative-generated.cpp +77 -0
  21. package/android/src/newarch/jni/AmplyReactNative.h +31 -0
  22. package/android/src/newarch/jni/CMakeLists.txt +40 -0
  23. package/app.plugin.js +1 -0
  24. package/dist/index.js +272 -0
  25. package/dist/index.js.map +1 -0
  26. package/dist/index.mjs +234 -0
  27. package/dist/index.mjs.map +1 -0
  28. package/dist/plugin/index.d.ts +6 -0
  29. package/dist/plugin/index.d.ts.map +1 -0
  30. package/dist/plugin/index.js +186 -0
  31. package/dist/plugin/index.js.map +1 -0
  32. package/dist/plugin/index.mjs +169 -0
  33. package/dist/plugin/index.mjs.map +1 -0
  34. package/dist/plugin/src/index.d.ts +6 -0
  35. package/dist/plugin/src/index.d.ts.map +1 -0
  36. package/dist/plugin/src/index.js +3 -0
  37. package/dist/plugin/src/withAmply.d.ts +30 -0
  38. package/dist/plugin/src/withAmply.d.ts.map +1 -0
  39. package/dist/plugin/src/withAmply.js +51 -0
  40. package/dist/plugin/withAmply.d.ts +12 -0
  41. package/dist/plugin/withAmply.d.ts.map +1 -0
  42. package/dist/src/__tests__/index.test.d.ts +2 -0
  43. package/dist/src/__tests__/index.test.d.ts.map +1 -0
  44. package/dist/src/__tests__/index.test.js +70 -0
  45. package/dist/src/hooks/useAmplySystemEvents.d.ts +12 -0
  46. package/dist/src/hooks/useAmplySystemEvents.d.ts.map +1 -0
  47. package/dist/src/hooks/useAmplySystemEvents.js +56 -0
  48. package/dist/src/index.d.ts +32 -0
  49. package/dist/src/index.d.ts.map +1 -0
  50. package/dist/src/index.js +80 -0
  51. package/dist/src/nativeModule.d.ts +5 -0
  52. package/dist/src/nativeModule.d.ts.map +1 -0
  53. package/dist/src/nativeModule.js +48 -0
  54. package/dist/src/nativeSpecs/NativeAmplyModule.d.ts +75 -0
  55. package/dist/src/nativeSpecs/NativeAmplyModule.d.ts.map +1 -0
  56. package/dist/src/nativeSpecs/NativeAmplyModule.js +2 -0
  57. package/dist/src/systemEventUtils.d.ts +3 -0
  58. package/dist/src/systemEventUtils.d.ts.map +1 -0
  59. package/dist/src/systemEventUtils.js +30 -0
  60. package/dist/src/systemEvents.d.ts +6 -0
  61. package/dist/src/systemEvents.d.ts.map +1 -0
  62. package/dist/src/systemEvents.js +8 -0
  63. package/dist/tsconfig.tsbuildinfo +1 -0
  64. package/docs/ARCHITECTURE.md +1115 -0
  65. package/expo-module.config.json +11 -0
  66. package/ios/AmplyReactNative.podspec +32 -0
  67. package/ios/README.md +11 -0
  68. package/ios/Sources/AmplyReactNative/AmplyModule.mm +332 -0
  69. package/ios/Sources/AmplyReactNative/AmplyReactNative/AmplyReactNative-generated.mm +111 -0
  70. package/ios/Sources/AmplyReactNative/AmplyReactNative/AmplyReactNative.h +152 -0
  71. package/package.json +71 -0
  72. package/plugin/build/index.d.ts +5 -0
  73. package/plugin/build/index.js +8 -0
  74. package/plugin/build/withAmply.d.ts +29 -0
  75. package/plugin/build/withAmply.js +53 -0
  76. package/plugin/src/index.ts +7 -0
  77. package/plugin/src/withAmply.ts +68 -0
  78. package/plugin/tsconfig.json +8 -0
  79. package/plugin/tsconfig.tsbuildinfo +1 -0
  80. package/react-native.config.js +34 -0
  81. package/scripts/codegen.js +212 -0
  82. package/src/__tests__/index.test.ts +92 -0
  83. package/src/hooks/useAmplySystemEvents.ts +75 -0
  84. package/src/index.ts +115 -0
  85. package/src/nativeModule.ts +65 -0
  86. package/src/nativeSpecs/NativeAmplyModule.ts +80 -0
  87. package/src/systemEventUtils.ts +35 -0
  88. package/src/systemEvents.ts +13 -0
@@ -0,0 +1,31 @@
1
+
2
+ /**
3
+ * This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
4
+ *
5
+ * Do not edit this file as changes may cause incorrect behavior and will be lost
6
+ * once the code is regenerated.
7
+ *
8
+ * @generated by codegen project: GenerateModuleJniH.js
9
+ */
10
+
11
+ #pragma once
12
+
13
+ #include <ReactCommon/JavaTurboModule.h>
14
+ #include <ReactCommon/TurboModule.h>
15
+ #include <jsi/jsi.h>
16
+
17
+ namespace facebook::react {
18
+
19
+ /**
20
+ * JNI C++ class for module 'NativeAmplyModule'
21
+ */
22
+ class JSI_EXPORT NativeAmplyModuleSpecJSI : public JavaTurboModule {
23
+ public:
24
+ NativeAmplyModuleSpecJSI(const JavaTurboModule::InitParams &params);
25
+ };
26
+
27
+
28
+ JSI_EXPORT
29
+ std::shared_ptr<TurboModule> AmplyReactNative_ModuleProvider(const std::string &moduleName, const JavaTurboModule::InitParams &params);
30
+
31
+ } // namespace facebook::react
@@ -0,0 +1,40 @@
1
+ # Copyright (c) Meta Platforms, Inc. and affiliates.
2
+ #
3
+ # This source code is licensed under the MIT license found in the
4
+ # LICENSE file in the root directory of this source tree.
5
+
6
+ cmake_minimum_required(VERSION 3.13)
7
+ set(CMAKE_VERBOSE_MAKEFILE on)
8
+
9
+ # --- React Native 0.79: wire up compile flags ---
10
+ if(NOT DEFINED REACT_NATIVE_DIR)
11
+ message(FATAL_ERROR "REACT_NATIVE_DIR is not defined; it must point to node_modules/react-native")
12
+ endif()
13
+
14
+ # Gradle (externalNativeBuild) passes REACT_NATIVE_DIR.
15
+ # From it we derive ReactCommon path used by RN CMake utils.
16
+ set(REACT_COMMON_DIR "${REACT_NATIVE_DIR}/ReactCommon")
17
+
18
+ # This provides target_compile_reactnative_options and imported targets
19
+ # like 'reactnative', 'jsi', 'fbjni', etc.
20
+ include(${REACT_COMMON_DIR}/cmake-utils/react-native-flags.cmake)
21
+ # --- end RN wiring ---
22
+ # Ensure fbjni is available as imported target
23
+ find_package(fbjni REQUIRED CONFIG)
24
+
25
+ # For OBJECT libraries, we need to explicitly add include directories since
26
+ # target_link_libraries doesn't propagate INTERFACE_INCLUDE_DIRECTORIES for OBJECT libs
27
+ set(REACT_JSI_DIR "${REACT_COMMON_DIR}/jsi")
28
+
29
+ file(GLOB react_codegen_SRCS CONFIGURE_DEPENDS *.cpp react/renderer/components/AmplyReactNative/*.cpp)
30
+
31
+ add_library(
32
+ react_codegen_AmplyReactNative
33
+ OBJECT
34
+ ${react_codegen_SRCS}
35
+ )
36
+
37
+ target_include_directories(react_codegen_AmplyReactNative PUBLIC . react/renderer/components/AmplyReactNative ${REACT_JSI_DIR})
38
+
39
+
40
+ target_compile_reactnative_options(react_codegen_AmplyReactNative PRIVATE)
package/app.plugin.js ADDED
@@ -0,0 +1 @@
1
+ module.exports = require('./plugin/build');
package/dist/index.js ADDED
@@ -0,0 +1,272 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ addDeepLinkListener: () => addDeepLinkListener,
24
+ addSystemEventListener: () => addSystemEventListener2,
25
+ addSystemEventsListener: () => addSystemEventsListener,
26
+ default: () => src_default,
27
+ formatSystemEventLabel: () => formatSystemEventLabel,
28
+ getDataSetSnapshot: () => getDataSetSnapshot,
29
+ getRecentEvents: () => getRecentEvents,
30
+ initialize: () => initialize,
31
+ isInitialized: () => isInitialized,
32
+ removeAllListeners: () => removeAllListeners,
33
+ systemEvents: () => systemEvents,
34
+ track: () => track,
35
+ useAmplySystemEvents: () => useAmplySystemEvents
36
+ });
37
+ module.exports = __toCommonJS(src_exports);
38
+
39
+ // src/nativeModule.ts
40
+ var import_react_native = require("react-native");
41
+ var MODULE_NAME = "Amply";
42
+ var cachedModule = null;
43
+ var attemptedTurboLookup = false;
44
+ var resolvedTurboModule = null;
45
+ function loadModule() {
46
+ const globalWithTurbo = globalThis;
47
+ if (globalWithTurbo.__turboModuleProxy != null) {
48
+ if (!attemptedTurboLookup) {
49
+ attemptedTurboLookup = true;
50
+ try {
51
+ resolvedTurboModule = import_react_native.TurboModuleRegistry.getEnforcing(MODULE_NAME);
52
+ } catch (error) {
53
+ resolvedTurboModule = null;
54
+ if (__DEV__) {
55
+ console.warn(
56
+ "[Amply] TurboModule lookup failed; falling back to legacy NativeModules. " + (error instanceof Error ? error.message : String(error))
57
+ );
58
+ }
59
+ }
60
+ }
61
+ if (resolvedTurboModule) {
62
+ return resolvedTurboModule;
63
+ }
64
+ }
65
+ const legacyModule = import_react_native.NativeModules[MODULE_NAME];
66
+ if (legacyModule) {
67
+ return legacyModule;
68
+ }
69
+ return null;
70
+ }
71
+ function getNativeModule() {
72
+ if (cachedModule) {
73
+ return cachedModule;
74
+ }
75
+ const module2 = loadModule();
76
+ if (!module2) {
77
+ throw new Error(
78
+ `Amply native module '${MODULE_NAME}' not found. Ensure the module is properly linked and new architecture is enabled.`
79
+ );
80
+ }
81
+ cachedModule = module2;
82
+ return cachedModule;
83
+ }
84
+ var nativeModule_default = getNativeModule;
85
+
86
+ // src/systemEvents.ts
87
+ async function addSystemEventListener(listener) {
88
+ const subscription = nativeModule_default().onSystemEvent(listener);
89
+ return () => {
90
+ var _a;
91
+ return (_a = subscription == null ? void 0 : subscription.remove) == null ? void 0 : _a.call(subscription);
92
+ };
93
+ }
94
+
95
+ // src/hooks/useAmplySystemEvents.ts
96
+ var import_react = require("react");
97
+ function useAmplySystemEvents(options = {}) {
98
+ const { maxEntries = 50, dedupe = true, onEvent } = options;
99
+ const [events, setEvents] = (0, import_react.useState)([]);
100
+ const seenKeysRef = (0, import_react.useRef)(/* @__PURE__ */ new Set());
101
+ const handlerRef = (0, import_react.useRef)(onEvent);
102
+ (0, import_react.useEffect)(() => {
103
+ handlerRef.current = onEvent;
104
+ }, [onEvent]);
105
+ (0, import_react.useEffect)(() => {
106
+ let unsubscribe;
107
+ let isMounted = true;
108
+ addSystemEventListener((event) => {
109
+ var _a;
110
+ if (!isMounted) {
111
+ return;
112
+ }
113
+ if (dedupe) {
114
+ const key = `${event.name}-${event.timestamp}`;
115
+ if (seenKeysRef.current.has(key)) {
116
+ return;
117
+ }
118
+ seenKeysRef.current.add(key);
119
+ }
120
+ (_a = handlerRef.current) == null ? void 0 : _a.call(handlerRef, event);
121
+ setEvents((prev) => {
122
+ const next = [...prev, event];
123
+ if (next.length > maxEntries) {
124
+ next.splice(0, next.length - maxEntries);
125
+ }
126
+ return next;
127
+ });
128
+ }).then((unsub) => {
129
+ if (!isMounted) {
130
+ unsub();
131
+ } else {
132
+ unsubscribe = unsub;
133
+ }
134
+ }).catch((error) => {
135
+ console.warn("[Amply] system event listener error", error);
136
+ });
137
+ return () => {
138
+ isMounted = false;
139
+ unsubscribe == null ? void 0 : unsubscribe();
140
+ };
141
+ }, [dedupe, maxEntries]);
142
+ const reset = (0, import_react.useCallback)(() => {
143
+ seenKeysRef.current.clear();
144
+ setEvents([]);
145
+ }, []);
146
+ return { events, reset };
147
+ }
148
+
149
+ // src/systemEventUtils.ts
150
+ var DEFAULT_LABELS = {
151
+ SdkInitialized: "SDK initialized",
152
+ ConfigFetchStarted: "Config fetch started",
153
+ ConfigFetchFinished: "Config fetch finished",
154
+ SessionStarted: "Session started",
155
+ SessionFinished: "Session finished",
156
+ CampaignShown: "Campaign shown",
157
+ EventTriggered: "Event triggered",
158
+ CampaignStarted: "Campaign processing started",
159
+ CampaignFinished: "Campaign finished"
160
+ };
161
+ function formatSystemEventLabel(event) {
162
+ var _a, _b;
163
+ if (event.name === "CampaignShown") {
164
+ const campaignId = event.properties.campaignId;
165
+ const source = event.properties.source;
166
+ return `Campaign shown${campaignId ? ` (${campaignId})` : ""}${source ? ` via ${source}` : ""}`;
167
+ }
168
+ if (event.name === "EventTriggered") {
169
+ const source = event.properties.sourceEvent;
170
+ return source ? `Event triggered (${source})` : (_a = DEFAULT_LABELS[event.name]) != null ? _a : event.name;
171
+ }
172
+ if (event.name === "ConfigFetchFinished") {
173
+ const success = event.properties.success;
174
+ const campaignCount = event.properties.campaignCount;
175
+ const countLabel = typeof campaignCount === "number" ? ` (${campaignCount} campaigns)` : "";
176
+ return success === false ? "Config fetch failed" : `Config fetch finished${countLabel}`;
177
+ }
178
+ return (_b = DEFAULT_LABELS[event.name]) != null ? _b : `System event ${event.name}`;
179
+ }
180
+
181
+ // src/index.ts
182
+ var deepLinkRegistered = false;
183
+ var deepLinkSubscriptions = /* @__PURE__ */ new Set();
184
+ async function ensureDeepLinkRegistration() {
185
+ if (!deepLinkRegistered) {
186
+ console.log("[Amply] Calling registerDeepLinkListener on native module");
187
+ nativeModule_default().registerDeepLinkListener();
188
+ deepLinkRegistered = true;
189
+ console.log("[Amply] registerDeepLinkListener completed");
190
+ }
191
+ }
192
+ function trackDeepLinkSubscription(subscription) {
193
+ let removed = false;
194
+ const unsubscribe = () => {
195
+ var _a;
196
+ if (removed) {
197
+ return;
198
+ }
199
+ removed = true;
200
+ (_a = subscription == null ? void 0 : subscription.remove) == null ? void 0 : _a.call(subscription);
201
+ deepLinkSubscriptions.delete(unsubscribe);
202
+ };
203
+ deepLinkSubscriptions.add(unsubscribe);
204
+ return unsubscribe;
205
+ }
206
+ async function initialize(config) {
207
+ await nativeModule_default().initialize(config);
208
+ }
209
+ function isInitialized() {
210
+ return nativeModule_default().isInitialized();
211
+ }
212
+ async function track(payload) {
213
+ await nativeModule_default().track(payload);
214
+ }
215
+ async function getRecentEvents(limit) {
216
+ return nativeModule_default().getRecentEvents(limit);
217
+ }
218
+ async function getDataSetSnapshot(type) {
219
+ return nativeModule_default().getDataSetSnapshot(type);
220
+ }
221
+ async function addDeepLinkListener(listener) {
222
+ await ensureDeepLinkRegistration();
223
+ const subscription = nativeModule_default().onDeepLink(listener);
224
+ return trackDeepLinkSubscription(subscription);
225
+ }
226
+ async function addSystemEventListener2(listener) {
227
+ return addSystemEventListener(listener);
228
+ }
229
+ function removeAllListeners() {
230
+ deepLinkSubscriptions.forEach((unsubscribe) => {
231
+ try {
232
+ unsubscribe();
233
+ } catch (error) {
234
+ console.warn("[Amply] Failed to remove deep link listener", error);
235
+ }
236
+ });
237
+ deepLinkSubscriptions.clear();
238
+ }
239
+ function addSystemEventsListener(listener) {
240
+ return addSystemEventListener2(listener);
241
+ }
242
+ var systemEvents = {
243
+ addListener: addSystemEventsListener
244
+ };
245
+ var src_default = {
246
+ initialize,
247
+ isInitialized,
248
+ track,
249
+ getRecentEvents,
250
+ getDataSetSnapshot,
251
+ addDeepLinkListener,
252
+ addSystemEventListener: addSystemEventListener2,
253
+ addSystemEventsListener,
254
+ removeAllListeners,
255
+ systemEvents
256
+ };
257
+ // Annotate the CommonJS export names for ESM import in node:
258
+ 0 && (module.exports = {
259
+ addDeepLinkListener,
260
+ addSystemEventListener,
261
+ addSystemEventsListener,
262
+ formatSystemEventLabel,
263
+ getDataSetSnapshot,
264
+ getRecentEvents,
265
+ initialize,
266
+ isInitialized,
267
+ removeAllListeners,
268
+ systemEvents,
269
+ track,
270
+ useAmplySystemEvents
271
+ });
272
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/nativeModule.ts","../src/systemEvents.ts","../src/hooks/useAmplySystemEvents.ts","../src/systemEventUtils.ts"],"sourcesContent":["import getNativeModule from './nativeModule';\nimport {addSystemEventListener as addSystemEventListenerInternal} from './systemEvents';\nexport {useAmplySystemEvents} from './hooks/useAmplySystemEvents';\nexport {formatSystemEventLabel} from './systemEventUtils';\nimport type {\n AmplyInitializationConfig,\n DataSetSnapshot,\n DataSetType,\n DeepLinkEvent,\n EventRecord,\n TrackEventPayload,\n} from './nativeSpecs/NativeAmplyModule';\n\nlet deepLinkRegistered = false;\nconst deepLinkSubscriptions = new Set<() => void>();\n\nasync function ensureDeepLinkRegistration(): Promise<void> {\n if (!deepLinkRegistered) {\n console.log('[Amply] Calling registerDeepLinkListener on native module');\n getNativeModule().registerDeepLinkListener();\n deepLinkRegistered = true;\n console.log('[Amply] registerDeepLinkListener completed');\n }\n}\n\nfunction trackDeepLinkSubscription(subscription?: {remove?: () => void}): () => void {\n let removed = false;\n const unsubscribe = () => {\n if (removed) {\n return;\n }\n removed = true;\n subscription?.remove?.();\n deepLinkSubscriptions.delete(unsubscribe);\n };\n deepLinkSubscriptions.add(unsubscribe);\n return unsubscribe;\n}\n\nexport async function initialize(config: AmplyInitializationConfig): Promise<void> {\n await getNativeModule().initialize(config);\n}\n\nexport function isInitialized(): boolean {\n return getNativeModule().isInitialized();\n}\n\nexport async function track(payload: TrackEventPayload): Promise<void> {\n await getNativeModule().track(payload);\n}\n\nexport async function getRecentEvents(limit: number): Promise<EventRecord[]> {\n return getNativeModule().getRecentEvents(limit);\n}\n\nexport async function getDataSetSnapshot(type: DataSetType): Promise<DataSetSnapshot> {\n return getNativeModule().getDataSetSnapshot(type);\n}\n\nexport async function addDeepLinkListener(\n listener: (event: DeepLinkEvent) => void\n): Promise<() => void> {\n await ensureDeepLinkRegistration();\n const subscription = getNativeModule().onDeepLink(listener);\n return trackDeepLinkSubscription(subscription);\n}\n\nexport async function addSystemEventListener(\n listener: (event: EventRecord) => void\n): Promise<() => void> {\n return addSystemEventListenerInternal(listener);\n}\n\nexport function removeAllListeners(): void {\n deepLinkSubscriptions.forEach(unsubscribe => {\n try {\n unsubscribe();\n } catch (error) {\n console.warn('[Amply] Failed to remove deep link listener', error);\n }\n });\n deepLinkSubscriptions.clear();\n}\n\nexport type {\n AmplyInitializationConfig,\n DataSetSnapshot,\n DataSetType,\n DeepLinkEvent,\n EventRecord,\n TrackEventPayload,\n};\n\nexport function addSystemEventsListener(\n listener: (event: EventRecord) => void,\n): Promise<() => void> {\n return addSystemEventListener(listener);\n}\n\nexport const systemEvents = {\n addListener: addSystemEventsListener,\n};\n\nexport default {\n initialize,\n isInitialized,\n track,\n getRecentEvents,\n getDataSetSnapshot,\n addDeepLinkListener,\n addSystemEventListener,\n addSystemEventsListener,\n removeAllListeners,\n systemEvents,\n};\n","import {NativeModules, TurboModuleRegistry} from 'react-native';\nimport type {Spec} from './nativeSpecs/NativeAmplyModule';\n\nconst MODULE_NAME = 'Amply';\n\nlet cachedModule: Spec | null = null;\nlet attemptedTurboLookup = false;\nlet resolvedTurboModule: Spec | null = null;\n\nfunction loadModule(): Spec | null {\n const globalWithTurbo = globalThis as typeof globalThis & {\n __turboModuleProxy?: unknown;\n };\n\n if (globalWithTurbo.__turboModuleProxy != null) {\n if (!attemptedTurboLookup) {\n attemptedTurboLookup = true;\n try {\n resolvedTurboModule = TurboModuleRegistry.getEnforcing<Spec>(MODULE_NAME);\n } catch (error) {\n resolvedTurboModule = null;\n if (__DEV__) {\n console.warn(\n \"[Amply] TurboModule lookup failed; falling back to legacy NativeModules. \" +\n (error instanceof Error ? error.message : String(error))\n );\n }\n }\n }\n if (resolvedTurboModule) {\n return resolvedTurboModule;\n }\n }\n\n const legacyModule = NativeModules[MODULE_NAME] as Spec | undefined;\n if (legacyModule) {\n return legacyModule;\n }\n\n return null;\n}\n\nexport function getNativeModule(): Spec {\n if (cachedModule) {\n return cachedModule;\n }\n\n const module = loadModule();\n if (!module) {\n throw new Error(\n `Amply native module '${MODULE_NAME}' not found. ` +\n 'Ensure the module is properly linked and new architecture is enabled.'\n );\n }\n\n cachedModule = module;\n return cachedModule;\n}\n\n// Testing hook to override the resolved native module.\nexport function __setNativeModule(mock: Spec | null): void {\n cachedModule = mock;\n}\n\nexport default getNativeModule;\n","import getNativeModule from './nativeModule';\nimport type {SystemEventPayload} from './nativeSpecs/NativeAmplyModule';\n\nexport async function addSystemEventListener(\n listener: (event: SystemEventPayload) => void,\n): Promise<() => void> {\n const subscription = getNativeModule().onSystemEvent(listener);\n return () => subscription?.remove?.();\n}\n\nexport const systemEvents = {\n addListener: addSystemEventListener,\n};\n","import {useCallback, useEffect, useRef, useState} from 'react';\nimport type {EventRecord} from '../nativeSpecs/NativeAmplyModule';\nimport {addSystemEventListener} from '../systemEvents';\n\nexport type UseAmplySystemEventsOptions = {\n maxEntries?: number;\n dedupe?: boolean;\n onEvent?: (event: EventRecord) => void;\n};\n\nexport type UseAmplySystemEventsResult = {\n events: EventRecord[];\n reset: () => void;\n};\n\nexport function useAmplySystemEvents(\n options: UseAmplySystemEventsOptions = {},\n): UseAmplySystemEventsResult {\n const {maxEntries = 50, dedupe = true, onEvent} = options;\n const [events, setEvents] = useState<EventRecord[]>([]);\n const seenKeysRef = useRef<Set<string>>(new Set());\n const handlerRef = useRef<typeof onEvent>(onEvent);\n\n useEffect(() => {\n handlerRef.current = onEvent;\n }, [onEvent]);\n\n useEffect(() => {\n let unsubscribe: (() => void) | undefined;\n let isMounted = true;\n\n addSystemEventListener(event => {\n if (!isMounted) {\n return;\n }\n if (dedupe) {\n const key = `${event.name}-${event.timestamp}`;\n if (seenKeysRef.current.has(key)) {\n return;\n }\n seenKeysRef.current.add(key);\n }\n handlerRef.current?.(event);\n setEvents(prev => {\n const next = [...prev, event];\n if (next.length > maxEntries) {\n next.splice(0, next.length - maxEntries);\n }\n return next;\n });\n })\n .then(unsub => {\n if (!isMounted) {\n unsub();\n } else {\n unsubscribe = unsub;\n }\n })\n .catch(error => {\n console.warn('[Amply] system event listener error', error);\n });\n\n return () => {\n isMounted = false;\n unsubscribe?.();\n };\n }, [dedupe, maxEntries]);\n\n const reset = useCallback(() => {\n seenKeysRef.current.clear();\n setEvents([]);\n }, []);\n\n return {events, reset};\n}\n","import type {EventRecord} from './nativeSpecs/NativeAmplyModule';\n\nconst DEFAULT_LABELS: Record<string, string> = {\n SdkInitialized: 'SDK initialized',\n ConfigFetchStarted: 'Config fetch started',\n ConfigFetchFinished: 'Config fetch finished',\n SessionStarted: 'Session started',\n SessionFinished: 'Session finished',\n CampaignShown: 'Campaign shown',\n EventTriggered: 'Event triggered',\n CampaignStarted: 'Campaign processing started',\n CampaignFinished: 'Campaign finished',\n};\n\nexport function formatSystemEventLabel(event: EventRecord): string {\n if (event.name === 'CampaignShown') {\n const campaignId = event.properties.campaignId as string | undefined;\n const source = event.properties.source as string | undefined;\n return `Campaign shown${campaignId ? ` (${campaignId})` : ''}${\n source ? ` via ${source}` : ''\n }`;\n }\n if (event.name === 'EventTriggered') {\n const source = event.properties.sourceEvent as string | undefined;\n return source ? `Event triggered (${source})` : DEFAULT_LABELS[event.name] ?? event.name;\n }\n if (event.name === 'ConfigFetchFinished') {\n const success = event.properties.success as boolean | undefined;\n const campaignCount = event.properties.campaignCount as number | undefined;\n const countLabel =\n typeof campaignCount === 'number' ? ` (${campaignCount} campaigns)` : '';\n return success === false ? 'Config fetch failed' : `Config fetch finished${countLabel}`;\n }\n return DEFAULT_LABELS[event.name] ?? `System event ${event.name}`;\n}\n"],"mappings":"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","names":["addSystemEventListener","module","addSystemEventListener"]}
package/dist/index.mjs ADDED
@@ -0,0 +1,234 @@
1
+ // src/nativeModule.ts
2
+ import { NativeModules, TurboModuleRegistry } from "react-native";
3
+ var MODULE_NAME = "Amply";
4
+ var cachedModule = null;
5
+ var attemptedTurboLookup = false;
6
+ var resolvedTurboModule = null;
7
+ function loadModule() {
8
+ const globalWithTurbo = globalThis;
9
+ if (globalWithTurbo.__turboModuleProxy != null) {
10
+ if (!attemptedTurboLookup) {
11
+ attemptedTurboLookup = true;
12
+ try {
13
+ resolvedTurboModule = TurboModuleRegistry.getEnforcing(MODULE_NAME);
14
+ } catch (error) {
15
+ resolvedTurboModule = null;
16
+ if (__DEV__) {
17
+ console.warn(
18
+ "[Amply] TurboModule lookup failed; falling back to legacy NativeModules. " + (error instanceof Error ? error.message : String(error))
19
+ );
20
+ }
21
+ }
22
+ }
23
+ if (resolvedTurboModule) {
24
+ return resolvedTurboModule;
25
+ }
26
+ }
27
+ const legacyModule = NativeModules[MODULE_NAME];
28
+ if (legacyModule) {
29
+ return legacyModule;
30
+ }
31
+ return null;
32
+ }
33
+ function getNativeModule() {
34
+ if (cachedModule) {
35
+ return cachedModule;
36
+ }
37
+ const module = loadModule();
38
+ if (!module) {
39
+ throw new Error(
40
+ `Amply native module '${MODULE_NAME}' not found. Ensure the module is properly linked and new architecture is enabled.`
41
+ );
42
+ }
43
+ cachedModule = module;
44
+ return cachedModule;
45
+ }
46
+ var nativeModule_default = getNativeModule;
47
+
48
+ // src/systemEvents.ts
49
+ async function addSystemEventListener(listener) {
50
+ const subscription = nativeModule_default().onSystemEvent(listener);
51
+ return () => {
52
+ var _a;
53
+ return (_a = subscription == null ? void 0 : subscription.remove) == null ? void 0 : _a.call(subscription);
54
+ };
55
+ }
56
+
57
+ // src/hooks/useAmplySystemEvents.ts
58
+ import { useCallback, useEffect, useRef, useState } from "react";
59
+ function useAmplySystemEvents(options = {}) {
60
+ const { maxEntries = 50, dedupe = true, onEvent } = options;
61
+ const [events, setEvents] = useState([]);
62
+ const seenKeysRef = useRef(/* @__PURE__ */ new Set());
63
+ const handlerRef = useRef(onEvent);
64
+ useEffect(() => {
65
+ handlerRef.current = onEvent;
66
+ }, [onEvent]);
67
+ useEffect(() => {
68
+ let unsubscribe;
69
+ let isMounted = true;
70
+ addSystemEventListener((event) => {
71
+ var _a;
72
+ if (!isMounted) {
73
+ return;
74
+ }
75
+ if (dedupe) {
76
+ const key = `${event.name}-${event.timestamp}`;
77
+ if (seenKeysRef.current.has(key)) {
78
+ return;
79
+ }
80
+ seenKeysRef.current.add(key);
81
+ }
82
+ (_a = handlerRef.current) == null ? void 0 : _a.call(handlerRef, event);
83
+ setEvents((prev) => {
84
+ const next = [...prev, event];
85
+ if (next.length > maxEntries) {
86
+ next.splice(0, next.length - maxEntries);
87
+ }
88
+ return next;
89
+ });
90
+ }).then((unsub) => {
91
+ if (!isMounted) {
92
+ unsub();
93
+ } else {
94
+ unsubscribe = unsub;
95
+ }
96
+ }).catch((error) => {
97
+ console.warn("[Amply] system event listener error", error);
98
+ });
99
+ return () => {
100
+ isMounted = false;
101
+ unsubscribe == null ? void 0 : unsubscribe();
102
+ };
103
+ }, [dedupe, maxEntries]);
104
+ const reset = useCallback(() => {
105
+ seenKeysRef.current.clear();
106
+ setEvents([]);
107
+ }, []);
108
+ return { events, reset };
109
+ }
110
+
111
+ // src/systemEventUtils.ts
112
+ var DEFAULT_LABELS = {
113
+ SdkInitialized: "SDK initialized",
114
+ ConfigFetchStarted: "Config fetch started",
115
+ ConfigFetchFinished: "Config fetch finished",
116
+ SessionStarted: "Session started",
117
+ SessionFinished: "Session finished",
118
+ CampaignShown: "Campaign shown",
119
+ EventTriggered: "Event triggered",
120
+ CampaignStarted: "Campaign processing started",
121
+ CampaignFinished: "Campaign finished"
122
+ };
123
+ function formatSystemEventLabel(event) {
124
+ var _a, _b;
125
+ if (event.name === "CampaignShown") {
126
+ const campaignId = event.properties.campaignId;
127
+ const source = event.properties.source;
128
+ return `Campaign shown${campaignId ? ` (${campaignId})` : ""}${source ? ` via ${source}` : ""}`;
129
+ }
130
+ if (event.name === "EventTriggered") {
131
+ const source = event.properties.sourceEvent;
132
+ return source ? `Event triggered (${source})` : (_a = DEFAULT_LABELS[event.name]) != null ? _a : event.name;
133
+ }
134
+ if (event.name === "ConfigFetchFinished") {
135
+ const success = event.properties.success;
136
+ const campaignCount = event.properties.campaignCount;
137
+ const countLabel = typeof campaignCount === "number" ? ` (${campaignCount} campaigns)` : "";
138
+ return success === false ? "Config fetch failed" : `Config fetch finished${countLabel}`;
139
+ }
140
+ return (_b = DEFAULT_LABELS[event.name]) != null ? _b : `System event ${event.name}`;
141
+ }
142
+
143
+ // src/index.ts
144
+ var deepLinkRegistered = false;
145
+ var deepLinkSubscriptions = /* @__PURE__ */ new Set();
146
+ async function ensureDeepLinkRegistration() {
147
+ if (!deepLinkRegistered) {
148
+ console.log("[Amply] Calling registerDeepLinkListener on native module");
149
+ nativeModule_default().registerDeepLinkListener();
150
+ deepLinkRegistered = true;
151
+ console.log("[Amply] registerDeepLinkListener completed");
152
+ }
153
+ }
154
+ function trackDeepLinkSubscription(subscription) {
155
+ let removed = false;
156
+ const unsubscribe = () => {
157
+ var _a;
158
+ if (removed) {
159
+ return;
160
+ }
161
+ removed = true;
162
+ (_a = subscription == null ? void 0 : subscription.remove) == null ? void 0 : _a.call(subscription);
163
+ deepLinkSubscriptions.delete(unsubscribe);
164
+ };
165
+ deepLinkSubscriptions.add(unsubscribe);
166
+ return unsubscribe;
167
+ }
168
+ async function initialize(config) {
169
+ await nativeModule_default().initialize(config);
170
+ }
171
+ function isInitialized() {
172
+ return nativeModule_default().isInitialized();
173
+ }
174
+ async function track(payload) {
175
+ await nativeModule_default().track(payload);
176
+ }
177
+ async function getRecentEvents(limit) {
178
+ return nativeModule_default().getRecentEvents(limit);
179
+ }
180
+ async function getDataSetSnapshot(type) {
181
+ return nativeModule_default().getDataSetSnapshot(type);
182
+ }
183
+ async function addDeepLinkListener(listener) {
184
+ await ensureDeepLinkRegistration();
185
+ const subscription = nativeModule_default().onDeepLink(listener);
186
+ return trackDeepLinkSubscription(subscription);
187
+ }
188
+ async function addSystemEventListener2(listener) {
189
+ return addSystemEventListener(listener);
190
+ }
191
+ function removeAllListeners() {
192
+ deepLinkSubscriptions.forEach((unsubscribe) => {
193
+ try {
194
+ unsubscribe();
195
+ } catch (error) {
196
+ console.warn("[Amply] Failed to remove deep link listener", error);
197
+ }
198
+ });
199
+ deepLinkSubscriptions.clear();
200
+ }
201
+ function addSystemEventsListener(listener) {
202
+ return addSystemEventListener2(listener);
203
+ }
204
+ var systemEvents = {
205
+ addListener: addSystemEventsListener
206
+ };
207
+ var src_default = {
208
+ initialize,
209
+ isInitialized,
210
+ track,
211
+ getRecentEvents,
212
+ getDataSetSnapshot,
213
+ addDeepLinkListener,
214
+ addSystemEventListener: addSystemEventListener2,
215
+ addSystemEventsListener,
216
+ removeAllListeners,
217
+ systemEvents
218
+ };
219
+ export {
220
+ addDeepLinkListener,
221
+ addSystemEventListener2 as addSystemEventListener,
222
+ addSystemEventsListener,
223
+ src_default as default,
224
+ formatSystemEventLabel,
225
+ getDataSetSnapshot,
226
+ getRecentEvents,
227
+ initialize,
228
+ isInitialized,
229
+ removeAllListeners,
230
+ systemEvents,
231
+ track,
232
+ useAmplySystemEvents
233
+ };
234
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/nativeModule.ts","../src/systemEvents.ts","../src/hooks/useAmplySystemEvents.ts","../src/systemEventUtils.ts","../src/index.ts"],"sourcesContent":["import {NativeModules, TurboModuleRegistry} from 'react-native';\nimport type {Spec} from './nativeSpecs/NativeAmplyModule';\n\nconst MODULE_NAME = 'Amply';\n\nlet cachedModule: Spec | null = null;\nlet attemptedTurboLookup = false;\nlet resolvedTurboModule: Spec | null = null;\n\nfunction loadModule(): Spec | null {\n const globalWithTurbo = globalThis as typeof globalThis & {\n __turboModuleProxy?: unknown;\n };\n\n if (globalWithTurbo.__turboModuleProxy != null) {\n if (!attemptedTurboLookup) {\n attemptedTurboLookup = true;\n try {\n resolvedTurboModule = TurboModuleRegistry.getEnforcing<Spec>(MODULE_NAME);\n } catch (error) {\n resolvedTurboModule = null;\n if (__DEV__) {\n console.warn(\n \"[Amply] TurboModule lookup failed; falling back to legacy NativeModules. \" +\n (error instanceof Error ? error.message : String(error))\n );\n }\n }\n }\n if (resolvedTurboModule) {\n return resolvedTurboModule;\n }\n }\n\n const legacyModule = NativeModules[MODULE_NAME] as Spec | undefined;\n if (legacyModule) {\n return legacyModule;\n }\n\n return null;\n}\n\nexport function getNativeModule(): Spec {\n if (cachedModule) {\n return cachedModule;\n }\n\n const module = loadModule();\n if (!module) {\n throw new Error(\n `Amply native module '${MODULE_NAME}' not found. ` +\n 'Ensure the module is properly linked and new architecture is enabled.'\n );\n }\n\n cachedModule = module;\n return cachedModule;\n}\n\n// Testing hook to override the resolved native module.\nexport function __setNativeModule(mock: Spec | null): void {\n cachedModule = mock;\n}\n\nexport default getNativeModule;\n","import getNativeModule from './nativeModule';\nimport type {SystemEventPayload} from './nativeSpecs/NativeAmplyModule';\n\nexport async function addSystemEventListener(\n listener: (event: SystemEventPayload) => void,\n): Promise<() => void> {\n const subscription = getNativeModule().onSystemEvent(listener);\n return () => subscription?.remove?.();\n}\n\nexport const systemEvents = {\n addListener: addSystemEventListener,\n};\n","import {useCallback, useEffect, useRef, useState} from 'react';\nimport type {EventRecord} from '../nativeSpecs/NativeAmplyModule';\nimport {addSystemEventListener} from '../systemEvents';\n\nexport type UseAmplySystemEventsOptions = {\n maxEntries?: number;\n dedupe?: boolean;\n onEvent?: (event: EventRecord) => void;\n};\n\nexport type UseAmplySystemEventsResult = {\n events: EventRecord[];\n reset: () => void;\n};\n\nexport function useAmplySystemEvents(\n options: UseAmplySystemEventsOptions = {},\n): UseAmplySystemEventsResult {\n const {maxEntries = 50, dedupe = true, onEvent} = options;\n const [events, setEvents] = useState<EventRecord[]>([]);\n const seenKeysRef = useRef<Set<string>>(new Set());\n const handlerRef = useRef<typeof onEvent>(onEvent);\n\n useEffect(() => {\n handlerRef.current = onEvent;\n }, [onEvent]);\n\n useEffect(() => {\n let unsubscribe: (() => void) | undefined;\n let isMounted = true;\n\n addSystemEventListener(event => {\n if (!isMounted) {\n return;\n }\n if (dedupe) {\n const key = `${event.name}-${event.timestamp}`;\n if (seenKeysRef.current.has(key)) {\n return;\n }\n seenKeysRef.current.add(key);\n }\n handlerRef.current?.(event);\n setEvents(prev => {\n const next = [...prev, event];\n if (next.length > maxEntries) {\n next.splice(0, next.length - maxEntries);\n }\n return next;\n });\n })\n .then(unsub => {\n if (!isMounted) {\n unsub();\n } else {\n unsubscribe = unsub;\n }\n })\n .catch(error => {\n console.warn('[Amply] system event listener error', error);\n });\n\n return () => {\n isMounted = false;\n unsubscribe?.();\n };\n }, [dedupe, maxEntries]);\n\n const reset = useCallback(() => {\n seenKeysRef.current.clear();\n setEvents([]);\n }, []);\n\n return {events, reset};\n}\n","import type {EventRecord} from './nativeSpecs/NativeAmplyModule';\n\nconst DEFAULT_LABELS: Record<string, string> = {\n SdkInitialized: 'SDK initialized',\n ConfigFetchStarted: 'Config fetch started',\n ConfigFetchFinished: 'Config fetch finished',\n SessionStarted: 'Session started',\n SessionFinished: 'Session finished',\n CampaignShown: 'Campaign shown',\n EventTriggered: 'Event triggered',\n CampaignStarted: 'Campaign processing started',\n CampaignFinished: 'Campaign finished',\n};\n\nexport function formatSystemEventLabel(event: EventRecord): string {\n if (event.name === 'CampaignShown') {\n const campaignId = event.properties.campaignId as string | undefined;\n const source = event.properties.source as string | undefined;\n return `Campaign shown${campaignId ? ` (${campaignId})` : ''}${\n source ? ` via ${source}` : ''\n }`;\n }\n if (event.name === 'EventTriggered') {\n const source = event.properties.sourceEvent as string | undefined;\n return source ? `Event triggered (${source})` : DEFAULT_LABELS[event.name] ?? event.name;\n }\n if (event.name === 'ConfigFetchFinished') {\n const success = event.properties.success as boolean | undefined;\n const campaignCount = event.properties.campaignCount as number | undefined;\n const countLabel =\n typeof campaignCount === 'number' ? ` (${campaignCount} campaigns)` : '';\n return success === false ? 'Config fetch failed' : `Config fetch finished${countLabel}`;\n }\n return DEFAULT_LABELS[event.name] ?? `System event ${event.name}`;\n}\n","import getNativeModule from './nativeModule';\nimport {addSystemEventListener as addSystemEventListenerInternal} from './systemEvents';\nexport {useAmplySystemEvents} from './hooks/useAmplySystemEvents';\nexport {formatSystemEventLabel} from './systemEventUtils';\nimport type {\n AmplyInitializationConfig,\n DataSetSnapshot,\n DataSetType,\n DeepLinkEvent,\n EventRecord,\n TrackEventPayload,\n} from './nativeSpecs/NativeAmplyModule';\n\nlet deepLinkRegistered = false;\nconst deepLinkSubscriptions = new Set<() => void>();\n\nasync function ensureDeepLinkRegistration(): Promise<void> {\n if (!deepLinkRegistered) {\n console.log('[Amply] Calling registerDeepLinkListener on native module');\n getNativeModule().registerDeepLinkListener();\n deepLinkRegistered = true;\n console.log('[Amply] registerDeepLinkListener completed');\n }\n}\n\nfunction trackDeepLinkSubscription(subscription?: {remove?: () => void}): () => void {\n let removed = false;\n const unsubscribe = () => {\n if (removed) {\n return;\n }\n removed = true;\n subscription?.remove?.();\n deepLinkSubscriptions.delete(unsubscribe);\n };\n deepLinkSubscriptions.add(unsubscribe);\n return unsubscribe;\n}\n\nexport async function initialize(config: AmplyInitializationConfig): Promise<void> {\n await getNativeModule().initialize(config);\n}\n\nexport function isInitialized(): boolean {\n return getNativeModule().isInitialized();\n}\n\nexport async function track(payload: TrackEventPayload): Promise<void> {\n await getNativeModule().track(payload);\n}\n\nexport async function getRecentEvents(limit: number): Promise<EventRecord[]> {\n return getNativeModule().getRecentEvents(limit);\n}\n\nexport async function getDataSetSnapshot(type: DataSetType): Promise<DataSetSnapshot> {\n return getNativeModule().getDataSetSnapshot(type);\n}\n\nexport async function addDeepLinkListener(\n listener: (event: DeepLinkEvent) => void\n): Promise<() => void> {\n await ensureDeepLinkRegistration();\n const subscription = getNativeModule().onDeepLink(listener);\n return trackDeepLinkSubscription(subscription);\n}\n\nexport async function addSystemEventListener(\n listener: (event: EventRecord) => void\n): Promise<() => void> {\n return addSystemEventListenerInternal(listener);\n}\n\nexport function removeAllListeners(): void {\n deepLinkSubscriptions.forEach(unsubscribe => {\n try {\n unsubscribe();\n } catch (error) {\n console.warn('[Amply] Failed to remove deep link listener', error);\n }\n });\n deepLinkSubscriptions.clear();\n}\n\nexport type {\n AmplyInitializationConfig,\n DataSetSnapshot,\n DataSetType,\n DeepLinkEvent,\n EventRecord,\n TrackEventPayload,\n};\n\nexport function addSystemEventsListener(\n listener: (event: EventRecord) => void,\n): Promise<() => void> {\n return addSystemEventListener(listener);\n}\n\nexport const systemEvents = {\n addListener: addSystemEventsListener,\n};\n\nexport default {\n initialize,\n isInitialized,\n track,\n getRecentEvents,\n getDataSetSnapshot,\n addDeepLinkListener,\n addSystemEventListener,\n addSystemEventsListener,\n removeAllListeners,\n systemEvents,\n};\n"],"mappings":"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","names":["addSystemEventListener"]}
@@ -0,0 +1,6 @@
1
+ import type { ConfigPlugin } from '@expo/config-plugins';
2
+ declare const plugin: ConfigPlugin<{
3
+ sdkVersion?: string;
4
+ }>;
5
+ export default plugin;
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../plugin/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,sBAAsB,CAAC;AAGvD,QAAA,MAAM,MAAM,EAAE,YAAY,CAAC;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CACxB,CAAC;AAE3B,eAAe,MAAM,CAAC"}