@od-oneapp/analytics 2026.1.1301

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 (184) hide show
  1. package/README.md +509 -0
  2. package/dist/ai-YMnynb-t.mjs +3347 -0
  3. package/dist/ai-YMnynb-t.mjs.map +1 -0
  4. package/dist/chunk-DQk6qfdC.mjs +18 -0
  5. package/dist/client-CTzJVFU5.mjs +9 -0
  6. package/dist/client-CTzJVFU5.mjs.map +1 -0
  7. package/dist/client-CcFTauAh.mjs +54 -0
  8. package/dist/client-CcFTauAh.mjs.map +1 -0
  9. package/dist/client-CeOLjbac.mjs +281 -0
  10. package/dist/client-CeOLjbac.mjs.map +1 -0
  11. package/dist/client-D339NFJS.mjs +267 -0
  12. package/dist/client-D339NFJS.mjs.map +1 -0
  13. package/dist/client-next.d.mts +62 -0
  14. package/dist/client-next.d.mts.map +1 -0
  15. package/dist/client-next.mjs +525 -0
  16. package/dist/client-next.mjs.map +1 -0
  17. package/dist/client.d.mts +30 -0
  18. package/dist/client.d.mts.map +1 -0
  19. package/dist/client.mjs +186 -0
  20. package/dist/client.mjs.map +1 -0
  21. package/dist/config-DPS6bSYo.d.mts +34 -0
  22. package/dist/config-DPS6bSYo.d.mts.map +1 -0
  23. package/dist/config-P6P5adJg.mjs +287 -0
  24. package/dist/config-P6P5adJg.mjs.map +1 -0
  25. package/dist/console-8bND3mMU.mjs +128 -0
  26. package/dist/console-8bND3mMU.mjs.map +1 -0
  27. package/dist/ecommerce-Cgu4wlux.mjs +993 -0
  28. package/dist/ecommerce-Cgu4wlux.mjs.map +1 -0
  29. package/dist/emitters-6-nKo8i-.mjs +208 -0
  30. package/dist/emitters-6-nKo8i-.mjs.map +1 -0
  31. package/dist/emitters-DldkVSPp.d.mts +12 -0
  32. package/dist/emitters-DldkVSPp.d.mts.map +1 -0
  33. package/dist/index-BfNWgfa5.d.mts +1494 -0
  34. package/dist/index-BfNWgfa5.d.mts.map +1 -0
  35. package/dist/index-BkIWe--N.d.mts +953 -0
  36. package/dist/index-BkIWe--N.d.mts.map +1 -0
  37. package/dist/index-jPzXRn52.d.mts +184 -0
  38. package/dist/index-jPzXRn52.d.mts.map +1 -0
  39. package/dist/manager-DvRRjza6.d.mts +76 -0
  40. package/dist/manager-DvRRjza6.d.mts.map +1 -0
  41. package/dist/posthog-bootstrap-CYfIy_WS.mjs +1769 -0
  42. package/dist/posthog-bootstrap-CYfIy_WS.mjs.map +1 -0
  43. package/dist/posthog-bootstrap-DWxFrxlt.d.mts +81 -0
  44. package/dist/posthog-bootstrap-DWxFrxlt.d.mts.map +1 -0
  45. package/dist/providers-http-client.d.mts +37 -0
  46. package/dist/providers-http-client.d.mts.map +1 -0
  47. package/dist/providers-http-client.mjs +320 -0
  48. package/dist/providers-http-client.mjs.map +1 -0
  49. package/dist/providers-http-server.d.mts +31 -0
  50. package/dist/providers-http-server.d.mts.map +1 -0
  51. package/dist/providers-http-server.mjs +297 -0
  52. package/dist/providers-http-server.mjs.map +1 -0
  53. package/dist/providers-http.d.mts +46 -0
  54. package/dist/providers-http.d.mts.map +1 -0
  55. package/dist/providers-http.mjs +4 -0
  56. package/dist/server-edge.d.mts +9 -0
  57. package/dist/server-edge.d.mts.map +1 -0
  58. package/dist/server-edge.mjs +373 -0
  59. package/dist/server-edge.mjs.map +1 -0
  60. package/dist/server-next.d.mts +67 -0
  61. package/dist/server-next.d.mts.map +1 -0
  62. package/dist/server-next.mjs +193 -0
  63. package/dist/server-next.mjs.map +1 -0
  64. package/dist/server.d.mts +10 -0
  65. package/dist/server.mjs +7 -0
  66. package/dist/service-cYtBBL8x.mjs +945 -0
  67. package/dist/service-cYtBBL8x.mjs.map +1 -0
  68. package/dist/shared.d.mts +16 -0
  69. package/dist/shared.d.mts.map +1 -0
  70. package/dist/shared.mjs +93 -0
  71. package/dist/shared.mjs.map +1 -0
  72. package/dist/types-BxBnNQ0V.d.mts +354 -0
  73. package/dist/types-BxBnNQ0V.d.mts.map +1 -0
  74. package/dist/types-CBvxUEaF.d.mts +216 -0
  75. package/dist/types-CBvxUEaF.d.mts.map +1 -0
  76. package/dist/types.d.mts +4 -0
  77. package/dist/types.mjs +0 -0
  78. package/dist/vercel-types-lwakUfoI.d.mts +102 -0
  79. package/dist/vercel-types-lwakUfoI.d.mts.map +1 -0
  80. package/package.json +129 -0
  81. package/src/client/index.ts +164 -0
  82. package/src/client/manager.ts +71 -0
  83. package/src/client/next/components.tsx +270 -0
  84. package/src/client/next/hooks.ts +217 -0
  85. package/src/client/next/manager.ts +141 -0
  86. package/src/client/next.ts +144 -0
  87. package/src/client-next.ts +101 -0
  88. package/src/client.ts +89 -0
  89. package/src/examples/ai-sdk-patterns.ts +583 -0
  90. package/src/examples/emitter-patterns.ts +476 -0
  91. package/src/examples/nextjs-emitter-patterns.tsx +403 -0
  92. package/src/next/app-router.tsx +564 -0
  93. package/src/next/client.ts +419 -0
  94. package/src/next/index.ts +84 -0
  95. package/src/next/middleware.ts +429 -0
  96. package/src/next/rsc.tsx +300 -0
  97. package/src/next/server.ts +253 -0
  98. package/src/next/types.d.ts +220 -0
  99. package/src/providers/base-provider.ts +419 -0
  100. package/src/providers/console/client.ts +10 -0
  101. package/src/providers/console/index.ts +152 -0
  102. package/src/providers/console/server.ts +6 -0
  103. package/src/providers/console/types.ts +15 -0
  104. package/src/providers/http/client.ts +464 -0
  105. package/src/providers/http/index.ts +30 -0
  106. package/src/providers/http/server.ts +396 -0
  107. package/src/providers/http/types.ts +135 -0
  108. package/src/providers/posthog/client.ts +518 -0
  109. package/src/providers/posthog/index.ts +11 -0
  110. package/src/providers/posthog/server.ts +329 -0
  111. package/src/providers/posthog/types.ts +104 -0
  112. package/src/providers/segment/client.ts +113 -0
  113. package/src/providers/segment/index.ts +11 -0
  114. package/src/providers/segment/server.ts +115 -0
  115. package/src/providers/segment/types.ts +51 -0
  116. package/src/providers/vercel/client.ts +102 -0
  117. package/src/providers/vercel/index.ts +11 -0
  118. package/src/providers/vercel/server.ts +89 -0
  119. package/src/providers/vercel/types.ts +27 -0
  120. package/src/server/index.ts +103 -0
  121. package/src/server/manager.ts +62 -0
  122. package/src/server/next.ts +210 -0
  123. package/src/server-edge.ts +442 -0
  124. package/src/server-next.ts +39 -0
  125. package/src/server.ts +106 -0
  126. package/src/shared/emitters/ai/README.md +981 -0
  127. package/src/shared/emitters/ai/events/agent.ts +130 -0
  128. package/src/shared/emitters/ai/events/artifacts.ts +167 -0
  129. package/src/shared/emitters/ai/events/chat.ts +126 -0
  130. package/src/shared/emitters/ai/events/chatbot-ecommerce.ts +133 -0
  131. package/src/shared/emitters/ai/events/completion.ts +103 -0
  132. package/src/shared/emitters/ai/events/content-generation.ts +347 -0
  133. package/src/shared/emitters/ai/events/conversation.ts +332 -0
  134. package/src/shared/emitters/ai/events/product-features.ts +1402 -0
  135. package/src/shared/emitters/ai/events/streaming.ts +114 -0
  136. package/src/shared/emitters/ai/events/tool.ts +93 -0
  137. package/src/shared/emitters/ai/index.ts +69 -0
  138. package/src/shared/emitters/ai/track-ai-sdk.ts +74 -0
  139. package/src/shared/emitters/ai/track-ai.ts +50 -0
  140. package/src/shared/emitters/ai/types.ts +1041 -0
  141. package/src/shared/emitters/ai/utils.ts +468 -0
  142. package/src/shared/emitters/ecommerce/events/cart-checkout.ts +106 -0
  143. package/src/shared/emitters/ecommerce/events/coupon.ts +49 -0
  144. package/src/shared/emitters/ecommerce/events/engagement.ts +61 -0
  145. package/src/shared/emitters/ecommerce/events/marketplace.ts +119 -0
  146. package/src/shared/emitters/ecommerce/events/order.ts +199 -0
  147. package/src/shared/emitters/ecommerce/events/product.ts +205 -0
  148. package/src/shared/emitters/ecommerce/events/registry.ts +123 -0
  149. package/src/shared/emitters/ecommerce/events/wishlist-sharing.ts +140 -0
  150. package/src/shared/emitters/ecommerce/index.ts +46 -0
  151. package/src/shared/emitters/ecommerce/track-ecommerce.ts +53 -0
  152. package/src/shared/emitters/ecommerce/types.ts +314 -0
  153. package/src/shared/emitters/ecommerce/utils.ts +216 -0
  154. package/src/shared/emitters/emitter-types.ts +974 -0
  155. package/src/shared/emitters/emitters.ts +292 -0
  156. package/src/shared/emitters/helpers.ts +419 -0
  157. package/src/shared/emitters/index.ts +66 -0
  158. package/src/shared/index.ts +142 -0
  159. package/src/shared/ingestion/index.ts +66 -0
  160. package/src/shared/ingestion/schemas.ts +386 -0
  161. package/src/shared/ingestion/service.ts +628 -0
  162. package/src/shared/node22-features.ts +848 -0
  163. package/src/shared/providers/console-provider.ts +160 -0
  164. package/src/shared/types/base-types.ts +54 -0
  165. package/src/shared/types/console-types.ts +19 -0
  166. package/src/shared/types/posthog-types.ts +131 -0
  167. package/src/shared/types/segment-types.ts +15 -0
  168. package/src/shared/types/types.ts +397 -0
  169. package/src/shared/types/vercel-types.ts +19 -0
  170. package/src/shared/utils/config-client.ts +19 -0
  171. package/src/shared/utils/config.ts +250 -0
  172. package/src/shared/utils/emitter-adapter.ts +212 -0
  173. package/src/shared/utils/manager.test.ts +36 -0
  174. package/src/shared/utils/manager.ts +1322 -0
  175. package/src/shared/utils/posthog-bootstrap.ts +136 -0
  176. package/src/shared/utils/posthog-client-utils.ts +48 -0
  177. package/src/shared/utils/posthog-next-utils.ts +282 -0
  178. package/src/shared/utils/posthog-server-utils.ts +210 -0
  179. package/src/shared/utils/rate-limit.ts +289 -0
  180. package/src/shared/utils/security.ts +545 -0
  181. package/src/shared/utils/validation-client.ts +161 -0
  182. package/src/shared/utils/validation.ts +399 -0
  183. package/src/shared.ts +155 -0
  184. package/src/types/index.ts +62 -0
