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