@posthog/core 1.1.0 → 1.2.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 (126) hide show
  1. package/dist/error-tracking/chunk-ids.js +1 -1
  2. package/dist/error-tracking/chunk-ids.mjs +1 -1
  3. package/dist/error-tracking/coercers/error-event-coercer.js +4 -5
  4. package/dist/error-tracking/coercers/error-event-coercer.mjs +4 -5
  5. package/dist/error-tracking/coercers/event-coercer.js +1 -2
  6. package/dist/error-tracking/coercers/event-coercer.mjs +1 -2
  7. package/dist/error-tracking/coercers/object-coercer.js +1 -2
  8. package/dist/error-tracking/coercers/object-coercer.mjs +1 -2
  9. package/dist/error-tracking/coercers/primitive-coercer.js +1 -2
  10. package/dist/error-tracking/coercers/primitive-coercer.mjs +1 -2
  11. package/dist/error-tracking/coercers/promise-rejection-event.js +4 -5
  12. package/dist/error-tracking/coercers/promise-rejection-event.mjs +4 -5
  13. package/dist/error-tracking/coercers/string-coercer.js +3 -4
  14. package/dist/error-tracking/coercers/string-coercer.mjs +3 -4
  15. package/dist/error-tracking/coercers/utils.js +2 -4
  16. package/dist/error-tracking/coercers/utils.mjs +2 -4
  17. package/dist/error-tracking/error-properties-builder.js +11 -15
  18. package/dist/error-tracking/error-properties-builder.mjs +11 -15
  19. package/dist/error-tracking/parsers/index.js +2 -4
  20. package/dist/error-tracking/parsers/index.mjs +2 -4
  21. package/dist/error-tracking/parsers/node.js +3 -5
  22. package/dist/error-tracking/parsers/node.mjs +3 -5
  23. package/dist/error-tracking/utils.js +4 -4
  24. package/dist/error-tracking/utils.mjs +4 -4
  25. package/dist/eventemitter.js +4 -4
  26. package/dist/eventemitter.mjs +4 -4
  27. package/dist/featureFlagUtils.js +20 -45
  28. package/dist/featureFlagUtils.mjs +20 -45
  29. package/dist/gzip.js +1 -2
  30. package/dist/gzip.mjs +1 -2
  31. package/dist/index.d.ts +4 -366
  32. package/dist/index.d.ts.map +1 -1
  33. package/dist/index.js +54 -1225
  34. package/dist/index.mjs +5 -1190
  35. package/dist/posthog-core-stateless.d.ts +204 -0
  36. package/dist/posthog-core-stateless.d.ts.map +1 -0
  37. package/dist/posthog-core-stateless.js +675 -0
  38. package/dist/posthog-core-stateless.mjs +632 -0
  39. package/dist/posthog-core.d.ts +171 -0
  40. package/dist/posthog-core.d.ts.map +1 -0
  41. package/dist/posthog-core.js +554 -0
  42. package/dist/posthog-core.mjs +520 -0
  43. package/dist/testing/PostHogCoreTestClient.d.ts +2 -1
  44. package/dist/testing/PostHogCoreTestClient.d.ts.map +1 -1
  45. package/dist/testing/PostHogCoreTestClient.js +9 -11
  46. package/dist/testing/PostHogCoreTestClient.mjs +8 -10
  47. package/dist/testing/test-utils.js +1 -1
  48. package/dist/testing/test-utils.mjs +1 -1
  49. package/dist/utils/bucketed-rate-limiter.js +8 -12
  50. package/dist/utils/bucketed-rate-limiter.mjs +8 -12
  51. package/dist/utils/index.js +3 -3
  52. package/dist/utils/index.mjs +3 -3
  53. package/dist/utils/type-utils.js +1 -1
  54. package/dist/utils/type-utils.mjs +1 -1
  55. package/dist/vendor/uuidv7.js +12 -16
  56. package/dist/vendor/uuidv7.mjs +12 -16
  57. package/package.json +3 -2
  58. package/src/__tests__/featureFlagUtils.spec.ts +427 -0
  59. package/src/__tests__/gzip.spec.ts +69 -0
  60. package/src/__tests__/posthog.ai.spec.ts +110 -0
  61. package/src/__tests__/posthog.capture.spec.ts +91 -0
  62. package/src/__tests__/posthog.core.spec.ts +135 -0
  63. package/src/__tests__/posthog.debug.spec.ts +36 -0
  64. package/src/__tests__/posthog.enqueue.spec.ts +93 -0
  65. package/src/__tests__/posthog.featureflags.spec.ts +1106 -0
  66. package/src/__tests__/posthog.featureflags.v1.spec.ts +922 -0
  67. package/src/__tests__/posthog.flush.spec.ts +237 -0
  68. package/src/__tests__/posthog.gdpr.spec.ts +50 -0
  69. package/src/__tests__/posthog.groups.spec.ts +96 -0
  70. package/src/__tests__/posthog.identify.spec.ts +194 -0
  71. package/src/__tests__/posthog.init.spec.ts +110 -0
  72. package/src/__tests__/posthog.listeners.spec.ts +51 -0
  73. package/src/__tests__/posthog.register.spec.ts +47 -0
  74. package/src/__tests__/posthog.reset.spec.ts +76 -0
  75. package/src/__tests__/posthog.sessions.spec.ts +63 -0
  76. package/src/__tests__/posthog.setProperties.spec.ts +102 -0
  77. package/src/__tests__/posthog.shutdown.spec.ts +88 -0
  78. package/src/__tests__/utils.spec.ts +36 -0
  79. package/src/error-tracking/chunk-ids.ts +58 -0
  80. package/src/error-tracking/coercers/dom-exception-coercer.ts +38 -0
  81. package/src/error-tracking/coercers/error-coercer.ts +36 -0
  82. package/src/error-tracking/coercers/error-event-coercer.ts +24 -0
  83. package/src/error-tracking/coercers/event-coercer.ts +19 -0
  84. package/src/error-tracking/coercers/index.ts +8 -0
  85. package/src/error-tracking/coercers/object-coercer.ts +76 -0
  86. package/src/error-tracking/coercers/primitive-coercer.ts +19 -0
  87. package/src/error-tracking/coercers/promise-rejection-event.spec.ts +77 -0
  88. package/src/error-tracking/coercers/promise-rejection-event.ts +53 -0
  89. package/src/error-tracking/coercers/string-coercer.spec.ts +26 -0
  90. package/src/error-tracking/coercers/string-coercer.ts +31 -0
  91. package/src/error-tracking/coercers/utils.ts +33 -0
  92. package/src/error-tracking/error-properties-builder.coerce.spec.ts +202 -0
  93. package/src/error-tracking/error-properties-builder.parse.spec.ts +30 -0
  94. package/src/error-tracking/error-properties-builder.ts +169 -0
  95. package/src/error-tracking/index.ts +5 -0
  96. package/src/error-tracking/parsers/base.ts +29 -0
  97. package/src/error-tracking/parsers/chrome.ts +53 -0
  98. package/src/error-tracking/parsers/gecko.ts +38 -0
  99. package/src/error-tracking/parsers/index.ts +104 -0
  100. package/src/error-tracking/parsers/node.ts +111 -0
  101. package/src/error-tracking/parsers/opera.ts +18 -0
  102. package/src/error-tracking/parsers/react-native.ts +0 -0
  103. package/src/error-tracking/parsers/safari.ts +33 -0
  104. package/src/error-tracking/parsers/winjs.ts +12 -0
  105. package/src/error-tracking/types.ts +107 -0
  106. package/src/error-tracking/utils.ts +39 -0
  107. package/src/eventemitter.ts +27 -0
  108. package/src/featureFlagUtils.ts +192 -0
  109. package/src/gzip.ts +29 -0
  110. package/src/index.ts +8 -0
  111. package/src/posthog-core-stateless.ts +1226 -0
  112. package/src/posthog-core.ts +958 -0
  113. package/src/testing/PostHogCoreTestClient.ts +91 -0
  114. package/src/testing/index.ts +2 -0
  115. package/src/testing/test-utils.ts +47 -0
  116. package/src/types.ts +544 -0
  117. package/src/utils/bucketed-rate-limiter.spec.ts +33 -0
  118. package/src/utils/bucketed-rate-limiter.ts +85 -0
  119. package/src/utils/index.ts +98 -0
  120. package/src/utils/number-utils.spec.ts +89 -0
  121. package/src/utils/number-utils.ts +30 -0
  122. package/src/utils/promise-queue.spec.ts +55 -0
  123. package/src/utils/promise-queue.ts +30 -0
  124. package/src/utils/string-utils.ts +23 -0
  125. package/src/utils/type-utils.ts +134 -0
  126. package/src/vendor/uuidv7.ts +479 -0
