@posthog/convex 2.1.1 → 2.1.3

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.
@@ -1,2 +1,2 @@
1
- export declare function hashSHA1(text: string): Promise<string>;
1
+ export { hashSHA1 } from '@posthog/core';
2
2
  //# sourceMappingURL=crypto.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../../src/client/feature-flags/crypto.ts"],"names":[],"mappings":"AAEA,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAS5D"}
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../../src/client/feature-flags/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA"}
@@ -1,11 +1,2 @@
1
- /// <reference lib="dom" />
2
- export async function hashSHA1(text) {
3
- const subtle = globalThis.crypto?.subtle;
4
- if (!subtle) {
5
- throw new Error('SubtleCrypto API not available');
6
- }
7
- const hashBuffer = await subtle.digest('SHA-1', new TextEncoder().encode(text));
8
- const hashArray = Array.from(new Uint8Array(hashBuffer));
9
- return hashArray.map((byte) => byte.toString(16).padStart(2, '0')).join('');
10
- }
1
+ export { hashSHA1 } from '@posthog/core';
11
2
  //# sourceMappingURL=crypto.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../../src/client/feature-flags/crypto.ts"],"names":[],"mappings":"AAAA,2BAA2B;AAE3B,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY;IACzC,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,EAAE,MAAM,CAAA;IACxC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;IACnD,CAAC;IAED,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAA;IAC/E,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,CAAA;IACxD,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;AAC7E,CAAC"}
1
+ {"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../../src/client/feature-flags/crypto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA"}
@@ -42,6 +42,5 @@ export declare class LocalFeatureFlagEvaluator {
42
42
  private matchFeatureFlagProperties;
43
43
  private isConditionMatch;
44
44
  private getMatchingVariant;
45
- private variantLookupTable;
46
45
  }
47
46
  //# sourceMappingURL=evaluator.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../../src/client/feature-flags/evaluator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"evaluator.d.ts","sourceRoot":"","sources":["../../../src/client/feature-flags/evaluator.ts"],"names":[],"mappings":"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"}
@@ -1,13 +1,5 @@
1
- import { hashSHA1 } from './crypto.js';
1
+ import { getFeatureFlagHash, getFeatureFlagVariant, resolveFeatureFlagPayload } from '@posthog/core';
2
2
  import { InconclusiveMatchError, RequiresServerEvaluation, matchCohort, matchProperty } from './match-property.js';
