@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.
- package/CHANGELOG.md +141 -0
- package/{dist/client.mjs → client.mjs} +110 -2
- package/client.mjs.map +1 -0
- package/package.json +102 -92
- package/{dist/server-next.mjs → server-next.mjs} +1 -1
- package/{dist/server.mjs → server.mjs} +1 -1
- package/{dist/service-cYtBBL8x.mjs → service-Duqnlppl.mjs} +107 -3
- package/service-Duqnlppl.mjs.map +1 -0
- package/dist/client.mjs.map +0 -1
- package/dist/service-cYtBBL8x.mjs.map +0 -1
- package/src/client/index.ts +0 -164
- package/src/client/manager.ts +0 -71
- package/src/client/next/components.tsx +0 -270
- package/src/client/next/hooks.ts +0 -217
- package/src/client/next/manager.ts +0 -141
- package/src/client/next.ts +0 -144
- package/src/client-next.ts +0 -101
- package/src/client.ts +0 -89
- package/src/examples/ai-sdk-patterns.ts +0 -583
- package/src/examples/emitter-patterns.ts +0 -476
- package/src/examples/nextjs-emitter-patterns.tsx +0 -403
- package/src/next/app-router.tsx +0 -564
- package/src/next/client.ts +0 -419
- package/src/next/index.ts +0 -84
- package/src/next/middleware.ts +0 -429
- package/src/next/rsc.tsx +0 -300
- package/src/next/server.ts +0 -253
- package/src/next/types.d.ts +0 -220
- package/src/providers/base-provider.ts +0 -419
- package/src/providers/console/client.ts +0 -10
- package/src/providers/console/index.ts +0 -152
- package/src/providers/console/server.ts +0 -6
- package/src/providers/console/types.ts +0 -15
- package/src/providers/http/client.ts +0 -464
- package/src/providers/http/index.ts +0 -30
- package/src/providers/http/server.ts +0 -396
- package/src/providers/http/types.ts +0 -135
- package/src/providers/posthog/client.ts +0 -518
- package/src/providers/posthog/index.ts +0 -11
- package/src/providers/posthog/server.ts +0 -329
- package/src/providers/posthog/types.ts +0 -104
- package/src/providers/segment/client.ts +0 -113
- package/src/providers/segment/index.ts +0 -11
- package/src/providers/segment/server.ts +0 -115
- package/src/providers/segment/types.ts +0 -51
- package/src/providers/vercel/client.ts +0 -102
- package/src/providers/vercel/index.ts +0 -11
- package/src/providers/vercel/server.ts +0 -89
- package/src/providers/vercel/types.ts +0 -27
- package/src/server/index.ts +0 -103
- package/src/server/manager.ts +0 -62
- package/src/server/next.ts +0 -210
- package/src/server-edge.ts +0 -442
- package/src/server-next.ts +0 -39
- package/src/server.ts +0 -106
- package/src/shared/emitters/ai/README.md +0 -981
- package/src/shared/emitters/ai/events/agent.ts +0 -130
- package/src/shared/emitters/ai/events/artifacts.ts +0 -167
- package/src/shared/emitters/ai/events/chat.ts +0 -126
- package/src/shared/emitters/ai/events/chatbot-ecommerce.ts +0 -133
- package/src/shared/emitters/ai/events/completion.ts +0 -103
- package/src/shared/emitters/ai/events/content-generation.ts +0 -347
- package/src/shared/emitters/ai/events/conversation.ts +0 -332
- package/src/shared/emitters/ai/events/product-features.ts +0 -1402
- package/src/shared/emitters/ai/events/streaming.ts +0 -114
- package/src/shared/emitters/ai/events/tool.ts +0 -93
- package/src/shared/emitters/ai/index.ts +0 -69
- package/src/shared/emitters/ai/track-ai-sdk.ts +0 -74
- package/src/shared/emitters/ai/track-ai.ts +0 -50
- package/src/shared/emitters/ai/types.ts +0 -1041
- package/src/shared/emitters/ai/utils.ts +0 -468
- package/src/shared/emitters/ecommerce/events/cart-checkout.ts +0 -106
- package/src/shared/emitters/ecommerce/events/coupon.ts +0 -49
- package/src/shared/emitters/ecommerce/events/engagement.ts +0 -61
- package/src/shared/emitters/ecommerce/events/marketplace.ts +0 -119
- package/src/shared/emitters/ecommerce/events/order.ts +0 -199
- package/src/shared/emitters/ecommerce/events/product.ts +0 -205
- package/src/shared/emitters/ecommerce/events/registry.ts +0 -123
- package/src/shared/emitters/ecommerce/events/wishlist-sharing.ts +0 -140
- package/src/shared/emitters/ecommerce/index.ts +0 -46
- package/src/shared/emitters/ecommerce/track-ecommerce.ts +0 -53
- package/src/shared/emitters/ecommerce/types.ts +0 -314
- package/src/shared/emitters/ecommerce/utils.ts +0 -216
- package/src/shared/emitters/emitter-types.ts +0 -974
- package/src/shared/emitters/emitters.ts +0 -292
- package/src/shared/emitters/helpers.ts +0 -419
- package/src/shared/emitters/index.ts +0 -66
- package/src/shared/index.ts +0 -142
- package/src/shared/ingestion/index.ts +0 -66
- package/src/shared/ingestion/schemas.ts +0 -386
- package/src/shared/ingestion/service.ts +0 -628
- package/src/shared/node22-features.ts +0 -848
- package/src/shared/providers/console-provider.ts +0 -160
- package/src/shared/types/base-types.ts +0 -54
- package/src/shared/types/console-types.ts +0 -19
- package/src/shared/types/posthog-types.ts +0 -131
- package/src/shared/types/segment-types.ts +0 -15
- package/src/shared/types/types.ts +0 -397
- package/src/shared/types/vercel-types.ts +0 -19
- package/src/shared/utils/config-client.ts +0 -19
- package/src/shared/utils/config.ts +0 -250
- package/src/shared/utils/emitter-adapter.ts +0 -212
- package/src/shared/utils/manager.test.ts +0 -36
- package/src/shared/utils/manager.ts +0 -1322
- package/src/shared/utils/posthog-bootstrap.ts +0 -136
- package/src/shared/utils/posthog-client-utils.ts +0 -48
- package/src/shared/utils/posthog-next-utils.ts +0 -282
- package/src/shared/utils/posthog-server-utils.ts +0 -210
- package/src/shared/utils/rate-limit.ts +0 -289
- package/src/shared/utils/security.ts +0 -545
- package/src/shared/utils/validation-client.ts +0 -161
- package/src/shared/utils/validation.ts +0 -399
- package/src/shared.ts +0 -155
- package/src/types/index.ts +0 -62
- /package/{dist/ai-YMnynb-t.mjs → ai-YMnynb-t.mjs} +0 -0
- /package/{dist/ai-YMnynb-t.mjs.map → ai-YMnynb-t.mjs.map} +0 -0
- /package/{dist/chunk-DQk6qfdC.mjs → chunk-DQk6qfdC.mjs} +0 -0
- /package/{dist/client-CTzJVFU5.mjs → client-CTzJVFU5.mjs} +0 -0
- /package/{dist/client-CTzJVFU5.mjs.map → client-CTzJVFU5.mjs.map} +0 -0
- /package/{dist/client-CcFTauAh.mjs → client-CcFTauAh.mjs} +0 -0
- /package/{dist/client-CcFTauAh.mjs.map → client-CcFTauAh.mjs.map} +0 -0
- /package/{dist/client-CeOLjbac.mjs → client-CeOLjbac.mjs} +0 -0
- /package/{dist/client-CeOLjbac.mjs.map → client-CeOLjbac.mjs.map} +0 -0
- /package/{dist/client-D339NFJS.mjs → client-D339NFJS.mjs} +0 -0
- /package/{dist/client-D339NFJS.mjs.map → client-D339NFJS.mjs.map} +0 -0
- /package/{dist/client-next.d.mts → client-next.d.mts} +0 -0
- /package/{dist/client-next.d.mts.map → client-next.d.mts.map} +0 -0
- /package/{dist/client-next.mjs → client-next.mjs} +0 -0
- /package/{dist/client-next.mjs.map → client-next.mjs.map} +0 -0
- /package/{dist/client.d.mts → client.d.mts} +0 -0
- /package/{dist/client.d.mts.map → client.d.mts.map} +0 -0
- /package/{dist/config-DPS6bSYo.d.mts → config-DPS6bSYo.d.mts} +0 -0
- /package/{dist/config-DPS6bSYo.d.mts.map → config-DPS6bSYo.d.mts.map} +0 -0
- /package/{dist/config-P6P5adJg.mjs → config-P6P5adJg.mjs} +0 -0
- /package/{dist/config-P6P5adJg.mjs.map → config-P6P5adJg.mjs.map} +0 -0
- /package/{dist/console-8bND3mMU.mjs → console-8bND3mMU.mjs} +0 -0
- /package/{dist/console-8bND3mMU.mjs.map → console-8bND3mMU.mjs.map} +0 -0
- /package/{dist/ecommerce-Cgu4wlux.mjs → ecommerce-Cgu4wlux.mjs} +0 -0
- /package/{dist/ecommerce-Cgu4wlux.mjs.map → ecommerce-Cgu4wlux.mjs.map} +0 -0
- /package/{dist/emitters-6-nKo8i-.mjs → emitters-6-nKo8i-.mjs} +0 -0
- /package/{dist/emitters-6-nKo8i-.mjs.map → emitters-6-nKo8i-.mjs.map} +0 -0
- /package/{dist/emitters-DldkVSPp.d.mts → emitters-DldkVSPp.d.mts} +0 -0
- /package/{dist/emitters-DldkVSPp.d.mts.map → emitters-DldkVSPp.d.mts.map} +0 -0
- /package/{dist/index-BfNWgfa5.d.mts → index-BfNWgfa5.d.mts} +0 -0
- /package/{dist/index-BfNWgfa5.d.mts.map → index-BfNWgfa5.d.mts.map} +0 -0
- /package/{dist/index-BkIWe--N.d.mts → index-BkIWe--N.d.mts} +0 -0
- /package/{dist/index-BkIWe--N.d.mts.map → index-BkIWe--N.d.mts.map} +0 -0
- /package/{dist/index-jPzXRn52.d.mts → index-jPzXRn52.d.mts} +0 -0
- /package/{dist/index-jPzXRn52.d.mts.map → index-jPzXRn52.d.mts.map} +0 -0
- /package/{dist/manager-DvRRjza6.d.mts → manager-DvRRjza6.d.mts} +0 -0
- /package/{dist/manager-DvRRjza6.d.mts.map → manager-DvRRjza6.d.mts.map} +0 -0
- /package/{dist/posthog-bootstrap-CYfIy_WS.mjs → posthog-bootstrap-CYfIy_WS.mjs} +0 -0
- /package/{dist/posthog-bootstrap-CYfIy_WS.mjs.map → posthog-bootstrap-CYfIy_WS.mjs.map} +0 -0
- /package/{dist/posthog-bootstrap-DWxFrxlt.d.mts → posthog-bootstrap-DWxFrxlt.d.mts} +0 -0
- /package/{dist/posthog-bootstrap-DWxFrxlt.d.mts.map → posthog-bootstrap-DWxFrxlt.d.mts.map} +0 -0
- /package/{dist/providers-http-client.d.mts → providers-http-client.d.mts} +0 -0
- /package/{dist/providers-http-client.d.mts.map → providers-http-client.d.mts.map} +0 -0
- /package/{dist/providers-http-client.mjs → providers-http-client.mjs} +0 -0
- /package/{dist/providers-http-client.mjs.map → providers-http-client.mjs.map} +0 -0
- /package/{dist/providers-http-server.d.mts → providers-http-server.d.mts} +0 -0
- /package/{dist/providers-http-server.d.mts.map → providers-http-server.d.mts.map} +0 -0
- /package/{dist/providers-http-server.mjs → providers-http-server.mjs} +0 -0
- /package/{dist/providers-http-server.mjs.map → providers-http-server.mjs.map} +0 -0
- /package/{dist/providers-http.d.mts → providers-http.d.mts} +0 -0
- /package/{dist/providers-http.d.mts.map → providers-http.d.mts.map} +0 -0
- /package/{dist/providers-http.mjs → providers-http.mjs} +0 -0
- /package/{dist/server-edge.d.mts → server-edge.d.mts} +0 -0
- /package/{dist/server-edge.d.mts.map → server-edge.d.mts.map} +0 -0
- /package/{dist/server-edge.mjs → server-edge.mjs} +0 -0
- /package/{dist/server-edge.mjs.map → server-edge.mjs.map} +0 -0
- /package/{dist/server-next.d.mts → server-next.d.mts} +0 -0
- /package/{dist/server-next.d.mts.map → server-next.d.mts.map} +0 -0
- /package/{dist/server-next.mjs.map → server-next.mjs.map} +0 -0
- /package/{dist/server.d.mts → server.d.mts} +0 -0
- /package/{dist/shared.d.mts → shared.d.mts} +0 -0
- /package/{dist/shared.d.mts.map → shared.d.mts.map} +0 -0
- /package/{dist/shared.mjs → shared.mjs} +0 -0
- /package/{dist/shared.mjs.map → shared.mjs.map} +0 -0
- /package/{dist/types-BxBnNQ0V.d.mts → types-BxBnNQ0V.d.mts} +0 -0
- /package/{dist/types-BxBnNQ0V.d.mts.map → types-BxBnNQ0V.d.mts.map} +0 -0
- /package/{dist/types-CBvxUEaF.d.mts → types-CBvxUEaF.d.mts} +0 -0
- /package/{dist/types-CBvxUEaF.d.mts.map → types-CBvxUEaF.d.mts.map} +0 -0
- /package/{dist/types.d.mts → types.d.mts} +0 -0
- /package/{dist/types.mjs → types.mjs} +0 -0
- /package/{dist/vercel-types-lwakUfoI.d.mts → vercel-types-lwakUfoI.d.mts} +0 -0
- /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":"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"}
|
package/package.json
CHANGED
|
@@ -1,129 +1,139 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@od-oneapp/analytics",
|
|
3
|
-
"version": "2026.1
|
|
4
|
-
"
|
|
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
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"default": "./dist/client.mjs"
|
|
9
|
+
"import": "./client.mjs",
|
|
10
|
+
"types": "./client.d.mts"
|
|
18
11
|
},
|
|
19
12
|
"./server": {
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"default": "./dist/server.mjs"
|
|
13
|
+
"import": "./server.mjs",
|
|
14
|
+
"types": "./server.d.mts"
|
|
23
15
|
},
|
|
24
16
|
"./client/next": {
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"default": "./dist/client-next.mjs"
|
|
17
|
+
"import": "./client-next.mjs",
|
|
18
|
+
"types": "./client-next.d.mts"
|
|
28
19
|
},
|
|
29
20
|
"./server/next": {
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"default": "./dist/server-next.mjs"
|
|
21
|
+
"import": "./server-next.mjs",
|
|
22
|
+
"types": "./server-next.d.mts"
|
|
33
23
|
},
|
|
34
24
|
"./server/edge": {
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"default": "./dist/server-edge.mjs"
|
|
25
|
+
"import": "./server-edge.mjs",
|
|
26
|
+
"types": "./server-edge.d.mts"
|
|
38
27
|
},
|
|
39
28
|
"./shared": {
|
|
40
|
-
"
|
|
41
|
-
"
|
|
42
|
-
"default": "./dist/shared.mjs"
|
|
29
|
+
"import": "./shared.mjs",
|
|
30
|
+
"types": "./shared.d.mts"
|
|
43
31
|
},
|
|
44
32
|
"./types": {
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
"default": "./dist/types.mjs"
|
|
33
|
+
"import": "./types.mjs",
|
|
34
|
+
"types": "./types.d.mts"
|
|
48
35
|
},
|
|
49
36
|
"./providers/http": {
|
|
50
|
-
"
|
|
51
|
-
"
|
|
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
|
-
"
|
|
56
|
-
"
|
|
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
|
-
"
|
|
61
|
-
"
|
|
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
|
-
"
|
|
77
|
-
"
|
|
78
|
-
"@
|
|
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
|
-
"
|
|
56
|
+
"optionalDependencies": {
|
|
85
57
|
"@segment/analytics-next": "^1.81.1",
|
|
86
|
-
"@
|
|
87
|
-
"@
|
|
88
|
-
"@
|
|
89
|
-
"@
|
|
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
|
-
"
|
|
107
|
-
"
|
|
108
|
-
"
|
|
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
|
-
"
|
|
115
|
-
"
|
|
116
|
-
"
|
|
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-
|
|
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-
|
|
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 };
|