@@ -0,0 +1,212 @@
1
+ /**
2
+ * @fileoverview Adapter functions to convert emitter payloads to analytics method calls
3
+ * Adapter functions to convert emitter payloads to analytics method calls
4
+ * This bridges the gap between the Segment.io spec emitters and the analytics manager
5
+ */
6
+
7
+ import type {
8
+ EmitterAliasPayload,
9
+ EmitterGroupPayload,
10
+ EmitterIdentifyPayload,
11
+ EmitterPagePayload,
12
+ EmitterPayload,
13
+ EmitterScreenPayload,
14
+ EmitterTrackPayload,
15
+ } from '../emitters/emitter-types';
16
+ import type { AnalyticsManager } from '../types/types';
17
+
18
+ /**
19
+ * Routes any emitter payload to the matching analytics manager method.
20
+ *
21
+ * This function is deliberately small so that Codex/OpenAI powered tooling can
22
+ * inspect a single switch statement and understand how each analytics verb maps
23
+ * to the strongly typed helper below.
24
+ *
25
+ * @deprecated Use `analytics.emit(payload)` instead for simpler API usage.
26
+ * This function remains available for compatibility and advanced use cases.
27
+ *
28
+ * @example Preferred approach:
29
+ * ```typescript
30
+ * await analytics.emit(track('Button Clicked', { color: 'blue' }));
31
+ * ```
32
+ *
33
+ * @param analytics - The analytics manager implementation (client or server)
34
+ * @param payload - Any emitter payload created by the Segment-style helpers
35
+ * @throws Error when the payload type is unknown, protecting against silent drops
36
+ */
37
+ export async function processEmitterPayload(
38
+ analytics: AnalyticsManager,
39
+ payload: EmitterPayload,
40
+ ): Promise<void> {
41
+ switch (payload.type) {
42
+ case 'identify':
43
+ return processIdentifyPayload(analytics, payload);
44
+ case 'track':
45
+ return processTrackPayload(analytics, payload);
46
+ case 'page':
47
+ return processPagePayload(analytics, payload);
48
+ case 'screen':
49
+ return processScreenPayload(analytics, payload);
50
+ case 'group':
51
+ return processGroupPayload(analytics, payload);
52
+ case 'alias':
53
+ return processAliasPayload(analytics, payload);
54
+ default: {
55
+ // Runtime safety for unknown payload types (e.g., from untyped JavaScript code)
56
+ const unknownPayload = payload as { type: string };
57
+ throw new Error(`Unknown emitter payload type: ${unknownPayload.type}`);
58
+ }
59
+ }
60
+ }
61
+
62
+ /**
63
+ * Pipes an identify payload into `analytics.identify`, preserving context.
64
+ *
65
+ * @param analytics - Active analytics manager
66
+ * @param payload - Identify payload produced by the emitter factory
67
+ */
68
+ export async function processIdentifyPayload(
69
+ analytics: AnalyticsManager,
70
+ payload: EmitterIdentifyPayload,
71
+ ): Promise<void> {
72
+ const { traits, userId, ...options } = payload;
73
+
74
+ // Convert emitter options to tracking options
75
+ const trackingOptions = {
76
+ context: options.context,
77
+ // Add other options as needed
78
+ };
79
+
80
+ await analytics.identify(userId, traits, trackingOptions);
81
+ }
82
+
83
+ /**
84
+ * Pipes a track payload into `analytics.track`, preserving context metadata.
85
+ *
86
+ * @param analytics - Active analytics manager
87
+ * @param payload - Track payload produced by the emitter factory
88
+ */
89
+ export async function processTrackPayload(
90
+ analytics: AnalyticsManager,
91
+ payload: EmitterTrackPayload,
92
+ ): Promise<void> {
93
+ const { event, properties, ...options } = payload;
94
+
95
+ const trackingOptions = {
96
+ context: options.context,
97
+ };
98
+
99
+ await analytics.track(event, properties, trackingOptions);
100
+ }
101
+
102
+ /**
103
+ * Pipes a page payload into `analytics.page`.
104
+ *
105
+ * @param analytics - Active analytics manager
106
+ * @param payload - Page payload produced by the emitter factory
107
+ */
108
+ export async function processPagePayload(
109
+ analytics: AnalyticsManager,
110
+ payload: EmitterPagePayload,
111
+ ): Promise<void> {
112
+ const { name, properties, ...options } = payload;
113
+
114
+ const trackingOptions = {
115
+ context: options.context,
116
+ };
117
+
118
+ await analytics.page(name, properties, trackingOptions);
119
+ }
120
+
121
+ /**
122
+ * Pipes a screen payload into `analytics.screen` (mobile equivalent of page).
123
+ *
124
+ * @param analytics - Active analytics manager
125
+ * @param payload - Screen payload produced by the emitter factory
126
+ */
127
+ export async function processScreenPayload(
128
+ analytics: AnalyticsManager,
129
+ payload: EmitterScreenPayload,
130
+ ): Promise<void> {
131
+ const { name, properties, ...options } = payload;
132
+
133
+ const trackingOptions = {
134
+ context: options.context,
135
+ };
136
+
137
+ await analytics.screen?.(name, properties, trackingOptions);
138
+ }
139
+
140
+ /**
141
+ * Pipes a group payload into `analytics.group`.
142
+ *
143
+ * @param analytics - Active analytics manager
144
+ * @param payload - Group payload produced by the emitter factory
145
+ */
146
+ export async function processGroupPayload(
147
+ analytics: AnalyticsManager,
148
+ payload: EmitterGroupPayload,
149
+ ): Promise<void> {
150
+ const { groupId, traits, ...options } = payload;
151
+
152
+ const trackingOptions = {
153
+ context: options.context,
154
+ };
155
+
156
+ await analytics.group(groupId, traits, trackingOptions);
157
+ }
158
+
159
+ /**
160
+ * Pipes an alias payload into `analytics.alias`.
161
+ *
162
+ * @param analytics - Active analytics manager
163
+ * @param payload - Alias payload produced by the emitter factory
164
+ */
165
+ export async function processAliasPayload(
166
+ analytics: AnalyticsManager,
167
+ payload: EmitterAliasPayload,
168
+ ): Promise<void> {
169
+ const { previousId, userId, ...options } = payload;
170
+
171
+ const trackingOptions = {
172
+ context: options.context,
173
+ };
174
+
175
+ await analytics.alias(userId, previousId ?? '', trackingOptions);
176
+ }
177
+
178
+ /**
179
+ * Creates a pre-bound emitter processor for repeated usage.
180
+ *
181
+ * @example
182
+ * ```ts
183
+ * const processor = createEmitterProcessor(analytics);
184
+ * queue.forEach(processor);
185
+ * ```
186
+ *
187
+ * @param analytics - Active analytics manager
188
+ * @returns Function that accepts any emitter payload and routes it correctly
189
+ */
190
+ export function createEmitterProcessor(analytics: AnalyticsManager) {
191
+ return (payload: EmitterPayload) => processEmitterPayload(analytics, payload);
192
+ }
193
+
194
+ /**
195
+ * Minimal helper for wiring ecommerce event specs into analytics.track.
196
+ *
197
+ * @deprecated Use `analytics.emit(ecommerce.EVENT_NAME(...))` instead.
198
+ *
199
+ * @example Preferred approach:
200
+ * ```typescript
201
+ * await analytics.emit(ecommerce.productViewed({ product_id: '123' }));
202
+ * ```
203
+ *
204
+ * @param analytics - Active analytics manager
205
+ * @param eventSpec - Object that contains the `name` and `properties` fields
206
+ */
207
+ export async function trackEcommerceEvent(
208
+ analytics: AnalyticsManager,
209
+ eventSpec: { name: string; properties: Record<string, any> },
210
+ ): Promise<void> {
211
+ await analytics.track(eventSpec.name, eventSpec.properties);
212
+ }
@@ -0,0 +1,36 @@
1
+ import { beforeEach, describe, expect, it, vi } from 'vitest';
2
+
3
+ import * as Manager from './manager';
4
+
5
+ describe('analytics/utils/manager - stateful behaviors', () => {
6
+ let mgr: any;
7
+ beforeEach(() => {
8
+ mgr = (Manager as any).createManager
9
+ ? (Manager as any).createManager()
10
+ : (Manager as any).Manager?.create?.();
11
+ });
12
+
13
+ it('registers/unregisters emitters safely', () => {
14
+ if (!mgr) return;
15
+ const emitterA = vi.fn();
16
+ const emitterB = vi.fn();
17
+ mgr.register(emitterA);
18
+ mgr.register(emitterB);
19
+ mgr.emit({ type: 'test', payload: { a: 1 } });
20
+ expect(emitterA).toHaveBeenCalledTimes(1);
21
+ expect(emitterB).toHaveBeenCalledTimes(1);
22
+ mgr.unregister(emitterA);
23
+ mgr.emit({ type: 'test', payload: { a: 2 } });
24
+ expect(emitterA).toHaveBeenCalledTimes(1);
25
+ expect(emitterB).toHaveBeenCalledTimes(2);
26
+ });
27
+
28
+ it('handles invalid events gracefully', () => {
29
+ if (!mgr) return;
30
+ const emitter = vi.fn();
31
+ mgr.register(emitter);
32
+ mgr.emit(null as any);
33
+ mgr.emit(undefined as any);
34
+ expect(emitter).toHaveBeenCalledTimes(0);
35
+ });
36
+ });