@posthog/convex 0.2.32 → 1.0.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/README.md +132 -16
- package/dist/client/feature-flags/crypto.d.ts +2 -0
- package/dist/client/feature-flags/crypto.d.ts.map +1 -0
- package/dist/client/feature-flags/crypto.js +11 -0
- package/dist/client/feature-flags/crypto.js.map +1 -0
- package/dist/client/feature-flags/evaluator.d.ts +47 -0
- package/dist/client/feature-flags/evaluator.d.ts.map +1 -0
- package/dist/client/feature-flags/evaluator.js +346 -0
- package/dist/client/feature-flags/evaluator.js.map +1 -0
- package/dist/client/feature-flags/index.d.ts +4 -0
- package/dist/client/feature-flags/index.d.ts.map +1 -0
- package/dist/client/feature-flags/index.js +3 -0
- package/dist/client/feature-flags/index.js.map +1 -0
- package/dist/client/feature-flags/match-property.d.ts +12 -0
- package/dist/client/feature-flags/match-property.d.ts.map +1 -0
- package/dist/client/feature-flags/match-property.js +340 -0
- package/dist/client/feature-flags/match-property.js.map +1 -0
- package/dist/client/feature-flags/types.d.ts +63 -0
- package/dist/client/feature-flags/types.d.ts.map +1 -0
- package/dist/client/feature-flags/types.js +2 -0
- package/dist/client/feature-flags/types.js.map +1 -0
- package/dist/client/index.d.ts +71 -36
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +143 -32
- package/dist/client/index.js.map +1 -1
- package/dist/component/_generated/component.d.ts +8 -35
- package/dist/component/_generated/component.d.ts.map +1 -1
- package/dist/component/lib.d.ts +76 -46
- package/dist/component/lib.d.ts.map +1 -1
- package/dist/component/lib.js +311 -99
- package/dist/component/lib.js.map +1 -1
- package/dist/component/schema.d.ts +18 -1
- package/dist/component/schema.d.ts.map +1 -1
- package/dist/component/schema.js +16 -2
- package/dist/component/schema.js.map +1 -1
- package/dist/component/version.d.ts +2 -0
- package/dist/component/version.d.ts.map +1 -0
- package/dist/component/version.js +2 -0
- package/dist/component/version.js.map +1 -0
- package/package.json +5 -5
- package/src/client/feature-flags/crypto.ts +12 -0
- package/src/client/feature-flags/evaluator.test.ts +401 -0
- package/src/client/feature-flags/evaluator.ts +467 -0
- package/src/client/feature-flags/index.ts +15 -0
- package/src/client/feature-flags/match-property.test.ts +75 -0
- package/src/client/feature-flags/match-property.ts +347 -0
- package/src/client/feature-flags/types.ts +72 -0
- package/src/client/index.test.ts +60 -12
- package/src/client/index.ts +227 -70
- package/src/component/_generated/component.ts +7 -50
- package/src/component/lib.ts +340 -127
- package/src/component/schema.ts +16 -2
- package/src/component/version.ts +1 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../../src/component/lib.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../../src/component/lib.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,20 @@
|
|
|
1
|
-
declare const _default: import("convex/server").SchemaDefinition<{
|
|
1
|
+
declare const _default: import("convex/server").SchemaDefinition<{
|
|
2
|
+
/**
|
|
3
|
+
* Singleton table holding the latest feature flag definitions fetched from the PostHog API.
|
|
4
|
+
* The cron action upserts a single row; clients read it for local evaluation.
|
|
5
|
+
*
|
|
6
|
+
* `data` is a JSON-stringified `FlagDefinitions` object to bypass Convex's restriction on
|
|
7
|
+
* field names beginning with `$` (flag conditions reference properties like `$device_id`).
|
|
8
|
+
*/
|
|
9
|
+
flagDefinitions: import("convex/server").TableDefinition<import("convex/values").VObject<{
|
|
10
|
+
etag?: string | undefined;
|
|
11
|
+
data: string;
|
|
12
|
+
fetchedAt: number;
|
|
13
|
+
}, {
|
|
14
|
+
data: import("convex/values").VString<string, "required">;
|
|
15
|
+
fetchedAt: import("convex/values").VFloat64<number, "required">;
|
|
16
|
+
etag: import("convex/values").VString<string | undefined, "optional">;
|
|
17
|
+
}, "required", "data" | "fetchedAt" | "etag">, {}, {}, {}>;
|
|
18
|
+
}, true>;
|
|
2
19
|
export default _default;
|
|
3
20
|
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":";IAIE;;;;;;OAMG;;;;;;;;;;;AAPL,wBAaE"}
|
package/dist/component/schema.js
CHANGED
|
@@ -1,3 +1,17 @@
|
|
|
1
|
-
import { defineSchema } from 'convex/server';
|
|
2
|
-
|
|
1
|
+
import { defineSchema, defineTable } from 'convex/server';
|
|
2
|
+
import { v } from 'convex/values';
|
|
3
|
+
export default defineSchema({
|
|
4
|
+
/**
|
|
5
|
+
* Singleton table holding the latest feature flag definitions fetched from the PostHog API.
|
|
6
|
+
* The cron action upserts a single row; clients read it for local evaluation.
|
|
7
|
+
*
|
|
8
|
+
* `data` is a JSON-stringified `FlagDefinitions` object to bypass Convex's restriction on
|
|
9
|
+
* field names beginning with `$` (flag conditions reference properties like `$device_id`).
|
|
10
|
+
*/
|
|
11
|
+
flagDefinitions: defineTable({
|
|
12
|
+
data: v.string(),
|
|
13
|
+
fetchedAt: v.number(),
|
|
14
|
+
etag: v.optional(v.string()),
|
|
15
|
+
}),
|
|
16
|
+
});
|
|
3
17
|
//# sourceMappingURL=schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AACzD,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAA;AAEjC,eAAe,YAAY,CAAC;IAC1B;;;;;;OAMG;IACH,eAAe,EAAE,WAAW,CAAC;QAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;QACrB,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC7B,CAAC;CACH,CAAC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/component/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,OAAO,UAAU,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/component/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@posthog/convex",
|
|
3
|
-
"description": "
|
|
3
|
+
"description": "Capture analytics events, track exceptions, and evaluate feature flags with PostHog from your Convex backend.",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "git+https://github.com/PostHog/posthog-js.git",
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
"url": "https://github.com/PostHog/posthog-js/issues"
|
|
12
12
|
},
|
|
13
13
|
"author": "PostHog Inc.",
|
|
14
|
-
"version": "0.
|
|
14
|
+
"version": "1.0.0",
|
|
15
15
|
"license": "MIT",
|
|
16
16
|
"keywords": [
|
|
17
17
|
"convex",
|
|
@@ -48,11 +48,10 @@
|
|
|
48
48
|
"types": "./dist/client/index.d.ts",
|
|
49
49
|
"module": "./dist/client/index.js",
|
|
50
50
|
"dependencies": {
|
|
51
|
-
"@posthog/core": "1.29.
|
|
52
|
-
"posthog-node": "5.34.
|
|
51
|
+
"@posthog/core": "1.29.5",
|
|
52
|
+
"posthog-node": "5.34.6"
|
|
53
53
|
},
|
|
54
54
|
"devDependencies": {
|
|
55
|
-
"@convex-dev/eslint-plugin": "^1.1.1",
|
|
56
55
|
"@edge-runtime/vm": "^5.0.0",
|
|
57
56
|
"@jest/globals": "^29.7.0",
|
|
58
57
|
"@types/node": "^24.10.12",
|
|
@@ -68,6 +67,7 @@
|
|
|
68
67
|
"convex": "^1.31.7"
|
|
69
68
|
},
|
|
70
69
|
"scripts": {
|
|
70
|
+
"prebuild": "node -p \"'export const version = \\'' + require('./package.json').version + '\\''\" > src/component/version.ts",
|
|
71
71
|
"build": "tsc --project ./tsconfig.build.json",
|
|
72
72
|
"build:codegen": "npx convex codegen --component-dir ./src/component && pnpm build",
|
|
73
73
|
"clean": "rm -rf dist *.tsbuildinfo && pnpm build:codegen",
|
|
@@ -0,0 +1,12 @@
|
|
|
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
|
+
}
|
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
import { describe, test, expect } from '@jest/globals'
|
|
2
|
+
import { LocalFeatureFlagEvaluator } from './evaluator.js'
|
|
3
|
+
import type { FlagDefinitions, PostHogFeatureFlag } from './types.js'
|
|
4
|
+
|
|
5
|
+
function definitions(flags: PostHogFeatureFlag[], extra: Partial<FlagDefinitions> = {}): FlagDefinitions {
|
|
6
|
+
return {
|
|
7
|
+
flags,
|
|
8
|
+
groupTypeMapping: extra.groupTypeMapping ?? {},
|
|
9
|
+
cohorts: extra.cohorts ?? {},
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function makeFlag(key: string, overrides: Partial<PostHogFeatureFlag> = {}): PostHogFeatureFlag {
|
|
14
|
+
return {
|
|
15
|
+
id: 1,
|
|
16
|
+
name: key,
|
|
17
|
+
key,
|
|
18
|
+
deleted: false,
|
|
19
|
+
active: true,
|
|
20
|
+
rollout_percentage: null,
|
|
21
|
+
ensure_experience_continuity: false,
|
|
22
|
+
experiment_set: [],
|
|
23
|
+
filters: { groups: [{ properties: [], rollout_percentage: 100 }] },
|
|
24
|
+
...overrides,
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
describe('LocalFeatureFlagEvaluator', () => {
|
|
29
|
+
test('returns undefined for unknown flag keys', async () => {
|
|
30
|
+
const evaluator = new LocalFeatureFlagEvaluator(definitions([]))
|
|
31
|
+
expect(await evaluator.getFeatureFlag('missing', 'user')).toBeUndefined()
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
test('returns false for inactive flags', async () => {
|
|
35
|
+
const evaluator = new LocalFeatureFlagEvaluator(definitions([makeFlag('off', { active: false })]))
|
|
36
|
+
expect(await evaluator.getFeatureFlag('off', 'user')).toBe(false)
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
test('returns true for fully-rolled-out boolean flag', async () => {
|
|
40
|
+
const evaluator = new LocalFeatureFlagEvaluator(definitions([makeFlag('on')]))
|
|
41
|
+
expect(await evaluator.getFeatureFlag('on', 'user')).toBe(true)
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
test('matches person properties (exact)', async () => {
|
|
45
|
+
const evaluator = new LocalFeatureFlagEvaluator(
|
|
46
|
+
definitions([
|
|
47
|
+
makeFlag('pp-flag', {
|
|
48
|
+
filters: {
|
|
49
|
+
groups: [
|
|
50
|
+
{
|
|
51
|
+
properties: [{ key: 'plan', value: 'pro', operator: 'exact', type: 'person' }],
|
|
52
|
+
rollout_percentage: 100,
|
|
53
|
+
},
|
|
54
|
+
],
|
|
55
|
+
},
|
|
56
|
+
}),
|
|
57
|
+
])
|
|
58
|
+
)
|
|
59
|
+
expect(await evaluator.getFeatureFlag('pp-flag', 'user', {}, { plan: 'pro' })).toBe(true)
|
|
60
|
+
expect(await evaluator.getFeatureFlag('pp-flag', 'user', {}, { plan: 'free' })).toBe(false)
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
test('returns variant key for multivariate flags', async () => {
|
|
64
|
+
const evaluator = new LocalFeatureFlagEvaluator(
|
|
65
|
+
definitions([
|
|
66
|
+
makeFlag('mv', {
|
|
67
|
+
filters: {
|
|
68
|
+
groups: [{ properties: [], rollout_percentage: 100, variant: 'pink' }],
|
|
69
|
+
multivariate: {
|
|
70
|
+
variants: [
|
|
71
|
+
{ key: 'pink', rollout_percentage: 100 },
|
|
72
|
+
{ key: 'blue', rollout_percentage: 0 },
|
|
73
|
+
],
|
|
74
|
+
},
|
|
75
|
+
},
|
|
76
|
+
}),
|
|
77
|
+
])
|
|
78
|
+
)
|
|
79
|
+
expect(await evaluator.getFeatureFlag('mv', 'user')).toBe('pink')
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
test('returns undefined when flag requires experience continuity', async () => {
|
|
83
|
+
const evaluator = new LocalFeatureFlagEvaluator(
|
|
84
|
+
definitions([makeFlag('continuity', { ensure_experience_continuity: true })])
|
|
85
|
+
)
|
|
86
|
+
expect(await evaluator.getFeatureFlag('continuity', 'user')).toBeUndefined()
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
test('returns false for an inactive flag even when continuity is enabled', async () => {
|
|
90
|
+
// Inactive should short-circuit before the continuity check — otherwise a disabled flag
|
|
91
|
+
// with continuity on would come back as undefined.
|
|
92
|
+
const evaluator = new LocalFeatureFlagEvaluator(
|
|
93
|
+
definitions([makeFlag('off-continuity', { active: false, ensure_experience_continuity: true })])
|
|
94
|
+
)
|
|
95
|
+
expect(await evaluator.getFeatureFlag('off-continuity', 'user')).toBe(false)
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
test('respects rollout percentages deterministically', async () => {
|
|
99
|
+
// 0% rollout — never matches.
|
|
100
|
+
const evaluator = new LocalFeatureFlagEvaluator(
|
|
101
|
+
definitions([makeFlag('rollout-0', { filters: { groups: [{ properties: [], rollout_percentage: 0 }] } })])
|
|
102
|
+
)
|
|
103
|
+
expect(await evaluator.getFeatureFlag('rollout-0', 'user-123')).toBe(false)
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
test('hashing is stable across users — same input yields same output', async () => {
|
|
107
|
+
const evaluator = new LocalFeatureFlagEvaluator(
|
|
108
|
+
definitions([makeFlag('half', { filters: { groups: [{ properties: [], rollout_percentage: 50 }] } })])
|
|
109
|
+
)
|
|
110
|
+
const a = await evaluator.getFeatureFlag('half', 'stable-distinct-id')
|
|
111
|
+
const b = await evaluator.getFeatureFlag('half', 'stable-distinct-id')
|
|
112
|
+
expect(a).toBe(b)
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
test('returns payload for matching flag value', async () => {
|
|
116
|
+
const evaluator = new LocalFeatureFlagEvaluator(
|
|
117
|
+
definitions([
|
|
118
|
+
makeFlag('with-payload', {
|
|
119
|
+
filters: {
|
|
120
|
+
groups: [{ properties: [], rollout_percentage: 100 }],
|
|
121
|
+
payloads: { true: JSON.stringify({ feature: 'x' }) },
|
|
122
|
+
},
|
|
123
|
+
}),
|
|
124
|
+
])
|
|
125
|
+
)
|
|
126
|
+
expect(await evaluator.getFeatureFlagPayload('with-payload', 'user', undefined)).toEqual({ feature: 'x' })
|
|
127
|
+
})
|
|
128
|
+
|
|
129
|
+
test('getFeatureFlagPayload honours matchValue without re-evaluating', async () => {
|
|
130
|
+
const evaluator = new LocalFeatureFlagEvaluator(
|
|
131
|
+
definitions([
|
|
132
|
+
makeFlag('mv', {
|
|
133
|
+
filters: {
|
|
134
|
+
groups: [{ properties: [], rollout_percentage: 0 }],
|
|
135
|
+
multivariate: { variants: [{ key: 'red', rollout_percentage: 100 }] },
|
|
136
|
+
payloads: { red: 'red-payload' },
|
|
137
|
+
},
|
|
138
|
+
}),
|
|
139
|
+
])
|
|
140
|
+
)
|
|
141
|
+
expect(await evaluator.getFeatureFlagPayload('mv', 'user', 'red')).toBe('red-payload')
|
|
142
|
+
})
|
|
143
|
+
|
|
144
|
+
test('getAllFlagsAndPayloads returns all flags', async () => {
|
|
145
|
+
const evaluator = new LocalFeatureFlagEvaluator(
|
|
146
|
+
definitions([
|
|
147
|
+
makeFlag('a'),
|
|
148
|
+
makeFlag('b', { active: false }),
|
|
149
|
+
makeFlag('c', {
|
|
150
|
+
filters: {
|
|
151
|
+
groups: [{ properties: [], rollout_percentage: 100 }],
|
|
152
|
+
payloads: { true: JSON.stringify({ k: 'v' }) },
|
|
153
|
+
},
|
|
154
|
+
}),
|
|
155
|
+
])
|
|
156
|
+
)
|
|
157
|
+
const result = await evaluator.getAllFlagsAndPayloads('user')
|
|
158
|
+
expect(result.featureFlags).toEqual({ a: true, b: false, c: true })
|
|
159
|
+
expect(result.featureFlagPayloads).toEqual({ c: { k: 'v' } })
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
test('getAllFlagsAndPayloads filters by flagKeys', async () => {
|
|
163
|
+
const evaluator = new LocalFeatureFlagEvaluator(definitions([makeFlag('a'), makeFlag('b'), makeFlag('c')]))
|
|
164
|
+
const result = await evaluator.getAllFlagsAndPayloads('user', {}, {}, {}, ['a', 'c'])
|
|
165
|
+
expect(Object.keys(result.featureFlags).sort()).toEqual(['a', 'c'])
|
|
166
|
+
})
|
|
167
|
+
|
|
168
|
+
test('group flag returns false when group not provided', async () => {
|
|
169
|
+
const evaluator = new LocalFeatureFlagEvaluator(
|
|
170
|
+
definitions(
|
|
171
|
+
[
|
|
172
|
+
makeFlag('grp', {
|
|
173
|
+
filters: { aggregation_group_type_index: 0, groups: [{ properties: [], rollout_percentage: 100 }] },
|
|
174
|
+
}),
|
|
175
|
+
],
|
|
176
|
+
{
|
|
177
|
+
groupTypeMapping: { '0': 'organization' },
|
|
178
|
+
}
|
|
179
|
+
)
|
|
180
|
+
)
|
|
181
|
+
expect(await evaluator.getFeatureFlag('grp', 'user', {})).toBe(false)
|
|
182
|
+
})
|
|
183
|
+
|
|
184
|
+
test('inverts a condition property when negation is set', async () => {
|
|
185
|
+
const evaluator = new LocalFeatureFlagEvaluator(
|
|
186
|
+
definitions([
|
|
187
|
+
makeFlag('not-pro', {
|
|
188
|
+
filters: {
|
|
189
|
+
groups: [
|
|
190
|
+
{
|
|
191
|
+
properties: [{ key: 'plan', value: 'pro', operator: 'exact', type: 'person', negation: true }],
|
|
192
|
+
rollout_percentage: 100,
|
|
193
|
+
},
|
|
194
|
+
],
|
|
195
|
+
},
|
|
196
|
+
}),
|
|
197
|
+
])
|
|
198
|
+
)
|
|
199
|
+
expect(await evaluator.getFeatureFlag('not-pro', 'user', {}, { plan: 'pro' })).toBe(false)
|
|
200
|
+
expect(await evaluator.getFeatureFlag('not-pro', 'user', {}, { plan: 'free' })).toBe(true)
|
|
201
|
+
})
|
|
202
|
+
|
|
203
|
+
test('is_not_set condition resolves locally without forcing inconclusive', async () => {
|
|
204
|
+
const evaluator = new LocalFeatureFlagEvaluator(
|
|
205
|
+
definitions([
|
|
206
|
+
makeFlag('only-anon', {
|
|
207
|
+
filters: {
|
|
208
|
+
groups: [
|
|
209
|
+
{
|
|
210
|
+
properties: [{ key: 'email', value: '', operator: 'is_not_set', type: 'person' }],
|
|
211
|
+
rollout_percentage: 100,
|
|
212
|
+
},
|
|
213
|
+
],
|
|
214
|
+
},
|
|
215
|
+
}),
|
|
216
|
+
])
|
|
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.
|
|
221
|
+
expect(await evaluator.getFeatureFlag('only-anon', 'user', {}, { email: 'a@b.com' })).toBe(false)
|
|
222
|
+
})
|
|
223
|
+
|
|
224
|
+
test('group flag matches on group properties', async () => {
|
|
225
|
+
const evaluator = new LocalFeatureFlagEvaluator(
|
|
226
|
+
definitions(
|
|
227
|
+
[
|
|
228
|
+
makeFlag('grp', {
|
|
229
|
+
filters: {
|
|
230
|
+
aggregation_group_type_index: 0,
|
|
231
|
+
groups: [
|
|
232
|
+
{
|
|
233
|
+
properties: [{ key: 'plan', value: 'enterprise', operator: 'exact', type: 'group' }],
|
|
234
|
+
rollout_percentage: 100,
|
|
235
|
+
},
|
|
236
|
+
],
|
|
237
|
+
},
|
|
238
|
+
}),
|
|
239
|
+
],
|
|
240
|
+
{ groupTypeMapping: { '0': 'organization' } }
|
|
241
|
+
)
|
|
242
|
+
)
|
|
243
|
+
const matched = await evaluator.getFeatureFlag(
|
|
244
|
+
'grp',
|
|
245
|
+
'user',
|
|
246
|
+
{ organization: 'acme' },
|
|
247
|
+
{},
|
|
248
|
+
{ organization: { plan: 'enterprise' } }
|
|
249
|
+
)
|
|
250
|
+
expect(matched).toBe(true)
|
|
251
|
+
})
|
|
252
|
+
|
|
253
|
+
test('assigns multivariate variants by hash when the condition has no variant override', async () => {
|
|
254
|
+
// The variant-override path (condition.variant set) is exercised elsewhere — this one walks
|
|
255
|
+
// the hash-into-buckets fallback that `getMatchingVariant` runs when the condition matches
|
|
256
|
+
// but no override is configured. Two 50/50 variants, two distinct ids picked because their
|
|
257
|
+
// hashes land in different buckets — verifies both halves of the lookup table fire and that
|
|
258
|
+
// the result is stable for the same input.
|
|
259
|
+
const evaluator = new LocalFeatureFlagEvaluator(
|
|
260
|
+
definitions([
|
|
261
|
+
makeFlag('split', {
|
|
262
|
+
filters: {
|
|
263
|
+
groups: [{ properties: [], rollout_percentage: 100 }],
|
|
264
|
+
multivariate: {
|
|
265
|
+
variants: [
|
|
266
|
+
{ key: 'left', rollout_percentage: 50 },
|
|
267
|
+
{ key: 'right', rollout_percentage: 50 },
|
|
268
|
+
],
|
|
269
|
+
},
|
|
270
|
+
},
|
|
271
|
+
}),
|
|
272
|
+
])
|
|
273
|
+
)
|
|
274
|
+
const variants = new Set<unknown>()
|
|
275
|
+
for (const id of ['alice', 'bob', 'carol', 'dave', 'eve', 'frank']) {
|
|
276
|
+
const value = await evaluator.getFeatureFlag('split', id)
|
|
277
|
+
expect(['left', 'right']).toContain(value)
|
|
278
|
+
variants.add(value)
|
|
279
|
+
// Same distinct id → same variant.
|
|
280
|
+
expect(await evaluator.getFeatureFlag('split', id)).toBe(value)
|
|
281
|
+
}
|
|
282
|
+
// The cohort of test ids is big enough that the hash must produce both variants — otherwise
|
|
283
|
+
// we're only covering one half of the lookup table.
|
|
284
|
+
expect(variants).toEqual(new Set(['left', 'right']))
|
|
285
|
+
})
|
|
286
|
+
|
|
287
|
+
test('getAllFlagsAndPayloads returns only conclusive flags when some are inconclusive', async () => {
|
|
288
|
+
// A flag that throws InconclusiveMatchError (experience continuity here) should be omitted
|
|
289
|
+
// from the result entirely — not surface as `undefined`. The remaining flags evaluate
|
|
290
|
+
// independently, including their payloads.
|
|
291
|
+
const evaluator = new LocalFeatureFlagEvaluator(
|
|
292
|
+
definitions([
|
|
293
|
+
makeFlag('on'),
|
|
294
|
+
makeFlag('off', { active: false }),
|
|
295
|
+
makeFlag('continuity', { ensure_experience_continuity: true }),
|
|
296
|
+
makeFlag('with-payload', {
|
|
297
|
+
filters: {
|
|
298
|
+
groups: [{ properties: [], rollout_percentage: 100 }],
|
|
299
|
+
payloads: { true: JSON.stringify({ feature: 'x' }) },
|
|
300
|
+
},
|
|
301
|
+
}),
|
|
302
|
+
])
|
|
303
|
+
)
|
|
304
|
+
const result = await evaluator.getAllFlagsAndPayloads('user')
|
|
305
|
+
expect(result.featureFlags).toEqual({ on: true, off: false, 'with-payload': true })
|
|
306
|
+
expect('continuity' in result.featureFlags).toBe(false)
|
|
307
|
+
expect(result.featureFlagPayloads).toEqual({ 'with-payload': { feature: 'x' } })
|
|
308
|
+
})
|
|
309
|
+
|
|
310
|
+
test('buckets on $device_id when bucketing_identifier is device_id', async () => {
|
|
311
|
+
// Two distinct ids share the same device id → they must bucket to the same value. A third
|
|
312
|
+
// device id known to land on the other side of the 50% line proves the hash actually keys
|
|
313
|
+
// off device_id rather than the distinctId.
|
|
314
|
+
const evaluator = new LocalFeatureFlagEvaluator(
|
|
315
|
+
definitions([
|
|
316
|
+
makeFlag('device-bucketed', {
|
|
317
|
+
bucketing_identifier: 'device_id',
|
|
318
|
+
filters: { groups: [{ properties: [], rollout_percentage: 50 }] },
|
|
319
|
+
}),
|
|
320
|
+
])
|
|
321
|
+
)
|
|
322
|
+
const a = await evaluator.getFeatureFlag('device-bucketed', 'distinct-a', {}, { $device_id: 'shared-device' })
|
|
323
|
+
const b = await evaluator.getFeatureFlag('device-bucketed', 'distinct-b', {}, { $device_id: 'shared-device' })
|
|
324
|
+
expect(a).toBe(b)
|
|
325
|
+
const variants = new Set<unknown>()
|
|
326
|
+
for (const deviceId of ['dev-1', 'dev-2', 'dev-3', 'dev-4', 'dev-5', 'dev-6', 'dev-7', 'dev-8']) {
|
|
327
|
+
variants.add(await evaluator.getFeatureFlag('device-bucketed', 'distinct', {}, { $device_id: deviceId }))
|
|
328
|
+
}
|
|
329
|
+
// The 50% rollout combined with distinct device ids must produce both verdicts — otherwise
|
|
330
|
+
// we're not actually keying on the device id.
|
|
331
|
+
expect(variants).toEqual(new Set([true, false]))
|
|
332
|
+
})
|
|
333
|
+
|
|
334
|
+
test('returns undefined when bucketing on device_id without a $device_id property', async () => {
|
|
335
|
+
// No $device_id → can't bucket → must bubble up as inconclusive rather than falling back to
|
|
336
|
+
// distinctId, otherwise we'd silently disagree with the server's verdict.
|
|
337
|
+
const evaluator = new LocalFeatureFlagEvaluator(
|
|
338
|
+
definitions([
|
|
339
|
+
makeFlag('device-bucketed', {
|
|
340
|
+
bucketing_identifier: 'device_id',
|
|
341
|
+
filters: { groups: [{ properties: [], rollout_percentage: 100 }] },
|
|
342
|
+
}),
|
|
343
|
+
])
|
|
344
|
+
)
|
|
345
|
+
expect(await evaluator.getFeatureFlag('device-bucketed', 'user', {}, {})).toBeUndefined()
|
|
346
|
+
expect(await evaluator.getFeatureFlag('device-bucketed', 'user', {}, { $device_id: null })).toBeUndefined()
|
|
347
|
+
expect(await evaluator.getFeatureFlag('device-bucketed', 'user', {}, { $device_id: '' })).toBeUndefined()
|
|
348
|
+
})
|
|
349
|
+
|
|
350
|
+
test('getFeatureFlagPayload returns undefined when eval is inconclusive', async () => {
|
|
351
|
+
// Distinguishes "no payload" (null) from "couldn't evaluate" (undefined) — matches the
|
|
352
|
+
// signal `getFeatureFlag` and `getFeatureFlagResult` already give for the same case.
|
|
353
|
+
const evaluator = new LocalFeatureFlagEvaluator(
|
|
354
|
+
definitions([
|
|
355
|
+
makeFlag('continuity', {
|
|
356
|
+
ensure_experience_continuity: true,
|
|
357
|
+
filters: {
|
|
358
|
+
groups: [{ properties: [], rollout_percentage: 100 }],
|
|
359
|
+
payloads: { true: JSON.stringify({ feature: 'x' }) },
|
|
360
|
+
},
|
|
361
|
+
}),
|
|
362
|
+
])
|
|
363
|
+
)
|
|
364
|
+
expect(await evaluator.getFeatureFlagPayload('continuity', 'user', undefined)).toBeUndefined()
|
|
365
|
+
})
|
|
366
|
+
|
|
367
|
+
test('returns undefined when a cohort references a flag dependency we cannot evaluate', async () => {
|
|
368
|
+
// Cohort property groups can contain flag-type properties, but we don't evaluate flag
|
|
369
|
+
// dependencies inside cohort groups locally. Skipping them silently would let an AND group
|
|
370
|
+
// whose other props all pass return true (incorrectly granting cohort membership). The
|
|
371
|
+
// evaluator should bail out to undefined instead.
|
|
372
|
+
const evaluator = new LocalFeatureFlagEvaluator(
|
|
373
|
+
definitions(
|
|
374
|
+
[
|
|
375
|
+
makeFlag('cohort-flag', {
|
|
376
|
+
filters: {
|
|
377
|
+
groups: [
|
|
378
|
+
{
|
|
379
|
+
properties: [{ key: 'id', value: 'cohort-with-flag-dep', operator: 'in', type: 'cohort' }],
|
|
380
|
+
rollout_percentage: 100,
|
|
381
|
+
},
|
|
382
|
+
],
|
|
383
|
+
},
|
|
384
|
+
}),
|
|
385
|
+
],
|
|
386
|
+
{
|
|
387
|
+
cohorts: {
|
|
388
|
+
'cohort-with-flag-dep': {
|
|
389
|
+
type: 'AND',
|
|
390
|
+
values: [
|
|
391
|
+
{ key: 'plan', value: 'pro', operator: 'exact', type: 'person' },
|
|
392
|
+
{ key: 'other-flag', value: true, type: 'flag' },
|
|
393
|
+
],
|
|
394
|
+
},
|
|
395
|
+
},
|
|
396
|
+
}
|
|
397
|
+
)
|
|
398
|
+
)
|
|
399
|
+
expect(await evaluator.getFeatureFlag('cohort-flag', 'user', {}, { plan: 'pro' })).toBeUndefined()
|
|
400
|
+
})
|
|
401
|
+
})
|