@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.
@@ -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;;;;GAIG;AACH,eAAO,MAAM,kCAAkC,GAC7C,eAAe,2BAA2B,KACzC,oBAAoB,CAAC,OAAO,CAoB9B,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"}
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"}
@@ -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, getFlagDetailsFromFlagsAndPayloads, getFlagValuesFromFlags, getPayloadsFromFlags, getVariantFromValue, normalizeFlagsResponse, parsePayload, updateFlagValue };
94
+ export { createFlagsResponseFromFlagsAndPayloads, getEnabledFromValue, getFeatureFlagValue, getFlagValuesFromFlags, getPayloadsFromFlags, getVariantFromValue, normalizeFlagsResponse, parsePayload, updateFlagValue };
@@ -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":"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"}
1
+ {"version":3,"file":"posthog-core.d.ts","sourceRoot":"","sources":["../src/posthog-core.ts"],"names":[],"mappings":"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"}
@@ -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.reloadFeatureFlags();
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) return void this.setKnownFeatureFlagDetails({
417
- flags: this.getKnownFeatureFlagDetails()?.flags ?? {},
418
- requestError: result.error
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 = details.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;
@@ -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.reloadFeatureFlags();
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) return void this.setKnownFeatureFlagDetails({
389
- flags: this.getKnownFeatureFlagDetails()?.flags ?? {},
390
- requestError: result.error
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 = details.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`.