@@ -28,12 +28,6 @@ __webpack_require__.d(__webpack_exports__, {
28
28
  });
29
29
  const external_number_utils_js_namespaceObject = require("./number-utils.js");
30
30
  class BucketedRateLimiter {
31
- stop() {
32
- if (this._removeInterval) {
33
- clearInterval(this._removeInterval);
34
- this._removeInterval = void 0;
35
- }
36
- }
37
31
  constructor(_options){
38
32
  this._options = _options;
39
33
  this._buckets = {};
@@ -49,16 +43,12 @@ class BucketedRateLimiter {
49
43
  this._buckets[String(key)] = value;
50
44
  };
51
45
  this.consumeRateLimit = (key)=>{
52
- var _this__getBucket;
53
- let tokens = null != (_this__getBucket = this._getBucket(key)) ? _this__getBucket : this._bucketSize;
46
+ let tokens = this._getBucket(key) ?? this._bucketSize;
54
47
  tokens = Math.max(tokens - 1, 0);
55
48
  if (0 === tokens) return true;
56
49
  this._setBucket(key, tokens);
57
50
  const hasReachedZero = 0 === tokens;
58
- if (hasReachedZero) {
59
- var _this__onBucketRateLimited, _this;
60
- null == (_this__onBucketRateLimited = (_this = this)._onBucketRateLimited) || _this__onBucketRateLimited.call(_this, key);
61
- }
51
+ if (hasReachedZero) this._onBucketRateLimited?.(key);
62
52
  return hasReachedZero;
63
53
  };
64
54
  this._onBucketRateLimited = this._options._onBucketRateLimited;
@@ -69,6 +59,12 @@ class BucketedRateLimiter {
69
59
  this._refillBuckets();
70
60
  }, this._refillInterval);
71
61
  }
