@traffical/react 0.1.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.
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Traffical React Context
3
+ *
4
+ * Provides the Traffical client instance to React components.
5
+ * Uses the browser-optimized JS Client for full feature support.
6
+ */
7
+ import type { TrafficalClient, TrafficalPlugin } from "@traffical/js-client";
8
+ import type { ConfigBundle, Context } from "@traffical/core";
9
+ /**
10
+ * Configuration for the Traffical provider.
11
+ */
12
+ export interface TrafficalProviderConfig {
13
+ /** Organization ID */
14
+ orgId: string;
15
+ /** Project ID */
16
+ projectId: string;
17
+ /** Environment (e.g., "production", "staging") */
18
+ env: string;
19
+ /** API key for authentication */
20
+ apiKey: string;
21
+ /** Base URL for the control plane API (optional) */
22
+ baseUrl?: string;
23
+ /** Local config bundle for offline fallback */
24
+ localConfig?: ConfigBundle;
25
+ /** Refresh interval in milliseconds (default: 60000) */
26
+ refreshIntervalMs?: number;
27
+ /**
28
+ * Function to get the unit key value.
29
+ * If not provided, the SDK will use automatic stable ID generation.
30
+ */
31
+ unitKeyFn?: () => string;
32
+ /** Function to get additional context (optional) */
33
+ contextFn?: () => Context;
34
+ /**
35
+ * Whether to automatically track decision events (default: true).
36
+ * When enabled, every call to decide() automatically sends a DecisionEvent
37
+ * to the control plane, enabling intent-to-treat analysis.
38
+ */
39
+ trackDecisions?: boolean;
40
+ /**
41
+ * Decision deduplication TTL in milliseconds (default: 1 hour).
42
+ * Same user+assignment combination won't be tracked again within this window.
43
+ */
44
+ decisionDeduplicationTtlMs?: number;
45
+ /**
46
+ * Exposure deduplication session TTL in milliseconds (default: 30 minutes).
47
+ * Same user seeing same variant won't trigger multiple exposure events.
48
+ */
49
+ exposureSessionTtlMs?: number;
50
+ /**
51
+ * Plugins to register with the client.
52
+ * The DecisionTrackingPlugin is included by default unless trackDecisions is false.
53
+ */
54
+ plugins?: TrafficalPlugin[];
55
+ /** Max events before auto-flush (default: 10) */
56
+ eventBatchSize?: number;
57
+ /** Auto-flush interval in ms (default: 30000) */
58
+ eventFlushIntervalMs?: number;
59
+ /** Initial params from SSR (optional) */
60
+ initialParams?: Record<string, unknown>;
61
+ }
62
+ /**
63
+ * Internal context value.
64
+ */
65
+ export interface TrafficalContextValue {
66
+ /** The Traffical client instance */
67
+ client: TrafficalClient | null;
68
+ /** Whether the client is ready (config loaded) */
69
+ ready: boolean;
70
+ /** Any initialization error */
71
+ error: Error | null;
72
+ /** Function to get the unit key */
73
+ getUnitKey: () => string;
74
+ /** Function to get the full context */
75
+ getContext: () => Context;
76
+ /** Initial params from SSR */
77
+ initialParams?: Record<string, unknown>;
78
+ /** Local config bundle for synchronous resolution during initial render */
79
+ localConfig?: ConfigBundle;
80
+ }
81
+ /**
82
+ * React context for Traffical.
83
+ */
84
+ export declare const TrafficalContext: import("react").Context<TrafficalContextValue | null>;
85
+ /**
86
+ * Hook to access the Traffical context.
87
+ * Throws if used outside of TrafficalProvider.
88
+ */
89
+ export declare function useTrafficalContext(): TrafficalContextValue;
90
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC7E,OAAO,KAAK,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,uBAAuB;IAKtC,sBAAsB;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,iBAAiB;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,GAAG,EAAE,MAAM,CAAC;IACZ,iCAAiC;IACjC,MAAM,EAAE,MAAM,CAAC;IAMf,oDAAoD;IACpD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,+CAA+C;IAC/C,WAAW,CAAC,EAAE,YAAY,CAAC;IAC3B,wDAAwD;IACxD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAM3B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,MAAM,CAAC;IACzB,oDAAoD;IACpD,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC;IAM1B;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,0BAA0B,CAAC,EAAE,MAAM,CAAC;IAMpC;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAM9B;;;OAGG;IACH,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAM5B,iDAAiD;IACjD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,iDAAiD;IACjD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAM9B,yCAAyC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,oCAAoC;IACpC,MAAM,EAAE,eAAe,GAAG,IAAI,CAAC;IAC/B,kDAAkD;IAClD,KAAK,EAAE,OAAO,CAAC;IACf,+BAA+B;IAC/B,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,mCAAmC;IACnC,UAAU,EAAE,MAAM,MAAM,CAAC;IACzB,uCAAuC;IACvC,UAAU,EAAE,MAAM,OAAO,CAAC;IAC1B,8BAA8B;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,2EAA2E;IAC3E,WAAW,CAAC,EAAE,YAAY,CAAC;CAC5B;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,uDAE5B,CAAC;AAEF;;;GAGG;AACH,wBAAgB,mBAAmB,IAAI,qBAAqB,CAQ3D"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Traffical React Context
3
+ *
4
+ * Provides the Traffical client instance to React components.
5
+ * Uses the browser-optimized JS Client for full feature support.
6
+ */
7
+ import { createContext, useContext } from "react";
8
+ /**
9
+ * React context for Traffical.
10
+ */
11
+ export const TrafficalContext = createContext(null);
12
+ /**
13
+ * Hook to access the Traffical context.
14
+ * Throws if used outside of TrafficalProvider.
15
+ */
16
+ export function useTrafficalContext() {
17
+ const context = useContext(TrafficalContext);
18
+ if (!context) {
19
+ throw new Error("useTrafficalContext must be used within a TrafficalProvider");
20
+ }
21
+ return context;
22
+ }
23
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAqHlD;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,aAAa,CAC3C,IAAI,CACL,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,mBAAmB;IACjC,MAAM,OAAO,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC;IAC7C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACb,6DAA6D,CAC9D,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,273 @@
1
+ /**
2
+ * Traffical React Hooks
3
+ *
4
+ * React hooks for parameter resolution and decision tracking.
5
+ * Uses the browser-optimized JS Client for full feature support.
6
+ */
7
+ import type { ParameterValue, DecisionResult, Context } from "@traffical/core";
8
+ import type { TrafficalPlugin } from "@traffical/js-client";
9
+ /**
10
+ * Options for the useTraffical hook.
11
+ */
12
+ export interface UseTrafficalOptions<T> {
13
+ /** Default parameter values */
14
+ defaults: T;
15
+ /** Additional context (optional) */
16
+ context?: Context;
17
+ /**
18
+ * Tracking mode (default: "full")
19
+ * - "full": Track decision + exposure (default, recommended for UI)
20
+ * - "decision": Track decision only, manual exposure control
21
+ * - "none": No tracking (SSR, internal logic, tests)
22
+ */
23
+ tracking?: "full" | "decision" | "none";
24
+ }
25
+ /**
26
+ * Options for the bound track function returned by useTraffical.
27
+ */
28
+ export interface BoundTrackOptions {
29
+ /** Additional event properties */
30
+ properties?: Record<string, unknown>;
31
+ }
32
+ /**
33
+ * @deprecated Use BoundTrackOptions instead.
34
+ */
35
+ export interface BoundTrackRewardOptions {
36
+ /** The reward value (e.g., revenue amount, conversion count) */
37
+ reward: number;
38
+ /** Type of reward (e.g., "revenue", "conversion", "engagement") */
39
+ rewardType?: string;
40
+ /** Multiple reward values keyed by type */
41
+ rewards?: Record<string, number>;
42
+ }
43
+ /**
44
+ * Return value from the useTraffical hook.
45
+ */
46
+ export interface UseTrafficalResult<T> {
47
+ /** Resolved parameter values */
48
+ params: T;
49
+ /** The full decision result (null when tracking="none") */
50
+ decision: DecisionResult | null;
51
+ /** Whether the client is ready (config loaded) */
52
+ ready: boolean;
53
+ /** Any error that occurred */
54
+ error: Error | null;
55
+ /** Function to manually track exposure (no-op when tracking="none") */
56
+ trackExposure: () => void;
57
+ /**
58
+ * Track a user event. The decisionId is automatically bound.
59
+ * No-op if tracking="none" or no decision is available.
60
+ *
61
+ * @example
62
+ * track('purchase', { value: 99.99, orderId: 'ord_123' });
63
+ * track('add_to_cart', { itemId: 'sku_456' });
64
+ */
65
+ track: (event: string, properties?: Record<string, unknown>) => void;
66
+ /**
67
+ * @deprecated Use track() instead.
68
+ * Track a reward for this decision. The decisionId is automatically bound.
69
+ * No-op if tracking="none" or no decision is available.
70
+ */
71
+ trackReward: (options: BoundTrackRewardOptions) => void;
72
+ }
73
+ /**
74
+ * Primary hook for Traffical parameter resolution and decision tracking.
75
+ *
76
+ * On first render, returns defaults immediately (no blocking).
77
+ * When the config bundle loads, recomputes and returns resolved values.
78
+ *
79
+ * @example
80
+ * ```tsx
81
+ * // Full tracking (default) - decision + exposure events
82
+ * const { params, decision, ready } = useTraffical({
83
+ * defaults: { "checkout.ctaText": "Buy Now" },
84
+ * });
85
+ *
86
+ * // Decision tracking only - manual exposure control
87
+ * const { params, decision, trackExposure } = useTraffical({
88
+ * defaults: { "checkout.ctaText": "Buy Now" },
89
+ * tracking: "decision",
90
+ * });
91
+ *
92
+ * // No tracking - for SSR, tests, or internal logic
93
+ * const { params, ready } = useTraffical({
94
+ * defaults: { "ui.hero.title": "Welcome" },
95
+ * tracking: "none",
96
+ * });
97
+ * ```
98
+ */
99
+ export declare function useTraffical<T extends Record<string, ParameterValue>>(options: UseTrafficalOptions<T>): UseTrafficalResult<T>;
100
+ /**
101
+ * Options for useTrafficalParams hook.
102
+ * @deprecated Use UseTrafficalOptions instead.
103
+ */
104
+ export interface UseTrafficalParamsOptions<T extends Record<string, ParameterValue>> {
105
+ /** Default values for parameters */
106
+ defaults: T;
107
+ /** Additional context to merge (optional) */
108
+ context?: Context;
109
+ }
110
+ /**
111
+ * Return value from useTrafficalParams hook.
112
+ * @deprecated Use UseTrafficalResult instead.
113
+ */
114
+ export interface UseTrafficalParamsResult<T> {
115
+ /** Resolved parameter values */
116
+ params: T;
117
+ /** Whether the client is ready (config loaded) */
118
+ ready: boolean;
119
+ /** Any error that occurred */
120
+ error: Error | null;
121
+ }
122
+ /**
123
+ * Hook to get resolved parameter values.
124
+ *
125
+ * @deprecated Use `useTraffical({ tracking: "none" })` instead.
126
+ *
127
+ * @example
128
+ * ```tsx
129
+ * // Old way (deprecated)
130
+ * const { params, ready } = useTrafficalParams({ defaults: { ... } });
131
+ *
132
+ * // New way
133
+ * const { params, ready } = useTraffical({ defaults: { ... }, tracking: "none" });
134
+ * ```
135
+ */
136
+ export declare function useTrafficalParams<T extends Record<string, ParameterValue>>(options: UseTrafficalParamsOptions<T>): UseTrafficalParamsResult<T>;
137
+ /**
138
+ * Options for useTrafficalDecision hook.
139
+ * @deprecated Use UseTrafficalOptions instead.
140
+ */
141
+ export interface UseTrafficalDecisionOptions<T extends Record<string, ParameterValue>> {
142
+ /** Default values for parameters */
143
+ defaults: T;
144
+ /** Additional context to merge (optional) */
145
+ context?: Context;
146
+ /**
147
+ * Whether to automatically track exposure (default: true).
148
+ * Set to false if you want to manually control when exposure is tracked
149
+ * (e.g., when an element scrolls into view).
150
+ *
151
+ * Note: Decision tracking happens automatically via DecisionTrackingPlugin
152
+ * and is separate from exposure tracking.
153
+ */
154
+ trackExposure?: boolean;
155
+ }
156
+ /**
157
+ * Return value from useTrafficalDecision hook.
158
+ * @deprecated Use UseTrafficalResult instead.
159
+ */
160
+ export interface UseTrafficalDecisionResult<T> {
161
+ /** Resolved parameter values */
162
+ params: T;
163
+ /** The full decision result (for tracking) */
164
+ decision: DecisionResult | null;
165
+ /** Whether the client is ready (config loaded) */
166
+ ready: boolean;
167
+ /** Any error that occurred */
168
+ error: Error | null;
169
+ /**
170
+ * Function to manually track exposure.
171
+ * Note: This is synchronous - events are batched internally.
172
+ */
173
+ trackExposure: () => void;
174
+ }
175
+ /**
176
+ * Hook to get a decision with full metadata for tracking.
177
+ *
178
+ * @deprecated Use `useTraffical()` instead.
179
+ *
180
+ * @example
181
+ * ```tsx
182
+ * // Old way (deprecated)
183
+ * const { params, decision } = useTrafficalDecision({ defaults: { ... } });
184
+ *
185
+ * // New way
186
+ * const { params, decision } = useTraffical({ defaults: { ... } });
187
+ *
188
+ * // Old way with manual exposure (deprecated)
189
+ * const { params, trackExposure } = useTrafficalDecision({ defaults: { ... }, trackExposure: false });
190
+ *
191
+ * // New way with manual exposure
192
+ * const { params, trackExposure } = useTraffical({ defaults: { ... }, tracking: "decision" });
193
+ * ```
194
+ */
195
+ export declare function useTrafficalDecision<T extends Record<string, ParameterValue>>(options: UseTrafficalDecisionOptions<T>): UseTrafficalDecisionResult<T>;
196
+ /**
197
+ * Hook to track user events.
198
+ *
199
+ * @example
200
+ * ```tsx
201
+ * const track = useTrafficalTrack();
202
+ *
203
+ * const handlePurchase = (amount: number) => {
204
+ * track('purchase', { value: amount, orderId: 'ord_123' });
205
+ * };
206
+ * ```
207
+ */
208
+ export declare function useTrafficalTrack(): (event: string, properties?: Record<string, unknown>, options?: {
209
+ decisionId?: string;
210
+ }) => void;
211
+ /**
212
+ * @deprecated Use useTrafficalTrack() instead.
213
+ *
214
+ * Hook to track a reward.
215
+ *
216
+ * @example
217
+ * ```tsx
218
+ * const trackReward = useTrafficalReward();
219
+ *
220
+ * const handlePurchase = (amount: number) => {
221
+ * trackReward({
222
+ * decisionId: decision.decisionId,
223
+ * reward: amount,
224
+ * rewardType: "revenue",
225
+ * });
226
+ * };
227
+ * ```
228
+ */
229
+ export declare function useTrafficalReward(): (options: {
230
+ decisionId: string;
231
+ reward: number;
232
+ rewardType?: string;
233
+ rewards?: Record<string, number>;
234
+ }) => void;
235
+ /**
236
+ * Hook to access a registered plugin by name.
237
+ *
238
+ * @example
239
+ * ```tsx
240
+ * import { createDOMBindingPlugin, DOMBindingPlugin } from '@traffical/js-client';
241
+ *
242
+ * // In your provider config:
243
+ * plugins: [createDOMBindingPlugin()]
244
+ *
245
+ * // In a component:
246
+ * const domPlugin = useTrafficalPlugin<DOMBindingPlugin>('dom-binding');
247
+ *
248
+ * // Re-apply bindings after dynamic content changes
249
+ * useEffect(() => {
250
+ * domPlugin?.applyBindings();
251
+ * }, [contentLoaded, domPlugin]);
252
+ * ```
253
+ */
254
+ export declare function useTrafficalPlugin<T extends TrafficalPlugin = TrafficalPlugin>(name: string): T | undefined;
255
+ /**
256
+ * Hook to access the Traffical client directly.
257
+ *
258
+ * @example
259
+ * ```tsx
260
+ * const { client, ready } = useTrafficalClient();
261
+ *
262
+ * if (ready && client) {
263
+ * const version = client.getConfigVersion();
264
+ * const stableId = client.getStableId();
265
+ * }
266
+ * ```
267
+ */
268
+ export declare function useTrafficalClient(): {
269
+ client: import("@traffical/js-client").TrafficalClient | null;
270
+ ready: boolean;
271
+ error: Error | null;
272
+ };
273
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"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"}