@posthog/core 1.2.0 → 1.2.2

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 (35) hide show
  1. package/dist/error-tracking/error-properties-builder.d.ts +6 -6
  2. package/dist/error-tracking/error-properties-builder.d.ts.map +1 -1
  3. package/dist/error-tracking/error-properties-builder.js +7 -13
  4. package/dist/error-tracking/error-properties-builder.mjs +5 -11
  5. package/dist/index.d.ts +0 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +9 -20
  8. package/dist/index.mjs +1 -2
  9. package/dist/types.d.ts +1 -1
  10. package/dist/types.d.ts.map +1 -1
  11. package/package.json +3 -2
  12. package/src/error-tracking/error-properties-builder.ts +14 -16
  13. package/src/index.ts +0 -1
  14. package/src/types.ts +1 -1
  15. package/src/__tests__/featureFlagUtils.spec.ts +0 -427
  16. package/src/__tests__/gzip.spec.ts +0 -69
  17. package/src/__tests__/posthog.ai.spec.ts +0 -110
  18. package/src/__tests__/posthog.capture.spec.ts +0 -91
  19. package/src/__tests__/posthog.core.spec.ts +0 -135
  20. package/src/__tests__/posthog.debug.spec.ts +0 -36
  21. package/src/__tests__/posthog.enqueue.spec.ts +0 -93
  22. package/src/__tests__/posthog.featureflags.spec.ts +0 -1106
  23. package/src/__tests__/posthog.featureflags.v1.spec.ts +0 -922
  24. package/src/__tests__/posthog.flush.spec.ts +0 -237
  25. package/src/__tests__/posthog.gdpr.spec.ts +0 -50
  26. package/src/__tests__/posthog.groups.spec.ts +0 -96
  27. package/src/__tests__/posthog.identify.spec.ts +0 -194
  28. package/src/__tests__/posthog.init.spec.ts +0 -110
  29. package/src/__tests__/posthog.listeners.spec.ts +0 -51
  30. package/src/__tests__/posthog.register.spec.ts +0 -47
  31. package/src/__tests__/posthog.reset.spec.ts +0 -76
  32. package/src/__tests__/posthog.sessions.spec.ts +0 -63
  33. package/src/__tests__/posthog.setProperties.spec.ts +0 -102
  34. package/src/__tests__/posthog.shutdown.spec.ts +0 -88
  35. package/src/__tests__/utils.spec.ts +0 -36
