swetrix 3.7.1 → 4.0.0
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/dist/esnext/Lib.d.ts +148 -0
- package/dist/esnext/Lib.js +269 -2
- package/dist/esnext/Lib.js.map +1 -1
- package/dist/esnext/index.d.ts +146 -2
- package/dist/esnext/index.js +176 -0
- package/dist/esnext/index.js.map +1 -1
- package/dist/swetrix.cjs.js +585 -205
- package/dist/swetrix.cjs.js.map +1 -1
- package/dist/swetrix.es5.js +579 -207
- package/dist/swetrix.es5.js.map +1 -1
- package/dist/swetrix.js +1 -1
- package/dist/swetrix.js.map +1 -1
- package/package.json +2 -1
- package/rollup.config.mjs +5 -0
- package/src/Lib.ts +353 -4
- package/src/index.ts +202 -0
- package/tests/experiments.test.ts +330 -0
- package/tsconfig.esnext.json +3 -6
- package/tsconfig.json +4 -8
package/dist/esnext/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Lib, LibOptions, TrackEventOptions, PageViewsOptions, ErrorOptions, PageActions, ErrorActions, IErrorEventPayload, IPageViewPayload } from './Lib.js';
|
|
1
|
+
import { Lib, LibOptions, TrackEventOptions, PageViewsOptions, ErrorOptions, PageActions, ErrorActions, IErrorEventPayload, IPageViewPayload, FeatureFlagsOptions, ExperimentOptions } from './Lib.js';
|
|
2
2
|
export declare let LIB_INSTANCE: Lib | null;
|
|
3
3
|
/**
|
|
4
4
|
* Initialise the tracking library instance (other methods won't work if the library is not initialised).
|
|
@@ -54,4 +54,148 @@ export interface IPageviewOptions {
|
|
|
54
54
|
unique?: boolean;
|
|
55
55
|
}
|
|
56
56
|
export declare function pageview(options: IPageviewOptions): void;
|
|
57
|
-
|
|
57
|
+
/**
|
|
58
|
+
* Fetches all feature flags for the project.
|
|
59
|
+
* Results are cached for 5 minutes by default.
|
|
60
|
+
*
|
|
61
|
+
* @param options - Options for evaluating feature flags (visitorId, attributes).
|
|
62
|
+
* @param forceRefresh - If true, bypasses the cache and fetches fresh flags.
|
|
63
|
+
* @returns A promise that resolves to a record of flag keys to boolean values.
|
|
64
|
+
*
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* const flags = await getFeatureFlags({
|
|
68
|
+
* visitorId: 'user-123',
|
|
69
|
+
* attributes: { cc: 'US', dv: 'desktop' }
|
|
70
|
+
* })
|
|
71
|
+
*
|
|
72
|
+
* if (flags['new-checkout']) {
|
|
73
|
+
* // Show new checkout flow
|
|
74
|
+
* }
|
|
75
|
+
* ```
|
|
76
|
+
*/
|
|
77
|
+
export declare function getFeatureFlags(options?: FeatureFlagsOptions, forceRefresh?: boolean): Promise<Record<string, boolean>>;
|
|
78
|
+
/**
|
|
79
|
+
* Gets the value of a single feature flag.
|
|
80
|
+
*
|
|
81
|
+
* @param key - The feature flag key.
|
|
82
|
+
* @param options - Options for evaluating the feature flag (visitorId, attributes).
|
|
83
|
+
* @param defaultValue - Default value to return if the flag is not found. Defaults to false.
|
|
84
|
+
* @returns A promise that resolves to the boolean value of the flag.
|
|
85
|
+
*
|
|
86
|
+
* @example
|
|
87
|
+
* ```typescript
|
|
88
|
+
* const isEnabled = await getFeatureFlag('dark-mode', { visitorId: 'user-123' })
|
|
89
|
+
*
|
|
90
|
+
* if (isEnabled) {
|
|
91
|
+
* // Enable dark mode
|
|
92
|
+
* }
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
export declare function getFeatureFlag(key: string, options?: FeatureFlagsOptions, defaultValue?: boolean): Promise<boolean>;
|
|
96
|
+
/**
|
|
97
|
+
* Clears the cached feature flags, forcing a fresh fetch on the next call.
|
|
98
|
+
* Useful when you know the user's context has changed significantly.
|
|
99
|
+
*/
|
|
100
|
+
export declare function clearFeatureFlagsCache(): void;
|
|
101
|
+
/**
|
|
102
|
+
* Fetches all A/B test experiments for the project.
|
|
103
|
+
* Results are cached for 5 minutes by default (shared cache with feature flags).
|
|
104
|
+
*
|
|
105
|
+
* @param options - Options for evaluating experiments.
|
|
106
|
+
* @param forceRefresh - If true, bypasses the cache and fetches fresh data.
|
|
107
|
+
* @returns A promise that resolves to a record of experiment IDs to variant keys.
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```typescript
|
|
111
|
+
* const experiments = await getExperiments()
|
|
112
|
+
* // experiments = { 'exp-123': 'variant-a', 'exp-456': 'control' }
|
|
113
|
+
*
|
|
114
|
+
* // Use the assigned variant
|
|
115
|
+
* const checkoutVariant = experiments['checkout-experiment-id']
|
|
116
|
+
* if (checkoutVariant === 'new-checkout') {
|
|
117
|
+
* showNewCheckout()
|
|
118
|
+
* } else {
|
|
119
|
+
* showOriginalCheckout()
|
|
120
|
+
* }
|
|
121
|
+
* ```
|
|
122
|
+
*/
|
|
123
|
+
export declare function getExperiments(options?: ExperimentOptions, forceRefresh?: boolean): Promise<Record<string, string>>;
|
|
124
|
+
/**
|
|
125
|
+
* Gets the variant key for a specific A/B test experiment.
|
|
126
|
+
*
|
|
127
|
+
* @param experimentId - The experiment ID.
|
|
128
|
+
* @param options - Options for evaluating the experiment.
|
|
129
|
+
* @param defaultVariant - Default variant key to return if the experiment is not found. Defaults to null.
|
|
130
|
+
* @returns A promise that resolves to the variant key assigned to this user, or defaultVariant if not found.
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* ```typescript
|
|
134
|
+
* const variant = await getExperiment('checkout-redesign-experiment-id')
|
|
135
|
+
*
|
|
136
|
+
* if (variant === 'new-checkout') {
|
|
137
|
+
* // Show new checkout flow
|
|
138
|
+
* showNewCheckout()
|
|
139
|
+
* } else if (variant === 'control') {
|
|
140
|
+
* // Show original checkout (control group)
|
|
141
|
+
* showOriginalCheckout()
|
|
142
|
+
* } else {
|
|
143
|
+
* // Experiment not running or user not included
|
|
144
|
+
* showOriginalCheckout()
|
|
145
|
+
* }
|
|
146
|
+
* ```
|
|
147
|
+
*/
|
|
148
|
+
export declare function getExperiment(experimentId: string, options?: ExperimentOptions, defaultVariant?: string | null): Promise<string | null>;
|
|
149
|
+
/**
|
|
150
|
+
* Clears the cached experiments, forcing a fresh fetch on the next call.
|
|
151
|
+
* This is an alias for clearFeatureFlagsCache since experiments and flags share the same cache.
|
|
152
|
+
*/
|
|
153
|
+
export declare function clearExperimentsCache(): void;
|
|
154
|
+
/**
|
|
155
|
+
* Gets the anonymous profile ID for the current visitor.
|
|
156
|
+
* If profileId was set via init options, returns that.
|
|
157
|
+
* Otherwise, requests server to generate one from IP/UA hash.
|
|
158
|
+
*
|
|
159
|
+
* This ID can be used for revenue attribution with payment providers like Paddle.
|
|
160
|
+
*
|
|
161
|
+
* @returns A promise that resolves to the profile ID string, or null on error.
|
|
162
|
+
*
|
|
163
|
+
* @example
|
|
164
|
+
* ```typescript
|
|
165
|
+
* const profileId = await getProfileId()
|
|
166
|
+
*
|
|
167
|
+
* // Pass to Paddle Checkout for revenue attribution
|
|
168
|
+
* Paddle.Checkout.open({
|
|
169
|
+
* items: [{ priceId: 'pri_01234567890', quantity: 1 }],
|
|
170
|
+
* customData: {
|
|
171
|
+
* swetrix_profile_id: profileId,
|
|
172
|
+
* swetrix_session_id: await getSessionId()
|
|
173
|
+
* }
|
|
174
|
+
* })
|
|
175
|
+
* ```
|
|
176
|
+
*/
|
|
177
|
+
export declare function getProfileId(): Promise<string | null>;
|
|
178
|
+
/**
|
|
179
|
+
* Gets the current session ID for the visitor.
|
|
180
|
+
* Session IDs are generated server-side based on IP and user agent.
|
|
181
|
+
*
|
|
182
|
+
* This ID can be used for revenue attribution with payment providers like Paddle.
|
|
183
|
+
*
|
|
184
|
+
* @returns A promise that resolves to the session ID string, or null on error.
|
|
185
|
+
*
|
|
186
|
+
* @example
|
|
187
|
+
* ```typescript
|
|
188
|
+
* const sessionId = await getSessionId()
|
|
189
|
+
*
|
|
190
|
+
* // Pass to Paddle Checkout for revenue attribution
|
|
191
|
+
* Paddle.Checkout.open({
|
|
192
|
+
* items: [{ priceId: 'pri_01234567890', quantity: 1 }],
|
|
193
|
+
* customData: {
|
|
194
|
+
* swetrix_profile_id: await getProfileId(),
|
|
195
|
+
* swetrix_session_id: sessionId
|
|
196
|
+
* }
|
|
197
|
+
* })
|
|
198
|
+
* ```
|
|
199
|
+
*/
|
|
200
|
+
export declare function getSessionId(): Promise<string | null>;
|
|
201
|
+
export { LibOptions, TrackEventOptions, PageViewsOptions, ErrorOptions, PageActions, ErrorActions, IErrorEventPayload, IPageViewPayload, FeatureFlagsOptions, ExperimentOptions, };
|
package/dist/esnext/index.js
CHANGED
|
@@ -93,4 +93,180 @@ export function pageview(options) {
|
|
|
93
93
|
return;
|
|
94
94
|
LIB_INSTANCE.submitPageView(options.payload, Boolean(options.unique), {});
|
|
95
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Fetches all feature flags for the project.
|
|
98
|
+
* Results are cached for 5 minutes by default.
|
|
99
|
+
*
|
|
100
|
+
* @param options - Options for evaluating feature flags (visitorId, attributes).
|
|
101
|
+
* @param forceRefresh - If true, bypasses the cache and fetches fresh flags.
|
|
102
|
+
* @returns A promise that resolves to a record of flag keys to boolean values.
|
|
103
|
+
*
|
|
104
|
+
* @example
|
|
105
|
+
* ```typescript
|
|
106
|
+
* const flags = await getFeatureFlags({
|
|
107
|
+
* visitorId: 'user-123',
|
|
108
|
+
* attributes: { cc: 'US', dv: 'desktop' }
|
|
109
|
+
* })
|
|
110
|
+
*
|
|
111
|
+
* if (flags['new-checkout']) {
|
|
112
|
+
* // Show new checkout flow
|
|
113
|
+
* }
|
|
114
|
+
* ```
|
|
115
|
+
*/
|
|
116
|
+
export async function getFeatureFlags(options, forceRefresh) {
|
|
117
|
+
if (!LIB_INSTANCE)
|
|
118
|
+
return {};
|
|
119
|
+
return LIB_INSTANCE.getFeatureFlags(options, forceRefresh);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Gets the value of a single feature flag.
|
|
123
|
+
*
|
|
124
|
+
* @param key - The feature flag key.
|
|
125
|
+
* @param options - Options for evaluating the feature flag (visitorId, attributes).
|
|
126
|
+
* @param defaultValue - Default value to return if the flag is not found. Defaults to false.
|
|
127
|
+
* @returns A promise that resolves to the boolean value of the flag.
|
|
128
|
+
*
|
|
129
|
+
* @example
|
|
130
|
+
* ```typescript
|
|
131
|
+
* const isEnabled = await getFeatureFlag('dark-mode', { visitorId: 'user-123' })
|
|
132
|
+
*
|
|
133
|
+
* if (isEnabled) {
|
|
134
|
+
* // Enable dark mode
|
|
135
|
+
* }
|
|
136
|
+
* ```
|
|
137
|
+
*/
|
|
138
|
+
export async function getFeatureFlag(key, options, defaultValue = false) {
|
|
139
|
+
if (!LIB_INSTANCE)
|
|
140
|
+
return defaultValue;
|
|
141
|
+
return LIB_INSTANCE.getFeatureFlag(key, options, defaultValue);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Clears the cached feature flags, forcing a fresh fetch on the next call.
|
|
145
|
+
* Useful when you know the user's context has changed significantly.
|
|
146
|
+
*/
|
|
147
|
+
export function clearFeatureFlagsCache() {
|
|
148
|
+
if (!LIB_INSTANCE)
|
|
149
|
+
return;
|
|
150
|
+
LIB_INSTANCE.clearFeatureFlagsCache();
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Fetches all A/B test experiments for the project.
|
|
154
|
+
* Results are cached for 5 minutes by default (shared cache with feature flags).
|
|
155
|
+
*
|
|
156
|
+
* @param options - Options for evaluating experiments.
|
|
157
|
+
* @param forceRefresh - If true, bypasses the cache and fetches fresh data.
|
|
158
|
+
* @returns A promise that resolves to a record of experiment IDs to variant keys.
|
|
159
|
+
*
|
|
160
|
+
* @example
|
|
161
|
+
* ```typescript
|
|
162
|
+
* const experiments = await getExperiments()
|
|
163
|
+
* // experiments = { 'exp-123': 'variant-a', 'exp-456': 'control' }
|
|
164
|
+
*
|
|
165
|
+
* // Use the assigned variant
|
|
166
|
+
* const checkoutVariant = experiments['checkout-experiment-id']
|
|
167
|
+
* if (checkoutVariant === 'new-checkout') {
|
|
168
|
+
* showNewCheckout()
|
|
169
|
+
* } else {
|
|
170
|
+
* showOriginalCheckout()
|
|
171
|
+
* }
|
|
172
|
+
* ```
|
|
173
|
+
*/
|
|
174
|
+
export async function getExperiments(options, forceRefresh) {
|
|
175
|
+
if (!LIB_INSTANCE)
|
|
176
|
+
return {};
|
|
177
|
+
return LIB_INSTANCE.getExperiments(options, forceRefresh);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Gets the variant key for a specific A/B test experiment.
|
|
181
|
+
*
|
|
182
|
+
* @param experimentId - The experiment ID.
|
|
183
|
+
* @param options - Options for evaluating the experiment.
|
|
184
|
+
* @param defaultVariant - Default variant key to return if the experiment is not found. Defaults to null.
|
|
185
|
+
* @returns A promise that resolves to the variant key assigned to this user, or defaultVariant if not found.
|
|
186
|
+
*
|
|
187
|
+
* @example
|
|
188
|
+
* ```typescript
|
|
189
|
+
* const variant = await getExperiment('checkout-redesign-experiment-id')
|
|
190
|
+
*
|
|
191
|
+
* if (variant === 'new-checkout') {
|
|
192
|
+
* // Show new checkout flow
|
|
193
|
+
* showNewCheckout()
|
|
194
|
+
* } else if (variant === 'control') {
|
|
195
|
+
* // Show original checkout (control group)
|
|
196
|
+
* showOriginalCheckout()
|
|
197
|
+
* } else {
|
|
198
|
+
* // Experiment not running or user not included
|
|
199
|
+
* showOriginalCheckout()
|
|
200
|
+
* }
|
|
201
|
+
* ```
|
|
202
|
+
*/
|
|
203
|
+
export async function getExperiment(experimentId, options, defaultVariant = null) {
|
|
204
|
+
if (!LIB_INSTANCE)
|
|
205
|
+
return defaultVariant;
|
|
206
|
+
return LIB_INSTANCE.getExperiment(experimentId, options, defaultVariant);
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Clears the cached experiments, forcing a fresh fetch on the next call.
|
|
210
|
+
* This is an alias for clearFeatureFlagsCache since experiments and flags share the same cache.
|
|
211
|
+
*/
|
|
212
|
+
export function clearExperimentsCache() {
|
|
213
|
+
if (!LIB_INSTANCE)
|
|
214
|
+
return;
|
|
215
|
+
LIB_INSTANCE.clearExperimentsCache();
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Gets the anonymous profile ID for the current visitor.
|
|
219
|
+
* If profileId was set via init options, returns that.
|
|
220
|
+
* Otherwise, requests server to generate one from IP/UA hash.
|
|
221
|
+
*
|
|
222
|
+
* This ID can be used for revenue attribution with payment providers like Paddle.
|
|
223
|
+
*
|
|
224
|
+
* @returns A promise that resolves to the profile ID string, or null on error.
|
|
225
|
+
*
|
|
226
|
+
* @example
|
|
227
|
+
* ```typescript
|
|
228
|
+
* const profileId = await getProfileId()
|
|
229
|
+
*
|
|
230
|
+
* // Pass to Paddle Checkout for revenue attribution
|
|
231
|
+
* Paddle.Checkout.open({
|
|
232
|
+
* items: [{ priceId: 'pri_01234567890', quantity: 1 }],
|
|
233
|
+
* customData: {
|
|
234
|
+
* swetrix_profile_id: profileId,
|
|
235
|
+
* swetrix_session_id: await getSessionId()
|
|
236
|
+
* }
|
|
237
|
+
* })
|
|
238
|
+
* ```
|
|
239
|
+
*/
|
|
240
|
+
export async function getProfileId() {
|
|
241
|
+
if (!LIB_INSTANCE)
|
|
242
|
+
return null;
|
|
243
|
+
return LIB_INSTANCE.getProfileId();
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Gets the current session ID for the visitor.
|
|
247
|
+
* Session IDs are generated server-side based on IP and user agent.
|
|
248
|
+
*
|
|
249
|
+
* This ID can be used for revenue attribution with payment providers like Paddle.
|
|
250
|
+
*
|
|
251
|
+
* @returns A promise that resolves to the session ID string, or null on error.
|
|
252
|
+
*
|
|
253
|
+
* @example
|
|
254
|
+
* ```typescript
|
|
255
|
+
* const sessionId = await getSessionId()
|
|
256
|
+
*
|
|
257
|
+
* // Pass to Paddle Checkout for revenue attribution
|
|
258
|
+
* Paddle.Checkout.open({
|
|
259
|
+
* items: [{ priceId: 'pri_01234567890', quantity: 1 }],
|
|
260
|
+
* customData: {
|
|
261
|
+
* swetrix_profile_id: await getProfileId(),
|
|
262
|
+
* swetrix_session_id: sessionId
|
|
263
|
+
* }
|
|
264
|
+
* })
|
|
265
|
+
* ```
|
|
266
|
+
*/
|
|
267
|
+
export async function getSessionId() {
|
|
268
|
+
if (!LIB_INSTANCE)
|
|
269
|
+
return null;
|
|
270
|
+
return LIB_INSTANCE.getSessionId();
|
|
271
|
+
}
|
|
96
272
|
//# sourceMappingURL=index.js.map
|
package/dist/esnext/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,GAAG,EAOH,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|