posthog-js 1.287.0 → 1.288.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.
Files changed (41) hide show
  1. package/dist/array.full.es5.js +1 -1
  2. package/dist/array.full.es5.js.map +1 -1
  3. package/dist/array.full.js +1 -1
  4. package/dist/array.full.js.map +1 -1
  5. package/dist/array.full.no-external.js +1 -1
  6. package/dist/array.full.no-external.js.map +1 -1
  7. package/dist/array.js +1 -1
  8. package/dist/array.js.map +1 -1
  9. package/dist/array.no-external.js +1 -1
  10. package/dist/array.no-external.js.map +1 -1
  11. package/dist/customizations.full.js +1 -1
  12. package/dist/lazy-recorder.js +1 -1
  13. package/dist/main.js +1 -1
  14. package/dist/main.js.map +1 -1
  15. package/dist/module.d.ts +10 -1
  16. package/dist/module.full.d.ts +10 -1
  17. package/dist/module.full.js +1 -1
  18. package/dist/module.full.js.map +1 -1
  19. package/dist/module.full.no-external.d.ts +10 -1
  20. package/dist/module.full.no-external.js +1 -1
  21. package/dist/module.full.no-external.js.map +1 -1
  22. package/dist/module.js +1 -1
  23. package/dist/module.js.map +1 -1
  24. package/dist/module.no-external.d.ts +10 -1
  25. package/dist/module.no-external.js +1 -1
  26. package/dist/module.no-external.js.map +1 -1
  27. package/dist/posthog-recorder.js +1 -1
  28. package/dist/src/types.d.ts +8 -0
  29. package/dist/src/utils/request-router.d.ts +2 -1
  30. package/dist/surveys-preview.d.ts +10 -1
  31. package/lib/package.json +1 -1
  32. package/lib/src/posthog-core.js +1 -0
  33. package/lib/src/posthog-core.js.map +1 -1
  34. package/lib/src/posthog-featureflags.js +2 -2
  35. package/lib/src/posthog-featureflags.js.map +1 -1
  36. package/lib/src/types.d.ts +8 -0
  37. package/lib/src/types.js.map +1 -1
  38. package/lib/src/utils/request-router.d.ts +2 -1
  39. package/lib/src/utils/request-router.js +15 -0
  40. package/lib/src/utils/request-router.js.map +1 -1
  41. package/package.json +2 -2
