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/CHANGELOG.md +5 -0
- package/lib/index.cjs.js +105 -14
- package/lib/index.cjs.js.map +1 -1
- package/lib/index.esm.js +105 -14
- package/lib/index.esm.js.map +1 -1
- package/lib/posthog-node/src/feature-flags.d.ts +2 -1
- package/package.json +1 -1
- package/src/feature-flags.ts +106 -13
- package/test/feature-flags.spec.ts +256 -3
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.
|
|
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
|
|
2373
|
+
return computeExactMatch(value, overrideValue);
|
|
2350
2374
|
|
|
2351
2375
|
case 'is_not':
|
|
2352
|
-
return
|
|
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
|
-
|
|
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 =
|
|
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 (
|
|
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
|
-
|
|
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
|
|