@od-oneapp/analytics 2026.1.1301 → 2026.2.1701-canary.1

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 (186) hide show
  1. package/CHANGELOG.md +141 -0
  2. package/{dist/client.mjs → client.mjs} +110 -2
  3. package/client.mjs.map +1 -0
  4. package/package.json +102 -92
  5. package/{dist/server-next.mjs → server-next.mjs} +1 -1
  6. package/{dist/server.mjs → server.mjs} +1 -1
  7. package/{dist/service-cYtBBL8x.mjs → service-Duqnlppl.mjs} +107 -3
  8. package/service-Duqnlppl.mjs.map +1 -0
  9. package/dist/client.mjs.map +0 -1
  10. package/dist/service-cYtBBL8x.mjs.map +0 -1
  11. package/src/client/index.ts +0 -164
  12. package/src/client/manager.ts +0 -71
  13. package/src/client/next/components.tsx +0 -270
  14. package/src/client/next/hooks.ts +0 -217
  15. package/src/client/next/manager.ts +0 -141
  16. package/src/client/next.ts +0 -144
  17. package/src/client-next.ts +0 -101
  18. package/src/client.ts +0 -89
  19. package/src/examples/ai-sdk-patterns.ts +0 -583
  20. package/src/examples/emitter-patterns.ts +0 -476
  21. package/src/examples/nextjs-emitter-patterns.tsx +0 -403
  22. package/src/next/app-router.tsx +0 -564
  23. package/src/next/client.ts +0 -419
  24. package/src/next/index.ts +0 -84
  25. package/src/next/middleware.ts +0 -429
  26. package/src/next/rsc.tsx +0 -300
  27. package/src/next/server.ts +0 -253
  28. package/src/next/types.d.ts +0 -220
  29. package/src/providers/base-provider.ts +0 -419
  30. package/src/providers/console/client.ts +0 -10
  31. package/src/providers/console/index.ts +0 -152
  32. package/src/providers/console/server.ts +0 -6
  33. package/src/providers/console/types.ts +0 -15
  34. package/src/providers/http/client.ts +0 -464
  35. package/src/providers/http/index.ts +0 -30
  36. package/src/providers/http/server.ts +0 -396
  37. package/src/providers/http/types.ts +0 -135
  38. package/src/providers/posthog/client.ts +0 -518
  39. package/src/providers/posthog/index.ts +0 -11
  40. package/src/providers/posthog/server.ts +0 -329
  41. package/src/providers/posthog/types.ts +0 -104
  42. package/src/providers/segment/client.ts +0 -113
  43. package/src/providers/segment/index.ts +0 -11
  44. package/src/providers/segment/server.ts +0 -115
  45. package/src/providers/segment/types.ts +0 -51
  46. package/src/providers/vercel/client.ts +0 -102
  47. package/src/providers/vercel/index.ts +0 -11
  48. package/src/providers/vercel/server.ts +0 -89
  49. package/src/providers/vercel/types.ts +0 -27
  50. package/src/server/index.ts +0 -103
  51. package/src/server/manager.ts +0 -62
  52. package/src/server/next.ts +0 -210
  53. package/src/server-edge.ts +0 -442
  54. package/src/server-next.ts +0 -39
  55. package/src/server.ts +0 -106
  56. package/src/shared/emitters/ai/README.md +0 -981
  57. package/src/shared/emitters/ai/events/agent.ts +0 -130
  58. package/src/shared/emitters/ai/events/artifacts.ts +0 -167
  59. package/src/shared/emitters/ai/events/chat.ts +0 -126
  60. package/src/shared/emitters/ai/events/chatbot-ecommerce.ts +0 -133
  61. package/src/shared/emitters/ai/events/completion.ts +0 -103
  62. package/src/shared/emitters/ai/events/content-generation.ts +0 -347
  63. package/src/shared/emitters/ai/events/conversation.ts +0 -332
  64. package/src/shared/emitters/ai/events/product-features.ts +0 -1402
  65. package/src/shared/emitters/ai/events/streaming.ts +0 -114
  66. package/src/shared/emitters/ai/events/tool.ts +0 -93
  67. package/src/shared/emitters/ai/index.ts +0 -69
  68. package/src/shared/emitters/ai/track-ai-sdk.ts +0 -74
  69. package/src/shared/emitters/ai/track-ai.ts +0 -50
  70. package/src/shared/emitters/ai/types.ts +0 -1041
  71. package/src/shared/emitters/ai/utils.ts +0 -468
  72. package/src/shared/emitters/ecommerce/events/cart-checkout.ts +0 -106
  73. package/src/shared/emitters/ecommerce/events/coupon.ts +0 -49
  74. package/src/shared/emitters/ecommerce/events/engagement.ts +0 -61
  75. package/src/shared/emitters/ecommerce/events/marketplace.ts +0 -119
  76. package/src/shared/emitters/ecommerce/events/order.ts +0 -199
  77. package/src/shared/emitters/ecommerce/events/product.ts +0 -205
  78. package/src/shared/emitters/ecommerce/events/registry.ts +0 -123
  79. package/src/shared/emitters/ecommerce/events/wishlist-sharing.ts +0 -140
  80. package/src/shared/emitters/ecommerce/index.ts +0 -46
  81. package/src/shared/emitters/ecommerce/track-ecommerce.ts +0 -53
  82. package/src/shared/emitters/ecommerce/types.ts +0 -314
  83. package/src/shared/emitters/ecommerce/utils.ts +0 -216
  84. package/src/shared/emitters/emitter-types.ts +0 -974
  85. package/src/shared/emitters/emitters.ts +0 -292
  86. package/src/shared/emitters/helpers.ts +0 -419
  87. package/src/shared/emitters/index.ts +0 -66
  88. package/src/shared/index.ts +0 -142
  89. package/src/shared/ingestion/index.ts +0 -66
  90. package/src/shared/ingestion/schemas.ts +0 -386
  91. package/src/shared/ingestion/service.ts +0 -628
  92. package/src/shared/node22-features.ts +0 -848
  93. package/src/shared/providers/console-provider.ts +0 -160
  94. package/src/shared/types/base-types.ts +0 -54
  95. package/src/shared/types/console-types.ts +0 -19
  96. package/src/shared/types/posthog-types.ts +0 -131
  97. package/src/shared/types/segment-types.ts +0 -15
  98. package/src/shared/types/types.ts +0 -397
  99. package/src/shared/types/vercel-types.ts +0 -19
  100. package/src/shared/utils/config-client.ts +0 -19
  101. package/src/shared/utils/config.ts +0 -250
  102. package/src/shared/utils/emitter-adapter.ts +0 -212
  103. package/src/shared/utils/manager.test.ts +0 -36
  104. package/src/shared/utils/manager.ts +0 -1322
  105. package/src/shared/utils/posthog-bootstrap.ts +0 -136
  106. package/src/shared/utils/posthog-client-utils.ts +0 -48
  107. package/src/shared/utils/posthog-next-utils.ts +0 -282
  108. package/src/shared/utils/posthog-server-utils.ts +0 -210
  109. package/src/shared/utils/rate-limit.ts +0 -289
  110. package/src/shared/utils/security.ts +0 -545
  111. package/src/shared/utils/validation-client.ts +0 -161
  112. package/src/shared/utils/validation.ts +0 -399
  113. package/src/shared.ts +0 -155
  114. package/src/types/index.ts +0 -62
  115. /package/{dist/ai-YMnynb-t.mjs → ai-YMnynb-t.mjs} +0 -0
  116. /package/{dist/ai-YMnynb-t.mjs.map → ai-YMnynb-t.mjs.map} +0 -0
  117. /package/{dist/chunk-DQk6qfdC.mjs → chunk-DQk6qfdC.mjs} +0 -0
  118. /package/{dist/client-CTzJVFU5.mjs → client-CTzJVFU5.mjs} +0 -0
  119. /package/{dist/client-CTzJVFU5.mjs.map → client-CTzJVFU5.mjs.map} +0 -0
  120. /package/{dist/client-CcFTauAh.mjs → client-CcFTauAh.mjs} +0 -0
  121. /package/{dist/client-CcFTauAh.mjs.map → client-CcFTauAh.mjs.map} +0 -0
  122. /package/{dist/client-CeOLjbac.mjs → client-CeOLjbac.mjs} +0 -0
  123. /package/{dist/client-CeOLjbac.mjs.map → client-CeOLjbac.mjs.map} +0 -0
  124. /package/{dist/client-D339NFJS.mjs → client-D339NFJS.mjs} +0 -0
  125. /package/{dist/client-D339NFJS.mjs.map → client-D339NFJS.mjs.map} +0 -0
  126. /package/{dist/client-next.d.mts → client-next.d.mts} +0 -0
  127. /package/{dist/client-next.d.mts.map → client-next.d.mts.map} +0 -0
  128. /package/{dist/client-next.mjs → client-next.mjs} +0 -0
  129. /package/{dist/client-next.mjs.map → client-next.mjs.map} +0 -0
  130. /package/{dist/client.d.mts → client.d.mts} +0 -0
  131. /package/{dist/client.d.mts.map → client.d.mts.map} +0 -0
  132. /package/{dist/config-DPS6bSYo.d.mts → config-DPS6bSYo.d.mts} +0 -0
  133. /package/{dist/config-DPS6bSYo.d.mts.map → config-DPS6bSYo.d.mts.map} +0 -0
  134. /package/{dist/config-P6P5adJg.mjs → config-P6P5adJg.mjs} +0 -0
  135. /package/{dist/config-P6P5adJg.mjs.map → config-P6P5adJg.mjs.map} +0 -0
  136. /package/{dist/console-8bND3mMU.mjs → console-8bND3mMU.mjs} +0 -0
  137. /package/{dist/console-8bND3mMU.mjs.map → console-8bND3mMU.mjs.map} +0 -0
  138. /package/{dist/ecommerce-Cgu4wlux.mjs → ecommerce-Cgu4wlux.mjs} +0 -0
  139. /package/{dist/ecommerce-Cgu4wlux.mjs.map → ecommerce-Cgu4wlux.mjs.map} +0 -0
  140. /package/{dist/emitters-6-nKo8i-.mjs → emitters-6-nKo8i-.mjs} +0 -0
  141. /package/{dist/emitters-6-nKo8i-.mjs.map → emitters-6-nKo8i-.mjs.map} +0 -0
  142. /package/{dist/emitters-DldkVSPp.d.mts → emitters-DldkVSPp.d.mts} +0 -0
  143. /package/{dist/emitters-DldkVSPp.d.mts.map → emitters-DldkVSPp.d.mts.map} +0 -0
  144. /package/{dist/index-BfNWgfa5.d.mts → index-BfNWgfa5.d.mts} +0 -0
  145. /package/{dist/index-BfNWgfa5.d.mts.map → index-BfNWgfa5.d.mts.map} +0 -0
  146. /package/{dist/index-BkIWe--N.d.mts → index-BkIWe--N.d.mts} +0 -0
  147. /package/{dist/index-BkIWe--N.d.mts.map → index-BkIWe--N.d.mts.map} +0 -0
  148. /package/{dist/index-jPzXRn52.d.mts → index-jPzXRn52.d.mts} +0 -0
  149. /package/{dist/index-jPzXRn52.d.mts.map → index-jPzXRn52.d.mts.map} +0 -0
  150. /package/{dist/manager-DvRRjza6.d.mts → manager-DvRRjza6.d.mts} +0 -0
  151. /package/{dist/manager-DvRRjza6.d.mts.map → manager-DvRRjza6.d.mts.map} +0 -0
  152. /package/{dist/posthog-bootstrap-CYfIy_WS.mjs → posthog-bootstrap-CYfIy_WS.mjs} +0 -0
  153. /package/{dist/posthog-bootstrap-CYfIy_WS.mjs.map → posthog-bootstrap-CYfIy_WS.mjs.map} +0 -0
  154. /package/{dist/posthog-bootstrap-DWxFrxlt.d.mts → posthog-bootstrap-DWxFrxlt.d.mts} +0 -0
  155. /package/{dist/posthog-bootstrap-DWxFrxlt.d.mts.map → posthog-bootstrap-DWxFrxlt.d.mts.map} +0 -0
  156. /package/{dist/providers-http-client.d.mts → providers-http-client.d.mts} +0 -0
  157. /package/{dist/providers-http-client.d.mts.map → providers-http-client.d.mts.map} +0 -0
  158. /package/{dist/providers-http-client.mjs → providers-http-client.mjs} +0 -0
  159. /package/{dist/providers-http-client.mjs.map → providers-http-client.mjs.map} +0 -0
  160. /package/{dist/providers-http-server.d.mts → providers-http-server.d.mts} +0 -0
  161. /package/{dist/providers-http-server.d.mts.map → providers-http-server.d.mts.map} +0 -0
  162. /package/{dist/providers-http-server.mjs → providers-http-server.mjs} +0 -0
  163. /package/{dist/providers-http-server.mjs.map → providers-http-server.mjs.map} +0 -0
  164. /package/{dist/providers-http.d.mts → providers-http.d.mts} +0 -0
  165. /package/{dist/providers-http.d.mts.map → providers-http.d.mts.map} +0 -0
  166. /package/{dist/providers-http.mjs → providers-http.mjs} +0 -0
  167. /package/{dist/server-edge.d.mts → server-edge.d.mts} +0 -0
  168. /package/{dist/server-edge.d.mts.map → server-edge.d.mts.map} +0 -0
  169. /package/{dist/server-edge.mjs → server-edge.mjs} +0 -0
  170. /package/{dist/server-edge.mjs.map → server-edge.mjs.map} +0 -0
  171. /package/{dist/server-next.d.mts → server-next.d.mts} +0 -0
  172. /package/{dist/server-next.d.mts.map → server-next.d.mts.map} +0 -0
  173. /package/{dist/server-next.mjs.map → server-next.mjs.map} +0 -0
  174. /package/{dist/server.d.mts → server.d.mts} +0 -0
  175. /package/{dist/shared.d.mts → shared.d.mts} +0 -0
  176. /package/{dist/shared.d.mts.map → shared.d.mts.map} +0 -0
  177. /package/{dist/shared.mjs → shared.mjs} +0 -0
  178. /package/{dist/shared.mjs.map → shared.mjs.map} +0 -0
  179. /package/{dist/types-BxBnNQ0V.d.mts → types-BxBnNQ0V.d.mts} +0 -0
  180. /package/{dist/types-BxBnNQ0V.d.mts.map → types-BxBnNQ0V.d.mts.map} +0 -0
  181. /package/{dist/types-CBvxUEaF.d.mts → types-CBvxUEaF.d.mts} +0 -0
  182. /package/{dist/types-CBvxUEaF.d.mts.map → types-CBvxUEaF.d.mts.map} +0 -0
  183. /package/{dist/types.d.mts → types.d.mts} +0 -0
  184. /package/{dist/types.mjs → types.mjs} +0 -0
  185. /package/{dist/vercel-types-lwakUfoI.d.mts → vercel-types-lwakUfoI.d.mts} +0 -0
  186. /package/{dist/vercel-types-lwakUfoI.d.mts.map → vercel-types-lwakUfoI.d.mts.map} +0 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,141 @@
