1
1
const map = require ( './es-utils/map' )
2
- const keys = require ( './es-utils/keys ' )
2
+ const filter = require ( './es-utils/filter ' )
3
3
const isArray = require ( './es-utils/is-array' )
4
4
const jsonStringify = require ( '@bugsnag/safe-json-stringify' )
5
5
6
- function add ( existingFeatures , name , variant ) {
6
+ function add ( existingFeatures , existingFeatureKeys , name , variant ) {
7
7
if ( typeof name !== 'string' ) {
8
8
return
9
9
}
@@ -14,10 +14,17 @@ function add (existingFeatures, name, variant) {
14
14
variant = jsonStringify ( variant )
15
15
}
16
16
17
- existingFeatures [ name ] = variant
17
+ const existingIndex = existingFeatureKeys [ name ]
18
+ if ( typeof existingIndex === 'number' ) {
19
+ existingFeatures [ existingIndex ] = { name, variant }
20
+ return
21
+ }
22
+
23
+ existingFeatures . push ( { name, variant } )
24
+ existingFeatureKeys [ name ] = existingFeatures . length - 1
18
25
}
19
26
20
- function merge ( existingFeatures , newFeatures ) {
27
+ function merge ( existingFeatures , newFeatures , existingFeatureKeys ) {
21
28
if ( ! isArray ( newFeatures ) ) {
22
29
return
23
30
}
@@ -30,27 +37,37 @@ function merge (existingFeatures, newFeatures) {
30
37
}
31
38
32
39
// 'add' will handle if 'name' doesn't exist & 'variant' is optional
33
- add ( existingFeatures , feature . name , feature . variant )
40
+ add ( existingFeatures , existingFeatureKeys , feature . name , feature . variant )
34
41
}
42
+
43
+ return existingFeatures
35
44
}
36
45
37
46
// convert feature flags from a map of 'name -> variant' into the format required
38
47
// by the Bugsnag Event API:
39
48
// [{ featureFlag: 'name', variant: 'variant' }, { featureFlag: 'name 2' }]
40
49
function toEventApi ( featureFlags ) {
41
50
return map (
42
- keys ( featureFlags ) ,
43
- name => {
51
+ filter ( featureFlags , Boolean ) ,
52
+ ( { name, variant } ) => {
44
53
const flag = { featureFlag : name }
45
54
46
55
// don't add a 'variant' property unless there's actually a value
47
- if ( typeof featureFlags [ name ] === 'string' ) {
48
- flag . variant = featureFlags [ name ]
56
+ if ( typeof variant === 'string' ) {
57
+ flag . variant = variant
49
58
}
50
59
51
60
return flag
52
61
}
53
62
)
54
63
}
55
64
56
- module . exports = { add, merge, toEventApi }
65
+ function clear ( features , featuresIndex , name ) {
66
+ const existingIndex = featuresIndex [ name ]
67
+ if ( typeof existingIndex === 'number' ) {
68
+ features [ existingIndex ] = null
69
+ delete featuresIndex [ name ]
70
+ }
71
+ }
72
+
73
+ module . exports = { add, clear, merge, toEventApi }
0 commit comments