62
+ stop() {
63
+ if (this._removeInterval) {
64
+ clearInterval(this._removeInterval);
65
+ this._removeInterval = void 0;
66
+ }
67
+ }
72
68
  }
73
69
  exports.BucketedRateLimiter = __webpack_exports__.BucketedRateLimiter;
74
70
  for(var __webpack_i__ in __webpack_exports__)if (-1 === [
@@ -1,11 +1,5 @@
1
1
  import { clampToRange } from "./number-utils.mjs";
2
2
  class BucketedRateLimiter {
3
- stop() {
4
- if (this._removeInterval) {
5
- clearInterval(this._removeInterval);
6
- this._removeInterval = void 0;
7
- }
8
- }
9
3
  constructor(_options){
10
4
  this._options = _options;
11
5
  this._buckets = {};
@@ -21,16 +15,12 @@ class BucketedRateLimiter {
21
15
  this._buckets[String(key)] = value;
22
16
  };
23
17
  this.consumeRateLimit = (key)=>{
24
- var _this__getBucket;
25
- let tokens = null != (_this__getBucket = this._getBucket(key)) ? _this__getBucket : this._bucketSize;
18
+ let tokens = this._getBucket(key) ?? this._bucketSize;
26
19
  tokens = Math.max(tokens - 1, 0);
27
20
  if (0 === tokens) return true;
28
21
  this._setBucket(key, tokens);
29
22
  const hasReachedZero = 0 === tokens;
30
- if (hasReachedZero) {
31
- var _this__onBucketRateLimited, _this;
32
- null == (_this__onBucketRateLimited = (_this = this)._onBucketRateLimited) || _this__onBucketRateLimited.call(_this, key);
33
- }
23
+ if (hasReachedZero) this._onBucketRateLimited?.(key);
34
24
  return hasReachedZero;
35
25
  };
36
26
  this._onBucketRateLimited = this._options._onBucketRateLimited;
@@ -41,5 +31,11 @@ class BucketedRateLimiter {
41
31
  this._refillBuckets();
42
32
  }, this._refillInterval);
43
33
  }
34
+ stop() {
35
+ if (this._removeInterval) {
36
+ clearInterval(this._removeInterval);
37
+ this._removeInterval = void 0;
38
+ }
39
+ }
44
40
  }
45
41
  export { BucketedRateLimiter };
@@ -176,7 +176,7 @@ var __webpack_exports__ = {};
176
176
  return false;
177
177
  }
178
178
  function removeTrailingSlash(url) {
179
- return null == url ? void 0 : url.replace(/\/+$/, '');
179
+ return url?.replace(/\/+$/, '');
180
180
  }
181
181
  async function retriable(fn, props) {
182
182
  let lastError = null;
@@ -200,7 +200,7 @@ var __webpack_exports__ = {};
200
200
  }
201
201
  function safeSetTimeout(fn, timeout) {
202
202
  const t = setTimeout(fn, timeout);
203
- (null == t ? void 0 : t.unref) && (null == t || t.unref());
203
+ t?.unref && t?.unref();
204
204
  return t;
205
205
  }
206
206
  const isPromise = (obj)=>obj && 'function' == typeof obj.then;