3
- // Matches posthog-node's hashing constant exactly; the value is larger than Number.MAX_SAFE_INTEGER
4
- // by design and we don't want the no-loss-of-precision rule to coerce it to a different number.
5
- // eslint-disable-next-line no-loss-of-precision
6
- const LONG_SCALE = 0xfffffffffffffff;
7
- async function _hash(key, bucketingValue, salt = '') {
8
- const hashString = await hashSHA1(`${key}.${bucketingValue}${salt}`);
9
- return parseInt(hashString.slice(0, 15), 16) / LONG_SCALE;
10
- }
11
3
  export class LocalFeatureFlagEvaluator {
12
4
  flags;
13
5
  flagsByKey;
@@ -166,31 +158,7 @@ export class LocalFeatureFlagEvaluator {
166
158
  return distinctId;
167
159
  }
168
160
  getPayloadForValue(key, flagValue) {
169
- if (flagValue === false || flagValue === null || flagValue === undefined)
170
- return null;
171
- let payload = null;
172
- const payloads = this.flagsByKey[key]?.filters?.payloads;
173
- if (!payloads)
174
- return null;
175
- if (typeof flagValue === 'boolean') {
176
- payload = payloads[flagValue.toString()] || null;
177
- }
178
- else if (typeof flagValue === 'string') {
179
- payload = payloads[flagValue] || null;
180
- }
181
- if (payload == null)
182
- return null;
183
- if (typeof payload === 'object')
184
- return payload;
185
- if (typeof payload === 'string') {
186
- try {
187
- return JSON.parse(payload);
188
- }
189
- catch {
190
- return payload;
191
- }
192
- }
193
- return payload;
161
+ return resolveFeatureFlagPayload(this.flagsByKey[key]?.filters?.payloads, flagValue);
194
162
  }
195
163
  async evaluateFlagDependency(property, ctx) {
196
164
  const { evaluationCache } = ctx;
@@ -314,25 +282,14 @@ export class LocalFeatureFlagEvaluator {
314
282
  if (rolloutPercentage == undefined)
315
283
  return true;
316
284
  }
317
- if (rolloutPercentage != undefined && (await _hash(flag.key, bucketingValue)) > rolloutPercentage / 100.0) {
285
+ if (rolloutPercentage != undefined &&
286
+ (await getFeatureFlagHash(flag.key, bucketingValue)) > rolloutPercentage / 100.0) {
318
287
  return false;
319
288
  }
320
289
  return true;
321
290
  }
322
291
  async getMatchingVariant(flag, bucketingValue) {
323
- const hashValue = await _hash(flag.key, bucketingValue, 'variant');
324
- return this.variantLookupTable(flag).find((v) => hashValue >= v.valueMin && hashValue < v.valueMax)?.key;
325
- }
326
- variantLookupTable(flag) {
327
- const table = [];
328
- let valueMin = 0;
329
- const multivariates = flag.filters?.multivariate?.variants || [];
330
- for (const variant of multivariates) {
331
- const valueMax = valueMin + variant.rollout_percentage / 100.0;
332
- table.push({ valueMin, valueMax, key: variant.key });
333
- valueMin = valueMax;
334
- }
335
- return table;
292
+ return getFeatureFlagVariant(flag.key, bucketingValue, flag.filters?.multivariate?.variants || []);
336
293
  }
337
294
  }
338
295
  function flagEvaluatesToExpectedValue(expectedValue, flagValue) {
@@ -1 +1 @@
1
- {"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../../src/client/feature-flags/evaluator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"evaluator.js","sourceRoot":"","sources":["../../../src/client/feature-flags/evaluator.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,9 @@
1
+ import { InconclusiveMatchError } from '@posthog/core';
1
2
  import type { FlagProperty, PropertyGroup } from './types.js';
2
- export declare class InconclusiveMatchError extends Error {
3
- constructor(message: string);
4
- }
3
+ export { InconclusiveMatchError };
5
4
  export declare class RequiresServerEvaluation extends Error {
6
5
  constructor(message: string);
7
6
  }
8
- export declare function relativeDateParseForFeatureFlagMatching(value: string): Date | null;
9
7
  export declare function matchProperty(property: FlagProperty, propertyValues: Record<string, any>, warnFunction?: (msg: string) => void): boolean;
10
8
  export declare function matchCohort(property: FlagProperty, propertyValues: Record<string, any>, cohortProperties: Record<string, PropertyGroup>, debugMode?: boolean): boolean;
11
9
  export declare function matchPropertyGroup(propertyGroup: PropertyGroup, propertyValues: Record<string, any>, cohortProperties: Record<string, PropertyGroup>, debugMode?: boolean): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"match-property.d.ts","sourceRoot":"","sources":["../../../src/client/feature-flags/match-property.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAqB,aAAa,EAAE,MAAM,YAAY,CAAA;AAOhF,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAK5B;AAED,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAK5B;AAoFD,wBAAgB,uCAAuC,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAmBlF;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,YAAY,EACtB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACnC,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GACnC,OAAO,CAyHT;AAED,wBAAgB,WAAW,CACzB,QAAQ,EAAE,YAAY,EACtB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACnC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,EAC/C,SAAS,GAAE,OAAe,GACzB,OAAO,CAQT;AAED,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACnC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,EAC/C,SAAS,GAAE,OAAe,GACzB,OAAO,CAiFT"}
1
+ {"version":3,"file":"match-property.d.ts","sourceRoot":"","sources":["../../../src/client/feature-flags/match-property.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAA4B,MAAM,eAAe,CAAA;AAChF,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE7D,OAAO,EAAE,sBAAsB,EAAE,CAAA;AAEjC,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAK5B;AAID,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,YAAY,EACtB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACnC,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,GACnC,OAAO,CAKT;AAED,wBAAgB,WAAW,CACzB,QAAQ,EAAE,YAAY,EACtB,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACnC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,EAC/C,SAAS,GAAE,OAAe,GACzB,OAAO,CAQT;AAED,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACnC,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,EAC/C,SAAS,GAAE,OAAe,GACzB,OAAO,CAiFT"}
@@ -1,14 +1,5 @@
1
- // Operators that should still run their switch case when the property value is null/undefined.
2
- // `is_not` may legitimately compare against null; `is_set` only cares about key presence and
3
- // must not be short-circuited by the null guard below.
4
- const NULL_VALUES_ALLOWED_OPERATORS = ['is_not', 'is_set'];
5
- export class InconclusiveMatchError extends Error {
6
- constructor(message) {
7
- super(message);
8
- this.name = this.constructor.name;
9
- Object.setPrototypeOf(this, InconclusiveMatchError.prototype);
10
- }
11
- }
1
+ import { InconclusiveMatchError, matchFeatureFlagProperty } from '@posthog/core';
2
+ export { InconclusiveMatchError };
12
3
  export class RequiresServerEvaluation extends Error {
13
4
  constructor(message) {
14
5
  super(message);
@@ -16,233 +7,13 @@ export class RequiresServerEvaluation extends Error {
16
7
  Object.setPrototypeOf(this, RequiresServerEvaluation.prototype);
17
8
  }
18
9
  }
19
- function isValidRegex(regex) {
20
- try {
21
- new RegExp(regex);
22
- return true;
23
- }
24
- catch {
25
- return false;
26
- }
27
- }
28
- function parseSemver(value) {
29
- const text = String(value).trim().replace(/^[vV]/, '');
30
- const baseVersion = text.split('-')[0].split('+')[0];
31
- if (!baseVersion || baseVersion.startsWith('.')) {
32
- throw new InconclusiveMatchError(`Invalid semver: ${value}`);
33
- }
34
- const parts = baseVersion.split('.');
35
- const parsePart = (part) => {
36
- if (part === undefined || part === '')
37
- return 0;
38
- if (!/^\d+$/.test(part)) {
39
- throw new InconclusiveMatchError(`Invalid semver: ${value}`);
40
- }
41
- return parseInt(part, 10);
42
- };
43
- return [parsePart(parts[0]), parsePart(parts[1]), parsePart(parts[2])];
44
- }
45
- function compareSemverTuples(a, b) {
46
- for (let i = 0; i < 3; i++) {
47
- if (a[i] < b[i])
48
- return -1;
49
- if (a[i] > b[i])
50
- return 1;
51
- }
52
- return 0;
53
- }
54
- function computeTildeBounds(value) {
55
- const parsed = parseSemver(value);
56
- return { lower: [parsed[0], parsed[1], parsed[2]], upper: [parsed[0], parsed[1] + 1, 0] };
57
- }
58
- function computeCaretBounds(value) {
59
- const [major, minor, patch] = parseSemver(value);
60
- const lower = [major, minor, patch];
61
- let upper;
62
- if (major > 0)
63
- upper = [major + 1, 0, 0];
64
- else if (minor > 0)
65
- upper = [0, minor + 1, 0];
66
- else
67
- upper = [0, 0, patch + 1];
68
- return { lower, upper };
69
- }
70
- function computeWildcardBounds(value) {
71
- const text = String(value).trim().replace(/^[vV]/, '');
72
- const cleanedText = text.replace(/\.\*$/, '').replace(/\*$/, '');
73
- if (!cleanedText)
74
- throw new InconclusiveMatchError(`Invalid wildcard semver: ${value}`);
75
- const parts = cleanedText.split('.');
76
- const major = parseInt(parts[0], 10);
77
- if (isNaN(major))
78
- throw new InconclusiveMatchError(`Invalid wildcard semver: ${value}`);
79
- if (parts.length === 1) {
80
- return { lower: [major, 0, 0], upper: [major + 1, 0, 0] };
81
- }
82
- const minor = parseInt(parts[1], 10);
83
- if (isNaN(minor))
84
- throw new InconclusiveMatchError(`Invalid wildcard semver: ${value}`);
85
- return { lower: [major, minor, 0], upper: [major, minor + 1, 0] };
86
- }
87
- function convertToDateTime(value) {
88
- if (value instanceof Date)
89
- return value;
90
- if (typeof value === 'string' || typeof value === 'number') {
91
- const date = new Date(value);
92
- if (!isNaN(date.valueOf()))
93
- return date;
94
- throw new InconclusiveMatchError(`${value} is in an invalid date format`);
95
- }
96
- throw new InconclusiveMatchError(`The date provided ${value} must be a string, number, or date object`);
97
- }
98
- export function relativeDateParseForFeatureFlagMatching(value) {
99
- const regex = /^-?(?<number>[0-9]+)(?<interval>[a-z])$/;
100
- const match = value.match(regex);
101
- const parsedDt = new Date(new Date().toISOString());
102
- if (!match || !match.groups)
103
- return null;
104
- const number = parseInt(match.groups['number']);
105
- if (number >= 10000)
106
- return null;
107
- const interval = match.groups['interval'];
108
- if (interval == 'h')
109
- parsedDt.setUTCHours(parsedDt.getUTCHours() - number);
110
- else if (interval == 'd')
111
- parsedDt.setUTCDate(parsedDt.getUTCDate() - number);
112
- else if (interval == 'w')
113
- parsedDt.setUTCDate(parsedDt.getUTCDate() - number * 7);
114
- else if (interval == 'm')
115
- parsedDt.setUTCMonth(parsedDt.getUTCMonth() - number);
116
- else if (interval == 'y')
117
- parsedDt.setUTCFullYear(parsedDt.getUTCFullYear() - number);
118
- else
119
- return null;
120
- return parsedDt;
121
- }
10
+ // Convex historically accepted leading-zero SemVer identifiers and parseInt-compatible wildcard
11
+ // components. Keep that behavior explicit until product parity is decided.
122
12
  export function matchProperty(property, propertyValues, warnFunction) {
123
- const key = property.key;
124
- const value = property.value;
125
- const operator = property.operator || 'exact';
126
- if (!(key in propertyValues)) {
127
- // When the property is genuinely absent we can answer `is_not_set` locally — no need to
128
- // bail out as inconclusive and force the flag to return undefined.
129
- if (operator === 'is_not_set')
130
- return true;
131
- throw new InconclusiveMatchError(`Property ${key} not found in propertyValues`);
132
- }
133
- else if (operator === 'is_not_set') {
134
- return false;
135
- }
136
- const overrideValue = propertyValues[key];
137
- if (overrideValue == null && !NULL_VALUES_ALLOWED_OPERATORS.includes(operator)) {
138
- warnFunction?.(`Property ${key} cannot have a value of null/undefined with the ${operator} operator`);
139
- return false;
140
- }
141
- function computeExactMatch(value, overrideValue) {
142
- if (Array.isArray(value)) {
143
- return value.map((val) => String(val).toLowerCase()).includes(String(overrideValue).toLowerCase());
144
- }
145
- return String(value).toLowerCase() === String(overrideValue).toLowerCase();
146
- }
147
- function compare(lhs, rhs, op) {
148
- if (op === 'gt')
149
- return lhs > rhs;
150
- if (op === 'gte')
151
- return lhs >= rhs;
152
- if (op === 'lt')
153
- return lhs < rhs;
154
- if (op === 'lte')
155
- return lhs <= rhs;
156
- throw new Error(`Invalid operator: ${op}`);
157
- }
158
- switch (operator) {
159
- case 'exact':
160
- return computeExactMatch(value, overrideValue);
161
- case 'is_not':
162
- return !computeExactMatch(value, overrideValue);
163
- case 'is_set':
164
- return key in propertyValues;
165
- case 'icontains':
166
- return String(overrideValue).toLowerCase().includes(String(value).toLowerCase());
167
- case 'not_icontains':
168
- return !String(overrideValue).toLowerCase().includes(String(value).toLowerCase());
169
- case 'starts_with':
170
- return String(overrideValue).toLowerCase().startsWith(String(value).toLowerCase());
171
- case 'not_starts_with':
172
- return !String(overrideValue).toLowerCase().startsWith(String(value).toLowerCase());
173
- case 'ends_with':
174
- return String(overrideValue).toLowerCase().endsWith(String(value).toLowerCase());
175
- case 'not_ends_with':
176
- return !String(overrideValue).toLowerCase().endsWith(String(value).toLowerCase());
177
- case 'regex':
178
- return isValidRegex(String(value)) && String(overrideValue).match(String(value)) !== null;
179
- case 'not_regex':
180
- return isValidRegex(String(value)) && String(overrideValue).match(String(value)) === null;
181
- case 'gt':
182
- case 'gte':
183
- case 'lt':
184
- case 'lte': {
185
- // Try a numeric comparison first; only fall back to lexicographic when one side genuinely
186
- // isn't a number. `parseFloat` returns NaN for non-numeric strings, so `Number.isFinite`
187
- // is the right guard — `NaN != null` would slip through and produce nonsense comparisons
188
- // like `NaN > 5`. Likewise, when a person property arrives as the string `"10"` we want
189
- // `"10" > "9"` to evaluate numerically (true), not lexicographically (false).
190
- const parsedValue = typeof value === 'number' ? value : parseFloat(String(value));
191
- const parsedOverride = typeof overrideValue === 'number'
192
- ? overrideValue
193
- : overrideValue != null
194
- ? parseFloat(String(overrideValue))
195
- : NaN;
196
- if (Number.isFinite(parsedValue) && Number.isFinite(parsedOverride)) {
197
- return compare(parsedOverride, parsedValue, operator);
198
- }
199
- return compare(String(overrideValue), String(value), operator);
200
- }
201
- case 'is_date_after':
202
- case 'is_date_before': {
203
- if (typeof value === 'boolean') {
204
- throw new InconclusiveMatchError(`Date operations cannot be performed on boolean values`);
205
- }
206
- let parsedDate = relativeDateParseForFeatureFlagMatching(String(value));
207
- if (parsedDate == null)
208
- parsedDate = convertToDateTime(value);
209
- if (parsedDate == null)
210
- throw new InconclusiveMatchError(`Invalid date: ${value}`);
211
- const overrideDate = convertToDateTime(overrideValue);
212
- if (operator === 'is_date_before')
213
- return overrideDate < parsedDate;
214
- return overrideDate > parsedDate;
215
- }
216
- case 'semver_eq':
217
- return compareSemverTuples(parseSemver(String(overrideValue)), parseSemver(String(value))) === 0;
218
- case 'semver_neq':
219
- return compareSemverTuples(parseSemver(String(overrideValue)), parseSemver(String(value))) !== 0;
220
- case 'semver_gt':
221
- return compareSemverTuples(parseSemver(String(overrideValue)), parseSemver(String(value))) > 0;
222
- case 'semver_gte':
223
- return compareSemverTuples(parseSemver(String(overrideValue)), parseSemver(String(value))) >= 0;
224
- case 'semver_lt':
225
- return compareSemverTuples(parseSemver(String(overrideValue)), parseSemver(String(value))) < 0;
226
- case 'semver_lte':
227
- return compareSemverTuples(parseSemver(String(overrideValue)), parseSemver(String(value))) <= 0;
228
- case 'semver_tilde': {
229
- const overrideParsed = parseSemver(String(overrideValue));
230
- const { lower, upper } = computeTildeBounds(String(value));
231
- return compareSemverTuples(overrideParsed, lower) >= 0 && compareSemverTuples(overrideParsed, upper) < 0;
232
- }
233
- case 'semver_caret': {
234
- const overrideParsed = parseSemver(String(overrideValue));
235
- const { lower, upper } = computeCaretBounds(String(value));
236
- return compareSemverTuples(overrideParsed, lower) >= 0 && compareSemverTuples(overrideParsed, upper) < 0;
237
- }
238
- case 'semver_wildcard': {
239
- const overrideParsed = parseSemver(String(overrideValue));
240
- const { lower, upper } = computeWildcardBounds(String(value));
241
- return compareSemverTuples(overrideParsed, lower) >= 0 && compareSemverTuples(overrideParsed, upper) < 0;
242
- }
243
- default:
244
- throw new InconclusiveMatchError(`Unknown operator: ${operator}`);
245
- }
13
+ return matchFeatureFlagProperty(property, propertyValues, {
14
+ warnFunction,
15
+ semverParsingPolicy: 'legacy-permissive',
16
+ });
246
17
  }
247
18
  export function matchCohort(property, propertyValues, cohortProperties, debugMode = false) {
248
19
  const cohortId = String(property.value);
@@ -1 +1 @@
1
- {"version":3,"file":"match-property.js","sourceRoot":"","sources":["../../../src/client/feature-flags/match-property.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"match-property.js","sourceRoot":"","sources":["../../../src/client/feature-flags/match-property.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAA;AAGhF,OAAO,EAAE,sBAAsB,EAAE,CAAA;AAEjC,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACjD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAA;QACd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAA;QACjC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,wBAAwB,CAAC,SAAS,CAAC,CAAA;IACjE,CAAC;CACF;AAED,gGAAgG;AAChG,2EAA2E;AAC3E,MAAM,UAAU,aAAa,CAC3B,QAAsB,EACtB,cAAmC,EACnC,YAAoC;IAEpC,OAAO,wBAAwB,CAAC,QAAQ,EAAE,cAAc,EAAE;QACxD,YAAY;QACZ,mBAAmB,EAAE,mBAAmB;KACzC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,QAAsB,EACtB,cAAmC,EACnC,gBAA+C,EAC/C,YAAqB,KAAK;IAE1B,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IACvC,IAAI,CAAC,CAAC,QAAQ,IAAI,gBAAgB,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,wBAAwB,CAChC,UAAU,QAAQ,sFAAsF,CACzG,CAAA;IACH,CAAC;IACD,OAAO,kBAAkB,CAAC,gBAAgB,CAAC,QAAQ,CAAC,EAAE,cAAc,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAA;AACpG,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,aAA4B,EAC5B,cAAmC,EACnC,gBAA+C,EAC/C,YAAqB,KAAK;IAE1B,IAAI,CAAC,aAAa;QAAE,OAAO,IAAI,CAAA;IAE/B,MAAM,iBAAiB,GAAG,aAAa,CAAC,IAAI,CAAA;IAC5C,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAA;IAEvC,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAA;IAEvD,IAAI,oBAAoB,GAAG,KAAK,CAAA;IAEhC,IAAI,QAAQ,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9B,KAAK,MAAM,IAAI,IAAI,UAA6B,EAAE,CAAC;YACjD,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,kBAAkB,CAAC,IAAI,EAAE,cAAc,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAA;gBACrF,IAAI,iBAAiB,KAAK,KAAK,EAAE,CAAC;oBAChC,IAAI,CAAC,OAAO;wBAAE,OAAO,KAAK,CAAA;gBAC5B,CAAC;qBAAM,CAAC;oBACN,IAAI,OAAO;wBAAE,OAAO,IAAI,CAAA;gBAC1B,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,wBAAwB;oBAAE,MAAM,GAAG,CAAA;gBACtD,IAAI,GAAG,YAAY,sBAAsB,EAAE,CAAC;oBAC1C,IAAI,SAAS;wBAAE,OAAO,CAAC,KAAK,CAAC,8BAA8B,IAAI,aAAa,GAAG,EAAE,CAAC,CAAA;oBAClF,oBAAoB,GAAG,IAAI,CAAA;gBAC7B,CAAC;qBAAM,CAAC;oBACN,MAAM,GAAG,CAAA;gBACX,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,oBAAoB,EAAE,CAAC;YACzB,MAAM,IAAI,sBAAsB,CAAC,0DAA0D,CAAC,CAAA;QAC9F,CAAC;QACD,OAAO,iBAAiB,KAAK,KAAK,CAAA;IACpC,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,IAAI,IAAI,UAA4B,EAAE,CAAC;YAChD,IAAI,CAAC;gBACH,IAAI,OAAgB,CAAA;gBACpB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC3B,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,cAAc,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAA;gBAC1E,CAAC;qBAAM,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;oBAChC,IAAI,SAAS,EAAE,CAAC;wBACd,OAAO,CAAC,IAAI,CACV,iFAAiF;4BAC/E,+CAA+C,IAAI,CAAC,GAAG,IAAI,SAAS,GAAG,CAC1E,CAAA;oBACH,CAAC;oBACD,wFAAwF;oBACxF,yFAAyF;oBACzF,wEAAwE;oBACxE,uDAAuD;oBACvD,oBAAoB,GAAG,IAAI,CAAA;oBAC3B,SAAQ;gBACV,CAAC;qBAAM,CAAC;oBACN,OAAO,GAAG,aAAa,CAAC,IAAI,EAAE,cAAc,CAAC,CAAA;gBAC/C,CAAC;gBAED,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,KAAK,CAAA;gBACvC,IAAI,iBAAiB,KAAK,KAAK,EAAE,CAAC;oBAChC,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ;wBAAE,OAAO,KAAK,CAAA;oBACvC,IAAI,OAAO,IAAI,QAAQ;wBAAE,OAAO,KAAK,CAAA;gBACvC,CAAC;qBAAM,CAAC;oBACN,IAAI,OAAO,IAAI,CAAC,QAAQ;wBAAE,OAAO,IAAI,CAAA;oBACrC,IAAI,CAAC,OAAO,IAAI,QAAQ;wBAAE,OAAO,IAAI,CAAA;gBACvC,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,wBAAwB;oBAAE,MAAM,GAAG,CAAA;gBACtD,IAAI,GAAG,YAAY,sBAAsB,EAAE,CAAC;oBAC1C,IAAI,SAAS;wBAAE,OAAO,CAAC,KAAK,CAAC,8BAA8B,IAAI,aAAa,GAAG,EAAE,CAAC,CAAA;oBAClF,oBAAoB,GAAG,IAAI,CAAA;gBAC7B,CAAC;qBAAM,CAAC;oBACN,MAAM,GAAG,CAAA;gBACX,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,oBAAoB,EAAE,CAAC;YACzB,MAAM,IAAI,sBAAsB,CAAC,0DAA0D,CAAC,CAAA;QAC9F,CAAC;QACD,OAAO,iBAAiB,KAAK,KAAK,CAAA;IACpC,CAAC;AACH,CAAC"}
@@ -1,2 +1,2 @@
1
- export declare const version = "2.1.1";
1
+ export declare const version = "2.1.3";
2
2
  //# sourceMappingURL=version.d.ts.map
@@ -1,2 +1,2 @@
1
- export const version = '2.1.1';
1
+ export const version = '2.1.3';
2
2
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -11,7 +11,7 @@
11
11
  "url": "https://github.com/PostHog/posthog-js/issues"
12
12
  },
13
13
  "author": "PostHog Inc.",
14
- "version": "2.1.1",
14
+ "version": "2.1.3",
15
15
  "license": "MIT",
16
16
  "keywords": [
17
17
  "convex",
@@ -48,8 +48,8 @@
48
48
  "types": "./dist/client/index.d.ts",
49
49
  "module": "./dist/client/index.js",
50
50
  "dependencies": {
51
- "@posthog/core": "^1.48.6",
52
- "posthog-node": "^5.49.2"
51
+ "@posthog/core": "^1.48.12",
52
+ "posthog-node": "^5.51.3"
53
53
  },
54
54
  "devDependencies": {
55
55
  "@edge-runtime/vm": "^5.0.0",
@@ -1,12 +1 @@
1
- /// <reference lib="dom" />
2
-
3
- export async function hashSHA1(text: string): Promise<string> {
4
- const subtle = globalThis.crypto?.subtle
5
- if (!subtle) {
6
- throw new Error('SubtleCrypto API not available')
7
- }
8
-
9
- const hashBuffer = await subtle.digest('SHA-1', new TextEncoder().encode(text))
10
- const hashArray = Array.from(new Uint8Array(hashBuffer))
11
- return hashArray.map((byte) => byte.toString(16).padStart(2, '0')).join('')
12
- }
1
+ export { hashSHA1 } from '@posthog/core'
@@ -200,7 +200,7 @@ describe('LocalFeatureFlagEvaluator', () => {
200
200
  expect(await evaluator.getFeatureFlag('not-pro', 'user', {}, { plan: 'free' })).toBe(true)
201
201
  })
202
202
 
203
- test('is_not_set condition resolves locally without forcing inconclusive', async () => {
203
+ test('is_not_set condition is inconclusive when the property is omitted', async () => {
204
204
  const evaluator = new LocalFeatureFlagEvaluator(
205
205
  definitions([
206
206
  makeFlag('only-anon', {
@@ -215,9 +215,7 @@ describe('LocalFeatureFlagEvaluator', () => {
215
215
  }),
216
216
  ])
217
217
  )
218
- // Key absent → property is_not_set is true → flag matches.
219
- expect(await evaluator.getFeatureFlag('only-anon', 'user', {}, {})).toBe(true)
220
- // Key present → property IS set → flag does not match.
218
+ expect(await evaluator.getFeatureFlag('only-anon', 'user', {}, {})).toBeUndefined()
221
219
  expect(await evaluator.getFeatureFlag('only-anon', 'user', {}, { email: 'a@b.com' })).toBe(false)
222
220
  })
223
221
 
@@ -1,3 +1,4 @@
1
+ import { getFeatureFlagHash, getFeatureFlagVariant, resolveFeatureFlagPayload } from '@posthog/core'
1
2
  import type {
2
3
  FeatureFlagCondition,
3
4
  FeatureFlagEvaluationContext,
@@ -7,19 +8,8 @@ import type {
7
8
  JsonType,
8
9
  PostHogFeatureFlag,
9
10
  } from './types.js'
10
- import { hashSHA1 } from './crypto.js'
11
11
  import { InconclusiveMatchError, RequiresServerEvaluation, matchCohort, matchProperty } from './match-property.js'
12
12
 
13
- // Matches posthog-node's hashing constant exactly; the value is larger than Number.MAX_SAFE_INTEGER
14
- // by design and we don't want the no-loss-of-precision rule to coerce it to a different number.
15
- // eslint-disable-next-line no-loss-of-precision
16
- const LONG_SCALE = 0xfffffffffffffff
17
-
18
- async function _hash(key: string, bucketingValue: string, salt: string = ''): Promise<number> {
19
- const hashString = await hashSHA1(`${key}.${bucketingValue}${salt}`)
20
- return parseInt(hashString.slice(0, 15), 16) / LONG_SCALE
21
- }
22
-
23
13
  export type EvaluationResult = {
24
14
  value: FeatureFlagValue
25
15
  payload: JsonType | null
@@ -263,28 +253,7 @@ export class LocalFeatureFlagEvaluator {
263
253
  }
264
254
 
265
255
  private getPayloadForValue(key: string, flagValue: FeatureFlagValue): JsonType | null {
266
- if (flagValue === false || flagValue === null || flagValue === undefined) return null
267
-
268
- let payload: JsonType | null = null
269
- const payloads = this.flagsByKey[key]?.filters?.payloads
270
- if (!payloads) return null
271
-
272
- if (typeof flagValue === 'boolean') {
273
- payload = payloads[flagValue.toString()] || null
274
- } else if (typeof flagValue === 'string') {
275
- payload = payloads[flagValue] || null
276
- }
277
-
278
- if (payload == null) return null
279
- if (typeof payload === 'object') return payload
280
- if (typeof payload === 'string') {
281
- try {
282
- return JSON.parse(payload)
283
- } catch {
284
- return payload
285
- }
286
- }
287
- return payload
256
+ return resolveFeatureFlagPayload(this.flagsByKey[key]?.filters?.payloads, flagValue)
288
257
  }
289
258
 
290
259
  private async evaluateFlagDependency(
@@ -434,27 +403,17 @@ export class LocalFeatureFlagEvaluator {
434
403
  if (rolloutPercentage == undefined) return true
435
404
  }
436
405
 
437
- if (rolloutPercentage != undefined && (await _hash(flag.key, bucketingValue)) > rolloutPercentage / 100.0) {
406
+ if (
407
+ rolloutPercentage != undefined &&
408
+ (await getFeatureFlagHash(flag.key, bucketingValue)) > rolloutPercentage / 100.0
409
+ ) {
438
410
  return false
439
411
  }
440
412
  return true
441
413
  }
442
414
 
443
415
  private async getMatchingVariant(flag: PostHogFeatureFlag, bucketingValue: string): Promise<string | undefined> {
444
- const hashValue = await _hash(flag.key, bucketingValue, 'variant')
445
- return this.variantLookupTable(flag).find((v) => hashValue >= v.valueMin && hashValue < v.valueMax)?.key
446
- }
447
-
448
- private variantLookupTable(flag: PostHogFeatureFlag): { valueMin: number; valueMax: number; key: string }[] {
449
- const table: { valueMin: number; valueMax: number; key: string }[] = []
450
- let valueMin = 0
451
- const multivariates = flag.filters?.multivariate?.variants || []
452
- for (const variant of multivariates) {
453
- const valueMax = valueMin + variant.rollout_percentage / 100.0
454
- table.push({ valueMin, valueMax, key: variant.key })
455
- valueMin = valueMax
456
- }
457
- return table
416
+ return getFeatureFlagVariant(flag.key, bucketingValue, flag.filters?.multivariate?.variants || [])
458
417
  }
459
418
  }
460
419
 
@@ -37,34 +37,22 @@ describe('matchProperty — numeric comparisons', () => {
37
37
  })
38
38
  })
39
39
 
40
- describe('matchProperty — is_not_set', () => {
41
- test('returns true when the property is absent', () => {
42
- expect(matchProperty({ key: 'missing', value: 'whatever', operator: 'is_not_set' }, {})).toBe(true)
43
- })
44
-
45
- test('returns false when the property is present', () => {
46
- expect(matchProperty({ key: 'plan', value: 'whatever', operator: 'is_not_set' }, { plan: 'pro' })).toBe(false)
47
- })
48
-
49
- test('treats null-valued property as still set (returns false)', () => {
50
- // `null` counts as present in propertyValues; only genuinely missing keys read as "not set".
51
- expect(matchProperty({ key: 'plan', value: 'whatever', operator: 'is_not_set' }, { plan: null })).toBe(false)
52
- })
53
- })
54
-
55
- describe('matchProperty — is_set', () => {
56
- test('returns true when the property is present with a non-null value', () => {
57
- expect(matchProperty({ key: 'plan', value: '', operator: 'is_set' }, { plan: 'pro' })).toBe(true)
58
- })
59
-
60
- test('returns true when the property is present with a null value', () => {
61
- // `is_set` is about key presence, not value. Pre-fix, the null guard short-circuited and
62
- // returned false here.
63
- expect(matchProperty({ key: 'plan', value: '', operator: 'is_set' }, { plan: null })).toBe(true)
40
+ describe('matchProperty — presence operators', () => {
41
+ test.each([
42
+ ['null', null],
43
+ ['undefined', undefined],
44
+ ['false', false],
45
+ ['zero', 0],
46
+ ['empty string', ''],
47
+ ['empty array', []],
48
+ ['empty object', {}],
49
+ ])('treats present %s as set', (_, value) => {
50
+ expect(matchProperty({ key: 'key', value: '', operator: 'is_set' }, { key: value })).toBe(true)
51
+ expect(matchProperty({ key: 'key', value: '', operator: 'is_not_set' }, { key: value })).toBe(false)
64
52
  })
65
53
 
66
- test('throws InconclusiveMatchError when the property is absent', () => {
67
- expect(() => matchProperty({ key: 'plan', value: '', operator: 'is_set' }, {})).toThrow(InconclusiveMatchError)
54
+ test.each(['is_set', 'is_not_set'])('%s is inconclusive when the property is omitted', (operator) => {
55
+ expect(() => matchProperty({ key: 'key', value: '', operator }, {})).toThrow(InconclusiveMatchError)
68
56
  })
69
57
  })
70
58
 
@@ -141,8 +129,18 @@ describe('matchProperty — starts_with / ends_with', () => {
141
129
  )
142
130
  })
143
131
 
132
+ describe('matchProperty — SemVer compatibility policy', () => {
133
+ test('preserves legacy leading-zero SemVer matching', () => {
134
+ expect(matchProperty(prop('semver_eq', '01.02.03'), { k: '1.2.3' })).toBe(true)
135
+ })
136
+
137
+ test('preserves legacy parseInt-compatible wildcard matching', () => {
138
+ expect(matchProperty(prop('semver_wildcard', '1x.*'), { k: '1.8.0' })).toBe(true)
139
+ })
140
+ })
141
+
144
142
  describe('matchProperty — error cases', () => {
145
- test('throws InconclusiveMatchError when key is absent for non-is_not_set operators', () => {
143
+ test('throws InconclusiveMatchError when key is absent for other operators', () => {
146
144
  expect(() => matchProperty(prop('exact', 'x'), {})).toThrow(InconclusiveMatchError)
147
145
  })
148
146
  })
@@ -1,17 +1,7 @@
1
- import type { FlagProperty, FlagPropertyValue, PropertyGroup } from './types.js'
1
+ import { InconclusiveMatchError, matchFeatureFlagProperty } from '@posthog/core'
2
+ import type { FlagProperty, PropertyGroup } from './types.js'
2
3
 
3
- // Operators that should still run their switch case when the property value is null/undefined.
4
- // `is_not` may legitimately compare against null; `is_set` only cares about key presence and
5
- // must not be short-circuited by the null guard below.
6
- const NULL_VALUES_ALLOWED_OPERATORS = ['is_not', 'is_set']
7
-
8
- export class InconclusiveMatchError extends Error {
9
- constructor(message: string) {
10
- super(message)
11
- this.name = this.constructor.name
12
- Object.setPrototypeOf(this, InconclusiveMatchError.prototype)
13
- }
14
- }
4
+ export { InconclusiveMatchError }
15
5
 
16
6
  export class RequiresServerEvaluation extends Error {
17
7
  constructor(message: string) {
@@ -21,234 +11,17 @@ export class RequiresServerEvaluation extends Error {
21
11
  }
22
12
  }
23
13
 
24
- function isValidRegex(regex: string): boolean {
25
- try {
26
- new RegExp(regex)
27
- return true
28
- } catch {
29
- return false
30
- }
31
- }
32
-
33
- type SemverTuple = [number, number, number]
34
-
35
- function parseSemver(value: string): SemverTuple {
36
- const text = String(value).trim().replace(/^[vV]/, '')
37
- const baseVersion = text.split('-')[0].split('+')[0]
38
-
39
- if (!baseVersion || baseVersion.startsWith('.')) {
40
- throw new InconclusiveMatchError(`Invalid semver: ${value}`)
41
- }
42
-
43
- const parts = baseVersion.split('.')
44
-
45
- const parsePart = (part: string | undefined): number => {
46
- if (part === undefined || part === '') return 0
47
- if (!/^\d+$/.test(part)) {
48
- throw new InconclusiveMatchError(`Invalid semver: ${value}`)
49
- }
50
- return parseInt(part, 10)
51
- }
52
-
53
- return [parsePart(parts[0]), parsePart(parts[1]), parsePart(parts[2])]
54
- }
55
-
56
- function compareSemverTuples(a: SemverTuple, b: SemverTuple): number {
57
- for (let i = 0; i < 3; i++) {
58
- if (a[i] < b[i]) return -1
59
- if (a[i] > b[i]) return 1
60
- }
61
- return 0
62
- }
63
-
64
- function computeTildeBounds(value: string): { lower: SemverTuple; upper: SemverTuple } {
65
- const parsed = parseSemver(value)
66
- return { lower: [parsed[0], parsed[1], parsed[2]], upper: [parsed[0], parsed[1] + 1, 0] }
67
- }
68
-
69
- function computeCaretBounds(value: string): { lower: SemverTuple; upper: SemverTuple } {
70
- const [major, minor, patch] = parseSemver(value)
71
- const lower: SemverTuple = [major, minor, patch]
72
- let upper: SemverTuple
73
- if (major > 0) upper = [major + 1, 0, 0]
74
- else if (minor > 0) upper = [0, minor + 1, 0]
75
- else upper = [0, 0, patch + 1]
76
- return { lower, upper }
77
- }
78
-
79
- function computeWildcardBounds(value: string): { lower: SemverTuple; upper: SemverTuple } {
80
- const text = String(value).trim().replace(/^[vV]/, '')
81
- const cleanedText = text.replace(/\.\*$/, '').replace(/\*$/, '')
82
- if (!cleanedText) throw new InconclusiveMatchError(`Invalid wildcard semver: ${value}`)
83
-
84
- const parts = cleanedText.split('.')
85
- const major = parseInt(parts[0], 10)
86
- if (isNaN(major)) throw new InconclusiveMatchError(`Invalid wildcard semver: ${value}`)
87
-
88
- if (parts.length === 1) {
89
- return { lower: [major, 0, 0], upper: [major + 1, 0, 0] }
90
- }
91
- const minor = parseInt(parts[1], 10)
92
- if (isNaN(minor)) throw new InconclusiveMatchError(`Invalid wildcard semver: ${value}`)
93
- return { lower: [major, minor, 0], upper: [major, minor + 1, 0] }
94
- }
95
-
96
- function convertToDateTime(value: FlagPropertyValue | Date): Date {
97
- if (value instanceof Date) return value
98
- if (typeof value === 'string' || typeof value === 'number') {
99
- const date = new Date(value)
100
- if (!isNaN(date.valueOf())) return date
101
- throw new InconclusiveMatchError(`${value} is in an invalid date format`)
102
- }
103
- throw new InconclusiveMatchError(`The date provided ${value} must be a string, number, or date object`)
104
- }
105
-
106
- export function relativeDateParseForFeatureFlagMatching(value: string): Date | null {
107
- const regex = /^-?(?<number>[0-9]+)(?<interval>[a-z])$/
108
- const match = value.match(regex)
109
- const parsedDt = new Date(new Date().toISOString())
110
-
111
- if (!match || !match.groups) return null
112
-
113
- const number = parseInt(match.groups['number'])
114
- if (number >= 10000) return null
115
-
116
- const interval = match.groups['interval']
117
- if (interval == 'h') parsedDt.setUTCHours(parsedDt.getUTCHours() - number)
118
- else if (interval == 'd') parsedDt.setUTCDate(parsedDt.getUTCDate() - number)
119
- else if (interval == 'w') parsedDt.setUTCDate(parsedDt.getUTCDate() - number * 7)
120
- else if (interval == 'm') parsedDt.setUTCMonth(parsedDt.getUTCMonth() - number)
121
- else if (interval == 'y') parsedDt.setUTCFullYear(parsedDt.getUTCFullYear() - number)
122
- else return null
123
-
124
- return parsedDt
125
- }
126
-
14
+ // Convex historically accepted leading-zero SemVer identifiers and parseInt-compatible wildcard
15
+ // components. Keep that behavior explicit until product parity is decided.
127
16
  export function matchProperty(
128
17
  property: FlagProperty,
129
18
  propertyValues: Record<string, any>,
130
19
  warnFunction?: (msg: string) => void
131
20
  ): boolean {
132
- const key = property.key
133
- const value = property.value
134
- const operator = property.operator || 'exact'
135
-
136
- if (!(key in propertyValues)) {
137
- // When the property is genuinely absent we can answer `is_not_set` locally — no need to
138
- // bail out as inconclusive and force the flag to return undefined.
139
- if (operator === 'is_not_set') return true
140
- throw new InconclusiveMatchError(`Property ${key} not found in propertyValues`)
141
- } else if (operator === 'is_not_set') {
142
- return false
143
- }
144
-
145
- const overrideValue = propertyValues[key]
146
- if (overrideValue == null && !NULL_VALUES_ALLOWED_OPERATORS.includes(operator)) {
147
- warnFunction?.(`Property ${key} cannot have a value of null/undefined with the ${operator} operator`)
148
- return false
149
- }
150
-
151
- function computeExactMatch(value: any, overrideValue: any): boolean {
152
- if (Array.isArray(value)) {
153
- return value.map((val) => String(val).toLowerCase()).includes(String(overrideValue).toLowerCase())
154
- }
155
- return String(value).toLowerCase() === String(overrideValue).toLowerCase()
156
- }
157
-
158
- function compare(lhs: any, rhs: any, op: string): boolean {
159
- if (op === 'gt') return lhs > rhs
160
- if (op === 'gte') return lhs >= rhs
161
- if (op === 'lt') return lhs < rhs
162
- if (op === 'lte') return lhs <= rhs
163
- throw new Error(`Invalid operator: ${op}`)
164
- }
165
-
166
- switch (operator) {
167
- case 'exact':
168
- return computeExactMatch(value, overrideValue)
169
- case 'is_not':
170
- return !computeExactMatch(value, overrideValue)
171
- case 'is_set':
172
- return key in propertyValues
173
- case 'icontains':
174
- return String(overrideValue).toLowerCase().includes(String(value).toLowerCase())
175
- case 'not_icontains':
176
- return !String(overrideValue).toLowerCase().includes(String(value).toLowerCase())
177
- case 'starts_with':
178
- return String(overrideValue).toLowerCase().startsWith(String(value).toLowerCase())
179
- case 'not_starts_with':
180
- return !String(overrideValue).toLowerCase().startsWith(String(value).toLowerCase())
181
- case 'ends_with':
182
- return String(overrideValue).toLowerCase().endsWith(String(value).toLowerCase())
183
- case 'not_ends_with':
184
- return !String(overrideValue).toLowerCase().endsWith(String(value).toLowerCase())
185
- case 'regex':
186
- return isValidRegex(String(value)) && String(overrideValue).match(String(value)) !== null
187
- case 'not_regex':
188
- return isValidRegex(String(value)) && String(overrideValue).match(String(value)) === null
189
- case 'gt':
190
- case 'gte':
191
- case 'lt':
192
- case 'lte': {
193
- // Try a numeric comparison first; only fall back to lexicographic when one side genuinely
194
- // isn't a number. `parseFloat` returns NaN for non-numeric strings, so `Number.isFinite`
195
- // is the right guard — `NaN != null` would slip through and produce nonsense comparisons
196
- // like `NaN > 5`. Likewise, when a person property arrives as the string `"10"` we want
197
- // `"10" > "9"` to evaluate numerically (true), not lexicographically (false).
198
- const parsedValue = typeof value === 'number' ? value : parseFloat(String(value))
199
- const parsedOverride =
200
- typeof overrideValue === 'number'
201
- ? overrideValue
202
- : overrideValue != null
203
- ? parseFloat(String(overrideValue))
204
- : NaN
205
- if (Number.isFinite(parsedValue) && Number.isFinite(parsedOverride)) {
206
- return compare(parsedOverride, parsedValue, operator)
207
- }
208
- return compare(String(overrideValue), String(value), operator)
209
- }
210
- case 'is_date_after':
211
- case 'is_date_before': {
212
- if (typeof value === 'boolean') {
213
- throw new InconclusiveMatchError(`Date operations cannot be performed on boolean values`)
214
- }
215
- let parsedDate = relativeDateParseForFeatureFlagMatching(String(value))
216
- if (parsedDate == null) parsedDate = convertToDateTime(value)
217
- if (parsedDate == null) throw new InconclusiveMatchError(`Invalid date: ${value}`)
218
- const overrideDate = convertToDateTime(overrideValue)
219
- if (operator === 'is_date_before') return overrideDate < parsedDate
220
- return overrideDate > parsedDate
221
- }
222
- case 'semver_eq':
223
- return compareSemverTuples(parseSemver(String(overrideValue)), parseSemver(String(value))) === 0
224
- case 'semver_neq':
225
- return compareSemverTuples(parseSemver(String(overrideValue)), parseSemver(String(value))) !== 0
226
- case 'semver_gt':
227
- return compareSemverTuples(parseSemver(String(overrideValue)), parseSemver(String(value))) > 0
228
- case 'semver_gte':
229
- return compareSemverTuples(parseSemver(String(overrideValue)), parseSemver(String(value))) >= 0
230
- case 'semver_lt':
231
- return compareSemverTuples(parseSemver(String(overrideValue)), parseSemver(String(value))) < 0
232
- case 'semver_lte':
233
- return compareSemverTuples(parseSemver(String(overrideValue)), parseSemver(String(value))) <= 0
234
- case 'semver_tilde': {
235
- const overrideParsed = parseSemver(String(overrideValue))
236
- const { lower, upper } = computeTildeBounds(String(value))
237
- return compareSemverTuples(overrideParsed, lower) >= 0 && compareSemverTuples(overrideParsed, upper) < 0
238
- }
239
- case 'semver_caret': {
240
- const overrideParsed = parseSemver(String(overrideValue))
241
- const { lower, upper } = computeCaretBounds(String(value))
242
- return compareSemverTuples(overrideParsed, lower) >= 0 && compareSemverTuples(overrideParsed, upper) < 0
243
- }
244
- case 'semver_wildcard': {
245
- const overrideParsed = parseSemver(String(overrideValue))
246
- const { lower, upper } = computeWildcardBounds(String(value))
247
- return compareSemverTuples(overrideParsed, lower) >= 0 && compareSemverTuples(overrideParsed, upper) < 0
248
- }
249
- default:
250
- throw new InconclusiveMatchError(`Unknown operator: ${operator}`)
251
- }
21
+ return matchFeatureFlagProperty(property, propertyValues, {
22
+ warnFunction,
23
+ semverParsingPolicy: 'legacy-permissive',
24
+ })
252
25
  }
253
26
 
254
27
  export function matchCohort(
@@ -1 +1 @@
1
- export const version = '2.1.1'
1
+ export const version = '2.1.3'