posthog-js 1.76.0 → 1.77.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.js +2 -2
- package/dist/array.js.map +1 -1
- package/dist/es.js +2 -2
- package/dist/es.js.map +1 -1
- package/dist/module.d.ts +38 -6
- package/dist/module.js +2 -2
- package/dist/module.js.map +1 -1
- package/lib/package.json +8 -6
- package/lib/src/autocapture-utils.d.ts +15 -0
- package/lib/src/autocapture-utils.js +303 -0
- package/lib/src/autocapture-utils.js.map +1 -0
- package/lib/src/autocapture.d.ts +27 -0
- package/lib/src/autocapture.js +290 -0
- package/lib/src/autocapture.js.map +1 -0
- package/lib/src/base-request-queue.d.ts +12 -0
- package/lib/src/base-request-queue.js +33 -0
- package/lib/src/base-request-queue.js.map +1 -0
- package/lib/src/compression.d.ts +3 -0
- package/lib/src/compression.js +35 -0
- package/lib/src/compression.js.map +1 -0
- package/lib/src/config.d.ts +5 -0
- package/lib/src/config.js +9 -0
- package/lib/src/config.js.map +1 -0
- package/lib/src/constants.d.ts +19 -0
- package/lib/src/constants.js +41 -0
- package/lib/src/constants.js.map +1 -0
- package/lib/src/decide.d.ts +8 -0
- package/lib/src/decide.js +118 -0
- package/lib/src/decide.js.map +1 -0
- package/lib/src/extensions/cloud.d.ts +1 -0
- package/lib/src/extensions/cloud.js +2 -0
- package/lib/src/extensions/cloud.js.map +1 -0
- package/lib/src/extensions/exceptions/error-conversion.d.ts +26 -0
- package/lib/src/extensions/exceptions/error-conversion.js +204 -0
- package/lib/src/extensions/exceptions/error-conversion.js.map +1 -0
- package/lib/src/extensions/exceptions/exception-autocapture.d.ts +24 -0
- package/lib/src/extensions/exceptions/exception-autocapture.js +164 -0
- package/lib/src/extensions/exceptions/exception-autocapture.js.map +1 -0
- package/lib/src/extensions/exceptions/stack-trace.d.ts +31 -0
- package/lib/src/extensions/exceptions/stack-trace.js +259 -0
- package/lib/src/extensions/exceptions/stack-trace.js.map +1 -0
- package/lib/src/extensions/exceptions/type-checking.d.ts +10 -0
- package/lib/src/extensions/exceptions/type-checking.js +43 -0
- package/lib/src/extensions/exceptions/type-checking.js.map +1 -0
- package/lib/src/extensions/rageclick.d.ts +10 -0
- package/lib/src/extensions/rageclick.js +33 -0
- package/lib/src/extensions/rageclick.js.map +1 -0
- package/lib/src/extensions/segment-integration.d.ts +44 -0
- package/lib/src/extensions/segment-integration.js +34 -0
- package/lib/src/extensions/segment-integration.js.map +1 -0
- package/lib/src/extensions/sentry-integration.d.ts +30 -0
- package/lib/src/extensions/sentry-integration.js +63 -0
- package/lib/src/extensions/sentry-integration.js.map +1 -0
- package/lib/src/extensions/sessionrecording-utils.d.ts +67 -0
- package/lib/src/extensions/sessionrecording-utils.js +192 -0
- package/lib/src/extensions/sessionrecording-utils.js.map +1 -0
- package/lib/src/extensions/sessionrecording.d.ts +45 -0
- package/lib/src/extensions/sessionrecording.js +430 -0
- package/lib/src/extensions/sessionrecording.js.map +1 -0
- package/lib/src/extensions/toolbar.d.ts +18 -0
- package/lib/src/extensions/toolbar.js +151 -0
- package/lib/src/extensions/toolbar.js.map +1 -0
- package/lib/src/extensions/web-performance.d.ts +20 -0
- package/lib/src/extensions/web-performance.js +245 -0
- package/lib/src/extensions/web-performance.js.map +1 -0
- package/lib/src/gdpr-utils.d.ts +80 -0
- package/lib/src/gdpr-utils.js +236 -0
- package/lib/src/gdpr-utils.js.map +1 -0
- package/lib/src/loader-globals-full.d.ts +1 -0
- package/lib/src/loader-globals-full.js +5 -0
- package/lib/src/loader-globals-full.js.map +1 -0
- package/lib/src/loader-globals.d.ts +1 -0
- package/lib/src/loader-globals.js +3 -0
- package/lib/src/loader-globals.js.map +1 -0
- package/lib/src/loader-module.d.ts +4 -0
- package/lib/src/loader-module.js +6 -0
- package/lib/src/loader-module.js.map +1 -0
- package/lib/src/loader-recorder-v2.d.ts +2 -0
- package/lib/src/loader-recorder-v2.js +15 -0
- package/lib/src/loader-recorder-v2.js.map +1 -0
- package/lib/src/loader-recorder.d.ts +2 -0
- package/lib/src/loader-recorder.js +15 -0
- package/lib/src/loader-recorder.js.map +1 -0
- package/lib/src/page-view.d.ts +38 -0
- package/lib/src/page-view.js +127 -0
- package/lib/src/page-view.js.map +1 -0
- package/lib/src/posthog-core.d.ts +701 -0
- package/lib/src/posthog-core.js +1916 -0
- package/lib/src/posthog-core.js.map +1 -0
- package/lib/src/posthog-featureflags.d.ts +70 -0
- package/lib/src/posthog-featureflags.js +438 -0
- package/lib/src/posthog-featureflags.js.map +1 -0
- package/lib/src/posthog-persistence.d.ts +57 -0
- package/lib/src/posthog-persistence.js +256 -0
- package/lib/src/posthog-persistence.js.map +1 -0
- package/lib/src/posthog-surveys.d.ts +57 -0
- package/lib/src/posthog-surveys.js +76 -0
- package/lib/src/posthog-surveys.js.map +1 -0
- package/lib/src/rate-limiter.d.ts +5 -0
- package/lib/src/rate-limiter.js +66 -0
- package/lib/src/rate-limiter.js.map +1 -0
- package/lib/src/request-queue.d.ts +10 -0
- package/lib/src/request-queue.js +146 -0
- package/lib/src/request-queue.js.map +1 -0
- package/lib/src/retry-queue.d.ts +28 -0
- package/lib/src/retry-queue.js +198 -0
- package/lib/src/retry-queue.js.map +1 -0
- package/lib/src/send-request.d.ts +6 -0
- package/lib/src/send-request.js +125 -0
- package/lib/src/send-request.js.map +1 -0
- package/lib/src/sessionid.d.ts +28 -0
- package/lib/src/sessionid.js +205 -0
- package/lib/src/sessionid.js.map +1 -0
- package/lib/src/storage.d.ts +7 -0
- package/lib/src/storage.js +291 -0
- package/lib/src/storage.js.map +1 -0
- package/lib/src/types.d.ts +294 -0
- package/lib/src/types.js +6 -0
- package/lib/src/types.js.map +1 -0
- package/lib/src/utils.d.ts +89 -0
- package/lib/src/utils.js +868 -0
- package/lib/src/utils.js.map +1 -0
- package/lib/src/uuidv7.d.ts +42 -0
- package/lib/src/uuidv7.js +228 -0
- package/lib/src/uuidv7.js.map +1 -0
- package/package.json +8 -6
- package/CHANGELOG.md +0 -1145
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
var __assign = (this && this.__assign) || function () {
|
|
2
|
+
__assign = Object.assign || function(t) {
|
|
3
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
4
|
+
s = arguments[i];
|
|
5
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
6
|
+
t[p] = s[p];
|
|
7
|
+
}
|
|
8
|
+
return t;
|
|
9
|
+
};
|
|
10
|
+
return __assign.apply(this, arguments);
|
|
11
|
+
};
|
|
12
|
+
var __values = (this && this.__values) || function(o) {
|
|
13
|
+
var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
|
|
14
|
+
if (m) return m.call(o);
|
|
15
|
+
if (o && typeof o.length === "number") return {
|
|
16
|
+
next: function () {
|
|
17
|
+
if (o && i >= o.length) o = void 0;
|
|
18
|
+
return { value: o && o[i++], done: !o };
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
|
22
|
+
};
|
|
23
|
+
var __read = (this && this.__read) || function (o, n) {
|
|
24
|
+
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
25
|
+
if (!m) return o;
|
|
26
|
+
var i = m.call(o), r, ar = [], e;
|
|
27
|
+
try {
|
|
28
|
+
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
29
|
+
}
|
|
30
|
+
catch (error) { e = { error: error }; }
|
|
31
|
+
finally {
|
|
32
|
+
try {
|
|
33
|
+
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
34
|
+
}
|
|
35
|
+
finally { if (e) throw e.error; }
|
|
36
|
+
}
|
|
37
|
+
return ar;
|
|
38
|
+
};
|
|
39
|
+
import { _base64Encode, _entries, _extend } from './utils';
|
|
40
|
+
import { PERSISTENCE_EARLY_ACCESS_FEATURES, ENABLED_FEATURE_FLAGS, STORED_GROUP_PROPERTIES_KEY, STORED_PERSON_PROPERTIES_KEY, FLAG_CALL_REPORTED, } from './constants';
|
|
41
|
+
var PERSISTENCE_ACTIVE_FEATURE_FLAGS = '$active_feature_flags';
|
|
42
|
+
var PERSISTENCE_OVERRIDE_FEATURE_FLAGS = '$override_feature_flags';
|
|
43
|
+
var PERSISTENCE_FEATURE_FLAG_PAYLOADS = '$feature_flag_payloads';
|
|
44
|
+
export var filterActiveFeatureFlags = function (featureFlags) {
|
|
45
|
+
var e_1, _a;
|
|
46
|
+
var activeFeatureFlags = {};
|
|
47
|
+
try {
|
|
48
|
+
for (var _b = __values(_entries(featureFlags || {})), _c = _b.next(); !_c.done; _c = _b.next()) {
|
|
49
|
+
var _d = __read(_c.value, 2), key = _d[0], value = _d[1];
|
|
50
|
+
if (value) {
|
|
51
|
+
activeFeatureFlags[key] = value;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
catch (e_1_1) { e_1 = { error: e_1_1 }; }
|
|
56
|
+
finally {
|
|
57
|
+
try {
|
|
58
|
+
if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
|
59
|
+
}
|
|
60
|
+
finally { if (e_1) throw e_1.error; }
|
|
61
|
+
}
|
|
62
|
+
return activeFeatureFlags;
|
|
63
|
+
};
|
|
64
|
+
export var parseFeatureFlagDecideResponse = function (response, persistence, currentFlags, currentFlagPayloads) {
|
|
65
|
+
var _a, _b;
|
|
66
|
+
if (currentFlags === void 0) { currentFlags = {}; }
|
|
67
|
+
if (currentFlagPayloads === void 0) { currentFlagPayloads = {}; }
|
|
68
|
+
var flags = response['featureFlags'];
|
|
69
|
+
var flagPayloads = response['featureFlagPayloads'];
|
|
70
|
+
if (flags) {
|
|
71
|
+
// using the v1 api
|
|
72
|
+
if (Array.isArray(flags)) {
|
|
73
|
+
var $enabled_feature_flags = {};
|
|
74
|
+
if (flags) {
|
|
75
|
+
for (var i = 0; i < flags.length; i++) {
|
|
76
|
+
$enabled_feature_flags[flags[i]] = true;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
persistence &&
|
|
80
|
+
persistence.register((_a = {},
|
|
81
|
+
_a[PERSISTENCE_ACTIVE_FEATURE_FLAGS] = flags,
|
|
82
|
+
_a[ENABLED_FEATURE_FLAGS] = $enabled_feature_flags,
|
|
83
|
+
_a));
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
// using the v2+ api
|
|
87
|
+
var newFeatureFlags = flags;
|
|
88
|
+
var newFeatureFlagPayloads = flagPayloads;
|
|
89
|
+
if (response.errorsWhileComputingFlags) {
|
|
90
|
+
// if not all flags were computed, we upsert flags instead of replacing them
|
|
91
|
+
newFeatureFlags = __assign(__assign({}, currentFlags), newFeatureFlags);
|
|
92
|
+
newFeatureFlagPayloads = __assign(__assign({}, currentFlagPayloads), newFeatureFlagPayloads);
|
|
93
|
+
}
|
|
94
|
+
persistence &&
|
|
95
|
+
persistence.register((_b = {},
|
|
96
|
+
_b[PERSISTENCE_ACTIVE_FEATURE_FLAGS] = Object.keys(filterActiveFeatureFlags(newFeatureFlags)),
|
|
97
|
+
_b[ENABLED_FEATURE_FLAGS] = newFeatureFlags || {},
|
|
98
|
+
_b[PERSISTENCE_FEATURE_FLAG_PAYLOADS] = newFeatureFlagPayloads || {},
|
|
99
|
+
_b));
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
var PostHogFeatureFlags = /** @class */ (function () {
|
|
104
|
+
function PostHogFeatureFlags(instance) {
|
|
105
|
+
this.instance = instance;
|
|
106
|
+
this._override_warning = false;
|
|
107
|
+
this.featureFlagEventHandlers = [];
|
|
108
|
+
this.reloadFeatureFlagsQueued = false;
|
|
109
|
+
this.reloadFeatureFlagsInAction = false;
|
|
110
|
+
}
|
|
111
|
+
PostHogFeatureFlags.prototype.getFlags = function () {
|
|
112
|
+
return Object.keys(this.getFlagVariants());
|
|
113
|
+
};
|
|
114
|
+
PostHogFeatureFlags.prototype.getFlagVariants = function () {
|
|
115
|
+
var enabledFlags = this.instance.get_property(ENABLED_FEATURE_FLAGS);
|
|
116
|
+
var overriddenFlags = this.instance.get_property(PERSISTENCE_OVERRIDE_FEATURE_FLAGS);
|
|
117
|
+
if (!overriddenFlags) {
|
|
118
|
+
return enabledFlags || {};
|
|
119
|
+
}
|
|
120
|
+
var finalFlags = _extend({}, enabledFlags);
|
|
121
|
+
var overriddenKeys = Object.keys(overriddenFlags);
|
|
122
|
+
for (var i = 0; i < overriddenKeys.length; i++) {
|
|
123
|
+
if (overriddenFlags[overriddenKeys[i]] === false) {
|
|
124
|
+
delete finalFlags[overriddenKeys[i]];
|
|
125
|
+
}
|
|
126
|
+
else {
|
|
127
|
+
finalFlags[overriddenKeys[i]] = overriddenFlags[overriddenKeys[i]];
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (!this._override_warning) {
|
|
131
|
+
console.warn('[PostHog] Overriding feature flags!', {
|
|
132
|
+
enabledFlags: enabledFlags,
|
|
133
|
+
overriddenFlags: overriddenFlags,
|
|
134
|
+
finalFlags: finalFlags,
|
|
135
|
+
});
|
|
136
|
+
this._override_warning = true;
|
|
137
|
+
}
|
|
138
|
+
return finalFlags;
|
|
139
|
+
};
|
|
140
|
+
PostHogFeatureFlags.prototype.getFlagPayloads = function () {
|
|
141
|
+
var flagPayloads = this.instance.get_property(PERSISTENCE_FEATURE_FLAG_PAYLOADS);
|
|
142
|
+
return flagPayloads || {};
|
|
143
|
+
};
|
|
144
|
+
/**
|
|
145
|
+
* Reloads feature flags asynchronously.
|
|
146
|
+
*
|
|
147
|
+
* Constraints:
|
|
148
|
+
*
|
|
149
|
+
* 1. Avoid parallel requests
|
|
150
|
+
* 2. Delay a few milliseconds after each reloadFeatureFlags call to batch subsequent changes together
|
|
151
|
+
* 3. Don't call this during initial load (as /decide will be called instead), see posthog-core.js
|
|
152
|
+
*/
|
|
153
|
+
PostHogFeatureFlags.prototype.reloadFeatureFlags = function () {
|
|
154
|
+
if (!this.reloadFeatureFlagsQueued) {
|
|
155
|
+
this.reloadFeatureFlagsQueued = true;
|
|
156
|
+
this._startReloadTimer();
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
PostHogFeatureFlags.prototype.setAnonymousDistinctId = function (anon_distinct_id) {
|
|
160
|
+
this.$anon_distinct_id = anon_distinct_id;
|
|
161
|
+
};
|
|
162
|
+
PostHogFeatureFlags.prototype.setReloadingPaused = function (isPaused) {
|
|
163
|
+
this.reloadFeatureFlagsInAction = isPaused;
|
|
164
|
+
};
|
|
165
|
+
PostHogFeatureFlags.prototype.resetRequestQueue = function () {
|
|
166
|
+
this.reloadFeatureFlagsQueued = false;
|
|
167
|
+
};
|
|
168
|
+
PostHogFeatureFlags.prototype._startReloadTimer = function () {
|
|
169
|
+
var _this = this;
|
|
170
|
+
if (this.reloadFeatureFlagsQueued && !this.reloadFeatureFlagsInAction) {
|
|
171
|
+
setTimeout(function () {
|
|
172
|
+
if (!_this.reloadFeatureFlagsInAction && _this.reloadFeatureFlagsQueued) {
|
|
173
|
+
_this.reloadFeatureFlagsQueued = false;
|
|
174
|
+
_this._reloadFeatureFlagsRequest();
|
|
175
|
+
}
|
|
176
|
+
}, 5);
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
PostHogFeatureFlags.prototype._reloadFeatureFlagsRequest = function () {
|
|
180
|
+
var _this = this;
|
|
181
|
+
this.setReloadingPaused(true);
|
|
182
|
+
var token = this.instance.get_config('token');
|
|
183
|
+
var personProperties = this.instance.get_property(STORED_PERSON_PROPERTIES_KEY);
|
|
184
|
+
var groupProperties = this.instance.get_property(STORED_GROUP_PROPERTIES_KEY);
|
|
185
|
+
var json_data = JSON.stringify({
|
|
186
|
+
token: token,
|
|
187
|
+
distinct_id: this.instance.get_distinct_id(),
|
|
188
|
+
groups: this.instance.getGroups(),
|
|
189
|
+
$anon_distinct_id: this.$anon_distinct_id,
|
|
190
|
+
person_properties: personProperties,
|
|
191
|
+
group_properties: groupProperties,
|
|
192
|
+
disable_flags: this.instance.get_config('advanced_disable_feature_flags') || undefined,
|
|
193
|
+
});
|
|
194
|
+
var encoded_data = _base64Encode(json_data);
|
|
195
|
+
this.instance._send_request(this.instance.get_config('api_host') + '/decide/?v=3', { data: encoded_data }, { method: 'POST' }, this.instance._prepare_callback(function (response) {
|
|
196
|
+
// reset anon_distinct_id after at least a single request with it
|
|
197
|
+
// makes it through
|
|
198
|
+
_this.$anon_distinct_id = undefined;
|
|
199
|
+
_this.receivedFeatureFlags(response);
|
|
200
|
+
// :TRICKY: Reload - start another request if queued!
|
|
201
|
+
_this.setReloadingPaused(false);
|
|
202
|
+
_this._startReloadTimer();
|
|
203
|
+
}));
|
|
204
|
+
};
|
|
205
|
+
/*
|
|
206
|
+
* Get feature flag's value for user.
|
|
207
|
+
*
|
|
208
|
+
* ### Usage:
|
|
209
|
+
*
|
|
210
|
+
* if(posthog.getFeatureFlag('my-flag') === 'some-variant') { // do something }
|
|
211
|
+
*
|
|
212
|
+
* @param {Object|String} key Key of the feature flag.
|
|
213
|
+
* @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.
|
|
214
|
+
*/
|
|
215
|
+
PostHogFeatureFlags.prototype.getFeatureFlag = function (key, options) {
|
|
216
|
+
var _a;
|
|
217
|
+
if (options === void 0) { options = {}; }
|
|
218
|
+
if (!this.instance.decideEndpointWasHit && !(this.getFlags() && this.getFlags().length > 0)) {
|
|
219
|
+
console.warn('getFeatureFlag for key "' + key + '" failed. Feature flags didn\'t load in time.');
|
|
220
|
+
return undefined;
|
|
221
|
+
}
|
|
222
|
+
var flagValue = this.getFlagVariants()[key];
|
|
223
|
+
var flagReportValue = "".concat(flagValue);
|
|
224
|
+
var flagCallReported = this.instance.get_property(FLAG_CALL_REPORTED) || {};
|
|
225
|
+
if (options.send_event || !('send_event' in options)) {
|
|
226
|
+
if (!(key in flagCallReported) || !flagCallReported[key].includes(flagReportValue)) {
|
|
227
|
+
if (Array.isArray(flagCallReported[key])) {
|
|
228
|
+
flagCallReported[key].push(flagReportValue);
|
|
229
|
+
}
|
|
230
|
+
else {
|
|
231
|
+
flagCallReported[key] = [flagReportValue];
|
|
232
|
+
}
|
|
233
|
+
this.instance.persistence.register((_a = {}, _a[FLAG_CALL_REPORTED] = flagCallReported, _a));
|
|
234
|
+
this.instance.capture('$feature_flag_called', { $feature_flag: key, $feature_flag_response: flagValue });
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return flagValue;
|
|
238
|
+
};
|
|
239
|
+
PostHogFeatureFlags.prototype.getFeatureFlagPayload = function (key) {
|
|
240
|
+
var payloads = this.getFlagPayloads();
|
|
241
|
+
return payloads[key];
|
|
242
|
+
};
|
|
243
|
+
/*
|
|
244
|
+
* See if feature flag is enabled for user.
|
|
245
|
+
*
|
|
246
|
+
* ### Usage:
|
|
247
|
+
*
|
|
248
|
+
* if(posthog.isFeatureEnabled('beta-feature')) { // do something }
|
|
249
|
+
*
|
|
250
|
+
* @param {Object|String} key Key of the feature flag.
|
|
251
|
+
* @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.
|
|
252
|
+
*/
|
|
253
|
+
PostHogFeatureFlags.prototype.isFeatureEnabled = function (key, options) {
|
|
254
|
+
if (options === void 0) { options = {}; }
|
|
255
|
+
if (!this.instance.decideEndpointWasHit && !(this.getFlags() && this.getFlags().length > 0)) {
|
|
256
|
+
console.warn('isFeatureEnabled for key "' + key + '" failed. Feature flags didn\'t load in time.');
|
|
257
|
+
return undefined;
|
|
258
|
+
}
|
|
259
|
+
return !!this.getFeatureFlag(key, options);
|
|
260
|
+
};
|
|
261
|
+
PostHogFeatureFlags.prototype.addFeatureFlagsHandler = function (handler) {
|
|
262
|
+
this.featureFlagEventHandlers.push(handler);
|
|
263
|
+
};
|
|
264
|
+
PostHogFeatureFlags.prototype.removeFeatureFlagsHandler = function (handler) {
|
|
265
|
+
this.featureFlagEventHandlers = this.featureFlagEventHandlers.filter(function (h) { return h !== handler; });
|
|
266
|
+
};
|
|
267
|
+
PostHogFeatureFlags.prototype.receivedFeatureFlags = function (response) {
|
|
268
|
+
this.instance.decideEndpointWasHit = true;
|
|
269
|
+
var currentFlags = this.getFlagVariants();
|
|
270
|
+
var currentFlagPayloads = this.getFlagPayloads();
|
|
271
|
+
parseFeatureFlagDecideResponse(response, this.instance.persistence, currentFlags, currentFlagPayloads);
|
|
272
|
+
this._fireFeatureFlagsCallbacks();
|
|
273
|
+
};
|
|
274
|
+
/*
|
|
275
|
+
* Override feature flags for debugging.
|
|
276
|
+
*
|
|
277
|
+
* ### Usage:
|
|
278
|
+
*
|
|
279
|
+
* - posthog.feature_flags.override(false)
|
|
280
|
+
* - posthog.feature_flags.override(['beta-feature'])
|
|
281
|
+
* - posthog.feature_flags.override({'beta-feature': 'variant', 'other-feature': True})
|
|
282
|
+
*
|
|
283
|
+
* @param {Object|Array|String} flags Flags to override with.
|
|
284
|
+
*/
|
|
285
|
+
PostHogFeatureFlags.prototype.override = function (flags) {
|
|
286
|
+
var _a, _b;
|
|
287
|
+
this._override_warning = false;
|
|
288
|
+
if (flags === false) {
|
|
289
|
+
this.instance.persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAGS);
|
|
290
|
+
}
|
|
291
|
+
else if (Array.isArray(flags)) {
|
|
292
|
+
var flagsObj = {};
|
|
293
|
+
for (var i = 0; i < flags.length; i++) {
|
|
294
|
+
flagsObj[flags[i]] = true;
|
|
295
|
+
}
|
|
296
|
+
this.instance.persistence.register((_a = {}, _a[PERSISTENCE_OVERRIDE_FEATURE_FLAGS] = flagsObj, _a));
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
this.instance.persistence.register((_b = {}, _b[PERSISTENCE_OVERRIDE_FEATURE_FLAGS] = flags, _b));
|
|
300
|
+
}
|
|
301
|
+
};
|
|
302
|
+
/*
|
|
303
|
+
* Register an event listener that runs when feature flags become available or when they change.
|
|
304
|
+
* If there are flags, the listener is called immediately in addition to being called on future changes.
|
|
305
|
+
*
|
|
306
|
+
* ### Usage:
|
|
307
|
+
*
|
|
308
|
+
* posthog.onFeatureFlags(function(featureFlags) { // do something })
|
|
309
|
+
*
|
|
310
|
+
* @param {Function} [callback] The callback function will be called once the feature flags are ready or when they are updated.
|
|
311
|
+
* It'll return a list of feature flags enabled for the user.
|
|
312
|
+
* @returns {Function} A function that can be called to unsubscribe the listener. Used by useEffect when the component unmounts.
|
|
313
|
+
*/
|
|
314
|
+
PostHogFeatureFlags.prototype.onFeatureFlags = function (callback) {
|
|
315
|
+
var _this = this;
|
|
316
|
+
this.addFeatureFlagsHandler(callback);
|
|
317
|
+
if (this.instance.decideEndpointWasHit) {
|
|
318
|
+
var _a = this._prepareFeatureFlagsForCallbacks(), flags = _a.flags, flagVariants = _a.flagVariants;
|
|
319
|
+
callback(flags, flagVariants);
|
|
320
|
+
}
|
|
321
|
+
return function () { return _this.removeFeatureFlagsHandler(callback); };
|
|
322
|
+
};
|
|
323
|
+
PostHogFeatureFlags.prototype.updateEarlyAccessFeatureEnrollment = function (key, isEnrolled) {
|
|
324
|
+
var _a, _b, _c;
|
|
325
|
+
var enrollmentPersonProp = (_a = {},
|
|
326
|
+
_a["$feature_enrollment/".concat(key)] = isEnrolled,
|
|
327
|
+
_a);
|
|
328
|
+
this.instance.capture('$feature_enrollment_update', {
|
|
329
|
+
$feature_flag: key,
|
|
330
|
+
$feature_enrollment: isEnrolled,
|
|
331
|
+
$set: enrollmentPersonProp,
|
|
332
|
+
});
|
|
333
|
+
this.setPersonPropertiesForFlags(enrollmentPersonProp, false);
|
|
334
|
+
var newFlags = __assign(__assign({}, this.getFlagVariants()), (_b = {}, _b[key] = isEnrolled, _b));
|
|
335
|
+
this.instance.persistence.register((_c = {},
|
|
336
|
+
_c[PERSISTENCE_ACTIVE_FEATURE_FLAGS] = Object.keys(filterActiveFeatureFlags(newFlags)),
|
|
337
|
+
_c[ENABLED_FEATURE_FLAGS] = newFlags,
|
|
338
|
+
_c));
|
|
339
|
+
this._fireFeatureFlagsCallbacks();
|
|
340
|
+
};
|
|
341
|
+
PostHogFeatureFlags.prototype.getEarlyAccessFeatures = function (callback, force_reload) {
|
|
342
|
+
var _this = this;
|
|
343
|
+
if (force_reload === void 0) { force_reload = false; }
|
|
344
|
+
var existing_early_access_features = this.instance.get_property(PERSISTENCE_EARLY_ACCESS_FEATURES);
|
|
345
|
+
if (!existing_early_access_features || force_reload) {
|
|
346
|
+
this.instance._send_request("".concat(this.instance.get_config('api_host'), "/api/early_access_features/?token=").concat(this.instance.get_config('token')), {}, { method: 'GET' }, function (response) {
|
|
347
|
+
var _a;
|
|
348
|
+
var earlyAccessFeatures = response.earlyAccessFeatures;
|
|
349
|
+
_this.instance.persistence.register((_a = {}, _a[PERSISTENCE_EARLY_ACCESS_FEATURES] = earlyAccessFeatures, _a));
|
|
350
|
+
return callback(earlyAccessFeatures);
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
else {
|
|
354
|
+
return callback(existing_early_access_features);
|
|
355
|
+
}
|
|
356
|
+
};
|
|
357
|
+
PostHogFeatureFlags.prototype._prepareFeatureFlagsForCallbacks = function () {
|
|
358
|
+
var flags = this.getFlags();
|
|
359
|
+
var flagVariants = this.getFlagVariants();
|
|
360
|
+
// Return truthy
|
|
361
|
+
var truthyFlags = flags.filter(function (flag) { return flagVariants[flag]; });
|
|
362
|
+
var truthyFlagVariants = Object.keys(flagVariants)
|
|
363
|
+
.filter(function (variantKey) { return flagVariants[variantKey]; })
|
|
364
|
+
.reduce(function (res, key) {
|
|
365
|
+
res[key] = flagVariants[key];
|
|
366
|
+
return res;
|
|
367
|
+
}, {});
|
|
368
|
+
return {
|
|
369
|
+
flags: truthyFlags,
|
|
370
|
+
flagVariants: truthyFlagVariants,
|
|
371
|
+
};
|
|
372
|
+
};
|
|
373
|
+
PostHogFeatureFlags.prototype._fireFeatureFlagsCallbacks = function () {
|
|
374
|
+
var _a = this._prepareFeatureFlagsForCallbacks(), flags = _a.flags, flagVariants = _a.flagVariants;
|
|
375
|
+
this.featureFlagEventHandlers.forEach(function (handler) { return handler(flags, flagVariants); });
|
|
376
|
+
};
|
|
377
|
+
/**
|
|
378
|
+
* Set override person properties for feature flags.
|
|
379
|
+
* This is used when dealing with new persons / where you don't want to wait for ingestion
|
|
380
|
+
* to update user properties.
|
|
381
|
+
*/
|
|
382
|
+
PostHogFeatureFlags.prototype.setPersonPropertiesForFlags = function (properties, reloadFeatureFlags) {
|
|
383
|
+
var _a;
|
|
384
|
+
if (reloadFeatureFlags === void 0) { reloadFeatureFlags = true; }
|
|
385
|
+
// Get persisted person properties
|
|
386
|
+
var existingProperties = this.instance.get_property(STORED_PERSON_PROPERTIES_KEY) || {};
|
|
387
|
+
this.instance.register((_a = {},
|
|
388
|
+
_a[STORED_PERSON_PROPERTIES_KEY] = __assign(__assign({}, existingProperties), properties),
|
|
389
|
+
_a));
|
|
390
|
+
if (reloadFeatureFlags) {
|
|
391
|
+
this.instance.reloadFeatureFlags();
|
|
392
|
+
}
|
|
393
|
+
};
|
|
394
|
+
PostHogFeatureFlags.prototype.resetPersonPropertiesForFlags = function () {
|
|
395
|
+
this.instance.unregister(STORED_PERSON_PROPERTIES_KEY);
|
|
396
|
+
};
|
|
397
|
+
/**
|
|
398
|
+
* Set override group properties for feature flags.
|
|
399
|
+
* This is used when dealing with new groups / where you don't want to wait for ingestion
|
|
400
|
+
* to update properties.
|
|
401
|
+
* Takes in an object, the key of which is the group type.
|
|
402
|
+
* For example:
|
|
403
|
+
* setGroupPropertiesForFlags({'organization': { name: 'CYZ', employees: '11' } })
|
|
404
|
+
*/
|
|
405
|
+
PostHogFeatureFlags.prototype.setGroupPropertiesForFlags = function (properties, reloadFeatureFlags) {
|
|
406
|
+
var _a;
|
|
407
|
+
if (reloadFeatureFlags === void 0) { reloadFeatureFlags = true; }
|
|
408
|
+
// Get persisted group properties
|
|
409
|
+
var existingProperties = this.instance.get_property(STORED_GROUP_PROPERTIES_KEY) || {};
|
|
410
|
+
if (Object.keys(existingProperties).length !== 0) {
|
|
411
|
+
Object.keys(existingProperties).forEach(function (groupType) {
|
|
412
|
+
existingProperties[groupType] = __assign(__assign({}, existingProperties[groupType]), properties[groupType]);
|
|
413
|
+
delete properties[groupType];
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
this.instance.register((_a = {},
|
|
417
|
+
_a[STORED_GROUP_PROPERTIES_KEY] = __assign(__assign({}, existingProperties), properties),
|
|
418
|
+
_a));
|
|
419
|
+
if (reloadFeatureFlags) {
|
|
420
|
+
this.instance.reloadFeatureFlags();
|
|
421
|
+
}
|
|
422
|
+
};
|
|
423
|
+
PostHogFeatureFlags.prototype.resetGroupPropertiesForFlags = function (group_type) {
|
|
424
|
+
var _a, _b;
|
|
425
|
+
if (group_type) {
|
|
426
|
+
var existingProperties = this.instance.get_property(STORED_GROUP_PROPERTIES_KEY) || {};
|
|
427
|
+
this.instance.register((_a = {},
|
|
428
|
+
_a[STORED_GROUP_PROPERTIES_KEY] = __assign(__assign({}, existingProperties), (_b = {}, _b[group_type] = {}, _b)),
|
|
429
|
+
_a));
|
|
430
|
+
}
|
|
431
|
+
else {
|
|
432
|
+
this.instance.unregister(STORED_GROUP_PROPERTIES_KEY);
|
|
433
|
+
}
|
|
434
|
+
};
|
|
435
|
+
return PostHogFeatureFlags;
|
|
436
|
+
}());
|
|
437
|
+
export { PostHogFeatureFlags };
|
|
438
|
+
//# sourceMappingURL=posthog-featureflags.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"posthog-featureflags.js","sourceRoot":"","sources":["../../src/posthog-featureflags.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,SAAS,CAAA;AAa1D,OAAO,EACH,iCAAiC,EACjC,qBAAqB,EACrB,2BAA2B,EAC3B,4BAA4B,EAC5B,kBAAkB,GACrB,MAAM,aAAa,CAAA;AAEpB,IAAM,gCAAgC,GAAG,uBAAuB,CAAA;AAChE,IAAM,kCAAkC,GAAG,yBAAyB,CAAA;AACpE,IAAM,iCAAiC,GAAG,wBAAwB,CAAA;AAElE,MAAM,CAAC,IAAM,wBAAwB,GAAG,UAAC,YAA+C;;IACpF,IAAM,kBAAkB,GAAqC,EAAE,CAAA;;QAC/D,KAA2B,IAAA,KAAA,SAAA,QAAQ,CAAC,YAAY,IAAI,EAAE,CAAC,CAAA,gBAAA,4BAAE;YAA9C,IAAA,KAAA,mBAAY,EAAX,GAAG,QAAA,EAAE,KAAK,QAAA;YAClB,IAAI,KAAK,EAAE;gBACP,kBAAkB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;aAClC;SACJ;;;;;;;;;IACD,OAAO,kBAAkB,CAAA;AAC7B,CAAC,CAAA;AAED,MAAM,CAAC,IAAM,8BAA8B,GAAG,UAC1C,QAAiC,EACjC,WAA+B,EAC/B,YAAmD,EACnD,mBAAkD;;IADlD,6BAAA,EAAA,iBAAmD;IACnD,oCAAA,EAAA,wBAAkD;IAElD,IAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,CAAA;IACtC,IAAM,YAAY,GAAG,QAAQ,CAAC,qBAAqB,CAAC,CAAA;IACpD,IAAI,KAAK,EAAE;QACP,mBAAmB;QACnB,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YACtB,IAAM,sBAAsB,GAA4B,EAAE,CAAA;YAC1D,IAAI,KAAK,EAAE;gBACP,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;oBACnC,sBAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;iBAC1C;aACJ;YACD,WAAW;gBACP,WAAW,CAAC,QAAQ;oBAChB,GAAC,gCAAgC,IAAG,KAAK;oBACzC,GAAC,qBAAqB,IAAG,sBAAsB;wBACjD,CAAA;SACT;aAAM;YACH,oBAAoB;YACpB,IAAI,eAAe,GAAG,KAAK,CAAA;YAC3B,IAAI,sBAAsB,GAAG,YAAY,CAAA;YACzC,IAAI,QAAQ,CAAC,yBAAyB,EAAE;gBACpC,4EAA4E;gBAC5E,eAAe,yBAAQ,YAAY,GAAK,eAAe,CAAE,CAAA;gBACzD,sBAAsB,yBAAQ,mBAAmB,GAAK,sBAAsB,CAAE,CAAA;aACjF;YACD,WAAW;gBACP,WAAW,CAAC,QAAQ;oBAChB,GAAC,gCAAgC,IAAG,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,eAAe,CAAC,CAAC;oBAC1F,GAAC,qBAAqB,IAAG,eAAe,IAAI,EAAE;oBAC9C,GAAC,iCAAiC,IAAG,sBAAsB,IAAI,EAAE;wBACnE,CAAA;SACT;KACJ;AACL,CAAC,CAAA;AAED;IAQI,6BAAY,QAAiB;QACzB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAA;QACxB,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAA;QAC9B,IAAI,CAAC,wBAAwB,GAAG,EAAE,CAAA;QAElC,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAA;QACrC,IAAI,CAAC,0BAA0B,GAAG,KAAK,CAAA;IAC3C,CAAC;IAED,sCAAQ,GAAR;QACI,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,CAAA;IAC9C,CAAC;IAED,6CAAe,GAAf;QACI,IAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,qBAAqB,CAAC,CAAA;QACtE,IAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,kCAAkC,CAAC,CAAA;QACtF,IAAI,CAAC,eAAe,EAAE;YAClB,OAAO,YAAY,IAAI,EAAE,CAAA;SAC5B;QAED,IAAM,UAAU,GAAG,OAAO,CAAC,EAAE,EAAE,YAAY,CAAC,CAAA;QAC5C,IAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QACnD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YAC5C,IAAI,eAAe,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE;gBAC9C,OAAO,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;aACvC;iBAAM;gBACH,UAAU,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,eAAe,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAA;aACrE;SACJ;QACD,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE;YACzB,OAAO,CAAC,IAAI,CAAC,qCAAqC,EAAE;gBAChD,YAAY,cAAA;gBACZ,eAAe,iBAAA;gBACf,UAAU,YAAA;aACb,CAAC,CAAA;YACF,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAA;SAChC;QACD,OAAO,UAAU,CAAA;IACrB,CAAC;IAED,6CAAe,GAAf;QACI,IAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,iCAAiC,CAAC,CAAA;QAClF,OAAO,YAAY,IAAI,EAAE,CAAA;IAC7B,CAAC;IAED;;;;;;;;OAQG;IACH,gDAAkB,GAAlB;QACI,IAAI,CAAC,IAAI,CAAC,wBAAwB,EAAE;YAChC,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAA;YACpC,IAAI,CAAC,iBAAiB,EAAE,CAAA;SAC3B;IACL,CAAC;IAED,oDAAsB,GAAtB,UAAuB,gBAAwB;QAC3C,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAA;IAC7C,CAAC;IAED,gDAAkB,GAAlB,UAAmB,QAAiB;QAChC,IAAI,CAAC,0BAA0B,GAAG,QAAQ,CAAA;IAC9C,CAAC;IAED,+CAAiB,GAAjB;QACI,IAAI,CAAC,wBAAwB,GAAG,KAAK,CAAA;IACzC,CAAC;IAED,+CAAiB,GAAjB;QAAA,iBASC;QARG,IAAI,IAAI,CAAC,wBAAwB,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE;YACnE,UAAU,CAAC;gBACP,IAAI,CAAC,KAAI,CAAC,0BAA0B,IAAI,KAAI,CAAC,wBAAwB,EAAE;oBACnE,KAAI,CAAC,wBAAwB,GAAG,KAAK,CAAA;oBACrC,KAAI,CAAC,0BAA0B,EAAE,CAAA;iBACpC;YACL,CAAC,EAAE,CAAC,CAAC,CAAA;SACR;IACL,CAAC;IAED,wDAA0B,GAA1B;QAAA,iBA+BC;QA9BG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAA;QAC7B,IAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAA;QAC/C,IAAM,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,4BAA4B,CAAC,CAAA;QACjF,IAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,2BAA2B,CAAC,CAAA;QAC/E,IAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YAC7B,KAAK,EAAE,KAAK;YACZ,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,eAAe,EAAE;YAC5C,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE;YACjC,iBAAiB,EAAE,IAAI,CAAC,iBAAiB;YACzC,iBAAiB,EAAE,gBAAgB;YACnC,gBAAgB,EAAE,eAAe;YACjC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,gCAAgC,CAAC,IAAI,SAAS;SACzF,CAAC,CAAA;QAEF,IAAM,YAAY,GAAG,aAAa,CAAC,SAAS,CAAC,CAAA;QAC7C,IAAI,CAAC,QAAQ,CAAC,aAAa,CACvB,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,cAAc,EACrD,EAAE,IAAI,EAAE,YAAY,EAAE,EACtB,EAAE,MAAM,EAAE,MAAM,EAAE,EAClB,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,UAAC,QAAQ;YACrC,iEAAiE;YACjE,mBAAmB;YACnB,KAAI,CAAC,iBAAiB,GAAG,SAAS,CAAA;YAClC,KAAI,CAAC,oBAAoB,CAAC,QAA0B,CAAC,CAAA;YAErD,qDAAqD;YACrD,KAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAA;YAC9B,KAAI,CAAC,iBAAiB,EAAE,CAAA;QAC5B,CAAC,CAAoB,CACxB,CAAA;IACL,CAAC;IAED;;;;;;;;;OASG;IACH,4CAAc,GAAd,UAAe,GAAW,EAAE,OAAsC;;QAAtC,wBAAA,EAAA,YAAsC;QAC9D,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,oBAAoB,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE;YACzF,OAAO,CAAC,IAAI,CAAC,0BAA0B,GAAG,GAAG,GAAG,+CAA+C,CAAC,CAAA;YAChG,OAAO,SAAS,CAAA;SACnB;QACD,IAAM,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,GAAG,CAAC,CAAA;QAC7C,IAAM,eAAe,GAAG,UAAG,SAAS,CAAE,CAAA;QACtC,IAAM,gBAAgB,GAA6B,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,kBAAkB,CAAC,IAAI,EAAE,CAAA;QAEvG,IAAI,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC,YAAY,IAAI,OAAO,CAAC,EAAE;YAClD,IAAI,CAAC,CAAC,GAAG,IAAI,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE;gBAChF,IAAI,KAAK,CAAC,OAAO,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,EAAE;oBACtC,gBAAgB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;iBAC9C;qBAAM;oBACH,gBAAgB,CAAC,GAAG,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;iBAC5C;gBACD,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,WAAG,GAAC,kBAAkB,IAAG,gBAAgB,MAAG,CAAA;gBAE9E,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,sBAAsB,EAAE,EAAE,aAAa,EAAE,GAAG,EAAE,sBAAsB,EAAE,SAAS,EAAE,CAAC,CAAA;aAC3G;SACJ;QACD,OAAO,SAAS,CAAA;IACpB,CAAC;IAED,mDAAqB,GAArB,UAAsB,GAAW;QAC7B,IAAM,QAAQ,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;QACvC,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAA;IACxB,CAAC;IAED;;;;;;;;;OASG;IACH,8CAAgB,GAAhB,UAAiB,GAAW,EAAE,OAAsC;QAAtC,wBAAA,EAAA,YAAsC;QAChE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,oBAAoB,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE;YACzF,OAAO,CAAC,IAAI,CAAC,4BAA4B,GAAG,GAAG,GAAG,+CAA+C,CAAC,CAAA;YAClG,OAAO,SAAS,CAAA;SACnB;QACD,OAAO,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAA;IAC9C,CAAC;IAED,oDAAsB,GAAtB,UAAuB,OAA6B;QAChD,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IAC/C,CAAC;IAED,uDAAyB,GAAzB,UAA0B,OAA6B;QACnD,IAAI,CAAC,wBAAwB,GAAG,IAAI,CAAC,wBAAwB,CAAC,MAAM,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,KAAK,OAAO,EAAb,CAAa,CAAC,CAAA;IAC9F,CAAC;IAED,kDAAoB,GAApB,UAAqB,QAAiC;QAClD,IAAI,CAAC,QAAQ,CAAC,oBAAoB,GAAG,IAAI,CAAA;QACzC,IAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;QAC3C,IAAM,mBAAmB,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;QAClD,8BAA8B,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,YAAY,EAAE,mBAAmB,CAAC,CAAA;QACtG,IAAI,CAAC,0BAA0B,EAAE,CAAA;IACrC,CAAC;IAED;;;;;;;;;;OAUG;IACH,sCAAQ,GAAR,UAAS,KAA4D;;QACjE,IAAI,CAAC,iBAAiB,GAAG,KAAK,CAAA;QAE9B,IAAI,KAAK,KAAK,KAAK,EAAE;YACjB,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,UAAU,CAAC,kCAAkC,CAAC,CAAA;SAC3E;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE;YAC7B,IAAM,QAAQ,GAAqC,EAAE,CAAA;YACrD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;gBACnC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;aAC5B;YACD,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,WAAG,GAAC,kCAAkC,IAAG,QAAQ,MAAG,CAAA;SACzF;aAAM;YACH,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,WAAG,GAAC,kCAAkC,IAAG,KAAK,MAAG,CAAA;SACtF;IACL,CAAC;IACD;;;;;;;;;;;OAWG;IACH,4CAAc,GAAd,UAAe,QAA8B;QAA7C,iBAOC;QANG,IAAI,CAAC,sBAAsB,CAAC,QAAQ,CAAC,CAAA;QACrC,IAAI,IAAI,CAAC,QAAQ,CAAC,oBAAoB,EAAE;YAC9B,IAAA,KAA0B,IAAI,CAAC,gCAAgC,EAAE,EAA/D,KAAK,WAAA,EAAE,YAAY,kBAA4C,CAAA;YACvE,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,CAAA;SAChC;QACD,OAAO,cAAM,OAAA,KAAI,CAAC,yBAAyB,CAAC,QAAQ,CAAC,EAAxC,CAAwC,CAAA;IACzD,CAAC;IAED,gEAAkC,GAAlC,UAAmC,GAAW,EAAE,UAAmB;;QAC/D,IAAM,oBAAoB;YACtB,GAAC,8BAAuB,GAAG,CAAE,IAAG,UAAU;eAC7C,CAAA;QACD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,4BAA4B,EAAE;YAChD,aAAa,EAAE,GAAG;YAClB,mBAAmB,EAAE,UAAU;YAC/B,IAAI,EAAE,oBAAoB;SAC7B,CAAC,CAAA;QACF,IAAI,CAAC,2BAA2B,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAA;QAE7D,IAAM,QAAQ,yBAAQ,IAAI,CAAC,eAAe,EAAE,gBAAG,GAAG,IAAG,UAAU,MAAE,CAAA;QACjE,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ;YAC9B,GAAC,gCAAgC,IAAG,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,QAAQ,CAAC,CAAC;YACnF,GAAC,qBAAqB,IAAG,QAAQ;gBACnC,CAAA;QACF,IAAI,CAAC,0BAA0B,EAAE,CAAA;IACrC,CAAC;IAED,oDAAsB,GAAtB,UAAuB,QAAoC,EAAE,YAAoB;QAAjF,iBAmBC;QAnB4D,6BAAA,EAAA,oBAAoB;QAC7E,IAAM,8BAA8B,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,iCAAiC,CAAC,CAAA;QAEpG,IAAI,CAAC,8BAA8B,IAAI,YAAY,EAAE;YACjD,IAAI,CAAC,QAAQ,CAAC,aAAa,CACvB,UAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,+CAAqC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAChG,OAAO,CACV,CAAE,EACH,EAAE,EACF,EAAE,MAAM,EAAE,KAAK,EAAE,EACjB,UAAC,QAAQ;;gBACL,IAAM,mBAAmB,GAAI,QAAuC,CAAC,mBAAmB,CAAA;gBACxF,KAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,WAAG,GAAC,iCAAiC,IAAG,mBAAmB,MAAG,CAAA;gBAChG,OAAO,QAAQ,CAAC,mBAAmB,CAAC,CAAA;YACxC,CAAC,CACJ,CAAA;SACJ;aAAM;YACH,OAAO,QAAQ,CAAC,8BAA8B,CAAC,CAAA;SAClD;IACL,CAAC;IAED,8DAAgC,GAAhC;QACI,IAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;QAC7B,IAAM,YAAY,GAAG,IAAI,CAAC,eAAe,EAAE,CAAA;QAE3C,gBAAgB;QAChB,IAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,UAAC,IAAI,IAAK,OAAA,YAAY,CAAC,IAAI,CAAC,EAAlB,CAAkB,CAAC,CAAA;QAC9D,IAAM,kBAAkB,GAAG,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;aAC/C,MAAM,CAAC,UAAC,UAAU,IAAK,OAAA,YAAY,CAAC,UAAU,CAAC,EAAxB,CAAwB,CAAC;aAChD,MAAM,CAAC,UAAC,GAAqC,EAAE,GAAG;YAC/C,GAAG,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,GAAG,CAAC,CAAA;YAC5B,OAAO,GAAG,CAAA;QACd,CAAC,EAAE,EAAE,CAAC,CAAA;QAEV,OAAO;YACH,KAAK,EAAE,WAAW;YAClB,YAAY,EAAE,kBAAkB;SACnC,CAAA;IACL,CAAC;IAED,wDAA0B,GAA1B;QACU,IAAA,KAA0B,IAAI,CAAC,gCAAgC,EAAE,EAA/D,KAAK,WAAA,EAAE,YAAY,kBAA4C,CAAA;QACvE,IAAI,CAAC,wBAAwB,CAAC,OAAO,CAAC,UAAC,OAAO,IAAK,OAAA,OAAO,CAAC,KAAK,EAAE,YAAY,CAAC,EAA5B,CAA4B,CAAC,CAAA;IACpF,CAAC;IAED;;;;OAIG;IACH,yDAA2B,GAA3B,UAA4B,UAAsB,EAAE,kBAAyB;;QAAzB,mCAAA,EAAA,yBAAyB;QACzE,kCAAkC;QAClC,IAAM,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,4BAA4B,CAAC,IAAI,EAAE,CAAA;QAEzF,IAAI,CAAC,QAAQ,CAAC,QAAQ;YAClB,GAAC,4BAA4B,0BACtB,kBAAkB,GAClB,UAAU,CAChB;gBACH,CAAA;QAEF,IAAI,kBAAkB,EAAE;YACpB,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAA;SACrC;IACL,CAAC;IAED,2DAA6B,GAA7B;QACI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,4BAA4B,CAAC,CAAA;IAC1D,CAAC;IAED;;;;;;;OAOG;IACH,wDAA0B,GAA1B,UAA2B,UAA0C,EAAE,kBAAyB;;QAAzB,mCAAA,EAAA,yBAAyB;QAC5F,iCAAiC;QACjC,IAAM,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,2BAA2B,CAAC,IAAI,EAAE,CAAA;QAExF,IAAI,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;YAC9C,MAAM,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,UAAC,SAAS;gBAC9C,kBAAkB,CAAC,SAAS,CAAC,yBACtB,kBAAkB,CAAC,SAAS,CAAC,GAC7B,UAAU,CAAC,SAAS,CAAC,CAC3B,CAAA;gBACD,OAAO,UAAU,CAAC,SAAS,CAAC,CAAA;YAChC,CAAC,CAAC,CAAA;SACL;QAED,IAAI,CAAC,QAAQ,CAAC,QAAQ;YAClB,GAAC,2BAA2B,0BACrB,kBAAkB,GAClB,UAAU,CAChB;gBACH,CAAA;QAEF,IAAI,kBAAkB,EAAE;YACpB,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAA;SACrC;IACL,CAAC;IAED,0DAA4B,GAA5B,UAA6B,UAAmB;;QAC5C,IAAI,UAAU,EAAE;YACZ,IAAM,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,2BAA2B,CAAC,IAAI,EAAE,CAAA;YACxF,IAAI,CAAC,QAAQ,CAAC,QAAQ;gBAClB,GAAC,2BAA2B,0BAAQ,kBAAkB,gBAAG,UAAU,IAAG,EAAE,MAAE;oBAC5E,CAAA;SACL;aAAM;YACH,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,2BAA2B,CAAC,CAAA;SACxD;IACL,CAAC;IACL,0BAAC;AAAD,CAAC,AA1XD,IA0XC","sourcesContent":["import { _base64Encode, _entries, _extend } from './utils'\nimport { PostHog } from './posthog-core'\nimport {\n DecideResponse,\n FeatureFlagsCallback,\n EarlyAccessFeatureCallback,\n EarlyAccessFeatureResponse,\n Properties,\n JsonType,\n RequestCallback,\n} from './types'\nimport { PostHogPersistence } from './posthog-persistence'\n\nimport {\n PERSISTENCE_EARLY_ACCESS_FEATURES,\n ENABLED_FEATURE_FLAGS,\n STORED_GROUP_PROPERTIES_KEY,\n STORED_PERSON_PROPERTIES_KEY,\n FLAG_CALL_REPORTED,\n} from './constants'\n\nconst PERSISTENCE_ACTIVE_FEATURE_FLAGS = '$active_feature_flags'\nconst PERSISTENCE_OVERRIDE_FEATURE_FLAGS = '$override_feature_flags'\nconst PERSISTENCE_FEATURE_FLAG_PAYLOADS = '$feature_flag_payloads'\n\nexport const filterActiveFeatureFlags = (featureFlags?: Record<string, string | boolean>) => {\n const activeFeatureFlags: Record<string, string | boolean> = {}\n for (const [key, value] of _entries(featureFlags || {})) {\n if (value) {\n activeFeatureFlags[key] = value\n }\n }\n return activeFeatureFlags\n}\n\nexport const parseFeatureFlagDecideResponse = (\n response: Partial<DecideResponse>,\n persistence: PostHogPersistence,\n currentFlags: Record<string, string | boolean> = {},\n currentFlagPayloads: Record<string, JsonType> = {}\n) => {\n const flags = response['featureFlags']\n const flagPayloads = response['featureFlagPayloads']\n if (flags) {\n // using the v1 api\n if (Array.isArray(flags)) {\n const $enabled_feature_flags: Record<string, boolean> = {}\n if (flags) {\n for (let i = 0; i < flags.length; i++) {\n $enabled_feature_flags[flags[i]] = true\n }\n }\n persistence &&\n persistence.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: flags,\n [ENABLED_FEATURE_FLAGS]: $enabled_feature_flags,\n })\n } else {\n // using the v2+ api\n let newFeatureFlags = flags\n let newFeatureFlagPayloads = flagPayloads\n if (response.errorsWhileComputingFlags) {\n // if not all flags were computed, we upsert flags instead of replacing them\n newFeatureFlags = { ...currentFlags, ...newFeatureFlags }\n newFeatureFlagPayloads = { ...currentFlagPayloads, ...newFeatureFlagPayloads }\n }\n persistence &&\n persistence.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: Object.keys(filterActiveFeatureFlags(newFeatureFlags)),\n [ENABLED_FEATURE_FLAGS]: newFeatureFlags || {},\n [PERSISTENCE_FEATURE_FLAG_PAYLOADS]: newFeatureFlagPayloads || {},\n })\n }\n }\n}\n\nexport class PostHogFeatureFlags {\n instance: PostHog\n _override_warning: boolean\n featureFlagEventHandlers: FeatureFlagsCallback[]\n reloadFeatureFlagsQueued: boolean\n reloadFeatureFlagsInAction: boolean\n $anon_distinct_id: string | undefined\n\n constructor(instance: PostHog) {\n this.instance = instance\n this._override_warning = false\n this.featureFlagEventHandlers = []\n\n this.reloadFeatureFlagsQueued = false\n this.reloadFeatureFlagsInAction = false\n }\n\n getFlags(): string[] {\n return Object.keys(this.getFlagVariants())\n }\n\n getFlagVariants(): Record<string, string | boolean> {\n const enabledFlags = this.instance.get_property(ENABLED_FEATURE_FLAGS)\n const overriddenFlags = this.instance.get_property(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n if (!overriddenFlags) {\n return enabledFlags || {}\n }\n\n const finalFlags = _extend({}, enabledFlags)\n const overriddenKeys = Object.keys(overriddenFlags)\n for (let i = 0; i < overriddenKeys.length; i++) {\n if (overriddenFlags[overriddenKeys[i]] === false) {\n delete finalFlags[overriddenKeys[i]]\n } else {\n finalFlags[overriddenKeys[i]] = overriddenFlags[overriddenKeys[i]]\n }\n }\n if (!this._override_warning) {\n console.warn('[PostHog] Overriding feature flags!', {\n enabledFlags,\n overriddenFlags,\n finalFlags,\n })\n this._override_warning = true\n }\n return finalFlags\n }\n\n getFlagPayloads(): Record<string, JsonType> {\n const flagPayloads = this.instance.get_property(PERSISTENCE_FEATURE_FLAG_PAYLOADS)\n return flagPayloads || {}\n }\n\n /**\n * Reloads feature flags asynchronously.\n *\n * Constraints:\n *\n * 1. Avoid parallel requests\n * 2. Delay a few milliseconds after each reloadFeatureFlags call to batch subsequent changes together\n * 3. Don't call this during initial load (as /decide will be called instead), see posthog-core.js\n */\n reloadFeatureFlags(): void {\n if (!this.reloadFeatureFlagsQueued) {\n this.reloadFeatureFlagsQueued = true\n this._startReloadTimer()\n }\n }\n\n setAnonymousDistinctId(anon_distinct_id: string): void {\n this.$anon_distinct_id = anon_distinct_id\n }\n\n setReloadingPaused(isPaused: boolean): void {\n this.reloadFeatureFlagsInAction = isPaused\n }\n\n resetRequestQueue(): void {\n this.reloadFeatureFlagsQueued = false\n }\n\n _startReloadTimer(): void {\n if (this.reloadFeatureFlagsQueued && !this.reloadFeatureFlagsInAction) {\n setTimeout(() => {\n if (!this.reloadFeatureFlagsInAction && this.reloadFeatureFlagsQueued) {\n this.reloadFeatureFlagsQueued = false\n this._reloadFeatureFlagsRequest()\n }\n }, 5)\n }\n }\n\n _reloadFeatureFlagsRequest(): void {\n this.setReloadingPaused(true)\n const token = this.instance.get_config('token')\n const personProperties = this.instance.get_property(STORED_PERSON_PROPERTIES_KEY)\n const groupProperties = this.instance.get_property(STORED_GROUP_PROPERTIES_KEY)\n const json_data = JSON.stringify({\n token: token,\n distinct_id: this.instance.get_distinct_id(),\n groups: this.instance.getGroups(),\n $anon_distinct_id: this.$anon_distinct_id,\n person_properties: personProperties,\n group_properties: groupProperties,\n disable_flags: this.instance.get_config('advanced_disable_feature_flags') || undefined,\n })\n\n const encoded_data = _base64Encode(json_data)\n this.instance._send_request(\n this.instance.get_config('api_host') + '/decide/?v=3',\n { data: encoded_data },\n { method: 'POST' },\n this.instance._prepare_callback((response) => {\n // reset anon_distinct_id after at least a single request with it\n // makes it through\n this.$anon_distinct_id = undefined\n this.receivedFeatureFlags(response as DecideResponse)\n\n // :TRICKY: Reload - start another request if queued!\n this.setReloadingPaused(false)\n this._startReloadTimer()\n }) as RequestCallback\n )\n }\n\n /*\n * Get feature flag's value for user.\n *\n * ### Usage:\n *\n * if(posthog.getFeatureFlag('my-flag') === 'some-variant') { // do something }\n *\n * @param {Object|String} key Key of the feature flag.\n * @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n */\n getFeatureFlag(key: string, options: { send_event?: boolean } = {}): boolean | string | undefined {\n if (!this.instance.decideEndpointWasHit && !(this.getFlags() && this.getFlags().length > 0)) {\n console.warn('getFeatureFlag for key \"' + key + '\" failed. Feature flags didn\\'t load in time.')\n return undefined\n }\n const flagValue = this.getFlagVariants()[key]\n const flagReportValue = `${flagValue}`\n const flagCallReported: Record<string, string[]> = this.instance.get_property(FLAG_CALL_REPORTED) || {}\n\n if (options.send_event || !('send_event' in options)) {\n if (!(key in flagCallReported) || !flagCallReported[key].includes(flagReportValue)) {\n if (Array.isArray(flagCallReported[key])) {\n flagCallReported[key].push(flagReportValue)\n } else {\n flagCallReported[key] = [flagReportValue]\n }\n this.instance.persistence.register({ [FLAG_CALL_REPORTED]: flagCallReported })\n\n this.instance.capture('$feature_flag_called', { $feature_flag: key, $feature_flag_response: flagValue })\n }\n }\n return flagValue\n }\n\n getFeatureFlagPayload(key: string): JsonType {\n const payloads = this.getFlagPayloads()\n return payloads[key]\n }\n\n /*\n * See if feature flag is enabled for user.\n *\n * ### Usage:\n *\n * if(posthog.isFeatureEnabled('beta-feature')) { // do something }\n *\n * @param {Object|String} key Key of the feature flag.\n * @param {Object|String} options (optional) If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n */\n isFeatureEnabled(key: string, options: { send_event?: boolean } = {}): boolean | undefined {\n if (!this.instance.decideEndpointWasHit && !(this.getFlags() && this.getFlags().length > 0)) {\n console.warn('isFeatureEnabled for key \"' + key + '\" failed. Feature flags didn\\'t load in time.')\n return undefined\n }\n return !!this.getFeatureFlag(key, options)\n }\n\n addFeatureFlagsHandler(handler: FeatureFlagsCallback): void {\n this.featureFlagEventHandlers.push(handler)\n }\n\n removeFeatureFlagsHandler(handler: FeatureFlagsCallback): void {\n this.featureFlagEventHandlers = this.featureFlagEventHandlers.filter((h) => h !== handler)\n }\n\n receivedFeatureFlags(response: Partial<DecideResponse>): void {\n this.instance.decideEndpointWasHit = true\n const currentFlags = this.getFlagVariants()\n const currentFlagPayloads = this.getFlagPayloads()\n parseFeatureFlagDecideResponse(response, this.instance.persistence, currentFlags, currentFlagPayloads)\n this._fireFeatureFlagsCallbacks()\n }\n\n /*\n * Override feature flags for debugging.\n *\n * ### Usage:\n *\n * - posthog.feature_flags.override(false)\n * - posthog.feature_flags.override(['beta-feature'])\n * - posthog.feature_flags.override({'beta-feature': 'variant', 'other-feature': True})\n *\n * @param {Object|Array|String} flags Flags to override with.\n */\n override(flags: boolean | string[] | Record<string, string | boolean>): void {\n this._override_warning = false\n\n if (flags === false) {\n this.instance.persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n } else if (Array.isArray(flags)) {\n const flagsObj: Record<string, string | boolean> = {}\n for (let i = 0; i < flags.length; i++) {\n flagsObj[flags[i]] = true\n }\n this.instance.persistence.register({ [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: flagsObj })\n } else {\n this.instance.persistence.register({ [PERSISTENCE_OVERRIDE_FEATURE_FLAGS]: flags })\n }\n }\n /*\n * Register an event listener that runs when feature flags become available or when they change.\n * If there are flags, the listener is called immediately in addition to being called on future changes.\n *\n * ### Usage:\n *\n * posthog.onFeatureFlags(function(featureFlags) { // do something })\n *\n * @param {Function} [callback] The callback function will be called once the feature flags are ready or when they are updated.\n * It'll return a list of feature flags enabled for the user.\n * @returns {Function} A function that can be called to unsubscribe the listener. Used by useEffect when the component unmounts.\n */\n onFeatureFlags(callback: FeatureFlagsCallback): () => void {\n this.addFeatureFlagsHandler(callback)\n if (this.instance.decideEndpointWasHit) {\n const { flags, flagVariants } = this._prepareFeatureFlagsForCallbacks()\n callback(flags, flagVariants)\n }\n return () => this.removeFeatureFlagsHandler(callback)\n }\n\n updateEarlyAccessFeatureEnrollment(key: string, isEnrolled: boolean): void {\n const enrollmentPersonProp = {\n [`$feature_enrollment/${key}`]: isEnrolled,\n }\n this.instance.capture('$feature_enrollment_update', {\n $feature_flag: key,\n $feature_enrollment: isEnrolled,\n $set: enrollmentPersonProp,\n })\n this.setPersonPropertiesForFlags(enrollmentPersonProp, false)\n\n const newFlags = { ...this.getFlagVariants(), [key]: isEnrolled }\n this.instance.persistence.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: Object.keys(filterActiveFeatureFlags(newFlags)),\n [ENABLED_FEATURE_FLAGS]: newFlags,\n })\n this._fireFeatureFlagsCallbacks()\n }\n\n getEarlyAccessFeatures(callback: EarlyAccessFeatureCallback, force_reload = false): void {\n const existing_early_access_features = this.instance.get_property(PERSISTENCE_EARLY_ACCESS_FEATURES)\n\n if (!existing_early_access_features || force_reload) {\n this.instance._send_request(\n `${this.instance.get_config('api_host')}/api/early_access_features/?token=${this.instance.get_config(\n 'token'\n )}`,\n {},\n { method: 'GET' },\n (response) => {\n const earlyAccessFeatures = (response as EarlyAccessFeatureResponse).earlyAccessFeatures\n this.instance.persistence.register({ [PERSISTENCE_EARLY_ACCESS_FEATURES]: earlyAccessFeatures })\n return callback(earlyAccessFeatures)\n }\n )\n } else {\n return callback(existing_early_access_features)\n }\n }\n\n _prepareFeatureFlagsForCallbacks(): { flags: string[]; flagVariants: Record<string, string | boolean> } {\n const flags = this.getFlags()\n const flagVariants = this.getFlagVariants()\n\n // Return truthy\n const truthyFlags = flags.filter((flag) => flagVariants[flag])\n const truthyFlagVariants = Object.keys(flagVariants)\n .filter((variantKey) => flagVariants[variantKey])\n .reduce((res: Record<string, string | boolean>, key) => {\n res[key] = flagVariants[key]\n return res\n }, {})\n\n return {\n flags: truthyFlags,\n flagVariants: truthyFlagVariants,\n }\n }\n\n _fireFeatureFlagsCallbacks(): void {\n const { flags, flagVariants } = this._prepareFeatureFlagsForCallbacks()\n this.featureFlagEventHandlers.forEach((handler) => handler(flags, flagVariants))\n }\n\n /**\n * Set override person properties for feature flags.\n * This is used when dealing with new persons / where you don't want to wait for ingestion\n * to update user properties.\n */\n setPersonPropertiesForFlags(properties: Properties, reloadFeatureFlags = true): void {\n // Get persisted person properties\n const existingProperties = this.instance.get_property(STORED_PERSON_PROPERTIES_KEY) || {}\n\n this.instance.register({\n [STORED_PERSON_PROPERTIES_KEY]: {\n ...existingProperties,\n ...properties,\n },\n })\n\n if (reloadFeatureFlags) {\n this.instance.reloadFeatureFlags()\n }\n }\n\n resetPersonPropertiesForFlags(): void {\n this.instance.unregister(STORED_PERSON_PROPERTIES_KEY)\n }\n\n /**\n * Set override group properties for feature flags.\n * This is used when dealing with new groups / where you don't want to wait for ingestion\n * to update properties.\n * Takes in an object, the key of which is the group type.\n * For example:\n * setGroupPropertiesForFlags({'organization': { name: 'CYZ', employees: '11' } })\n */\n setGroupPropertiesForFlags(properties: { [type: string]: Properties }, reloadFeatureFlags = true): void {\n // Get persisted group properties\n const existingProperties = this.instance.get_property(STORED_GROUP_PROPERTIES_KEY) || {}\n\n if (Object.keys(existingProperties).length !== 0) {\n Object.keys(existingProperties).forEach((groupType) => {\n existingProperties[groupType] = {\n ...existingProperties[groupType],\n ...properties[groupType],\n }\n delete properties[groupType]\n })\n }\n\n this.instance.register({\n [STORED_GROUP_PROPERTIES_KEY]: {\n ...existingProperties,\n ...properties,\n },\n })\n\n if (reloadFeatureFlags) {\n this.instance.reloadFeatureFlags()\n }\n }\n\n resetGroupPropertiesForFlags(group_type?: string): void {\n if (group_type) {\n const existingProperties = this.instance.get_property(STORED_GROUP_PROPERTIES_KEY) || {}\n this.instance.register({\n [STORED_GROUP_PROPERTIES_KEY]: { ...existingProperties, [group_type]: {} },\n })\n } else {\n this.instance.unregister(STORED_GROUP_PROPERTIES_KEY)\n }\n }\n}\n"]}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { PersistentStore, PostHogConfig, Properties } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* PostHog Persistence Object
|
|
4
|
+
* @constructor
|
|
5
|
+
*/
|
|
6
|
+
export declare class PostHogPersistence {
|
|
7
|
+
props: Properties;
|
|
8
|
+
storage: PersistentStore;
|
|
9
|
+
campaign_params_saved: boolean;
|
|
10
|
+
custom_campaign_params: string[];
|
|
11
|
+
name: string;
|
|
12
|
+
disabled: boolean | undefined;
|
|
13
|
+
secure: boolean | undefined;
|
|
14
|
+
expire_days: number | undefined;
|
|
15
|
+
default_expiry: number | undefined;
|
|
16
|
+
cross_subdomain: boolean | undefined;
|
|
17
|
+
user_state: 'anonymous' | 'identified';
|
|
18
|
+
constructor(config: PostHogConfig);
|
|
19
|
+
properties(): Properties;
|
|
20
|
+
load(): void;
|
|
21
|
+
/**
|
|
22
|
+
* NOTE: Saving frequently causes issues with Recordings and Consent Management Platform (CMP) tools which
|
|
23
|
+
* observe cookie changes, and modify their UI, often causing infinite loops.
|
|
24
|
+
* As such callers of this should ideally check that the data has changed beforehand
|
|
25
|
+
*/
|
|
26
|
+
save(): void;
|
|
27
|
+
remove(): void;
|
|
28
|
+
clear(): void;
|
|
29
|
+
/**
|
|
30
|
+
* @param {Object} props
|
|
31
|
+
* @param {*=} default_value
|
|
32
|
+
* @param {number=} days
|
|
33
|
+
*/
|
|
34
|
+
register_once(props: Properties, default_value: any, days?: number): boolean;
|
|
35
|
+
/**
|
|
36
|
+
* @param {Object} props
|
|
37
|
+
* @param {number=} days
|
|
38
|
+
*/
|
|
39
|
+
register(props: Properties, days?: number): boolean;
|
|
40
|
+
unregister(prop: string): void;
|
|
41
|
+
update_campaign_params(): void;
|
|
42
|
+
update_search_keyword(): void;
|
|
43
|
+
update_referrer_info(): void;
|
|
44
|
+
get_referrer_info(): Properties;
|
|
45
|
+
safe_merge(props: Properties): Properties;
|
|
46
|
+
update_config(config: PostHogConfig): void;
|
|
47
|
+
set_disabled(disabled: boolean): void;
|
|
48
|
+
set_cross_subdomain(cross_subdomain: boolean): void;
|
|
49
|
+
get_cross_subdomain(): boolean;
|
|
50
|
+
set_secure(secure: boolean): void;
|
|
51
|
+
set_event_timer(event_name: string, timestamp: number): void;
|
|
52
|
+
remove_event_timer(event_name: string): number;
|
|
53
|
+
get_user_state(): 'anonymous' | 'identified';
|
|
54
|
+
set_user_state(state: 'anonymous' | 'identified'): void;
|
|
55
|
+
get_quota_limits(): Record<string, number>;
|
|
56
|
+
set_quota_limits(state: Record<string, number>): void;
|
|
57
|
+
}
|