1
+ # @repo/analytics
2
+
3
+ ## 2.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - [`b626058`](https://github.com/OneDigital-Product/monorepo/commit/b6260582c2d9b7aaee89e3fb8c11515fd02cdfcf) Thanks
8
+ [@m-torin](https://github.com/m-torin)! - **BREAKING CHANGE**: Redesign AI tracking for ChatGPT/Claude-style product
9
+ features
10
+
11
+ Completely redesigned the AI tracking system to focus on **AI product features** instead of business use cases:
12
+
13
+ **Philosophy Change**: Track the AI product itself (chat features, artifacts, code generation), not what users do with
14
+ it (business workflows).
15
+
16
+ **Key Changes**:
17
+ - Renamed `aiSdk.*` → `ai.*` namespace for cleaner API
18
+ - 90+ new events for ChatGPT/Claude/Copilot-style features
19
+ - Clear separation from e-commerce tracking (`ai.*` vs `ecommerce.*`)
20
+ - Comprehensive product feature coverage:
21
+ - Message regeneration, editing, branching
22
+ - Conversation management & organization
23
+ - Code generation with copy/execute tracking
24
+ - Interactive artifacts & canvas (Claude-style)
25
+ - File upload, processing, referencing
26
+ - Context & memory management
27
+ - Collaboration & sharing features
28
+ - User feedback & quality signals
29
+ - System operations & performance
30
+
31
+ **Migration Guide**:
32
+
33
+ ```typescript
34
+ // Before (AI SDK v6 technical operations)
35
+ import { aiSdk } from '@repo/analytics/shared';
36
+ aiSdk.agentExecutionCompleted({ ... });
37
+ aiSdk.chatMessageReceived({ ... });
38
+
39
+ // After (AI product features)
40
+ import { ai } from '@repo/analytics/shared';
41
+ ai.MESSAGE_RECEIVED({ ... });
42
+ ai.MESSAGE_REGENERATED({ ... });
43
+ ai.CODE_GENERATED({ ... });
44
+ ai.ARTIFACT_CREATED({ ... });
45
+ ```
46
+
47
+ **New Features**:
48
+ - `ai.MESSAGE_REGENERATED()` - Track regeneration attempts
49
+ - `ai.BRANCH_CREATED()` - Track conversation branching
50
+ - `ai.CODE_GENERATED()` - Track code generation
51
+ - `ai.ARTIFACT_CREATED()` - Track Claude-style artifacts
52
+ - `ai.CONVERSATION_SHARED()` - Track sharing features
53
+ - `ai.CUSTOM_INSTRUCTIONS_UPDATED()` - Track user preferences
54
+ - ...and 84 more product-focused events
55
+
56
+ **Documentation**:
57
+ - New comprehensive README at `src/shared/emitters/ai/README.md`
58
+ - Clear examples for ChatGPT/Claude-style implementations
59
+ - Complete type definitions for all 90+ events
60
+
61
+ This is a major version bump because:
62
+ 1. Renamed namespace (`aiSdk` → `ai`) breaks existing imports
63
+ 2. Event structure completely redesigned for product features
64
+ 3. Old e-commerce chatbot events deprecated (use `ecommerce.*` instead)
65
+
66
+ ### Minor Changes
67
+
68
+ - [`b626058`](https://github.com/OneDigital-Product/monorepo/commit/b6260582c2d9b7aaee89e3fb8c11515fd02cdfcf) Thanks
69
+ [@m-torin](https://github.com/m-torin)! - feat(analytics): expand AI tracking to 100+ events covering complete chatbot
70
+ journey
71
+
72
+ Renamed from `aiSdk` to `ai` and dramatically expanded event coverage:
73
+
74
+ **100+ Comprehensive Events** organized by customer journey stage:
75
+ - **Conversation (7)**: Session lifecycle, messages
76
+ - **Intent & Understanding (8)**: Intent detection, context switching, clarifications, misunderstandings
77
+ - **Product Discovery (7)**: Search, browse, visual/voice search, comparisons
78
+ - **Size & Fit (5)**: Size charts, fit recommendations, virtual try-on
79
+ - **Style & Preferences (4)**: Style profiling, preference learning
80
+ - **Recommendations (11)**: Upsell, cross-sell, bundles, gifts, personalized
81
+ - **Cart & Purchase (8)**: Cart management, promo codes, checkout start
82
+ - **Checkout Assistance (7)**: Address, payment, shipping help
83
+ - **Post-Purchase (7)**: Order tracking, product support, warranty, reviews
84
+ - **Returns & Exchanges (5)**: Return policy, initiation, label requests
85
+ - **Proactive Engagement (8)**: Greetings, cart recovery, deal alerts, re-engagement
86
+ - **Support & Escalation (10)**: FAQ, complaints, handoffs, escalation
87
+ - **Sentiment & Satisfaction (6)**: Sentiment tracking, satisfaction surveys
88
+ - **Personalization (4)**: User profiling, segmentation
89
+ - **Technical (10)**: Agent execution, completions, tools, streaming
90
+
91
+ **Auto-Detection Utilities:**
92
+ - `detectIntent()` - Auto-detect user intent from message (11 intent types)
93
+ - `detectSentiment()` - Sentiment analysis (positive/negative/neutral/mixed)
94
+ - `needsClarification()` - Detect ambiguous messages
95
+ - `extractProductMentions()` - Extract product categories
96
+ - `calculateQualityScore()` - Conversation quality scoring
97
+
98
+ **Enhanced Event Properties:**
99
+ - Intent confidence scores & detected entities
100
+ - Sentiment triggers & confidence
101
+ - Recommendation sources & triggers
102
+ - Abandonment recovery metrics
103
+ - Handoff reasons & escalation paths
104
+ - User profile completeness
105
+ - Conversation quality metrics
106
+
107
+ **Complete Event Reference:**
108
+ - `AI_EVENTS_REFERENCE.md` - 100+ events with examples
109
+ - Organized by customer journey stage
110
+ - Quick reference for common events
111
+ - Integration examples for all scenarios
112
+
113
+ **Breaking Changes:**
114
+ - Renamed `aiSdk` namespace to `ai`
115
+ - Import: `import { ai } from '@repo/analytics/client/next'`
116
+ - All event names follow pattern: `AI_EVENTS.EVENT_NAME`
117
+
118
+ **Migration:**
119
+
120
+ ```typescript
121
+ // Before
122
+ import { aiSdk } from '@repo/analytics/client/next';
123
+ aiSdk.agentExecutionCompleted({ ... });
124
+
125
+ // After
126
+ import { ai } from '@repo/analytics/client/next';
127
+ ai.AGENT_EXECUTION_COMPLETED({ ... });
128
+ ```
129
+
130
+ Now tracks complete e-commerce chatbot customer journey from first interaction to post-purchase support with sentiment
131
+ analysis, proactive engagement, and quality monitoring.
132
+
133
+ ### Patch Changes
134
+
135
+ - Updated dependencies
136
+ [[`e6c009d`](https://github.com/OneDigital-Product/monorepo/commit/e6c009dbd60afb0824a9418b97da15f8b43a3ecf),
137
+ [`9b7ff31`](https://github.com/OneDigital-Product/monorepo/commit/9b7ff317f2ac6d2088b4f194bea16aa15915cb80),
138
+ [`be5007c`](https://github.com/OneDigital-Product/monorepo/commit/be5007cf21959d0e5b15f8b602868b7adc567287),
139
+ [`1bec7a6`](https://github.com/OneDigital-Product/monorepo/commit/1bec7a65f975f3ff4ce35d1adc56611de76c16a4)]:
140
+ - @repo/observability@2025.11.1202
141
+ - @repo/shared@2025.11.1201
@@ -5,9 +5,117 @@ import { a as screen, i as page, n as group, o as track, r as identify, t as ali
5
5
  import { t as ecommerce_exports } from "./ecommerce-Cgu4wlux.mjs";
6
6
  import { t as ai_exports } from "./ai-YMnynb-t.mjs";
7
7
  import { a as createEmitterProcessor, i as validateConfig, n as createConfigBuilder, o as processEmitterPayload, r as getAnalyticsConfig, s as trackEcommerceEvent, t as PROVIDER_REQUIREMENTS } from "./config-P6P5adJg.mjs";
8
- import { SegmentClientProvider } from "@integrations/segment/analytics-provider/client";
9
- import { VercelClientProvider } from "@integrations/vercel/analytics-provider/client";
10
8
 
9
+ //#region ../../integrations/segment/src/analytics-provider/client.ts
10
+ var SegmentClientProvider = class {
11
+ name = "segment";
12
+ analytics = null;
13
+ config;
14
+ isInitialized = false;
15
+ constructor(config) {
16
+ if (!config.writeKey) throw new Error("Segment writeKey is required");
17
+ this.config = {
18
+ options: config.options,
19
+ writeKey: config.writeKey
20
+ };
21
+ }
22
+ async initialize() {
23
+ if (this.isInitialized) return;
24
+ const { AnalyticsBrowser } = await import(
25
+ /* webpackChunkName: "segment-analytics-browser" */
26
+ "@segment/analytics-next"
27
+ );
28
+ this.analytics = AnalyticsBrowser.load({
29
+ writeKey: this.config.writeKey,
30
+ ...this.config.options
31
+ });
32
+ this.isInitialized = true;
33
+ }
34
+ async track(event, properties = {}, _context) {
35
+ if (!this.analytics) return;
36
+ await this.analytics.track(event, properties);
37
+ }
38
+ async identify(userId, traits = {}, _context) {
39
+ if (!this.analytics) return;
40
+ await this.analytics.identify(userId, traits);
41
+ }
42
+ async page(name, properties = {}, _context) {
43
+ if (!this.analytics) return;
44
+ await this.analytics.page(name, properties);
45
+ }
46
+ async group(groupId, traits = {}, _context) {
47
+ if (!this.analytics) return;
48
+ await this.analytics.group(groupId, traits);
49
+ }
50
+ async alias(userId, previousId, _context) {
51
+ if (!this.analytics) return;
52
+ await this.analytics.alias(userId, previousId);
53
+ }
54
+ };
55
+
56
+ //#endregion
57
+ //#region ../../integrations/vercel/src/analytics-provider/client.ts
58
+ /**
59
+ * Converts internal Properties type to Vercel Analytics format.
60
+ * Vercel Analytics requires Record<string, string | number | boolean>.
61
+ */
62
+ function normalizePropertiesToVercel(properties) {
63
+ if (!properties) return {};
64
+ const normalized = {};
65
+ for (const [key, value] of Object.entries(properties)) if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") normalized[key] = value;
66
+ return normalized;
67
+ }
68
+ var VercelClientProvider = class {
69
+ name = "vercel";
70
+ config;
71
+ isInitialized = false;
72
+ constructor(config) {
73
+ this.config = { options: config.options };
74
+ }
75
+ async initialize() {
76
+ if (this.isInitialized) return;
77
+ try {
78
+ const { inject } = await import("@vercel/analytics");
79
+ inject(this.config.options);
80
+ this.isInitialized = true;
81
+ } catch {
82
+ throw new Error("Vercel Analytics not available. Install with: npm install @vercel/analytics");
83
+ }
84
+ }
85
+ async track(event, properties = {}) {
86
+ if (!this.isInitialized) return;
87
+ try {
88
+ const { track } = await import("@vercel/analytics");
89
+ track(event, normalizePropertiesToVercel(properties));
90
+ } catch {}
91
+ }
92
+ async identify(userId, traits = {}) {
93
+ await this.track("User Identified", {
94
+ userId,
95
+ ...traits
96
+ });
97
+ }
98
+ async page(name, properties = {}) {
99
+ if (name || Object.keys(properties).length > 0) await this.track("Page View", {
100
+ page: name,
101
+ ...properties
102
+ });
103
+ }
104
+ async group(groupId, traits = {}) {
105
+ await this.track("Group Identified", {
106
+ groupId,
107
+ ...traits
108
+ });
109
+ }
110
+ async alias(userId, previousId) {
111
+ await this.track("User Aliased", {
112
+ previousId,
113
+ userId
114
+ });
115
+ }
116
+ };
117
+
118
+ //#endregion
11
119
  //#region src/client/manager.ts
12
120
  /**
13
121
  * @fileoverview Client Analytics Manager
package/client.mjs.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.mjs","names":[],"sources":["../../../integrations/segment/src/analytics-provider/client.ts","../../../integrations/vercel/src/analytics-provider/client.ts","../src/client/manager.ts","../src/shared/utils/validation-client.ts"],"sourcesContent":["/**\n * @fileoverview Segment client-side (browser) analytics provider\n *\n * Provides client-side integration with Segment Analytics using @segment/analytics-next.\n * Implements the @od-oneapp/analytics AnalyticsProvider interface for use in the analytics\n * manager's provider registry.\n *\n * @module @integrations/segment/analytics-provider/client\n */\n\nimport type {\n AnalyticsContext,\n AnalyticsProvider,\n GroupTraits,\n PageProperties,\n Properties,\n ProviderConfig,\n SegmentConfig,\n UserTraits,\n} from './types';\n\n// Type for AnalyticsBrowser instance\ninterface AnalyticsBrowserInstance {\n track: (event: string, properties?: Properties) => Promise<unknown>;\n identify: (userId: string, traits?: UserTraits) => Promise<unknown>;\n page: (name?: string, properties?: PageProperties) => Promise<unknown>;\n group: (groupId: string, traits?: GroupTraits) => Promise<unknown>;\n alias: (userId: string, previousId: string) => Promise<unknown>;\n}\n\nexport class SegmentClientProvider implements AnalyticsProvider {\n readonly name = 'segment';\n private analytics: AnalyticsBrowserInstance | null = null;\n private config: SegmentConfig;\n private isInitialized = false;\n\n constructor(config: ProviderConfig) {\n if (!config.writeKey) {\n throw new Error('Segment writeKey is required');\n }\n\n this.config = {\n options: config.options as Record<string, unknown>,\n writeKey: config.writeKey,\n };\n }\n\n async initialize(): Promise<void> {\n if (this.isInitialized) return;\n\n const { AnalyticsBrowser } = await import(\n /* webpackChunkName: \"segment-analytics-browser\" */\n '@segment/analytics-next'\n );\n\n this.analytics = AnalyticsBrowser.load({\n writeKey: this.config.writeKey,\n ...this.config.options,\n } as Parameters<typeof AnalyticsBrowser.load>[0]) as unknown as AnalyticsBrowserInstance;\n\n this.isInitialized = true;\n }\n\n async track(\n event: string,\n properties: Properties = {},\n _context?: AnalyticsContext,\n ): Promise<void> {\n if (!this.analytics) return;\n await this.analytics.track(event, properties);\n }\n\n async identify(\n userId: string,\n traits: UserTraits = {},\n _context?: AnalyticsContext,\n ): Promise<void> {\n if (!this.analytics) return;\n await this.analytics.identify(userId, traits);\n }\n\n async page(\n name?: string,\n properties: PageProperties = {},\n _context?: AnalyticsContext,\n ): Promise<void> {\n if (!this.analytics) return;\n await this.analytics.page(name, properties);\n }\n\n async group(\n groupId: string,\n traits: GroupTraits = {},\n _context?: AnalyticsContext,\n ): Promise<void> {\n if (!this.analytics) return;\n await this.analytics.group(groupId, traits);\n }\n\n async alias(userId: string, previousId: string, _context?: AnalyticsContext): Promise<void> {\n if (!this.analytics) return;\n await this.analytics.alias(userId, previousId);\n }\n}\n","/**\n * @fileoverview Vercel Analytics client-side (browser) provider\n *\n * Provides client-side integration with Vercel Analytics. Implements the\n * @od-oneapp/analytics AnalyticsProvider interface for use in the analytics\n * manager's provider registry.\n *\n * @module @integrations/vercel/analytics-provider/client\n */\n\nimport type {\n AnalyticsProvider,\n GroupTraits,\n PageProperties,\n Properties,\n ProviderConfig,\n UserTraits,\n VercelConfig,\n} from './types';\n\n/**\n * Converts internal Properties type to Vercel Analytics format.\n * Vercel Analytics requires Record<string, string | number | boolean>.\n */\nfunction normalizePropertiesToVercel(\n properties?: Properties,\n): Record<string, string | number | boolean> {\n if (!properties) return {};\n const normalized: Record<string, string | number | boolean> = {};\n for (const [key, value] of Object.entries(properties)) {\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n normalized[key] = value;\n }\n }\n return normalized;\n}\n\nexport class VercelClientProvider implements AnalyticsProvider {\n readonly name = 'vercel';\n private config: VercelConfig;\n private isInitialized = false;\n\n constructor(config: ProviderConfig) {\n this.config = {\n options: config.options,\n };\n }\n\n async initialize(): Promise<void> {\n if (this.isInitialized) return;\n\n try {\n const { inject } = await import('@vercel/analytics');\n inject(this.config.options);\n this.isInitialized = true;\n } catch {\n throw new Error(\n 'Vercel Analytics not available. Install with: npm install @vercel/analytics',\n );\n }\n }\n\n async track(event: string, properties: Properties = {}): Promise<void> {\n if (!this.isInitialized) return;\n\n try {\n const { track } = await import('@vercel/analytics');\n track(event, normalizePropertiesToVercel(properties));\n } catch {\n // Silently fail to avoid disrupting app flow\n }\n }\n\n async identify(userId: string, traits: UserTraits = {}): Promise<void> {\n await this.track('User Identified', {\n userId,\n ...traits,\n });\n }\n\n async page(name?: string, properties: PageProperties = {}): Promise<void> {\n if (name || Object.keys(properties).length > 0) {\n await this.track('Page View', {\n page: name,\n ...properties,\n });\n }\n }\n\n async group(groupId: string, traits: GroupTraits = {}): Promise<void> {\n await this.track('Group Identified', {\n groupId,\n ...traits,\n });\n }\n\n async alias(userId: string, previousId: string): Promise<void> {\n await this.track('User Aliased', {\n previousId,\n userId,\n });\n }\n}\n","/**\n * @fileoverview Client Analytics Manager\n *\n * Client-side analytics manager with static provider registry. Provides\n * factory functions for creating client analytics instances with support\n * for multiple providers (Console, HTTP, Segment, Vercel).\n *\n * **Providers Supported**:\n * - `console`: Console logging provider (development/debugging)\n * - `http`: HTTP provider for remote ingestion (oneapp-api)\n * - `segment`: Segment.io analytics provider\n * - `vercel`: Vercel Analytics provider\n *\n * @module @od-oneapp/analytics/client/manager\n */\n\nimport { SegmentClientProvider } from '@integrations/segment/analytics-provider/client';\nimport { VercelClientProvider } from '@integrations/vercel/analytics-provider/client';\n\nimport { ConsoleProvider } from '../providers/console/client';\nimport { HttpClientProvider } from '../providers/http/client';\nimport { createAnalyticsManager } from '../shared/utils/manager';\n\nimport type { AnalyticsConfig, AnalyticsManager, ProviderRegistry } from '../shared/types/types';\n\n// Static provider registry for client environments\nconst CLIENT_PROVIDERS: ProviderRegistry = {\n console: config => new ConsoleProvider(config),\n http: config => new HttpClientProvider(config),\n segment: config => new SegmentClientProvider(config),\n vercel: config => new VercelClientProvider(config),\n};\n\n/**\n * Create and initialize a client analytics instance\n * This is the primary way to create analytics for client-side applications\n *\n * @example\n * ```typescript\n * const analytics = await createClientAnalytics({\n * providers: {\n * http: { endpoint: '/api/v1/ingest' },\n * },\n * });\n * await analytics.track('Button Clicked', { variant: 'primary' });\n * ```\n * @param config - Analytics configuration including providers and settings\n * @returns Promise resolving to initialized analytics manager\n */\nexport async function createClientAnalytics(config: AnalyticsConfig): Promise<AnalyticsManager> {\n const manager = createAnalyticsManager(config, CLIENT_PROVIDERS);\n await manager.initialize();\n return manager;\n}\n\n/**\n * Create a client analytics instance without initializing\n * Useful when you need to control initialization timing\n *\n * @example\n * ```typescript\n * const analytics = createClientAnalyticsUninitialized(config);\n * // later inside a lazy effect\n * await analytics.initialize();\n * ```\n * @param config - Analytics configuration including providers and settings\n * @returns Uninitialized analytics manager instance\n */\nexport function createClientAnalyticsUninitialized(config: AnalyticsConfig): AnalyticsManager {\n return createAnalyticsManager(config, CLIENT_PROVIDERS);\n}\n","/**\n * @fileoverview Client-safe validation utilities for analytics configuration\n * Client-safe validation utilities for analytics configuration\n * This file contains only validation functions that are safe to use in browser environments\n */\n\nimport { PROVIDER_REQUIREMENTS } from './config';\n\nimport type { AnalyticsConfig, ProviderConfig } from '../types/types';\n\ninterface ValidationError {\n field: string;\n message: string;\n provider: string;\n}\n\ninterface ValidationResult {\n errors: ValidationError[];\n isValid: boolean;\n warnings: string[];\n}\n\n/**\n * Comprehensive configuration validation (client-safe version)\n * Accepts unknown input for defensive validation of potentially malformed configs\n */\nexport function validateAnalyticsConfig(config: unknown): ValidationResult {\n const errors: ValidationError[] = [];\n const warnings: string[] = [];\n\n // Check if config exists and is an object\n if (!config || typeof config !== 'object') {\n errors.push({\n provider: 'global',\n field: 'config',\n message: 'Analytics configuration is required and must be an object',\n });\n return { isValid: false, errors, warnings };\n }\n\n const typedConfig = config as AnalyticsConfig;\n\n // Check if providers object exists\n if (!typedConfig.providers || typeof typedConfig.providers !== 'object') {\n errors.push({\n provider: 'global',\n field: 'providers',\n message: 'Providers configuration is required and must be an object',\n });\n return { isValid: false, errors, warnings };\n }\n\n // Check if at least one provider is configured\n const providerCount = Object.keys(typedConfig.providers).length;\n if (providerCount === 0) {\n warnings.push('No providers configured. Analytics will not track any events.');\n }\n\n // Validate each provider\n for (const [providerName, providerConfig] of Object.entries(typedConfig.providers)) {\n const providerErrors = validateProvider(providerName, providerConfig);\n errors.push(...providerErrors);\n }\n\n // Environment-specific warnings\n if (typedConfig.providers.mixpanel) {\n warnings.push(\n 'Mixpanel provider configured on client-side. Consider using server-side for better performance.',\n );\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\n/**\n * Validate a single provider configuration\n */\nexport function validateProvider(providerName: string, config: ProviderConfig): ValidationError[] {\n const errors: ValidationError[] = [];\n\n // Check if provider is known\n const knownProviders = ['segment', 'posthog', 'vercel', 'console', 'mixpanel'];\n if (!knownProviders.includes(providerName)) {\n errors.push({\n provider: providerName,\n field: 'name',\n message: `Unknown provider '${providerName}'. Known providers: ${knownProviders.join(', ')}`,\n });\n return errors;\n }\n\n // Check required fields\n const requiredFields = PROVIDER_REQUIREMENTS[providerName] ?? [];\n for (const field of requiredFields) {\n const value = config[field as keyof ProviderConfig];\n\n if (!value) {\n errors.push({\n provider: providerName,\n field,\n message: `Required field '${field}' is missing for provider '${providerName}'`,\n });\n } else if (typeof value === 'string' && value.trim() === '') {\n errors.push({\n provider: providerName,\n field,\n message: `Required field '${field}' cannot be empty for provider '${providerName}'`,\n });\n }\n }\n\n // Provider-specific validation\n switch (providerName) {\n case 'segment':\n if (config.writeKey && !isValidSegmentWriteKey(config.writeKey)) {\n errors.push({\n provider: providerName,\n field: 'writeKey',\n message: 'Segment writeKey appears to be invalid format',\n });\n }\n break;\n\n case 'posthog':\n if (config.apiKey && !isValidPostHogApiKey(config.apiKey)) {\n errors.push({\n provider: providerName,\n field: 'apiKey',\n message: 'PostHog apiKey appears to be invalid format',\n });\n }\n break;\n }\n\n return errors;\n}\n\n/**\n * Helper functions for format validation\n */\nfunction isValidSegmentWriteKey(writeKey: string): boolean {\n // Segment write keys are typically 32 characters, alphanumeric\n return /^[\\dA-Za-z]{20,40}$/.test(writeKey);\n}\n\nfunction isValidPostHogApiKey(apiKey: string): boolean {\n // PostHog API keys start with 'phc_' followed by alphanumeric characters\n return /^phc_[\\dA-Za-z]{43}$/.test(apiKey);\n}\n\n/**\n * Utility to validate configuration (client-safe version without throwing)\n * Returns validation result instead of throwing errors\n */\nexport function validateConfig(config: AnalyticsConfig): ValidationResult {\n return validateAnalyticsConfig(config);\n}\n"],"mappings":";;;;;;;;;AA8BA,IAAa,wBAAb,MAAgE;CAC9D,AAAS,OAAO;CAChB,AAAQ,YAA6C;CACrD,AAAQ;CACR,AAAQ,gBAAgB;CAExB,YAAY,QAAwB;AAClC,MAAI,CAAC,OAAO,SACV,OAAM,IAAI,MAAM,+BAA+B;AAGjD,OAAK,SAAS;GACZ,SAAS,OAAO;GAChB,UAAU,OAAO;GAClB;;CAGH,MAAM,aAA4B;AAChC,MAAI,KAAK,cAAe;EAExB,MAAM,EAAE,qBAAqB,MAAM;;GAEjC;;AAGF,OAAK,YAAY,iBAAiB,KAAK;GACrC,UAAU,KAAK,OAAO;GACtB,GAAG,KAAK,OAAO;GAChB,CAAgD;AAEjD,OAAK,gBAAgB;;CAGvB,MAAM,MACJ,OACA,aAAyB,EAAE,EAC3B,UACe;AACf,MAAI,CAAC,KAAK,UAAW;AACrB,QAAM,KAAK,UAAU,MAAM,OAAO,WAAW;;CAG/C,MAAM,SACJ,QACA,SAAqB,EAAE,EACvB,UACe;AACf,MAAI,CAAC,KAAK,UAAW;AACrB,QAAM,KAAK,UAAU,SAAS,QAAQ,OAAO;;CAG/C,MAAM,KACJ,MACA,aAA6B,EAAE,EAC/B,UACe;AACf,MAAI,CAAC,KAAK,UAAW;AACrB,QAAM,KAAK,UAAU,KAAK,MAAM,WAAW;;CAG7C,MAAM,MACJ,SACA,SAAsB,EAAE,EACxB,UACe;AACf,MAAI,CAAC,KAAK,UAAW;AACrB,QAAM,KAAK,UAAU,MAAM,SAAS,OAAO;;CAG7C,MAAM,MAAM,QAAgB,YAAoB,UAA4C;AAC1F,MAAI,CAAC,KAAK,UAAW;AACrB,QAAM,KAAK,UAAU,MAAM,QAAQ,WAAW;;;;;;;;;;AC7ElD,SAAS,4BACP,YAC2C;AAC3C,KAAI,CAAC,WAAY,QAAO,EAAE;CAC1B,MAAM,aAAwD,EAAE;AAChE,MAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,WAAW,CACnD,KAAI,OAAO,UAAU,YAAY,OAAO,UAAU,YAAY,OAAO,UAAU,UAC7E,YAAW,OAAO;AAGtB,QAAO;;AAGT,IAAa,uBAAb,MAA+D;CAC7D,AAAS,OAAO;CAChB,AAAQ;CACR,AAAQ,gBAAgB;CAExB,YAAY,QAAwB;AAClC,OAAK,SAAS,EACZ,SAAS,OAAO,SACjB;;CAGH,MAAM,aAA4B;AAChC,MAAI,KAAK,cAAe;AAExB,MAAI;GACF,MAAM,EAAE,WAAW,MAAM,OAAO;AAChC,UAAO,KAAK,OAAO,QAAQ;AAC3B,QAAK,gBAAgB;UACf;AACN,SAAM,IAAI,MACR,8EACD;;;CAIL,MAAM,MAAM,OAAe,aAAyB,EAAE,EAAiB;AACrE,MAAI,CAAC,KAAK,cAAe;AAEzB,MAAI;GACF,MAAM,EAAE,UAAU,MAAM,OAAO;AAC/B,SAAM,OAAO,4BAA4B,WAAW,CAAC;UAC/C;;CAKV,MAAM,SAAS,QAAgB,SAAqB,EAAE,EAAiB;AACrE,QAAM,KAAK,MAAM,mBAAmB;GAClC;GACA,GAAG;GACJ,CAAC;;CAGJ,MAAM,KAAK,MAAe,aAA6B,EAAE,EAAiB;AACxE,MAAI,QAAQ,OAAO,KAAK,WAAW,CAAC,SAAS,EAC3C,OAAM,KAAK,MAAM,aAAa;GAC5B,MAAM;GACN,GAAG;GACJ,CAAC;;CAIN,MAAM,MAAM,SAAiB,SAAsB,EAAE,EAAiB;AACpE,QAAM,KAAK,MAAM,oBAAoB;GACnC;GACA,GAAG;GACJ,CAAC;;CAGJ,MAAM,MAAM,QAAgB,YAAmC;AAC7D,QAAM,KAAK,MAAM,gBAAgB;GAC/B;GACA;GACD,CAAC;;;;;;;;;;;;;;;;;;;;;AC1EN,MAAM,mBAAqC;CACzC,UAAS,WAAU,IAAI,gBAAgB,OAAO;CAC9C,OAAM,WAAU,IAAI,mBAAmB,OAAO;CAC9C,UAAS,WAAU,IAAI,sBAAsB,OAAO;CACpD,SAAQ,WAAU,IAAI,qBAAqB,OAAO;CACnD;;;;;;;;;;;;;;;;;AAkBD,eAAsB,sBAAsB,QAAoD;CAC9F,MAAM,UAAU,uBAAuB,QAAQ,iBAAiB;AAChE,OAAM,QAAQ,YAAY;AAC1B,QAAO;;;;;;;;;;;;;;;AAgBT,SAAgB,mCAAmC,QAA2C;AAC5F,QAAO,uBAAuB,QAAQ,iBAAiB;;;;;;;;;;;;;;AC3CzD,SAAgB,wBAAwB,QAAmC;CACzE,MAAM,SAA4B,EAAE;CACpC,MAAM,WAAqB,EAAE;AAG7B,KAAI,CAAC,UAAU,OAAO,WAAW,UAAU;AACzC,SAAO,KAAK;GACV,UAAU;GACV,OAAO;GACP,SAAS;GACV,CAAC;AACF,SAAO;GAAE,SAAS;GAAO;GAAQ;GAAU;;CAG7C,MAAM,cAAc;AAGpB,KAAI,CAAC,YAAY,aAAa,OAAO,YAAY,cAAc,UAAU;AACvE,SAAO,KAAK;GACV,UAAU;GACV,OAAO;GACP,SAAS;GACV,CAAC;AACF,SAAO;GAAE,SAAS;GAAO;GAAQ;GAAU;;AAK7C,KADsB,OAAO,KAAK,YAAY,UAAU,CAAC,WACnC,EACpB,UAAS,KAAK,gEAAgE;AAIhF,MAAK,MAAM,CAAC,cAAc,mBAAmB,OAAO,QAAQ,YAAY,UAAU,EAAE;EAClF,MAAM,iBAAiB,iBAAiB,cAAc,eAAe;AACrE,SAAO,KAAK,GAAG,eAAe;;AAIhC,KAAI,YAAY,UAAU,SACxB,UAAS,KACP,kGACD;AAGH,QAAO;EACL,SAAS,OAAO,WAAW;EAC3B;EACA;EACD;;;;;AAMH,SAAgB,iBAAiB,cAAsB,QAA2C;CAChG,MAAM,SAA4B,EAAE;CAGpC,MAAM,iBAAiB;EAAC;EAAW;EAAW;EAAU;EAAW;EAAW;AAC9E,KAAI,CAAC,eAAe,SAAS,aAAa,EAAE;AAC1C,SAAO,KAAK;GACV,UAAU;GACV,OAAO;GACP,SAAS,qBAAqB,aAAa,sBAAsB,eAAe,KAAK,KAAK;GAC3F,CAAC;AACF,SAAO;;CAIT,MAAM,iBAAiB,sBAAsB,iBAAiB,EAAE;AAChE,MAAK,MAAM,SAAS,gBAAgB;EAClC,MAAM,QAAQ,OAAO;AAErB,MAAI,CAAC,MACH,QAAO,KAAK;GACV,UAAU;GACV;GACA,SAAS,mBAAmB,MAAM,6BAA6B,aAAa;GAC7E,CAAC;WACO,OAAO,UAAU,YAAY,MAAM,MAAM,KAAK,GACvD,QAAO,KAAK;GACV,UAAU;GACV;GACA,SAAS,mBAAmB,MAAM,kCAAkC,aAAa;GAClF,CAAC;;AAKN,SAAQ,cAAR;EACE,KAAK;AACH,OAAI,OAAO,YAAY,CAAC,uBAAuB,OAAO,SAAS,CAC7D,QAAO,KAAK;IACV,UAAU;IACV,OAAO;IACP,SAAS;IACV,CAAC;AAEJ;EAEF,KAAK;AACH,OAAI,OAAO,UAAU,CAAC,qBAAqB,OAAO,OAAO,CACvD,QAAO,KAAK;IACV,UAAU;IACV,OAAO;IACP,SAAS;IACV,CAAC;AAEJ;;AAGJ,QAAO;;;;;AAMT,SAAS,uBAAuB,UAA2B;AAEzD,QAAO,sBAAsB,KAAK,SAAS;;AAG7C,SAAS,qBAAqB,QAAyB;AAErD,QAAO,uBAAuB,KAAK,OAAO"}
package/package.json CHANGED
@@ -1,129 +1,139 @@
1
1
  {
2
2
  "name": "@od-oneapp/analytics",
3
- "version": "2026.1.1301",
4
- "private": false,
5
- "description": "Multi-provider analytics package with type-safe event tracking, comprehensive ecommerce support, and AI product analytics. Optimized for React 19 and Node.js 22+.",
6
- "repository": {
7
- "type": "git",
8
- "url": "https://github.com/OneDigital-Product/monorepo.git",
9
- "directory": "platform/packages/analytics"
10
- },
11
- "sideEffects": false,
3
+ "version": "2026.2.1701-canary.1",
4
+ "description": "Multi-provider analytics package with type-safe event tracking",
12
5
  "type": "module",
6
+ "sideEffects": false,
13
7
  "exports": {
14
8
  "./client": {
15
- "types": "./dist/client.d.mts",
16
- "import": "./dist/client.mjs",
17
- "default": "./dist/client.mjs"
9
+ "import": "./client.mjs",
10
+ "types": "./client.d.mts"
18
11
  },
19
12
  "./server": {
20
- "types": "./dist/server.d.mts",
21
- "import": "./dist/server.mjs",
22
- "default": "./dist/server.mjs"
13
+ "import": "./server.mjs",
14
+ "types": "./server.d.mts"
23
15
  },
24
16
  "./client/next": {
25
- "types": "./dist/client-next.d.mts",
26
- "import": "./dist/client-next.mjs",
27
- "default": "./dist/client-next.mjs"
17
+ "import": "./client-next.mjs",
18
+ "types": "./client-next.d.mts"
28
19
  },
29
20
  "./server/next": {
30
- "types": "./dist/server-next.d.mts",
31
- "import": "./dist/server-next.mjs",
32
- "default": "./dist/server-next.mjs"
21
+ "import": "./server-next.mjs",
22
+ "types": "./server-next.d.mts"
33
23
  },
34
24
  "./server/edge": {
35
- "types": "./dist/server-edge.d.mts",
36
- "import": "./dist/server-edge.mjs",
37
- "default": "./dist/server-edge.mjs"
25
+ "import": "./server-edge.mjs",
26
+ "types": "./server-edge.d.mts"
38
27
  },
39
28
  "./shared": {
40
- "types": "./dist/shared.d.mts",
41
- "import": "./dist/shared.mjs",
42
- "default": "./dist/shared.mjs"
29
+ "import": "./shared.mjs",
30
+ "types": "./shared.d.mts"
43
31
  },
44
32
  "./types": {
45
- "types": "./dist/types.d.mts",
46
- "import": "./dist/types.mjs",
47
- "default": "./dist/types.mjs"
33
+ "import": "./types.mjs",
34
+ "types": "./types.d.mts"
48
35
  },
49
36
  "./providers/http": {
50
- "types": "./dist/providers-http.d.mts",
51
- "import": "./dist/providers-http.mjs",
52
- "default": "./dist/providers-http.mjs"
37
+ "import": "./providers-http.mjs",
38
+ "types": "./providers-http.d.mts"
53
39
  },
54
40
  "./providers/http/client": {
55
- "types": "./dist/providers-http-client.d.mts",
56
- "import": "./dist/providers-http-client.mjs",
57
- "default": "./dist/providers-http-client.mjs"
41
+ "import": "./providers-http-client.mjs",
42
+ "types": "./providers-http-client.d.mts"
58
43
  },
59
44
  "./providers/http/server": {
60
- "types": "./dist/providers-http-server.d.mts",
61
- "import": "./dist/providers-http-server.mjs",
62
- "default": "./dist/providers-http-server.mjs"
45
+ "import": "./providers-http-server.mjs",
46
+ "types": "./providers-http-server.d.mts"
63
47
  }
64
48
  },
65
- "types": "./src/types/index.ts",
66
- "files": [
67
- "dist",
68
- "src"
69
- ],
70
49
  "dependencies": {
71
- "@vercel/analytics": "^1.6.1",
72
50
  "posthog-js": "^1.301.2",
73
- "@t3-oss/env-core": "^0.13.10",
74
- "next": "16.1.6",
75
51
  "posthog-node": "^5.24.15",
76
- "react": "^19.2.4",
77
- "zod": "4.3.6",
78
- "@integrations/segment": "2026.1.1301",
79
- "@repo/shared": "2026.1.1301",
80
- "@od-oneapp/observability": "2026.1.1301",
81
- "@integrations/vercel": "2026.1.1301",
82
- "@repo/3p-posthog": "2026.1.1301"
52
+ "@segment/analytics-node": "^2.3.0",
53
+ "@vercel/analytics": "^1.6.1",
54
+ "@t3-oss/env-core": "^0.13.10"
83
55
  },
84
- "devDependencies": {
56
+ "optionalDependencies": {
85
57
  "@segment/analytics-next": "^1.81.1",
86
- "@sentry/nextjs": "^10.38.0",
87
- "@testing-library/dom": "^10.4.1",
88
- "@testing-library/jest-dom": "^6.9.1",
89
- "@testing-library/react": "^16.3.2",
90
- "@testing-library/user-event": "14.6.1",
91
- "@types/react": "19.2.13",
92
- "@types/react-dom": "19.2.3",
93
- "@vitest/coverage-v8": "4.0.18",
94
- "eslint": "9.39.2",
95
- "jsdom": "^28.0.0",
96
- "knip": "^5.83.1",
97
- "madge": "8.0.0",
98
- "msw": "^2.12.10",
99
- "tsdown": "^0.20.3",
100
- "typescript": "5.9.3",
101
- "vite-tsconfig-paths": "6.1.0",
102
- "vitest": "4.0.18",
103
- "@repo/config": "2026.1.1301",
104
- "@od-oneapp/qa": "2026.1.1301"
58
+ "@flags-sdk/edge-config": "^0.1.2",
59
+ "@flags-sdk/openfeature": "^0.1.2",
60
+ "@vercel/analytics": "^1.6.1",
61
+ "@vercel/blob": "^2.2.0"
105
62
  },
106
- "engines": {
107
- "node": ">=22.0.0",
108
- "pnpm": ">=10.28.2"
63
+ "peerDependencies": {
64
+ "next": ">=14.0.0",
65
+ "react": ">=18.0.0",
66
+ "zod": ">=3.23.0"
67
+ },
68
+ "peerDependenciesMeta": {
69
+ "next": {
70
+ "optional": true
71
+ }
72
+ },
73
+ "repository": {
74
+ "type": "git",
75
+ "url": "https://github.com/OneDigital-Product/monorepo.git",
76
+ "directory": "platform/packages/analytics"
109
77
  },
78
+ "license": "UNLICENSED",
110
79
  "publishConfig": {
111
80
  "access": "restricted",
81
+ "exports": {
82
+ "./client": {
83
+ "types": "./dist/client.d.mts",
84
+ "import": "./dist/client.mjs",
85
+ "default": "./dist/client.mjs"
86
+ },
87
+ "./server": {
88
+ "types": "./dist/server.d.mts",
89
+ "import": "./dist/server.mjs",
90
+ "default": "./dist/server.mjs"
91
+ },
92
+ "./client/next": {
93
+ "types": "./dist/client-next.d.mts",
94
+ "import": "./dist/client-next.mjs",
95
+ "default": "./dist/client-next.mjs"
96
+ },
97
+ "./server/next": {
98
+ "types": "./dist/server-next.d.mts",
99
+ "import": "./dist/server-next.mjs",
100
+ "default": "./dist/server-next.mjs"
101
+ },
102
+ "./server/edge": {
103
+ "types": "./dist/server-edge.d.mts",
104
+ "import": "./dist/server-edge.mjs",
105
+ "default": "./dist/server-edge.mjs"
106
+ },
107
+ "./shared": {
108
+ "types": "./dist/shared.d.mts",
109
+ "import": "./dist/shared.mjs",
110
+ "default": "./dist/shared.mjs"
111
+ },
112
+ "./types": {
113
+ "types": "./dist/types.d.mts",
114
+ "import": "./dist/types.mjs",
115
+ "default": "./dist/types.mjs"
116
+ },
117
+ "./providers/http": {
118
+ "types": "./dist/providers-http.d.mts",
119
+ "import": "./dist/providers-http.mjs",
120
+ "default": "./dist/providers-http.mjs"
121
+ },
122
+ "./providers/http/client": {
123
+ "types": "./dist/providers-http-client.d.mts",
124
+ "import": "./dist/providers-http-client.mjs",
125
+ "default": "./dist/providers-http-client.mjs"
126
+ },
127
+ "./providers/http/server": {
128
+ "types": "./dist/providers-http-server.d.mts",
129
+ "import": "./dist/providers-http-server.mjs",
130
+ "default": "./dist/providers-http-server.mjs"
131
+ }
132
+ },
112
133
  "registry": "https://registry.npmjs.org/"
113
134
  },
114
- "scripts": {
115
- "build": "tsdown",
116
- "build:publish": "tsdown && node ../../../scripts/prepare-publish.mjs",
117
- "circular": "madge --circular --extensions ts,tsx,js,jsx .",
118
- "coverage:collect": "vitest run --coverage --reporter=json",
119
- "format": "prettier --write --cache --ignore-unknown --ignore-path ../../../.prettierignore .",
120
- "format:check": "prettier --check --cache --ignore-unknown --ignore-path ../../../.prettierignore .",
121
- "knip": "knip --reporter json --exclude unlisted,exports,files,binaries,types,duplicates",
122
- "lint": "eslint . --fix ",
123
- "test": "vitest run",
124
- "test:coverage": "vitest run --coverage",
125
- "test:coverage:json": "vitest run --coverage --reporter=json",
126
- "test:watch": "vitest",
127
- "typecheck": "tsc --noEmit"
135
+ "engines": {
136
+ "node": ">=22.0.0",
137
+ "pnpm": ">=10.28.2"
128
138
  }
129
- }
139
+ }
@@ -2,7 +2,7 @@ import { _ as AnalyticsManager, a as ContextBuilder, c as createAnonymousSession
2
2
  import { a as screen, i as page, n as group, o as track, r as identify, t as alias } from "./emitters-6-nKo8i-.mjs";
3
3
  import { t as ecommerce_exports } from "./ecommerce-Cgu4wlux.mjs";
4
4
  import { a as createEmitterProcessor, i as validateConfig, n as createConfigBuilder, o as processEmitterPayload, r as getAnalyticsConfig, s as trackEcommerceEvent, t as PROVIDER_REQUIREMENTS } from "./config-P6P5adJg.mjs";
5
- import { a as debugConfig, c as validateProvider, i as validateEventPayload, l as createServerAnalytics, n as createIngestionService, o as validateAnalyticsConfig, r as validateBatchPayload, s as validateConfigOrThrow, t as IngestionService, u as createServerAnalyticsUninitialized } from "./service-cYtBBL8x.mjs";
5
+ import { a as debugConfig, c as validateProvider, i as validateEventPayload, l as createServerAnalytics, n as createIngestionService, o as validateAnalyticsConfig, r as validateBatchPayload, s as validateConfigOrThrow, t as IngestionService, u as createServerAnalyticsUninitialized } from "./service-Duqnlppl.mjs";
6
6
 
7
7
  //#region src/next/middleware.ts
8
8
  /**
@@ -2,6 +2,6 @@ import { _ as AnalyticsManager, a as ContextBuilder, c as createAnonymousSession
2
2
  import { a as screen, i as page, n as group, o as track, r as identify, t as alias } from "./emitters-6-nKo8i-.mjs";
3
3
  import { t as ecommerce_exports } from "./ecommerce-Cgu4wlux.mjs";
4
4
  import { a as createEmitterProcessor, i as validateConfig, n as createConfigBuilder, o as processEmitterPayload, r as getAnalyticsConfig, s as trackEcommerceEvent, t as PROVIDER_REQUIREMENTS } from "./config-P6P5adJg.mjs";
5
- import { a as debugConfig, c as validateProvider, i as validateEventPayload, l as createServerAnalytics, n as createIngestionService, o as validateAnalyticsConfig, r as validateBatchPayload, s as validateConfigOrThrow, t as IngestionService, u as createServerAnalyticsUninitialized } from "./service-cYtBBL8x.mjs";
5
+ import { a as debugConfig, c as validateProvider, i as validateEventPayload, l as createServerAnalytics, n as createIngestionService, o as validateAnalyticsConfig, r as validateBatchPayload, s as validateConfigOrThrow, t as IngestionService, u as createServerAnalyticsUninitialized } from "./service-Duqnlppl.mjs";
6
6
 
7
7
  export { AnalyticsManager as AnalyticsManagerClass, ContextBuilder, EventBatch, IngestionService, PROVIDER_REQUIREMENTS, PayloadBuilder, alias, createAnalyticsManager, createAnonymousSession, createBootstrapData, createConfigBuilder, createEmitterProcessor, createIngestionService, createMinimalBootstrapData, createServerAnalytics, createServerAnalyticsUninitialized, createUserSession, debugConfig, ecommerce_exports as ecommerce, generateDistinctId, getAnalyticsConfig, group, identify, isAliasPayload, isGroupPayload, isIdentifyPayload, isPagePayload, isTrackPayload, page, processEmitterPayload, screen, track, trackEcommerceEvent, validateAnalyticsConfig, validateBatchPayload, validateConfig, validateConfigOrThrow, validateEventPayload, validateProvider, withMetadata, withUTM };