@posthog/core 1.32.5 → 1.34.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/featureFlagUtils.d.ts +0 -6
- package/dist/featureFlagUtils.d.ts.map +1 -1
- package/dist/featureFlagUtils.js +0 -22
- package/dist/featureFlagUtils.mjs +1 -20
- package/dist/posthog-core.d.ts +50 -0
- package/dist/posthog-core.d.ts.map +1 -1
- package/dist/posthog-core.js +99 -10
- package/dist/posthog-core.mjs +100 -11
- package/dist/types.d.ts +28 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +8 -2
- package/dist/types.mjs +4 -1
- package/dist/utils/type-utils.d.ts +2 -1
- package/dist/utils/type-utils.d.ts.map +1 -1
- package/dist/utils/type-utils.js +17 -13
- package/dist/utils/type-utils.mjs +3 -2
- package/package.json +2 -2
- package/src/featureFlagUtils.ts +0 -29
- package/src/posthog-core.ts +185 -14
- package/src/types.ts +30 -0
- package/src/utils/type-utils.ts +10 -1
|
@@ -12,12 +12,6 @@ export declare const getFlagValuesFromFlags: (flags: PostHogFlagsResponse["flags
|
|
|
12
12
|
* @returns The payloads
|
|
13
13
|
*/
|
|
14
14
|
export declare const getPayloadsFromFlags: (flags: PostHogFlagsResponse["flags"]) => PostHogFlagsResponse["featureFlagPayloads"];
|
|
15
|
-
/**
|
|
16
|
-
* Get the flag details from the legacy v1 flags and payloads. As such, it will lack the reason, id, version, and description.
|
|
17
|
-
* @param flagsResponse - The flags response
|
|
18
|
-
* @returns The flag details
|
|
19
|
-
*/
|
|
20
|
-
export declare const getFlagDetailsFromFlagsAndPayloads: (flagsResponse: PostHogFeatureFlagsResponse) => PostHogFlagsResponse["flags"];
|
|
21
15
|
export declare const getFeatureFlagValue: (detail: FeatureFlagDetail | undefined) => FeatureFlagValue | undefined;
|
|
22
16
|
export declare const parsePayload: (response: any) => any;
|
|
23
17
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"featureFlagUtils.d.ts","sourceRoot":"","sources":["../src/featureFlagUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAEhB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EAEtB,mBAAmB,EACnB,2BAA2B,EAC5B,MAAM,SAAS,CAAA;AAEhB,eAAO,MAAM,sBAAsB,GACjC,eACI,mBAAmB,CAAC,sBAAsB,EAAE,OAAO,CAAC,GACpD,mBAAmB,CAAC,sBAAsB,EAAE,cAAc,GAAG,qBAAqB,CAAC,KACtF,2BAgCF,CAAA;AAqBD;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GAAI,OAAO,oBAAoB,CAAC,OAAO,CAAC,KAAG,oBAAoB,CAAC,cAAc,CAMhH,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAC/B,OAAO,oBAAoB,CAAC,OAAO,CAAC,KACnC,oBAAoB,CAAC,qBAAqB,CAa5C,CAAA;AAED
|
|
1
|
+
{"version":3,"file":"featureFlagUtils.d.ts","sourceRoot":"","sources":["../src/featureFlagUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAEhB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EAEtB,mBAAmB,EACnB,2BAA2B,EAC5B,MAAM,SAAS,CAAA;AAEhB,eAAO,MAAM,sBAAsB,GACjC,eACI,mBAAmB,CAAC,sBAAsB,EAAE,OAAO,CAAC,GACpD,mBAAmB,CAAC,sBAAsB,EAAE,cAAc,GAAG,qBAAqB,CAAC,KACtF,2BAgCF,CAAA;AAqBD;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GAAI,OAAO,oBAAoB,CAAC,OAAO,CAAC,KAAG,oBAAoB,CAAC,cAAc,CAMhH,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAC/B,OAAO,oBAAoB,CAAC,OAAO,CAAC,KACnC,oBAAoB,CAAC,qBAAqB,CAa5C,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,QAAQ,iBAAiB,GAAG,SAAS,KAAG,gBAAgB,GAAG,SAE9F,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,UAAU,GAAG,KAAG,GAU5C,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,uCAAuC,GAClD,cAAc,sBAAsB,CAAC,cAAc,CAAC,EACpD,qBAAqB,sBAAsB,CAAC,qBAAqB,CAAC,KACjE,2BAaF,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,MAAM,iBAAiB,EAAE,OAAO,gBAAgB,KAAG,iBAMlF,CAAA;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAEpE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,GAAG,SAAS,CAE/E"}
|
package/dist/featureFlagUtils.js
CHANGED
|
@@ -27,7 +27,6 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
27
27
|
createFlagsResponseFromFlagsAndPayloads: ()=>createFlagsResponseFromFlagsAndPayloads,
|
|
28
28
|
getEnabledFromValue: ()=>getEnabledFromValue,
|
|
29
29
|
getFeatureFlagValue: ()=>getFeatureFlagValue,
|
|
30
|
-
getFlagDetailsFromFlagsAndPayloads: ()=>getFlagDetailsFromFlagsAndPayloads,
|
|
31
30
|
getFlagValuesFromFlags: ()=>getFlagValuesFromFlags,
|
|
32
31
|
getPayloadsFromFlags: ()=>getPayloadsFromFlags,
|
|
33
32
|
getVariantFromValue: ()=>getVariantFromValue,
|
|
@@ -94,25 +93,6 @@ const getPayloadsFromFlags = (flags)=>{
|
|
|
94
93
|
];
|
|
95
94
|
}));
|
|
96
95
|
};
|
|
97
|
-
const getFlagDetailsFromFlagsAndPayloads = (flagsResponse)=>{
|
|
98
|
-
const flags = flagsResponse.featureFlags ?? {};
|
|
99
|
-
const payloads = flagsResponse.featureFlagPayloads ?? {};
|
|
100
|
-
return Object.fromEntries(Object.entries(flags).map(([key, value])=>[
|
|
101
|
-
key,
|
|
102
|
-
{
|
|
103
|
-
key: key,
|
|
104
|
-
enabled: 'string' == typeof value ? true : value,
|
|
105
|
-
variant: 'string' == typeof value ? value : void 0,
|
|
106
|
-
reason: void 0,
|
|
107
|
-
metadata: {
|
|
108
|
-
id: void 0,
|
|
109
|
-
version: void 0,
|
|
110
|
-
payload: payloads?.[key] ? JSON.stringify(payloads[key]) : void 0,
|
|
111
|
-
description: void 0
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
]));
|
|
115
|
-
};
|
|
116
96
|
const getFeatureFlagValue = (detail)=>void 0 === detail ? void 0 : detail.variant ?? detail.enabled;
|
|
117
97
|
const parsePayload = (response)=>{
|
|
118
98
|
if ('string' != typeof response) return response;
|
|
@@ -150,7 +130,6 @@ function getVariantFromValue(value) {
|
|
|
150
130
|
exports.createFlagsResponseFromFlagsAndPayloads = __webpack_exports__.createFlagsResponseFromFlagsAndPayloads;
|
|
151
131
|
exports.getEnabledFromValue = __webpack_exports__.getEnabledFromValue;
|
|
152
132
|
exports.getFeatureFlagValue = __webpack_exports__.getFeatureFlagValue;
|
|
153
|
-
exports.getFlagDetailsFromFlagsAndPayloads = __webpack_exports__.getFlagDetailsFromFlagsAndPayloads;
|
|
154
133
|
exports.getFlagValuesFromFlags = __webpack_exports__.getFlagValuesFromFlags;
|
|
155
134
|
exports.getPayloadsFromFlags = __webpack_exports__.getPayloadsFromFlags;
|
|
156
135
|
exports.getVariantFromValue = __webpack_exports__.getVariantFromValue;
|
|
@@ -161,7 +140,6 @@ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
|
|
|
161
140
|
"createFlagsResponseFromFlagsAndPayloads",
|
|
162
141
|
"getEnabledFromValue",
|
|
163
142
|
"getFeatureFlagValue",
|
|
164
|
-
"getFlagDetailsFromFlagsAndPayloads",
|
|
165
143
|
"getFlagValuesFromFlags",
|
|
166
144
|
"getPayloadsFromFlags",
|
|
167
145
|
"getVariantFromValue",
|
|
@@ -57,25 +57,6 @@ const getPayloadsFromFlags = (flags)=>{
|
|
|
57
57
|
];
|
|
58
58
|
}));
|
|
59
59
|
};
|
|
60
|
-
const getFlagDetailsFromFlagsAndPayloads = (flagsResponse)=>{
|
|
61
|
-
const flags = flagsResponse.featureFlags ?? {};
|
|
62
|
-
const payloads = flagsResponse.featureFlagPayloads ?? {};
|
|
63
|
-
return Object.fromEntries(Object.entries(flags).map(([key, value])=>[
|
|
64
|
-
key,
|
|
65
|
-
{
|
|
66
|
-
key: key,
|
|
67
|
-
enabled: 'string' == typeof value ? true : value,
|
|
68
|
-
variant: 'string' == typeof value ? value : void 0,
|
|
69
|
-
reason: void 0,
|
|
70
|
-
metadata: {
|
|
71
|
-
id: void 0,
|
|
72
|
-
version: void 0,
|
|
73
|
-
payload: payloads?.[key] ? JSON.stringify(payloads[key]) : void 0,
|
|
74
|
-
description: void 0
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
]));
|
|
78
|
-
};
|
|
79
60
|
const getFeatureFlagValue = (detail)=>void 0 === detail ? void 0 : detail.variant ?? detail.enabled;
|
|
80
61
|
const parsePayload = (response)=>{
|
|
81
62
|
if ('string' != typeof response) return response;
|
|
@@ -110,4 +91,4 @@ function getEnabledFromValue(value) {
|
|
|
110
91
|
function getVariantFromValue(value) {
|
|
111
92
|
return 'string' == typeof value ? value : void 0;
|
|
112
93
|
}
|
|
113
|
-
export { createFlagsResponseFromFlagsAndPayloads, getEnabledFromValue, getFeatureFlagValue,
|
|
94
|
+
export { createFlagsResponseFromFlagsAndPayloads, getEnabledFromValue, getFeatureFlagValue, getFlagValuesFromFlags, getPayloadsFromFlags, getVariantFromValue, normalizeFlagsResponse, parsePayload, updateFlagValue };
|
package/dist/posthog-core.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ interface FlagsAsyncOptions {
|
|
|
9
9
|
}
|
|
10
10
|
export declare abstract class PostHogCore extends PostHogCoreStateless {
|
|
11
11
|
private sendFeatureFlagEvent;
|
|
12
|
+
private disableRemoteFeatureFlags;
|
|
12
13
|
private flagCallReported;
|
|
13
14
|
private _beforeSend?;
|
|
14
15
|
protected _flagsResponsePromise?: Promise<PostHogFeatureFlagsResponse | undefined>;
|
|
@@ -165,6 +166,25 @@ export declare abstract class PostHogCore extends PostHogCoreStateless {
|
|
|
165
166
|
onFeatureFlags(cb: (flags: PostHogFlagsResponse['featureFlags']) => void): () => void;
|
|
166
167
|
onFeatureFlag(key: string, cb: (value: FeatureFlagValue) => void): () => void;
|
|
167
168
|
overrideFeatureFlag(flags: PostHogFlagsResponse['featureFlags'] | null): Promise<void>;
|
|
169
|
+
/**
|
|
170
|
+
* Replaces (or merges into) the stored feature flags and payloads with locally supplied
|
|
171
|
+
* values, exactly as if they had been returned by the flags endpoint: the values are
|
|
172
|
+
* persisted, `getFeatureFlag()`/`getFeatureFlagPayload()` read them back, and
|
|
173
|
+
* `onFeatureFlags` listeners fire. Makes no network request.
|
|
174
|
+
*
|
|
175
|
+
* Intended for apps that evaluate flags outside the SDK (e.g. server-side local
|
|
176
|
+
* evaluation) and push the results in at runtime, typically together with the
|
|
177
|
+
* `disableRemoteFeatureFlags` option so the SDK never fetches flags itself.
|
|
178
|
+
*
|
|
179
|
+
* The values are cleared by `reset()`, so push them again after an identity change.
|
|
180
|
+
*
|
|
181
|
+
* @param flags - Flag keys mapped to their values (boolean, or a variant string)
|
|
182
|
+
* @param payloads - Optional flag keys mapped to their JSON payloads
|
|
183
|
+
* @param options - Set `merge: true` to merge with the currently stored flags instead of replacing them
|
|
184
|
+
*/
|
|
185
|
+
updateFlags(flags: Record<string, FeatureFlagValue>, payloads?: Record<string, JsonType>, options?: {
|
|
186
|
+
merge?: boolean;
|
|
187
|
+
}): void;
|
|
168
188
|
/**
|
|
169
189
|
* Capture a caught exception manually
|
|
170
190
|
*
|
|
@@ -315,6 +335,36 @@ export declare abstract class PostHogCore extends PostHogCoreStateless {
|
|
|
315
335
|
}, userPropertiesToSetOnce?: {
|
|
316
336
|
[key: string]: JsonType;
|
|
317
337
|
}, reloadFeatureFlags?: boolean): void;
|
|
338
|
+
/**
|
|
339
|
+
* Removes properties from the person profile associated with the current `distinct_id`.
|
|
340
|
+
* Learn more about [identifying users](https://posthog.com/docs/product-analytics/identify)
|
|
341
|
+
*
|
|
342
|
+
* {@label Identification}
|
|
343
|
+
*
|
|
344
|
+
* @remarks
|
|
345
|
+
* Deletes the given person properties from the person profile in PostHog. This is the
|
|
346
|
+
* counterpart to {@link setPersonProperties} — instead of hand-passing `$unset` inside a
|
|
347
|
+
* `capture()` call, you can remove properties with a dedicated method.
|
|
348
|
+
* If `personProfiles` is set to `never`, this call is ignored.
|
|
349
|
+
*
|
|
350
|
+
* @example
|
|
351
|
+
* ```js
|
|
352
|
+
* // remove a single property
|
|
353
|
+
* posthog.unsetPersonProperties('plan')
|
|
354
|
+
* ```
|
|
355
|
+
*
|
|
356
|
+
* @example
|
|
357
|
+
* ```js
|
|
358
|
+
* // remove multiple properties
|
|
359
|
+
* posthog.unsetPersonProperties(['plan', 'email'])
|
|
360
|
+
* ```
|
|
361
|
+
*
|
|
362
|
+
* @public
|
|
363
|
+
*
|
|
364
|
+
* @param propertyNames - The name (or names) of the person properties to remove.
|
|
365
|
+
* @param reloadFeatureFlags - Whether to reload feature flags after removing the properties. Defaults to true.
|
|
366
|
+
*/
|
|
367
|
+
unsetPersonProperties(propertyNames: string | string[], reloadFeatureFlags?: boolean): void;
|
|
318
368
|
/**
|
|
319
369
|
* Override processBeforeEnqueue to run before_send hooks.
|
|
320
370
|
* This runs after prepareMessage, giving users full control over the final event.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"posthog-core.d.ts","sourceRoot":"","sources":["../src/posthog-core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,yBAAyB,EACzB,oBAAoB,EACpB,2BAA2B,EAC3B,kBAAkB,EAClB,sBAAsB,EACtB,qBAAqB,EACrB,QAAQ,EACR,mBAAmB,EACnB,gBAAgB,EAChB,iBAAiB,EACjB,wBAAwB,EAGxB,yBAAyB,EAKzB,sBAAsB,EAGvB,MAAM,SAAS,CAAA;AAYhB,OAAO,EAAiC,wBAAwB,EAAE,MAAM,SAAS,CAAA;AACjF,OAAO,EAAY,oBAAoB,EAAuB,MAAM,0BAA0B,CAAA;AAG9F,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAG5C,UAAU,iBAAiB;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,qBAAqB,CAAC,EAAE,OAAO,CAAA;CAChC;AAOD,8BAAsB,WAAY,SAAQ,oBAAoB;IAE5D,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,gBAAgB,CAAiC;IACzD,OAAO,CAAC,WAAW,CAAC,CAA+B;IAGnD,SAAS,CAAC,qBAAqB,CAAC,EAAE,OAAO,CAAC,2BAA2B,GAAG,SAAS,CAAC,CAAA;IAClF,SAAS,CAAC,6BAA6B,EAAE,MAAM,CAAA;IAC/C,OAAO,CAAC,wBAAwB,CAAuB;IACvD,SAAS,CAAC,YAAY,EAAE,sBAAsB,CAAK;IAInD,OAAO,CAAC,oBAAoB,CAAC,CAAqB;IAGlD,SAAS,CAAC,eAAe,EAAE,QAAQ,GAAG,iBAAiB,GAAG,OAAO,CAAA;IAGjE,SAAS,CAAC,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAO;gBAE3C,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB;
|
|
1
|
+
{"version":3,"file":"posthog-core.d.ts","sourceRoot":"","sources":["../src/posthog-core.ts"],"names":[],"mappings":"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"}
|
package/dist/posthog-core.js
CHANGED
|
@@ -41,6 +41,7 @@ class PostHogCore extends external_posthog_core_stateless_js_namespaceObject.Pos
|
|
|
41
41
|
featureFlagsRequestTimeoutMs
|
|
42
42
|
}), this.flagCallReported = {}, this._sessionMaxLengthSeconds = 86400, this.sessionProps = {}, this._cachedPersonProperties = null;
|
|
43
43
|
this.sendFeatureFlagEvent = options?.sendFeatureFlagEvent ?? true;
|
|
44
|
+
this.disableRemoteFeatureFlags = options?.disableRemoteFeatureFlags ?? false;
|
|
44
45
|
this._sessionExpirationTimeSeconds = options?.sessionExpirationTimeSeconds ?? 1800;
|
|
45
46
|
this._personProfiles = options?.personProfiles ?? 'identified_only';
|
|
46
47
|
this._beforeSend = options?.before_send;
|
|
@@ -97,7 +98,11 @@ class PostHogCore extends external_posthog_core_stateless_js_namespaceObject.Pos
|
|
|
97
98
|
this.clearProps();
|
|
98
99
|
this._cachedPersonProperties = null;
|
|
99
100
|
for (const key of Object.keys(external_types_js_namespaceObject.PostHogPersistedProperty))if (!allPropertiesToKeep.includes(external_types_js_namespaceObject.PostHogPersistedProperty[key])) this.setPersistedProperty(external_types_js_namespaceObject.PostHogPersistedProperty[key], null);
|
|
100
|
-
this.
|
|
101
|
+
if (this.disableRemoteFeatureFlags && !this.disabled) {
|
|
102
|
+
if (!allPropertiesToKeep.includes(external_types_js_namespaceObject.PostHogPersistedProperty.FeatureFlagDetails)) this.setKnownFeatureFlagDetails({
|
|
103
|
+
flags: {}
|
|
104
|
+
});
|
|
105
|
+
} else this.reloadFeatureFlags();
|
|
101
106
|
});
|
|
102
107
|
}
|
|
103
108
|
getCommonEventProperties() {
|
|
@@ -312,6 +317,7 @@ class PostHogCore extends external_posthog_core_stateless_js_namespaceObject.Pos
|
|
|
312
317
|
const { sendAnonDistinctId = true, fetchConfig = false, triggerOnRemoteConfig = false } = options ?? {};
|
|
313
318
|
await this._initPromise;
|
|
314
319
|
if (this.disabled) return;
|
|
320
|
+
if (this.disableRemoteFeatureFlags && !fetchConfig) return void this._logger.info('Feature flags are disabled (disableRemoteFeatureFlags), skipping reload.');
|
|
315
321
|
if (this._flagsResponsePromise) {
|
|
316
322
|
this._logger.info('Feature flags are being loaded already, queuing reload.');
|
|
317
323
|
if (this._pendingFlagsRequest) this._flagsResponsePromise.then(this._pendingFlagsRequest.resolve).catch(this._pendingFlagsRequest.reject);
|
|
@@ -375,11 +381,11 @@ class PostHogCore extends external_posthog_core_stateless_js_namespaceObject.Pos
|
|
|
375
381
|
this.cacheSessionReplay('remote config', response);
|
|
376
382
|
let willLoadFlags = false;
|
|
377
383
|
if (false === response.hasFeatureFlags) {
|
|
378
|
-
this.setKnownFeatureFlagDetails({
|
|
384
|
+
if (!this.disableRemoteFeatureFlags) this.setKnownFeatureFlagDetails({
|
|
379
385
|
flags: {}
|
|
380
386
|
});
|
|
381
387
|
this._logger.warn('Remote config has no feature flags, will not load feature flags.');
|
|
382
|
-
} else if (false !== this.preloadFeatureFlags) {
|
|
388
|
+
} else if (false !== this.preloadFeatureFlags && !this.disableRemoteFeatureFlags) {
|
|
383
389
|
willLoadFlags = true;
|
|
384
390
|
this.flagsAsync({
|
|
385
391
|
sendAnonDistinctId: true,
|
|
@@ -410,16 +416,22 @@ class PostHogCore extends external_posthog_core_stateless_js_namespaceObject.Pos
|
|
|
410
416
|
const deviceId = this.getPersistedProperty(external_types_js_namespaceObject.PostHogPersistedProperty.DeviceId);
|
|
411
417
|
const extraProperties = {
|
|
412
418
|
$anon_distinct_id: sendAnonDistinctId ? this.getAnonymousId() : void 0,
|
|
413
|
-
$device_id: deviceId ?? void 0
|
|
419
|
+
$device_id: deviceId ?? void 0,
|
|
420
|
+
...this.disableRemoteFeatureFlags ? {
|
|
421
|
+
disable_flags: true
|
|
422
|
+
} : {}
|
|
414
423
|
};
|
|
415
424
|
const result = await super.getFlags(distinctId, groups, personProperties, groupProperties, extraProperties, fetchConfig);
|
|
416
|
-
if (!result.success)
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
425
|
+
if (!result.success) {
|
|
426
|
+
if (!this.disableRemoteFeatureFlags) this.setKnownFeatureFlagDetails({
|
|
427
|
+
flags: this.getKnownFeatureFlagDetails()?.flags ?? {},
|
|
428
|
+
requestError: result.error
|
|
429
|
+
});
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
420
432
|
const res = result.response;
|
|
421
433
|
if (res?.quotaLimited?.includes(external_posthog_core_stateless_js_namespaceObject.QuotaLimitedFeature.FeatureFlags)) {
|
|
422
|
-
this.setKnownFeatureFlagDetails({
|
|
434
|
+
if (!this.disableRemoteFeatureFlags) this.setKnownFeatureFlagDetails({
|
|
423
435
|
flags: this.getKnownFeatureFlagDetails()?.flags ?? {},
|
|
424
436
|
quotaLimited: res.quotaLimited
|
|
425
437
|
});
|
|
@@ -428,6 +440,11 @@ class PostHogCore extends external_posthog_core_stateless_js_namespaceObject.Pos
|
|
|
428
440
|
return res;
|
|
429
441
|
}
|
|
430
442
|
if (res?.featureFlags) {
|
|
443
|
+
if (this.disableRemoteFeatureFlags) {
|
|
444
|
+
this.cacheSessionReplay('flags', res);
|
|
445
|
+
this.maybeNotifyRemoteConfig(triggerOnRemoteConfig, res);
|
|
446
|
+
return res;
|
|
447
|
+
}
|
|
431
448
|
if (this.sendFeatureFlagEvent) this.flagCallReported = {};
|
|
432
449
|
let newFeatureFlagDetails = res;
|
|
433
450
|
if (res.errorsWhileComputingFlags) {
|
|
@@ -607,7 +624,9 @@ class PostHogCore extends external_posthog_core_stateless_js_namespaceObject.Pos
|
|
|
607
624
|
featureFlagPayloads: {},
|
|
608
625
|
flags: {}
|
|
609
626
|
};
|
|
610
|
-
const flags =
|
|
627
|
+
const flags = {
|
|
628
|
+
...details.flags ?? {}
|
|
629
|
+
};
|
|
611
630
|
for(const key in overriddenFlags)if (overriddenFlags[key]) flags[key] = (0, external_featureFlagUtils_js_namespaceObject.updateFlagValue)(flags[key], overriddenFlags[key]);
|
|
612
631
|
else delete flags[key];
|
|
613
632
|
const result = {
|
|
@@ -630,6 +649,7 @@ class PostHogCore extends external_posthog_core_stateless_js_namespaceObject.Pos
|
|
|
630
649
|
return !!response;
|
|
631
650
|
}
|
|
632
651
|
reloadFeatureFlags(options) {
|
|
652
|
+
if (this.disableRemoteFeatureFlags && !this.disabled) return void this._initPromise.then(()=>options?.cb?.(void 0, this.getFeatureFlags()));
|
|
633
653
|
this.flagsAsync({
|
|
634
654
|
sendAnonDistinctId: true
|
|
635
655
|
}).then((res)=>{
|
|
@@ -643,6 +663,10 @@ class PostHogCore extends external_posthog_core_stateless_js_namespaceObject.Pos
|
|
|
643
663
|
return await this.remoteConfigAsync();
|
|
644
664
|
}
|
|
645
665
|
async reloadFeatureFlagsAsync(sendAnonDistinctId) {
|
|
666
|
+
if (this.disableRemoteFeatureFlags && !this.disabled) {
|
|
667
|
+
await this._initPromise;
|
|
668
|
+
return this.getFeatureFlags();
|
|
669
|
+
}
|
|
646
670
|
return (await this.flagsAsync({
|
|
647
671
|
sendAnonDistinctId: sendAnonDistinctId
|
|
648
672
|
}))?.featureFlags;
|
|
@@ -665,6 +689,51 @@ class PostHogCore extends external_posthog_core_stateless_js_namespaceObject.Pos
|
|
|
665
689
|
return this.setPersistedProperty(external_types_js_namespaceObject.PostHogPersistedProperty.OverrideFeatureFlags, flags);
|
|
666
690
|
});
|
|
667
691
|
}
|
|
692
|
+
updateFlags(flags, payloads, options) {
|
|
693
|
+
this.wrap(()=>{
|
|
694
|
+
const existingDetails = options?.merge ? this.getKnownFeatureFlagDetails()?.flags : void 0;
|
|
695
|
+
const existingFlags = existingDetails ? (0, external_featureFlagUtils_js_namespaceObject.getFlagValuesFromFlags)(existingDetails) : {};
|
|
696
|
+
const existingPayloads = {};
|
|
697
|
+
for(const key in existingDetails){
|
|
698
|
+
const storedPayload = existingDetails[key].metadata?.payload;
|
|
699
|
+
if (void 0 !== storedPayload) existingPayloads[key] = (0, external_featureFlagUtils_js_namespaceObject.parsePayload)(storedPayload);
|
|
700
|
+
}
|
|
701
|
+
const finalFlags = {
|
|
702
|
+
...existingFlags,
|
|
703
|
+
...flags
|
|
704
|
+
};
|
|
705
|
+
const finalPayloads = {
|
|
706
|
+
...existingPayloads,
|
|
707
|
+
...payloads ?? {}
|
|
708
|
+
};
|
|
709
|
+
const flagDetails = {};
|
|
710
|
+
for (const [key, value] of Object.entries(finalFlags)){
|
|
711
|
+
const payload = finalPayloads[key];
|
|
712
|
+
let serializedPayload;
|
|
713
|
+
if (void 0 !== payload) try {
|
|
714
|
+
serializedPayload = JSON.stringify(payload);
|
|
715
|
+
} catch (e) {
|
|
716
|
+
this._logger.error(`updateFlags: could not serialize the payload for flag "${key}", dropping it.`, e);
|
|
717
|
+
}
|
|
718
|
+
flagDetails[key] = {
|
|
719
|
+
key,
|
|
720
|
+
enabled: (0, external_featureFlagUtils_js_namespaceObject.getEnabledFromValue)(value),
|
|
721
|
+
variant: (0, external_featureFlagUtils_js_namespaceObject.getVariantFromValue)(value),
|
|
722
|
+
reason: void 0,
|
|
723
|
+
metadata: {
|
|
724
|
+
id: void 0,
|
|
725
|
+
version: void 0,
|
|
726
|
+
description: void 0,
|
|
727
|
+
payload: serializedPayload
|
|
728
|
+
}
|
|
729
|
+
};
|
|
730
|
+
}
|
|
731
|
+
if (this.sendFeatureFlagEvent) this.flagCallReported = {};
|
|
732
|
+
this.setKnownFeatureFlagDetails({
|
|
733
|
+
flags: flagDetails
|
|
734
|
+
});
|
|
735
|
+
});
|
|
736
|
+
}
|
|
668
737
|
captureException(error, additionalProperties, hint) {
|
|
669
738
|
try {
|
|
670
739
|
const exceptionProperties = this.getErrorPropertiesBuilder().buildFromUnknown(error, hint);
|
|
@@ -747,6 +816,26 @@ class PostHogCore extends external_posthog_core_stateless_js_namespaceObject.Pos
|
|
|
747
816
|
this._cachedPersonProperties = hash;
|
|
748
817
|
});
|
|
749
818
|
}
|
|
819
|
+
unsetPersonProperties(propertyNames, reloadFeatureFlags = true) {
|
|
820
|
+
this.wrap(()=>{
|
|
821
|
+
const names = ((0, index_js_namespaceObject.isArray)(propertyNames) ? propertyNames : [
|
|
822
|
+
propertyNames
|
|
823
|
+
]).filter((name)=>(0, index_js_namespaceObject.isString)(name) && name.length > 0);
|
|
824
|
+
if (0 === names.length) return;
|
|
825
|
+
if (!this._requirePersonProcessing('posthog.unsetPersonProperties')) return;
|
|
826
|
+
const existingProperties = this.getPersistedProperty(external_types_js_namespaceObject.PostHogPersistedProperty.PersonProperties) || {};
|
|
827
|
+
const nextProperties = {
|
|
828
|
+
...existingProperties
|
|
829
|
+
};
|
|
830
|
+
for (const name of names)delete nextProperties[name];
|
|
831
|
+
this.setPersistedProperty(external_types_js_namespaceObject.PostHogPersistedProperty.PersonProperties, nextProperties);
|
|
832
|
+
if (reloadFeatureFlags) this.reloadFeatureFlags();
|
|
833
|
+
this.capture('$set', {
|
|
834
|
+
$unset: names
|
|
835
|
+
});
|
|
836
|
+
this._cachedPersonProperties = null;
|
|
837
|
+
});
|
|
838
|
+
}
|
|
750
839
|
processBeforeEnqueue(message) {
|
|
751
840
|
if (!this._beforeSend) return message;
|
|
752
841
|
const timestamp = message.timestamp;
|
package/dist/posthog-core.mjs
CHANGED
|
@@ -2,7 +2,7 @@ import { createFlagsResponseFromFlagsAndPayloads, getEnabledFromValue, getFeatur
|
|
|
2
2
|
import { Compression, FeatureFlagError, PostHogPersistedProperty } from "./types.mjs";
|
|
3
3
|
import { PostHogCoreStateless, QuotaLimitedFeature, maybeAdd } from "./posthog-core-stateless.mjs";
|
|
4
4
|
import { uuidv7 } from "./vendor/uuidv7.mjs";
|
|
5
|
-
import { getPersonPropertiesHash, isEmptyObject, isNullish, isObject } from "./utils/index.mjs";
|
|
5
|
+
import { getPersonPropertiesHash, isArray, isEmptyObject, isNullish, isObject, isString } from "./utils/index.mjs";
|
|
6
6
|
class PostHogCore extends PostHogCoreStateless {
|
|
7
7
|
constructor(apiKey, options){
|
|
8
8
|
const disableGeoipOption = options?.disableGeoip ?? false;
|
|
@@ -13,6 +13,7 @@ class PostHogCore extends PostHogCoreStateless {
|
|
|
13
13
|
featureFlagsRequestTimeoutMs
|
|
14
14
|
}), this.flagCallReported = {}, this._sessionMaxLengthSeconds = 86400, this.sessionProps = {}, this._cachedPersonProperties = null;
|
|
15
15
|
this.sendFeatureFlagEvent = options?.sendFeatureFlagEvent ?? true;
|
|
16
|
+
this.disableRemoteFeatureFlags = options?.disableRemoteFeatureFlags ?? false;
|
|
16
17
|
this._sessionExpirationTimeSeconds = options?.sessionExpirationTimeSeconds ?? 1800;
|
|
17
18
|
this._personProfiles = options?.personProfiles ?? 'identified_only';
|
|
18
19
|
this._beforeSend = options?.before_send;
|
|
@@ -69,7 +70,11 @@ class PostHogCore extends PostHogCoreStateless {
|
|
|
69
70
|
this.clearProps();
|
|
70
71
|
this._cachedPersonProperties = null;
|
|
71
72
|
for (const key of Object.keys(PostHogPersistedProperty))if (!allPropertiesToKeep.includes(PostHogPersistedProperty[key])) this.setPersistedProperty(PostHogPersistedProperty[key], null);
|
|
72
|
-
this.
|
|
73
|
+
if (this.disableRemoteFeatureFlags && !this.disabled) {
|
|
74
|
+
if (!allPropertiesToKeep.includes(PostHogPersistedProperty.FeatureFlagDetails)) this.setKnownFeatureFlagDetails({
|
|
75
|
+
flags: {}
|
|
76
|
+
});
|
|
77
|
+
} else this.reloadFeatureFlags();
|
|
73
78
|
});
|
|
74
79
|
}
|
|
75
80
|
getCommonEventProperties() {
|
|
@@ -284,6 +289,7 @@ class PostHogCore extends PostHogCoreStateless {
|
|
|
284
289
|
const { sendAnonDistinctId = true, fetchConfig = false, triggerOnRemoteConfig = false } = options ?? {};
|
|
285
290
|
await this._initPromise;
|
|
286
291
|
if (this.disabled) return;
|
|
292
|
+
if (this.disableRemoteFeatureFlags && !fetchConfig) return void this._logger.info('Feature flags are disabled (disableRemoteFeatureFlags), skipping reload.');
|
|
287
293
|
if (this._flagsResponsePromise) {
|
|
288
294
|
this._logger.info('Feature flags are being loaded already, queuing reload.');
|
|
289
295
|
if (this._pendingFlagsRequest) this._flagsResponsePromise.then(this._pendingFlagsRequest.resolve).catch(this._pendingFlagsRequest.reject);
|
|
@@ -347,11 +353,11 @@ class PostHogCore extends PostHogCoreStateless {
|
|
|
347
353
|
this.cacheSessionReplay('remote config', response);
|
|
348
354
|
let willLoadFlags = false;
|
|
349
355
|
if (false === response.hasFeatureFlags) {
|
|
350
|
-
this.setKnownFeatureFlagDetails({
|
|
356
|
+
if (!this.disableRemoteFeatureFlags) this.setKnownFeatureFlagDetails({
|
|
351
357
|
flags: {}
|
|
352
358
|
});
|
|
353
359
|
this._logger.warn('Remote config has no feature flags, will not load feature flags.');
|
|
354
|
-
} else if (false !== this.preloadFeatureFlags) {
|
|
360
|
+
} else if (false !== this.preloadFeatureFlags && !this.disableRemoteFeatureFlags) {
|
|
355
361
|
willLoadFlags = true;
|
|
356
362
|
this.flagsAsync({
|
|
357
363
|
sendAnonDistinctId: true,
|
|
@@ -382,16 +388,22 @@ class PostHogCore extends PostHogCoreStateless {
|
|
|
382
388
|
const deviceId = this.getPersistedProperty(PostHogPersistedProperty.DeviceId);
|
|
383
389
|
const extraProperties = {
|
|
384
390
|
$anon_distinct_id: sendAnonDistinctId ? this.getAnonymousId() : void 0,
|
|
385
|
-
$device_id: deviceId ?? void 0
|
|
391
|
+
$device_id: deviceId ?? void 0,
|
|
392
|
+
...this.disableRemoteFeatureFlags ? {
|
|
393
|
+
disable_flags: true
|
|
394
|
+
} : {}
|
|
386
395
|
};
|
|
387
396
|
const result = await super.getFlags(distinctId, groups, personProperties, groupProperties, extraProperties, fetchConfig);
|
|
388
|
-
if (!result.success)
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
397
|
+
if (!result.success) {
|
|
398
|
+
if (!this.disableRemoteFeatureFlags) this.setKnownFeatureFlagDetails({
|
|
399
|
+
flags: this.getKnownFeatureFlagDetails()?.flags ?? {},
|
|
400
|
+
requestError: result.error
|
|
401
|
+
});
|
|
402
|
+
return;
|
|
403
|
+
}
|
|
392
404
|
const res = result.response;
|
|
393
405
|
if (res?.quotaLimited?.includes(QuotaLimitedFeature.FeatureFlags)) {
|
|
394
|
-
this.setKnownFeatureFlagDetails({
|
|
406
|
+
if (!this.disableRemoteFeatureFlags) this.setKnownFeatureFlagDetails({
|
|
395
407
|
flags: this.getKnownFeatureFlagDetails()?.flags ?? {},
|
|
396
408
|
quotaLimited: res.quotaLimited
|
|
397
409
|
});
|
|
@@ -400,6 +412,11 @@ class PostHogCore extends PostHogCoreStateless {
|
|
|
400
412
|
return res;
|
|
401
413
|
}
|
|
402
414
|
if (res?.featureFlags) {
|
|
415
|
+
if (this.disableRemoteFeatureFlags) {
|
|
416
|
+
this.cacheSessionReplay('flags', res);
|
|
417
|
+
this.maybeNotifyRemoteConfig(triggerOnRemoteConfig, res);
|
|
418
|
+
return res;
|
|
419
|
+
}
|
|
403
420
|
if (this.sendFeatureFlagEvent) this.flagCallReported = {};
|
|
404
421
|
let newFeatureFlagDetails = res;
|
|
405
422
|
if (res.errorsWhileComputingFlags) {
|
|
@@ -579,7 +596,9 @@ class PostHogCore extends PostHogCoreStateless {
|
|
|
579
596
|
featureFlagPayloads: {},
|
|
580
597
|
flags: {}
|
|
581
598
|
};
|
|
582
|
-
const flags =
|
|
599
|
+
const flags = {
|
|
600
|
+
...details.flags ?? {}
|
|
601
|
+
};
|
|
583
602
|
for(const key in overriddenFlags)if (overriddenFlags[key]) flags[key] = updateFlagValue(flags[key], overriddenFlags[key]);
|
|
584
603
|
else delete flags[key];
|
|
585
604
|
const result = {
|
|
@@ -602,6 +621,7 @@ class PostHogCore extends PostHogCoreStateless {
|
|
|
602
621
|
return !!response;
|
|
603
622
|
}
|
|
604
623
|
reloadFeatureFlags(options) {
|
|
624
|
+
if (this.disableRemoteFeatureFlags && !this.disabled) return void this._initPromise.then(()=>options?.cb?.(void 0, this.getFeatureFlags()));
|
|
605
625
|
this.flagsAsync({
|
|
606
626
|
sendAnonDistinctId: true
|
|
607
627
|
}).then((res)=>{
|
|
@@ -615,6 +635,10 @@ class PostHogCore extends PostHogCoreStateless {
|
|
|
615
635
|
return await this.remoteConfigAsync();
|
|
616
636
|
}
|
|
617
637
|
async reloadFeatureFlagsAsync(sendAnonDistinctId) {
|
|
638
|
+
if (this.disableRemoteFeatureFlags && !this.disabled) {
|
|
639
|
+
await this._initPromise;
|
|
640
|
+
return this.getFeatureFlags();
|
|
641
|
+
}
|
|
618
642
|
return (await this.flagsAsync({
|
|
619
643
|
sendAnonDistinctId: sendAnonDistinctId
|
|
620
644
|
}))?.featureFlags;
|
|
@@ -637,6 +661,51 @@ class PostHogCore extends PostHogCoreStateless {
|
|
|
637
661
|
return this.setPersistedProperty(PostHogPersistedProperty.OverrideFeatureFlags, flags);
|
|
638
662
|
});
|
|
639
663
|
}
|
|
664
|
+
updateFlags(flags, payloads, options) {
|
|
665
|
+
this.wrap(()=>{
|
|
666
|
+
const existingDetails = options?.merge ? this.getKnownFeatureFlagDetails()?.flags : void 0;
|
|
667
|
+
const existingFlags = existingDetails ? getFlagValuesFromFlags(existingDetails) : {};
|
|
668
|
+
const existingPayloads = {};
|
|
669
|
+
for(const key in existingDetails){
|
|
670
|
+
const storedPayload = existingDetails[key].metadata?.payload;
|
|
671
|
+
if (void 0 !== storedPayload) existingPayloads[key] = parsePayload(storedPayload);
|
|
672
|
+
}
|
|
673
|
+
const finalFlags = {
|
|
674
|
+
...existingFlags,
|
|
675
|
+
...flags
|
|
676
|
+
};
|
|
677
|
+
const finalPayloads = {
|
|
678
|
+
...existingPayloads,
|
|
679
|
+
...payloads ?? {}
|
|
680
|
+
};
|
|
681
|
+
const flagDetails = {};
|
|
682
|
+
for (const [key, value] of Object.entries(finalFlags)){
|
|
683
|
+
const payload = finalPayloads[key];
|
|
684
|
+
let serializedPayload;
|
|
685
|
+
if (void 0 !== payload) try {
|
|
686
|
+
serializedPayload = JSON.stringify(payload);
|
|
687
|
+
} catch (e) {
|
|
688
|
+
this._logger.error(`updateFlags: could not serialize the payload for flag "${key}", dropping it.`, e);
|
|
689
|
+
}
|
|
690
|
+
flagDetails[key] = {
|
|
691
|
+
key,
|
|
692
|
+
enabled: getEnabledFromValue(value),
|
|
693
|
+
variant: getVariantFromValue(value),
|
|
694
|
+
reason: void 0,
|
|
695
|
+
metadata: {
|
|
696
|
+
id: void 0,
|
|
697
|
+
version: void 0,
|
|
698
|
+
description: void 0,
|
|
699
|
+
payload: serializedPayload
|
|
700
|
+
}
|
|
701
|
+
};
|
|
702
|
+
}
|
|
703
|
+
if (this.sendFeatureFlagEvent) this.flagCallReported = {};
|
|
704
|
+
this.setKnownFeatureFlagDetails({
|
|
705
|
+
flags: flagDetails
|
|
706
|
+
});
|
|
707
|
+
});
|
|
708
|
+
}
|
|
640
709
|
captureException(error, additionalProperties, hint) {
|
|
641
710
|
try {
|
|
642
711
|
const exceptionProperties = this.getErrorPropertiesBuilder().buildFromUnknown(error, hint);
|
|
@@ -719,6 +788,26 @@ class PostHogCore extends PostHogCoreStateless {
|
|
|
719
788
|
this._cachedPersonProperties = hash;
|
|
720
789
|
});
|
|
721
790
|
}
|
|
791
|
+
unsetPersonProperties(propertyNames, reloadFeatureFlags = true) {
|
|
792
|
+
this.wrap(()=>{
|
|
793
|
+
const names = (isArray(propertyNames) ? propertyNames : [
|
|
794
|
+
propertyNames
|
|
795
|
+
]).filter((name)=>isString(name) && name.length > 0);
|
|
796
|
+
if (0 === names.length) return;
|
|
797
|
+
if (!this._requirePersonProcessing('posthog.unsetPersonProperties')) return;
|
|
798
|
+
const existingProperties = this.getPersistedProperty(PostHogPersistedProperty.PersonProperties) || {};
|
|
799
|
+
const nextProperties = {
|
|
800
|
+
...existingProperties
|
|
801
|
+
};
|
|
802
|
+
for (const name of names)delete nextProperties[name];
|
|
803
|
+
this.setPersistedProperty(PostHogPersistedProperty.PersonProperties, nextProperties);
|
|
804
|
+
if (reloadFeatureFlags) this.reloadFeatureFlags();
|
|
805
|
+
this.capture('$set', {
|
|
806
|
+
$unset: names
|
|
807
|
+
});
|
|
808
|
+
this._cachedPersonProperties = null;
|
|
809
|
+
});
|
|
810
|
+
}
|
|
722
811
|
processBeforeEnqueue(message) {
|
|
723
812
|
if (!this._beforeSend) return message;
|
|
724
813
|
const timestamp = message.timestamp;
|
package/dist/types.d.ts
CHANGED
|
@@ -53,6 +53,25 @@ export type PostHogCoreOptions = {
|
|
|
53
53
|
* @default true
|
|
54
54
|
*/
|
|
55
55
|
preloadFeatureFlags?: boolean;
|
|
56
|
+
/**
|
|
57
|
+
* Advanced: whether to disable fetching and evaluating feature flags from PostHog entirely.
|
|
58
|
+
*
|
|
59
|
+
* When set to true, `reloadFeatureFlags()` and the reloads triggered by `identify()`,
|
|
60
|
+
* `group()`, `setPersonPropertiesForFlags()` and `reset()` become no-ops, and any request
|
|
61
|
+
* to the flags endpoint that still goes out (e.g. to fetch remote config or surveys)
|
|
62
|
+
* carries `disable_flags: true` so the server skips flag evaluation. Flag values must be
|
|
63
|
+
* supplied via the `bootstrap` option or `updateFlags()` instead; `getFeatureFlag()` and
|
|
64
|
+
* related methods keep working against those values. Until `updateFlags()` runs, reads
|
|
65
|
+
* return their not-loaded defaults, so use `bootstrap` for any flags needed at startup.
|
|
66
|
+
* Equivalent to the web SDK's `advanced_disable_feature_flags`.
|
|
67
|
+
*
|
|
68
|
+
* Note: surveys gated on feature flags will not evaluate unless the survey targeting
|
|
69
|
+
* flags are also provided via `updateFlags()`. This option cannot be toggled at runtime.
|
|
70
|
+
* `posthog-node` inherits this option but does not implement it (no-op).
|
|
71
|
+
*
|
|
72
|
+
* @default false
|
|
73
|
+
*/
|
|
74
|
+
disableRemoteFeatureFlags?: boolean;
|
|
56
75
|
/**
|
|
57
76
|
* Whether to load remote config when initialized or not
|
|
58
77
|
* Experimental support
|
|
@@ -744,6 +763,15 @@ export declare const knownUnsafeEditableEvent: readonly ["$snapshot", "$pageview
|
|
|
744
763
|
* Some features of PostHog rely on receiving 100% of these events
|
|
745
764
|
*/
|
|
746
765
|
export type KnownUnsafeEditableEvent = (typeof knownUnsafeEditableEvent)[number];
|
|
766
|
+
export declare const knownUnsafeEditableEventProperty: readonly ["token"];
|
|
767
|
+
/**
|
|
768
|
+
* These event properties can be edited by the `before_send` function
|
|
769
|
+
* but are required for the event to be ingested. For example `token` carries
|
|
770
|
+
* the project api_key, and ingest rejects any event that arrives without it.
|
|
771
|
+
*
|
|
772
|
+
* If a `before_send` function removes one of these, the event is dropped.
|
|
773
|
+
*/
|
|
774
|
+
export type KnownUnsafeEditableEventProperty = (typeof knownUnsafeEditableEventProperty)[number];
|
|
747
775
|
/**
|
|
748
776
|
* Represents an event before it's sent to PostHog.
|
|
749
777
|
* This is the interface exposed to the `before_send` hook, matching the web SDK's `CaptureResult`.
|