@@ -380,7 +380,7 @@ var PostHogFeatureFlags = /** @class */ (function () {
380
380
  var queryParams = this._instance.config.advanced_only_evaluate_survey_feature_flags
381
381
  ? '&only_evaluate_survey_feature_flags=true'
382
382
  : '';
383
- var url = this._instance.requestRouter.endpointFor('api', flagsRoute + queryParams);
383
+ var url = this._instance.requestRouter.endpointFor('flags', flagsRoute + queryParams);
384
384
  if (useRemoteConfigWithFlags) {
385
385
  data.timezone = (0, event_utils_1.getTimezone)();
386
386
  }
@@ -543,7 +543,7 @@ var PostHogFeatureFlags = /** @class */ (function () {
543
543
  }
544
544
  this._instance._send_request({
545
545
  method: 'POST',
546
- url: this._instance.requestRouter.endpointFor('api', '/flags/?v=2&config=true'),
546
+ url: this._instance.requestRouter.endpointFor('flags', '/flags/?v=2&config=true'),
547
547
  data: data,
548
548
  compression: this._instance.config.disable_compression ? undefined : types_1.Compression.Base64,
549
549
  timeout: this._instance.config.feature_flag_request_timeout_ms,
@@ -1 +1 @@
1
- {"version":3,"file":"posthog-featureflags.js","sourceRoot":"","sources":["../../src/posthog-featureflags.ts"],"names":[],"mappings":"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","sourcesContent":["import { entries, extend } from './utils'\nimport { PostHog } from './posthog-core'\nimport {\n FlagsResponse,\n FeatureFlagsCallback,\n EarlyAccessFeatureCallback,\n EarlyAccessFeatureResponse,\n Properties,\n JsonType,\n Compression,\n EarlyAccessFeature,\n RemoteConfigFeatureFlagCallback,\n EarlyAccessFeatureStage,\n FeatureFlagDetail,\n} from './types'\nimport { PostHogPersistence } from './posthog-persistence'\n\nimport {\n PERSISTENCE_EARLY_ACCESS_FEATURES,\n PERSISTENCE_FEATURE_FLAG_DETAILS,\n ENABLED_FEATURE_FLAGS,\n STORED_GROUP_PROPERTIES_KEY,\n STORED_PERSON_PROPERTIES_KEY,\n FLAG_CALL_REPORTED,\n} from './constants'\n\nimport { isUndefined, isArray } from '@posthog/core'\nimport { createLogger } from './utils/logger'\nimport { getTimezone } from './utils/event-utils'\n\nconst logger = createLogger('[FeatureFlags]')\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'\nconst PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS = '$override_feature_flag_payloads'\nconst PERSISTENCE_FEATURE_FLAG_REQUEST_ID = '$feature_flag_request_id'\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 parseFlagsResponse = (\n response: Partial<FlagsResponse>,\n persistence: PostHogPersistence,\n currentFlags: Record<string, string | boolean> = {},\n currentFlagPayloads: Record<string, JsonType> = {},\n currentFlagDetails: Record<string, FeatureFlagDetail> = {}\n) => {\n const normalizedResponse = normalizeFlagsResponse(response)\n const flagDetails = normalizedResponse.flags\n const featureFlags = normalizedResponse.featureFlags\n const flagPayloads = normalizedResponse.featureFlagPayloads\n\n if (!featureFlags) {\n return // <-- This early return means we don't update anything, which is good.\n }\n\n const requestId = response['requestId']\n\n // using the v1 api\n if (isArray(featureFlags)) {\n logger.warn('v1 of the feature flags endpoint is deprecated. Please use the latest version.')\n const $enabled_feature_flags: Record<string, boolean> = {}\n if (featureFlags) {\n for (let i = 0; i < featureFlags.length; i++) {\n $enabled_feature_flags[featureFlags[i]] = true\n }\n }\n persistence &&\n persistence.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: featureFlags,\n [ENABLED_FEATURE_FLAGS]: $enabled_feature_flags,\n })\n return\n }\n\n // using the v2+ api\n let newFeatureFlags = featureFlags\n let newFeatureFlagPayloads = flagPayloads\n let newFeatureFlagDetails = flagDetails\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 newFeatureFlagDetails = { ...currentFlagDetails, ...newFeatureFlagDetails }\n }\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 [PERSISTENCE_FEATURE_FLAG_DETAILS]: newFeatureFlagDetails || {},\n ...(requestId ? { [PERSISTENCE_FEATURE_FLAG_REQUEST_ID]: requestId } : {}),\n })\n}\n\nconst normalizeFlagsResponse = (response: Partial<FlagsResponse>): Partial<FlagsResponse> => {\n const flagDetails = response['flags']\n\n if (flagDetails) {\n // This is a v=4 request.\n\n // Map of flag keys to flag values: Record<string, string | boolean>\n response.featureFlags = Object.fromEntries(\n Object.keys(flagDetails).map((flag) => [flag, flagDetails[flag].variant ?? flagDetails[flag].enabled])\n )\n // Map of flag keys to flag payloads: Record<string, JsonType>\n response.featureFlagPayloads = Object.fromEntries(\n Object.keys(flagDetails)\n .filter((flag) => flagDetails[flag].enabled)\n .filter((flag) => flagDetails[flag].metadata?.payload)\n .map((flag) => [flag, flagDetails[flag].metadata?.payload])\n )\n } else {\n logger.warn(\n 'Using an older version of the feature flags endpoint. Please upgrade your PostHog server to the latest version'\n )\n }\n return response\n}\n\ntype FeatureFlagOverrides = {\n [flagName: string]: string | boolean\n}\n\ntype FeatureFlagPayloadOverrides = {\n [flagName: string]: JsonType\n}\n\ntype FeatureFlagOverrideOptions = {\n flags?: boolean | string[] | FeatureFlagOverrides\n payloads?: FeatureFlagPayloadOverrides\n suppressWarning?: boolean\n}\n\ntype OverrideFeatureFlagsOptions =\n | boolean // clear all overrides\n | string[] // enable list of flags\n | FeatureFlagOverrides // set variants directly\n | FeatureFlagOverrideOptions\n\nexport enum QuotaLimitedResource {\n FeatureFlags = 'feature_flags',\n Recordings = 'recordings',\n}\n\nexport class PostHogFeatureFlags {\n _override_warning: boolean = false\n featureFlagEventHandlers: FeatureFlagsCallback[]\n $anon_distinct_id: string | undefined\n private _hasLoadedFlags: boolean = false\n private _requestInFlight: boolean = false\n private _reloadingDisabled: boolean = false\n private _additionalReloadRequested: boolean = false\n private _reloadDebouncer?: any\n private _flagsCalled: boolean = false\n private _flagsLoadedFromRemote: boolean = false\n\n constructor(private _instance: PostHog) {\n this.featureFlagEventHandlers = []\n }\n\n private _getValidEvaluationEnvironments(): string[] {\n const envs = this._instance.config.evaluation_environments\n if (!envs?.length) {\n return []\n }\n\n return envs.filter((env) => {\n const isValid = env && typeof env === 'string' && env.trim().length > 0\n if (!isValid) {\n logger.error('Invalid evaluation environment found:', env, 'Expected non-empty string')\n }\n return isValid\n })\n }\n\n private _shouldIncludeEvaluationEnvironments(): boolean {\n return this._getValidEvaluationEnvironments().length > 0\n }\n\n flags(): void {\n if (this._instance.config.__preview_remote_config) {\n // If remote config is enabled we don't call /flags and we mark it as called so that we don't simulate it\n this._flagsCalled = true\n return\n }\n\n // TRICKY: We want to disable flags if we don't have a queued reload, and one of the settings exist for disabling on first load\n const disableFlags =\n !this._reloadDebouncer &&\n (this._instance.config.advanced_disable_feature_flags ||\n this._instance.config.advanced_disable_feature_flags_on_first_load)\n\n this._callFlagsEndpoint({\n disableFlags,\n })\n }\n\n get hasLoadedFlags(): boolean {\n return this._hasLoadedFlags\n }\n\n getFlags(): string[] {\n return Object.keys(this.getFlagVariants())\n }\n\n getFlagsWithDetails(): Record<string, FeatureFlagDetail> {\n const flagDetails = this._instance.get_property(PERSISTENCE_FEATURE_FLAG_DETAILS)\n\n const overridenFlags = this._instance.get_property(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n const overriddenPayloads = this._instance.get_property(PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS)\n\n if (!overriddenPayloads && !overridenFlags) {\n return flagDetails || {}\n }\n\n const finalDetails = extend({}, flagDetails || {})\n const overriddenKeys = [\n ...new Set([...Object.keys(overriddenPayloads || {}), ...Object.keys(overridenFlags || {})]),\n ]\n for (const key of overriddenKeys) {\n const originalDetail = finalDetails[key]\n const overrideFlagValue = overridenFlags?.[key]\n\n const finalEnabled = isUndefined(overrideFlagValue)\n ? (originalDetail?.enabled ?? false)\n : !!overrideFlagValue\n\n const overrideVariant = isUndefined(overrideFlagValue)\n ? originalDetail.variant\n : typeof overrideFlagValue === 'string'\n ? overrideFlagValue\n : undefined\n\n const overridePayload = overriddenPayloads?.[key]\n\n const overridenDetail = {\n ...originalDetail,\n enabled: finalEnabled,\n // If the flag is not enabled, the variant should be undefined, even if the original has a variant value.\n variant: finalEnabled ? (overrideVariant ?? originalDetail?.variant) : undefined,\n }\n\n // Keep track of the original enabled and variant values so we can send them in the $feature_flag_called event.\n // This will be helpful for debugging and for understanding the impact of overrides.\n if (finalEnabled !== originalDetail?.enabled) {\n overridenDetail.original_enabled = originalDetail?.enabled\n }\n\n if (overrideVariant !== originalDetail?.variant) {\n overridenDetail.original_variant = originalDetail?.variant\n }\n\n if (overridePayload) {\n overridenDetail.metadata = {\n ...originalDetail?.metadata,\n payload: overridePayload,\n original_payload: originalDetail?.metadata?.payload,\n }\n }\n\n finalDetails[key] = overridenDetail\n }\n\n if (!this._override_warning) {\n logger.warn(' Overriding feature flag details!', {\n flagDetails,\n overriddenPayloads,\n finalDetails,\n })\n this._override_warning = true\n }\n return finalDetails\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 finalFlags[overriddenKeys[i]] = overriddenFlags[overriddenKeys[i]]\n }\n if (!this._override_warning) {\n logger.warn(' 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 const overriddenPayloads = this._instance.get_property(PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS)\n\n if (!overriddenPayloads) {\n return flagPayloads || {}\n }\n\n const finalPayloads = extend({}, flagPayloads || {})\n const overriddenKeys = Object.keys(overriddenPayloads)\n for (let i = 0; i < overriddenKeys.length; i++) {\n finalPayloads[overriddenKeys[i]] = overriddenPayloads[overriddenKeys[i]]\n }\n\n if (!this._override_warning) {\n logger.warn(' Overriding feature flag payloads!', {\n flagPayloads,\n overriddenPayloads,\n finalPayloads,\n })\n this._override_warning = true\n }\n return finalPayloads\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 */\n reloadFeatureFlags(): void {\n if (this._reloadingDisabled || this._instance.config.advanced_disable_feature_flags) {\n // If reloading has been explicitly disabled then we don't want to do anything\n // Or if feature flags are disabled\n return\n }\n\n if (this._reloadDebouncer) {\n // If we're already in a debounce then we don't want to do anything\n return\n }\n\n // Debounce multiple calls on the same tick\n this._reloadDebouncer = setTimeout(() => {\n this._callFlagsEndpoint()\n }, 5)\n }\n\n private _clearDebouncer(): void {\n clearTimeout(this._reloadDebouncer)\n this._reloadDebouncer = undefined\n }\n\n ensureFlagsLoaded(): void {\n if (this._hasLoadedFlags || this._requestInFlight || this._reloadDebouncer) {\n // If we are or have already loaded the flags then we don't want to do anything\n return\n }\n\n this.reloadFeatureFlags()\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._reloadingDisabled = isPaused\n }\n\n /**\n * NOTE: This is used both for flags and remote config. Once the RemoteConfig is fully released this will essentially only\n * be for flags and can eventually be replaced with the new flags endpoint\n */\n _callFlagsEndpoint(options?: { disableFlags?: boolean }): void {\n // Ensure we don't have double queued /flags requests\n this._clearDebouncer()\n if (this._instance._shouldDisableFlags()) {\n // The way this is documented is essentially used to refuse to ever call the /flags endpoint.\n return\n }\n if (this._requestInFlight) {\n this._additionalReloadRequested = true\n return\n }\n const token = this._instance.config.token\n const data: Record<string, any> = {\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: {\n ...(this._instance.persistence?.get_initial_props() || {}),\n ...(this._instance.get_property(STORED_PERSON_PROPERTIES_KEY) || {}),\n },\n group_properties: this._instance.get_property(STORED_GROUP_PROPERTIES_KEY),\n }\n\n if (options?.disableFlags || this._instance.config.advanced_disable_feature_flags) {\n data.disable_flags = true\n }\n\n // Add evaluation environments if configured\n if (this._shouldIncludeEvaluationEnvironments()) {\n data.evaluation_environments = this._getValidEvaluationEnvironments()\n }\n\n // flags supports loading config data with the `config` query param, but if you're using remote config, you\n // don't need to add that parameter because all the config data is loaded from the remote config endpoint.\n const useRemoteConfigWithFlags = this._instance.config.__preview_remote_config\n\n const flagsRoute = useRemoteConfigWithFlags ? '/flags/?v=2' : '/flags/?v=2&config=true'\n\n const queryParams = this._instance.config.advanced_only_evaluate_survey_feature_flags\n ? '&only_evaluate_survey_feature_flags=true'\n : ''\n\n const url = this._instance.requestRouter.endpointFor('api', flagsRoute + queryParams)\n\n if (useRemoteConfigWithFlags) {\n data.timezone = getTimezone()\n }\n\n this._requestInFlight = true\n this._instance._send_request({\n method: 'POST',\n url,\n data,\n compression: this._instance.config.disable_compression ? undefined : Compression.Base64,\n timeout: this._instance.config.feature_flag_request_timeout_ms,\n callback: (response) => {\n let errorsLoading = true\n\n if (response.statusCode === 200) {\n // successful request\n // reset anon_distinct_id after at least a single request with it\n // makes it through\n if (!this._additionalReloadRequested) {\n this.$anon_distinct_id = undefined\n }\n errorsLoading = false\n }\n\n this._requestInFlight = false\n\n // NB: this block is only reached if this._instance.config.__preview_remote_config is false\n if (!this._flagsCalled) {\n this._flagsCalled = true\n this._instance._onRemoteConfig(response.json ?? {})\n }\n\n if (data.disable_flags && !this._additionalReloadRequested) {\n // If flags are disabled then there is no need to call /flags again (flags are the only thing that may change)\n // UNLESS, an additional reload is requested.\n return\n }\n\n this._flagsLoadedFromRemote = !errorsLoading\n\n if (response.json && response.json.quotaLimited?.includes(QuotaLimitedResource.FeatureFlags)) {\n // log a warning and then early return\n logger.warn(\n 'You have hit your feature flags quota limit, and will not be able to load feature flags until the quota is reset. Please visit https://posthog.com/docs/billing/limits-alerts to learn more.'\n )\n return\n }\n\n if (!data.disable_flags) {\n this.receivedFeatureFlags(response.json ?? {}, errorsLoading)\n }\n\n if (this._additionalReloadRequested) {\n this._additionalReloadRequested = false\n this._callFlagsEndpoint()\n }\n },\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_called event to PostHog.\n */\n getFeatureFlag(key: string, options: { send_event?: boolean } = {}): boolean | string | undefined {\n if (!this._hasLoadedFlags && !(this.getFlags() && this.getFlags().length > 0)) {\n logger.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 requestId = this._instance.get_property(PERSISTENCE_FEATURE_FLAG_REQUEST_ID) || undefined\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 (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 const flagDetails = this.getFeatureFlagDetails(key)\n\n const properties: Record<string, any | undefined> = {\n $feature_flag: key,\n $feature_flag_response: flagValue,\n $feature_flag_payload: this.getFeatureFlagPayload(key) || null,\n $feature_flag_request_id: requestId,\n $feature_flag_bootstrapped_response: this._instance.config.bootstrap?.featureFlags?.[key] || null,\n $feature_flag_bootstrapped_payload:\n this._instance.config.bootstrap?.featureFlagPayloads?.[key] || null,\n // If we haven't yet received a response from the /flags endpoint, we must have used the bootstrapped value\n $used_bootstrap_value: !this._flagsLoadedFromRemote,\n }\n\n if (!isUndefined(flagDetails?.metadata?.version)) {\n properties.$feature_flag_version = flagDetails.metadata.version\n }\n\n const reason = flagDetails?.reason?.description ?? flagDetails?.reason?.code\n if (reason) {\n properties.$feature_flag_reason = reason\n }\n\n if (flagDetails?.metadata?.id) {\n properties.$feature_flag_id = flagDetails.metadata.id\n }\n\n // It's possible that flag values were overridden by calling overrideFeatureFlags.\n // We want to capture the original values in case someone forgets they were using overrides\n // and is wondering why their app is acting weird.\n if (!isUndefined(flagDetails?.original_variant) || !isUndefined(flagDetails?.original_enabled)) {\n properties.$feature_flag_original_response = !isUndefined(flagDetails.original_variant)\n ? flagDetails.original_variant\n : flagDetails.original_enabled\n }\n\n if (flagDetails?.metadata?.original_payload) {\n properties.$feature_flag_original_payload = flagDetails?.metadata?.original_payload\n }\n\n this._instance.capture('$feature_flag_called', properties)\n }\n }\n return flagValue\n }\n\n /*\n * Retrieves the details for a feature flag.\n *\n * ### Usage:\n *\n * const details = getFeatureFlagDetails(\"my-flag\")\n * console.log(details.metadata.version)\n * console.log(details.reason)\n *\n * @param {String} key Key of the feature flag.\n */\n getFeatureFlagDetails(key: string): FeatureFlagDetail | undefined {\n const details = this.getFlagsWithDetails()\n return details[key]\n }\n\n getFeatureFlagPayload(key: string): JsonType {\n const payloads = this.getFlagPayloads()\n return payloads[key]\n }\n\n /*\n * Fetches the payload for a remote config feature flag. This method will bypass any cached values and fetch the latest\n * value from the PostHog API.\n *\n * Note: Because the posthog-js SDK is primarily used with public project API keys, encrypted remote config payloads will\n * be redacted, never decrypted in the response.\n *\n * ### Usage:\n *\n * getRemoteConfigPayload(\"home-page-welcome-message\", (payload) => console.log(`Fetched remote config: ${payload}`))\n *\n * @param {String} key Key of the feature flag.\n * @param {Function} [callback] The callback function will be called once the remote config feature flag payload has been fetched.\n */\n getRemoteConfigPayload(key: string, callback: RemoteConfigFeatureFlagCallback): void {\n const token = this._instance.config.token\n const data: Record<string, any> = {\n distinct_id: this._instance.get_distinct_id(),\n token,\n }\n\n // Add evaluation environments if configured\n if (this._shouldIncludeEvaluationEnvironments()) {\n data.evaluation_environments = this._getValidEvaluationEnvironments()\n }\n\n this._instance._send_request({\n method: 'POST',\n url: this._instance.requestRouter.endpointFor('api', '/flags/?v=2&config=true'),\n data,\n compression: this._instance.config.disable_compression ? undefined : Compression.Base64,\n timeout: this._instance.config.feature_flag_request_timeout_ms,\n callback: (response) => {\n const flagPayloads = response.json?.['featureFlagPayloads']\n callback(flagPayloads?.[key] || undefined)\n },\n })\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 key Key of the feature flag.\n * @param [options] If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n * @returns A boolean value indicating whether or not the specified feature flag is enabled. If flag information has not yet been loaded,\n * or if the specified feature flag is disabled or does not exist, returns undefined.\n */\n isFeatureEnabled(key: string, options: { send_event?: boolean } = {}): boolean | undefined {\n if (!this._hasLoadedFlags && !(this.getFlags() && this.getFlags().length > 0)) {\n logger.warn('isFeatureEnabled for key \"' + key + '\" failed. Feature flags didn\\'t load in time.')\n return undefined\n }\n const flagValue = this.getFeatureFlag(key, options)\n return isUndefined(flagValue) ? undefined : !!flagValue\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<FlagsResponse>, errorsLoading?: boolean): void {\n if (!this._instance.persistence) {\n return\n }\n this._hasLoadedFlags = true\n\n const currentFlags = this.getFlagVariants()\n const currentFlagPayloads = this.getFlagPayloads()\n const currentFlagDetails = this.getFlagsWithDetails()\n parseFlagsResponse(response, this._instance.persistence, currentFlags, currentFlagPayloads, currentFlagDetails)\n this._fireFeatureFlagsCallbacks(errorsLoading)\n }\n\n /**\n * @deprecated Use overrideFeatureFlags instead. This will be removed in a future version.\n */\n override(flags: boolean | string[] | Record<string, string | boolean>, suppressWarning: boolean = false): void {\n logger.warn('override is deprecated. Please use overrideFeatureFlags instead.')\n this.overrideFeatureFlags({\n flags: flags,\n suppressWarning: suppressWarning,\n })\n }\n\n /**\n * Override feature flags on the client-side. Useful for setting non-persistent feature flags,\n * or for testing/debugging feature flags in the PostHog app.\n *\n * ### Usage:\n *\n * - posthog.featureFlags.overrideFeatureFlags(false) // clear all overrides\n * - posthog.featureFlags.overrideFeatureFlags(['beta-feature']) // enable flags\n * - posthog.featureFlags.overrideFeatureFlags({'beta-feature': 'variant'}) // set variants\n * - posthog.featureFlags.overrideFeatureFlags({ // set both flags and payloads\n * flags: {'beta-feature': 'variant'},\n * payloads: { 'beta-feature': { someData: true } }\n * })\n * - posthog.featureFlags.overrideFeatureFlags({ // only override payloads\n * payloads: { 'beta-feature': { someData: true } }\n * })\n */\n overrideFeatureFlags(overrideOptions: OverrideFeatureFlagsOptions): void {\n if (!this._instance.__loaded || !this._instance.persistence) {\n return logger.uninitializedWarning('posthog.featureFlags.overrideFeatureFlags')\n }\n\n // Clear all overrides if false, lets you do something like posthog.featureFlags.overrideFeatureFlags(false)\n if (overrideOptions === false) {\n this._instance.persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n this._instance.persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS)\n this._fireFeatureFlagsCallbacks()\n return\n }\n\n if (\n overrideOptions &&\n typeof overrideOptions === 'object' &&\n ('flags' in overrideOptions || 'payloads' in overrideOptions)\n ) {\n const options = overrideOptions\n this._override_warning = Boolean(options.suppressWarning ?? false)\n\n // Handle flags if provided, lets you do something like posthog.featureFlags.overrideFeatureFlags({flags: ['beta-feature']})\n if ('flags' in options) {\n if (options.flags === false) {\n this._instance.persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n } else if (options.flags) {\n if (isArray(options.flags)) {\n const flagsObj: Record<string, string | boolean> = {}\n for (let i = 0; i < options.flags.length; i++) {\n flagsObj[options.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]: options.flags })\n }\n }\n }\n\n // Handle payloads independently, lets you do something like posthog.featureFlags.overrideFeatureFlags({payloads: { 'beta-feature': { someData: true } }})\n if ('payloads' in options) {\n if (options.payloads === false) {\n this._instance.persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS)\n } else if (options.payloads) {\n this._instance.persistence.register({\n [PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS]: options.payloads,\n })\n }\n }\n\n this._fireFeatureFlagsCallbacks()\n return\n }\n\n this._fireFeatureFlagsCallbacks()\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, featureFlagsVariants, { errorsLoading }) { // 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, the variants,\n * and also a context object indicating whether we succeeded to fetch the flags or not.\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._hasLoadedFlags) {\n const { flags, flagVariants } = this._prepareFeatureFlagsForCallbacks()\n callback(flags, flagVariants)\n }\n return () => this.removeFeatureFlagsHandler(callback)\n }\n\n updateEarlyAccessFeatureEnrollment(key: string, isEnrolled: boolean, stage?: string): void {\n const existing_early_access_features: EarlyAccessFeature[] =\n this._instance.get_property(PERSISTENCE_EARLY_ACCESS_FEATURES) || []\n const feature = existing_early_access_features.find((f) => f.flagKey === key)\n\n const enrollmentPersonProp = {\n [`$feature_enrollment/${key}`]: isEnrolled,\n }\n\n const properties: Properties = {\n $feature_flag: key,\n $feature_enrollment: isEnrolled,\n $set: enrollmentPersonProp,\n }\n\n if (feature) {\n properties['$early_access_feature_name'] = feature.name\n }\n\n if (stage) {\n properties['$feature_enrollment_stage'] = stage\n }\n\n this._instance.capture('$feature_enrollment_update', properties)\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(\n callback: EarlyAccessFeatureCallback,\n force_reload = false,\n stages?: EarlyAccessFeatureStage[]\n ): void {\n const existing_early_access_features = this._instance.get_property(PERSISTENCE_EARLY_ACCESS_FEATURES)\n\n const stageParams = stages ? `&${stages.map((s) => `stage=${s}`).join('&')}` : ''\n\n if (!existing_early_access_features || force_reload) {\n this._instance._send_request({\n url: this._instance.requestRouter.endpointFor(\n 'api',\n `/api/early_access_features/?token=${this._instance.config.token}${stageParams}`\n ),\n method: 'GET',\n callback: (response) => {\n if (!response.json) {\n return\n }\n const earlyAccessFeatures = (response.json as EarlyAccessFeatureResponse).earlyAccessFeatures\n // Unregister first to ensure complete replacement, not merge\n // This prevents accumulation of stale features in persistence\n this._instance.persistence?.unregister(PERSISTENCE_EARLY_ACCESS_FEATURES)\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(errorsLoading?: boolean): void {\n const { flags, flagVariants } = this._prepareFeatureFlagsForCallbacks()\n this.featureFlagEventHandlers.forEach((handler) => handler(flags, flagVariants, { errorsLoading }))\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 reset(): void {\n this._hasLoadedFlags = false\n this._requestInFlight = false\n this._reloadingDisabled = false\n this._additionalReloadRequested = false\n this._flagsCalled = false\n this._flagsLoadedFromRemote = false\n this.$anon_distinct_id = undefined\n this._clearDebouncer()\n this._override_warning = false\n }\n}\n"]}
1
+ {"version":3,"file":"posthog-featureflags.js","sourceRoot":"","sources":["../../src/posthog-featureflags.ts"],"names":[],"mappings":"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","sourcesContent":["import { entries, extend } from './utils'\nimport { PostHog } from './posthog-core'\nimport {\n FlagsResponse,\n FeatureFlagsCallback,\n EarlyAccessFeatureCallback,\n EarlyAccessFeatureResponse,\n Properties,\n JsonType,\n Compression,\n EarlyAccessFeature,\n RemoteConfigFeatureFlagCallback,\n EarlyAccessFeatureStage,\n FeatureFlagDetail,\n} from './types'\nimport { PostHogPersistence } from './posthog-persistence'\n\nimport {\n PERSISTENCE_EARLY_ACCESS_FEATURES,\n PERSISTENCE_FEATURE_FLAG_DETAILS,\n ENABLED_FEATURE_FLAGS,\n STORED_GROUP_PROPERTIES_KEY,\n STORED_PERSON_PROPERTIES_KEY,\n FLAG_CALL_REPORTED,\n} from './constants'\n\nimport { isUndefined, isArray } from '@posthog/core'\nimport { createLogger } from './utils/logger'\nimport { getTimezone } from './utils/event-utils'\n\nconst logger = createLogger('[FeatureFlags]')\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'\nconst PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS = '$override_feature_flag_payloads'\nconst PERSISTENCE_FEATURE_FLAG_REQUEST_ID = '$feature_flag_request_id'\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 parseFlagsResponse = (\n response: Partial<FlagsResponse>,\n persistence: PostHogPersistence,\n currentFlags: Record<string, string | boolean> = {},\n currentFlagPayloads: Record<string, JsonType> = {},\n currentFlagDetails: Record<string, FeatureFlagDetail> = {}\n) => {\n const normalizedResponse = normalizeFlagsResponse(response)\n const flagDetails = normalizedResponse.flags\n const featureFlags = normalizedResponse.featureFlags\n const flagPayloads = normalizedResponse.featureFlagPayloads\n\n if (!featureFlags) {\n return // <-- This early return means we don't update anything, which is good.\n }\n\n const requestId = response['requestId']\n\n // using the v1 api\n if (isArray(featureFlags)) {\n logger.warn('v1 of the feature flags endpoint is deprecated. Please use the latest version.')\n const $enabled_feature_flags: Record<string, boolean> = {}\n if (featureFlags) {\n for (let i = 0; i < featureFlags.length; i++) {\n $enabled_feature_flags[featureFlags[i]] = true\n }\n }\n persistence &&\n persistence.register({\n [PERSISTENCE_ACTIVE_FEATURE_FLAGS]: featureFlags,\n [ENABLED_FEATURE_FLAGS]: $enabled_feature_flags,\n })\n return\n }\n\n // using the v2+ api\n let newFeatureFlags = featureFlags\n let newFeatureFlagPayloads = flagPayloads\n let newFeatureFlagDetails = flagDetails\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 newFeatureFlagDetails = { ...currentFlagDetails, ...newFeatureFlagDetails }\n }\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 [PERSISTENCE_FEATURE_FLAG_DETAILS]: newFeatureFlagDetails || {},\n ...(requestId ? { [PERSISTENCE_FEATURE_FLAG_REQUEST_ID]: requestId } : {}),\n })\n}\n\nconst normalizeFlagsResponse = (response: Partial<FlagsResponse>): Partial<FlagsResponse> => {\n const flagDetails = response['flags']\n\n if (flagDetails) {\n // This is a v=4 request.\n\n // Map of flag keys to flag values: Record<string, string | boolean>\n response.featureFlags = Object.fromEntries(\n Object.keys(flagDetails).map((flag) => [flag, flagDetails[flag].variant ?? flagDetails[flag].enabled])\n )\n // Map of flag keys to flag payloads: Record<string, JsonType>\n response.featureFlagPayloads = Object.fromEntries(\n Object.keys(flagDetails)\n .filter((flag) => flagDetails[flag].enabled)\n .filter((flag) => flagDetails[flag].metadata?.payload)\n .map((flag) => [flag, flagDetails[flag].metadata?.payload])\n )\n } else {\n logger.warn(\n 'Using an older version of the feature flags endpoint. Please upgrade your PostHog server to the latest version'\n )\n }\n return response\n}\n\ntype FeatureFlagOverrides = {\n [flagName: string]: string | boolean\n}\n\ntype FeatureFlagPayloadOverrides = {\n [flagName: string]: JsonType\n}\n\ntype FeatureFlagOverrideOptions = {\n flags?: boolean | string[] | FeatureFlagOverrides\n payloads?: FeatureFlagPayloadOverrides\n suppressWarning?: boolean\n}\n\ntype OverrideFeatureFlagsOptions =\n | boolean // clear all overrides\n | string[] // enable list of flags\n | FeatureFlagOverrides // set variants directly\n | FeatureFlagOverrideOptions\n\nexport enum QuotaLimitedResource {\n FeatureFlags = 'feature_flags',\n Recordings = 'recordings',\n}\n\nexport class PostHogFeatureFlags {\n _override_warning: boolean = false\n featureFlagEventHandlers: FeatureFlagsCallback[]\n $anon_distinct_id: string | undefined\n private _hasLoadedFlags: boolean = false\n private _requestInFlight: boolean = false\n private _reloadingDisabled: boolean = false\n private _additionalReloadRequested: boolean = false\n private _reloadDebouncer?: any\n private _flagsCalled: boolean = false\n private _flagsLoadedFromRemote: boolean = false\n\n constructor(private _instance: PostHog) {\n this.featureFlagEventHandlers = []\n }\n\n private _getValidEvaluationEnvironments(): string[] {\n const envs = this._instance.config.evaluation_environments\n if (!envs?.length) {\n return []\n }\n\n return envs.filter((env) => {\n const isValid = env && typeof env === 'string' && env.trim().length > 0\n if (!isValid) {\n logger.error('Invalid evaluation environment found:', env, 'Expected non-empty string')\n }\n return isValid\n })\n }\n\n private _shouldIncludeEvaluationEnvironments(): boolean {\n return this._getValidEvaluationEnvironments().length > 0\n }\n\n flags(): void {\n if (this._instance.config.__preview_remote_config) {\n // If remote config is enabled we don't call /flags and we mark it as called so that we don't simulate it\n this._flagsCalled = true\n return\n }\n\n // TRICKY: We want to disable flags if we don't have a queued reload, and one of the settings exist for disabling on first load\n const disableFlags =\n !this._reloadDebouncer &&\n (this._instance.config.advanced_disable_feature_flags ||\n this._instance.config.advanced_disable_feature_flags_on_first_load)\n\n this._callFlagsEndpoint({\n disableFlags,\n })\n }\n\n get hasLoadedFlags(): boolean {\n return this._hasLoadedFlags\n }\n\n getFlags(): string[] {\n return Object.keys(this.getFlagVariants())\n }\n\n getFlagsWithDetails(): Record<string, FeatureFlagDetail> {\n const flagDetails = this._instance.get_property(PERSISTENCE_FEATURE_FLAG_DETAILS)\n\n const overridenFlags = this._instance.get_property(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n const overriddenPayloads = this._instance.get_property(PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS)\n\n if (!overriddenPayloads && !overridenFlags) {\n return flagDetails || {}\n }\n\n const finalDetails = extend({}, flagDetails || {})\n const overriddenKeys = [\n ...new Set([...Object.keys(overriddenPayloads || {}), ...Object.keys(overridenFlags || {})]),\n ]\n for (const key of overriddenKeys) {\n const originalDetail = finalDetails[key]\n const overrideFlagValue = overridenFlags?.[key]\n\n const finalEnabled = isUndefined(overrideFlagValue)\n ? (originalDetail?.enabled ?? false)\n : !!overrideFlagValue\n\n const overrideVariant = isUndefined(overrideFlagValue)\n ? originalDetail.variant\n : typeof overrideFlagValue === 'string'\n ? overrideFlagValue\n : undefined\n\n const overridePayload = overriddenPayloads?.[key]\n\n const overridenDetail = {\n ...originalDetail,\n enabled: finalEnabled,\n // If the flag is not enabled, the variant should be undefined, even if the original has a variant value.\n variant: finalEnabled ? (overrideVariant ?? originalDetail?.variant) : undefined,\n }\n\n // Keep track of the original enabled and variant values so we can send them in the $feature_flag_called event.\n // This will be helpful for debugging and for understanding the impact of overrides.\n if (finalEnabled !== originalDetail?.enabled) {\n overridenDetail.original_enabled = originalDetail?.enabled\n }\n\n if (overrideVariant !== originalDetail?.variant) {\n overridenDetail.original_variant = originalDetail?.variant\n }\n\n if (overridePayload) {\n overridenDetail.metadata = {\n ...originalDetail?.metadata,\n payload: overridePayload,\n original_payload: originalDetail?.metadata?.payload,\n }\n }\n\n finalDetails[key] = overridenDetail\n }\n\n if (!this._override_warning) {\n logger.warn(' Overriding feature flag details!', {\n flagDetails,\n overriddenPayloads,\n finalDetails,\n })\n this._override_warning = true\n }\n return finalDetails\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 finalFlags[overriddenKeys[i]] = overriddenFlags[overriddenKeys[i]]\n }\n if (!this._override_warning) {\n logger.warn(' 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 const overriddenPayloads = this._instance.get_property(PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS)\n\n if (!overriddenPayloads) {\n return flagPayloads || {}\n }\n\n const finalPayloads = extend({}, flagPayloads || {})\n const overriddenKeys = Object.keys(overriddenPayloads)\n for (let i = 0; i < overriddenKeys.length; i++) {\n finalPayloads[overriddenKeys[i]] = overriddenPayloads[overriddenKeys[i]]\n }\n\n if (!this._override_warning) {\n logger.warn(' Overriding feature flag payloads!', {\n flagPayloads,\n overriddenPayloads,\n finalPayloads,\n })\n this._override_warning = true\n }\n return finalPayloads\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 */\n reloadFeatureFlags(): void {\n if (this._reloadingDisabled || this._instance.config.advanced_disable_feature_flags) {\n // If reloading has been explicitly disabled then we don't want to do anything\n // Or if feature flags are disabled\n return\n }\n\n if (this._reloadDebouncer) {\n // If we're already in a debounce then we don't want to do anything\n return\n }\n\n // Debounce multiple calls on the same tick\n this._reloadDebouncer = setTimeout(() => {\n this._callFlagsEndpoint()\n }, 5)\n }\n\n private _clearDebouncer(): void {\n clearTimeout(this._reloadDebouncer)\n this._reloadDebouncer = undefined\n }\n\n ensureFlagsLoaded(): void {\n if (this._hasLoadedFlags || this._requestInFlight || this._reloadDebouncer) {\n // If we are or have already loaded the flags then we don't want to do anything\n return\n }\n\n this.reloadFeatureFlags()\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._reloadingDisabled = isPaused\n }\n\n /**\n * NOTE: This is used both for flags and remote config. Once the RemoteConfig is fully released this will essentially only\n * be for flags and can eventually be replaced with the new flags endpoint\n */\n _callFlagsEndpoint(options?: { disableFlags?: boolean }): void {\n // Ensure we don't have double queued /flags requests\n this._clearDebouncer()\n if (this._instance._shouldDisableFlags()) {\n // The way this is documented is essentially used to refuse to ever call the /flags endpoint.\n return\n }\n if (this._requestInFlight) {\n this._additionalReloadRequested = true\n return\n }\n const token = this._instance.config.token\n const data: Record<string, any> = {\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: {\n ...(this._instance.persistence?.get_initial_props() || {}),\n ...(this._instance.get_property(STORED_PERSON_PROPERTIES_KEY) || {}),\n },\n group_properties: this._instance.get_property(STORED_GROUP_PROPERTIES_KEY),\n }\n\n if (options?.disableFlags || this._instance.config.advanced_disable_feature_flags) {\n data.disable_flags = true\n }\n\n // Add evaluation environments if configured\n if (this._shouldIncludeEvaluationEnvironments()) {\n data.evaluation_environments = this._getValidEvaluationEnvironments()\n }\n\n // flags supports loading config data with the `config` query param, but if you're using remote config, you\n // don't need to add that parameter because all the config data is loaded from the remote config endpoint.\n const useRemoteConfigWithFlags = this._instance.config.__preview_remote_config\n\n const flagsRoute = useRemoteConfigWithFlags ? '/flags/?v=2' : '/flags/?v=2&config=true'\n\n const queryParams = this._instance.config.advanced_only_evaluate_survey_feature_flags\n ? '&only_evaluate_survey_feature_flags=true'\n : ''\n\n const url = this._instance.requestRouter.endpointFor('flags', flagsRoute + queryParams)\n\n if (useRemoteConfigWithFlags) {\n data.timezone = getTimezone()\n }\n\n this._requestInFlight = true\n this._instance._send_request({\n method: 'POST',\n url,\n data,\n compression: this._instance.config.disable_compression ? undefined : Compression.Base64,\n timeout: this._instance.config.feature_flag_request_timeout_ms,\n callback: (response) => {\n let errorsLoading = true\n\n if (response.statusCode === 200) {\n // successful request\n // reset anon_distinct_id after at least a single request with it\n // makes it through\n if (!this._additionalReloadRequested) {\n this.$anon_distinct_id = undefined\n }\n errorsLoading = false\n }\n\n this._requestInFlight = false\n\n // NB: this block is only reached if this._instance.config.__preview_remote_config is false\n if (!this._flagsCalled) {\n this._flagsCalled = true\n this._instance._onRemoteConfig(response.json ?? {})\n }\n\n if (data.disable_flags && !this._additionalReloadRequested) {\n // If flags are disabled then there is no need to call /flags again (flags are the only thing that may change)\n // UNLESS, an additional reload is requested.\n return\n }\n\n this._flagsLoadedFromRemote = !errorsLoading\n\n if (response.json && response.json.quotaLimited?.includes(QuotaLimitedResource.FeatureFlags)) {\n // log a warning and then early return\n logger.warn(\n 'You have hit your feature flags quota limit, and will not be able to load feature flags until the quota is reset. Please visit https://posthog.com/docs/billing/limits-alerts to learn more.'\n )\n return\n }\n\n if (!data.disable_flags) {\n this.receivedFeatureFlags(response.json ?? {}, errorsLoading)\n }\n\n if (this._additionalReloadRequested) {\n this._additionalReloadRequested = false\n this._callFlagsEndpoint()\n }\n },\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_called event to PostHog.\n */\n getFeatureFlag(key: string, options: { send_event?: boolean } = {}): boolean | string | undefined {\n if (!this._hasLoadedFlags && !(this.getFlags() && this.getFlags().length > 0)) {\n logger.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 requestId = this._instance.get_property(PERSISTENCE_FEATURE_FLAG_REQUEST_ID) || undefined\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 (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 const flagDetails = this.getFeatureFlagDetails(key)\n\n const properties: Record<string, any | undefined> = {\n $feature_flag: key,\n $feature_flag_response: flagValue,\n $feature_flag_payload: this.getFeatureFlagPayload(key) || null,\n $feature_flag_request_id: requestId,\n $feature_flag_bootstrapped_response: this._instance.config.bootstrap?.featureFlags?.[key] || null,\n $feature_flag_bootstrapped_payload:\n this._instance.config.bootstrap?.featureFlagPayloads?.[key] || null,\n // If we haven't yet received a response from the /flags endpoint, we must have used the bootstrapped value\n $used_bootstrap_value: !this._flagsLoadedFromRemote,\n }\n\n if (!isUndefined(flagDetails?.metadata?.version)) {\n properties.$feature_flag_version = flagDetails.metadata.version\n }\n\n const reason = flagDetails?.reason?.description ?? flagDetails?.reason?.code\n if (reason) {\n properties.$feature_flag_reason = reason\n }\n\n if (flagDetails?.metadata?.id) {\n properties.$feature_flag_id = flagDetails.metadata.id\n }\n\n // It's possible that flag values were overridden by calling overrideFeatureFlags.\n // We want to capture the original values in case someone forgets they were using overrides\n // and is wondering why their app is acting weird.\n if (!isUndefined(flagDetails?.original_variant) || !isUndefined(flagDetails?.original_enabled)) {\n properties.$feature_flag_original_response = !isUndefined(flagDetails.original_variant)\n ? flagDetails.original_variant\n : flagDetails.original_enabled\n }\n\n if (flagDetails?.metadata?.original_payload) {\n properties.$feature_flag_original_payload = flagDetails?.metadata?.original_payload\n }\n\n this._instance.capture('$feature_flag_called', properties)\n }\n }\n return flagValue\n }\n\n /*\n * Retrieves the details for a feature flag.\n *\n * ### Usage:\n *\n * const details = getFeatureFlagDetails(\"my-flag\")\n * console.log(details.metadata.version)\n * console.log(details.reason)\n *\n * @param {String} key Key of the feature flag.\n */\n getFeatureFlagDetails(key: string): FeatureFlagDetail | undefined {\n const details = this.getFlagsWithDetails()\n return details[key]\n }\n\n getFeatureFlagPayload(key: string): JsonType {\n const payloads = this.getFlagPayloads()\n return payloads[key]\n }\n\n /*\n * Fetches the payload for a remote config feature flag. This method will bypass any cached values and fetch the latest\n * value from the PostHog API.\n *\n * Note: Because the posthog-js SDK is primarily used with public project API keys, encrypted remote config payloads will\n * be redacted, never decrypted in the response.\n *\n * ### Usage:\n *\n * getRemoteConfigPayload(\"home-page-welcome-message\", (payload) => console.log(`Fetched remote config: ${payload}`))\n *\n * @param {String} key Key of the feature flag.\n * @param {Function} [callback] The callback function will be called once the remote config feature flag payload has been fetched.\n */\n getRemoteConfigPayload(key: string, callback: RemoteConfigFeatureFlagCallback): void {\n const token = this._instance.config.token\n const data: Record<string, any> = {\n distinct_id: this._instance.get_distinct_id(),\n token,\n }\n\n // Add evaluation environments if configured\n if (this._shouldIncludeEvaluationEnvironments()) {\n data.evaluation_environments = this._getValidEvaluationEnvironments()\n }\n\n this._instance._send_request({\n method: 'POST',\n url: this._instance.requestRouter.endpointFor('flags', '/flags/?v=2&config=true'),\n data,\n compression: this._instance.config.disable_compression ? undefined : Compression.Base64,\n timeout: this._instance.config.feature_flag_request_timeout_ms,\n callback: (response) => {\n const flagPayloads = response.json?.['featureFlagPayloads']\n callback(flagPayloads?.[key] || undefined)\n },\n })\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 key Key of the feature flag.\n * @param [options] If {send_event: false}, we won't send an $feature_flag_call event to PostHog.\n * @returns A boolean value indicating whether or not the specified feature flag is enabled. If flag information has not yet been loaded,\n * or if the specified feature flag is disabled or does not exist, returns undefined.\n */\n isFeatureEnabled(key: string, options: { send_event?: boolean } = {}): boolean | undefined {\n if (!this._hasLoadedFlags && !(this.getFlags() && this.getFlags().length > 0)) {\n logger.warn('isFeatureEnabled for key \"' + key + '\" failed. Feature flags didn\\'t load in time.')\n return undefined\n }\n const flagValue = this.getFeatureFlag(key, options)\n return isUndefined(flagValue) ? undefined : !!flagValue\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<FlagsResponse>, errorsLoading?: boolean): void {\n if (!this._instance.persistence) {\n return\n }\n this._hasLoadedFlags = true\n\n const currentFlags = this.getFlagVariants()\n const currentFlagPayloads = this.getFlagPayloads()\n const currentFlagDetails = this.getFlagsWithDetails()\n parseFlagsResponse(response, this._instance.persistence, currentFlags, currentFlagPayloads, currentFlagDetails)\n this._fireFeatureFlagsCallbacks(errorsLoading)\n }\n\n /**\n * @deprecated Use overrideFeatureFlags instead. This will be removed in a future version.\n */\n override(flags: boolean | string[] | Record<string, string | boolean>, suppressWarning: boolean = false): void {\n logger.warn('override is deprecated. Please use overrideFeatureFlags instead.')\n this.overrideFeatureFlags({\n flags: flags,\n suppressWarning: suppressWarning,\n })\n }\n\n /**\n * Override feature flags on the client-side. Useful for setting non-persistent feature flags,\n * or for testing/debugging feature flags in the PostHog app.\n *\n * ### Usage:\n *\n * - posthog.featureFlags.overrideFeatureFlags(false) // clear all overrides\n * - posthog.featureFlags.overrideFeatureFlags(['beta-feature']) // enable flags\n * - posthog.featureFlags.overrideFeatureFlags({'beta-feature': 'variant'}) // set variants\n * - posthog.featureFlags.overrideFeatureFlags({ // set both flags and payloads\n * flags: {'beta-feature': 'variant'},\n * payloads: { 'beta-feature': { someData: true } }\n * })\n * - posthog.featureFlags.overrideFeatureFlags({ // only override payloads\n * payloads: { 'beta-feature': { someData: true } }\n * })\n */\n overrideFeatureFlags(overrideOptions: OverrideFeatureFlagsOptions): void {\n if (!this._instance.__loaded || !this._instance.persistence) {\n return logger.uninitializedWarning('posthog.featureFlags.overrideFeatureFlags')\n }\n\n // Clear all overrides if false, lets you do something like posthog.featureFlags.overrideFeatureFlags(false)\n if (overrideOptions === false) {\n this._instance.persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n this._instance.persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS)\n this._fireFeatureFlagsCallbacks()\n return\n }\n\n if (\n overrideOptions &&\n typeof overrideOptions === 'object' &&\n ('flags' in overrideOptions || 'payloads' in overrideOptions)\n ) {\n const options = overrideOptions\n this._override_warning = Boolean(options.suppressWarning ?? false)\n\n // Handle flags if provided, lets you do something like posthog.featureFlags.overrideFeatureFlags({flags: ['beta-feature']})\n if ('flags' in options) {\n if (options.flags === false) {\n this._instance.persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAGS)\n } else if (options.flags) {\n if (isArray(options.flags)) {\n const flagsObj: Record<string, string | boolean> = {}\n for (let i = 0; i < options.flags.length; i++) {\n flagsObj[options.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]: options.flags })\n }\n }\n }\n\n // Handle payloads independently, lets you do something like posthog.featureFlags.overrideFeatureFlags({payloads: { 'beta-feature': { someData: true } }})\n if ('payloads' in options) {\n if (options.payloads === false) {\n this._instance.persistence.unregister(PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS)\n } else if (options.payloads) {\n this._instance.persistence.register({\n [PERSISTENCE_OVERRIDE_FEATURE_FLAG_PAYLOADS]: options.payloads,\n })\n }\n }\n\n this._fireFeatureFlagsCallbacks()\n return\n }\n\n this._fireFeatureFlagsCallbacks()\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, featureFlagsVariants, { errorsLoading }) { // 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, the variants,\n * and also a context object indicating whether we succeeded to fetch the flags or not.\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._hasLoadedFlags) {\n const { flags, flagVariants } = this._prepareFeatureFlagsForCallbacks()\n callback(flags, flagVariants)\n }\n return () => this.removeFeatureFlagsHandler(callback)\n }\n\n updateEarlyAccessFeatureEnrollment(key: string, isEnrolled: boolean, stage?: string): void {\n const existing_early_access_features: EarlyAccessFeature[] =\n this._instance.get_property(PERSISTENCE_EARLY_ACCESS_FEATURES) || []\n const feature = existing_early_access_features.find((f) => f.flagKey === key)\n\n const enrollmentPersonProp = {\n [`$feature_enrollment/${key}`]: isEnrolled,\n }\n\n const properties: Properties = {\n $feature_flag: key,\n $feature_enrollment: isEnrolled,\n $set: enrollmentPersonProp,\n }\n\n if (feature) {\n properties['$early_access_feature_name'] = feature.name\n }\n\n if (stage) {\n properties['$feature_enrollment_stage'] = stage\n }\n\n this._instance.capture('$feature_enrollment_update', properties)\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(\n callback: EarlyAccessFeatureCallback,\n force_reload = false,\n stages?: EarlyAccessFeatureStage[]\n ): void {\n const existing_early_access_features = this._instance.get_property(PERSISTENCE_EARLY_ACCESS_FEATURES)\n\n const stageParams = stages ? `&${stages.map((s) => `stage=${s}`).join('&')}` : ''\n\n if (!existing_early_access_features || force_reload) {\n this._instance._send_request({\n url: this._instance.requestRouter.endpointFor(\n 'api',\n `/api/early_access_features/?token=${this._instance.config.token}${stageParams}`\n ),\n method: 'GET',\n callback: (response) => {\n if (!response.json) {\n return\n }\n const earlyAccessFeatures = (response.json as EarlyAccessFeatureResponse).earlyAccessFeatures\n // Unregister first to ensure complete replacement, not merge\n // This prevents accumulation of stale features in persistence\n this._instance.persistence?.unregister(PERSISTENCE_EARLY_ACCESS_FEATURES)\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(errorsLoading?: boolean): void {\n const { flags, flagVariants } = this._prepareFeatureFlagsForCallbacks()\n this.featureFlagEventHandlers.forEach((handler) => handler(flags, flagVariants, { errorsLoading }))\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 reset(): void {\n this._hasLoadedFlags = false\n this._requestInFlight = false\n this._reloadingDisabled = false\n this._additionalReloadRequested = false\n this._flagsCalled = false\n this._flagsLoadedFromRemote = false\n this.$anon_distinct_id = undefined\n this._clearDebouncer()\n this._override_warning = false\n }\n}\n"]}
@@ -228,6 +228,14 @@ export interface PostHogConfig {
228
228
  * @default 'https://us.i.posthog.com'
229
229
  */
230
230
  api_host: string;
231
+ /**
232
+ * URL to use for feature flag requests specifically.
233
+ * If not set, feature flag requests will use the URL derived from `api_host`.
234
+ * This is useful when you want to route feature flag requests to a different endpoint than other analytic APIs.
235
+ *
236
+ * @default null
237
+ */
238
+ flags_api_host?: string | null;
231
239
  /**
232
240
  * If using a reverse proxy for `api_host` then this should be the actual PostHog app URL (e.g. https://us.posthog.com).
233
241
  * This ensures that links to PostHog point to the correct host.