posthog-js 1.166.2 → 1.167.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/dist/array.full.js +2 -2
- package/dist/array.full.js.map +1 -1
- package/dist/array.full.no-external.js +1 -1
- package/dist/array.full.no-external.js.map +1 -1
- package/dist/array.js +1 -1
- package/dist/array.js.map +1 -1
- package/dist/array.no-external.js +1 -1
- package/dist/array.no-external.js.map +1 -1
- package/dist/lib/src/web-experiments-types.d.ts +1 -1
- package/dist/lib/src/web-experiments.d.ts +5 -2
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/module.d.ts +6 -3
- package/dist/module.full.d.ts +6 -3
- package/dist/module.full.js +2 -2
- package/dist/module.full.js.map +1 -1
- package/dist/module.full.no-external.d.ts +6 -3
- package/dist/module.full.no-external.js +1 -1
- package/dist/module.full.no-external.js.map +1 -1
- package/dist/module.js +1 -1
- package/dist/module.js.map +1 -1
- package/dist/module.no-external.d.ts +6 -3
- package/dist/module.no-external.js +1 -1
- package/dist/module.no-external.js.map +1 -1
- package/lib/package.json +1 -1
- package/lib/src/posthog-core.js +4 -0
- package/lib/src/posthog-core.js.map +1 -1
- package/lib/src/web-experiments-types.d.ts +1 -1
- package/lib/src/web-experiments-types.js.map +1 -1
- package/lib/src/web-experiments.d.ts +5 -2
- package/lib/src/web-experiments.js +83 -12
- package/lib/src/web-experiments.js.map +1 -1
- package/package.json +1 -1
|
@@ -7,7 +7,7 @@ export interface WebExperimentTransform {
|
|
|
7
7
|
text?: string;
|
|
8
8
|
html?: string;
|
|
9
9
|
imgUrl?: string;
|
|
10
|
-
|
|
10
|
+
css?: string;
|
|
11
11
|
}
|
|
12
12
|
export type WebExperimentUrlMatchType = 'regex' | 'not_regex' | 'exact' | 'is_not' | 'icontains' | 'not_icontains';
|
|
13
13
|
export interface WebExperimentVariant {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-experiments-types.js","sourceRoot":"","sources":["../../src/web-experiments-types.ts"],"names":[],"mappings":"","sourcesContent":["export interface WebExperimentTransform {\n attributes?:\n | {\n name: string\n value: string\n }[]\n selector?: string\n text?: string\n html?: string\n imgUrl?: string\n
|
|
1
|
+
{"version":3,"file":"web-experiments-types.js","sourceRoot":"","sources":["../../src/web-experiments-types.ts"],"names":[],"mappings":"","sourcesContent":["export interface WebExperimentTransform {\n attributes?:\n | {\n name: string\n value: string\n }[]\n selector?: string\n text?: string\n html?: string\n imgUrl?: string\n css?: string\n}\n\nexport type WebExperimentUrlMatchType = 'regex' | 'not_regex' | 'exact' | 'is_not' | 'icontains' | 'not_icontains'\n\nexport interface WebExperimentVariant {\n conditions?: {\n url?: string\n urlMatchType?: WebExperimentUrlMatchType\n utm?: {\n utm_source?: string\n utm_medium?: string\n utm_campaign?: string\n utm_term?: string\n }\n }\n variant_name: string\n transforms: WebExperimentTransform[]\n}\nexport interface WebExperiment {\n id: number\n name: string\n feature_flag_key?: string\n variants: Record<string, WebExperimentVariant>\n}\n\nexport type WebExperimentsCallback = (webExperiments: WebExperiment[]) => void\n"]}
|
|
@@ -9,13 +9,16 @@ export declare class WebExperiments {
|
|
|
9
9
|
constructor(instance: PostHog);
|
|
10
10
|
applyFeatureFlagChanges(flags: string[]): void;
|
|
11
11
|
afterDecideResponse(response: DecideResponse): void;
|
|
12
|
+
previewWebExperiment(): void;
|
|
12
13
|
loadIfEnabled(): void;
|
|
13
14
|
getWebExperimentsAndEvaluateDisplayLogic: (forceReload?: boolean) => void;
|
|
14
|
-
getWebExperiments(callback: WebExperimentsCallback, forceReload: boolean): void;
|
|
15
|
+
getWebExperiments(callback: WebExperimentsCallback, forceReload: boolean, previewing?: boolean): void;
|
|
16
|
+
private showPreviewWebExperiment;
|
|
15
17
|
private static matchesTestVariant;
|
|
16
18
|
private static matchUrlConditions;
|
|
17
19
|
static getWindowLocation(): Location | undefined;
|
|
18
20
|
private static matchUTMConditions;
|
|
19
21
|
private static logInfo;
|
|
20
|
-
private
|
|
22
|
+
private applyTransforms;
|
|
23
|
+
_is_bot(): boolean | undefined;
|
|
21
24
|
}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
-
import { window } from './utils/globals';
|
|
1
|
+
import { navigator, window } from './utils/globals';
|
|
2
2
|
import { WEB_EXPERIMENTS } from './constants';
|
|
3
3
|
import { isNullish } from './utils/type-utils';
|
|
4
|
-
import { isUrlMatchingRegex } from './utils/request-utils';
|
|
4
|
+
import { getQueryParam, isUrlMatchingRegex } from './utils/request-utils';
|
|
5
5
|
import { logger } from './utils/logger';
|
|
6
6
|
import { Info } from './utils/event-utils';
|
|
7
|
+
import { isLikelyBot } from './utils/blocked-uas';
|
|
7
8
|
export var webExperimentUrlValidationMap = {
|
|
8
9
|
icontains: function (conditionsUrl, location) {
|
|
9
10
|
return !!window && location.href.toLowerCase().indexOf(conditionsUrl.toLowerCase()) > -1;
|
|
@@ -35,7 +36,7 @@ var WebExperiments = /** @class */ (function () {
|
|
|
35
36
|
}
|
|
36
37
|
var selectedVariant = _this._featureFlags[webExperiment.feature_flag_key];
|
|
37
38
|
if (selectedVariant && webExperiment.variants[selectedVariant]) {
|
|
38
|
-
|
|
39
|
+
_this.applyTransforms(webExperiment.name, selectedVariant, webExperiment.variants[selectedVariant].transforms);
|
|
39
40
|
}
|
|
40
41
|
}
|
|
41
42
|
else if (webExperiment.variants) {
|
|
@@ -43,7 +44,7 @@ var WebExperiments = /** @class */ (function () {
|
|
|
43
44
|
var testVariant = webExperiment.variants[variant];
|
|
44
45
|
var matchTest = WebExperiments.matchesTestVariant(testVariant);
|
|
45
46
|
if (matchTest) {
|
|
46
|
-
|
|
47
|
+
_this.applyTransforms(webExperiment.name, variant, testVariant.transforms);
|
|
47
48
|
}
|
|
48
49
|
}
|
|
49
50
|
}
|
|
@@ -61,24 +62,43 @@ var WebExperiments = /** @class */ (function () {
|
|
|
61
62
|
}
|
|
62
63
|
WebExperiments.prototype.applyFeatureFlagChanges = function (flags) {
|
|
63
64
|
var _this = this;
|
|
64
|
-
WebExperiments.logInfo('applying feature flags', flags);
|
|
65
65
|
if (isNullish(this._flagToExperiments) || this.instance.config.disable_web_experiments) {
|
|
66
66
|
return;
|
|
67
67
|
}
|
|
68
|
+
WebExperiments.logInfo('applying feature flags', flags);
|
|
68
69
|
flags.forEach(function (flag) {
|
|
69
70
|
var _a, _b;
|
|
70
71
|
if (_this._flagToExperiments && ((_a = _this._flagToExperiments) === null || _a === void 0 ? void 0 : _a.has(flag))) {
|
|
71
72
|
var selectedVariant = _this.instance.getFeatureFlag(flag);
|
|
72
73
|
var webExperiment = (_b = _this._flagToExperiments) === null || _b === void 0 ? void 0 : _b.get(flag);
|
|
73
74
|
if (selectedVariant && (webExperiment === null || webExperiment === void 0 ? void 0 : webExperiment.variants[selectedVariant])) {
|
|
74
|
-
|
|
75
|
+
_this.applyTransforms(webExperiment.name, selectedVariant, webExperiment.variants[selectedVariant].transforms);
|
|
75
76
|
}
|
|
76
77
|
}
|
|
77
78
|
});
|
|
78
79
|
};
|
|
79
80
|
WebExperiments.prototype.afterDecideResponse = function (response) {
|
|
81
|
+
if (this._is_bot()) {
|
|
82
|
+
WebExperiments.logInfo('Refusing to render web experiment since the viewer is a likely bot');
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
80
85
|
this._featureFlags = response.featureFlags;
|
|
81
86
|
this.loadIfEnabled();
|
|
87
|
+
this.previewWebExperiment();
|
|
88
|
+
};
|
|
89
|
+
WebExperiments.prototype.previewWebExperiment = function () {
|
|
90
|
+
var _this = this;
|
|
91
|
+
var location = WebExperiments.getWindowLocation();
|
|
92
|
+
if (location === null || location === void 0 ? void 0 : location.search) {
|
|
93
|
+
var experimentID_1 = getQueryParam(location === null || location === void 0 ? void 0 : location.search, '__experiment_id');
|
|
94
|
+
var variant_1 = getQueryParam(location === null || location === void 0 ? void 0 : location.search, '__experiment_variant');
|
|
95
|
+
if (experimentID_1 && variant_1) {
|
|
96
|
+
WebExperiments.logInfo("previewing web experiments ".concat(experimentID_1, " && ").concat(variant_1));
|
|
97
|
+
this.getWebExperiments(function (webExperiments) {
|
|
98
|
+
_this.showPreviewWebExperiment(parseInt(experimentID_1), variant_1, webExperiments);
|
|
99
|
+
}, false, true);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
82
102
|
};
|
|
83
103
|
WebExperiments.prototype.loadIfEnabled = function () {
|
|
84
104
|
if (this.instance.config.disable_web_experiments) {
|
|
@@ -86,8 +106,8 @@ var WebExperiments = /** @class */ (function () {
|
|
|
86
106
|
}
|
|
87
107
|
this.getWebExperimentsAndEvaluateDisplayLogic();
|
|
88
108
|
};
|
|
89
|
-
WebExperiments.prototype.getWebExperiments = function (callback, forceReload) {
|
|
90
|
-
if (this.instance.config.disable_web_experiments) {
|
|
109
|
+
WebExperiments.prototype.getWebExperiments = function (callback, forceReload, previewing) {
|
|
110
|
+
if (this.instance.config.disable_web_experiments && !previewing) {
|
|
91
111
|
return callback([]);
|
|
92
112
|
}
|
|
93
113
|
var existingWebExperiments = this.instance.get_property(WEB_EXPERIMENTS);
|
|
@@ -107,6 +127,13 @@ var WebExperiments = /** @class */ (function () {
|
|
|
107
127
|
},
|
|
108
128
|
});
|
|
109
129
|
};
|
|
130
|
+
WebExperiments.prototype.showPreviewWebExperiment = function (experimentID, variant, webExperiments) {
|
|
131
|
+
var previewExperiments = webExperiments.filter(function (exp) { return exp.id === experimentID; });
|
|
132
|
+
if (previewExperiments && previewExperiments.length > 0) {
|
|
133
|
+
WebExperiments.logInfo("Previewing web experiment [".concat(previewExperiments[0].name, "] with variant [").concat(variant, "]"));
|
|
134
|
+
this.applyTransforms(previewExperiments[0].name, variant, previewExperiments[0].variants[variant].transforms, true);
|
|
135
|
+
}
|
|
136
|
+
};
|
|
110
137
|
WebExperiments.matchesTestVariant = function (testVariant) {
|
|
111
138
|
if (isNullish(testVariant.conditions)) {
|
|
112
139
|
return false;
|
|
@@ -161,14 +188,36 @@ var WebExperiments = /** @class */ (function () {
|
|
|
161
188
|
}
|
|
162
189
|
logger.info("[WebExperiments] ".concat(msg), args);
|
|
163
190
|
};
|
|
164
|
-
WebExperiments.applyTransforms = function (experiment, variant, transforms) {
|
|
191
|
+
WebExperiments.prototype.applyTransforms = function (experiment, variant, transforms, isPreview) {
|
|
192
|
+
var _this = this;
|
|
193
|
+
var _a;
|
|
194
|
+
if (this._is_bot()) {
|
|
195
|
+
WebExperiments.logInfo('Refusing to render web experiment since the viewer is a likely bot');
|
|
196
|
+
return;
|
|
197
|
+
}
|
|
198
|
+
if (variant === 'control') {
|
|
199
|
+
WebExperiments.logInfo('Control variants leave the page unmodified.');
|
|
200
|
+
if (this.instance && this.instance.capture) {
|
|
201
|
+
this.instance.capture('$web_experiment_applied', {
|
|
202
|
+
$web_experiment_name: experiment,
|
|
203
|
+
$web_experiment_preview: isPreview,
|
|
204
|
+
$web_experiment_variant: variant,
|
|
205
|
+
$web_experiment_document_url: (_a = WebExperiments.getWindowLocation()) === null || _a === void 0 ? void 0 : _a.href,
|
|
206
|
+
$web_experiment_elements_modified: 0,
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
165
211
|
transforms.forEach(function (transform) {
|
|
212
|
+
var _a;
|
|
166
213
|
if (transform.selector) {
|
|
167
214
|
WebExperiments.logInfo("applying transform of variant ".concat(variant, " for experiment ").concat(experiment, " "), transform);
|
|
215
|
+
var elementsModified_1 = 0;
|
|
168
216
|
// eslint-disable-next-line no-restricted-globals
|
|
169
217
|
var elements = document === null || document === void 0 ? void 0 : document.querySelectorAll(transform.selector);
|
|
170
218
|
elements === null || elements === void 0 ? void 0 : elements.forEach(function (element) {
|
|
171
219
|
var htmlElement = element;
|
|
220
|
+
elementsModified_1 += 1;
|
|
172
221
|
if (transform.attributes) {
|
|
173
222
|
transform.attributes.forEach(function (attribute) {
|
|
174
223
|
switch (attribute.name) {
|
|
@@ -190,15 +239,37 @@ var WebExperiments = /** @class */ (function () {
|
|
|
190
239
|
htmlElement.innerText = transform.text;
|
|
191
240
|
}
|
|
192
241
|
if (transform.html) {
|
|
193
|
-
htmlElement.
|
|
242
|
+
if (htmlElement.parentElement) {
|
|
243
|
+
htmlElement.parentElement.innerHTML = transform.html;
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
htmlElement.innerHTML = transform.html;
|
|
247
|
+
}
|
|
194
248
|
}
|
|
195
|
-
if (transform.
|
|
196
|
-
htmlElement.
|
|
249
|
+
if (transform.css) {
|
|
250
|
+
htmlElement.setAttribute('style', transform.css);
|
|
197
251
|
}
|
|
198
252
|
});
|
|
253
|
+
if (_this.instance && _this.instance.capture) {
|
|
254
|
+
_this.instance.capture('$web_experiment_applied', {
|
|
255
|
+
$web_experiment_name: experiment,
|
|
256
|
+
$web_experiment_variant: variant,
|
|
257
|
+
$web_experiment_preview: isPreview,
|
|
258
|
+
$web_experiment_document_url: (_a = WebExperiments.getWindowLocation()) === null || _a === void 0 ? void 0 : _a.href,
|
|
259
|
+
$web_experiment_elements_modified: elementsModified_1,
|
|
260
|
+
});
|
|
261
|
+
}
|
|
199
262
|
}
|
|
200
263
|
});
|
|
201
264
|
};
|
|
265
|
+
WebExperiments.prototype._is_bot = function () {
|
|
266
|
+
if (navigator && this.instance) {
|
|
267
|
+
return isLikelyBot(navigator, this.instance.config.custom_blocked_useragents);
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
return undefined;
|
|
271
|
+
}
|
|
272
|
+
};
|
|
202
273
|
return WebExperiments;
|
|
203
274
|
}());
|
|
204
275
|
export { WebExperiments };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web-experiments.js","sourceRoot":"","sources":["../../src/web-experiments.ts"],"names":[],"mappings":"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","sourcesContent":["import { PostHog } from './posthog-core'\nimport { DecideResponse } from './types'\nimport { window } from './utils/globals'\nimport {\n WebExperiment,\n WebExperimentsCallback,\n WebExperimentTransform,\n WebExperimentUrlMatchType,\n WebExperimentVariant,\n} from './web-experiments-types'\nimport { WEB_EXPERIMENTS } from './constants'\nimport { isNullish } from './utils/type-utils'\nimport { isUrlMatchingRegex } from './utils/request-utils'\nimport { logger } from './utils/logger'\nimport { Info } from './utils/event-utils'\n\nexport const webExperimentUrlValidationMap: Record<\n WebExperimentUrlMatchType,\n (conditionsUrl: string, location: Location) => boolean\n> = {\n icontains: (conditionsUrl, location) =>\n !!window && location.href.toLowerCase().indexOf(conditionsUrl.toLowerCase()) > -1,\n not_icontains: (conditionsUrl, location) =>\n !!window && location.href.toLowerCase().indexOf(conditionsUrl.toLowerCase()) === -1,\n regex: (conditionsUrl, location) => !!window && isUrlMatchingRegex(location.href, conditionsUrl),\n not_regex: (conditionsUrl, location) => !!window && !isUrlMatchingRegex(location.href, conditionsUrl),\n exact: (conditionsUrl, location) => location.href === conditionsUrl,\n is_not: (conditionsUrl, location) => location.href !== conditionsUrl,\n}\n\nexport class WebExperiments {\n instance: PostHog\n private _featureFlags?: Record<string, string | boolean>\n private _flagToExperiments?: Map<string, WebExperiment>\n\n constructor(instance: PostHog) {\n this.instance = instance\n const appFeatureFLags = (flags: string[]) => {\n this.applyFeatureFlagChanges(flags)\n }\n\n if (this.instance.onFeatureFlags) {\n this.instance.onFeatureFlags(appFeatureFLags)\n }\n this._flagToExperiments = new Map<string, WebExperiment>()\n }\n\n applyFeatureFlagChanges(flags: string[]) {\n WebExperiments.logInfo('applying feature flags', flags)\n if (isNullish(this._flagToExperiments) || this.instance.config.disable_web_experiments) {\n return\n }\n\n flags.forEach((flag) => {\n if (this._flagToExperiments && this._flagToExperiments?.has(flag)) {\n const selectedVariant = this.instance.getFeatureFlag(flag) as unknown as string\n const webExperiment = this._flagToExperiments?.get(flag)\n if (selectedVariant && webExperiment?.variants[selectedVariant]) {\n WebExperiments.applyTransforms(\n webExperiment.name,\n selectedVariant,\n webExperiment.variants[selectedVariant].transforms\n )\n }\n }\n })\n }\n\n afterDecideResponse(response: DecideResponse) {\n this._featureFlags = response.featureFlags\n\n this.loadIfEnabled()\n }\n\n loadIfEnabled() {\n if (this.instance.config.disable_web_experiments) {\n return\n }\n\n this.getWebExperimentsAndEvaluateDisplayLogic()\n }\n\n public getWebExperimentsAndEvaluateDisplayLogic = (forceReload: boolean = false): void => {\n this.getWebExperiments((webExperiments) => {\n WebExperiments.logInfo(`retrieved web experiments from the server`)\n this._flagToExperiments = new Map<string, WebExperiment>()\n webExperiments.forEach((webExperiment) => {\n if (\n webExperiment.feature_flag_key &&\n this._featureFlags &&\n this._featureFlags[webExperiment.feature_flag_key]\n ) {\n if (this._flagToExperiments) {\n WebExperiments.logInfo(\n `setting flag key `,\n webExperiment.feature_flag_key,\n ` to web experiment `,\n webExperiment\n )\n this._flagToExperiments?.set(webExperiment.feature_flag_key, webExperiment)\n }\n\n const selectedVariant = this._featureFlags[webExperiment.feature_flag_key] as unknown as string\n if (selectedVariant && webExperiment.variants[selectedVariant]) {\n WebExperiments.applyTransforms(\n webExperiment.name,\n selectedVariant,\n webExperiment.variants[selectedVariant].transforms\n )\n }\n } else if (webExperiment.variants) {\n for (const variant in webExperiment.variants) {\n const testVariant = webExperiment.variants[variant]\n const matchTest = WebExperiments.matchesTestVariant(testVariant)\n if (matchTest) {\n WebExperiments.applyTransforms(webExperiment.name, variant, testVariant.transforms)\n }\n }\n }\n })\n }, forceReload)\n }\n\n public getWebExperiments(callback: WebExperimentsCallback, forceReload: boolean) {\n if (this.instance.config.disable_web_experiments) {\n return callback([])\n }\n\n const existingWebExperiments = this.instance.get_property(WEB_EXPERIMENTS)\n if (existingWebExperiments && !forceReload) {\n return callback(existingWebExperiments)\n }\n\n this.instance._send_request({\n url: this.instance.requestRouter.endpointFor(\n 'api',\n `/api/web_experiments/?token=${this.instance.config.token}`\n ),\n method: 'GET',\n transport: 'XHR',\n callback: (response) => {\n if (response.statusCode !== 200 || !response.json) {\n return callback([])\n }\n const webExperiments = response.json.experiments || []\n return callback(webExperiments)\n },\n })\n }\n\n private static matchesTestVariant(testVariant: WebExperimentVariant) {\n if (isNullish(testVariant.conditions)) {\n return false\n }\n return WebExperiments.matchUrlConditions(testVariant) && WebExperiments.matchUTMConditions(testVariant)\n }\n\n private static matchUrlConditions(testVariant: WebExperimentVariant): boolean {\n if (isNullish(testVariant.conditions) || isNullish(testVariant.conditions?.url)) {\n return true\n }\n\n const location = WebExperiments.getWindowLocation()\n if (location) {\n const urlCheck = testVariant.conditions?.url\n ? webExperimentUrlValidationMap[testVariant.conditions?.urlMatchType ?? 'icontains'](\n testVariant.conditions.url,\n location\n )\n : true\n return urlCheck\n }\n\n return false\n }\n\n public static getWindowLocation(): Location | undefined {\n return window?.location\n }\n\n private static matchUTMConditions(testVariant: WebExperimentVariant): boolean {\n if (isNullish(testVariant.conditions) || isNullish(testVariant.conditions?.utm)) {\n return true\n }\n const campaignParams = Info.campaignParams()\n if (campaignParams['utm_source']) {\n // eslint-disable-next-line compat/compat\n const utmCampaignMatched = testVariant.conditions?.utm?.utm_campaign\n ? testVariant.conditions?.utm?.utm_campaign == campaignParams['utm_campaign']\n : true\n\n const utmSourceMatched = testVariant.conditions?.utm?.utm_source\n ? testVariant.conditions?.utm?.utm_source == campaignParams['utm_source']\n : true\n\n const utmMediumMatched = testVariant.conditions?.utm?.utm_medium\n ? testVariant.conditions?.utm?.utm_medium == campaignParams['utm_medium']\n : true\n\n const utmTermMatched = testVariant.conditions?.utm?.utm_term\n ? testVariant.conditions?.utm?.utm_term == campaignParams['utm_term']\n : true\n\n return utmCampaignMatched && utmMediumMatched && utmTermMatched && utmSourceMatched\n }\n\n return false\n }\n\n private static logInfo(msg: string, ...args: any[]) {\n logger.info(`[WebExperiments] ${msg}`, args)\n }\n\n private static applyTransforms(experiment: string, variant: string, transforms: WebExperimentTransform[]) {\n transforms.forEach((transform) => {\n if (transform.selector) {\n WebExperiments.logInfo(\n `applying transform of variant ${variant} for experiment ${experiment} `,\n transform\n )\n // eslint-disable-next-line no-restricted-globals\n const elements = document?.querySelectorAll(transform.selector)\n elements?.forEach((element) => {\n const htmlElement = element as HTMLElement\n if (transform.attributes) {\n transform.attributes.forEach((attribute) => {\n switch (attribute.name) {\n case 'text':\n htmlElement.innerText = attribute.value\n break\n\n case 'html':\n htmlElement.innerHTML = attribute.value\n break\n\n case 'cssClass':\n htmlElement.className = attribute.value\n break\n\n default:\n htmlElement.setAttribute(attribute.name, attribute.value)\n }\n })\n }\n\n if (transform.text) {\n htmlElement.innerText = transform.text\n }\n\n if (transform.html) {\n htmlElement.innerHTML = transform.html\n }\n\n if (transform.className) {\n htmlElement.className = transform.className\n }\n })\n }\n })\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"web-experiments.js","sourceRoot":"","sources":["../../src/web-experiments.ts"],"names":[],"mappings":"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","sourcesContent":["import { PostHog } from './posthog-core'\nimport { DecideResponse } from './types'\nimport { navigator, window } from './utils/globals'\nimport {\n WebExperiment,\n WebExperimentsCallback,\n WebExperimentTransform,\n WebExperimentUrlMatchType,\n WebExperimentVariant,\n} from './web-experiments-types'\nimport { WEB_EXPERIMENTS } from './constants'\nimport { isNullish } from './utils/type-utils'\nimport { getQueryParam, isUrlMatchingRegex } from './utils/request-utils'\nimport { logger } from './utils/logger'\nimport { Info } from './utils/event-utils'\nimport { isLikelyBot } from './utils/blocked-uas'\n\nexport const webExperimentUrlValidationMap: Record<\n WebExperimentUrlMatchType,\n (conditionsUrl: string, location: Location) => boolean\n> = {\n icontains: (conditionsUrl, location) =>\n !!window && location.href.toLowerCase().indexOf(conditionsUrl.toLowerCase()) > -1,\n not_icontains: (conditionsUrl, location) =>\n !!window && location.href.toLowerCase().indexOf(conditionsUrl.toLowerCase()) === -1,\n regex: (conditionsUrl, location) => !!window && isUrlMatchingRegex(location.href, conditionsUrl),\n not_regex: (conditionsUrl, location) => !!window && !isUrlMatchingRegex(location.href, conditionsUrl),\n exact: (conditionsUrl, location) => location.href === conditionsUrl,\n is_not: (conditionsUrl, location) => location.href !== conditionsUrl,\n}\n\nexport class WebExperiments {\n instance: PostHog\n private _featureFlags?: Record<string, string | boolean>\n private _flagToExperiments?: Map<string, WebExperiment>\n\n constructor(instance: PostHog) {\n this.instance = instance\n const appFeatureFLags = (flags: string[]) => {\n this.applyFeatureFlagChanges(flags)\n }\n\n if (this.instance.onFeatureFlags) {\n this.instance.onFeatureFlags(appFeatureFLags)\n }\n this._flagToExperiments = new Map<string, WebExperiment>()\n }\n\n applyFeatureFlagChanges(flags: string[]) {\n if (isNullish(this._flagToExperiments) || this.instance.config.disable_web_experiments) {\n return\n }\n\n WebExperiments.logInfo('applying feature flags', flags)\n flags.forEach((flag) => {\n if (this._flagToExperiments && this._flagToExperiments?.has(flag)) {\n const selectedVariant = this.instance.getFeatureFlag(flag) as unknown as string\n const webExperiment = this._flagToExperiments?.get(flag)\n if (selectedVariant && webExperiment?.variants[selectedVariant]) {\n this.applyTransforms(\n webExperiment.name,\n selectedVariant,\n webExperiment.variants[selectedVariant].transforms\n )\n }\n }\n })\n }\n\n afterDecideResponse(response: DecideResponse) {\n if (this._is_bot()) {\n WebExperiments.logInfo('Refusing to render web experiment since the viewer is a likely bot')\n return\n }\n\n this._featureFlags = response.featureFlags\n this.loadIfEnabled()\n this.previewWebExperiment()\n }\n\n previewWebExperiment() {\n const location = WebExperiments.getWindowLocation()\n if (location?.search) {\n const experimentID = getQueryParam(location?.search, '__experiment_id')\n const variant = getQueryParam(location?.search, '__experiment_variant')\n if (experimentID && variant) {\n WebExperiments.logInfo(`previewing web experiments ${experimentID} && ${variant}`)\n this.getWebExperiments(\n (webExperiments) => {\n this.showPreviewWebExperiment(parseInt(experimentID), variant, webExperiments)\n },\n false,\n true\n )\n }\n }\n }\n\n loadIfEnabled() {\n if (this.instance.config.disable_web_experiments) {\n return\n }\n\n this.getWebExperimentsAndEvaluateDisplayLogic()\n }\n\n public getWebExperimentsAndEvaluateDisplayLogic = (forceReload: boolean = false): void => {\n this.getWebExperiments((webExperiments) => {\n WebExperiments.logInfo(`retrieved web experiments from the server`)\n this._flagToExperiments = new Map<string, WebExperiment>()\n\n webExperiments.forEach((webExperiment) => {\n if (\n webExperiment.feature_flag_key &&\n this._featureFlags &&\n this._featureFlags[webExperiment.feature_flag_key]\n ) {\n if (this._flagToExperiments) {\n WebExperiments.logInfo(\n `setting flag key `,\n webExperiment.feature_flag_key,\n ` to web experiment `,\n webExperiment\n )\n this._flagToExperiments?.set(webExperiment.feature_flag_key, webExperiment)\n }\n\n const selectedVariant = this._featureFlags[webExperiment.feature_flag_key] as unknown as string\n if (selectedVariant && webExperiment.variants[selectedVariant]) {\n this.applyTransforms(\n webExperiment.name,\n selectedVariant,\n webExperiment.variants[selectedVariant].transforms\n )\n }\n } else if (webExperiment.variants) {\n for (const variant in webExperiment.variants) {\n const testVariant = webExperiment.variants[variant]\n const matchTest = WebExperiments.matchesTestVariant(testVariant)\n if (matchTest) {\n this.applyTransforms(webExperiment.name, variant, testVariant.transforms)\n }\n }\n }\n })\n }, forceReload)\n }\n\n public getWebExperiments(callback: WebExperimentsCallback, forceReload: boolean, previewing?: boolean) {\n if (this.instance.config.disable_web_experiments && !previewing) {\n return callback([])\n }\n\n const existingWebExperiments = this.instance.get_property(WEB_EXPERIMENTS)\n if (existingWebExperiments && !forceReload) {\n return callback(existingWebExperiments)\n }\n\n this.instance._send_request({\n url: this.instance.requestRouter.endpointFor(\n 'api',\n `/api/web_experiments/?token=${this.instance.config.token}`\n ),\n method: 'GET',\n transport: 'XHR',\n callback: (response) => {\n if (response.statusCode !== 200 || !response.json) {\n return callback([])\n }\n const webExperiments = response.json.experiments || []\n return callback(webExperiments)\n },\n })\n }\n\n private showPreviewWebExperiment(experimentID: number, variant: string, webExperiments: WebExperiment[]) {\n const previewExperiments = webExperiments.filter((exp) => exp.id === experimentID)\n if (previewExperiments && previewExperiments.length > 0) {\n WebExperiments.logInfo(\n `Previewing web experiment [${previewExperiments[0].name}] with variant [${variant}]`\n )\n this.applyTransforms(\n previewExperiments[0].name,\n variant,\n previewExperiments[0].variants[variant].transforms,\n true\n )\n }\n }\n private static matchesTestVariant(testVariant: WebExperimentVariant) {\n if (isNullish(testVariant.conditions)) {\n return false\n }\n return WebExperiments.matchUrlConditions(testVariant) && WebExperiments.matchUTMConditions(testVariant)\n }\n\n private static matchUrlConditions(testVariant: WebExperimentVariant): boolean {\n if (isNullish(testVariant.conditions) || isNullish(testVariant.conditions?.url)) {\n return true\n }\n\n const location = WebExperiments.getWindowLocation()\n if (location) {\n const urlCheck = testVariant.conditions?.url\n ? webExperimentUrlValidationMap[testVariant.conditions?.urlMatchType ?? 'icontains'](\n testVariant.conditions.url,\n location\n )\n : true\n return urlCheck\n }\n\n return false\n }\n\n public static getWindowLocation(): Location | undefined {\n return window?.location\n }\n\n private static matchUTMConditions(testVariant: WebExperimentVariant): boolean {\n if (isNullish(testVariant.conditions) || isNullish(testVariant.conditions?.utm)) {\n return true\n }\n const campaignParams = Info.campaignParams()\n if (campaignParams['utm_source']) {\n // eslint-disable-next-line compat/compat\n const utmCampaignMatched = testVariant.conditions?.utm?.utm_campaign\n ? testVariant.conditions?.utm?.utm_campaign == campaignParams['utm_campaign']\n : true\n\n const utmSourceMatched = testVariant.conditions?.utm?.utm_source\n ? testVariant.conditions?.utm?.utm_source == campaignParams['utm_source']\n : true\n\n const utmMediumMatched = testVariant.conditions?.utm?.utm_medium\n ? testVariant.conditions?.utm?.utm_medium == campaignParams['utm_medium']\n : true\n\n const utmTermMatched = testVariant.conditions?.utm?.utm_term\n ? testVariant.conditions?.utm?.utm_term == campaignParams['utm_term']\n : true\n\n return utmCampaignMatched && utmMediumMatched && utmTermMatched && utmSourceMatched\n }\n\n return false\n }\n\n private static logInfo(msg: string, ...args: any[]) {\n logger.info(`[WebExperiments] ${msg}`, args)\n }\n\n private applyTransforms(\n experiment: string,\n variant: string,\n transforms: WebExperimentTransform[],\n isPreview?: boolean\n ) {\n if (this._is_bot()) {\n WebExperiments.logInfo('Refusing to render web experiment since the viewer is a likely bot')\n return\n }\n\n if (variant === 'control') {\n WebExperiments.logInfo('Control variants leave the page unmodified.')\n if (this.instance && this.instance.capture) {\n this.instance.capture('$web_experiment_applied', {\n $web_experiment_name: experiment,\n $web_experiment_preview: isPreview,\n $web_experiment_variant: variant,\n $web_experiment_document_url: WebExperiments.getWindowLocation()?.href,\n $web_experiment_elements_modified: 0,\n })\n }\n\n return\n }\n\n transforms.forEach((transform) => {\n if (transform.selector) {\n WebExperiments.logInfo(\n `applying transform of variant ${variant} for experiment ${experiment} `,\n transform\n )\n\n let elementsModified = 0\n // eslint-disable-next-line no-restricted-globals\n const elements = document?.querySelectorAll(transform.selector)\n elements?.forEach((element) => {\n const htmlElement = element as HTMLElement\n elementsModified += 1\n if (transform.attributes) {\n transform.attributes.forEach((attribute) => {\n switch (attribute.name) {\n case 'text':\n htmlElement.innerText = attribute.value\n break\n\n case 'html':\n htmlElement.innerHTML = attribute.value\n break\n\n case 'cssClass':\n htmlElement.className = attribute.value\n break\n\n default:\n htmlElement.setAttribute(attribute.name, attribute.value)\n }\n })\n }\n\n if (transform.text) {\n htmlElement.innerText = transform.text\n }\n\n if (transform.html) {\n if (htmlElement.parentElement) {\n htmlElement.parentElement.innerHTML = transform.html\n } else {\n htmlElement.innerHTML = transform.html\n }\n }\n\n if (transform.css) {\n htmlElement.setAttribute('style', transform.css)\n }\n })\n\n if (this.instance && this.instance.capture) {\n this.instance.capture('$web_experiment_applied', {\n $web_experiment_name: experiment,\n $web_experiment_variant: variant,\n $web_experiment_preview: isPreview,\n $web_experiment_document_url: WebExperiments.getWindowLocation()?.href,\n $web_experiment_elements_modified: elementsModified,\n })\n }\n }\n })\n }\n\n _is_bot(): boolean | undefined {\n if (navigator && this.instance) {\n return isLikelyBot(navigator, this.instance.config.custom_blocked_useragents)\n } else {\n return undefined\n }\n }\n}\n"]}
|
package/package.json
CHANGED