@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,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Segment provider type definitions
|
|
3
|
+
*
|
|
4
|
+
* Defines TypeScript types and interfaces for Segment Analytics provider configuration.
|
|
5
|
+
* Includes browser and server-specific options.
|
|
6
|
+
*
|
|
7
|
+
* @module @repo/analytics/providers/segment/types
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { BaseProviderConfig } from '../base-provider';
|
|
11
|
+
|
|
12
|
+
export interface SegmentConfig extends BaseProviderConfig {
|
|
13
|
+
writeKey: string;
|
|
14
|
+
options?: SegmentOptions | undefined;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
interface SegmentOptions {
|
|
18
|
+
// Segment Analytics 2.0 options
|
|
19
|
+
integrations?: Record<string, any>;
|
|
20
|
+
timeout?: number;
|
|
21
|
+
retryQueue?: boolean;
|
|
22
|
+
plugins?: any[];
|
|
23
|
+
|
|
24
|
+
// Browser-specific options
|
|
25
|
+
anonymousId?: string;
|
|
26
|
+
initialPageview?: boolean;
|
|
27
|
+
cookie?: {
|
|
28
|
+
name?: string;
|
|
29
|
+
maxage?: number;
|
|
30
|
+
domain?: string;
|
|
31
|
+
path?: string;
|
|
32
|
+
sameSite?: 'Strict' | 'Lax' | 'None';
|
|
33
|
+
secure?: boolean;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
// Server-specific options
|
|
37
|
+
flushAt?: number;
|
|
38
|
+
flushInterval?: number;
|
|
39
|
+
maxEventsInBatch?: number;
|
|
40
|
+
maxRetries?: number;
|
|
41
|
+
requestTimeout?: number;
|
|
42
|
+
|
|
43
|
+
// Advanced options
|
|
44
|
+
debug?: boolean;
|
|
45
|
+
disable?: boolean;
|
|
46
|
+
disableClientPersistence?: boolean;
|
|
47
|
+
useBeacon?: boolean;
|
|
48
|
+
apiHost?: string;
|
|
49
|
+
cdnURL?: string;
|
|
50
|
+
cdnSettings?: any;
|
|
51
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Vercel Analytics client-side (browser) provider implementation
|
|
3
|
+
*
|
|
4
|
+
* Provides client-side integration with Vercel Analytics for web analytics tracking.
|
|
5
|
+
* Supports automatic page view tracking and custom event tracking.
|
|
6
|
+
*
|
|
7
|
+
* @remarks
|
|
8
|
+
* This provider:
|
|
9
|
+
* - Uses @vercel/analytics package for client-side tracking
|
|
10
|
+
* - Supports dynamic imports to avoid SSR issues
|
|
11
|
+
* - Handles initialization and event tracking
|
|
12
|
+
* - Integrates with Vercel's analytics dashboard
|
|
13
|
+
*
|
|
14
|
+
* @module @repo/analytics/providers/vercel/client
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import type { VercelConfig } from './types';
|
|
18
|
+
import type { AnalyticsProvider, ProviderConfig } from '../../shared/types/types';
|
|
19
|
+
|
|
20
|
+
// Vercel Analytics types are handled by @vercel/analytics package
|
|
21
|
+
|
|
22
|
+
export class VercelClientProvider implements AnalyticsProvider {
|
|
23
|
+
readonly name = 'vercel';
|
|
24
|
+
private config: VercelConfig;
|
|
25
|
+
private isInitialized = false;
|
|
26
|
+
|
|
27
|
+
constructor(config: ProviderConfig) {
|
|
28
|
+
this.config = {
|
|
29
|
+
options: config.options,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async initialize(): Promise<void> {
|
|
34
|
+
if (this.isInitialized) return;
|
|
35
|
+
|
|
36
|
+
try {
|
|
37
|
+
// Dynamically import Vercel Analytics
|
|
38
|
+
const { inject } = await import('@vercel/analytics');
|
|
39
|
+
|
|
40
|
+
// Initialize Vercel Analytics
|
|
41
|
+
inject(this.config.options);
|
|
42
|
+
|
|
43
|
+
this.isInitialized = true;
|
|
44
|
+
} catch {
|
|
45
|
+
throw new Error(
|
|
46
|
+
'Vercel Analytics not available. Install with: npm install @vercel/analytics',
|
|
47
|
+
);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async track(event: string, properties: any = {}): Promise<void> {
|
|
52
|
+
if (!this.isInitialized) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
try {
|
|
57
|
+
// Import track function dynamically to avoid SSR issues
|
|
58
|
+
const { track } = await import('@vercel/analytics');
|
|
59
|
+
track(event, properties);
|
|
60
|
+
} catch {
|
|
61
|
+
// Silently fail to avoid disrupting app flow
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
async identify(userId: string, traits: any = {}): Promise<void> {
|
|
66
|
+
// Vercel Analytics doesn't have a native identify method
|
|
67
|
+
// We can track this as a custom event
|
|
68
|
+
await this.track('User Identified', {
|
|
69
|
+
userId,
|
|
70
|
+
...traits,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async page(name?: string, properties: any = {}): Promise<void> {
|
|
75
|
+
// Vercel Analytics automatically tracks page views
|
|
76
|
+
// We can track additional page data as custom events if needed
|
|
77
|
+
if (name || Object.keys(properties).length > 0) {
|
|
78
|
+
await this.track('Page View', {
|
|
79
|
+
page: name,
|
|
80
|
+
...properties,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
async group(groupId: string, traits: any = {}): Promise<void> {
|
|
86
|
+
// Vercel Analytics doesn't have a native group method
|
|
87
|
+
// We can track this as a custom event
|
|
88
|
+
await this.track('Group Identified', {
|
|
89
|
+
groupId,
|
|
90
|
+
...traits,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async alias(userId: string, previousId: string): Promise<void> {
|
|
95
|
+
// Vercel Analytics doesn't have a native alias method
|
|
96
|
+
// We can track this as a custom event
|
|
97
|
+
await this.track('User Aliased', {
|
|
98
|
+
previousId,
|
|
99
|
+
userId,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Vercel provider shared logic and exports
|
|
3
|
+
*
|
|
4
|
+
* Barrel export file for Vercel Analytics provider implementations and types.
|
|
5
|
+
*
|
|
6
|
+
* @module @repo/analytics/providers/vercel
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
// Export provider implementations
|
|
10
|
+
// Export types
|
|
11
|
+
export type * from './types';
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Vercel Analytics server-side (Node.js) provider implementation
|
|
3
|
+
*
|
|
4
|
+
* Provides server-side integration with Vercel Analytics.
|
|
5
|
+
* Note: Vercel Analytics is primarily client-side focused.
|
|
6
|
+
* Server-side tracking is limited and mainly for custom events.
|
|
7
|
+
*
|
|
8
|
+
* @remarks
|
|
9
|
+
* This provider:
|
|
10
|
+
* - Provides minimal server-side support
|
|
11
|
+
* - Most tracking should be done client-side
|
|
12
|
+
* - Can be extended for custom server-side events
|
|
13
|
+
*
|
|
14
|
+
* @module @repo/analytics/providers/vercel/server
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import type { AnalyticsProvider, ProviderConfig } from '../../shared/types/types';
|
|
18
|
+
|
|
19
|
+
export class VercelServerProvider implements AnalyticsProvider {
|
|
20
|
+
readonly name = 'vercel';
|
|
21
|
+
private isInitialized = false;
|
|
22
|
+
private readonly config: ProviderConfig;
|
|
23
|
+
|
|
24
|
+
constructor(config: ProviderConfig) {
|
|
25
|
+
this.config = config;
|
|
26
|
+
// Server-side Vercel Analytics is limited - most tracking happens client-side
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
async initialize(): Promise<void> {
|
|
30
|
+
if (this.isInitialized) return;
|
|
31
|
+
|
|
32
|
+
// Vercel Analytics doesn't require server-side initialization
|
|
33
|
+
// Just mark as initialized
|
|
34
|
+
this.isInitialized = true;
|
|
35
|
+
|
|
36
|
+
// Note: Limited server-side support. Consider using client-side tracking for better features.
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async track(event: string, properties: any = {}): Promise<void> {
|
|
40
|
+
if (!this.isInitialized) {
|
|
41
|
+
return;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
try {
|
|
45
|
+
// Parameters are deliberately unused until server-side tracking is implemented.
|
|
46
|
+
void event;
|
|
47
|
+
void properties;
|
|
48
|
+
void this.config;
|
|
49
|
+
// For server-side, we can use Vercel's Speed Insights API if available
|
|
50
|
+
// Server-side tracking is limited - most tracking happens client-side
|
|
51
|
+
// In production, you might want to send to Vercel's API endpoint
|
|
52
|
+
// This would require additional setup and is not part of the standard SDK
|
|
53
|
+
} catch {
|
|
54
|
+
// Silently fail to avoid disrupting app flow
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async identify(userId: string, traits: any = {}): Promise<void> {
|
|
59
|
+
// Track as custom event on server
|
|
60
|
+
await this.track('User Identified', {
|
|
61
|
+
userId,
|
|
62
|
+
...traits,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async page(name?: string, properties: any = {}): Promise<void> {
|
|
67
|
+
// Track page view on server (limited utility)
|
|
68
|
+
await this.track('Page View (Server)', {
|
|
69
|
+
page: name,
|
|
70
|
+
...properties,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
async group(groupId: string, traits: any = {}): Promise<void> {
|
|
75
|
+
// Track as custom event on server
|
|
76
|
+
await this.track('Group Identified', {
|
|
77
|
+
groupId,
|
|
78
|
+
...traits,
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
async alias(userId: string, previousId: string): Promise<void> {
|
|
83
|
+
// Track as custom event on server
|
|
84
|
+
await this.track('User Aliased', {
|
|
85
|
+
previousId,
|
|
86
|
+
userId,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Vercel provider type definitions
|
|
3
|
+
*
|
|
4
|
+
* Defines TypeScript types and interfaces for Vercel Analytics provider configuration.
|
|
5
|
+
*
|
|
6
|
+
* @module @repo/analytics/providers/vercel/types
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
export interface VercelConfig {
|
|
10
|
+
// Vercel Analytics doesn't require configuration in most cases
|
|
11
|
+
// It auto-detects the environment and deployment context
|
|
12
|
+
options?: VercelOptions | undefined;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
interface VercelOptions {
|
|
16
|
+
// Vercel Web Analytics options
|
|
17
|
+
debug?: boolean;
|
|
18
|
+
disabled?: boolean;
|
|
19
|
+
|
|
20
|
+
// Custom event tracking options
|
|
21
|
+
beforeSend?: (event: any) => any | null;
|
|
22
|
+
|
|
23
|
+
// Advanced options
|
|
24
|
+
mode?: 'auto' | 'development' | 'production';
|
|
25
|
+
framework?: string;
|
|
26
|
+
dsn?: string;
|
|
27
|
+
}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Server-side analytics exports
|
|
3
|
+
* Server-side analytics exports
|
|
4
|
+
* Complete analytics solution for server/Node.js environments
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* import { createServerAnalytics, track, ecommerce } from '@od-oneapp/analytics/server';
|
|
9
|
+
*
|
|
10
|
+
* const analytics = await createServerAnalytics({
|
|
11
|
+
* providers: {
|
|
12
|
+
* segment: { writeKey: 'xxx' },
|
|
13
|
+
* http: { endpoint: 'https://api.example.com/ingest' }
|
|
14
|
+
* }
|
|
15
|
+
* });
|
|
16
|
+
*
|
|
17
|
+
* // Preferred: Use emitters
|
|
18
|
+
* await analytics.emit(track('API Called', { endpoint: '/users' }));
|
|
19
|
+
* await analytics.emit(ecommerce.orderCompleted({ order_id: '123' }));
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
import { SegmentServerProvider } from '@integrations/segment/analytics-provider/server';
|
|
24
|
+
import { VercelServerProvider } from '@integrations/vercel/analytics-provider/server';
|
|
25
|
+
|
|
26
|
+
import { ConsoleProvider } from '../providers/console/server';
|
|
27
|
+
import { HttpServerProvider } from '../providers/http/server';
|
|
28
|
+
import { createAnalyticsManager } from '../shared/utils/manager';
|
|
29
|
+
|
|
30
|
+
import type { AnalyticsConfig, AnalyticsManager, ProviderRegistry } from '../shared/types/types';
|
|
31
|
+
|
|
32
|
+
// Server-specific provider registry
|
|
33
|
+
const SERVER_PROVIDERS: ProviderRegistry = {
|
|
34
|
+
console: config => new ConsoleProvider(config),
|
|
35
|
+
http: config => new HttpServerProvider(config),
|
|
36
|
+
segment: config => new SegmentServerProvider(config),
|
|
37
|
+
vercel: config => new VercelServerProvider(config),
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
// ============================================================================
|
|
41
|
+
// CORE ANALYTICS FUNCTIONS
|
|
42
|
+
// ============================================================================
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Create and initialize a server analytics instance
|
|
46
|
+
* This is the primary way to create analytics for server-side applications
|
|
47
|
+
*/
|
|
48
|
+
export async function createServerAnalytics(config: AnalyticsConfig): Promise<AnalyticsManager> {
|
|
49
|
+
const manager = createAnalyticsManager(config, SERVER_PROVIDERS);
|
|
50
|
+
await manager.initialize();
|
|
51
|
+
return manager;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Create a server analytics instance without initializing
|
|
56
|
+
* Useful when you need to control initialization timing
|
|
57
|
+
*
|
|
58
|
+
* @deprecated This function is currently unused but kept for potential future use
|
|
59
|
+
*/
|
|
60
|
+
// function _createServerAnalyticsUninitialized(config: AnalyticsConfig): AnalyticsManager {
|
|
61
|
+
// return createAnalyticsManager(config, SERVER_PROVIDERS);
|
|
62
|
+
// }
|
|
63
|
+
|
|
64
|
+
// ============================================================================
|
|
65
|
+
// EMITTERS - PRIMARY INTERFACE
|
|
66
|
+
// ============================================================================
|
|
67
|
+
|
|
68
|
+
// Export all core emitters - these are the preferred way to track events
|
|
69
|
+
export {} from '../shared/emitters';
|
|
70
|
+
|
|
71
|
+
// ============================================================================
|
|
72
|
+
// ADAPTER UTILITIES
|
|
73
|
+
// ============================================================================
|
|
74
|
+
|
|
75
|
+
export {} from '../shared/utils/emitter-adapter';
|
|
76
|
+
|
|
77
|
+
// ============================================================================
|
|
78
|
+
// TYPES
|
|
79
|
+
// ============================================================================
|
|
80
|
+
|
|
81
|
+
// Core analytics types;
|
|
82
|
+
|
|
83
|
+
// Emitter types;
|
|
84
|
+
|
|
85
|
+
// Provider-specific types;
|
|
86
|
+
|
|
87
|
+
// Ecommerce types;
|
|
88
|
+
|
|
89
|
+
// ============================================================================
|
|
90
|
+
// CONFIGURATION UTILITIES
|
|
91
|
+
// ============================================================================
|
|
92
|
+
|
|
93
|
+
// ============================================================================
|
|
94
|
+
// VALIDATION UTILITIES
|
|
95
|
+
// ============================================================================
|
|
96
|
+
|
|
97
|
+
// ============================================================================
|
|
98
|
+
// ADVANCED UTILITIES
|
|
99
|
+
// ============================================================================
|
|
100
|
+
|
|
101
|
+
// Manager utilities
|
|
102
|
+
|
|
103
|
+
// Export Node 22+ enhanced features for server-side use
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Server analytics manager with static provider registry
|
|
3
|
+
* Server analytics manager with static provider registry
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { SegmentServerProvider } from '@integrations/segment/analytics-provider/server';
|
|
7
|
+
import { VercelServerProvider } from '@integrations/vercel/analytics-provider/server';
|
|
8
|
+
|
|
9
|
+
import { ConsoleProvider } from '../providers/console/server';
|
|
10
|
+
import { HttpServerProvider } from '../providers/http/server';
|
|
11
|
+
import { createAnalyticsManager } from '../shared/utils/manager';
|
|
12
|
+
|
|
13
|
+
import type { AnalyticsConfig, AnalyticsManager, ProviderRegistry } from '../shared/types/types';
|
|
14
|
+
|
|
15
|
+
// Static provider registry for server environments
|
|
16
|
+
const SERVER_PROVIDERS: ProviderRegistry = {
|
|
17
|
+
console: config => new ConsoleProvider(config),
|
|
18
|
+
http: config => new HttpServerProvider(config),
|
|
19
|
+
segment: config => new SegmentServerProvider(config),
|
|
20
|
+
vercel: config => new VercelServerProvider(config),
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Create and initialize a server analytics instance
|
|
25
|
+
* This is the primary way to create analytics for server-side applications
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* const analytics = await createServerAnalytics({
|
|
30
|
+
* providers: {
|
|
31
|
+
* segment: { writeKey: process.env.SEGMENT_KEY! },
|
|
32
|
+
* },
|
|
33
|
+
* });
|
|
34
|
+
* await analytics.page('/admin', { title: 'Admin Dashboard' });
|
|
35
|
+
* ```
|
|
36
|
+
* @param config - Analytics configuration including providers and settings
|
|
37
|
+
* @returns Promise resolving to initialized analytics manager
|
|
38
|
+
*/
|
|
39
|
+
export async function createServerAnalytics(config: AnalyticsConfig): Promise<AnalyticsManager> {
|
|
40
|
+
const manager = createAnalyticsManager(config, SERVER_PROVIDERS);
|
|
41
|
+
await manager.initialize();
|
|
42
|
+
return manager;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Create a server analytics instance without initializing
|
|
47
|
+
* Useful when you need to control initialization timing
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```typescript
|
|
51
|
+
* const analytics = createServerAnalyticsUninitialized(config);
|
|
52
|
+
* if (shouldEmit) {
|
|
53
|
+
* await analytics.initialize();
|
|
54
|
+
* await analytics.track('CRON Completed');
|
|
55
|
+
* }
|
|
56
|
+
* ```
|
|
57
|
+
* @param config - Analytics configuration including providers and settings
|
|
58
|
+
* @returns Uninitialized analytics manager instance
|
|
59
|
+
*/
|
|
60
|
+
export function createServerAnalyticsUninitialized(config: AnalyticsConfig): AnalyticsManager {
|
|
61
|
+
return createAnalyticsManager(config, SERVER_PROVIDERS);
|
|
62
|
+
}
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Server-side Next.js analytics exports
|
|
3
|
+
* Server-side Next.js analytics exports
|
|
4
|
+
* Complete Next.js 15 integration for server components, API routes, and middleware
|
|
5
|
+
*
|
|
6
|
+
* @example
|
|
7
|
+
* ```typescript
|
|
8
|
+
* import {
|
|
9
|
+
* createNextJSServerAnalytics,
|
|
10
|
+
* trackServerEvent,
|
|
11
|
+
* getServerFeatureFlag,
|
|
12
|
+
* createAnalyticsMiddleware
|
|
13
|
+
* } from '@od-oneapp/analytics/server/next';
|
|
14
|
+
*
|
|
15
|
+
* // Server component
|
|
16
|
+
* export default async function Page() {
|
|
17
|
+
* await trackServerEvent('Page Viewed', { path: '/home' });
|
|
18
|
+
* return <div>Page content</div>;
|
|
19
|
+
* }
|
|
20
|
+
*
|
|
21
|
+
* // Middleware
|
|
22
|
+
* export const middleware = createAnalyticsMiddleware({
|
|
23
|
+
* providers: { segment: { writeKey: process.env.SEGMENT_WRITE_KEY } }
|
|
24
|
+
* });
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
// ============================================================================
|
|
29
|
+
// CORE SERVER ANALYTICS (re-export everything from server)
|
|
30
|
+
// ============================================================================
|
|
31
|
+
|
|
32
|
+
// Re-export everything from server for convenience
|
|
33
|
+
export * from '.';
|
|
34
|
+
|
|
35
|
+
// ============================================================================
|
|
36
|
+
// REACT SERVER COMPONENTS
|
|
37
|
+
// ============================================================================
|
|
38
|
+
|
|
39
|
+
export {
|
|
40
|
+
// Context management for RSCs
|
|
41
|
+
ServerAnalyticsProvider,
|
|
42
|
+
getServerBootstrapData,
|
|
43
|
+
identifyServerUser,
|
|
44
|
+
identifyUserAction,
|
|
45
|
+
// Server Actions support
|
|
46
|
+
trackEventAction,
|
|
47
|
+
// Server component tracking functions
|
|
48
|
+
trackServerEvent,
|
|
49
|
+
trackServerPageView,
|
|
50
|
+
withServerPageTracking,
|
|
51
|
+
} from '../next/rsc';
|
|
52
|
+
|
|
53
|
+
// ============================================================================
|
|
54
|
+
// NEXT.JS SERVER ANALYTICS MANAGER
|
|
55
|
+
// ============================================================================
|
|
56
|
+
|
|
57
|
+
export {
|
|
58
|
+
// Next.js server analytics manager
|
|
59
|
+
NextJSServerAnalyticsManager,
|
|
60
|
+
createNextJSServerAnalytics,
|
|
61
|
+
createNextJSServerAnalyticsWithBootstrap,
|
|
62
|
+
} from '../next/server';
|
|
63
|
+
|
|
64
|
+
export type { NextJSServerAnalyticsConfig } from '../next/server';
|
|
65
|
+
|
|
66
|
+
// ============================================================================
|
|
67
|
+
// POSTHOG SERVER-SIDE BOOTSTRAP
|
|
68
|
+
// ============================================================================
|
|
69
|
+
|
|
70
|
+
export { getPostHogBootstrapDataOnServer } from '../next/server';
|
|
71
|
+
|
|
72
|
+
// Additional PostHog utilities
|
|
73
|
+
export {
|
|
74
|
+
// PostHog Next.js utilities
|
|
75
|
+
createPostHogConfig,
|
|
76
|
+
createPostHogMiddleware,
|
|
77
|
+
createPostHogServerClient,
|
|
78
|
+
createPostHogSuspenseData,
|
|
79
|
+
getCompleteBootstrapData,
|
|
80
|
+
getOrGenerateDistinctId,
|
|
81
|
+
getPostHogBootstrapData,
|
|
82
|
+
} from '../shared/utils/posthog-next-utils';
|
|
83
|
+
|
|
84
|
+
// ============================================================================
|
|
85
|
+
// MIDDLEWARE INTEGRATION
|
|
86
|
+
// ============================================================================
|
|
87
|
+
|
|
88
|
+
export {
|
|
89
|
+
// Analytics middleware for edge runtime
|
|
90
|
+
createAnalyticsMiddleware,
|
|
91
|
+
} from '../next/middleware';
|
|
92
|
+
|
|
93
|
+
export type {
|
|
94
|
+
// Middleware types
|
|
95
|
+
AnalyticsMiddlewareConfig,
|
|
96
|
+
} from '../next/middleware';
|
|
97
|
+
|
|
98
|
+
// ============================================================================
|
|
99
|
+
// NEXT.JS TYPES
|
|
100
|
+
// ============================================================================
|
|
101
|
+
|
|
102
|
+
export type {
|
|
103
|
+
AddToCartEvent,
|
|
104
|
+
// Next.js specific types that actually exist
|
|
105
|
+
AnalyticsEvent,
|
|
106
|
+
AnalyticsMiddlewareContext,
|
|
107
|
+
AnalyticsProviderProps,
|
|
108
|
+
CheckoutEvent,
|
|
109
|
+
EventName,
|
|
110
|
+
EventProperties,
|
|
111
|
+
FormErrorEvent,
|
|
112
|
+
FormStartEvent,
|
|
113
|
+
FormSubmitEvent,
|
|
114
|
+
PageViewEvent,
|
|
115
|
+
ProductViewEvent,
|
|
116
|
+
PurchaseEvent,
|
|
117
|
+
TrackedComponentProps,
|
|
118
|
+
TypedTrackFunction,
|
|
119
|
+
UseAnalyticsReturn,
|
|
120
|
+
} from '../next/types';
|
|
121
|
+
|
|
122
|
+
// ============================================================================
|
|
123
|
+
// USAGE EXAMPLES & PATTERNS
|
|
124
|
+
// ============================================================================
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Example usage patterns for server-side Next.js analytics
|
|
128
|
+
*
|
|
129
|
+
* @example Server component tracking
|
|
130
|
+
* ```typescript
|
|
131
|
+
* import { trackServerEvent, getServerFeatureFlag } from '@od-oneapp/analytics/server/next';
|
|
132
|
+
* import { cookies } from 'next/headers';
|
|
133
|
+
*
|
|
134
|
+
* export default async function HomePage() {
|
|
135
|
+
* // Track page view
|
|
136
|
+
* await trackServerEvent('Page Viewed', {
|
|
137
|
+
* path: '/home',
|
|
138
|
+
* title: 'Home Page'
|
|
139
|
+
* });
|
|
140
|
+
*
|
|
141
|
+
* // Check feature flag
|
|
142
|
+
* const showBeta = await getServerFeatureFlag('beta-feature', cookies());
|
|
143
|
+
*
|
|
144
|
+
* return (
|
|
145
|
+
* <div>
|
|
146
|
+
* <h1>Welcome</h1>
|
|
147
|
+
* {showBeta && <BetaFeature />}
|
|
148
|
+
* </div>
|
|
149
|
+
* );
|
|
150
|
+
* }
|
|
151
|
+
* ```
|
|
152
|
+
*
|
|
153
|
+
* @example API route tracking
|
|
154
|
+
* ```typescript
|
|
155
|
+
* import { createServerAnalytics, track } from '@od-oneapp/analytics/server/next';
|
|
156
|
+
*
|
|
157
|
+
* const analytics = await createServerAnalytics({
|
|
158
|
+
* providers: {
|
|
159
|
+
* segment: { writeKey: process.env.SEGMENT_WRITE_KEY }
|
|
160
|
+
* }
|
|
161
|
+
* });
|
|
162
|
+
*
|
|
163
|
+
* export async function POST(request: Request) {
|
|
164
|
+
* await analytics.emit(track('API Called', {
|
|
165
|
+
* endpoint: '/api/users',
|
|
166
|
+
* method: 'POST'
|
|
167
|
+
* }));
|
|
168
|
+
*
|
|
169
|
+
* // Handle request...
|
|
170
|
+
* }
|
|
171
|
+
* ```
|
|
172
|
+
*
|
|
173
|
+
* @example Server Actions
|
|
174
|
+
* ```typescript
|
|
175
|
+
* 'use server';
|
|
176
|
+
* import { trackServerAction } from '@od-oneapp/analytics/server/next';
|
|
177
|
+
*
|
|
178
|
+
* export async function submitForm(formData: FormData) {
|
|
179
|
+
* await trackServerAction('Form Submitted', {
|
|
180
|
+
* form_id: 'contact',
|
|
181
|
+
* email: formData.get('email')
|
|
182
|
+
* });
|
|
183
|
+
*
|
|
184
|
+
* // Process form...
|
|
185
|
+
* }
|
|
186
|
+
* ```
|
|
187
|
+
*
|
|
188
|
+
* @example Middleware setup
|
|
189
|
+
* ```typescript
|
|
190
|
+
* // middleware.ts
|
|
191
|
+
* import { createAnalyticsMiddleware } from '@od-oneapp/analytics/server/next';
|
|
192
|
+
*
|
|
193
|
+
* export const middleware = createAnalyticsMiddleware({
|
|
194
|
+
* providers: {
|
|
195
|
+
* segment: { writeKey: process.env.SEGMENT_WRITE_KEY }
|
|
196
|
+
* },
|
|
197
|
+
* matchers: ['/api/*', '/app/*'],
|
|
198
|
+
* exclude: ['/api/health'],
|
|
199
|
+
* extractUserId: (request) => request.headers.get('x-user-id'),
|
|
200
|
+
* extractContext: (request) => ({
|
|
201
|
+
* ip: request.ip,
|
|
202
|
+
* country: request.geo?.country
|
|
203
|
+
* })
|
|
204
|
+
* });
|
|
205
|
+
*
|
|
206
|
+
* export const config = {
|
|
207
|
+
* matcher: ['/((?!_next/static|favicon.ico).*)']
|
|
208
|
+
* };
|
|
209
|
+
* ```
|
|
210
|
+
*/
|