posthog-node 3.3.0 → 3.4.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.
package/lib/index.esm.js CHANGED
@@ -154,7 +154,7 @@ function __spreadArray(to, from, pack) {
154
154
  return to.concat(ar || Array.prototype.slice.call(from));
155
155
  }
156
156
 
157
- var version = "3.3.0";
157
+ var version = "3.4.0";
158
158
 
159
159
  var PostHogPersistedProperty;
160
160
  (function (PostHogPersistedProperty) {
@@ -2344,12 +2344,36 @@ function matchProperty(property, propertyValues) {
2344
2344
 
2345
2345
  var overrideValue = propertyValues[key];
2346
2346
 
2347
+ function computeExactMatch(value, overrideValue) {
2348
+ if (Array.isArray(value)) {
2349
+ return value.map(function (val) {
2350
+ return String(val).toLowerCase();
2351
+ }).includes(String(overrideValue).toLowerCase());
2352
+ }
2353
+
2354
+ return String(value).toLowerCase() === String(overrideValue).toLowerCase();
2355
+ }
2356
+
2357
+ function compare(lhs, rhs, operator) {
2358
+ if (operator === 'gt') {
2359
+ return lhs > rhs;
2360
+ } else if (operator === 'gte') {
2361
+ return lhs >= rhs;
2362
+ } else if (operator === 'lt') {
2363
+ return lhs < rhs;
2364
+ } else if (operator === 'lte') {
2365
+ return lhs <= rhs;
2366
+ } else {
2367
+ throw new Error("Invalid operator: ".concat(operator));
2368
+ }
2369
+ }
2370
+
2347
2371
  switch (operator) {
2348
2372
  case 'exact':
2349
- return Array.isArray(value) ? value.indexOf(overrideValue) !== -1 : value === overrideValue;
2373
+ return computeExactMatch(value, overrideValue);
2350
2374
 
2351
2375
  case 'is_not':
2352
- return Array.isArray(value) ? value.indexOf(overrideValue) === -1 : value !== overrideValue;
2376
+ return !computeExactMatch(value, overrideValue);
2353
2377
 
2354
2378
  case 'is_set':
2355
2379
  return key in propertyValues;
@@ -2367,24 +2391,53 @@ function matchProperty(property, propertyValues) {
2367
2391
  return isValidRegex(String(value)) && String(overrideValue).match(String(value)) === null;
2368
2392
 
2369
2393
  case 'gt':
2370
- return typeof overrideValue == typeof value && overrideValue > value;
2371
-
2372
2394
  case 'gte':
2373
- return typeof overrideValue == typeof value && overrideValue >= value;
2374
-
2375
2395
  case 'lt':
2376
- return typeof overrideValue == typeof value && overrideValue < value;
2377
-
2378
2396
  case 'lte':
2379
- return typeof overrideValue == typeof value && overrideValue <= value;
2397
+ {
2398
+ // :TRICKY: We adjust comparison based on the override value passed in,
2399
+ // to make sure we handle both numeric and string comparisons appropriately.
2400
+ var parsedValue = typeof value === 'number' ? value : null;
2401
+
2402
+ if (typeof value === 'string') {
2403
+ try {
2404
+ parsedValue = parseFloat(value);
2405
+ } catch (err) {// pass
2406
+ }
2407
+ }
2408
+
2409
+ if (parsedValue != null && overrideValue != null) {
2410
+ // check both null and undefined
2411
+ if (typeof overrideValue === 'string') {
2412
+ return compare(overrideValue, String(value), operator);
2413
+ } else {
2414
+ return compare(overrideValue, parsedValue, operator);
2415
+ }
2416
+ } else {
2417
+ return compare(String(overrideValue), String(value), operator);
2418
+ }
2419
+ }
2380
2420
 
2381
2421
  case 'is_date_after':
2382
2422
  case 'is_date_before':
2423
+ case 'is_relative_date_before':
2424
+ case 'is_relative_date_after':
2383
2425
  {
2384
- var parsedDate = convertToDateTime(value);
2426
+ var parsedDate = null;
2427
+
2428
+ if (['is_relative_date_before', 'is_relative_date_after'].includes(operator)) {
2429
+ parsedDate = relativeDateParseForFeatureFlagMatching(String(value));
2430
+ } else {
2431
+ parsedDate = convertToDateTime(value);
2432
+ }
2433
+
2434
+ if (parsedDate == null) {
2435
+ throw new InconclusiveMatchError("Invalid date: ".concat(value));
2436
+ }
2437
+
2385
2438
  var overrideDate = convertToDateTime(overrideValue);
2386
2439
 
2387
- if (operator === 'is_date_before') {
2440
+ if (['is_date_before', 'is_relative_date_before'].includes(operator)) {
2388
2441
  return overrideDate < parsedDate;
2389
2442
  }
2390
2443
 
@@ -2392,8 +2445,7 @@ function matchProperty(property, propertyValues) {
2392
2445
  }
2393
2446
 
2394
2447
  default:
2395
- console.error("Unknown operator: ".concat(operator));
2396
- return false;
2448
+ throw new InconclusiveMatchError("Unknown operator: ".concat(operator));
2397
2449
  }
2398
2450
  }
2399
2451
 
@@ -2535,6 +2587,45 @@ function convertToDateTime(value) {
2535
2587
  }
2536
2588
  }
2537
2589
 
2590
+ function relativeDateParseForFeatureFlagMatching(value) {
2591
+ var regex = /^(?<number>[0-9]+)(?<interval>[a-z])$/;
2592
+ var match = value.match(regex);
2593
+ var parsedDt = new Date(new Date().toISOString());
2594
+
2595
+ if (match) {
2596
+ if (!match.groups) {
2597
+ return null;
2598
+ }
2599
+
2600
+ var number = parseInt(match.groups['number']);
2601
+
2602
+ if (number >= 10000) {
2603
+ // Guard against overflow, disallow numbers greater than 10_000
2604
+ return null;
2605
+ }
2606
+
2607
+ var interval = match.groups['interval'];
2608
+
2609
+ if (interval == 'h') {
2610
+ parsedDt.setUTCHours(parsedDt.getUTCHours() - number);
2611
+ } else if (interval == 'd') {
2612
+ parsedDt.setUTCDate(parsedDt.getUTCDate() - number);
2613
+ } else if (interval == 'w') {
2614
+ parsedDt.setUTCDate(parsedDt.getUTCDate() - number * 7);
2615
+ } else if (interval == 'm') {
2616
+ parsedDt.setUTCMonth(parsedDt.getUTCMonth() - number);
2617
+ } else if (interval == 'y') {
2618
+ parsedDt.setUTCFullYear(parsedDt.getUTCFullYear() - number);
2619
+ } else {
2620
+ return null;
2621
+ }
2622
+
2623
+ return parsedDt;
2624
+ } else {
2625
+ return null;
2626
+ }
2627
+ }
2628
+
2538
2629
  var THIRTY_SECONDS = 30 * 1000;
2539
2630
  var MAX_CACHE_SIZE = 50 * 1000; // The actual exported Nodejs API.
2540
2631