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