@@ -209,7 +209,7 @@ var __webpack_exports__ = {};
209
209
  return 'undefined' != typeof fetch ? fetch : void 0 !== globalThis.fetch ? globalThis.fetch : void 0;
210
210
  }
211
211
  function allSettled(promises) {
212
- return Promise.all(promises.map((p)=>(null != p ? p : Promise.resolve()).then((value)=>({
212
+ return Promise.all(promises.map((p)=>(p ?? Promise.resolve()).then((value)=>({
213
213
  status: 'fulfilled',
214
214
  value
215
215
  }), (reason)=>({
@@ -12,7 +12,7 @@ function isEmpty(truthyValue) {
12
12
  return false;
13
13
  }
14
14
  function removeTrailingSlash(url) {
15
- return null == url ? void 0 : url.replace(/\/+$/, '');
15
+ return url?.replace(/\/+$/, '');
16
16
  }
17
17
  async function retriable(fn, props) {
18
18
  let lastError = null;
@@ -36,7 +36,7 @@ function currentISOTime() {
36
36
  }
37
37
  function safeSetTimeout(fn, timeout) {
38
38
  const t = setTimeout(fn, timeout);
39
- (null == t ? void 0 : t.unref) && (null == t || t.unref());
39
+ t?.unref && t?.unref();
40
40
  return t;
41
41
  }
42
42
  const isPromise = (obj)=>obj && 'function' == typeof obj.then;
@@ -45,7 +45,7 @@ function getFetch() {
45
45
  return 'undefined' != typeof fetch ? fetch : void 0 !== globalThis.fetch ? globalThis.fetch : void 0;
46
46
  }
47
47
  function allSettled(promises) {
48
- return Promise.all(promises.map((p)=>(null != p ? p : Promise.resolve()).then((value)=>({
48
+ return Promise.all(promises.map((p)=>(p ?? Promise.resolve()).then((value)=>({
49
49
  status: 'fulfilled',
50
50
  value
51
51
  }), (reason)=>({
@@ -86,7 +86,7 @@ const isKnownUnsafeEditableEvent = (x)=>(0, external_string_utils_js_namespaceOb
86
86
  function isInstanceOf(candidate, base) {
87
87
  try {
88
88
  return candidate instanceof base;
89
- } catch (e) {
89
+ } catch {
90
90
  return false;
91
91
  }
92
92
  }
@@ -31,7 +31,7 @@ const isKnownUnsafeEditableEvent = (x)=>includes(knownUnsafeEditableEvent, x);
31
31
  function isInstanceOf(candidate, base) {
32
32
  try {
33
33
  return candidate instanceof base;
34
- } catch (e) {
34
+ } catch {
35
35
  return false;
36
36
  }
37
37
  }
@@ -40,6 +40,9 @@ __webpack_require__.d(__webpack_exports__, {
40
40
  * @packageDocumentation
41
41
  */ const DIGITS = "0123456789abcdef";
42
42
  class UUID {
43
+ constructor(bytes){
44
+ this.bytes = bytes;
45
+ }
43
46
  static ofInner(bytes) {
44
47
  if (16 === bytes.length) return new UUID(bytes);
45
48
  throw new TypeError("not 128-bit length");
@@ -69,20 +72,16 @@ class UUID {
69
72
  let hex;
70
73
  switch(uuid.length){
71
74
  case 32:
72
- var _exec;
73
- hex = null == (_exec = /^[0-9a-f]{32}$/i.exec(uuid)) ? void 0 : _exec[0];
75
+ hex = /^[0-9a-f]{32}$/i.exec(uuid)?.[0];
74
76
  break;
75
77
  case 36:
76
- var _exec1;
77
- hex = null == (_exec1 = /^([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i.exec(uuid)) ? void 0 : _exec1.slice(1, 6).join("");
78
+ hex = /^([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i.exec(uuid)?.slice(1, 6).join("");
78
79
  break;
79
80
  case 38:
80
- var _exec2;
81
- hex = null == (_exec2 = /^\{([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})\}$/i.exec(uuid)) ? void 0 : _exec2.slice(1, 6).join("");
81
+ hex = /^\{([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})\}$/i.exec(uuid)?.slice(1, 6).join("");
82
82
  break;
83
83
  case 45:
84
- var _exec3;
85
- hex = null == (_exec3 = /^urn:uuid:([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i.exec(uuid)) ? void 0 : _exec3.slice(1, 6).join("");
84
+ hex = /^urn:uuid:([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i.exec(uuid)?.slice(1, 6).join("");
86
85
  break;
87
86
  default:
88
87
  break;
@@ -145,11 +144,13 @@ class UUID {
145
144
  }
146
145
  return 0;
147
146
  }
148
- constructor(bytes){
149
- this.bytes = bytes;
150
- }
151
147
  }
152
148
  class V7Generator {
149
+ constructor(randomNumberGenerator){
150
+ this.timestamp = 0;
151
+ this.counter = 0;
152
+ this.random = randomNumberGenerator ?? getDefaultRandom();
153
+ }
153
154
  generate() {
154
155
  return this.generateOrResetCore(Date.now(), 10000);
155
156
  }
@@ -190,11 +191,6 @@ class V7Generator {
190
191
  bytes[8] = 0x80 | bytes[8] >>> 2;
191
192
  return UUID.ofInner(bytes);
192
193
  }
193
- constructor(randomNumberGenerator){
194
- this.timestamp = 0;
195
- this.counter = 0;
196
- this.random = null != randomNumberGenerator ? randomNumberGenerator : getDefaultRandom();
197
- }
198
194
  }
199
195
  const getDefaultRandom = ()=>({
200
196
  nextUint32: ()=>0x10000 * Math.trunc(0x10000 * Math.random()) + Math.trunc(0x10000 * Math.random())
@@ -7,6 +7,9 @@
7
7
  * @packageDocumentation
8
8
  */ const DIGITS = "0123456789abcdef";
9
9
  class UUID {
10
+ constructor(bytes){
11
+ this.bytes = bytes;
12
+ }
10
13
  static ofInner(bytes) {
11
14
  if (16 === bytes.length) return new UUID(bytes);
12
15
  throw new TypeError("not 128-bit length");
@@ -36,20 +39,16 @@ class UUID {
36
39
  let hex;
37
40
  switch(uuid.length){
38
41
  case 32:
39
- var _exec;
40
- hex = null == (_exec = /^[0-9a-f]{32}$/i.exec(uuid)) ? void 0 : _exec[0];
42
+ hex = /^[0-9a-f]{32}$/i.exec(uuid)?.[0];
41
43
  break;
42
44
  case 36:
43
- var _exec1;
44
- hex = null == (_exec1 = /^([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i.exec(uuid)) ? void 0 : _exec1.slice(1, 6).join("");
45
+ hex = /^([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i.exec(uuid)?.slice(1, 6).join("");
45
46
  break;
46
47
  case 38:
47
- var _exec2;
48
- hex = null == (_exec2 = /^\{([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})\}$/i.exec(uuid)) ? void 0 : _exec2.slice(1, 6).join("");
48
+ hex = /^\{([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})\}$/i.exec(uuid)?.slice(1, 6).join("");
49
49
  break;
50
50
  case 45:
51
- var _exec3;
52
- hex = null == (_exec3 = /^urn:uuid:([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i.exec(uuid)) ? void 0 : _exec3.slice(1, 6).join("");
51
+ hex = /^urn:uuid:([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})$/i.exec(uuid)?.slice(1, 6).join("");
53
52
  break;
54
53
  default:
55
54
  break;
@@ -112,11 +111,13 @@ class UUID {
112
111
  }
113
112
  return 0;
114
113
  }
115
- constructor(bytes){
116
- this.bytes = bytes;
117
- }
118
114
  }
119
115
  class V7Generator {
116
+ constructor(randomNumberGenerator){
117
+ this.timestamp = 0;
118
+ this.counter = 0;
119
+ this.random = randomNumberGenerator ?? getDefaultRandom();
120
+ }
120
121
  generate() {
121
122
  return this.generateOrResetCore(Date.now(), 10000);
122
123
  }
@@ -157,11 +158,6 @@ class V7Generator {
157
158
  bytes[8] = 0x80 | bytes[8] >>> 2;
158
159
  return UUID.ofInner(bytes);
159
160
  }
160
- constructor(randomNumberGenerator){
161
- this.timestamp = 0;
162
- this.counter = 0;
163
- this.random = null != randomNumberGenerator ? randomNumberGenerator : getDefaultRandom();
164
- }
165
161
  }
166
162
  const getDefaultRandom = ()=>({
167
163
  nextUint32: ()=>0x10000 * Math.trunc(0x10000 * Math.random()) + Math.trunc(0x10000 * Math.random())
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@posthog/core",
3
- "version": "1.1.0",
3
+ "version": "1.2.0",
4
4
  "license": "MIT",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -11,7 +11,8 @@
11
11
  "directory": "packages/core"
12
12
  },
13
13
  "files": [
14
- "dist"
14
+ "dist",
15
+ "src"
15
16
  ],
16
17
  "exports": {
17
18
  ".": {