@flagwire/evaluate 0.1.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 (58) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +11 -0
  3. package/dist/index.d.ts +20 -0
  4. package/dist/index.js +1 -0
  5. package/package.json +42 -0
  6. package/vectors/.gitkeep +1 -0
  7. package/vectors/bucketing.json +86 -0
  8. package/vectors/eval/fail-safe-01.json +42 -0
  9. package/vectors/eval/fail-safe-02.json +42 -0
  10. package/vectors/eval/fail-safe-03.json +20 -0
  11. package/vectors/eval/fail-safe-04.json +42 -0
  12. package/vectors/eval/fail-safe-05.json +42 -0
  13. package/vectors/eval/fail-safe-06.json +60 -0
  14. package/vectors/eval/fail-safe-07.json +42 -0
  15. package/vectors/eval/fail-safe-08.json +57 -0
  16. package/vectors/eval/operators-01.json +60 -0
  17. package/vectors/eval/operators-02.json +60 -0
  18. package/vectors/eval/operators-03.json +60 -0
  19. package/vectors/eval/operators-04.json +60 -0
  20. package/vectors/eval/operators-05.json +60 -0
  21. package/vectors/eval/operators-06.json +60 -0
  22. package/vectors/eval/operators-07.json +60 -0
  23. package/vectors/eval/operators-08.json +60 -0
  24. package/vectors/eval/operators-09.json +60 -0
  25. package/vectors/eval/operators-10.json +60 -0
  26. package/vectors/eval/operators-11.json +60 -0
  27. package/vectors/eval/operators-12.json +60 -0
  28. package/vectors/eval/operators-13.json +60 -0
  29. package/vectors/eval/operators-14.json +60 -0
  30. package/vectors/eval/operators-15.json +60 -0
  31. package/vectors/eval/operators-16.json +60 -0
  32. package/vectors/eval/operators-17.json +60 -0
  33. package/vectors/eval/operators-18.json +60 -0
  34. package/vectors/eval/operators-19.json +58 -0
  35. package/vectors/eval/operators-20.json +60 -0
  36. package/vectors/eval/operators-21.json +67 -0
  37. package/vectors/eval/operators-22.json +74 -0
  38. package/vectors/eval/operators-23.json +60 -0
  39. package/vectors/eval/operators-24.json +60 -0
  40. package/vectors/eval/rollouts-01.json +53 -0
  41. package/vectors/eval/rollouts-02.json +53 -0
  42. package/vectors/eval/rollouts-03.json +53 -0
  43. package/vectors/eval/rollouts-04.json +53 -0
  44. package/vectors/eval/rollouts-05.json +53 -0
  45. package/vectors/eval/rollouts-06.json +71 -0
  46. package/vectors/eval/rollouts-07.json +71 -0
  47. package/vectors/eval/rollouts-08.json +49 -0
  48. package/vectors/eval/segments-01.json +73 -0
  49. package/vectors/eval/segments-02.json +91 -0
  50. package/vectors/eval/segments-03.json +91 -0
  51. package/vectors/eval/segments-04.json +86 -0
  52. package/vectors/eval/segments-05.json +58 -0
  53. package/vectors/eval/segments-06.json +83 -0
  54. package/vectors/eval/segments-07.json +73 -0
  55. package/vectors/eval/segments-08.json +85 -0
  56. package/vectors/eval/segments-09.json +83 -0
  57. package/vectors/eval/segments-10.json +73 -0
  58. package/vectors/murmur3.json +48 -0
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "semverEq ignores build metadata",
3
+ "bundle": {
4
+ "fmt": 1,
5
+ "envId": "env_test",
6
+ "version": 7,
7
+ "publishedAt": 1700000000000,
8
+ "revoked": false,
9
+ "segments": {},
10
+ "flags": {
11
+ "test-flag": {
12
+ "type": "boolean",
13
+ "version": 3,
14
+ "salt": "0123456789abcdef",
15
+ "on": true,
16
+ "variants": [
17
+ {
18
+ "key": "off",
19
+ "value": false
20
+ },
21
+ {
22
+ "key": "on",
23
+ "value": true
24
+ }
25
+ ],
26
+ "offVariant": 0,
27
+ "fallthrough": {
28
+ "variant": 0
29
+ },
30
+ "rules": [
31
+ {
32
+ "id": "rule-1",
33
+ "clauses": [
34
+ {
35
+ "attr": "version",
36
+ "op": "semverEq",
37
+ "values": ["1.2.3+two"],
38
+ "negate": false
39
+ }
40
+ ],
41
+ "serve": {
42
+ "variant": 1
43
+ }
44
+ }
45
+ ]
46
+ }
47
+ }
48
+ },
49
+ "context": {
50
+ "key": "u",
51
+ "attributes": {
52
+ "version": "1.2.3+one"
53
+ }
54
+ },
55
+ "expected": {
56
+ "variantKey": "on",
57
+ "value": true,
58
+ "reason": "RULE_MATCH:rule-1"
59
+ }
60
+ }
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "semverGt orders a release after prerelease",
3
+ "bundle": {
4
+ "fmt": 1,
5
+ "envId": "env_test",
6
+ "version": 7,
7
+ "publishedAt": 1700000000000,
8
+ "revoked": false,
9
+ "segments": {},
10
+ "flags": {
11
+ "test-flag": {
12
+ "type": "boolean",
13
+ "version": 3,
14
+ "salt": "0123456789abcdef",
15
+ "on": true,
16
+ "variants": [
17
+ {
18
+ "key": "off",
19
+ "value": false
20
+ },
21
+ {
22
+ "key": "on",
23
+ "value": true
24
+ }
25
+ ],
26
+ "offVariant": 0,
27
+ "fallthrough": {
28
+ "variant": 0
29
+ },
30
+ "rules": [
31
+ {
32
+ "id": "rule-1",
33
+ "clauses": [
34
+ {
35
+ "attr": "version",
36
+ "op": "semverGt",
37
+ "values": ["2.0.0-rc.1"],
38
+ "negate": false
39
+ }
40
+ ],
41
+ "serve": {
42
+ "variant": 1
43
+ }
44
+ }
45
+ ]
46
+ }
47
+ }
48
+ },
49
+ "context": {
50
+ "key": "u",
51
+ "attributes": {
52
+ "version": "2.0.0"
53
+ }
54
+ },
55
+ "expected": {
56
+ "variantKey": "on",
57
+ "value": true,
58
+ "reason": "RULE_MATCH:rule-1"
59
+ }
60
+ }
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "semverLt orders numeric prerelease identifiers",
3
+ "bundle": {
4
+ "fmt": 1,
5
+ "envId": "env_test",
6
+ "version": 7,
7
+ "publishedAt": 1700000000000,
8
+ "revoked": false,
9
+ "segments": {},
10
+ "flags": {
11
+ "test-flag": {
12
+ "type": "boolean",
13
+ "version": 3,
14
+ "salt": "0123456789abcdef",
15
+ "on": true,
16
+ "variants": [
17
+ {
18
+ "key": "off",
19
+ "value": false
20
+ },
21
+ {
22
+ "key": "on",
23
+ "value": true
24
+ }
25
+ ],
26
+ "offVariant": 0,
27
+ "fallthrough": {
28
+ "variant": 0
29
+ },
30
+ "rules": [
31
+ {
32
+ "id": "rule-1",
33
+ "clauses": [
34
+ {
35
+ "attr": "version",
36
+ "op": "semverLt",
37
+ "values": ["1.0.0-beta.11"],
38
+ "negate": false
39
+ }
40
+ ],
41
+ "serve": {
42
+ "variant": 1
43
+ }
44
+ }
45
+ ]
46
+ }
47
+ }
48
+ },
49
+ "context": {
50
+ "key": "u",
51
+ "attributes": {
52
+ "version": "1.0.0-beta.2"
53
+ }
54
+ },
55
+ "expected": {
56
+ "variantKey": "on",
57
+ "value": true,
58
+ "reason": "RULE_MATCH:rule-1"
59
+ }
60
+ }
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "regex matches with native RegExp",
3
+ "bundle": {
4
+ "fmt": 1,
5
+ "envId": "env_test",
6
+ "version": 7,
7
+ "publishedAt": 1700000000000,
8
+ "revoked": false,
9
+ "segments": {},
10
+ "flags": {
11
+ "test-flag": {
12
+ "type": "boolean",
13
+ "version": 3,
14
+ "salt": "0123456789abcdef",
15
+ "on": true,
16
+ "variants": [
17
+ {
18
+ "key": "off",
19
+ "value": false
20
+ },
21
+ {
22
+ "key": "on",
23
+ "value": true
24
+ }
25
+ ],
26
+ "offVariant": 0,
27
+ "fallthrough": {
28
+ "variant": 0
29
+ },
30
+ "rules": [
31
+ {
32
+ "id": "rule-1",
33
+ "clauses": [
34
+ {
35
+ "attr": "email",
36
+ "op": "regex",
37
+ "values": ["^[a-z]+@[a-z]+\\.dev$"],
38
+ "negate": false
39
+ }
40
+ ],
41
+ "serve": {
42
+ "variant": 1
43
+ }
44
+ }
45
+ ]
46
+ }
47
+ }
48
+ },
49
+ "context": {
50
+ "key": "u",
51
+ "attributes": {
52
+ "email": "a@flagwire.dev"
53
+ }
54
+ },
55
+ "expected": {
56
+ "variantKey": "on",
57
+ "value": true,
58
+ "reason": "RULE_MATCH:rule-1"
59
+ }
60
+ }
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "invalid regex is a false clause",
3
+ "bundle": {
4
+ "fmt": 1,
5
+ "envId": "env_test",
6
+ "version": 7,
7
+ "publishedAt": 1700000000000,
8
+ "revoked": false,
9
+ "segments": {},
10
+ "flags": {
11
+ "test-flag": {
12
+ "type": "boolean",
13
+ "version": 3,
14
+ "salt": "0123456789abcdef",
15
+ "on": true,
16
+ "variants": [
17
+ {
18
+ "key": "off",
19
+ "value": false
20
+ },
21
+ {
22
+ "key": "on",
23
+ "value": true
24
+ }
25
+ ],
26
+ "offVariant": 0,
27
+ "fallthrough": {
28
+ "variant": 0
29
+ },
30
+ "rules": [
31
+ {
32
+ "id": "rule-1",
33
+ "clauses": [
34
+ {
35
+ "attr": "email",
36
+ "op": "regex",
37
+ "values": ["["],
38
+ "negate": false
39
+ }
40
+ ],
41
+ "serve": {
42
+ "variant": 1
43
+ }
44
+ }
45
+ ]
46
+ }
47
+ }
48
+ },
49
+ "context": {
50
+ "key": "u",
51
+ "attributes": {
52
+ "email": "anything"
53
+ }
54
+ },
55
+ "expected": {
56
+ "variantKey": "off",
57
+ "value": false,
58
+ "reason": "FALLTHROUGH"
59
+ }
60
+ }
@@ -0,0 +1,58 @@
1
+ {
2
+ "name": "missing attribute remains false when negated",
3
+ "bundle": {
4
+ "fmt": 1,
5
+ "envId": "env_test",
6
+ "version": 7,
7
+ "publishedAt": 1700000000000,
8
+ "revoked": false,
9
+ "segments": {},
10
+ "flags": {
11
+ "test-flag": {
12
+ "type": "boolean",
13
+ "version": 3,
14
+ "salt": "0123456789abcdef",
15
+ "on": true,
16
+ "variants": [
17
+ {
18
+ "key": "off",
19
+ "value": false
20
+ },
21
+ {
22
+ "key": "on",
23
+ "value": true
24
+ }
25
+ ],
26
+ "offVariant": 0,
27
+ "fallthrough": {
28
+ "variant": 0
29
+ },
30
+ "rules": [
31
+ {
32
+ "id": "rule-1",
33
+ "clauses": [
34
+ {
35
+ "attr": "plan",
36
+ "op": "eq",
37
+ "values": ["pro"],
38
+ "negate": true
39
+ }
40
+ ],
41
+ "serve": {
42
+ "variant": 1
43
+ }
44
+ }
45
+ ]
46
+ }
47
+ }
48
+ },
49
+ "context": {
50
+ "key": "u",
51
+ "attributes": {}
52
+ },
53
+ "expected": {
54
+ "variantKey": "off",
55
+ "value": false,
56
+ "reason": "FALLTHROUGH"
57
+ }
58
+ }
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "type mismatch remains false when negated",
3
+ "bundle": {
4
+ "fmt": 1,
5
+ "envId": "env_test",
6
+ "version": 7,
7
+ "publishedAt": 1700000000000,
8
+ "revoked": false,
9
+ "segments": {},
10
+ "flags": {
11
+ "test-flag": {
12
+ "type": "boolean",
13
+ "version": 3,
14
+ "salt": "0123456789abcdef",
15
+ "on": true,
16
+ "variants": [
17
+ {
18
+ "key": "off",
19
+ "value": false
20
+ },
21
+ {
22
+ "key": "on",
23
+ "value": true
24
+ }
25
+ ],
26
+ "offVariant": 0,
27
+ "fallthrough": {
28
+ "variant": 0
29
+ },
30
+ "rules": [
31
+ {
32
+ "id": "rule-1",
33
+ "clauses": [
34
+ {
35
+ "attr": "value",
36
+ "op": "eq",
37
+ "values": [1],
38
+ "negate": true
39
+ }
40
+ ],
41
+ "serve": {
42
+ "variant": 1
43
+ }
44
+ }
45
+ ]
46
+ }
47
+ }
48
+ },
49
+ "context": {
50
+ "key": "u",
51
+ "attributes": {
52
+ "value": "1"
53
+ }
54
+ },
55
+ "expected": {
56
+ "variantKey": "off",
57
+ "value": false,
58
+ "reason": "FALLTHROUGH"
59
+ }
60
+ }
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "rule clauses use AND",
3
+ "bundle": {
4
+ "fmt": 1,
5
+ "envId": "env_test",
6
+ "version": 7,
7
+ "publishedAt": 1700000000000,
8
+ "revoked": false,
9
+ "segments": {},
10
+ "flags": {
11
+ "test-flag": {
12
+ "type": "boolean",
13
+ "version": 3,
14
+ "salt": "0123456789abcdef",
15
+ "on": true,
16
+ "variants": [
17
+ {
18
+ "key": "off",
19
+ "value": false
20
+ },
21
+ {
22
+ "key": "on",
23
+ "value": true
24
+ }
25
+ ],
26
+ "offVariant": 0,
27
+ "fallthrough": {
28
+ "variant": 0
29
+ },
30
+ "rules": [
31
+ {
32
+ "id": "and-rule",
33
+ "clauses": [
34
+ {
35
+ "attr": "plan",
36
+ "op": "eq",
37
+ "values": ["pro"],
38
+ "negate": false
39
+ },
40
+ {
41
+ "attr": "country",
42
+ "op": "eq",
43
+ "values": ["IN"],
44
+ "negate": false
45
+ }
46
+ ],
47
+ "serve": {
48
+ "variant": 1
49
+ }
50
+ }
51
+ ]
52
+ }
53
+ }
54
+ },
55
+ "context": {
56
+ "key": "u",
57
+ "attributes": {
58
+ "plan": "pro",
59
+ "country": "US"
60
+ }
61
+ },
62
+ "expected": {
63
+ "variantKey": "off",
64
+ "value": false,
65
+ "reason": "FALLTHROUGH"
66
+ }
67
+ }
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "first matching rule wins",
3
+ "bundle": {
4
+ "fmt": 1,
5
+ "envId": "env_test",
6
+ "version": 7,
7
+ "publishedAt": 1700000000000,
8
+ "revoked": false,
9
+ "segments": {},
10
+ "flags": {
11
+ "test-flag": {
12
+ "type": "boolean",
13
+ "version": 3,
14
+ "salt": "0123456789abcdef",
15
+ "on": true,
16
+ "variants": [
17
+ {
18
+ "key": "off",
19
+ "value": false
20
+ },
21
+ {
22
+ "key": "on",
23
+ "value": true
24
+ }
25
+ ],
26
+ "offVariant": 0,
27
+ "fallthrough": {
28
+ "variant": 0
29
+ },
30
+ "rules": [
31
+ {
32
+ "id": "first",
33
+ "clauses": [
34
+ {
35
+ "attr": "plan",
36
+ "op": "eq",
37
+ "values": ["pro"],
38
+ "negate": false
39
+ }
40
+ ],
41
+ "serve": {
42
+ "variant": 1
43
+ }
44
+ },
45
+ {
46
+ "id": "second",
47
+ "clauses": [
48
+ {
49
+ "attr": "plan",
50
+ "op": "eq",
51
+ "values": ["pro"],
52
+ "negate": false
53
+ }
54
+ ],
55
+ "serve": {
56
+ "variant": 1
57
+ }
58
+ }
59
+ ]
60
+ }
61
+ }
62
+ },
63
+ "context": {
64
+ "key": "u",
65
+ "attributes": {
66
+ "plan": "pro"
67
+ }
68
+ },
69
+ "expected": {
70
+ "variantKey": "on",
71
+ "value": true,
72
+ "reason": "RULE_MATCH:first"
73
+ }
74
+ }
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "a valid OR value can match after a type mismatch",
3
+ "bundle": {
4
+ "fmt": 1,
5
+ "envId": "env_test",
6
+ "version": 7,
7
+ "publishedAt": 1700000000000,
8
+ "revoked": false,
9
+ "segments": {},
10
+ "flags": {
11
+ "test-flag": {
12
+ "type": "boolean",
13
+ "version": 3,
14
+ "salt": "0123456789abcdef",
15
+ "on": true,
16
+ "variants": [
17
+ {
18
+ "key": "off",
19
+ "value": false
20
+ },
21
+ {
22
+ "key": "on",
23
+ "value": true
24
+ }
25
+ ],
26
+ "offVariant": 0,
27
+ "fallthrough": {
28
+ "variant": 0
29
+ },
30
+ "rules": [
31
+ {
32
+ "id": "rule-1",
33
+ "clauses": [
34
+ {
35
+ "attr": "value",
36
+ "op": "eq",
37
+ "values": [1, "pro"],
38
+ "negate": false
39
+ }
40
+ ],
41
+ "serve": {
42
+ "variant": 1
43
+ }
44
+ }
45
+ ]
46
+ }
47
+ }
48
+ },
49
+ "context": {
50
+ "key": "u",
51
+ "attributes": {
52
+ "value": "pro"
53
+ }
54
+ },
55
+ "expected": {
56
+ "variantKey": "on",
57
+ "value": true,
58
+ "reason": "RULE_MATCH:rule-1"
59
+ }
60
+ }
@@ -0,0 +1,60 @@
1
+ {
2
+ "name": "semver compares arbitrarily large numeric prerelease identifiers",
3
+ "bundle": {
4
+ "fmt": 1,
5
+ "envId": "env_test",
6
+ "version": 7,
7
+ "publishedAt": 1700000000000,
8
+ "revoked": false,
9
+ "segments": {},
10
+ "flags": {
11
+ "test-flag": {
12
+ "type": "boolean",
13
+ "version": 3,
14
+ "salt": "0123456789abcdef",
15
+ "on": true,
16
+ "variants": [
17
+ {
18
+ "key": "off",
19
+ "value": false
20
+ },
21
+ {
22
+ "key": "on",
23
+ "value": true
24
+ }
25
+ ],
26
+ "offVariant": 0,
27
+ "fallthrough": {
28
+ "variant": 0
29
+ },
30
+ "rules": [
31
+ {
32
+ "id": "rule-1",
33
+ "clauses": [
34
+ {
35
+ "attr": "version",
36
+ "op": "semverLt",
37
+ "values": ["1.0.0-beta.100000000000000000000"],
38
+ "negate": false
39
+ }
40
+ ],
41
+ "serve": {
42
+ "variant": 1
43
+ }
44
+ }
45
+ ]
46
+ }
47
+ }
48
+ },
49
+ "context": {
50
+ "key": "u",
51
+ "attributes": {
52
+ "version": "1.0.0-beta.99999999999999999999"
53
+ }
54
+ },
55
+ "expected": {
56
+ "variantKey": "on",
57
+ "value": true,
58
+ "reason": "RULE_MATCH:rule-1"
59
+ }
60
+ }