posthog-node 5.8.8 → 5.9.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.
Files changed (129) hide show
  1. package/dist/{index.d.ts → client.d.ts} +7 -378
  2. package/dist/client.d.ts.map +1 -0
  3. package/dist/client.js +481 -0
  4. package/dist/client.mjs +437 -0
  5. package/dist/entrypoints/index.edge.d.ts +6 -0
  6. package/dist/entrypoints/index.edge.d.ts.map +1 -0
  7. package/dist/entrypoints/index.edge.js +89 -0
  8. package/dist/entrypoints/index.edge.mjs +12 -0
  9. package/dist/entrypoints/index.node.d.ts +6 -0
  10. package/dist/entrypoints/index.node.d.ts.map +1 -0
  11. package/dist/entrypoints/index.node.js +99 -0
  12. package/dist/entrypoints/index.node.mjs +16 -0
  13. package/dist/exports.d.ts +4 -0
  14. package/dist/exports.d.ts.map +1 -0
  15. package/dist/exports.js +78 -0
  16. package/dist/exports.mjs +3 -0
  17. package/dist/extensions/error-tracking/autocapture.d.ts +4 -0
  18. package/dist/extensions/error-tracking/autocapture.d.ts.map +1 -0
  19. package/dist/extensions/error-tracking/autocapture.js +68 -0
  20. package/dist/extensions/error-tracking/autocapture.mjs +31 -0
  21. package/dist/extensions/error-tracking/chunk-ids.d.ts +5 -0
  22. package/dist/extensions/error-tracking/chunk-ids.d.ts.map +1 -0
  23. package/dist/extensions/error-tracking/chunk-ids.js +68 -0
  24. package/dist/extensions/error-tracking/chunk-ids.mjs +34 -0
  25. package/dist/extensions/error-tracking/context-lines.node.d.ts +5 -0
  26. package/dist/extensions/error-tracking/context-lines.node.d.ts.map +1 -0
  27. package/dist/extensions/error-tracking/context-lines.node.js +227 -0
  28. package/dist/extensions/error-tracking/context-lines.node.mjs +187 -0
  29. package/dist/extensions/error-tracking/error-conversion.d.ts +4 -0
  30. package/dist/extensions/error-tracking/error-conversion.d.ts.map +1 -0
  31. package/dist/extensions/error-tracking/error-conversion.js +183 -0
  32. package/dist/extensions/error-tracking/error-conversion.mjs +146 -0
  33. package/dist/extensions/error-tracking/get-module.node.d.ts +3 -0
  34. package/dist/extensions/error-tracking/get-module.node.d.ts.map +1 -0
  35. package/dist/extensions/error-tracking/get-module.node.js +57 -0
  36. package/dist/extensions/error-tracking/get-module.node.mjs +23 -0
  37. package/dist/extensions/error-tracking/index.d.ts +20 -0
  38. package/dist/extensions/error-tracking/index.d.ts.map +1 -0
  39. package/dist/extensions/error-tracking/index.js +97 -0
  40. package/dist/extensions/error-tracking/index.mjs +63 -0
  41. package/dist/extensions/error-tracking/reduceable-cache.d.ts +13 -0
  42. package/dist/extensions/error-tracking/reduceable-cache.d.ts.map +1 -0
  43. package/dist/extensions/error-tracking/reduceable-cache.js +57 -0
  44. package/dist/extensions/error-tracking/reduceable-cache.mjs +23 -0
  45. package/dist/extensions/error-tracking/stack-parser.d.ts +3 -0
  46. package/dist/extensions/error-tracking/stack-parser.d.ts.map +1 -0
  47. package/dist/extensions/error-tracking/stack-parser.js +148 -0
  48. package/dist/extensions/error-tracking/stack-parser.mjs +114 -0
  49. package/dist/extensions/error-tracking/type-checking.d.ts +8 -0
  50. package/dist/extensions/error-tracking/type-checking.d.ts.map +1 -0
  51. package/dist/extensions/error-tracking/type-checking.js +80 -0
  52. package/dist/extensions/error-tracking/type-checking.mjs +31 -0
  53. package/dist/extensions/error-tracking/types.d.ts +61 -0
  54. package/dist/extensions/error-tracking/types.d.ts.map +1 -0
  55. package/dist/extensions/error-tracking/types.js +43 -0
  56. package/dist/extensions/error-tracking/types.mjs +9 -0
  57. package/dist/extensions/express.d.ts +17 -0
  58. package/dist/extensions/express.d.ts.map +1 -0
  59. package/dist/extensions/express.js +61 -0
  60. package/dist/extensions/express.mjs +17 -0
  61. package/dist/extensions/feature-flags/crypto-helpers.d.ts +3 -0
  62. package/dist/extensions/feature-flags/crypto-helpers.d.ts.map +1 -0
  63. package/dist/extensions/feature-flags/crypto-helpers.js +77 -0
  64. package/dist/extensions/feature-flags/crypto-helpers.mjs +22 -0
  65. package/dist/extensions/feature-flags/crypto.d.ts +2 -0
  66. package/dist/extensions/feature-flags/crypto.d.ts.map +1 -0
  67. package/dist/extensions/feature-flags/crypto.js +47 -0
  68. package/dist/extensions/feature-flags/crypto.mjs +13 -0
  69. package/dist/extensions/feature-flags/feature-flags.d.ts +89 -0
  70. package/dist/extensions/feature-flags/feature-flags.d.ts.map +1 -0
  71. package/dist/extensions/feature-flags/feature-flags.js +529 -0
  72. package/dist/extensions/feature-flags/feature-flags.mjs +483 -0
  73. package/dist/extensions/feature-flags/lazy.d.ts +24 -0
  74. package/dist/extensions/feature-flags/lazy.d.ts.map +1 -0
  75. package/dist/extensions/feature-flags/lazy.js +60 -0
  76. package/dist/extensions/feature-flags/lazy.mjs +26 -0
  77. package/dist/extensions/sentry-integration.d.ts +54 -0
  78. package/dist/extensions/sentry-integration.d.ts.map +1 -0
  79. package/dist/extensions/sentry-integration.js +113 -0
  80. package/dist/extensions/sentry-integration.mjs +73 -0
  81. package/dist/storage-memory.d.ts +7 -0
  82. package/dist/storage-memory.d.ts.map +1 -0
  83. package/dist/storage-memory.js +46 -0
  84. package/dist/storage-memory.mjs +12 -0
  85. package/dist/types.d.ts +253 -0
  86. package/dist/types.d.ts.map +1 -0
  87. package/dist/types.js +18 -0
  88. package/dist/types.mjs +0 -0
  89. package/dist/utils/logger.d.ts +3 -0
  90. package/dist/utils/logger.d.ts.map +1 -0
  91. package/dist/utils/logger.js +63 -0
  92. package/dist/utils/logger.mjs +29 -0
  93. package/dist/version.d.ts +2 -0
  94. package/dist/version.d.ts.map +1 -0
  95. package/dist/version.js +36 -0
  96. package/dist/version.mjs +2 -0
  97. package/package.json +32 -31
  98. package/src/client.ts +1532 -0
  99. package/src/entrypoints/index.edge.ts +15 -0
  100. package/src/entrypoints/index.node.ts +17 -0
  101. package/src/exports.ts +3 -0
  102. package/src/extensions/error-tracking/autocapture.ts +65 -0
  103. package/src/extensions/error-tracking/chunk-ids.ts +58 -0
  104. package/src/extensions/error-tracking/context-lines.node.ts +392 -0
  105. package/src/extensions/error-tracking/error-conversion.ts +291 -0
  106. package/src/extensions/error-tracking/get-module.node.ts +57 -0
  107. package/src/extensions/error-tracking/index.ts +103 -0
  108. package/src/extensions/error-tracking/reduceable-cache.ts +39 -0
  109. package/src/extensions/error-tracking/stack-parser.ts +212 -0
  110. package/src/extensions/error-tracking/type-checking.ts +40 -0
  111. package/src/extensions/error-tracking/types.ts +71 -0
  112. package/src/extensions/express.ts +39 -0
  113. package/src/extensions/feature-flags/crypto-helpers.ts +36 -0
  114. package/src/extensions/feature-flags/crypto.ts +22 -0
  115. package/src/extensions/feature-flags/feature-flags.ts +1003 -0
  116. package/src/extensions/feature-flags/lazy.ts +55 -0
  117. package/src/extensions/sentry-integration.ts +216 -0
  118. package/src/storage-memory.ts +13 -0
  119. package/src/types.ts +294 -0
  120. package/src/utils/logger.ts +39 -0
  121. package/src/version.ts +1 -0
  122. package/dist/edge/index.cjs +0 -3150
  123. package/dist/edge/index.cjs.map +0 -1
  124. package/dist/edge/index.mjs +0 -3144
  125. package/dist/edge/index.mjs.map +0 -1
  126. package/dist/node/index.cjs +0 -3556
  127. package/dist/node/index.cjs.map +0 -1
  128. package/dist/node/index.mjs +0 -3550
  129. package/dist/node/index.mjs.map +0 -1