@@ -1,427 +0,0 @@
1
- import {
2
- getFlagValuesFromFlags,
3
- getPayloadsFromFlags,
4
- getFlagDetailsFromFlagsAndPayloads,
5
- getFeatureFlagValue,
6
- normalizeFlagsResponse,
7
- } from '@/featureFlagUtils'
8
- import { PostHogFlagsResponse, FeatureFlagDetail } from '@/types'
9
-
10
- describe('featureFlagUtils', () => {
11
- describe('getFeatureFlagValue', () => {
12
- it('should return variant if present', () => {
13
- const flag: FeatureFlagDetail = {
14
- key: 'test-flag',
15
- enabled: true,
16
- variant: 'test-variant',
17
- reason: undefined,
18
- metadata: { id: 1, version: undefined, description: undefined, payload: undefined },
19
- }
20
- expect(getFeatureFlagValue(flag)).toBe('test-variant')
21
- })
22
-
23
- it('should return enabled if no variant', () => {
24
- const flag1: FeatureFlagDetail = {
25
- key: 'test-flag-1',
26
- enabled: true,
27
- variant: undefined,
28
- reason: undefined,
29
- metadata: { id: 1, version: undefined, description: undefined, payload: undefined },
30
- }
31
- const flag2: FeatureFlagDetail = {
32
- key: 'test-flag-2',
33
- enabled: false,
34
- variant: undefined,
35
- reason: undefined,
36
- metadata: { id: 2, version: undefined, description: undefined, payload: undefined },
37
- }
38
- expect(getFeatureFlagValue(flag1)).toBe(true)
39
- expect(getFeatureFlagValue(flag2)).toBe(false)
40
- })
41
-
42
- it('should return undefined if neither variant nor enabled', () => {
43
- const flag: FeatureFlagDetail = {
44
- key: 'test-flag',
45
- enabled: false,
46
- variant: undefined,
47
- reason: undefined,
48
- metadata: { id: 1, version: undefined, description: undefined, payload: undefined },
49
- }
50
- expect(getFeatureFlagValue(flag)).toBe(false)
51
- })
52
- })
53
-
54
- describe('getFlagValuesFromFlags', () => {
55
- it('should extract flag values from flags', () => {
56
- const flags: Record<string, FeatureFlagDetail> = {
57
- 'flag-1': {
58
- key: 'flag-1',
59
- enabled: true,
60
- variant: undefined,
61
- reason: undefined,
62
- metadata: { id: 1, version: undefined, description: undefined, payload: undefined },
63
- },
64
- 'flag-2': {
65
- key: 'flag-2',
66
- enabled: false,
67
- variant: undefined,
68
- reason: undefined,
69
- metadata: { id: 2, version: undefined, description: undefined, payload: undefined },
70
- },
71
- 'flag-3': {
72
- key: 'flag-3',
73
- enabled: true,
74
- variant: 'test-variant',
75
- reason: undefined,
76
- metadata: { id: 3, version: undefined, description: undefined, payload: undefined },
77
- },
78
- }
79
-
80
- expect(getFlagValuesFromFlags(flags)).toEqual({
81
- 'flag-1': true,
82
- 'flag-2': false,
83
- 'flag-3': 'test-variant',
84
- })
85
- })
86
-
87
- it('should handle empty flags object', () => {
88
- expect(getFlagValuesFromFlags({})).toEqual({})
89
- })
90
- })
91
-
92
- describe('getPayloadsFromFlags', () => {
93
- it('should extract payloads from enabled flags with metadata', () => {
94
- const flags: Record<string, FeatureFlagDetail> = {
95
- 'flag-with-object-payload': {
96
- key: 'flag-with-object-payload',
97
- enabled: true,
98
- variant: undefined,
99
- reason: undefined,
100
- metadata: { id: 1, version: undefined, description: undefined, payload: '{"key": "value"}' },
101
- },
102
- 'flag-with-single-item-array-payload': {
103
- key: 'flag-with-single-item-array-payload',
104
- enabled: true,
105
- variant: undefined,
106
- reason: undefined,
107
- metadata: { id: 1, version: undefined, description: undefined, payload: '[5]' },
108
- },
109
- 'flag-with-array-payload': {
110
- key: 'flag-with-array-payload',
111
- enabled: true,
112
- variant: undefined,
113
- reason: undefined,
114
- metadata: { id: 1, version: undefined, description: undefined, payload: '[1, 2, 3]' },
115
- },
116
- 'disabled-flag': {
117
- key: 'disabled-flag',
118
- enabled: false,
119
- variant: undefined,
120
- reason: undefined,
121
- metadata: { id: 2, version: undefined, description: undefined, payload: undefined },
122
- },
123
- 'enabled-flag-no-payload': {
124
- key: 'enabled-flag-no-payload',
125
- enabled: true,
126
- variant: undefined,
127
- reason: undefined,
128
- metadata: { id: 3, version: undefined, description: undefined, payload: undefined },
129
- },
130
- }
131
-
132
- expect(getPayloadsFromFlags(flags)).toEqual({
133
- 'flag-with-object-payload': { key: 'value' },
134
- 'flag-with-single-item-array-payload': [5],
135
- 'flag-with-array-payload': [1, 2, 3],
136
- })
137
- })
138
-
139
- it('should handle empty flags object', () => {
140
- expect(getPayloadsFromFlags({})).toEqual({})
141
- })
142
-
143
- it('should handle flags with no payloads', () => {
144
- const flags: Record<string, FeatureFlagDetail> = {
145
- 'flag-1': {
146
- key: 'flag-1',
147
- enabled: true,
148
- variant: undefined,
149
- reason: undefined,
150
- metadata: { id: 1, version: undefined, description: undefined, payload: undefined },
151
- },
152
- 'flag-2': {
153
- key: 'flag-2',
154
- enabled: true,
155
- variant: undefined,
156
- reason: undefined,
157
- metadata: { id: 2, version: undefined, description: undefined, payload: undefined },
158
- },
159
- }
160
-
161
- expect(getPayloadsFromFlags(flags)).toEqual({})
162
- })
163
- })
164
-
165
- describe('getFlagDetailsFromFlagsAndPayloads', () => {
166
- it('should convert v1 flags and payloads to flag details', () => {
167
- const flagsResponse: PostHogFlagsResponse = {
168
- featureFlags: {
169
- 'flag-1': true,
170
- 'flag-2': 'variant-1',
171
- 'flag-3': false,
172
- },
173
- featureFlagPayloads: {
174
- 'flag-1': { key: 'value1' },
175
- 'flag-2': { key: 'value2' },
176
- },
177
- flags: {},
178
- errorsWhileComputingFlags: false,
179
- }
180
-
181
- const result = getFlagDetailsFromFlagsAndPayloads(flagsResponse)
182
-
183
- expect(result).toEqual({
184
- 'flag-1': {
185
- key: 'flag-1',
186
- enabled: true,
187
- variant: undefined,
188
- reason: undefined,
189
- metadata: {
190
- id: undefined,
191
- version: undefined,
192
- payload: '{"key":"value1"}',
193
- description: undefined,
194
- },
195
- },
196
- 'flag-2': {
197
- key: 'flag-2',
198
- enabled: true,
199
- variant: 'variant-1',
200
- reason: undefined,
201
- metadata: {
202
- id: undefined,
203
- version: undefined,
204
- payload: '{"key":"value2"}',
205
- description: undefined,
206
- },
207
- },
208
- 'flag-3': {
209
- key: 'flag-3',
210
- enabled: false,
211
- variant: undefined,
212
- reason: undefined,
213
- metadata: {
214
- id: undefined,
215
- version: undefined,
216
- payload: undefined,
217
- description: undefined,
218
- },
219
- },
220
- })
221
- })
222
-
223
- it('should handle empty flags and payloads', () => {
224
- const flagsResponse: PostHogFlagsResponse = {
225
- featureFlags: {},
226
- featureFlagPayloads: {},
227
- flags: {},
228
- errorsWhileComputingFlags: false,
229
- }
230
-
231
- expect(getFlagDetailsFromFlagsAndPayloads(flagsResponse)).toEqual({})
232
- })
233
- })
234
-
235
- describe('normalizeFlagsResponse', () => {
236
- it('should convert v4 response to v1 format', () => {
237
- const v4Response: PostHogFlagsResponse = {
238
- flags: {
239
- 'flag-1': {
240
- key: 'flag-1',
241
- enabled: true,
242
- variant: undefined,
243
- reason: undefined,
244
- metadata: {
245
- id: undefined,
246
- version: undefined,
247
- payload: '{"key":"value1"}',
248
- description: undefined,
249
- },
250
- },
251
- 'flag-2': {
252
- key: 'flag-2',
253
- enabled: true,
254
- variant: 'variant-1',
255
- reason: undefined,
256
- metadata: {
257
- id: undefined,
258
- version: undefined,
259
- payload: '{"key":"value2"}',
260
- description: undefined,
261
- },
262
- },
263
- 'flag-3': {
264
- key: 'flag-3',
265
- enabled: false,
266
- variant: undefined,
267
- reason: undefined,
268
- metadata: {
269
- id: undefined,
270
- version: undefined,
271
- payload: undefined,
272
- description: undefined,
273
- },
274
- },
275
- },
276
- errorsWhileComputingFlags: false,
277
- featureFlags: {},
278
- featureFlagPayloads: {},
279
- }
280
-
281
- const result = normalizeFlagsResponse(v4Response)
282
-
283
- expect(result).toEqual({
284
- featureFlags: {
285
- 'flag-1': true,
286
- 'flag-2': 'variant-1',
287
- 'flag-3': false,
288
- },
289
- featureFlagPayloads: {
290
- 'flag-1': { key: 'value1' },
291
- 'flag-2': { key: 'value2' },
292
- },
293
- flags: v4Response.flags,
294
- errorsWhileComputingFlags: false,
295
- })
296
- })
297
-
298
- it('should convert v1 response to v4 format', () => {
299
- const v1Response: Omit<PostHogFlagsResponse, 'flags'> = {
300
- featureFlags: {
301
- 'flag-1': true,
302
- 'flag-2': 'variant-1',
303
- 'flag-3': false,
304
- },
305
- featureFlagPayloads: {
306
- 'flag-1': { key: 'value1' },
307
- 'flag-2': { key: 'value2' },
308
- },
309
- errorsWhileComputingFlags: false,
310
- }
311
-
312
- const result = normalizeFlagsResponse(v1Response)
313
-
314
- expect(result).toEqual({
315
- featureFlags: {
316
- 'flag-1': true,
317
- 'flag-2': 'variant-1',
318
- 'flag-3': false,
319
- },
320
- featureFlagPayloads: {
321
- 'flag-1': { key: 'value1' },
322
- 'flag-2': { key: 'value2' },
323
- },
324
- flags: {
325
- 'flag-1': {
326
- key: 'flag-1',
327
- enabled: true,
328
- variant: undefined,
329
- reason: undefined,
330
- metadata: {
331
- id: undefined,
332
- version: undefined,
333
- payload: '{"key":"value1"}',
334
- description: undefined,
335
- },
336
- },
337
- 'flag-2': {
338
- key: 'flag-2',
339
- enabled: true,
340
- variant: 'variant-1',
341
- reason: undefined,
342
- metadata: {
343
- id: undefined,
344
- version: undefined,
345
- payload: '{"key":"value2"}',
346
- description: undefined,
347
- },
348
- },
349
- 'flag-3': {
350
- key: 'flag-3',
351
- enabled: false,
352
- variant: undefined,
353
- reason: undefined,
354
- metadata: {
355
- id: undefined,
356
- version: undefined,
357
- payload: undefined,
358
- description: undefined,
359
- },
360
- },
361
- },
362
- errorsWhileComputingFlags: false,
363
- })
364
- })
365
-
366
- it('should handle empty flags and payloads', () => {
367
- const v1Response: Omit<PostHogFlagsResponse, 'flags'> = {
368
- featureFlags: {},
369
- featureFlagPayloads: {},
370
- errorsWhileComputingFlags: false,
371
- }
372
-
373
- const result = normalizeFlagsResponse(v1Response)
374
-
375
- expect(result).toEqual({
376
- featureFlags: {},
377
- featureFlagPayloads: {},
378
- flags: {},
379
- errorsWhileComputingFlags: false,
380
- })
381
- })
382
-
383
- it('should preserve additional fields', () => {
384
- const v1Response: Omit<PostHogFlagsResponse, 'flags'> = {
385
- featureFlags: {
386
- 'flag-1': true,
387
- },
388
- featureFlagPayloads: {
389
- 'flag-1': { key: 'value1' },
390
- },
391
- errorsWhileComputingFlags: false,
392
- sessionRecording: true,
393
- quotaLimited: ['feature_flags'],
394
- requestId: 'test-request-id',
395
- }
396
-
397
- const result = normalizeFlagsResponse(v1Response)
398
-
399
- expect(result).toEqual({
400
- featureFlags: {
401
- 'flag-1': true,
402
- },
403
- featureFlagPayloads: {
404
- 'flag-1': { key: 'value1' },
405
- },
406
- flags: {
407
- 'flag-1': {
408
- key: 'flag-1',
409
- enabled: true,
410
- variant: undefined,
411
- reason: undefined,
412
- metadata: {
413
- id: undefined,
414
- version: undefined,
415
- payload: '{"key":"value1"}',
416
- description: undefined,
417
- },
418
- },
419
- },
420
- errorsWhileComputingFlags: false,
421
- sessionRecording: true,
422
- quotaLimited: ['feature_flags'],
423
- requestId: 'test-request-id',
424
- })
425
- })
426
- })
427
- })
@@ -1,69 +0,0 @@
1
- import { isGzipSupported, gzipCompress } from '@/gzip'
2
- import { gzip } from 'node:zlib'
3
- import { randomBytes, randomUUID } from 'node:crypto'
4
- import { promisify } from 'node:util'
5
-
6
- const RANDOM_TEST_INPUT = JSON.stringify({
7
- abc: randomBytes(16),
8
- def: randomBytes(64),
9
- })
10
- const API_TEST_INPUT = JSON.stringify({
11
- api_key: 'TEST_API_KEY',
12
- batch: [
13
- {
14
- event: 'custom-event',
15
- distinct_id: 'user-distinct-id',
16
- library: 'posthog-core-tests',
17
- library_version: '2.0.0-alpha',
18
- properties: {
19
- $lib: 'posthog-core-tests',
20
- $lib_version: '2.0.0-alpha',
21
- $session_id: 'session.id',
22
- },
23
- timestamp: new Date().toISOString(),
24
- uuid: randomUUID(),
25
- type: 'capture',
26
- },
27
- ],
28
- sent_at: new Date().toISOString(),
29
- })
30
-
31
- describe('gzip', () => {
32
- describe('isGzipSupported', () => {
33
- it('should return true if CompressStream exists', () => {
34
- expect(globalThis.CompressionStream).toBeDefined()
35
- expect(isGzipSupported()).toBe(true)
36
- })
37
- it('should return false if CompressStream not available', () => {
38
- const CompressionStream = globalThis.CompressionStream
39
- delete (globalThis as any).CompressionStream
40
- expect(isGzipSupported()).toBe(false)
41
- ;(globalThis as any).CompressionStream = CompressionStream
42
- })
43
- })
44
- describe('gzipCompress', () => {
45
- it('compressed random data should match node', async () => {
46
- const compressed = await gzipCompress(RANDOM_TEST_INPUT)
47
- expect(compressed).not.toBe(null)
48
- if (!compressed) {
49
- return
50
- }
51
- const webCompress = Buffer.from(await compressed.arrayBuffer())
52
- const nodeCompress = await promisify(gzip)(RANDOM_TEST_INPUT)
53
- expect(webCompress).not.toBeFalsy()
54
- expect(webCompress).toEqual(nodeCompress)
55
- })
56
-
57
- it('compressed mock request should match node', async () => {
58
- const compressed = await gzipCompress(API_TEST_INPUT)
59
- expect(compressed).not.toBe(null)
60
- if (!compressed) {
61
- return
62
- }
63
- const webCompress = Buffer.from(await compressed.arrayBuffer())
64
- const nodeCompress = await promisify(gzip)(API_TEST_INPUT)
65
- expect(webCompress).not.toBeFalsy()
66
- expect(webCompress).toEqual(nodeCompress)
67
- })
68
- })
69
- })
@@ -1,110 +0,0 @@
1
- import {
2
- parseBody,
3
- waitForPromises,
4
- createTestClient,
5
- PostHogCoreTestClient,
6
- PostHogCoreTestClientMocks,
7
- } from '@/testing'
8
-
9
- describe('PostHog Core', () => {
10
- let posthog: PostHogCoreTestClient
11
- let mocks: PostHogCoreTestClientMocks
12
-
13
- jest.useFakeTimers()
14
-
15
- beforeEach(() => {
16
- ;[posthog, mocks] = createTestClient('TEST_API_KEY', { flushAt: 1 })
17
- })
18
-
19
- describe('ai', () => {
20
- it('should capture feedback', async () => {
21
- jest.setSystemTime(new Date('2022-01-01'))
22
-
23
- posthog.captureTraceFeedback('trace-id', 'feedback')
24
-
25
- await waitForPromises()
26
- expect(mocks.fetch).toHaveBeenCalledTimes(1)
27
- const body = parseBody(mocks.fetch.mock.calls[0])
28
-
29
- expect(body).toMatchObject({
30
- batch: [
31
- {
32
- event: '$ai_feedback',
33
- properties: {
34
- $ai_feedback_text: 'feedback',
35
- $ai_trace_id: 'trace-id',
36
- },
37
- },
38
- ],
39
- })
40
- })
41
-
42
- it('should convert numeric traceId in captureTraceFeedback', async () => {
43
- jest.setSystemTime(new Date('2022-01-01'))
44
-
45
- posthog.captureTraceFeedback(10, 'feedback')
46
-
47
- await waitForPromises()
48
- expect(mocks.fetch).toHaveBeenCalledTimes(1)
49
- const body = parseBody(mocks.fetch.mock.calls[0])
50
-
51
- expect(body).toMatchObject({
52
- batch: [
53
- {
54
- event: '$ai_feedback',
55
- properties: {
56
- $ai_feedback_text: 'feedback',
57
- $ai_trace_id: '10',
58
- },
59
- },
60
- ],
61
- })
62
- })
63
-
64
- it('should capture a metric', async () => {
65
- jest.setSystemTime(new Date('2022-01-01'))
66
-
67
- posthog.captureTraceMetric('trace-id', 'metric-name', 'good')
68
-
69
- await waitForPromises()
70
- expect(mocks.fetch).toHaveBeenCalledTimes(1)
71
- const body = parseBody(mocks.fetch.mock.calls[0])
72
-
73
- expect(body).toMatchObject({
74
- batch: [
75
- {
76
- event: '$ai_metric',
77
- properties: {
78
- $ai_metric_name: 'metric-name',
79
- $ai_metric_value: 'good',
80
- $ai_trace_id: 'trace-id',
81
- },
82
- },
83
- ],
84
- })
85
- })
86
-
87
- it('should convert numeric arguments in captureTraceMetric', async () => {
88
- jest.setSystemTime(new Date('2022-01-01'))
89
-
90
- posthog.captureTraceMetric(10, 'metric-name', 1)
91
-
92
- await waitForPromises()
93
- expect(mocks.fetch).toHaveBeenCalledTimes(1)
94
- const body = parseBody(mocks.fetch.mock.calls[0])
95
-
96
- expect(body).toMatchObject({
97
- batch: [
98
- {
99
- event: '$ai_metric',
100
- properties: {
101
- $ai_metric_name: 'metric-name',
102
- $ai_metric_value: '1',
103
- $ai_trace_id: '10',
104
- },
105
- },
106
- ],
107
- })
108
- })
109
- })
110
- })
@@ -1,91 +0,0 @@
1
- import {
2
- parseBody,
3
- waitForPromises,
4
- createTestClient,
5
- PostHogCoreTestClient,
6
- PostHogCoreTestClientMocks,
7
- } from '@/testing'
8
- import { uuidv7 } from '@/vendor/uuidv7'
9
-
10
- describe('PostHog Core', () => {
11
- let posthog: PostHogCoreTestClient
12
- let mocks: PostHogCoreTestClientMocks
13
-
14
- jest.useFakeTimers()
15
-
16
- beforeEach(() => {
17
- ;[posthog, mocks] = createTestClient('TEST_API_KEY', { flushAt: 1 })
18
- })
19
-
20
- describe('capture', () => {
21
- it('should capture an event', async () => {
22
- jest.setSystemTime(new Date('2022-01-01'))
23
-
24
- posthog.capture('custom-event')
25
-
26
- await waitForPromises()
27
- expect(mocks.fetch).toHaveBeenCalledTimes(1)
28
- const [url, options] = mocks.fetch.mock.calls[0]
29
- expect(url).toMatch(/^https:\/\/us\.i\.posthog\.com\/batch\//)
30
- expect(options.method).toBe('POST')
31
- const body = parseBody(mocks.fetch.mock.calls[0])
32
-
33
- expect(body).toEqual({
34
- api_key: 'TEST_API_KEY',
35
- batch: [
36
- {
37
- event: 'custom-event',
38
- distinct_id: posthog.getDistinctId(),
39
- library: 'posthog-core-tests',
40
- library_version: '2.0.0-alpha',
41
- properties: {
42
- $lib: 'posthog-core-tests',
43
- $lib_version: '2.0.0-alpha',
44
- $session_id: expect.any(String),
45
- },
46
- timestamp: '2022-01-01T00:00:00.000Z',
47
- uuid: expect.any(String),
48
- type: 'capture',
49
- },
50
- ],
51
- sent_at: expect.any(String),
52
- })
53
- })
54
-
55
- it('should allow overriding the timestamp', async () => {
56
- jest.setSystemTime(new Date('2022-01-01'))
57
-
58
- posthog.capture('custom-event', { foo: 'bar' }, { timestamp: new Date('2021-01-02') })
59
- await waitForPromises()
60
- const body = parseBody(mocks.fetch.mock.calls[0])
61
- expect(body).toMatchObject({
62
- api_key: 'TEST_API_KEY',
63
- batch: [
64
- {
65
- event: 'custom-event',
66
- timestamp: '2021-01-02T00:00:00.000Z',
67
- },
68
- ],
69
- })
70
- })
71
-
72
- it('should allow overriding the uuid', async () => {
73
- jest.setSystemTime(new Date('2022-01-01'))
74
-
75
- const id = uuidv7()
76
-
77
- posthog.capture('custom-event', { foo: 'bar' }, { uuid: id })
78
- await waitForPromises()
79
- const body = parseBody(mocks.fetch.mock.calls[0])
80
-
81
- expect(body).toMatchObject({
82
- batch: [
83
- {
84
- event: 'custom-event',
85
- uuid: expect.any(String),
86
- },
87
- ],
88
- })
89
- })
90
- })
91
- })