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.
@@ -7,7 +7,7 @@ export interface WebExperimentTransform {
7
7
  text?: string;
8
8
  html?: string;
9
9
  imgUrl?: string;
10
- className?: string;
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 className?: 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"]}
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 static applyTransforms;
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
- WebExperiments.applyTransforms(webExperiment.name, selectedVariant, webExperiment.variants[selectedVariant].transforms);
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
- WebExperiments.applyTransforms(webExperiment.name, variant, testVariant.transforms);
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
- WebExperiments.applyTransforms(webExperiment.name, selectedVariant, webExperiment.variants[selectedVariant].transforms);
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.innerHTML = transform.html;
242
+ if (htmlElement.parentElement) {
243
+ htmlElement.parentElement.innerHTML = transform.html;
244
+ }
245
+ else {
246
+ htmlElement.innerHTML = transform.html;
247
+ }
194
248
  }
195
- if (transform.className) {
196
- htmlElement.className = transform.className;
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "posthog-js",
3
- "version": "1.166.2",
3
+ "version": "1.167.1",
4
4
  "description": "Posthog-js allows you to automatically capture usage and send events to PostHog.",
5
5
  "repository": "https://github.com/PostHog/posthog-js",
6
6
  "author": "hey@posthog.com",