@@ -0,0 +1,437 @@
1
+ import { version } from "./version.mjs";
2
+ import { PostHogCoreStateless, getFeatureFlagValue, safeSetTimeout } from "@posthog/core";
3
+ import { FeatureFlagsPoller } from "./extensions/feature-flags/feature-flags.mjs";
4
+ import error_tracking from "./extensions/error-tracking/index.mjs";
5
+ import { isPlainObject } from "./extensions/error-tracking/type-checking.mjs";
6
+ import { PostHogMemoryStorage } from "./storage-memory.mjs";
7
+ import { createLogger } from "./utils/logger.mjs";
8
+ const MINIMUM_POLLING_INTERVAL = 100;
9
+ const THIRTY_SECONDS = 30000;
10
+ const MAX_CACHE_SIZE = 50000;
11
+ class PostHogBackendClient extends PostHogCoreStateless {
12
+ constructor(apiKey, options = {}){
13
+ super(apiKey, options), this._memoryStorage = new PostHogMemoryStorage();
14
+ this.options = options;
15
+ this.logger = createLogger(this.logMsgIfDebug.bind(this));
16
+ this.options.featureFlagsPollingInterval = 'number' == typeof options.featureFlagsPollingInterval ? Math.max(options.featureFlagsPollingInterval, MINIMUM_POLLING_INTERVAL) : THIRTY_SECONDS;
17
+ if (options.personalApiKey) {
18
+ if (options.personalApiKey.includes('phc_')) throw new Error('Your Personal API key is invalid. These keys are prefixed with "phx_" and can be created in PostHog project settings.');
19
+ const shouldEnableLocalEvaluation = false !== options.enableLocalEvaluation;
20
+ if (shouldEnableLocalEvaluation) this.featureFlagsPoller = new FeatureFlagsPoller({
21
+ pollingInterval: this.options.featureFlagsPollingInterval,
22
+ personalApiKey: options.personalApiKey,
23
+ projectApiKey: apiKey,
24
+ timeout: options.requestTimeout ?? 10000,
25
+ host: this.host,
26
+ fetch: options.fetch,
27
+ onError: (err)=>{
28
+ this._events.emit('error', err);
29
+ },
30
+ onLoad: (count)=>{
31
+ this._events.emit('localEvaluationFlagsLoaded', count);
32
+ },
33
+ customHeaders: this.getCustomHeaders()
34
+ });
35
+ }
36
+ this.errorTracking = new error_tracking(this, options, this.logger);
37
+ this.distinctIdHasSentFlagCalls = {};
38
+ this.maxCacheSize = options.maxCacheSize || MAX_CACHE_SIZE;
39
+ }
40
+ getPersistedProperty(key) {
41
+ return this._memoryStorage.getProperty(key);
42
+ }
43
+ setPersistedProperty(key, value) {
44
+ return this._memoryStorage.setProperty(key, value);
45
+ }
46
+ fetch(url, options) {
47
+ return this.options.fetch ? this.options.fetch(url, options) : fetch(url, options);
48
+ }
49
+ getLibraryVersion() {
50
+ return version;
51
+ }
52
+ getCustomUserAgent() {
53
+ return `${this.getLibraryId()}/${this.getLibraryVersion()}`;
54
+ }
55
+ enable() {
56
+ return super.optIn();
57
+ }
58
+ disable() {
59
+ return super.optOut();
60
+ }
61
+ debug(enabled = true) {
62
+ super.debug(enabled);
63
+ this.featureFlagsPoller?.debug(enabled);
64
+ }
65
+ capture(props) {
66
+ if ('string' == typeof props) this.logMsgIfDebug(()=>console.warn('Called capture() with a string as the first argument when an object was expected.'));
67
+ this.addPendingPromise(this.prepareEventMessage(props).then(({ distinctId, event, properties, options })=>super.captureStateless(distinctId, event, properties, {
68
+ timestamp: options.timestamp,
69
+ disableGeoip: options.disableGeoip,
70
+ uuid: options.uuid
71
+ })).catch((err)=>{
72
+ if (err) console.error(err);
73
+ }));
74
+ }
75
+ async captureImmediate(props) {
76
+ if ('string' == typeof props) this.logMsgIfDebug(()=>console.warn('Called captureImmediate() with a string as the first argument when an object was expected.'));
77
+ return this.addPendingPromise(this.prepareEventMessage(props).then(({ distinctId, event, properties, options })=>super.captureStatelessImmediate(distinctId, event, properties, {
78
+ timestamp: options.timestamp,
79
+ disableGeoip: options.disableGeoip,
80
+ uuid: options.uuid
81
+ })).catch((err)=>{
82
+ if (err) console.error(err);
83
+ }));
84
+ }
85
+ identify({ distinctId, properties, disableGeoip }) {
86
+ const userPropsOnce = properties?.$set_once;
87
+ delete properties?.$set_once;
88
+ const userProps = properties?.$set || properties;
89
+ super.identifyStateless(distinctId, {
90
+ $set: userProps,
91
+ $set_once: userPropsOnce
92
+ }, {
93
+ disableGeoip
94
+ });
95
+ }
96
+ async identifyImmediate({ distinctId, properties, disableGeoip }) {
97
+ const userPropsOnce = properties?.$set_once;
98
+ delete properties?.$set_once;
99
+ const userProps = properties?.$set || properties;
100
+ await super.identifyStatelessImmediate(distinctId, {
101
+ $set: userProps,
102
+ $set_once: userPropsOnce
103
+ }, {
104
+ disableGeoip
105
+ });
106
+ }
107
+ alias(data) {
108
+ super.aliasStateless(data.alias, data.distinctId, void 0, {
109
+ disableGeoip: data.disableGeoip
110
+ });
111
+ }
112
+ async aliasImmediate(data) {
113
+ await super.aliasStatelessImmediate(data.alias, data.distinctId, void 0, {
114
+ disableGeoip: data.disableGeoip
115
+ });
116
+ }
117
+ isLocalEvaluationReady() {
118
+ return this.featureFlagsPoller?.isLocalEvaluationReady() ?? false;
119
+ }
120
+ async waitForLocalEvaluationReady(timeoutMs = THIRTY_SECONDS) {
121
+ if (this.isLocalEvaluationReady()) return true;
122
+ if (void 0 === this.featureFlagsPoller) return false;
123
+ return new Promise((resolve)=>{
124
+ const timeout = setTimeout(()=>{
125
+ cleanup();
126
+ resolve(false);
127
+ }, timeoutMs);
128
+ const cleanup = this._events.on('localEvaluationFlagsLoaded', (count)=>{
129
+ clearTimeout(timeout);
130
+ cleanup();
131
+ resolve(count > 0);
132
+ });
133
+ });
134
+ }
135
+ async getFeatureFlag(key, distinctId, options) {
136
+ const { groups, disableGeoip } = options || {};
137
+ let { onlyEvaluateLocally, sendFeatureFlagEvents, personProperties, groupProperties } = options || {};
138
+ const adjustedProperties = this.addLocalPersonAndGroupProperties(distinctId, groups, personProperties, groupProperties);
139
+ personProperties = adjustedProperties.allPersonProperties;
140
+ groupProperties = adjustedProperties.allGroupProperties;
141
+ if (void 0 == onlyEvaluateLocally) onlyEvaluateLocally = false;
142
+ if (void 0 == sendFeatureFlagEvents) sendFeatureFlagEvents = this.options.sendFeatureFlagEvent ?? true;
143
+ let response = await this.featureFlagsPoller?.getFeatureFlag(key, distinctId, groups, personProperties, groupProperties);
144
+ const flagWasLocallyEvaluated = void 0 !== response;
145
+ let requestId;
146
+ let flagDetail;
147
+ if (!flagWasLocallyEvaluated && !onlyEvaluateLocally) {
148
+ const remoteResponse = await super.getFeatureFlagDetailStateless(key, distinctId, groups, personProperties, groupProperties, disableGeoip);
149
+ if (void 0 === remoteResponse) return;
150
+ flagDetail = remoteResponse.response;
151
+ response = getFeatureFlagValue(flagDetail);
152
+ requestId = remoteResponse?.requestId;
153
+ }
154
+ const featureFlagReportedKey = `${key}_${response}`;
155
+ if (sendFeatureFlagEvents && (!(distinctId in this.distinctIdHasSentFlagCalls) || !this.distinctIdHasSentFlagCalls[distinctId].includes(featureFlagReportedKey))) {
156
+ if (Object.keys(this.distinctIdHasSentFlagCalls).length >= this.maxCacheSize) this.distinctIdHasSentFlagCalls = {};
157
+ if (Array.isArray(this.distinctIdHasSentFlagCalls[distinctId])) this.distinctIdHasSentFlagCalls[distinctId].push(featureFlagReportedKey);
158
+ else this.distinctIdHasSentFlagCalls[distinctId] = [
159
+ featureFlagReportedKey
160
+ ];
161
+ this.capture({
162
+ distinctId,
163
+ event: '$feature_flag_called',
164
+ properties: {
165
+ $feature_flag: key,
166
+ $feature_flag_response: response,
167
+ $feature_flag_id: flagDetail?.metadata?.id,
168
+ $feature_flag_version: flagDetail?.metadata?.version,
169
+ $feature_flag_reason: flagDetail?.reason?.description ?? flagDetail?.reason?.code,
170
+ locally_evaluated: flagWasLocallyEvaluated,
171
+ [`$feature/${key}`]: response,
172
+ $feature_flag_request_id: requestId
173
+ },
174
+ groups,
175
+ disableGeoip
176
+ });
177
+ }
178
+ return response;
179
+ }
180
+ async getFeatureFlagPayload(key, distinctId, matchValue, options) {
181
+ const { groups, disableGeoip } = options || {};
182
+ let { onlyEvaluateLocally, personProperties, groupProperties } = options || {};
183
+ const adjustedProperties = this.addLocalPersonAndGroupProperties(distinctId, groups, personProperties, groupProperties);
184
+ personProperties = adjustedProperties.allPersonProperties;
185
+ groupProperties = adjustedProperties.allGroupProperties;
186
+ let response;
187
+ const localEvaluationEnabled = void 0 !== this.featureFlagsPoller;
188
+ if (localEvaluationEnabled) {
189
+ await this.featureFlagsPoller?.loadFeatureFlags();
190
+ const flag = this.featureFlagsPoller?.featureFlagsByKey[key];
191
+ if (flag) {
192
+ const result = await this.featureFlagsPoller?.computeFlagAndPayloadLocally(flag, distinctId, groups, personProperties, groupProperties, matchValue);
193
+ if (result) {
194
+ matchValue = result.value;
195
+ response = result.payload;
196
+ }
197
+ }
198
+ }
199
+ if (void 0 == onlyEvaluateLocally) onlyEvaluateLocally = false;
200
+ const payloadWasLocallyEvaluated = void 0 !== response;
201
+ if (!payloadWasLocallyEvaluated && !onlyEvaluateLocally) response = await super.getFeatureFlagPayloadStateless(key, distinctId, groups, personProperties, groupProperties, disableGeoip);
202
+ return response;
203
+ }
204
+ async getRemoteConfigPayload(flagKey) {
205
+ if (!this.options.personalApiKey) throw new Error('Personal API key is required for remote config payload decryption');
206
+ const response = await this._requestRemoteConfigPayload(flagKey);
207
+ if (!response) return;
208
+ const parsed = await response.json();
209
+ if ('string' == typeof parsed) try {
210
+ return JSON.parse(parsed);
211
+ } catch (e) {}
212
+ return parsed;
213
+ }
214
+ async isFeatureEnabled(key, distinctId, options) {
215
+ const feat = await this.getFeatureFlag(key, distinctId, options);
216
+ if (void 0 === feat) return;
217
+ return !!feat || false;
218
+ }
219
+ async getAllFlags(distinctId, options) {
220
+ const response = await this.getAllFlagsAndPayloads(distinctId, options);
221
+ return response.featureFlags || {};
222
+ }
223
+ async getAllFlagsAndPayloads(distinctId, options) {
224
+ const { groups, disableGeoip, flagKeys } = options || {};
225
+ let { onlyEvaluateLocally, personProperties, groupProperties } = options || {};
226
+ const adjustedProperties = this.addLocalPersonAndGroupProperties(distinctId, groups, personProperties, groupProperties);
227
+ personProperties = adjustedProperties.allPersonProperties;
228
+ groupProperties = adjustedProperties.allGroupProperties;
229
+ if (void 0 == onlyEvaluateLocally) onlyEvaluateLocally = false;
230
+ const localEvaluationResult = await this.featureFlagsPoller?.getAllFlagsAndPayloads(distinctId, groups, personProperties, groupProperties, flagKeys);
231
+ let featureFlags = {};
232
+ let featureFlagPayloads = {};
233
+ let fallbackToFlags = true;
234
+ if (localEvaluationResult) {
235
+ featureFlags = localEvaluationResult.response;
236
+ featureFlagPayloads = localEvaluationResult.payloads;
237
+ fallbackToFlags = localEvaluationResult.fallbackToFlags;
238
+ }
239
+ if (fallbackToFlags && !onlyEvaluateLocally) {
240
+ const remoteEvaluationResult = await super.getFeatureFlagsAndPayloadsStateless(distinctId, groups, personProperties, groupProperties, disableGeoip, flagKeys);
241
+ featureFlags = {
242
+ ...featureFlags,
243
+ ...remoteEvaluationResult.flags || {}
244
+ };
245
+ featureFlagPayloads = {
246
+ ...featureFlagPayloads,
247
+ ...remoteEvaluationResult.payloads || {}
248
+ };
249
+ }
250
+ return {
251
+ featureFlags,
252
+ featureFlagPayloads
253
+ };
254
+ }
255
+ groupIdentify({ groupType, groupKey, properties, distinctId, disableGeoip }) {
256
+ super.groupIdentifyStateless(groupType, groupKey, properties, {
257
+ disableGeoip
258
+ }, distinctId);
259
+ }
260
+ async reloadFeatureFlags() {
261
+ await this.featureFlagsPoller?.loadFeatureFlags(true);
262
+ }
263
+ async _shutdown(shutdownTimeoutMs) {
264
+ this.featureFlagsPoller?.stopPoller();
265
+ this.errorTracking.shutdown();
266
+ return super._shutdown(shutdownTimeoutMs);
267
+ }
268
+ async _requestRemoteConfigPayload(flagKey) {
269
+ if (!this.options.personalApiKey) return;
270
+ const url = `${this.host}/api/projects/@current/feature_flags/${flagKey}/remote_config?token=${encodeURIComponent(this.apiKey)}`;
271
+ const options = {
272
+ method: 'GET',
273
+ headers: {
274
+ ...this.getCustomHeaders(),
275
+ 'Content-Type': 'application/json',
276
+ Authorization: `Bearer ${this.options.personalApiKey}`
277
+ }
278
+ };
279
+ let abortTimeout = null;
280
+ if (this.options.requestTimeout && 'number' == typeof this.options.requestTimeout) {
281
+ const controller = new AbortController();
282
+ abortTimeout = safeSetTimeout(()=>{
283
+ controller.abort();
284
+ }, this.options.requestTimeout);
285
+ options.signal = controller.signal;
286
+ }
287
+ try {
288
+ return await this.fetch(url, options);
289
+ } catch (error) {
290
+ this._events.emit('error', error);
291
+ return;
292
+ } finally{
293
+ if (abortTimeout) clearTimeout(abortTimeout);
294
+ }
295
+ }
296
+ extractPropertiesFromEvent(eventProperties, groups) {
297
+ if (!eventProperties) return {
298
+ personProperties: {},
299
+ groupProperties: {}
300
+ };
301
+ const personProperties = {};
302
+ const groupProperties = {};
303
+ for (const [key, value] of Object.entries(eventProperties))if (isPlainObject(value) && groups && key in groups) {
304
+ const groupProps = {};
305
+ for (const [groupKey, groupValue] of Object.entries(value))groupProps[String(groupKey)] = String(groupValue);
306
+ groupProperties[String(key)] = groupProps;
307
+ } else personProperties[String(key)] = String(value);
308
+ return {
309
+ personProperties,
310
+ groupProperties
311
+ };
312
+ }
313
+ async getFeatureFlagsForEvent(distinctId, groups, disableGeoip, sendFeatureFlagsOptions) {
314
+ const finalPersonProperties = sendFeatureFlagsOptions?.personProperties || {};
315
+ const finalGroupProperties = sendFeatureFlagsOptions?.groupProperties || {};
316
+ const flagKeys = sendFeatureFlagsOptions?.flagKeys;
317
+ const onlyEvaluateLocally = sendFeatureFlagsOptions?.onlyEvaluateLocally ?? false;
318
+ if (onlyEvaluateLocally) if (!((this.featureFlagsPoller?.featureFlags?.length || 0) > 0)) return {};
319
+ else {
320
+ const groupsWithStringValues = {};
321
+ for (const [key, value] of Object.entries(groups || {}))groupsWithStringValues[key] = String(value);
322
+ return await this.getAllFlags(distinctId, {
323
+ groups: groupsWithStringValues,
324
+ personProperties: finalPersonProperties,
325
+ groupProperties: finalGroupProperties,
326
+ disableGeoip,
327
+ onlyEvaluateLocally: true,
328
+ flagKeys
329
+ });
330
+ }
331
+ if ((this.featureFlagsPoller?.featureFlags?.length || 0) > 0) {
332
+ const groupsWithStringValues = {};
333
+ for (const [key, value] of Object.entries(groups || {}))groupsWithStringValues[key] = String(value);
334
+ return await this.getAllFlags(distinctId, {
335
+ groups: groupsWithStringValues,
336
+ personProperties: finalPersonProperties,
337
+ groupProperties: finalGroupProperties,
338
+ disableGeoip,
339
+ onlyEvaluateLocally: true,
340
+ flagKeys
341
+ });
342
+ }
343
+ return (await super.getFeatureFlagsStateless(distinctId, groups, finalPersonProperties, finalGroupProperties, disableGeoip)).flags;
344
+ }
345
+ addLocalPersonAndGroupProperties(distinctId, groups, personProperties, groupProperties) {
346
+ const allPersonProperties = {
347
+ distinct_id: distinctId,
348
+ ...personProperties || {}
349
+ };
350
+ const allGroupProperties = {};
351
+ if (groups) for (const groupName of Object.keys(groups))allGroupProperties[groupName] = {
352
+ $group_key: groups[groupName],
353
+ ...groupProperties?.[groupName] || {}
354
+ };
355
+ return {
356
+ allPersonProperties,
357
+ allGroupProperties
358
+ };
359
+ }
360
+ captureException(error, distinctId, additionalProperties) {
361
+ const syntheticException = new Error('PostHog syntheticException');
362
+ this.addPendingPromise(error_tracking.buildEventMessage(error, {
363
+ syntheticException
364
+ }, distinctId, additionalProperties).then((msg)=>this.capture(msg)));
365
+ }
366
+ async captureExceptionImmediate(error, distinctId, additionalProperties) {
367
+ const syntheticException = new Error('PostHog syntheticException');
368
+ this.addPendingPromise(error_tracking.buildEventMessage(error, {
369
+ syntheticException
370
+ }, distinctId, additionalProperties).then((msg)=>this.captureImmediate(msg)));
371
+ }
372
+ async prepareEventMessage(props) {
373
+ const { distinctId, event, properties, groups, sendFeatureFlags, timestamp, disableGeoip, uuid } = props;
374
+ const eventMessage = this._runBeforeSend({
375
+ distinctId,
376
+ event,
377
+ properties,
378
+ groups,
379
+ sendFeatureFlags,
380
+ timestamp,
381
+ disableGeoip,
382
+ uuid
383
+ });
384
+ if (!eventMessage) return Promise.reject(null);
385
+ const eventProperties = await Promise.resolve().then(async ()=>{
386
+ if (sendFeatureFlags) {
387
+ const sendFeatureFlagsOptions = 'object' == typeof sendFeatureFlags ? sendFeatureFlags : void 0;
388
+ return await this.getFeatureFlagsForEvent(distinctId, groups, disableGeoip, sendFeatureFlagsOptions);
389
+ }
390
+ return {};
391
+ }).then((flags)=>{
392
+ const additionalProperties = {};
393
+ if (flags) for (const [feature, variant] of Object.entries(flags))additionalProperties[`$feature/${feature}`] = variant;
394
+ const activeFlags = Object.keys(flags || {}).filter((flag)=>flags?.[flag] !== false).sort();
395
+ if (activeFlags.length > 0) additionalProperties['$active_feature_flags'] = activeFlags;
396
+ return additionalProperties;
397
+ }).catch(()=>({})).then((additionalProperties)=>{
398
+ const props = {
399
+ ...additionalProperties,
400
+ ...eventMessage.properties || {},
401
+ $groups: eventMessage.groups || groups
402
+ };
403
+ return props;
404
+ });
405
+ return {
406
+ distinctId: eventMessage.distinctId,
407
+ event: eventMessage.event,
408
+ properties: eventProperties,
409
+ options: {
410
+ timestamp: eventMessage.timestamp,
411
+ disableGeoip: eventMessage.disableGeoip,
412
+ uuid: eventMessage.uuid
413
+ }
414
+ };
415
+ }
416
+ _runBeforeSend(eventMessage) {
417
+ const beforeSend = this.options.before_send;
418
+ if (!beforeSend) return eventMessage;
419
+ const fns = Array.isArray(beforeSend) ? beforeSend : [
420
+ beforeSend
421
+ ];
422
+ let result = eventMessage;
423
+ for (const fn of fns){
424
+ result = fn(result);
425
+ if (!result) {
426
+ this.logMsgIfDebug(()=>console.info(`Event '${eventMessage.event}' was rejected in beforeSend function`));
427
+ return null;
428
+ }
429
+ if (!result.properties || 0 === Object.keys(result.properties).length) {
430
+ const message = `Event '${result.event}' has no properties after beforeSend function, this is likely an error.`;
431
+ this.logMsgIfDebug(()=>console.warn(message));
432
+ }
433
+ }
434
+ return result;
435
+ }
436
+ }
437
+ export { PostHogBackendClient };
@@ -0,0 +1,6 @@
1
+ export * from '../exports';
2
+ import { PostHogBackendClient } from '../client';
3
+ export declare class PostHog extends PostHogBackendClient {
4
+ getLibraryId(): string;
5
+ }
6
+ //# sourceMappingURL=index.edge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.edge.d.ts","sourceRoot":"","sources":["../../src/entrypoints/index.edge.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAI1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAMhD,qBAAa,OAAQ,SAAQ,oBAAoB;IAC/C,YAAY,IAAI,MAAM;CAGvB"}
@@ -0,0 +1,89 @@
1
+ "use strict";
2
+ var __webpack_modules__ = {
3
+ "../client": function(module) {
4
+ module.exports = require("../client.js");
5
+ },
6
+ "../exports": function(module) {
7
+ module.exports = require("../exports.js");
8
+ },
9
+ "../extensions/error-tracking": function(module) {
10
+ module.exports = require("../extensions/error-tracking/index.js");
11
+ },
12
+ "../extensions/error-tracking/stack-parser": function(module) {
13
+ module.exports = require("../extensions/error-tracking/stack-parser.js");
14
+ }
15
+ };
16
+ var __webpack_module_cache__ = {};
17
+ function __webpack_require__(moduleId) {
18
+ var cachedModule = __webpack_module_cache__[moduleId];
19
+ if (void 0 !== cachedModule) return cachedModule.exports;
20
+ var module = __webpack_module_cache__[moduleId] = {
21
+ exports: {}
22
+ };
23
+ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
24
+ return module.exports;
25
+ }
26
+ (()=>{
27
+ __webpack_require__.n = (module)=>{
28
+ var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
29
+ __webpack_require__.d(getter, {
30
+ a: getter
31
+ });
32
+ return getter;
33
+ };
34
+ })();
35
+ (()=>{
36
+ __webpack_require__.d = (exports1, definition)=>{
37
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
38
+ enumerable: true,
39
+ get: definition[key]
40
+ });
41
+ };
42
+ })();
43
+ (()=>{
44
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
45
+ })();
46
+ (()=>{
47
+ __webpack_require__.r = (exports1)=>{
48
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
49
+ value: 'Module'
50
+ });
51
+ Object.defineProperty(exports1, '__esModule', {
52
+ value: true
53
+ });
54
+ };
55
+ })();
56
+ var __webpack_exports__ = {};
57
+ (()=>{
58
+ __webpack_require__.r(__webpack_exports__);
59
+ __webpack_require__.d(__webpack_exports__, {
60
+ PostHog: ()=>PostHog
61
+ });
62
+ var _exports__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("../exports");
63
+ var __WEBPACK_REEXPORT_OBJECT__ = {};
64
+ for(var __WEBPACK_IMPORT_KEY__ in _exports__WEBPACK_IMPORTED_MODULE_0__)if ([
65
+ "default",
66
+ "PostHog"
67
+ ].indexOf(__WEBPACK_IMPORT_KEY__) < 0) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
68
+ return _exports__WEBPACK_IMPORTED_MODULE_0__[key];
69
+ }).bind(0, __WEBPACK_IMPORT_KEY__);
70
+ __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
71
+ var _extensions_error_tracking__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("../extensions/error-tracking");
72
+ var _extensions_error_tracking__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/ __webpack_require__.n(_extensions_error_tracking__WEBPACK_IMPORTED_MODULE_1__);
73
+ var _client__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__("../client");
74
+ var _extensions_error_tracking_stack_parser__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__("../extensions/error-tracking/stack-parser");
75
+ _extensions_error_tracking__WEBPACK_IMPORTED_MODULE_1___default().stackParser = (0, _extensions_error_tracking_stack_parser__WEBPACK_IMPORTED_MODULE_3__.createStackParser)();
76
+ _extensions_error_tracking__WEBPACK_IMPORTED_MODULE_1___default().frameModifiers = [];
77
+ class PostHog extends _client__WEBPACK_IMPORTED_MODULE_2__.PostHogBackendClient {
78
+ getLibraryId() {
79
+ return 'posthog-edge';
80
+ }
81
+ }
82
+ })();
83
+ exports.PostHog = __webpack_exports__.PostHog;
84
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
85
+ "PostHog"
86
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
87
+ Object.defineProperty(exports, '__esModule', {
88
+ value: true
89
+ });
@@ -0,0 +1,12 @@
1
+ import error_tracking from "../extensions/error-tracking/index.mjs";
2
+ import { PostHogBackendClient } from "../client.mjs";
3
+ import { createStackParser } from "../extensions/error-tracking/stack-parser.mjs";
4
+ export * from "../exports.mjs";
5
+ error_tracking.stackParser = createStackParser();
6
+ error_tracking.frameModifiers = [];
7
+ class PostHog extends PostHogBackendClient {
8
+ getLibraryId() {
9
+ return 'posthog-edge';
10
+ }
11
+ }
12
+ export { PostHog };
@@ -0,0 +1,6 @@
1
+ export * from '../exports';
2
+ import { PostHogBackendClient } from '../client';
3
+ export declare class PostHog extends PostHogBackendClient {
4
+ getLibraryId(): string;
5
+ }
6
+ //# sourceMappingURL=index.node.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.node.d.ts","sourceRoot":"","sources":["../../src/entrypoints/index.node.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAM1B,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAA;AAMhD,qBAAa,OAAQ,SAAQ,oBAAoB;IAC/C,YAAY,IAAI,MAAM;CAGvB"}
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ var __webpack_modules__ = {
3
+ "../client": function(module) {
4
+ module.exports = require("../client.js");
5
+ },
6
+ "../exports": function(module) {
7
+ module.exports = require("../exports.js");
8
+ },
9
+ "../extensions/error-tracking/context-lines.node": function(module) {
10
+ module.exports = require("../extensions/error-tracking/context-lines.node.js");
11
+ },
12
+ "../extensions/error-tracking/get-module.node": function(module) {
13
+ module.exports = require("../extensions/error-tracking/get-module.node.js");
14
+ },
15
+ "../extensions/error-tracking": function(module) {
16
+ module.exports = require("../extensions/error-tracking/index.js");
17
+ },
18
+ "../extensions/error-tracking/stack-parser": function(module) {
19
+ module.exports = require("../extensions/error-tracking/stack-parser.js");
20
+ }
21
+ };
22
+ var __webpack_module_cache__ = {};
23
+ function __webpack_require__(moduleId) {
24
+ var cachedModule = __webpack_module_cache__[moduleId];
25
+ if (void 0 !== cachedModule) return cachedModule.exports;
26
+ var module = __webpack_module_cache__[moduleId] = {
27
+ exports: {}
28
+ };
29
+ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
30
+ return module.exports;
31
+ }
32
+ (()=>{
33
+ __webpack_require__.n = (module)=>{
34
+ var getter = module && module.__esModule ? ()=>module['default'] : ()=>module;
35
+ __webpack_require__.d(getter, {
36
+ a: getter
37
+ });
38
+ return getter;
39
+ };
40
+ })();
41
+ (()=>{
42
+ __webpack_require__.d = (exports1, definition)=>{
43
+ for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
44
+ enumerable: true,
45
+ get: definition[key]
46
+ });
47
+ };
48
+ })();
49
+ (()=>{
50
+ __webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
51
+ })();
52
+ (()=>{
53
+ __webpack_require__.r = (exports1)=>{
54
+ if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
55
+ value: 'Module'
56
+ });
57
+ Object.defineProperty(exports1, '__esModule', {
58
+ value: true
59
+ });
60
+ };
61
+ })();
62
+ var __webpack_exports__ = {};
63
+ (()=>{
64
+ __webpack_require__.r(__webpack_exports__);
65
+ __webpack_require__.d(__webpack_exports__, {
66
+ PostHog: ()=>PostHog
67
+ });
68
+ var _exports__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__("../exports");
69
+ var __WEBPACK_REEXPORT_OBJECT__ = {};
70
+ for(var __WEBPACK_IMPORT_KEY__ in _exports__WEBPACK_IMPORTED_MODULE_0__)if ([
71
+ "default",
72
+ "PostHog"
73
+ ].indexOf(__WEBPACK_IMPORT_KEY__) < 0) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
74
+ return _exports__WEBPACK_IMPORTED_MODULE_0__[key];
75
+ }).bind(0, __WEBPACK_IMPORT_KEY__);
76
+ __webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
77
+ var _extensions_error_tracking_get_module_node__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__("../extensions/error-tracking/get-module.node");
78
+ var _extensions_error_tracking_context_lines_node__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__("../extensions/error-tracking/context-lines.node");
79
+ var _extensions_error_tracking__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__("../extensions/error-tracking");
80
+ var _extensions_error_tracking__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/ __webpack_require__.n(_extensions_error_tracking__WEBPACK_IMPORTED_MODULE_3__);
81
+ var _client__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__("../client");
82
+ var _extensions_error_tracking_stack_parser__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__("../extensions/error-tracking/stack-parser");
83
+ _extensions_error_tracking__WEBPACK_IMPORTED_MODULE_3___default().stackParser = (0, _extensions_error_tracking_stack_parser__WEBPACK_IMPORTED_MODULE_5__.createStackParser)((0, _extensions_error_tracking_get_module_node__WEBPACK_IMPORTED_MODULE_1__.createGetModuleFromFilename)());
84
+ _extensions_error_tracking__WEBPACK_IMPORTED_MODULE_3___default().frameModifiers = [
85
+ _extensions_error_tracking_context_lines_node__WEBPACK_IMPORTED_MODULE_2__.addSourceContext
86
+ ];
87
+ class PostHog extends _client__WEBPACK_IMPORTED_MODULE_4__.PostHogBackendClient {
88
+ getLibraryId() {
89
+ return 'posthog-node';
90
+ }
91
+ }
92
+ })();
93
+ exports.PostHog = __webpack_exports__.PostHog;
94
+ for(var __webpack_i__ in __webpack_exports__)if (-1 === [
95
+ "PostHog"
96
+ ].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
97
+ Object.defineProperty(exports, '__esModule', {
98
+ value: true
99
+ });
@@ -0,0 +1,16 @@
1
+ import { createGetModuleFromFilename } from "../extensions/error-tracking/get-module.node.mjs";
2
+ import { addSourceContext } from "../extensions/error-tracking/context-lines.node.mjs";
3
+ import error_tracking from "../extensions/error-tracking/index.mjs";
4
+ import { PostHogBackendClient } from "../client.mjs";
5
+ import { createStackParser } from "../extensions/error-tracking/stack-parser.mjs";
6
+ export * from "../exports.mjs";
7
+ error_tracking.stackParser = createStackParser(createGetModuleFromFilename());
8
+ error_tracking.frameModifiers = [
9
+ addSourceContext
10
+ ];
11
+ class PostHog extends PostHogBackendClient {
12
+ getLibraryId() {
13
+ return 'posthog-node';
14
+ }
15
+ }
16
+ export { PostHog };