@featurevisor/sdk 0.20.1 → 0.21.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 CHANGED
@@ -3,6 +3,22 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [0.21.0](https://github.com/fahad19/featurevisor/compare/v0.20.2...v0.21.0) (2023-05-14)
7
+
8
+ **Note:** Version bump only for package @featurevisor/sdk
9
+
10
+
11
+
12
+
13
+
14
+ ## [0.20.2](https://github.com/fahad19/featurevisor/compare/v0.20.1...v0.20.2) (2023-05-14)
15
+
16
+ **Note:** Version bump only for package @featurevisor/sdk
17
+
18
+
19
+
20
+
21
+
6
22
  ## [0.20.1](https://github.com/fahad19/featurevisor/compare/v0.20.0...v0.20.1) (2023-05-13)
7
23
 
8
24
 
package/README.md CHANGED
@@ -1,9 +1,39 @@
1
- # @featurevisor/sdk
1
+ # @featurevisor/sdk <!-- omit in toc -->
2
2
 
3
3
  Universal JavaScript SDK for both Node.js and the browser.
4
4
 
5
5
  Visit [https://featurevisor.com/docs/sdks/](https://featurevisor.com/docs/sdks/) for more information.
6
6
 
7
+ - [Installation](#installation)
8
+ - [Usage](#usage)
9
+ - [Options](#options)
10
+ - [`bucketKeySeparator`](#bucketkeyseparator)
11
+ - [`configureBucketValue`](#configurebucketvalue)
12
+ - [`datafile`](#datafile)
13
+ - [`datafileUrl`](#datafileurl)
14
+ - [`handleDatafileFetch`](#handledatafilefetch)
15
+ - [`initialFeatures`](#initialfeatures)
16
+ - [`interceptAttributes`](#interceptattributes)
17
+ - [`logger`](#logger)
18
+ - [`onActivation`](#onactivation)
19
+ - [`onReady`](#onready)
20
+ - [`onRefresh`](#onrefresh)
21
+ - [`onUpdate`](#onupdate)
22
+ - [`refreshInterval`](#refreshinterval)
23
+ - [`stickyFeatures`](#stickyfeatures)
24
+ - [API](#api)
25
+ - [`getVariation`](#getvariation)
26
+ - [`getVariable`](#getvariable)
27
+ - [`activate`](#activate)
28
+ - [`isReady`](#isready)
29
+ - [`refresh`](#refresh)
30
+ - [`setLogLevels`](#setloglevels)
31
+ - [`on`](#on)
32
+ - [`addListener`](#addlistener)
33
+ - [`off`](#off)
34
+ - [`removeListener`](#removelistener)
35
+ - [`removeAllListeners`](#removealllisteners)
36
+
7
37
  ## Installation
8
38
 
9
39
  ```
@@ -22,21 +52,232 @@ const sdk = createInstance(options);
22
52
 
23
53
  ## Options
24
54
 
25
- | Key | Type | Description |
26
- |-----------------------|------------|--------------------------------------------------------|
27
- | `datafile` | `object` | Parsed datafile object |
28
- | `datafileUrl` | `string` | URL to fetch the datafile from |
29
- | `onReady` | `function` | Callback to be called when the SDK is ready to be used |
30
- | `onActivation` | `function` | Callback to be called when a feature is activated |
31
- | `onRefresh` | `function` | Callback to be called when the datafile is refreshed |
32
- | `onUpdate` | `function` | Callback to be called when the datafile is updated |
33
- | `refreshInterval` | `number` | Interval in seconds to refresh the datafile |
34
- | `handleDatafileFetch` | `function` | Callback to be called when the datafile is fetched |
35
- | `interceptAttributes` | `function` | Callback to be called before attributes are used |
36
- | `logger` | `Logger` | Logger object to be used by the SDK |
55
+ Options you can pass when creating Featurevisor SDK instance:
56
+
57
+ ### `bucketKeySeparator`
58
+
59
+ - Type: `string`
60
+ - Required: no
61
+ - Defaults to: `.`
62
+
63
+ ### `configureBucketValue`
64
+
65
+ - Type: `function`
66
+ - Required: no
67
+
68
+ Use it to take over bucketing process.
69
+
70
+ ```js
71
+ const sdk = createInstance({
72
+ configureBucketValue: (feature, attributes, bucketValue) => {
73
+ return bucketValue; // 0 to 100,000
74
+ }
75
+ });
76
+ ```
77
+
78
+ ### `datafile`
79
+
80
+ - Type: `object`
81
+ - Required: either `datafile` or `datafileUrl` is required
82
+
83
+ Use it to pass the datafile object directly.
84
+
85
+ ### `datafileUrl`
86
+
87
+ - Type: `string`
88
+ - Required: either `datafile` or `datafileUrl` is required
89
+
90
+ Use it to pass the URL to fetch the datafile from.
91
+
92
+ ### `handleDatafileFetch`
93
+
94
+ - Type: `function`
95
+ - Required: no
96
+
97
+ Pass this function if you need to take over the datafile fetching and parsing process:
98
+
99
+ ```js
100
+ const sdk = createInstance({
101
+ handleDatafileFetch: async (datafileUrl) => {
102
+ const response = await fetch(datafileUrl);
103
+ const datafile = await response.json();
104
+
105
+ return datafile;
106
+ }
107
+ });
108
+ ```
109
+
110
+ ### `initialFeatures`
111
+
112
+ - Type: `object`
113
+ - Required: no
114
+
115
+ Pass set of initial features with their variation and (optional) variables that you want the SDK to return until the datafile is fetched and parsed:
116
+
117
+ ```js
118
+ const sdk = createInstance({
119
+ initialFeatures: {
120
+ myFeatureKey: {
121
+ variation: true,
122
+ variables: {
123
+ myVariableKey: "my-variable-value"
124
+ }
125
+ }
126
+ }
127
+ });
128
+ ```
129
+
130
+ ### `interceptAttributes`
131
+
132
+ - Type: `function`
133
+ - Required: no
134
+
135
+ Intercept given attributes before they are used to bucket the user:
136
+
137
+ ```js
138
+ const defaultAttributes = {
139
+ platform: "web",
140
+ locale: "en-US",
141
+ country: "US",
142
+ timezone: "America/New_York",
143
+ userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko)",
144
+ };
145
+
146
+ const sdk = createInstance({
147
+ interceptAttributes: (attributes) => {
148
+ return {
149
+ ...defaultAttributes,
150
+ ...attributes,
151
+ };
152
+ }
153
+ });
154
+ ```
155
+
156
+ ### `logger`
157
+
158
+ - Type: `object`
159
+ - Required: no
160
+
161
+ Pass a custom logger with custom levels, otherwise it the SDK will print logs to the console for `error` and `warn` levels.
162
+
163
+ ```js
164
+ import { createInstance, createLogger } from "@featurevisor/sdk";
165
+
166
+ const sdk = createInstance({
167
+ logger: createLogger({
168
+ levels: ["debug", "info", "warn", "error"],
169
+ handler: (level, message, details) => {
170
+ // do something with the log
171
+ },
172
+ }),
173
+ });
174
+ ```
175
+
176
+ ### `onActivation`
177
+
178
+ - Type: `function`
179
+ - Required: no
180
+
181
+ Capture activated features along with their evaluated variation:
182
+
183
+ ```js
184
+ const sdk = createInstance({
185
+ onActivation: (featureKey, variation, attributes, captureAttributes) => {
186
+ // do something with the activated feature
187
+ }
188
+ });
189
+ ```
190
+
191
+ `captureAttributes` will only contain attributes that are marked as `capture: true` in the Attributes' YAML files.
192
+
193
+ ### `onReady`
194
+
195
+ - Type: `function`
196
+ - Required: no
197
+
198
+ Triggered maximum once when the SDK is ready to be used.
199
+
200
+ ```js
201
+ const sdk = createInstance({
202
+ onReady: () => {
203
+ // do something when the SDK is ready
204
+ }
205
+ });
206
+ ```
207
+
208
+ ### `onRefresh`
209
+
210
+ - Type: `function`
211
+ - Required: no
212
+
213
+ Triggered every time the datafile is refreshed.
214
+
215
+ Works only when `datafileUrl` and `refreshInterval` are set.
216
+
217
+ ```js
218
+ const sdk = createInstance({
219
+ onRefresh: () => {
220
+ // do something when the datafile is refreshed
221
+ }
222
+ });
223
+ ```
224
+
225
+ ### `onUpdate`
226
+
227
+ - Type: `function`
228
+ - Required: no
229
+
230
+ Triggered every time the datafile is refreshed, and the newly fetched datafile is detected to have different content than last fetched one.
231
+
232
+ Works only when `datafileUrl` and `refreshInterval` are set.
233
+
234
+ ```js
235
+ const sdk = createInstance({
236
+ onUpdate: () => {
237
+ // do something when the datafile is updated
238
+ }
239
+ });
240
+ ```
241
+
242
+ ### `refreshInterval`
243
+
244
+ - Type: `number` (in seconds)
245
+ - Required: no
246
+
247
+ Set the interval to refresh the datafile.
248
+
249
+ ```js
250
+ const sdk = createInstance({
251
+ refreshInterval: 60 * 5, // every 5 minutes
252
+ });
253
+ ```
254
+
255
+ ### `stickyFeatures`
256
+
257
+ - Type: `object`
258
+ - Required: no
259
+
260
+ If set, the SDK will skip evaluating the datafile and return variation and variable results from this object instead.
261
+
262
+ If a feature key is not present in this object, the SDK will continue to evaluate the datafile.
263
+
264
+ ```js
265
+ const sdk = createInstance({
266
+ stickyFeatures: {
267
+ myFeatureKey: {
268
+ variation: true,
269
+ variables: {
270
+ myVariableKey: "my-variable-value"
271
+ }
272
+ }
273
+ }
274
+ });
275
+ ```
37
276
 
38
277
  ## API
39
278
 
279
+ These methods are available once the SDK instance is created:
280
+
40
281
  ### `getVariation`
41
282
 
42
283
  > `getVariation(featureKey: string, attributes: Attributes): VariationValue`
@@ -122,6 +363,6 @@ Alias for `off` method.
122
363
 
123
364
  > `removeAllListeners(event?: string): void`
124
365
 
125
- ## License
366
+ ## License <!-- omit in toc -->
126
367
 
127
368
  MIT © [Fahad Heylaal](https://fahad19.com)
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.FeaturevisorSDK=t():e.FeaturevisorSDK=t()}(this,(()=>(()=>{var e={480:(e,t,r)=>{"use strict";r.r(t),r.d(t,{compare:()=>a,compareVersions:()=>i,satisfies:()=>o,validate:()=>n});const i=(e,t)=>{const r=u(e),i=u(t),n=r.pop(),a=i.pop(),o=d(r,i);return 0!==o?o:n&&a?d(n.split("."),a.split(".")):n||a?n?-1:1:0},n=e=>"string"==typeof e&&/^[v\d]/.test(e)&&s.test(e),a=(e,t,r)=>{h(r);const n=i(e,t);return g[r].includes(n)},o=(e,t)=>{if(t.includes("||"))return t.split("||").some((t=>o(e,t)));if(t.includes(" "))return t.trim().replace(/\s{2,}/g," ").split(" ").every((t=>o(e,t)));const r=t.match(/^([<>=~^]+)/),i=r?r[1]:"=";if("^"!==i&&"~"!==i)return a(e,t,i);const[n,s,f,,l]=u(e),[c,g,v,,h]=u(t),y=[n,s,f],p=[c,null!=g?g:"x",null!=v?v:"x"];if(h){if(!l)return!1;if(0!==d(y,p))return!1;if(-1===d(l.split("."),h.split(".")))return!1}const b=p.findIndex((e=>"0"!==e))+1,m="~"===i?2:b>1?b:1;return 0===d(y.slice(0,m),p.slice(0,m))&&-1!==d(y.slice(m),p.slice(m))},s=/^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\-]+(?:\.[\da-z\-]+)*))?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?)?)?$/i,u=e=>{if("string"!=typeof e)throw new TypeError("Invalid argument expected string");const t=e.match(s);if(!t)throw new Error(`Invalid argument not valid semver ('${e}' received)`);return t.shift(),t},f=e=>"*"===e||"x"===e||"X"===e,l=e=>{const t=parseInt(e,10);return isNaN(t)?e:t},c=(e,t)=>{if(f(e)||f(t))return 0;const[r,i]=((e,t)=>typeof e!=typeof t?[String(e),String(t)]:[e,t])(l(e),l(t));return r>i?1:r<i?-1:0},d=(e,t)=>{for(let r=0;r<Math.max(e.length,t.length);r++){const i=c(e[r]||"0",t[r]||"0");if(0!==i)return i}return 0},g={">":[1],">=":[0,1],"=":[0],"<=":[-1,0],"<":[-1]},v=Object.keys(g),h=e=>{if("string"!=typeof e)throw new TypeError("Invalid operator type, expected string but got "+typeof e);if(-1===v.indexOf(e))throw new Error(`Invalid operator, expected one of ${v.join("|")}`)}},77:e=>{!function(){const t=e=>(new TextEncoder).encode(e);function r(e,r){let i,n,a,o,s,u,f,l;for("string"==typeof e&&(e=t(e)),i=3&e.length,n=e.length-i,a=r,s=3432918353,u=461845907,l=0;l<n;)f=255&e[l]|(255&e[++l])<<8|(255&e[++l])<<16|(255&e[++l])<<24,++l,f=(65535&f)*s+(((f>>>16)*s&65535)<<16)&4294967295,f=f<<15|f>>>17,f=(65535&f)*u+(((f>>>16)*u&65535)<<16)&4294967295,a^=f,a=a<<13|a>>>19,o=5*(65535&a)+((5*(a>>>16)&65535)<<16)&4294967295,a=27492+(65535&o)+((58964+(o>>>16)&65535)<<16);switch(f=0,i){case 3:f^=(255&e[l+2])<<16;case 2:f^=(255&e[l+1])<<8;case 1:f^=255&e[l],f=(65535&f)*s+(((f>>>16)*s&65535)<<16)&4294967295,f=f<<15|f>>>17,f=(65535&f)*u+(((f>>>16)*u&65535)<<16)&4294967295,a^=f}return a^=e.length,a^=a>>>16,a=2246822507*(65535&a)+((2246822507*(a>>>16)&65535)<<16)&4294967295,a^=a>>>13,a=3266489909*(65535&a)+((3266489909*(a>>>16)&65535)<<16)&4294967295,a^=a>>>16,a>>>0}const i=r;i.v2=function(e,r){"string"==typeof e&&(e=t(e));let i,n=e.length,a=r^n,o=0;for(;n>=4;)i=255&e[o]|(255&e[++o])<<8|(255&e[++o])<<16|(255&e[++o])<<24,i=1540483477*(65535&i)+((1540483477*(i>>>16)&65535)<<16),i^=i>>>24,i=1540483477*(65535&i)+((1540483477*(i>>>16)&65535)<<16),a=1540483477*(65535&a)+((1540483477*(a>>>16)&65535)<<16)^i,n-=4,++o;switch(n){case 3:a^=(255&e[o+2])<<16;case 2:a^=(255&e[o+1])<<8;case 1:a^=255&e[o],a=1540483477*(65535&a)+((1540483477*(a>>>16)&65535)<<16)}return a^=a>>>13,a=1540483477*(65535&a)+((1540483477*(a>>>16)&65535)<<16),a^=a>>>15,a>>>0},i.v3=r,e.exports=i}()},725:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getBucketedNumber=t.MAX_BUCKETED_NUMBER=void 0;var i=r(77),n=Math.pow(2,32);t.MAX_BUCKETED_NUMBER=1e5,t.getBucketedNumber=function(e){var r=i.v3(e,1)/n;return Math.floor(r*t.MAX_BUCKETED_NUMBER)}},243:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.allConditionsAreMatched=t.conditionIsMatched=void 0;var i=r(480);function n(e,t){var r=e.attribute,n=e.operator,a=e.value;if("equals"===n)return t[r]===a;if("notEquals"===n)return t[r]!==a;if("before"===n||"after"===n){var o=(u=t[r])instanceof Date?u:new Date(u),s=a instanceof Date?a:new Date(a);return"before"===n?o<s:o>s}if("string"==typeof t[r]&&Array.isArray(a)){var u=t[r];if("in"===n)return-1!==a.indexOf(u);if("notIn"===n)return-1===a.indexOf(u)}else if("string"==typeof t[r]&&"string"==typeof a){if(u=t[r],"contains"===n)return-1!==u.indexOf(a);if("notContains"===n)return-1===u.indexOf(a);if("startsWith"===n)return u.startsWith(a);if("endsWith"===n)return u.endsWith(a);if("semverEquals"===n)return 0===(0,i.compareVersions)(u,a);if("semverNotEquals"===n)return 0!==(0,i.compareVersions)(u,a);if("semverGreaterThan"===n)return 1===(0,i.compareVersions)(u,a);if("semverGreaterThanOrEquals"===n)return(0,i.compareVersions)(u,a)>=0;if("semverLessThan"===n)return-1===(0,i.compareVersions)(u,a);if("semverLessThanOrEquals"===n)return(0,i.compareVersions)(u,a)<=0}else if("number"==typeof t[r]&&"number"==typeof a){if(u=t[r],"greaterThan"===n)return u>a;if("greaterThanOrEquals"===n)return u>=a;if("lessThan"===n)return u<a;if("lessThanOrEquals"===n)return u<=a}return!1}t.conditionIsMatched=n,t.allConditionsAreMatched=function e(t,r){return"attribute"in t?n(t,r):"and"in t&&Array.isArray(t.and)?t.and.every((function(t){return e(t,r)})):"or"in t&&Array.isArray(t.or)?t.or.some((function(t){return e(t,r)})):"not"in t&&Array.isArray(t.not)?t.not.every((function(i){return!1===e({and:t.not},r)})):!!Array.isArray(t)&&t.every((function(t){return e(t,r)}))}},913:(e,t)=>{"use strict";function r(e,t){if("string"==typeof e[t]&&"*"!==e[t])try{e[t]=JSON.parse(e[t])}catch(e){console.error("Error parsing JSON",e)}return e}Object.defineProperty(t,"__esModule",{value:!0}),t.DatafileReader=t.parseJsonConditionsIfStringified=void 0,t.parseJsonConditionsIfStringified=r;var i=function(){function e(e){this.schemaVersion=e.schemaVersion,this.revision=e.revision,this.segments=e.segments,this.attributes=e.attributes,this.features=e.features}return e.prototype.getRevision=function(){return this.revision},e.prototype.getSchemaVersion=function(){return this.schemaVersion},e.prototype.getAllAttributes=function(){return this.attributes},e.prototype.getAttribute=function(e){return this.attributes.find((function(t){return t.key===e}))},e.prototype.getSegment=function(e){var t=this.segments.find((function(t){return t.key===e}));if(t)return r(t,"conditions")},e.prototype.getFeature=function(e){var t=this.features.find((function(t){return t.key===e}));if(t)return t},e}();t.DatafileReader=i},186:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Emitter=void 0;var r=function(){function e(){this._listeners={}}return e.prototype.addListener=function(e,t){void 0===this._listeners[e]&&(this._listeners[e]=[]),this._listeners[e].push(t)},e.prototype.removeListener=function(e,t){if(void 0!==this._listeners[e]){var r=this._listeners[e].indexOf(t);-1!==r&&this._listeners[e].splice(r,1)}},e.prototype.removeAllListeners=function(e){var t=this;e?this._listeners[e]=[]:Object.keys(this._listeners).forEach((function(e){t._listeners[e]=[]}))},e.prototype.emit=function(e){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];void 0!==this._listeners[e]&&this._listeners[e].forEach((function(e){e.apply(void 0,t)}))},e}();t.Emitter=r},522:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getBucketedVariableValue=t.getForcedVariableValue=t.getBucketedVariation=t.getForcedVariation=t.getMatchedTrafficAndAllocation=t.getMatchedAllocation=void 0;var i=r(590),n=r(243);function a(e,t){for(var r=0,i=e.allocation.length>0&&void 0===e.allocation[0].range,n=0,a=e.allocation;n<a.length;n++){var o=a[n];if(o.range&&o.range.start<=t&&o.range.end>=t)return o;if(i&&t<=(r+=o.percentage||0))return o}}function o(e,t,r,n,o){var s;return{matchedTraffic:e.find((function(e){return!!(0,i.allGroupSegmentsAreMatched)("string"==typeof e.segments&&"*"!==e.segments?JSON.parse(e.segments):e.segments,t,n)&&!!(s=a(e,r))})),matchedAllocation:s}}function s(e,t,r){if(e.force)return e.force.find((function(e){return e.conditions?(0,n.allConditionsAreMatched)(e.conditions,t):!!e.segments&&(0,i.allGroupSegmentsAreMatched)(e.segments,t,r)}))}t.getMatchedAllocation=a,t.getMatchedTrafficAndAllocation=o,t.getForcedVariation=function(e,t,r){var i=s(e,t,r);if(i&&i.variation)return e.variations.find((function(e){return e.value===i.variation}))},t.getBucketedVariation=function(e,t,r,i,n){var a=o(e.traffic,t,r,i),s=a.matchedTraffic,u=a.matchedAllocation;if(s){if(s.variation){var f=e.variations.find((function(e){return e.value===s.variation}));if(f)return n.debug("using variation from rule",{featureKey:e.key,variation:f.value,ruleKey:s.key}),f}if(u){var l=u.variation,c=e.variations.find((function(e){return e.value===l}));if(c)return n.debug("matched variation",{featureKey:e.key,variation:c.value,bucketValue:r}),c;n.debug("no matched variation found",{featureKey:e.key,variation:l,bucketValue:r})}else n.debug("no matched allocation found",{featureKey:e.key,bucketValue:r})}else n.debug("no matched rule found",{featureKey:e.key,bucketValue:r})},t.getForcedVariableValue=function(e,t,r,i){var n=s(e,r,i);if(n&&n.variables){var a=n.variables[t.key];return"string"==typeof a&&"json"===t.type?JSON.parse(a):a}},t.getBucketedVariableValue=function(e,t,r,a,s,u){var f,l=o(e.traffic,r,a,s),c=l.matchedTraffic,d=l.matchedAllocation;if(c){var g=t.key;if(c.variables&&void 0!==c.variables[g])return u.debug("using variable from rule",{featureKey:e.key,variableKey:g,bucketValue:a}),c.variables[g];if(d){var v=d.variation,h=e.variations.find((function(e){return e.value===v}));if(h){var y=null===(f=h.variables)||void 0===f?void 0:f.find((function(e){return e.key===g}));if(!y)return u.debug("using default value as variation has no variable",{featureKey:e.key,variableKey:g,variation:v,bucketValue:a}),"json"===t.type?JSON.parse(t.defaultValue):t.defaultValue;if(y.overrides){var p=y.overrides.find((function(e){return e.conditions?(0,n.allConditionsAreMatched)("string"==typeof e.conditions?JSON.parse(e.conditions):e.conditions,r):!!e.segments&&(0,i.allGroupSegmentsAreMatched)("string"==typeof e.segments&&"*"!==e.segments?JSON.parse(e.segments):e.segments,r,s)}));if(p)return u.debug("using override value from variation",{feature:e.key,variableKey:g,variation:v,bucketValue:a}),"json"===t.type?JSON.parse(p.value):p.value}return u.debug("using value from variation",{feature:e.key,variableKey:g,variation:v,bucketValue:a}),"json"===t.type?JSON.parse(y.value):y.value}u.debug("no matched variation found",{feature:e.key,variableKey:g,variation:v,bucketValue:a})}else u.debug("no matched allocation found",{featureKey:e.key,variableKey:g,bucketValue:a})}else u.debug("no matched rule found",{featureKey:e.key,variableKey:t.key,bucketValue:a})}},97:function(e,t,r){"use strict";var i=this&&this.__createBinding||(Object.create?function(e,t,r,i){void 0===i&&(i=r);var n=Object.getOwnPropertyDescriptor(t,r);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,n)}:function(e,t,r,i){void 0===i&&(i=r),e[i]=t[r]}),n=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||i(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),n(r(725),t),n(r(681),t),n(r(687),t)},681:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.createInstance=t.FeaturevisorInstance=t.getValueByType=void 0;var i=r(687),n=r(913),a=r(186),o=r(725),s=r(522),u={schemaVersion:"1",revision:"unknown",attributes:[],segments:[],features:[]};function f(e,t){return t?t(e):fetch(e).then((function(e){return e.json()}))}function l(e,t){if(void 0!==e)switch(t){case"string":return"string"==typeof e?e:void 0;case"integer":return parseInt(e,10);case"double":return parseFloat(e);case"boolean":return!0===e;case"array":return Array.isArray(e)?e:void 0;case"object":return"object"==typeof e?e:void 0;default:return e}}t.getValueByType=l;var c=function(){function e(e){var t=this;this.configureBucketValue=e.configureBucketValue,this.datafileUrl=e.datafileUrl,this.handleDatafileFetch=e.handleDatafileFetch,this.initialFeatures=e.initialFeatures,this.interceptAttributes=e.interceptAttributes,this.logger=e.logger||(0,i.createLogger)(),this.refreshInterval=e.refreshInterval,this.stickyFeatures=e.stickyFeatures,this.emitter=new a.Emitter,this.statuses={ready:!1,refreshInProgress:!1},e.onReady&&this.emitter.addListener("ready",e.onReady),e.onRefresh&&this.emitter.addListener("refresh",e.onRefresh),e.onUpdate&&this.emitter.addListener("update",e.onUpdate),e.onActivation&&this.emitter.addListener("activation",e.onActivation);var r=this.emitter.addListener.bind(this.emitter);this.on=r,this.addListener=r;var n=this.emitter.removeListener.bind(this.emitter);if(this.off=n,this.removeListener=n,this.removeAllListeners=this.emitter.removeAllListeners.bind(this.emitter),e.datafileUrl)this.setDatafile(e.datafile||u),f(e.datafileUrl,e.handleDatafileFetch).then((function(e){t.setDatafile(e),t.statuses.ready=!0,t.emitter.emit("ready"),t.refreshInterval&&t.startRefreshing()})).catch((function(e){t.logger.error("failed to fetch datafile",{error:e})}));else{if(!e.datafile)throw new Error("Featurevisor SDK instance cannot be created without both `datafile` and `datafileUrl` options");this.setDatafile(e.datafile),this.statuses.ready=!0,setTimeout((function(){t.emitter.emit("ready")}),0)}}return e.prototype.setDatafile=function(e){try{this.datafileReader=new n.DatafileReader("string"==typeof e?JSON.parse(e):e)}catch(e){this.logger.error("could not parse datafile",{error:e})}},e.prototype.setStickyFeatures=function(e){this.stickyFeatures=e},e.prototype.getRevision=function(){return this.datafileReader.getRevision()},e.prototype.getFeature=function(e){return"string"==typeof e?this.datafileReader.getFeature(e):e},e.prototype.isReady=function(){return this.statuses.ready},e.prototype.refresh=function(){var e=this;return this.logger.debug("refreshing datafile"),this.statuses.refreshInProgress?this.logger.warn("refresh in progress, skipping"):this.datafileUrl?(this.statuses.refreshInProgress=!0,void f(this.datafileUrl,this.handleDatafileFetch).then((function(t){var r=e.getRevision()!==t.revision;e.setDatafile(t),e.logger.info("refreshed datafile"),e.emitter.emit("refresh"),r&&e.emitter.emit("update"),e.statuses.refreshInProgress=!1})).catch((function(t){e.logger.error("failed to refresh datafile",{error:t}),e.statuses.refreshInProgress=!1}))):this.logger.error("cannot refresh since `datafileUrl` is not provided")},e.prototype.startRefreshing=function(){var e=this;return this.datafileUrl?this.intervalId?this.logger.warn("refreshing has already started"):this.refreshInterval?void(this.intervalId=setInterval((function(){e.refresh()}),1e3*this.refreshInterval)):this.logger.warn("no `refreshInterval` option provided"):this.logger.error("cannot start refreshing since `datafileUrl` is not provided")},e.prototype.stopRefreshing=function(){if(!this.intervalId)return this.logger.warn("refreshing has not started yet");clearInterval(this.intervalId)},e.prototype.getBucketKey=function(e,t){var r=e.key,i="string"==typeof e.bucketBy?e.bucketBy:e.bucketBy.join("_");return"".concat(i,"_").concat(r)},e.prototype.getBucketValue=function(e,t){var r=this.getBucketKey(e,t),i=(0,o.getBucketedNumber)(r);return this.configureBucketValue?this.configureBucketValue(e,t,i):i},e.prototype.getVariation=function(e,t){void 0===t&&(t={});try{var r,i="string"==typeof e?e:e.key;if(this.stickyFeatures&&this.stickyFeatures[i]&&void 0!==(r=this.stickyFeatures[i].variation))return this.logger.debug("using sticky variation",{featureKey:i,variation:r}),r;if(this.statuses&&!this.statuses.ready&&this.initialFeatures&&this.initialFeatures[i]&&void 0!==(r=this.initialFeatures[i].variation))return this.logger.debug("using initial variation",{featureKey:i,variation:r}),r;var n=this.getFeature(e);if(!n)return void this.logger.warn("feature not found in datafile",{featureKey:e});var a=this.interceptAttributes?this.interceptAttributes(t):t,o=(0,s.getForcedVariation)(n,a,this.datafileReader);if(o)return this.logger.debug("forced variation found",{featureKey:e,variation:o.value}),o.value;var u=this.getBucketValue(n,a),f=(0,s.getBucketedVariation)(n,a,u,this.datafileReader,this.logger);return f?f.value:(this.logger.debug("using default variation",{featureKey:e,bucketValue:u,variation:n.defaultVariation}),n.defaultVariation)}catch(t){return void this.logger.error("getVariation",{featureKey:e,error:t})}},e.prototype.getVariationBoolean=function(e,t){return void 0===t&&(t={}),l(this.getVariation(e,t),"boolean")},e.prototype.getVariationString=function(e,t){return void 0===t&&(t={}),l(this.getVariation(e,t),"string")},e.prototype.getVariationInteger=function(e,t){return void 0===t&&(t={}),l(this.getVariation(e,t),"integer")},e.prototype.getVariationDouble=function(e,t){return void 0===t&&(t={}),l(this.getVariation(e,t),"double")},e.prototype.activate=function(e,t){void 0===t&&(t={});try{var r=this.getVariation(e,t);if(void 0===r)return;var i=this.interceptAttributes?this.interceptAttributes(t):t,n={};return this.datafileReader.getAllAttributes().filter((function(e){return!0===e.capture})).forEach((function(e){void 0!==i[e.key]&&(n[e.key]=t[e.key])})),this.emitter.emit("activation",e,r,i,n),r}catch(t){return void this.logger.error("activate",{featureKey:e,error:t})}},e.prototype.activateBoolean=function(e,t){return void 0===t&&(t={}),l(this.activate(e,t),"boolean")},e.prototype.activateString=function(e,t){return void 0===t&&(t={}),l(this.activate(e,t),"string")},e.prototype.activateInteger=function(e,t){return void 0===t&&(t={}),l(this.activate(e,t),"integer")},e.prototype.activateDouble=function(e,t){return void 0===t&&(t={}),l(this.activate(e,t),"double")},e.prototype.getVariable=function(e,t,r){void 0===r&&(r={});try{var i,n="string"==typeof e?e:e.key;if(this.stickyFeatures&&this.stickyFeatures[n]&&this.stickyFeatures[n].variables&&void 0!==(i=this.stickyFeatures[n].variables[t]))return this.logger.debug("using sticky variable",{featureKey:n,variableKey:t}),i;if(this.statuses&&!this.statuses.ready&&this.initialFeatures&&this.initialFeatures[n]&&this.initialFeatures[n].variables&&void 0!==(i=this.initialFeatures[n].variables[t]))return this.logger.debug("using initial variable",{featureKey:n,variableKey:t}),i;var a=this.getFeature(e);if(!a)return void this.logger.warn("feature not found in datafile",{featureKey:e,variableKey:t});var o=Array.isArray(a.variablesSchema)?a.variablesSchema.find((function(e){return e.key===t})):void 0;if(!o)return void this.logger.warn("variable schema not found",{featureKey:e,variableKey:t});var u=this.interceptAttributes?this.interceptAttributes(r):r,f=(0,s.getForcedVariableValue)(a,o,u,this.datafileReader);if(void 0!==f)return this.logger.debug("forced variable value found",{featureKey:e,variableKey:t}),f;var l=this.getBucketValue(a,u);return(0,s.getBucketedVariableValue)(a,o,u,l,this.datafileReader,this.logger)}catch(r){return void this.logger.error("getVariable",{featureKey:e,variableKey:t,error:r})}},e.prototype.getVariableBoolean=function(e,t,r){return void 0===r&&(r={}),l(this.getVariable(e,t,r),"boolean")},e.prototype.getVariableString=function(e,t,r){return void 0===r&&(r={}),l(this.getVariable(e,t,r),"string")},e.prototype.getVariableInteger=function(e,t,r){return void 0===r&&(r={}),l(this.getVariable(e,t,r),"integer")},e.prototype.getVariableDouble=function(e,t,r){return void 0===r&&(r={}),l(this.getVariable(e,t,r),"double")},e.prototype.getVariableArray=function(e,t,r){return void 0===r&&(r={}),l(this.getVariable(e,t,r),"array")},e.prototype.getVariableObject=function(e,t,r){return void 0===r&&(r={}),l(this.getVariable(e,t,r),"object")},e.prototype.getVariableJSON=function(e,t,r){return void 0===r&&(r={}),l(this.getVariable(e,t,r),"json")},e}();t.FeaturevisorInstance=c,t.createInstance=function(e){return new c(e)}},687:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.createLogger=t.Logger=t.defaultLogHandler=t.defaultLogLevels=t.loggerPrefix=void 0,t.loggerPrefix="[Featurevisor]",t.defaultLogLevels=["warn","error"],t.defaultLogHandler=function(e,r,i){switch(void 0===i&&(i={}),e){case"debug":console.log(t.loggerPrefix,r,i);case"info":console.info(t.loggerPrefix,r,i);case"warn":console.warn(t.loggerPrefix,r,i);case"error":console.error(t.loggerPrefix,r,i)}};var r=function(){function e(e){this.levels=e.levels,this.handle=e.handler}return e.prototype.setLevels=function(e){this.levels=e},e.prototype.log=function(e,t,r){-1!==this.levels.indexOf(e)&&this.handle(e,t,r)},e.prototype.debug=function(e,t){this.log("debug",e,t)},e.prototype.info=function(e,t){this.log("info",e,t)},e.prototype.warn=function(e,t){this.log("warn",e,t)},e.prototype.error=function(e,t){this.log("error",e,t)},e}();t.Logger=r,t.createLogger=function(e){void 0===e&&(e={});var i=e.levels||t.defaultLogLevels,n=e.handler||t.defaultLogHandler;return new r({levels:i,handler:n})}},590:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.allGroupSegmentsAreMatched=t.segmentIsMatched=void 0;var i=r(243);function n(e,t){return(0,i.allConditionsAreMatched)(e.conditions,t)}t.segmentIsMatched=n,t.allGroupSegmentsAreMatched=function e(t,r,i){if("*"===t)return!0;if("string"==typeof t){var a=i.getSegment(t);return!!a&&n(a,r)}if("object"==typeof t){if("and"in t&&Array.isArray(t.and))return t.and.every((function(t){return e(t,r,i)}));if("or"in t&&Array.isArray(t.or))return t.or.some((function(t){return e(t,r,i)}));if("not"in t&&Array.isArray(t.not))return t.not.every((function(t){return!1===e(t,r,i)}))}return!!Array.isArray(t)&&t.every((function(t){return e(t,r,i)}))}}},t={};function r(i){var n=t[i];if(void 0!==n)return n.exports;var a=t[i]={exports:{}};return e[i].call(a.exports,a,a.exports,r),a.exports}return r.d=(e,t)=>{for(var i in t)r.o(t,i)&&!r.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r(97)})()));
1
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.FeaturevisorSDK=t():e.FeaturevisorSDK=t()}(this,(()=>(()=>{var e={480:(e,t,r)=>{"use strict";r.r(t),r.d(t,{compare:()=>a,compareVersions:()=>i,satisfies:()=>o,validate:()=>n});const i=(e,t)=>{const r=u(e),i=u(t),n=r.pop(),a=i.pop(),o=d(r,i);return 0!==o?o:n&&a?d(n.split("."),a.split(".")):n||a?n?-1:1:0},n=e=>"string"==typeof e&&/^[v\d]/.test(e)&&s.test(e),a=(e,t,r)=>{v(r);const n=i(e,t);return h[r].includes(n)},o=(e,t)=>{if(t.includes("||"))return t.split("||").some((t=>o(e,t)));if(t.includes(" "))return t.trim().replace(/\s{2,}/g," ").split(" ").every((t=>o(e,t)));const r=t.match(/^([<>=~^]+)/),i=r?r[1]:"=";if("^"!==i&&"~"!==i)return a(e,t,i);const[n,s,f,,l]=u(e),[c,h,g,,v]=u(t),y=[n,s,f],p=[c,null!=h?h:"x",null!=g?g:"x"];if(v){if(!l)return!1;if(0!==d(y,p))return!1;if(-1===d(l.split("."),v.split(".")))return!1}const b=p.findIndex((e=>"0"!==e))+1,m="~"===i?2:b>1?b:1;return 0===d(y.slice(0,m),p.slice(0,m))&&-1!==d(y.slice(m),p.slice(m))},s=/^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\-]+(?:\.[\da-z\-]+)*))?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?)?)?$/i,u=e=>{if("string"!=typeof e)throw new TypeError("Invalid argument expected string");const t=e.match(s);if(!t)throw new Error(`Invalid argument not valid semver ('${e}' received)`);return t.shift(),t},f=e=>"*"===e||"x"===e||"X"===e,l=e=>{const t=parseInt(e,10);return isNaN(t)?e:t},c=(e,t)=>{if(f(e)||f(t))return 0;const[r,i]=((e,t)=>typeof e!=typeof t?[String(e),String(t)]:[e,t])(l(e),l(t));return r>i?1:r<i?-1:0},d=(e,t)=>{for(let r=0;r<Math.max(e.length,t.length);r++){const i=c(e[r]||"0",t[r]||"0");if(0!==i)return i}return 0},h={">":[1],">=":[0,1],"=":[0],"<=":[-1,0],"<":[-1]},g=Object.keys(h),v=e=>{if("string"!=typeof e)throw new TypeError("Invalid operator type, expected string but got "+typeof e);if(-1===g.indexOf(e))throw new Error(`Invalid operator, expected one of ${g.join("|")}`)}},77:e=>{!function(){const t=e=>(new TextEncoder).encode(e);function r(e,r){let i,n,a,o,s,u,f,l;for("string"==typeof e&&(e=t(e)),i=3&e.length,n=e.length-i,a=r,s=3432918353,u=461845907,l=0;l<n;)f=255&e[l]|(255&e[++l])<<8|(255&e[++l])<<16|(255&e[++l])<<24,++l,f=(65535&f)*s+(((f>>>16)*s&65535)<<16)&4294967295,f=f<<15|f>>>17,f=(65535&f)*u+(((f>>>16)*u&65535)<<16)&4294967295,a^=f,a=a<<13|a>>>19,o=5*(65535&a)+((5*(a>>>16)&65535)<<16)&4294967295,a=27492+(65535&o)+((58964+(o>>>16)&65535)<<16);switch(f=0,i){case 3:f^=(255&e[l+2])<<16;case 2:f^=(255&e[l+1])<<8;case 1:f^=255&e[l],f=(65535&f)*s+(((f>>>16)*s&65535)<<16)&4294967295,f=f<<15|f>>>17,f=(65535&f)*u+(((f>>>16)*u&65535)<<16)&4294967295,a^=f}return a^=e.length,a^=a>>>16,a=2246822507*(65535&a)+((2246822507*(a>>>16)&65535)<<16)&4294967295,a^=a>>>13,a=3266489909*(65535&a)+((3266489909*(a>>>16)&65535)<<16)&4294967295,a^=a>>>16,a>>>0}const i=r;i.v2=function(e,r){"string"==typeof e&&(e=t(e));let i,n=e.length,a=r^n,o=0;for(;n>=4;)i=255&e[o]|(255&e[++o])<<8|(255&e[++o])<<16|(255&e[++o])<<24,i=1540483477*(65535&i)+((1540483477*(i>>>16)&65535)<<16),i^=i>>>24,i=1540483477*(65535&i)+((1540483477*(i>>>16)&65535)<<16),a=1540483477*(65535&a)+((1540483477*(a>>>16)&65535)<<16)^i,n-=4,++o;switch(n){case 3:a^=(255&e[o+2])<<16;case 2:a^=(255&e[o+1])<<8;case 1:a^=255&e[o],a=1540483477*(65535&a)+((1540483477*(a>>>16)&65535)<<16)}return a^=a>>>13,a=1540483477*(65535&a)+((1540483477*(a>>>16)&65535)<<16),a^=a>>>15,a>>>0},i.v3=r,e.exports=i}()},725:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getBucketedNumber=t.MAX_BUCKETED_NUMBER=void 0;var i=r(77),n=Math.pow(2,32);t.MAX_BUCKETED_NUMBER=1e5,t.getBucketedNumber=function(e){var r=i.v3(e,1)/n;return Math.floor(r*t.MAX_BUCKETED_NUMBER)}},243:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.allConditionsAreMatched=t.conditionIsMatched=void 0;var i=r(480);function n(e,t){var r=e.attribute,n=e.operator,a=e.value;if("equals"===n)return t[r]===a;if("notEquals"===n)return t[r]!==a;if("before"===n||"after"===n){var o=(u=t[r])instanceof Date?u:new Date(u),s=a instanceof Date?a:new Date(a);return"before"===n?o<s:o>s}if("string"==typeof t[r]&&Array.isArray(a)){var u=t[r];if("in"===n)return-1!==a.indexOf(u);if("notIn"===n)return-1===a.indexOf(u)}else if("string"==typeof t[r]&&"string"==typeof a){if(u=t[r],"contains"===n)return-1!==u.indexOf(a);if("notContains"===n)return-1===u.indexOf(a);if("startsWith"===n)return u.startsWith(a);if("endsWith"===n)return u.endsWith(a);if("semverEquals"===n)return 0===(0,i.compareVersions)(u,a);if("semverNotEquals"===n)return 0!==(0,i.compareVersions)(u,a);if("semverGreaterThan"===n)return 1===(0,i.compareVersions)(u,a);if("semverGreaterThanOrEquals"===n)return(0,i.compareVersions)(u,a)>=0;if("semverLessThan"===n)return-1===(0,i.compareVersions)(u,a);if("semverLessThanOrEquals"===n)return(0,i.compareVersions)(u,a)<=0}else if("number"==typeof t[r]&&"number"==typeof a){if(u=t[r],"greaterThan"===n)return u>a;if("greaterThanOrEquals"===n)return u>=a;if("lessThan"===n)return u<a;if("lessThanOrEquals"===n)return u<=a}return!1}t.conditionIsMatched=n,t.allConditionsAreMatched=function e(t,r){return"attribute"in t?n(t,r):"and"in t&&Array.isArray(t.and)?t.and.every((function(t){return e(t,r)})):"or"in t&&Array.isArray(t.or)?t.or.some((function(t){return e(t,r)})):"not"in t&&Array.isArray(t.not)?t.not.every((function(i){return!1===e({and:t.not},r)})):!!Array.isArray(t)&&t.every((function(t){return e(t,r)}))}},913:(e,t)=>{"use strict";function r(e,t){if("string"==typeof e[t]&&"*"!==e[t])try{e[t]=JSON.parse(e[t])}catch(e){console.error("Error parsing JSON",e)}return e}Object.defineProperty(t,"__esModule",{value:!0}),t.DatafileReader=t.parseJsonConditionsIfStringified=void 0,t.parseJsonConditionsIfStringified=r;var i=function(){function e(e){this.schemaVersion=e.schemaVersion,this.revision=e.revision,this.segments=e.segments,this.attributes=e.attributes,this.features=e.features}return e.prototype.getRevision=function(){return this.revision},e.prototype.getSchemaVersion=function(){return this.schemaVersion},e.prototype.getAllAttributes=function(){return this.attributes},e.prototype.getAttribute=function(e){return this.attributes.find((function(t){return t.key===e}))},e.prototype.getSegment=function(e){var t=this.segments.find((function(t){return t.key===e}));if(t)return r(t,"conditions")},e.prototype.getFeature=function(e){var t=this.features.find((function(t){return t.key===e}));if(t)return t},e}();t.DatafileReader=i},186:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Emitter=void 0;var r=function(){function e(){this._listeners={}}return e.prototype.addListener=function(e,t){void 0===this._listeners[e]&&(this._listeners[e]=[]),this._listeners[e].push(t)},e.prototype.removeListener=function(e,t){if(void 0!==this._listeners[e]){var r=this._listeners[e].indexOf(t);-1!==r&&this._listeners[e].splice(r,1)}},e.prototype.removeAllListeners=function(e){var t=this;e?this._listeners[e]=[]:Object.keys(this._listeners).forEach((function(e){t._listeners[e]=[]}))},e.prototype.emit=function(e){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];void 0!==this._listeners[e]&&this._listeners[e].forEach((function(e){e.apply(void 0,t)}))},e}();t.Emitter=r},522:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getBucketedVariableValue=t.getForcedVariableValue=t.getBucketedVariation=t.getForcedVariation=t.getMatchedTrafficAndAllocation=t.getMatchedAllocation=void 0;var i=r(590),n=r(243);function a(e,t){for(var r=0,i=e.allocation.length>0&&void 0===e.allocation[0].range,n=0,a=e.allocation;n<a.length;n++){var o=a[n];if(o.range&&o.range.start<=t&&o.range.end>=t)return o;if(i&&t<=(r+=o.percentage||0))return o}}function o(e,t,r,n,o){var s;return{matchedTraffic:e.find((function(e){return!!(0,i.allGroupSegmentsAreMatched)("string"==typeof e.segments&&"*"!==e.segments?JSON.parse(e.segments):e.segments,t,n)&&!!(s=a(e,r))})),matchedAllocation:s}}function s(e,t,r){if(e.force)return e.force.find((function(e){return e.conditions?(0,n.allConditionsAreMatched)(e.conditions,t):!!e.segments&&(0,i.allGroupSegmentsAreMatched)(e.segments,t,r)}))}t.getMatchedAllocation=a,t.getMatchedTrafficAndAllocation=o,t.getForcedVariation=function(e,t,r){var i=s(e,t,r);if(i&&i.variation)return e.variations.find((function(e){return e.value===i.variation}))},t.getBucketedVariation=function(e,t,r,i,n){var a=o(e.traffic,t,r,i),s=a.matchedTraffic,u=a.matchedAllocation;if(s){if(s.variation){var f=e.variations.find((function(e){return e.value===s.variation}));if(f)return n.debug("using variation from rule",{featureKey:e.key,variation:f.value,ruleKey:s.key}),f}if(u){var l=u.variation,c=e.variations.find((function(e){return e.value===l}));if(c)return n.debug("matched variation",{featureKey:e.key,variation:c.value,bucketValue:r}),c;n.debug("no matched variation found",{featureKey:e.key,variation:l,bucketValue:r})}else n.debug("no matched allocation found",{featureKey:e.key,bucketValue:r})}else n.debug("no matched rule found",{featureKey:e.key,bucketValue:r})},t.getForcedVariableValue=function(e,t,r,i){var n=s(e,r,i);if(n&&n.variables){var a=n.variables[t.key];return"string"==typeof a&&"json"===t.type?JSON.parse(a):a}},t.getBucketedVariableValue=function(e,t,r,a,s,u){var f,l=o(e.traffic,r,a,s),c=l.matchedTraffic,d=l.matchedAllocation;if(c){var h=t.key;if(c.variables&&void 0!==c.variables[h])return u.debug("using variable from rule",{featureKey:e.key,variableKey:h,bucketValue:a}),c.variables[h];if(d){var g=d.variation,v=e.variations.find((function(e){return e.value===g}));if(v){var y=null===(f=v.variables)||void 0===f?void 0:f.find((function(e){return e.key===h}));if(!y)return u.debug("using default value as variation has no variable",{featureKey:e.key,variableKey:h,variation:g,bucketValue:a}),"json"===t.type?JSON.parse(t.defaultValue):t.defaultValue;if(y.overrides){var p=y.overrides.find((function(e){return e.conditions?(0,n.allConditionsAreMatched)("string"==typeof e.conditions?JSON.parse(e.conditions):e.conditions,r):!!e.segments&&(0,i.allGroupSegmentsAreMatched)("string"==typeof e.segments&&"*"!==e.segments?JSON.parse(e.segments):e.segments,r,s)}));if(p)return u.debug("using override value from variation",{feature:e.key,variableKey:h,variation:g,bucketValue:a}),"json"===t.type?JSON.parse(p.value):p.value}return u.debug("using value from variation",{feature:e.key,variableKey:h,variation:g,bucketValue:a}),"json"===t.type?JSON.parse(y.value):y.value}u.debug("no matched variation found",{feature:e.key,variableKey:h,variation:g,bucketValue:a})}else u.debug("no matched allocation found",{featureKey:e.key,variableKey:h,bucketValue:a})}else u.debug("no matched rule found",{featureKey:e.key,variableKey:t.key,bucketValue:a})}},97:function(e,t,r){"use strict";var i=this&&this.__createBinding||(Object.create?function(e,t,r,i){void 0===i&&(i=r);var n=Object.getOwnPropertyDescriptor(t,r);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,n)}:function(e,t,r,i){void 0===i&&(i=r),e[i]=t[r]}),n=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||i(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),n(r(725),t),n(r(681),t),n(r(687),t)},681:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.createInstance=t.FeaturevisorInstance=t.getValueByType=void 0;var i=r(687),n=r(913),a=r(186),o=r(725),s=r(522),u=".",f={schemaVersion:"1",revision:"unknown",attributes:[],segments:[],features:[]};function l(e,t){return t?t(e):fetch(e).then((function(e){return e.json()}))}function c(e,t){if(void 0!==e)switch(t){case"string":return"string"==typeof e?e:void 0;case"integer":return parseInt(e,10);case"double":return parseFloat(e);case"boolean":return!0===e;case"array":return Array.isArray(e)?e:void 0;case"object":return"object"==typeof e?e:void 0;default:return e}}t.getValueByType=c;var d=function(){function e(e){var t=this;this.bucketKeySeparator=e.bucketKeySeparator||u,this.configureBucketValue=e.configureBucketValue,this.datafileUrl=e.datafileUrl,this.handleDatafileFetch=e.handleDatafileFetch,this.initialFeatures=e.initialFeatures,this.interceptAttributes=e.interceptAttributes,this.logger=e.logger||(0,i.createLogger)(),this.refreshInterval=e.refreshInterval,this.stickyFeatures=e.stickyFeatures,this.emitter=new a.Emitter,this.statuses={ready:!1,refreshInProgress:!1},e.onReady&&this.emitter.addListener("ready",e.onReady),e.onRefresh&&this.emitter.addListener("refresh",e.onRefresh),e.onUpdate&&this.emitter.addListener("update",e.onUpdate),e.onActivation&&this.emitter.addListener("activation",e.onActivation);var r=this.emitter.addListener.bind(this.emitter);this.on=r,this.addListener=r;var n=this.emitter.removeListener.bind(this.emitter);if(this.off=n,this.removeListener=n,this.removeAllListeners=this.emitter.removeAllListeners.bind(this.emitter),e.datafileUrl)this.setDatafile(e.datafile||f),l(e.datafileUrl,e.handleDatafileFetch).then((function(e){t.setDatafile(e),t.statuses.ready=!0,t.emitter.emit("ready"),t.refreshInterval&&t.startRefreshing()})).catch((function(e){t.logger.error("failed to fetch datafile",{error:e})}));else{if(!e.datafile)throw new Error("Featurevisor SDK instance cannot be created without both `datafile` and `datafileUrl` options");this.setDatafile(e.datafile),this.statuses.ready=!0,setTimeout((function(){t.emitter.emit("ready")}),0)}}return e.prototype.setDatafile=function(e){try{this.datafileReader=new n.DatafileReader("string"==typeof e?JSON.parse(e):e)}catch(e){this.logger.error("could not parse datafile",{error:e})}},e.prototype.setStickyFeatures=function(e){this.stickyFeatures=e},e.prototype.getRevision=function(){return this.datafileReader.getRevision()},e.prototype.getFeature=function(e){return"string"==typeof e?this.datafileReader.getFeature(e):e},e.prototype.isReady=function(){return this.statuses.ready},e.prototype.refresh=function(){var e=this;return this.logger.debug("refreshing datafile"),this.statuses.refreshInProgress?this.logger.warn("refresh in progress, skipping"):this.datafileUrl?(this.statuses.refreshInProgress=!0,void l(this.datafileUrl,this.handleDatafileFetch).then((function(t){var r=e.getRevision()!==t.revision;e.setDatafile(t),e.logger.info("refreshed datafile"),e.emitter.emit("refresh"),r&&e.emitter.emit("update"),e.statuses.refreshInProgress=!1})).catch((function(t){e.logger.error("failed to refresh datafile",{error:t}),e.statuses.refreshInProgress=!1}))):this.logger.error("cannot refresh since `datafileUrl` is not provided")},e.prototype.startRefreshing=function(){var e=this;return this.datafileUrl?this.intervalId?this.logger.warn("refreshing has already started"):this.refreshInterval?void(this.intervalId=setInterval((function(){e.refresh()}),1e3*this.refreshInterval)):this.logger.warn("no `refreshInterval` option provided"):this.logger.error("cannot start refreshing since `datafileUrl` is not provided")},e.prototype.stopRefreshing=function(){if(!this.intervalId)return this.logger.warn("refreshing has not started yet");clearInterval(this.intervalId)},e.prototype.getBucketKey=function(e,t){var r=e.key,i="string"==typeof e.bucketBy?[e.bucketBy]:e.bucketBy,n=[];return i.forEach((function(e){var r=t[e];void 0!==r&&n.push(r)})),n.push(r),n.join(this.bucketKeySeparator)},e.prototype.getBucketValue=function(e,t){var r=this.getBucketKey(e,t),i=(0,o.getBucketedNumber)(r);return this.configureBucketValue?this.configureBucketValue(e,t,i):i},e.prototype.getVariation=function(e,t){void 0===t&&(t={});try{var r,i="string"==typeof e?e:e.key;if(this.stickyFeatures&&this.stickyFeatures[i]&&void 0!==(r=this.stickyFeatures[i].variation))return this.logger.debug("using sticky variation",{featureKey:i,variation:r}),r;if(this.statuses&&!this.statuses.ready&&this.initialFeatures&&this.initialFeatures[i]&&void 0!==(r=this.initialFeatures[i].variation))return this.logger.debug("using initial variation",{featureKey:i,variation:r}),r;var n=this.getFeature(e);if(!n)return void this.logger.warn("feature not found in datafile",{featureKey:e});var a=this.interceptAttributes?this.interceptAttributes(t):t,o=(0,s.getForcedVariation)(n,a,this.datafileReader);if(o)return this.logger.debug("forced variation found",{featureKey:e,variation:o.value}),o.value;var u=this.getBucketValue(n,a),f=(0,s.getBucketedVariation)(n,a,u,this.datafileReader,this.logger);return f?f.value:(this.logger.debug("using default variation",{featureKey:e,bucketValue:u,variation:n.defaultVariation}),n.defaultVariation)}catch(t){return void this.logger.error("getVariation",{featureKey:e,error:t})}},e.prototype.getVariationBoolean=function(e,t){return void 0===t&&(t={}),c(this.getVariation(e,t),"boolean")},e.prototype.getVariationString=function(e,t){return void 0===t&&(t={}),c(this.getVariation(e,t),"string")},e.prototype.getVariationInteger=function(e,t){return void 0===t&&(t={}),c(this.getVariation(e,t),"integer")},e.prototype.getVariationDouble=function(e,t){return void 0===t&&(t={}),c(this.getVariation(e,t),"double")},e.prototype.activate=function(e,t){void 0===t&&(t={});try{var r=this.getVariation(e,t);if(void 0===r)return;var i=this.interceptAttributes?this.interceptAttributes(t):t,n={};return this.datafileReader.getAllAttributes().filter((function(e){return!0===e.capture})).forEach((function(e){void 0!==i[e.key]&&(n[e.key]=t[e.key])})),this.emitter.emit("activation",e,r,i,n),r}catch(t){return void this.logger.error("activate",{featureKey:e,error:t})}},e.prototype.activateBoolean=function(e,t){return void 0===t&&(t={}),c(this.activate(e,t),"boolean")},e.prototype.activateString=function(e,t){return void 0===t&&(t={}),c(this.activate(e,t),"string")},e.prototype.activateInteger=function(e,t){return void 0===t&&(t={}),c(this.activate(e,t),"integer")},e.prototype.activateDouble=function(e,t){return void 0===t&&(t={}),c(this.activate(e,t),"double")},e.prototype.getVariable=function(e,t,r){void 0===r&&(r={});try{var i,n="string"==typeof e?e:e.key;if(this.stickyFeatures&&this.stickyFeatures[n]&&this.stickyFeatures[n].variables&&void 0!==(i=this.stickyFeatures[n].variables[t]))return this.logger.debug("using sticky variable",{featureKey:n,variableKey:t}),i;if(this.statuses&&!this.statuses.ready&&this.initialFeatures&&this.initialFeatures[n]&&this.initialFeatures[n].variables&&void 0!==(i=this.initialFeatures[n].variables[t]))return this.logger.debug("using initial variable",{featureKey:n,variableKey:t}),i;var a=this.getFeature(e);if(!a)return void this.logger.warn("feature not found in datafile",{featureKey:e,variableKey:t});var o=Array.isArray(a.variablesSchema)?a.variablesSchema.find((function(e){return e.key===t})):void 0;if(!o)return void this.logger.warn("variable schema not found",{featureKey:e,variableKey:t});var u=this.interceptAttributes?this.interceptAttributes(r):r,f=(0,s.getForcedVariableValue)(a,o,u,this.datafileReader);if(void 0!==f)return this.logger.debug("forced variable value found",{featureKey:e,variableKey:t}),f;var l=this.getBucketValue(a,u);return(0,s.getBucketedVariableValue)(a,o,u,l,this.datafileReader,this.logger)}catch(r){return void this.logger.error("getVariable",{featureKey:e,variableKey:t,error:r})}},e.prototype.getVariableBoolean=function(e,t,r){return void 0===r&&(r={}),c(this.getVariable(e,t,r),"boolean")},e.prototype.getVariableString=function(e,t,r){return void 0===r&&(r={}),c(this.getVariable(e,t,r),"string")},e.prototype.getVariableInteger=function(e,t,r){return void 0===r&&(r={}),c(this.getVariable(e,t,r),"integer")},e.prototype.getVariableDouble=function(e,t,r){return void 0===r&&(r={}),c(this.getVariable(e,t,r),"double")},e.prototype.getVariableArray=function(e,t,r){return void 0===r&&(r={}),c(this.getVariable(e,t,r),"array")},e.prototype.getVariableObject=function(e,t,r){return void 0===r&&(r={}),c(this.getVariable(e,t,r),"object")},e.prototype.getVariableJSON=function(e,t,r){return void 0===r&&(r={}),c(this.getVariable(e,t,r),"json")},e}();t.FeaturevisorInstance=d,t.createInstance=function(e){return new d(e)}},687:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.createLogger=t.Logger=t.defaultLogHandler=t.defaultLogLevels=t.loggerPrefix=void 0,t.loggerPrefix="[Featurevisor]",t.defaultLogLevels=["warn","error"],t.defaultLogHandler=function(e,r,i){switch(void 0===i&&(i={}),e){case"debug":console.log(t.loggerPrefix,r,i);case"info":console.info(t.loggerPrefix,r,i);case"warn":console.warn(t.loggerPrefix,r,i);case"error":console.error(t.loggerPrefix,r,i)}};var r=function(){function e(e){this.levels=e.levels,this.handle=e.handler}return e.prototype.setLevels=function(e){this.levels=e},e.prototype.log=function(e,t,r){-1!==this.levels.indexOf(e)&&this.handle(e,t,r)},e.prototype.debug=function(e,t){this.log("debug",e,t)},e.prototype.info=function(e,t){this.log("info",e,t)},e.prototype.warn=function(e,t){this.log("warn",e,t)},e.prototype.error=function(e,t){this.log("error",e,t)},e}();t.Logger=r,t.createLogger=function(e){void 0===e&&(e={});var i=e.levels||t.defaultLogLevels,n=e.handler||t.defaultLogHandler;return new r({levels:i,handler:n})}},590:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.allGroupSegmentsAreMatched=t.segmentIsMatched=void 0;var i=r(243);function n(e,t){return(0,i.allConditionsAreMatched)(e.conditions,t)}t.segmentIsMatched=n,t.allGroupSegmentsAreMatched=function e(t,r,i){if("*"===t)return!0;if("string"==typeof t){var a=i.getSegment(t);return!!a&&n(a,r)}if("object"==typeof t){if("and"in t&&Array.isArray(t.and))return t.and.every((function(t){return e(t,r,i)}));if("or"in t&&Array.isArray(t.or))return t.or.some((function(t){return e(t,r,i)}));if("not"in t&&Array.isArray(t.not))return t.not.every((function(t){return!1===e(t,r,i)}))}return!!Array.isArray(t)&&t.every((function(t){return e(t,r,i)}))}}},t={};function r(i){var n=t[i];if(void 0!==n)return n.exports;var a=t[i]={exports:{}};return e[i].call(a.exports,a,a.exports,r),a.exports}return r.d=(e,t)=>{for(var i in t)r.o(t,i)&&!r.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r(97)})()));
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.gz CHANGED
Binary file
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","mappings":"CAAA,SAA2CA,EAAMC,GAC1B,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,IACQ,mBAAXG,QAAyBA,OAAOC,IAC9CD,OAAO,GAAIH,GACe,iBAAZC,QACdA,QAAyB,gBAAID,IAE7BD,EAAsB,gBAAIC,GAC3B,CATD,CASGK,MAAM,I,2HCFF,MAAMC,EAAkB,CAACC,EAAIC,KAEhC,MAAMC,EAAKC,EAAiBH,GACtBI,EAAKD,EAAiBF,GAEtBI,EAAKH,EAAGI,MACRC,EAAKH,EAAGE,MAERE,EAAIC,EAAgBP,EAAIE,GAC9B,OAAU,IAANI,EACOA,EAEPH,GAAME,EACCE,EAAgBJ,EAAGK,MAAM,KAAMH,EAAGG,MAAM,MAE1CL,GAAME,EACJF,GAAM,EAAI,EAEd,CAAC,EAeCM,EAAYC,GAA+B,iBAAZA,GAAwB,SAASC,KAAKD,IAAYE,EAAOD,KAAKD,GAkB7FG,EAAU,CAACf,EAAIC,EAAIe,KAE5BC,EAAoBD,GAGpB,MAAME,EAAMnB,EAAgBC,EAAIC,GAChC,OAAOkB,EAAeH,GAAUI,SAASF,EAAI,EAepCG,EAAY,CAACT,EAASU,KAE/B,GAAIA,EAAMF,SAAS,MACf,OAAOE,EAAMZ,MAAM,MAAMa,MAAMf,GAAMa,EAAUT,EAASJ,KAEvD,GAAIc,EAAMF,SAAS,KACpB,OAAOE,EACFE,OACAC,QAAQ,UAAW,KACnBf,MAAM,KACNgB,OAAOlB,GAAMa,EAAUT,EAASJ,KAGzC,MAAMmB,EAAIL,EAAMM,MAAM,eAChBC,EAAKF,EAAIA,EAAE,GAAK,IAEtB,GAAW,MAAPE,GAAqB,MAAPA,EACd,OAAOd,EAAQH,EAASU,EAAOO,GAEnC,MAAO7B,EAAIC,EAAI6B,EAAI,CAAEC,GAAM5B,EAAiBS,IACrCoB,EAAIC,EAAIC,EAAI,CAAEC,GAAMhC,EAAiBmB,GACtCc,EAAI,CAACpC,EAAIC,EAAI6B,GACbtB,EAAI,CAACwB,EAAIC,QAA+BA,EAAK,IAAKC,QAA+BA,EAAK,KAE5F,GAAIC,EAAI,CACJ,IAAKJ,EACD,OAAO,EACX,GAA8B,IAA1BtB,EAAgB2B,EAAG5B,GACnB,OAAO,EACX,IAAuD,IAAnDC,EAAgBsB,EAAGrB,MAAM,KAAMyB,EAAGzB,MAAM,MACxC,OAAO,CACf,CAEA,MAAM2B,EAAU7B,EAAE8B,WAAWF,GAAY,MAANA,IAAa,EAE1CG,EAAW,MAAPV,EAAa,EAAIQ,EAAU,EAAIA,EAAU,EAEnD,OAAsD,IAAlD5B,EAAgB2B,EAAEI,MAAM,EAAGD,GAAI/B,EAAEgC,MAAM,EAAGD,MAGG,IAA7C9B,EAAgB2B,EAAEI,MAAMD,GAAI/B,EAAEgC,MAAMD,GAE7B,EAETzB,EAAS,6IACTX,EAAoBS,IACtB,GAAuB,iBAAZA,EACP,MAAM,IAAI6B,UAAU,oCAExB,MAAMb,EAAQhB,EAAQgB,MAAMd,GAC5B,IAAKc,EACD,MAAM,IAAIc,MAAM,uCAAuC9B,gBAG3D,OADAgB,EAAMe,QACCf,CAAK,EAEVgB,EAAcC,GAAY,MAANA,GAAmB,MAANA,GAAmB,MAANA,EAC9CC,EAAYV,IACd,MAAMW,EAAIC,SAASZ,EAAG,IACtB,OAAOa,MAAMF,GAAKX,EAAIW,CAAC,EAGrBG,EAAiB,CAACC,EAAGC,KACvB,GAAIR,EAAWO,IAAMP,EAAWQ,GAC5B,OAAO,EACX,MAAOC,EAAIC,GAJG,EAACH,EAAGC,WAAaD,UAAaC,EAAI,CAACG,OAAOJ,GAAII,OAAOH,IAAM,CAACD,EAAGC,GAI5DI,CAAUV,EAASK,GAAIL,EAASM,IACjD,OAAIC,EAAKC,EACE,EACPD,EAAKC,GACG,EACL,CAAC,EAEN7C,EAAkB,CAAC0C,EAAGC,KACxB,IAAK,IAAIb,EAAI,EAAGA,EAAIkB,KAAKC,IAAIP,EAAEQ,OAAQP,EAAEO,QAASpB,IAAK,CACnD,MAAM/B,EAAI0C,EAAeC,EAAEZ,IAAM,IAAKa,EAAEb,IAAM,KAC9C,GAAU,IAAN/B,EACA,OAAOA,CACf,CACA,OAAO,CAAC,EAENW,EAAiB,CACnB,IAAK,CAAC,GACN,KAAM,CAAC,EAAG,GACV,IAAK,CAAC,GACN,KAAM,EAAE,EAAG,GACX,IAAK,EAAE,IAELyC,EAAmBC,OAAOC,KAAK3C,GAC/BF,EAAuBY,IACzB,GAAkB,iBAAPA,EACP,MAAM,IAAIY,UAAU,yDAAyDZ,GAEjF,IAAsC,IAAlC+B,EAAiBG,QAAQlC,GACzB,MAAM,IAAIa,MAAM,qCAAqCkB,EAAiBI,KAAK,OAC/E,C,UC7KH,WACC,MAEMC,EAAgBC,IAAQ,IAAIC,aAAcC,OAAOF,GAiEvD,SAASG,EAAaC,EAAKC,GAGzB,IAAIC,EAAWC,EAAOC,EAAIC,EAAKC,EAASC,EAASC,EAAIvC,EASrD,IAXmB,iBAAR+B,IAAkBA,EAAML,EAAaK,IAIhDE,EAAyB,EAAbF,EAAIX,OAChBc,EAAQH,EAAIX,OAASa,EACrBE,EAAKH,EACLK,EAAK,WACLC,EAAK,UACLtC,EAAI,EAEGA,EAAIkC,GACPK,EACa,IAATR,EAAI/B,IACO,IAAX+B,IAAM/B,KAAc,GACT,IAAX+B,IAAM/B,KAAc,IACT,IAAX+B,IAAM/B,KAAc,KACxBA,EAEFuC,GAAc,MAALA,GAAeF,KAAUE,IAAO,IAAMF,EAAM,QAAW,IAAQ,WACxEE,EAAMA,GAAM,GAAOA,IAAO,GAC1BA,GAAc,MAALA,GAAeD,KAAUC,IAAO,IAAMD,EAAM,QAAW,IAAQ,WAExEH,GAAMI,EACFJ,EAAMA,GAAM,GAAOA,IAAO,GAC9BC,EAAyB,GAAV,MAALD,KAAqC,GAAbA,IAAO,IAAW,QAAW,IAAQ,WACvEA,EAAwB,OAAV,MAANC,KAA4C,OAAdA,IAAQ,IAAgB,QAAW,IAK3E,OAFAG,EAAK,EAEGN,GACN,KAAK,EAAGM,IAAoB,IAAbR,EAAI/B,EAAI,KAAc,GACrC,KAAK,EAAGuC,IAAoB,IAAbR,EAAI/B,EAAI,KAAc,EACrC,KAAK,EAAGuC,GAAgB,IAATR,EAAI/B,GAEnBuC,GAAa,MAALA,GAAeF,KAAUE,IAAO,IAAMF,EAAM,QAAW,IAAO,WACtEE,EAAMA,GAAM,GAAOA,IAAO,GAC1BA,GAAa,MAALA,GAAeD,KAAUC,IAAO,IAAMD,EAAM,QAAW,IAAO,WACtEH,GAAMI,EAWR,OARAJ,GAAMJ,EAAIX,OAEVe,GAAMA,IAAO,GACbA,EAAuB,YAAV,MAALA,KAA8C,YAAbA,IAAO,IAAoB,QAAW,IAAO,WACtFA,GAAMA,IAAO,GACbA,EAAwB,YAAV,MAALA,KAA8C,YAAbA,IAAO,IAAoB,QAAW,IAAQ,WACxFA,GAAMA,IAAO,GAENA,IAAO,CAChB,CAEA,MAAMK,EAASV,EACfU,EAAO9E,GA1GP,SAAsB+E,EAAKT,GACN,iBAARS,IAAkBA,EAAMf,EAAae,IAChD,IAIEC,EAHAC,EAAIF,EAAIrB,OACRwB,EAAIZ,EAAOW,EACX3C,EAAI,EAGN,KAAO2C,GAAK,GACVD,EACa,IAATD,EAAIzC,IACO,IAAXyC,IAAMzC,KAAc,GACT,IAAXyC,IAAMzC,KAAc,IACT,IAAXyC,IAAMzC,KAAc,GAExB0C,EAAqB,YAAV,MAAJA,KAA4C,YAAZA,IAAM,IAAoB,QAAW,IAC5EA,GAAKA,IAAM,GACXA,EAAqB,YAAV,MAAJA,KAA4C,YAAZA,IAAM,IAAoB,QAAW,IAE9EE,EAAqB,YAAV,MAAJA,KAA4C,YAAZA,IAAM,IAAoB,QAAW,IAAOF,EAEjFC,GAAK,IACH3C,EAGJ,OAAQ2C,GACR,KAAK,EAAGC,IAAmB,IAAbH,EAAIzC,EAAI,KAAc,GACpC,KAAK,EAAG4C,IAAmB,IAAbH,EAAIzC,EAAI,KAAc,EACpC,KAAK,EAAG4C,GAAe,IAATH,EAAIzC,GACV4C,EAAqB,YAAV,MAAJA,KAA4C,YAAZA,IAAM,IAAoB,QAAW,IAOpF,OAJAA,GAAKA,IAAM,GACXA,EAAqB,YAAV,MAAJA,KAA4C,YAAZA,IAAM,IAAoB,QAAW,IAC5EA,GAAKA,IAAM,GAEJA,IAAM,CACf,EAsEAJ,EAAOjD,GAAKuC,EAGV1E,EAAOD,QAAUqF,CASrB,CAxIA,E,+HCAA,YAGMK,EAAiB3B,KAAK4B,IAAI,EAAG,IAEtB,EAAAC,oBAAsB,IAEnC,6BAAkCC,GAChC,IACMC,EADYC,EAAW3D,GAAGyD,EANhB,GAOUH,EAE1B,OAAO3B,KAAKiC,MAAMF,EAAQ,EAAAF,oBAC5B,C,oICZA,aAIA,SAAgBK,EAAmBC,EAA2BC,GACpD,IAAAC,EAA+BF,EAAS,UAA7B5E,EAAoB4E,EAAS,SAAnBG,EAAUH,EAAS,MAEhD,GAAiB,WAAb5E,EACF,OAAO6E,EAAWC,KAAeC,EAC5B,GAAiB,cAAb/E,EACT,OAAO6E,EAAWC,KAAeC,EAC5B,GAAiB,WAAb/E,GAAsC,UAAbA,EAAsB,CAExD,IAEMgF,GAFAC,EAAoBJ,EAAWC,cAGNI,KAAOD,EAAoB,IAAIC,KAAKD,GAC7DE,EAAkBJ,aAAiBG,KAAOH,EAAQ,IAAIG,KAAKH,GAEjE,MAAoB,WAAb/E,EACHgF,EAAmBG,EACnBH,EAAmBG,C,CAClB,GAAqC,iBAA1BN,EAAWC,IAA2BM,MAAMC,QAAQN,GAAQ,CAE5E,IAAME,EAAoBJ,EAAWC,GAErC,GAAiB,OAAb9E,EACF,OAA6C,IAAtC+E,EAAMhC,QAAQkC,GAChB,GAAiB,UAAbjF,EACT,OAA6C,IAAtC+E,EAAMhC,QAAQkC,E,MAElB,GAAqC,iBAA1BJ,EAAWC,IAA4C,iBAAVC,EAAoB,CAIjF,GAFME,EAAoBJ,EAAWC,GAEpB,aAAb9E,EACF,OAA6C,IAAtCiF,EAAkBlC,QAAQgC,GAC5B,GAAiB,gBAAb/E,EACT,OAA6C,IAAtCiF,EAAkBlC,QAAQgC,GAC5B,GAAiB,eAAb/E,EACT,OAAOiF,EAAkBK,WAAWP,GAC/B,GAAiB,aAAb/E,EACT,OAAOiF,EAAkBM,SAASR,GAC7B,GAAiB,iBAAb/E,EACT,OAAqD,KAA9C,IAAAjB,iBAAgBkG,EAAmBF,GACrC,GAAiB,oBAAb/E,EACT,OAAqD,KAA9C,IAAAjB,iBAAgBkG,EAAmBF,GACrC,GAAiB,sBAAb/E,EACT,OAAqD,KAA9C,IAAAjB,iBAAgBkG,EAAmBF,GACrC,GAAiB,8BAAb/E,EACT,OAAO,IAAAjB,iBAAgBkG,EAAmBF,IAAU,EAC/C,GAAiB,mBAAb/E,EACT,OAAsD,KAA/C,IAAAjB,iBAAgBkG,EAAmBF,GACrC,GAAiB,2BAAb/E,EACT,OAAO,IAAAjB,iBAAgBkG,EAAmBF,IAAU,C,MAEjD,GAAqC,iBAA1BF,EAAWC,IAA4C,iBAAVC,EAAoB,CAIjF,GAFME,EAAoBJ,EAAWC,GAEpB,gBAAb9E,EACF,OAAOiF,EAAoBF,EACtB,GAAiB,wBAAb/E,EACT,OAAOiF,GAAqBF,EACvB,GAAiB,aAAb/E,EACT,OAAOiF,EAAoBF,EACtB,GAAiB,qBAAb/E,EACT,OAAOiF,GAAqBF,C,CAIhC,OAAO,CACT,CApEA,uBAsEA,mCAAgBS,EACdC,EACAZ,GAEA,MAAI,cAAeY,EACVd,EAAmBc,EAAYZ,GAGpC,QAASY,GAAcL,MAAMC,QAAQI,EAAWC,KAC3CD,EAAWC,IAAIhF,OAAM,SAACiF,GAAM,OAAAH,EAAwBG,EAAGd,EAA3B,IAGjC,OAAQY,GAAcL,MAAMC,QAAQI,EAAWG,IAC1CH,EAAWG,GAAGrF,MAAK,SAACoF,GAAM,OAAAH,EAAwBG,EAAGd,EAA3B,IAG/B,QAASY,GAAcL,MAAMC,QAAQI,EAAWI,KAC3CJ,EAAWI,IAAInF,OACpB,SAACiF,GACC,OAKM,IALNH,EACE,CACEE,IAAKD,EAAWI,KAElBhB,EAJF,MASFO,MAAMC,QAAQI,IACTA,EAAW/E,OAAM,SAACiF,GAAM,OAAAH,EAAwBG,EAAGd,EAA3B,GAInC,C,2BCjGA,SAAgBiB,EAAoCC,EAAWzC,GAC7D,GAA2B,iBAAhByC,EAAOzC,IAAqC,MAAhByC,EAAOzC,GAC5C,IACEyC,EAAOzC,GAAO0C,KAAKC,MAAMF,EAAOzC,G,CAChC,MAAO4C,GACPC,QAAQC,MAAM,qBAAsBF,E,CAIxC,OAAOH,CACT,C,4GAVA,qCAYA,iBAOE,WAAYM,GACVvH,KAAKwH,cAAgBD,EAAaC,cAClCxH,KAAKyH,SAAWF,EAAaE,SAC7BzH,KAAK0H,SAAWH,EAAaG,SAC7B1H,KAAK+F,WAAawB,EAAaxB,WAC/B/F,KAAK2H,SAAWJ,EAAaI,QAC/B,CAqCF,OAnCE,YAAAC,YAAA,WACE,OAAO5H,KAAKyH,QACd,EAEA,YAAAI,iBAAA,WACE,OAAO7H,KAAKwH,aACd,EAEA,YAAAM,iBAAA,WACE,OAAO9H,KAAK+F,UACd,EAEA,YAAAgC,aAAA,SAAaC,GACX,OAAOhI,KAAK+F,WAAWkC,MAAK,SAAC5E,GAAM,OAAAA,EAAEmB,MAAQwD,CAAV,GACrC,EAEA,YAAAE,WAAA,SAAWC,GACT,IAAMC,EAAUpI,KAAK0H,SAASO,MAAK,SAAClF,GAAM,OAAAA,EAAEyB,MAAQ2D,CAAV,IAE1C,GAAKC,EAIL,OAAOpB,EAAiCoB,EAAS,aACnD,EAEA,YAAAC,WAAA,SAAWC,GACT,IAAMC,EAAUvI,KAAK2H,SAASM,MAAK,SAAClF,GAAM,OAAAA,EAAEyB,MAAQ8D,CAAV,IAE1C,GAAKC,EAIL,OAAOA,CACT,EACF,EAlDA,GAAa,EAAAC,eAAAA,C,6FChBb,iBAGE,aACExI,KAAKyI,WAAa,CAAC,CACrB,CAyCF,OAvCS,YAAAC,YAAP,SAAmBC,EAAsBC,QACG,IAA/B5I,KAAKyI,WAAWE,KACzB3I,KAAKyI,WAAWE,GAAa,IAG/B3I,KAAKyI,WAAWE,GAAWE,KAAKD,EAClC,EAEO,YAAAE,eAAP,SAAsBH,EAAsBC,GAC1C,QAA0C,IAA/B5I,KAAKyI,WAAWE,GAA3B,CAIA,IAAMI,EAAQ/I,KAAKyI,WAAWE,GAAW1E,QAAQ2E,IAElC,IAAXG,GACF/I,KAAKyI,WAAWE,GAAWK,OAAOD,EAAO,E,CAE7C,EAEO,YAAAE,mBAAP,SAA0BN,GAA1B,WACMA,EACF3I,KAAKyI,WAAWE,GAAa,GAE7B5E,OAAOC,KAAKhE,KAAKyI,YAAYS,SAAQ,SAAC1E,GACpC,EAAKiE,WAAWjE,GAAO,EACzB,GAEJ,EAEO,YAAA2E,KAAP,SAAYR,G,IAAsB,6DACU,IAA/B3I,KAAKyI,WAAWE,IAI3B3I,KAAKyI,WAAWE,GAAWO,SAAQ,SAACN,GAClCA,EAAE,aAAIQ,EACR,GACF,EACF,EA9CA,GAAa,EAAAC,QAAAA,C,6OCIb,aACA,SAOA,SAAgBC,EACdC,EACAC,GAMA,IAJA,IAAIC,EAAQ,EACNC,EACJH,EAAQI,WAAW9F,OAAS,QAA4C,IAAhC0F,EAAQI,WAAW,GAAGnI,MAEvC,MAAA+H,EAAQI,WAAR,eAAoB,CAAxC,IAAMA,EAAU,KACnB,GACEA,EAAWnI,OACXmI,EAAWnI,MAAMoI,OAASJ,GAC1BG,EAAWnI,MAAMqI,KAAOL,EAExB,OAAOG,EAIT,GAAID,GAEEF,IADJC,GAASE,EAAWG,YAAc,GAEhC,OAAOH,C,CAMf,CAOA,SAAgBI,EACdR,EACAxD,EACAyD,EACAQ,EACAC,GAEA,IAAIC,EAsBJ,MAAO,CACLC,eArBqBZ,EAAQtB,MAAK,SAACmC,GACnC,SACG,IAAAC,4BACuB,iBAAfD,EAAE1C,UAAwC,MAAf0C,EAAE1C,SAAmBR,KAAKC,MAAMiD,EAAE1C,UAAY0C,EAAE1C,SAClF3B,EACAiE,OAMJE,EAAoBZ,EAAqBc,EAAGZ,GAO9C,IAIEU,kBAAiB,EAErB,CAKA,SAASI,EACP/B,EACAxC,EACAiE,GAEA,GAAKzB,EAAQgC,MAIb,OAAOhC,EAAQgC,MAAMtC,MAAK,SAACuC,GACzB,OAAIA,EAAE7D,YACG,IAAAD,yBAAwB8D,EAAE7D,WAAYZ,KAG3CyE,EAAE9C,WACG,IAAA2C,4BAA2BG,EAAE9C,SAAU3B,EAAYiE,EAI9D,GACF,CA5FA,yBAkCA,mCA4DA,8BACEzB,EACAxC,EACAiE,GAEA,IAAMO,EAAQD,EAAqB/B,EAASxC,EAAYiE,GAExD,GAAKO,GAAUA,EAAME,UAIrB,OAAOlC,EAAQmC,WAAWzC,MAAK,SAAC3F,GAAM,OAAAA,EAAE2D,QAAUsE,EAAME,SAAlB,GACxC,EAEA,gCACElC,EACAxC,EACAyD,EACAQ,EACAC,GAEM,MAAwCF,EAC5CxB,EAAQgB,QACRxD,EACAyD,EACAQ,GAJMG,EAAc,iBAAED,EAAiB,oBAQzC,GAAKC,EAAL,CASA,GAAIA,EAAeM,UAAW,CAC5B,IAAM,EAAYlC,EAAQmC,WAAWzC,MAAK,SAAC3F,GACzC,OAAOA,EAAE2D,QAAUkE,EAAeM,SACpC,IAEA,GAAI,EAOF,OANAR,EAAOU,MAAM,4BAA6B,CACxCrC,WAAYC,EAAQ/D,IACpBiG,UAAW,EAAUxE,MACrB2E,QAAST,EAAe3F,MAGnB,C,CAIX,GAAK0F,EAAL,CASA,IAAMW,EAAiBX,EAAkBO,UAEnCA,EAAYlC,EAAQmC,WAAWzC,MAAK,SAAC3F,GACzC,OAAOA,EAAE2D,QAAU4E,CACrB,IAEA,GAAKJ,EAiBL,OANAR,EAAOU,MAAM,oBAAqB,CAChCrC,WAAYC,EAAQ/D,IACpBiG,UAAWA,EAAUxE,MACrBuD,YAAW,IAGNiB,EAfLR,EAAOU,MAAM,6BAA8B,CACzCrC,WAAYC,EAAQ/D,IACpBiG,UAAWI,EACXrB,YAAW,G,MAnBbS,EAAOU,MAAM,8BAA+B,CAC1CrC,WAAYC,EAAQ/D,IACpBgF,YAAW,G,MA3BbS,EAAOU,MAAM,wBAAyB,CACpCrC,WAAYC,EAAQ/D,IACpBgF,YAAW,GAuDjB,EAEA,kCACEjB,EACAuC,EACA/E,EACAiE,GAEA,IAAMO,EAAQD,EAAqB/B,EAASxC,EAAYiE,GAExD,GAAKO,GAAUA,EAAMQ,UAArB,CAIA,IAAM9E,EAAQsE,EAAMQ,UAAUD,EAAetG,KAE7C,MAAqB,iBAAVyB,GAA8C,SAAxB6E,EAAeE,KACvC9D,KAAKC,MAAMlB,GAGbA,C,CACT,EAEA,oCACEsC,EACAuC,EACA/E,EACAyD,EACAQ,EACAC,G,MAGM,EAAwCF,EAC5CxB,EAAQgB,QACRxD,EACAyD,EACAQ,GAJMG,EAAc,iBAAED,EAAiB,oBAQzC,GAAKC,EAAL,CAUA,IAAMc,EAAcH,EAAetG,IAGnC,GAAI2F,EAAeY,gBAA8D,IAA1CZ,EAAeY,UAAUE,GAO9D,OANAhB,EAAOU,MAAM,2BAA4B,CACvCrC,WAAYC,EAAQ/D,IACpByG,YAAW,EACXzB,YAAW,IAGNW,EAAeY,UAAUE,GAGlC,GAAKf,EAAL,CAUA,IAAMW,EAAiBX,EAAkBO,UAEnCA,EAAYlC,EAAQmC,WAAWzC,MAAK,SAAC3F,GACzC,OAAOA,EAAE2D,QAAU4E,CACrB,IAEA,GAAKJ,EAAL,CAYA,IAAMS,EAA2C,QAAnB,EAAAT,EAAUM,iBAAS,eAAE9C,MAAK,SAAC3F,GACvD,OAAOA,EAAEkC,MAAQyG,CACnB,IAEA,IAAKC,EAQH,OAPAjB,EAAOU,MAAM,mDAAoD,CAC/DrC,WAAYC,EAAQ/D,IACpByG,YAAW,EACXR,UAAWI,EACXrB,YAAW,IAGe,SAAxBsB,EAAeE,KACV9D,KAAKC,MAAM2D,EAAeK,cAG5BL,EAAeK,aAGxB,GAAID,EAAsBE,UAAW,CACnC,IAAMC,EAAWH,EAAsBE,UAAUnD,MAAK,SAACqD,GACrD,OAAIA,EAAE3E,YACG,IAAAD,yBACmB,iBAAjB4E,EAAE3E,WAA0BO,KAAKC,MAAMmE,EAAE3E,YAAc2E,EAAE3E,WAChEZ,KAIAuF,EAAE5D,WACG,IAAA2C,4BACiB,iBAAfiB,EAAE5D,UAAwC,MAAf4D,EAAE5D,SAChCR,KAAKC,MAAMmE,EAAE5D,UACb4D,EAAE5D,SACN3B,EACAiE,EAKN,IAEA,GAAIqB,EAQF,OAPApB,EAAOU,MAAM,sCAAuC,CAClDpC,QAASA,EAAQ/D,IACjByG,YAAW,EACXR,UAAWI,EACXrB,YAAW,IAGe,SAAxBsB,EAAeE,KACV9D,KAAKC,MAAMkE,EAASpF,OAGtBoF,EAASpF,K,CAWpB,OAPAgE,EAAOU,MAAM,6BAA8B,CACzCpC,QAASA,EAAQ/D,IACjByG,YAAW,EACXR,UAAWI,EACXrB,YAAW,IAGe,SAAxBsB,EAAeE,KACV9D,KAAKC,MAAM+D,EAAsBjF,OAGnCiF,EAAsBjF,K,CA9E3BgE,EAAOU,MAAM,6BAA8B,CACzCpC,QAASA,EAAQ/D,IACjByG,YAAW,EACXR,UAAWI,EACXrB,YAAW,G,MArBbS,EAAOU,MAAM,8BAA+B,CAC1CrC,WAAYC,EAAQ/D,IACpByG,YAAW,EACXzB,YAAW,G,MA1BbS,EAAOU,MAAM,wBAAyB,CACpCrC,WAAYC,EAAQ/D,IACpByG,YAAaH,EAAetG,IAC5BgF,YAAW,GAoHjB,C,ugBCvWA,YACA,YACA,W,8ICaA,aACA,SACA,SACA,SACA,SAuCM+B,EAAiC,CACrC/D,cAAe,IACfC,SAAU,UACV1B,WAAY,GACZ2B,SAAU,GACVC,SAAU,IAKZ,SAAS6D,EACPC,EACAC,GAEA,OAAIA,EACKA,EAAoBD,GAGtBE,MAAMF,GAAaG,MAAK,SAACxK,GAAQ,OAAAA,EAAIyK,MAAJ,GAC1C,CAKA,SAAgBC,EAAe7F,EAAkB8F,GAC/C,QAAcC,IAAV/F,EAIJ,OAAQ8F,GACN,IAAK,SACH,MAAwB,iBAAV9F,EAAqBA,OAAQ+F,EAC7C,IAAK,UACH,OAAO9I,SAAS+C,EAAiB,IACnC,IAAK,SACH,OAAOgG,WAAWhG,GACpB,IAAK,UACH,OAAiB,IAAVA,EACT,IAAK,QACH,OAAOK,MAAMC,QAAQN,GAASA,OAAQ+F,EACxC,IAAK,SACH,MAAwB,iBAAV/F,EAAqBA,OAAQ+F,EAE7C,QACE,OAAO/F,EAEb,CAtBA,mBAwBA,iBAwBE,WAAYiG,GAAZ,WAEElM,KAAKmM,qBAAuBD,EAAQC,qBACpCnM,KAAKyL,YAAcS,EAAQT,YAC3BzL,KAAK0L,oBAAsBQ,EAAQR,oBACnC1L,KAAKoM,gBAAkBF,EAAQE,gBAC/BpM,KAAKqM,oBAAsBH,EAAQG,oBACnCrM,KAAKiK,OAASiC,EAAQjC,SAAU,IAAAqC,gBAChCtM,KAAKuM,gBAAkBL,EAAQK,gBAC/BvM,KAAKwM,eAAiBN,EAAQM,eAG9BxM,KAAKyM,QAAU,IAAI,EAAApD,QACnBrJ,KAAK0M,SAAW,CACdC,OAAO,EACPC,mBAAmB,GAIjBV,EAAQW,SACV7M,KAAKyM,QAAQ/D,YAAY,QAASwD,EAAQW,SAGxCX,EAAQY,WACV9M,KAAKyM,QAAQ/D,YAAY,UAAWwD,EAAQY,WAG1CZ,EAAQa,UACV/M,KAAKyM,QAAQ/D,YAAY,SAAUwD,EAAQa,UAGzCb,EAAQc,cACVhN,KAAKyM,QAAQ/D,YAAY,aAAcwD,EAAQc,cAIjD,IAAMC,EAAKjN,KAAKyM,QAAQ/D,YAAYwE,KAAKlN,KAAKyM,SAC9CzM,KAAKiN,GAAKA,EACVjN,KAAK0I,YAAcuE,EAEnB,IAAME,EAAMnN,KAAKyM,QAAQ3D,eAAeoE,KAAKlN,KAAKyM,SAOlD,GANAzM,KAAKmN,IAAMA,EACXnN,KAAK8I,eAAiBqE,EAEtBnN,KAAKiJ,mBAAqBjJ,KAAKyM,QAAQxD,mBAAmBiE,KAAKlN,KAAKyM,SAGhEP,EAAQT,YACVzL,KAAKoN,YAAYlB,EAAQmB,UAAY9B,GAErCC,EAAqBU,EAAQT,YAAaS,EAAQR,qBAC/CE,MAAK,SAACyB,GACL,EAAKD,YAAYC,GAEjB,EAAKX,SAASC,OAAQ,EACtB,EAAKF,QAAQtD,KAAK,SAEd,EAAKoD,iBACP,EAAKe,iBAET,IACCC,OAAM,SAACnG,GACN,EAAK6C,OAAO3C,MAAM,2BAA4B,CAAEA,MAAOF,GACzD,QACG,KAAI8E,EAAQmB,SAQjB,MAAM,IAAIzK,MACR,iGARF5C,KAAKoN,YAAYlB,EAAQmB,UACzBrN,KAAK0M,SAASC,OAAQ,EAEtBa,YAAW,WACT,EAAKf,QAAQtD,KAAK,QACpB,GAAG,E,CAMP,CAmeF,OAjeE,YAAAiE,YAAA,SAAYC,GACV,IACErN,KAAKgK,eAAiB,IAAI,EAAAxB,eACJ,iBAAb6E,EAAwBnG,KAAKC,MAAMkG,GAAYA,E,CAExD,MAAOjG,GACPpH,KAAKiK,OAAO3C,MAAM,2BAA4B,CAAEA,MAAOF,G,CAE3D,EAEA,YAAAqG,kBAAA,SAAkBjB,GAChBxM,KAAKwM,eAAiBA,CACxB,EAEA,YAAA5E,YAAA,WACE,OAAO5H,KAAKgK,eAAepC,aAC7B,EAEQ,YAAAS,WAAR,SAAmBC,GACjB,MAA6B,iBAAfA,EACVtI,KAAKgK,eAAe3B,WAAWC,GAC/BA,CACN,EAKA,YAAAoF,QAAA,WACE,OAAO1N,KAAK0M,SAASC,KACvB,EAKA,YAAAgB,QAAA,sBAGE,OAFA3N,KAAKiK,OAAOU,MAAM,uBAEd3K,KAAK0M,SAASE,kBACT5M,KAAKiK,OAAO2D,KAAK,iCAGrB5N,KAAKyL,aAIVzL,KAAK0M,SAASE,mBAAoB,OAElCpB,EAAqBxL,KAAKyL,YAAazL,KAAK0L,qBACzCE,MAAK,SAACyB,GACL,IAEMQ,EAFkB,EAAKjG,gBACTyF,EAAS5F,SAG7B,EAAK2F,YAAYC,GACjB,EAAKpD,OAAO6D,KAAK,sBAEjB,EAAKrB,QAAQtD,KAAK,WAEd0E,GACF,EAAKpB,QAAQtD,KAAK,UAGpB,EAAKuD,SAASE,mBAAoB,CACpC,IACCW,OAAM,SAACnG,GACN,EAAK6C,OAAO3C,MAAM,6BAA8B,CAAEA,MAAOF,IACzD,EAAKsF,SAASE,mBAAoB,CACpC,KAzBO5M,KAAKiK,OAAO3C,MAAM,qDA0B7B,EAEA,YAAAgG,gBAAA,sBACE,OAAKtN,KAAKyL,YAINzL,KAAK+N,WACA/N,KAAKiK,OAAO2D,KAAK,kCAGrB5N,KAAKuM,qBAIVvM,KAAK+N,WAAaC,aAAY,WAC5B,EAAKL,SACP,GAA0B,IAAvB3N,KAAKuM,kBALCvM,KAAKiK,OAAO2D,KAAK,wCARjB5N,KAAKiK,OAAO3C,MAAM,8DAc7B,EAEA,YAAA2G,eAAA,WACE,IAAKjO,KAAK+N,WACR,OAAO/N,KAAKiK,OAAO2D,KAAK,kCAG1BM,cAAclO,KAAK+N,WACrB,EAKQ,YAAAI,aAAR,SAAqB5F,EAAkBxC,GACrC,IAAMuC,EAAaC,EAAQ/D,IAErB4J,EACwB,iBAArB7F,EAAQ8F,SAAwB9F,EAAQ8F,SAAW9F,EAAQ8F,SAASnK,KAAK,KAElF,MAAO,UAAGkK,EAAM,YAAI9F,EACtB,EAEQ,YAAAgG,eAAR,SAAuB/F,EAAkBxC,GACvC,IAAMN,EAAYzF,KAAKmO,aAAa5F,EAASxC,GAEvCE,GAAQ,IAAAsI,mBAAkB9I,GAEhC,OAAIzF,KAAKmM,qBACAnM,KAAKmM,qBAAqB5D,EAASxC,EAAYE,GAGjDA,CACT,EAMA,YAAAuI,aAAA,SACElG,EACAvC,QAAA,IAAAA,IAAAA,EAAA,IAEA,IACE,IAqBQ0I,EArBFjK,EAA4B,iBAAf8D,EAA0BA,EAAaA,EAAW9D,IAErE,GAAIxE,KAAKwM,gBAAkBxM,KAAKwM,eAAehI,SAGvB,KAFhBiK,EAASzO,KAAKwM,eAAehI,GAAKiG,WAQtC,OALAzK,KAAKiK,OAAOU,MAAM,yBAA0B,CAC1CrC,WAAY9D,EACZiG,UAAWgE,IAGNA,EAIX,GACEzO,KAAK0M,WACJ1M,KAAK0M,SAASC,OACf3M,KAAKoM,iBACLpM,KAAKoM,gBAAgB5H,SAIC,KAFhBiK,EAASzO,KAAKoM,gBAAgB5H,GAAKiG,WAQvC,OALAzK,KAAKiK,OAAOU,MAAM,0BAA2B,CAC3CrC,WAAY9D,EACZiG,UAAWgE,IAGNA,EAIX,IAAMlG,EAAUvI,KAAKqI,WAAWC,GAEhC,IAAKC,EAGH,YAFAvI,KAAKiK,OAAO2D,KAAK,gCAAiC,CAAEtF,WAAU,IAKhE,IAAMoG,EAAkB1O,KAAKqM,oBACzBrM,KAAKqM,oBAAoBtG,GACzBA,EAEE4I,GAAkB,IAAAC,oBAAmBrG,EAASmG,EAAiB1O,KAAKgK,gBAE1E,GAAI2E,EAMF,OALA3O,KAAKiK,OAAOU,MAAM,yBAA0B,CAC1CrC,WAAU,EACVmC,UAAWkE,EAAgB1I,QAGtB0I,EAAgB1I,MAGzB,IAAMuD,EAAcxJ,KAAKsO,eAAe/F,EAASmG,GAE3CjE,GAAY,IAAAoE,sBAChBtG,EACAmG,EACAlF,EACAxJ,KAAKgK,eACLhK,KAAKiK,QAGP,OAAKQ,EAUEA,EAAUxE,OATfjG,KAAKiK,OAAOU,MAAM,0BAA2B,CAC3CrC,WAAU,EACVkB,YAAW,EACXiB,UAAWlC,EAAQuG,mBAGdvG,EAAQuG,iB,CAIjB,MAAO1H,GAGP,YAFApH,KAAKiK,OAAO3C,MAAM,eAAgB,CAAEgB,WAAU,EAAEhB,MAAOF,G,CAI3D,EAEA,YAAA2H,oBAAA,SACEzG,EACAvC,GAIA,YAJA,IAAAA,IAAAA,EAAA,IAIO+F,EAFgB9L,KAAKwO,aAAalG,EAAYvC,GAEf,UACxC,EAEA,YAAAiJ,mBAAA,SACE1G,EACAvC,GAIA,YAJA,IAAAA,IAAAA,EAAA,IAIO+F,EAFgB9L,KAAKwO,aAAalG,EAAYvC,GAEf,SACxC,EAEA,YAAAkJ,oBAAA,SACE3G,EACAvC,GAIA,YAJA,IAAAA,IAAAA,EAAA,IAIO+F,EAFgB9L,KAAKwO,aAAalG,EAAYvC,GAEf,UACxC,EAEA,YAAAmJ,mBAAA,SACE5G,EACAvC,GAIA,YAJA,IAAAA,IAAAA,EAAA,IAIO+F,EAFgB9L,KAAKwO,aAAalG,EAAYvC,GAEf,SACxC,EAKA,YAAAoJ,SAAA,SAAS7G,EAAwBvC,QAAA,IAAAA,IAAAA,EAAA,IAC/B,IACE,IAAM8E,EAAiB7K,KAAKwO,aAAalG,EAAYvC,GAErD,QAA8B,IAAnB8E,EACT,OAGF,IAAM,EAAkB7K,KAAKqM,oBACzBrM,KAAKqM,oBAAoBtG,GACzBA,EAEE,EAAgC,CAAC,EAoBvC,OAlB+B/F,KAAKgK,eACjClC,mBACAsH,QAAO,SAAC/L,GAAM,OAAc,IAAdA,EAAEgM,OAAF,IAEMnG,SAAQ,SAAC7F,QACQ,IAA3B,EAAgBA,EAAEmB,OAC3B,EAAkBnB,EAAEmB,KAAOuB,EAAW1C,EAAEmB,KAE5C,IAEAxE,KAAKyM,QAAQtD,KACX,aACAb,EACAuC,EACA,EACA,GAGKA,C,CACP,MAAOzD,GAGP,YAFApH,KAAKiK,OAAO3C,MAAM,WAAY,CAAEgB,WAAU,EAAEhB,MAAOF,G,CAIvD,EAEA,YAAAkI,gBAAA,SAAgBhH,EAAwBvC,GAGtC,YAHsC,IAAAA,IAAAA,EAAA,IAG/B+F,EAFgB9L,KAAKmP,SAAS7G,EAAYvC,GAEX,UACxC,EAEA,YAAAwJ,eAAA,SAAejH,EAAwBvC,GAGrC,YAHqC,IAAAA,IAAAA,EAAA,IAG9B+F,EAFgB9L,KAAKmP,SAAS7G,EAAYvC,GAEX,SACxC,EAEA,YAAAyJ,gBAAA,SAAgBlH,EAAwBvC,GAGtC,YAHsC,IAAAA,IAAAA,EAAA,IAG/B+F,EAFgB9L,KAAKmP,SAAS7G,EAAYvC,GAEX,UACxC,EAEA,YAAA0J,eAAA,SAAenH,EAAwBvC,GAGrC,YAHqC,IAAAA,IAAAA,EAAA,IAG9B+F,EAFgB9L,KAAKmP,SAAS7G,EAAYvC,GAEX,SACxC,EAMA,YAAA2J,YAAA,SACEpH,EACA2C,EACAlF,QAAA,IAAAA,IAAAA,EAAA,IAEA,IACE,IAsBQ0I,EAtBFjK,EAA4B,iBAAf8D,EAA0BA,EAAaA,EAAW9D,IAErE,GAAIxE,KAAKwM,gBAAkBxM,KAAKwM,eAAehI,IAAQxE,KAAKwM,eAAehI,GAAKuG,gBAGxD,KAFhB0D,EAASzO,KAAKwM,eAAehI,GAAKuG,UAAUE,IAQhD,OALAjL,KAAKiK,OAAOU,MAAM,wBAAyB,CACzCrC,WAAY9D,EACZyG,YAAW,IAGNwD,EAIX,GACEzO,KAAK0M,WACJ1M,KAAK0M,SAASC,OACf3M,KAAKoM,iBACLpM,KAAKoM,gBAAgB5H,IACrBxE,KAAKoM,gBAAgB5H,GAAKuG,gBAIJ,KAFhB0D,EAASzO,KAAKoM,gBAAgB5H,GAAKuG,UAAUE,IAQjD,OALAjL,KAAKiK,OAAOU,MAAM,yBAA0B,CAC1CrC,WAAY9D,EACZyG,YAAW,IAGNwD,EAIX,IAAMlG,EAAUvI,KAAKqI,WAAWC,GAEhC,IAAKC,EAGH,YAFAvI,KAAKiK,OAAO2D,KAAK,gCAAiC,CAAEtF,WAAU,EAAE2C,YAAW,IAK7E,IAAMH,EAAiBxE,MAAMC,QAAQgC,EAAQoH,iBACzCpH,EAAQoH,gBAAgB1H,MAAK,SAAC3F,GAAM,OAAAA,EAAEkC,MAAQyG,CAAV,SACpCe,EAEJ,IAAKlB,EAGH,YAFA9K,KAAKiK,OAAO2D,KAAK,4BAA6B,CAAEtF,WAAU,EAAE2C,YAAW,IAKzE,IAAMyD,EAAkB1O,KAAKqM,oBACzBrM,KAAKqM,oBAAoBtG,GACzBA,EAEE6J,GAAsB,IAAAC,wBAC1BtH,EACAuC,EACA4D,EACA1O,KAAKgK,gBAGP,QAAmC,IAAxB4F,EAGT,OAFA5P,KAAKiK,OAAOU,MAAM,8BAA+B,CAAErC,WAAU,EAAE2C,YAAW,IAEnE2E,EAGT,IAAMpG,EAAcxJ,KAAKsO,eAAe/F,EAASmG,GAEjD,OAAO,IAAAoB,0BACLvH,EACAuC,EACA4D,EACAlF,EACAxJ,KAAKgK,eACLhK,KAAKiK,O,CAEP,MAAO7C,GAGP,YAFApH,KAAKiK,OAAO3C,MAAM,cAAe,CAAEgB,WAAU,EAAE2C,YAAW,EAAE3D,MAAOF,G,CAIvE,EAEA,YAAA2I,mBAAA,SACEzH,EACA2C,EACAlF,GAIA,YAJA,IAAAA,IAAAA,EAAA,IAIO+F,EAFe9L,KAAK0P,YAAYpH,EAAY2C,EAAalF,GAE3B,UACvC,EAEA,YAAAiK,kBAAA,SACE1H,EACA2C,EACAlF,GAIA,YAJA,IAAAA,IAAAA,EAAA,IAIO+F,EAFe9L,KAAK0P,YAAYpH,EAAY2C,EAAalF,GAE3B,SACvC,EAEA,YAAAkK,mBAAA,SACE3H,EACA2C,EACAlF,GAIA,YAJA,IAAAA,IAAAA,EAAA,IAIO+F,EAFe9L,KAAK0P,YAAYpH,EAAY2C,EAAalF,GAE3B,UACvC,EAEA,YAAAmK,kBAAA,SACE5H,EACA2C,EACAlF,GAIA,YAJA,IAAAA,IAAAA,EAAA,IAIO+F,EAFe9L,KAAK0P,YAAYpH,EAAY2C,EAAalF,GAE3B,SACvC,EAEA,YAAAoK,iBAAA,SACE7H,EACA2C,EACAlF,GAIA,YAJA,IAAAA,IAAAA,EAAA,IAIO+F,EAFe9L,KAAK0P,YAAYpH,EAAY2C,EAAalF,GAE3B,QACvC,EAEA,YAAAqK,kBAAA,SACE9H,EACA2C,EACAlF,GAIA,YAJA,IAAAA,IAAAA,EAAA,IAIO+F,EAFe9L,KAAK0P,YAAYpH,EAAY2C,EAAalF,GAE3B,SACvC,EAEA,YAAAsK,gBAAA,SACE/H,EACA2C,EACAlF,GAIA,YAJA,IAAAA,IAAAA,EAAA,IAIO+F,EAFe9L,KAAK0P,YAAYpH,EAAY2C,EAAalF,GAE3B,OACvC,EACF,EAvkBA,GAAa,EAAAuK,qBAAAA,EAykBb,0BAA+BpE,GAC7B,OAAO,IAAIoE,EAAqBpE,EAClC,C,iKCtqBa,EAAAqE,aAAe,iBAEf,EAAAC,iBAA+B,CAM1C,OACA,SAGW,EAAAC,kBAAgC,SAC3CC,EACAC,EACAC,GAEA,YAFA,IAAAA,IAAAA,EAAA,IAEQF,GACN,IAAK,QACHrJ,QAAQwJ,IAAI,EAAAN,aAAcI,EAASC,GACrC,IAAK,OACHvJ,QAAQyG,KAAK,EAAAyC,aAAcI,EAASC,GACtC,IAAK,OACHvJ,QAAQuG,KAAK,EAAA2C,aAAcI,EAASC,GACtC,IAAK,QACHvJ,QAAQC,MAAM,EAAAiJ,aAAcI,EAASC,GAE3C,EAEA,iBAIE,WAAY1E,GACVlM,KAAK8Q,OAAS5E,EAAQ4E,OACtB9Q,KAAK+Q,OAAS7E,EAAQ8E,OACxB,CA2BF,OAzBE,YAAAC,UAAA,SAAUH,GACR9Q,KAAK8Q,OAASA,CAChB,EAEA,YAAAD,IAAA,SAAIH,EAAiBC,EAAqBC,IACJ,IAAhC5Q,KAAK8Q,OAAO7M,QAAQyM,IACtB1Q,KAAK+Q,OAAOL,EAAOC,EAASC,EAEhC,EAEA,YAAAjG,MAAA,SAAMgG,EAAqBC,GACzB5Q,KAAK6Q,IAAI,QAASF,EAASC,EAC7B,EAEA,YAAA9C,KAAA,SAAK6C,EAAqBC,GACxB5Q,KAAK6Q,IAAI,OAAQF,EAASC,EAC5B,EAEA,YAAAhD,KAAA,SAAK+C,EAAqBC,GACxB5Q,KAAK6Q,IAAI,OAAQF,EAASC,EAC5B,EAEA,YAAAtJ,MAAA,SAAMqJ,EAAqBC,GACzB5Q,KAAK6Q,IAAI,QAASF,EAASC,EAC7B,EACF,EAlCA,GAAa,EAAAM,OAAAA,EAoCb,wBAA6BhF,QAAA,IAAAA,IAAAA,EAAA,IAC3B,IAAM4E,EAAS5E,EAAQ4E,QAAU,EAAAN,iBAC3BW,EAAajF,EAAQ8E,SAAW,EAAAP,kBAEtC,OAAO,IAAIS,EAAO,CAAEJ,OAAM,EAAEE,QAASG,GACvC,C,qICpFA,aAGA,SAAgBC,EAAiBhJ,EAAkBrC,GACjD,OAAO,IAAAW,yBAAwB0B,EAAQzB,WAAuCZ,EAChF,CAFA,qBAIA,sCAAgBsE,EACdgH,EACAtL,EACAiE,GAEA,GAAsB,MAAlBqH,EACF,OAAO,EAGT,GAA6B,iBAAlBA,EAA4B,CACrC,IAAMjJ,EAAU4B,EAAe9B,WAAWmJ,GAE1C,QAAIjJ,GACKgJ,EAAiBhJ,EAASrC,E,CAMrC,GAA6B,iBAAlBsL,EAA4B,CACrC,GAAI,QAASA,GAAiB/K,MAAMC,QAAQ8K,EAAczK,KACxD,OAAOyK,EAAczK,IAAIhF,OAAM,SAAC0P,GAC9B,OAAAjH,EAA2BiH,EAAcvL,EAAYiE,EAArD,IAIJ,GAAI,OAAQqH,GAAiB/K,MAAMC,QAAQ8K,EAAcvK,IACvD,OAAOuK,EAAcvK,GAAGrF,MAAK,SAAC6P,GAC5B,OAAAjH,EAA2BiH,EAAcvL,EAAYiE,EAArD,IAIJ,GAAI,QAASqH,GAAiB/K,MAAMC,QAAQ8K,EAActK,KACxD,OAAOsK,EAActK,IAAInF,OACvB,SAAC0P,GACC,OAAyE,IAAzEjH,EAA2BiH,EAAcvL,EAAYiE,EAArD,G,CAKR,QAAI1D,MAAMC,QAAQ8K,IACTA,EAAczP,OAAM,SAAC0P,GAC1B,OAAAjH,EAA2BiH,EAAcvL,EAAYiE,EAArD,GAKN,C,GCtDIuH,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBzF,IAAjB0F,EACH,OAAOA,EAAa9R,QAGrB,IAAIC,EAAS0R,EAAyBE,GAAY,CAGjD7R,QAAS,CAAC,GAOX,OAHA+R,EAAoBF,GAAUG,KAAK/R,EAAOD,QAASC,EAAQA,EAAOD,QAAS4R,GAGpE3R,EAAOD,OACf,C,OCrBA4R,EAAoBK,EAAI,CAACjS,EAASkS,KACjC,IAAI,IAAItN,KAAOsN,EACXN,EAAoBlG,EAAEwG,EAAYtN,KAASgN,EAAoBlG,EAAE1L,EAAS4E,IAC5ET,OAAOgO,eAAenS,EAAS4E,EAAK,CAAEwN,YAAY,EAAMC,IAAKH,EAAWtN,IAE1E,ECNDgN,EAAoBlG,EAAI,CAAC4G,EAAKC,IAAUpO,OAAOqO,UAAUC,eAAeT,KAAKM,EAAKC,GCClFX,EAAoB9Q,EAAKd,IACH,oBAAX0S,QAA0BA,OAAOC,aAC1CxO,OAAOgO,eAAenS,EAAS0S,OAAOC,YAAa,CAAEtM,MAAO,WAE7DlC,OAAOgO,eAAenS,EAAS,aAAc,CAAEqG,OAAO,GAAO,ECFpCuL,EAAoB,G","sources":["webpack://FeaturevisorSDK/webpack/universalModuleDefinition","webpack://FeaturevisorSDK/../../node_modules/compare-versions/lib/esm/index.js","webpack://FeaturevisorSDK/../../node_modules/murmurhash/murmurhash.js","webpack://FeaturevisorSDK/./src/bucket.ts","webpack://FeaturevisorSDK/./src/conditions.ts","webpack://FeaturevisorSDK/./src/datafileReader.ts","webpack://FeaturevisorSDK/./src/emitter.ts","webpack://FeaturevisorSDK/./src/feature.ts","webpack://FeaturevisorSDK/./src/index.ts","webpack://FeaturevisorSDK/./src/instance.ts","webpack://FeaturevisorSDK/./src/logger.ts","webpack://FeaturevisorSDK/./src/segments.ts","webpack://FeaturevisorSDK/webpack/bootstrap","webpack://FeaturevisorSDK/webpack/runtime/define property getters","webpack://FeaturevisorSDK/webpack/runtime/hasOwnProperty shorthand","webpack://FeaturevisorSDK/webpack/runtime/make namespace object","webpack://FeaturevisorSDK/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"FeaturevisorSDK\"] = factory();\n\telse\n\t\troot[\"FeaturevisorSDK\"] = factory();\n})(this, () => {\nreturn ","/**\n * Compare [semver](https://semver.org/) version strings to find greater, equal or lesser.\n * This library supports the full semver specification, including comparing versions with different number of digits like `1.0.0`, `1.0`, `1`, and pre-release versions like `1.0.0-alpha`.\n * @param v1 - First version to compare\n * @param v2 - Second version to compare\n * @returns Numeric value compatible with the [Array.sort(fn) interface](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Parameters).\n */\nexport const compareVersions = (v1, v2) => {\n // validate input and split into segments\n const n1 = validateAndParse(v1);\n const n2 = validateAndParse(v2);\n // pop off the patch\n const p1 = n1.pop();\n const p2 = n2.pop();\n // validate numbers\n const r = compareSegments(n1, n2);\n if (r !== 0)\n return r;\n // validate pre-release\n if (p1 && p2) {\n return compareSegments(p1.split('.'), p2.split('.'));\n }\n else if (p1 || p2) {\n return p1 ? -1 : 1;\n }\n return 0;\n};\n/**\n * Validate [semver](https://semver.org/) version strings.\n *\n * @param version Version number to validate\n * @returns `true` if the version number is a valid semver version number, `false` otherwise.\n *\n * @example\n * ```\n * validate('1.0.0-rc.1'); // return true\n * validate('1.0-rc.1'); // return false\n * validate('foo'); // return false\n * ```\n */\nexport const validate = (version) => typeof version === 'string' && /^[v\\d]/.test(version) && semver.test(version);\n/**\n * Compare [semver](https://semver.org/) version strings using the specified operator.\n *\n * @param v1 First version to compare\n * @param v2 Second version to compare\n * @param operator Allowed arithmetic operator to use\n * @returns `true` if the comparison between the firstVersion and the secondVersion satisfies the operator, `false` otherwise.\n *\n * @example\n * ```\n * compare('10.1.8', '10.0.4', '>'); // return true\n * compare('10.0.1', '10.0.1', '='); // return true\n * compare('10.1.1', '10.2.2', '<'); // return true\n * compare('10.1.1', '10.2.2', '<='); // return true\n * compare('10.1.1', '10.2.2', '>='); // return false\n * ```\n */\nexport const compare = (v1, v2, operator) => {\n // validate input operator\n assertValidOperator(operator);\n // since result of compareVersions can only be -1 or 0 or 1\n // a simple map can be used to replace switch\n const res = compareVersions(v1, v2);\n return operatorResMap[operator].includes(res);\n};\n/**\n * Match [npm semver](https://docs.npmjs.com/cli/v6/using-npm/semver) version range.\n *\n * @param version Version number to match\n * @param range Range pattern for version\n * @returns `true` if the version number is within the range, `false` otherwise.\n *\n * @example\n * ```\n * satisfies('1.1.0', '^1.0.0'); // return true\n * satisfies('1.1.0', '~1.0.0'); // return false\n * ```\n */\nexport const satisfies = (version, range) => {\n // handle multiple comparators\n if (range.includes('||')) {\n return range.split('||').some((r) => satisfies(version, r));\n }\n else if (range.includes(' ')) {\n return range\n .trim()\n .replace(/\\s{2,}/g, ' ')\n .split(' ')\n .every((r) => satisfies(version, r));\n }\n // if no range operator then \"=\"\n const m = range.match(/^([<>=~^]+)/);\n const op = m ? m[1] : '=';\n // if gt/lt/eq then operator compare\n if (op !== '^' && op !== '~')\n return compare(version, range, op);\n // else range of either \"~\" or \"^\" is assumed\n const [v1, v2, v3, , vp] = validateAndParse(version);\n const [r1, r2, r3, , rp] = validateAndParse(range);\n const v = [v1, v2, v3];\n const r = [r1, r2 !== null && r2 !== void 0 ? r2 : 'x', r3 !== null && r3 !== void 0 ? r3 : 'x'];\n // validate pre-release\n if (rp) {\n if (!vp)\n return false;\n if (compareSegments(v, r) !== 0)\n return false;\n if (compareSegments(vp.split('.'), rp.split('.')) === -1)\n return false;\n }\n // first non-zero number\n const nonZero = r.findIndex((v) => v !== '0') + 1;\n // pointer to where segments can be >=\n const i = op === '~' ? 2 : nonZero > 1 ? nonZero : 1;\n // before pointer must be equal\n if (compareSegments(v.slice(0, i), r.slice(0, i)) !== 0)\n return false;\n // after pointer must be >=\n if (compareSegments(v.slice(i), r.slice(i)) === -1)\n return false;\n return true;\n};\nconst semver = /^[v^~<>=]*?(\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+))?(?:-([\\da-z\\-]+(?:\\.[\\da-z\\-]+)*))?(?:\\+[\\da-z\\-]+(?:\\.[\\da-z\\-]+)*)?)?)?$/i;\nconst validateAndParse = (version) => {\n if (typeof version !== 'string') {\n throw new TypeError('Invalid argument expected string');\n }\n const match = version.match(semver);\n if (!match) {\n throw new Error(`Invalid argument not valid semver ('${version}' received)`);\n }\n match.shift();\n return match;\n};\nconst isWildcard = (s) => s === '*' || s === 'x' || s === 'X';\nconst tryParse = (v) => {\n const n = parseInt(v, 10);\n return isNaN(n) ? v : n;\n};\nconst forceType = (a, b) => typeof a !== typeof b ? [String(a), String(b)] : [a, b];\nconst compareStrings = (a, b) => {\n if (isWildcard(a) || isWildcard(b))\n return 0;\n const [ap, bp] = forceType(tryParse(a), tryParse(b));\n if (ap > bp)\n return 1;\n if (ap < bp)\n return -1;\n return 0;\n};\nconst compareSegments = (a, b) => {\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const r = compareStrings(a[i] || '0', b[i] || '0');\n if (r !== 0)\n return r;\n }\n return 0;\n};\nconst operatorResMap = {\n '>': [1],\n '>=': [0, 1],\n '=': [0],\n '<=': [-1, 0],\n '<': [-1],\n};\nconst allowedOperators = Object.keys(operatorResMap);\nconst assertValidOperator = (op) => {\n if (typeof op !== 'string') {\n throw new TypeError(`Invalid operator type, expected string but got ${typeof op}`);\n }\n if (allowedOperators.indexOf(op) === -1) {\n throw new Error(`Invalid operator, expected one of ${allowedOperators.join('|')}`);\n }\n};\n//# sourceMappingURL=index.js.map","(function(){\n const _global = this;\n\n const createBuffer = (val) => new TextEncoder().encode(val)\n\n /**\n * JS Implementation of MurmurHash2\n *\n * @author <a href=\"mailto:gary.court@gmail.com\">Gary Court</a>\n * @see http://github.com/garycourt/murmurhash-js\n * @author <a href=\"mailto:aappleby@gmail.com\">Austin Appleby</a>\n * @see http://sites.google.com/site/murmurhash/\n *\n * @param {Uint8Array | string} str ASCII only\n * @param {number} seed Positive integer only\n * @return {number} 32-bit positive integer hash\n */\n function MurmurHashV2(str, seed) {\n if (typeof str === 'string') str = createBuffer(str);\n let\n l = str.length,\n h = seed ^ l,\n i = 0,\n k;\n\n while (l >= 4) {\n k =\n ((str[i] & 0xff)) |\n ((str[++i] & 0xff) << 8) |\n ((str[++i] & 0xff) << 16) |\n ((str[++i] & 0xff) << 24);\n\n k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16));\n k ^= k >>> 24;\n k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16));\n\n h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)) ^ k;\n\n l -= 4;\n ++i;\n }\n\n switch (l) {\n case 3: h ^= (str[i + 2] & 0xff) << 16;\n case 2: h ^= (str[i + 1] & 0xff) << 8;\n case 1: h ^= (str[i] & 0xff);\n h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16));\n }\n\n h ^= h >>> 13;\n h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16));\n h ^= h >>> 15;\n\n return h >>> 0;\n };\n\n /*\n * JS Implementation of MurmurHash3 (r136) (as of May 20, 2011)\n *\n * @author <a href=\"mailto:gary.court@gmail.com\">Gary Court</a>\n * @see http://github.com/garycourt/murmurhash-js\n * @author <a href=\"mailto:aappleby@gmail.com\">Austin Appleby</a>\n * @see http://sites.google.com/site/murmurhash/\n *\n * @param {Uint8Array | string} key ASCII only\n * @param {number} seed Positive integer only\n * @return {number} 32-bit positive integer hash\n */\n function MurmurHashV3(key, seed) {\n if (typeof key === 'string') key = createBuffer(key);\n\n let remainder, bytes, h1, h1b, c1, c1b, c2, c2b, k1, i;\n\n remainder = key.length & 3; // key.length % 4\n bytes = key.length - remainder;\n h1 = seed;\n c1 = 0xcc9e2d51;\n c2 = 0x1b873593;\n i = 0;\n\n while (i < bytes) {\n k1 =\n ((key[i] & 0xff)) |\n ((key[++i] & 0xff) << 8) |\n ((key[++i] & 0xff) << 16) |\n ((key[++i] & 0xff) << 24);\n ++i;\n\n k1 = ((((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16))) & 0xffffffff;\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 = ((((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16))) & 0xffffffff;\n\n h1 ^= k1;\n h1 = (h1 << 13) | (h1 >>> 19);\n h1b = ((((h1 & 0xffff) * 5) + ((((h1 >>> 16) * 5) & 0xffff) << 16))) & 0xffffffff;\n h1 = (((h1b & 0xffff) + 0x6b64) + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16));\n }\n\n k1 = 0;\n\n switch (remainder) {\n case 3: k1 ^= (key[i + 2] & 0xff) << 16;\n case 2: k1 ^= (key[i + 1] & 0xff) << 8;\n case 1: k1 ^= (key[i] & 0xff);\n\n k1 = (((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff;\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 = (((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff;\n h1 ^= k1;\n }\n\n h1 ^= key.length;\n\n h1 ^= h1 >>> 16;\n h1 = (((h1 & 0xffff) * 0x85ebca6b) + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff;\n h1 ^= h1 >>> 13;\n h1 = ((((h1 & 0xffff) * 0xc2b2ae35) + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16))) & 0xffffffff;\n h1 ^= h1 >>> 16;\n\n return h1 >>> 0;\n }\n\n const murmur = MurmurHashV3;\n murmur.v2 = MurmurHashV2;\n murmur.v3 = MurmurHashV3;\n\n if (typeof(module) != 'undefined') {\n module.exports = murmur;\n } else {\n const _previousRoot = _global.murmur;\n murmur.noConflict = function() {\n _global.murmur = _previousRoot;\n return murmur;\n }\n _global.murmur = murmur;\n }\n}());\n","import * as murmurhash from \"murmurhash\";\n\nconst HASH_SEED = 1;\nconst MAX_HASH_VALUE = Math.pow(2, 32);\n\nexport const MAX_BUCKETED_NUMBER = 100000; // 100% * 1000 to include three decimal places in the same integer value\n\nexport function getBucketedNumber(bucketKey: string): number {\n const hashValue = murmurhash.v3(bucketKey, HASH_SEED);\n const ratio = hashValue / MAX_HASH_VALUE;\n\n return Math.floor(ratio * MAX_BUCKETED_NUMBER);\n}\n","import { compareVersions } from \"compare-versions\";\n\nimport { Attributes, Condition, PlainCondition } from \"@featurevisor/types\";\n\nexport function conditionIsMatched(condition: PlainCondition, attributes: Attributes): boolean {\n const { attribute, operator, value } = condition;\n\n if (operator === \"equals\") {\n return attributes[attribute] === value;\n } else if (operator === \"notEquals\") {\n return attributes[attribute] !== value;\n } else if (operator === \"before\" || operator === \"after\") {\n // date comparisons\n const valueInAttributes = attributes[attribute] as string | Date;\n\n const dateInAttributes =\n valueInAttributes instanceof Date ? valueInAttributes : new Date(valueInAttributes);\n const dateInCondition = value instanceof Date ? value : new Date(value as string);\n\n return operator === \"before\"\n ? dateInAttributes < dateInCondition\n : dateInAttributes > dateInCondition;\n } else if (typeof attributes[attribute] === \"string\" && Array.isArray(value)) {\n // array\n const valueInAttributes = attributes[attribute] as string;\n\n if (operator === \"in\") {\n return value.indexOf(valueInAttributes) !== -1;\n } else if (operator === \"notIn\") {\n return value.indexOf(valueInAttributes) === -1;\n }\n } else if (typeof attributes[attribute] === \"string\" && typeof value === \"string\") {\n // string\n const valueInAttributes = attributes[attribute] as string;\n\n if (operator === \"contains\") {\n return valueInAttributes.indexOf(value) !== -1;\n } else if (operator === \"notContains\") {\n return valueInAttributes.indexOf(value) === -1;\n } else if (operator === \"startsWith\") {\n return valueInAttributes.startsWith(value);\n } else if (operator === \"endsWith\") {\n return valueInAttributes.endsWith(value);\n } else if (operator === \"semverEquals\") {\n return compareVersions(valueInAttributes, value) === 0;\n } else if (operator === \"semverNotEquals\") {\n return compareVersions(valueInAttributes, value) !== 0;\n } else if (operator === \"semverGreaterThan\") {\n return compareVersions(valueInAttributes, value) === 1;\n } else if (operator === \"semverGreaterThanOrEquals\") {\n return compareVersions(valueInAttributes, value) >= 0;\n } else if (operator === \"semverLessThan\") {\n return compareVersions(valueInAttributes, value) === -1;\n } else if (operator === \"semverLessThanOrEquals\") {\n return compareVersions(valueInAttributes, value) <= 0;\n }\n } else if (typeof attributes[attribute] === \"number\" && typeof value === \"number\") {\n // numeric\n const valueInAttributes = attributes[attribute] as number;\n\n if (operator === \"greaterThan\") {\n return valueInAttributes > value;\n } else if (operator === \"greaterThanOrEquals\") {\n return valueInAttributes >= value;\n } else if (operator === \"lessThan\") {\n return valueInAttributes < value;\n } else if (operator === \"lessThanOrEquals\") {\n return valueInAttributes <= value;\n }\n }\n\n return false;\n}\n\nexport function allConditionsAreMatched(\n conditions: Condition[] | Condition,\n attributes: Attributes,\n): boolean {\n if (\"attribute\" in conditions) {\n return conditionIsMatched(conditions, attributes);\n }\n\n if (\"and\" in conditions && Array.isArray(conditions.and)) {\n return conditions.and.every((c) => allConditionsAreMatched(c, attributes));\n }\n\n if (\"or\" in conditions && Array.isArray(conditions.or)) {\n return conditions.or.some((c) => allConditionsAreMatched(c, attributes));\n }\n\n if (\"not\" in conditions && Array.isArray(conditions.not)) {\n return conditions.not.every(\n (c) =>\n allConditionsAreMatched(\n {\n and: conditions.not,\n },\n attributes,\n ) === false,\n );\n }\n\n if (Array.isArray(conditions)) {\n return conditions.every((c) => allConditionsAreMatched(c, attributes));\n }\n\n return false;\n}\n","import {\n Feature,\n Segment,\n DatafileContent,\n Attribute,\n AttributeKey,\n SegmentKey,\n FeatureKey,\n} from \"@featurevisor/types\";\n\nexport function parseJsonConditionsIfStringified<T>(record: T, key: string): T {\n if (typeof record[key] === \"string\" && record[key] !== \"*\") {\n try {\n record[key] = JSON.parse(record[key]);\n } catch (e) {\n console.error(\"Error parsing JSON\", e);\n }\n }\n\n return record;\n}\n\nexport class DatafileReader {\n private schemaVersion: string;\n private revision: string;\n private attributes: Attribute[];\n private segments: Segment[];\n private features: Feature[];\n\n constructor(datafileJson: DatafileContent) {\n this.schemaVersion = datafileJson.schemaVersion;\n this.revision = datafileJson.revision;\n this.segments = datafileJson.segments;\n this.attributes = datafileJson.attributes;\n this.features = datafileJson.features;\n }\n\n getRevision(): string {\n return this.revision;\n }\n\n getSchemaVersion(): string {\n return this.schemaVersion;\n }\n\n getAllAttributes(): Attribute[] {\n return this.attributes;\n }\n\n getAttribute(attributeKey: AttributeKey): Attribute | undefined {\n return this.attributes.find((a) => a.key === attributeKey);\n }\n\n getSegment(segmentKey: SegmentKey): Segment | undefined {\n const segment = this.segments.find((s) => s.key === segmentKey);\n\n if (!segment) {\n return undefined;\n }\n\n return parseJsonConditionsIfStringified(segment, \"conditions\");\n }\n\n getFeature(featureKey: FeatureKey): Feature | undefined {\n const feature = this.features.find((s) => s.key === featureKey);\n\n if (!feature) {\n return undefined;\n }\n\n return feature;\n }\n}\n","export type EventName = \"ready\" | \"refresh\" | \"update\" | \"activation\";\n\nexport interface Listeners {\n [key: string]: Function[];\n}\n\nexport class Emitter {\n private _listeners: Listeners;\n\n constructor() {\n this._listeners = {};\n }\n\n public addListener(eventName: EventName, fn: Function): void {\n if (typeof this._listeners[eventName] === \"undefined\") {\n this._listeners[eventName] = [];\n }\n\n this._listeners[eventName].push(fn);\n }\n\n public removeListener(eventName: EventName, fn: Function): void {\n if (typeof this._listeners[eventName] === \"undefined\") {\n return;\n }\n\n const index = this._listeners[eventName].indexOf(fn);\n\n if (index !== -1) {\n this._listeners[eventName].splice(index, 1);\n }\n }\n\n public removeAllListeners(eventName?: EventName): void {\n if (eventName) {\n this._listeners[eventName] = [];\n } else {\n Object.keys(this._listeners).forEach((key) => {\n this._listeners[key] = [];\n });\n }\n }\n\n public emit(eventName: EventName, ...args: any[]): void {\n if (typeof this._listeners[eventName] === \"undefined\") {\n return;\n }\n\n this._listeners[eventName].forEach((fn) => {\n fn(...args);\n });\n }\n}\n","import {\n Allocation,\n Attributes,\n Traffic,\n Feature,\n Variation,\n VariableValue,\n Force,\n} from \"@featurevisor/types\";\nimport { DatafileReader } from \"./datafileReader\";\nimport { allGroupSegmentsAreMatched } from \"./segments\";\nimport { allConditionsAreMatched } from \"./conditions\";\nimport { VariableSchema } from \"@featurevisor/types/src\";\nimport { Logger } from \"./logger\";\n\n/**\n * Traffic\n */\nexport function getMatchedAllocation(\n traffic: Traffic,\n bucketValue: number,\n): Allocation | undefined {\n let total = 0; // @TODO: remove it in next breaking semver\n const usePercentage =\n traffic.allocation.length > 0 && typeof traffic.allocation[0].range === \"undefined\"; // @TODO: remove it in next breaking semver\n\n for (const allocation of traffic.allocation) {\n if (\n allocation.range &&\n allocation.range.start <= bucketValue &&\n allocation.range.end >= bucketValue\n ) {\n return allocation;\n }\n\n // @TODO: remove it in next breaking semver\n if (usePercentage) {\n total += allocation.percentage || 0;\n if (bucketValue <= total) {\n return allocation;\n }\n }\n }\n\n return undefined;\n}\n\nexport interface MatchedTrafficAndAllocation {\n matchedTraffic: Traffic | undefined;\n matchedAllocation: Allocation | undefined;\n}\n\nexport function getMatchedTrafficAndAllocation(\n traffic: Traffic[],\n attributes: Attributes,\n bucketValue: number,\n datafileReader: DatafileReader,\n logger: Logger,\n): MatchedTrafficAndAllocation {\n let matchedAllocation: Allocation | undefined;\n\n const matchedTraffic = traffic.find((t) => {\n if (\n !allGroupSegmentsAreMatched(\n typeof t.segments === \"string\" && t.segments !== \"*\" ? JSON.parse(t.segments) : t.segments,\n attributes,\n datafileReader,\n )\n ) {\n return false;\n }\n\n matchedAllocation = getMatchedAllocation(t, bucketValue);\n\n if (matchedAllocation) {\n return true;\n }\n\n return false;\n });\n\n return {\n matchedTraffic,\n matchedAllocation,\n };\n}\n\n/**\n * Variations and variables\n */\nfunction findForceFromFeature(\n feature: Feature,\n attributes: Attributes,\n datafileReader: DatafileReader,\n): Force | undefined {\n if (!feature.force) {\n return undefined;\n }\n\n return feature.force.find((f: Force) => {\n if (f.conditions) {\n return allConditionsAreMatched(f.conditions, attributes);\n }\n\n if (f.segments) {\n return allGroupSegmentsAreMatched(f.segments, attributes, datafileReader);\n }\n\n return false;\n });\n}\n\nexport function getForcedVariation(\n feature: Feature,\n attributes: Attributes,\n datafileReader: DatafileReader,\n): Variation | undefined {\n const force = findForceFromFeature(feature, attributes, datafileReader);\n\n if (!force || !force.variation) {\n return undefined;\n }\n\n return feature.variations.find((v) => v.value === force.variation);\n}\n\nexport function getBucketedVariation(\n feature: Feature,\n attributes: Attributes,\n bucketValue: number,\n datafileReader: DatafileReader,\n logger: Logger,\n): Variation | undefined {\n const { matchedTraffic, matchedAllocation } = getMatchedTrafficAndAllocation(\n feature.traffic,\n attributes,\n bucketValue,\n datafileReader,\n logger,\n );\n\n if (!matchedTraffic) {\n logger.debug(\"no matched rule found\", {\n featureKey: feature.key,\n bucketValue,\n });\n\n return undefined;\n }\n\n if (matchedTraffic.variation) {\n const variation = feature.variations.find((v) => {\n return v.value === matchedTraffic.variation;\n });\n\n if (variation) {\n logger.debug(\"using variation from rule\", {\n featureKey: feature.key,\n variation: variation.value,\n ruleKey: matchedTraffic.key,\n });\n\n return variation;\n }\n }\n\n if (!matchedAllocation) {\n logger.debug(\"no matched allocation found\", {\n featureKey: feature.key,\n bucketValue,\n });\n\n return undefined;\n }\n\n const variationValue = matchedAllocation.variation;\n\n const variation = feature.variations.find((v) => {\n return v.value === variationValue;\n });\n\n if (!variation) {\n // this should never happen\n logger.debug(\"no matched variation found\", {\n featureKey: feature.key,\n variation: variationValue,\n bucketValue,\n });\n\n return undefined;\n }\n\n logger.debug(\"matched variation\", {\n featureKey: feature.key,\n variation: variation.value,\n bucketValue,\n });\n\n return variation;\n}\n\nexport function getForcedVariableValue(\n feature: Feature,\n variableSchema: VariableSchema,\n attributes: Attributes,\n datafileReader: DatafileReader,\n): VariableValue | undefined {\n const force = findForceFromFeature(feature, attributes, datafileReader);\n\n if (!force || !force.variables) {\n return undefined;\n }\n\n const value = force.variables[variableSchema.key];\n\n if (typeof value === \"string\" && variableSchema.type === \"json\") {\n return JSON.parse(value);\n }\n\n return value;\n}\n\nexport function getBucketedVariableValue(\n feature: Feature,\n variableSchema: VariableSchema,\n attributes: Attributes,\n bucketValue: number,\n datafileReader: DatafileReader,\n logger: Logger,\n): VariableValue | undefined {\n // get traffic\n const { matchedTraffic, matchedAllocation } = getMatchedTrafficAndAllocation(\n feature.traffic,\n attributes,\n bucketValue,\n datafileReader,\n logger,\n );\n\n if (!matchedTraffic) {\n logger.debug(\"no matched rule found\", {\n featureKey: feature.key,\n variableKey: variableSchema.key,\n bucketValue,\n });\n\n return undefined;\n }\n\n const variableKey = variableSchema.key;\n\n // see if variable is set at traffic/rule level\n if (matchedTraffic.variables && typeof matchedTraffic.variables[variableKey] !== \"undefined\") {\n logger.debug(\"using variable from rule\", {\n featureKey: feature.key,\n variableKey,\n bucketValue,\n });\n\n return matchedTraffic.variables[variableKey];\n }\n\n if (!matchedAllocation) {\n logger.debug(\"no matched allocation found\", {\n featureKey: feature.key,\n variableKey,\n bucketValue,\n });\n\n return undefined;\n }\n\n const variationValue = matchedAllocation.variation;\n\n const variation = feature.variations.find((v) => {\n return v.value === variationValue;\n });\n\n if (!variation) {\n // this should never happen\n logger.debug(\"no matched variation found\", {\n feature: feature.key,\n variableKey,\n variation: variationValue,\n bucketValue,\n });\n\n return undefined;\n }\n\n const variableFromVariation = variation.variables?.find((v) => {\n return v.key === variableKey;\n });\n\n if (!variableFromVariation) {\n logger.debug(\"using default value as variation has no variable\", {\n featureKey: feature.key,\n variableKey,\n variation: variationValue,\n bucketValue,\n });\n\n if (variableSchema.type === \"json\") {\n return JSON.parse(variableSchema.defaultValue as string);\n }\n\n return variableSchema.defaultValue;\n }\n\n if (variableFromVariation.overrides) {\n const override = variableFromVariation.overrides.find((o) => {\n if (o.conditions) {\n return allConditionsAreMatched(\n typeof o.conditions === \"string\" ? JSON.parse(o.conditions) : o.conditions,\n attributes,\n );\n }\n\n if (o.segments) {\n return allGroupSegmentsAreMatched(\n typeof o.segments === \"string\" && o.segments !== \"*\"\n ? JSON.parse(o.segments)\n : o.segments,\n attributes,\n datafileReader,\n );\n }\n\n return false;\n });\n\n if (override) {\n logger.debug(\"using override value from variation\", {\n feature: feature.key,\n variableKey,\n variation: variationValue,\n bucketValue,\n });\n\n if (variableSchema.type === \"json\") {\n return JSON.parse(override.value as string);\n }\n\n return override.value;\n }\n }\n\n logger.debug(\"using value from variation\", {\n feature: feature.key,\n variableKey,\n variation: variationValue,\n bucketValue,\n });\n\n if (variableSchema.type === \"json\") {\n return JSON.parse(variableFromVariation.value as string);\n }\n\n return variableFromVariation.value;\n}\n","export * from \"./bucket\";\nexport * from \"./instance\";\nexport * from \"./logger\";\n","import {\n Attributes,\n BucketKey,\n BucketValue,\n DatafileContent,\n Feature,\n FeatureKey,\n InitialFeatures,\n StickyFeatures,\n VariableType,\n VariableValue,\n VariationType,\n VariationValue,\n} from \"@featurevisor/types\";\n\nimport { createLogger, Logger } from \"./logger\";\nimport { DatafileReader } from \"./datafileReader\";\nimport { Emitter } from \"./emitter\";\nimport { getBucketedNumber } from \"./bucket\";\nimport {\n getBucketedVariation,\n getBucketedVariableValue,\n getForcedVariation,\n getForcedVariableValue,\n} from \"./feature\";\n\nexport type ReadyCallback = () => void;\n\nexport type ActivationCallback = (\n featureName: string,\n variation: VariationValue,\n attributes: Attributes,\n captureAttributes: Attributes,\n) => void;\n\nexport type ConfigureBucketValue = (feature, attributes, bucketValue: BucketValue) => BucketValue;\n\nexport interface Statuses {\n ready: boolean;\n refreshInProgress: boolean;\n}\n\nexport interface InstanceOptions {\n configureBucketValue?: ConfigureBucketValue;\n datafile?: DatafileContent | string;\n datafileUrl?: string;\n handleDatafileFetch?: (datafileUrl: string) => Promise<DatafileContent>;\n initialFeatures?: InitialFeatures;\n interceptAttributes?: (attributes: Attributes) => Attributes;\n logger?: Logger;\n onActivation?: ActivationCallback;\n onReady?: ReadyCallback;\n onRefresh?: () => void;\n onUpdate?: () => void;\n refreshInterval?: number; // seconds\n stickyFeatures?: StickyFeatures;\n}\n\nconst emptyDatafile: DatafileContent = {\n schemaVersion: \"1\",\n revision: \"unknown\",\n attributes: [],\n segments: [],\n features: [],\n};\n\nexport type DatafileFetchHandler = (datafileUrl: string) => Promise<DatafileContent>;\n\nfunction fetchDatafileContent(\n datafileUrl,\n handleDatafileFetch?: DatafileFetchHandler,\n): Promise<DatafileContent> {\n if (handleDatafileFetch) {\n return handleDatafileFetch(datafileUrl);\n }\n\n return fetch(datafileUrl).then((res) => res.json());\n}\n\ntype FieldType = VariationType | VariableType;\ntype ValueType = VariableValue;\n\nexport function getValueByType(value: ValueType, fieldType: FieldType): ValueType {\n if (value === undefined) {\n return undefined;\n }\n\n switch (fieldType) {\n case \"string\":\n return typeof value === \"string\" ? value : undefined;\n case \"integer\":\n return parseInt(value as string, 10);\n case \"double\":\n return parseFloat(value as string);\n case \"boolean\":\n return value === true;\n case \"array\":\n return Array.isArray(value) ? value : undefined;\n case \"object\":\n return typeof value === \"object\" ? value : undefined;\n // @NOTE: `json` is not handled here intentionally\n default:\n return value;\n }\n}\n\nexport class FeaturevisorInstance {\n // from options\n private configureBucketValue?: ConfigureBucketValue;\n private datafileUrl?: string;\n private handleDatafileFetch?: DatafileFetchHandler;\n private initialFeatures?: InitialFeatures;\n private interceptAttributes?: (attributes: Attributes) => Attributes;\n private logger: Logger;\n private refreshInterval?: number; // seconds\n private stickyFeatures?: StickyFeatures;\n\n // internally created\n private datafileReader: DatafileReader;\n private emitter: Emitter;\n private statuses: Statuses;\n private intervalId?: ReturnType<typeof setInterval>;\n\n // exposed from emitter\n public on: Emitter[\"addListener\"];\n public addListener: Emitter[\"addListener\"];\n public off: Emitter[\"removeListener\"];\n public removeListener: Emitter[\"removeListener\"];\n public removeAllListeners: Emitter[\"removeAllListeners\"];\n\n constructor(options: InstanceOptions) {\n // from options\n this.configureBucketValue = options.configureBucketValue;\n this.datafileUrl = options.datafileUrl;\n this.handleDatafileFetch = options.handleDatafileFetch;\n this.initialFeatures = options.initialFeatures;\n this.interceptAttributes = options.interceptAttributes;\n this.logger = options.logger || createLogger();\n this.refreshInterval = options.refreshInterval;\n this.stickyFeatures = options.stickyFeatures;\n\n // internal\n this.emitter = new Emitter();\n this.statuses = {\n ready: false,\n refreshInProgress: false,\n };\n\n // register events\n if (options.onReady) {\n this.emitter.addListener(\"ready\", options.onReady);\n }\n\n if (options.onRefresh) {\n this.emitter.addListener(\"refresh\", options.onRefresh);\n }\n\n if (options.onUpdate) {\n this.emitter.addListener(\"update\", options.onUpdate);\n }\n\n if (options.onActivation) {\n this.emitter.addListener(\"activation\", options.onActivation);\n }\n\n // expose emitter methods\n const on = this.emitter.addListener.bind(this.emitter);\n this.on = on;\n this.addListener = on;\n\n const off = this.emitter.removeListener.bind(this.emitter);\n this.off = off;\n this.removeListener = off;\n\n this.removeAllListeners = this.emitter.removeAllListeners.bind(this.emitter);\n\n // datafile\n if (options.datafileUrl) {\n this.setDatafile(options.datafile || emptyDatafile);\n\n fetchDatafileContent(options.datafileUrl, options.handleDatafileFetch)\n .then((datafile) => {\n this.setDatafile(datafile);\n\n this.statuses.ready = true;\n this.emitter.emit(\"ready\");\n\n if (this.refreshInterval) {\n this.startRefreshing();\n }\n })\n .catch((e) => {\n this.logger.error(\"failed to fetch datafile\", { error: e });\n });\n } else if (options.datafile) {\n this.setDatafile(options.datafile);\n this.statuses.ready = true;\n\n setTimeout(() => {\n this.emitter.emit(\"ready\");\n }, 0);\n } else {\n throw new Error(\n \"Featurevisor SDK instance cannot be created without both `datafile` and `datafileUrl` options\",\n );\n }\n }\n\n setDatafile(datafile: DatafileContent | string) {\n try {\n this.datafileReader = new DatafileReader(\n typeof datafile === \"string\" ? JSON.parse(datafile) : datafile,\n );\n } catch (e) {\n this.logger.error(\"could not parse datafile\", { error: e });\n }\n }\n\n setStickyFeatures(stickyFeatures: StickyFeatures | undefined) {\n this.stickyFeatures = stickyFeatures;\n }\n\n getRevision(): string {\n return this.datafileReader.getRevision();\n }\n\n private getFeature(featureKey: string | Feature): Feature | undefined {\n return typeof featureKey === \"string\"\n ? this.datafileReader.getFeature(featureKey) // only key provided\n : featureKey; // full feature provided\n }\n\n /**\n * Statuses\n */\n isReady(): boolean {\n return this.statuses.ready;\n }\n\n /**\n * Refresh\n */\n refresh() {\n this.logger.debug(\"refreshing datafile\");\n\n if (this.statuses.refreshInProgress) {\n return this.logger.warn(\"refresh in progress, skipping\");\n }\n\n if (!this.datafileUrl) {\n return this.logger.error(\"cannot refresh since `datafileUrl` is not provided\");\n }\n\n this.statuses.refreshInProgress = true;\n\n fetchDatafileContent(this.datafileUrl, this.handleDatafileFetch)\n .then((datafile) => {\n const currentRevision = this.getRevision();\n const newRevision = datafile.revision;\n const isNotSameRevision = currentRevision !== newRevision;\n\n this.setDatafile(datafile);\n this.logger.info(\"refreshed datafile\");\n\n this.emitter.emit(\"refresh\");\n\n if (isNotSameRevision) {\n this.emitter.emit(\"update\");\n }\n\n this.statuses.refreshInProgress = false;\n })\n .catch((e) => {\n this.logger.error(\"failed to refresh datafile\", { error: e });\n this.statuses.refreshInProgress = false;\n });\n }\n\n startRefreshing() {\n if (!this.datafileUrl) {\n return this.logger.error(\"cannot start refreshing since `datafileUrl` is not provided\");\n }\n\n if (this.intervalId) {\n return this.logger.warn(\"refreshing has already started\");\n }\n\n if (!this.refreshInterval) {\n return this.logger.warn(\"no `refreshInterval` option provided\");\n }\n\n this.intervalId = setInterval(() => {\n this.refresh();\n }, this.refreshInterval * 1000);\n }\n\n stopRefreshing() {\n if (!this.intervalId) {\n return this.logger.warn(\"refreshing has not started yet\");\n }\n\n clearInterval(this.intervalId);\n }\n\n /**\n * Bucketing\n */\n private getBucketKey(feature: Feature, attributes: Attributes): BucketKey {\n const featureKey = feature.key;\n\n const prefix =\n typeof feature.bucketBy === \"string\" ? feature.bucketBy : feature.bucketBy.join(\"_\");\n\n return `${prefix}_${featureKey}`;\n }\n\n private getBucketValue(feature: Feature, attributes: Attributes): BucketValue {\n const bucketKey = this.getBucketKey(feature, attributes);\n\n const value = getBucketedNumber(bucketKey);\n\n if (this.configureBucketValue) {\n return this.configureBucketValue(feature, attributes, value);\n }\n\n return value;\n }\n\n /**\n * Variation\n */\n\n getVariation(\n featureKey: FeatureKey | Feature,\n attributes: Attributes = {},\n ): VariationValue | undefined {\n try {\n const key = typeof featureKey === \"string\" ? featureKey : featureKey.key;\n\n if (this.stickyFeatures && this.stickyFeatures[key]) {\n const result = this.stickyFeatures[key].variation;\n\n if (typeof result !== \"undefined\") {\n this.logger.debug(\"using sticky variation\", {\n featureKey: key,\n variation: result,\n });\n\n return result;\n }\n }\n\n if (\n this.statuses &&\n !this.statuses.ready &&\n this.initialFeatures &&\n this.initialFeatures[key]\n ) {\n const result = this.initialFeatures[key].variation;\n\n if (typeof result !== \"undefined\") {\n this.logger.debug(\"using initial variation\", {\n featureKey: key,\n variation: result,\n });\n\n return result;\n }\n }\n\n const feature = this.getFeature(featureKey);\n\n if (!feature) {\n this.logger.warn(\"feature not found in datafile\", { featureKey });\n\n return undefined;\n }\n\n const finalAttributes = this.interceptAttributes\n ? this.interceptAttributes(attributes)\n : attributes;\n\n const forcedVariation = getForcedVariation(feature, finalAttributes, this.datafileReader);\n\n if (forcedVariation) {\n this.logger.debug(\"forced variation found\", {\n featureKey,\n variation: forcedVariation.value,\n });\n\n return forcedVariation.value;\n }\n\n const bucketValue = this.getBucketValue(feature, finalAttributes);\n\n const variation = getBucketedVariation(\n feature,\n finalAttributes,\n bucketValue,\n this.datafileReader,\n this.logger,\n );\n\n if (!variation) {\n this.logger.debug(\"using default variation\", {\n featureKey,\n bucketValue,\n variation: feature.defaultVariation,\n });\n\n return feature.defaultVariation;\n }\n\n return variation.value;\n } catch (e) {\n this.logger.error(\"getVariation\", { featureKey, error: e });\n\n return undefined;\n }\n }\n\n getVariationBoolean(\n featureKey: FeatureKey | Feature,\n attributes: Attributes = {},\n ): boolean | undefined {\n const variationValue = this.getVariation(featureKey, attributes);\n\n return getValueByType(variationValue, \"boolean\") as boolean | undefined;\n }\n\n getVariationString(\n featureKey: FeatureKey | Feature,\n attributes: Attributes = {},\n ): string | undefined {\n const variationValue = this.getVariation(featureKey, attributes);\n\n return getValueByType(variationValue, \"string\") as string | undefined;\n }\n\n getVariationInteger(\n featureKey: FeatureKey | Feature,\n attributes: Attributes = {},\n ): number | undefined {\n const variationValue = this.getVariation(featureKey, attributes);\n\n return getValueByType(variationValue, \"integer\") as number | undefined;\n }\n\n getVariationDouble(\n featureKey: FeatureKey | Feature,\n attributes: Attributes = {},\n ): number | undefined {\n const variationValue = this.getVariation(featureKey, attributes);\n\n return getValueByType(variationValue, \"double\") as number | undefined;\n }\n\n /**\n * Activate\n */\n activate(featureKey: FeatureKey, attributes: Attributes = {}): VariationValue | undefined {\n try {\n const variationValue = this.getVariation(featureKey, attributes);\n\n if (typeof variationValue === \"undefined\") {\n return undefined;\n }\n\n const finalAttributes = this.interceptAttributes\n ? this.interceptAttributes(attributes)\n : attributes;\n\n const captureAttributes: Attributes = {};\n\n const attributesForCapturing = this.datafileReader\n .getAllAttributes()\n .filter((a) => a.capture === true);\n\n attributesForCapturing.forEach((a) => {\n if (typeof finalAttributes[a.key] !== \"undefined\") {\n captureAttributes[a.key] = attributes[a.key];\n }\n });\n\n this.emitter.emit(\n \"activation\",\n featureKey,\n variationValue,\n finalAttributes,\n captureAttributes,\n );\n\n return variationValue;\n } catch (e) {\n this.logger.error(\"activate\", { featureKey, error: e });\n\n return undefined;\n }\n }\n\n activateBoolean(featureKey: FeatureKey, attributes: Attributes = {}): boolean | undefined {\n const variationValue = this.activate(featureKey, attributes);\n\n return getValueByType(variationValue, \"boolean\") as boolean | undefined;\n }\n\n activateString(featureKey: FeatureKey, attributes: Attributes = {}): string | undefined {\n const variationValue = this.activate(featureKey, attributes);\n\n return getValueByType(variationValue, \"string\") as string | undefined;\n }\n\n activateInteger(featureKey: FeatureKey, attributes: Attributes = {}): number | undefined {\n const variationValue = this.activate(featureKey, attributes);\n\n return getValueByType(variationValue, \"integer\") as number | undefined;\n }\n\n activateDouble(featureKey: FeatureKey, attributes: Attributes = {}): number | undefined {\n const variationValue = this.activate(featureKey, attributes);\n\n return getValueByType(variationValue, \"double\") as number | undefined;\n }\n\n /**\n * Variable\n */\n\n getVariable(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): VariableValue | undefined {\n try {\n const key = typeof featureKey === \"string\" ? featureKey : featureKey.key;\n\n if (this.stickyFeatures && this.stickyFeatures[key] && this.stickyFeatures[key].variables) {\n const result = this.stickyFeatures[key].variables[variableKey];\n\n if (typeof result !== \"undefined\") {\n this.logger.debug(\"using sticky variable\", {\n featureKey: key,\n variableKey,\n });\n\n return result;\n }\n }\n\n if (\n this.statuses &&\n !this.statuses.ready &&\n this.initialFeatures &&\n this.initialFeatures[key] &&\n this.initialFeatures[key].variables\n ) {\n const result = this.initialFeatures[key].variables[variableKey];\n\n if (typeof result !== \"undefined\") {\n this.logger.debug(\"using initial variable\", {\n featureKey: key,\n variableKey,\n });\n\n return result;\n }\n }\n\n const feature = this.getFeature(featureKey);\n\n if (!feature) {\n this.logger.warn(\"feature not found in datafile\", { featureKey, variableKey });\n\n return undefined;\n }\n\n const variableSchema = Array.isArray(feature.variablesSchema)\n ? feature.variablesSchema.find((v) => v.key === variableKey)\n : undefined;\n\n if (!variableSchema) {\n this.logger.warn(\"variable schema not found\", { featureKey, variableKey });\n\n return undefined;\n }\n\n const finalAttributes = this.interceptAttributes\n ? this.interceptAttributes(attributes)\n : attributes;\n\n const forcedVariableValue = getForcedVariableValue(\n feature,\n variableSchema,\n finalAttributes,\n this.datafileReader,\n );\n\n if (typeof forcedVariableValue !== \"undefined\") {\n this.logger.debug(\"forced variable value found\", { featureKey, variableKey });\n\n return forcedVariableValue;\n }\n\n const bucketValue = this.getBucketValue(feature, finalAttributes);\n\n return getBucketedVariableValue(\n feature,\n variableSchema,\n finalAttributes,\n bucketValue,\n this.datafileReader,\n this.logger,\n );\n } catch (e) {\n this.logger.error(\"getVariable\", { featureKey, variableKey, error: e });\n\n return undefined;\n }\n }\n\n getVariableBoolean(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): boolean | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"boolean\") as boolean | undefined;\n }\n\n getVariableString(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): string | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"string\") as string | undefined;\n }\n\n getVariableInteger(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): number | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"integer\") as number | undefined;\n }\n\n getVariableDouble(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): number | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"double\") as number | undefined;\n }\n\n getVariableArray(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): string[] | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"array\") as string[] | undefined;\n }\n\n getVariableObject<T>(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): T | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"object\") as T | undefined;\n }\n\n getVariableJSON<T>(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): T | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"json\") as T | undefined;\n }\n}\n\nexport function createInstance(options: InstanceOptions): FeaturevisorInstance {\n return new FeaturevisorInstance(options);\n}\n","export type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport type LogMessage = string;\n\nexport interface LogDetails {\n [key: string]: any;\n}\n\nexport type LogHandler = (level: LogLevel, message: LogMessage, details?: LogDetails) => void;\n\nexport interface CreateLoggerOptions {\n levels?: LogLevel[];\n handler?: LogHandler;\n}\n\nexport const loggerPrefix = \"[Featurevisor]\";\n\nexport const defaultLogLevels: LogLevel[] = [\n // supported, but not enabled by default\n // \"debug\",\n // \"info\",\n\n // enabled by default\n \"warn\",\n \"error\",\n];\n\nexport const defaultLogHandler: LogHandler = function defaultLogHandler(\n level,\n message,\n details = {},\n) {\n switch (level) {\n case \"debug\":\n console.log(loggerPrefix, message, details);\n case \"info\":\n console.info(loggerPrefix, message, details);\n case \"warn\":\n console.warn(loggerPrefix, message, details);\n case \"error\":\n console.error(loggerPrefix, message, details);\n }\n};\n\nexport class Logger {\n private levels: LogLevel[];\n private handle: LogHandler;\n\n constructor(options: CreateLoggerOptions) {\n this.levels = options.levels as LogLevel[];\n this.handle = options.handler as LogHandler;\n }\n\n setLevels(levels: LogLevel[]) {\n this.levels = levels;\n }\n\n log(level: LogLevel, message: LogMessage, details?: LogDetails) {\n if (this.levels.indexOf(level) !== -1) {\n this.handle(level, message, details);\n }\n }\n\n debug(message: LogMessage, details?: LogDetails) {\n this.log(\"debug\", message, details);\n }\n\n info(message: LogMessage, details?: LogDetails) {\n this.log(\"info\", message, details);\n }\n\n warn(message: LogMessage, details?: LogDetails) {\n this.log(\"warn\", message, details);\n }\n\n error(message: LogMessage, details?: LogDetails) {\n this.log(\"error\", message, details);\n }\n}\n\nexport function createLogger(options: CreateLoggerOptions = {}): Logger {\n const levels = options.levels || defaultLogLevels;\n const logHandler = options.handler || defaultLogHandler;\n\n return new Logger({ levels, handler: logHandler });\n}\n","import { Attributes, GroupSegment, Segment, Condition } from \"@featurevisor/types\";\nimport { allConditionsAreMatched } from \"./conditions\";\nimport { DatafileReader } from \"./datafileReader\";\n\nexport function segmentIsMatched(segment: Segment, attributes: Attributes): boolean {\n return allConditionsAreMatched(segment.conditions as Condition | Condition[], attributes);\n}\n\nexport function allGroupSegmentsAreMatched(\n groupSegments: GroupSegment | GroupSegment[] | \"*\",\n attributes: Attributes,\n datafileReader: DatafileReader,\n): boolean {\n if (groupSegments === \"*\") {\n return true;\n }\n\n if (typeof groupSegments === \"string\") {\n const segment = datafileReader.getSegment(groupSegments);\n\n if (segment) {\n return segmentIsMatched(segment, attributes);\n }\n\n return false;\n }\n\n if (typeof groupSegments === \"object\") {\n if (\"and\" in groupSegments && Array.isArray(groupSegments.and)) {\n return groupSegments.and.every((groupSegment) =>\n allGroupSegmentsAreMatched(groupSegment, attributes, datafileReader),\n );\n }\n\n if (\"or\" in groupSegments && Array.isArray(groupSegments.or)) {\n return groupSegments.or.some((groupSegment) =>\n allGroupSegmentsAreMatched(groupSegment, attributes, datafileReader),\n );\n }\n\n if (\"not\" in groupSegments && Array.isArray(groupSegments.not)) {\n return groupSegments.not.every(\n (groupSegment) =>\n allGroupSegmentsAreMatched(groupSegment, attributes, datafileReader) === false,\n );\n }\n }\n\n if (Array.isArray(groupSegments)) {\n return groupSegments.every((groupSegment) =>\n allGroupSegmentsAreMatched(groupSegment, attributes, datafileReader),\n );\n }\n\n return false;\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(97);\n"],"names":["root","factory","exports","module","define","amd","this","compareVersions","v1","v2","n1","validateAndParse","n2","p1","pop","p2","r","compareSegments","split","validate","version","test","semver","compare","operator","assertValidOperator","res","operatorResMap","includes","satisfies","range","some","trim","replace","every","m","match","op","v3","vp","r1","r2","r3","rp","v","nonZero","findIndex","i","slice","TypeError","Error","shift","isWildcard","s","tryParse","n","parseInt","isNaN","compareStrings","a","b","ap","bp","String","forceType","Math","max","length","allowedOperators","Object","keys","indexOf","join","createBuffer","val","TextEncoder","encode","MurmurHashV3","key","seed","remainder","bytes","h1","h1b","c1","c2","k1","murmur","str","k","l","h","MAX_HASH_VALUE","pow","MAX_BUCKETED_NUMBER","bucketKey","ratio","murmurhash","floor","conditionIsMatched","condition","attributes","attribute","value","dateInAttributes","valueInAttributes","Date","dateInCondition","Array","isArray","startsWith","endsWith","allConditionsAreMatched","conditions","and","c","or","not","parseJsonConditionsIfStringified","record","JSON","parse","e","console","error","datafileJson","schemaVersion","revision","segments","features","getRevision","getSchemaVersion","getAllAttributes","getAttribute","attributeKey","find","getSegment","segmentKey","segment","getFeature","featureKey","feature","DatafileReader","_listeners","addListener","eventName","fn","push","removeListener","index","splice","removeAllListeners","forEach","emit","args","Emitter","getMatchedAllocation","traffic","bucketValue","total","usePercentage","allocation","start","end","percentage","getMatchedTrafficAndAllocation","datafileReader","logger","matchedAllocation","matchedTraffic","t","allGroupSegmentsAreMatched","findForceFromFeature","force","f","variation","variations","debug","ruleKey","variationValue","variableSchema","variables","type","variableKey","variableFromVariation","defaultValue","overrides","override","o","emptyDatafile","fetchDatafileContent","datafileUrl","handleDatafileFetch","fetch","then","json","getValueByType","fieldType","undefined","parseFloat","options","configureBucketValue","initialFeatures","interceptAttributes","createLogger","refreshInterval","stickyFeatures","emitter","statuses","ready","refreshInProgress","onReady","onRefresh","onUpdate","onActivation","on","bind","off","setDatafile","datafile","startRefreshing","catch","setTimeout","setStickyFeatures","isReady","refresh","warn","isNotSameRevision","info","intervalId","setInterval","stopRefreshing","clearInterval","getBucketKey","prefix","bucketBy","getBucketValue","getBucketedNumber","getVariation","result","finalAttributes","forcedVariation","getForcedVariation","getBucketedVariation","defaultVariation","getVariationBoolean","getVariationString","getVariationInteger","getVariationDouble","activate","filter","capture","activateBoolean","activateString","activateInteger","activateDouble","getVariable","variablesSchema","forcedVariableValue","getForcedVariableValue","getBucketedVariableValue","getVariableBoolean","getVariableString","getVariableInteger","getVariableDouble","getVariableArray","getVariableObject","getVariableJSON","FeaturevisorInstance","loggerPrefix","defaultLogLevels","defaultLogHandler","level","message","details","log","levels","handle","handler","setLevels","Logger","logHandler","segmentIsMatched","groupSegments","groupSegment","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","call","d","definition","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag"],"sourceRoot":""}
1
+ {"version":3,"file":"index.js","mappings":"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","sources":["webpack://FeaturevisorSDK/webpack/universalModuleDefinition","webpack://FeaturevisorSDK/../../node_modules/compare-versions/lib/esm/index.js","webpack://FeaturevisorSDK/../../node_modules/murmurhash/murmurhash.js","webpack://FeaturevisorSDK/./src/bucket.ts","webpack://FeaturevisorSDK/./src/conditions.ts","webpack://FeaturevisorSDK/./src/datafileReader.ts","webpack://FeaturevisorSDK/./src/emitter.ts","webpack://FeaturevisorSDK/./src/feature.ts","webpack://FeaturevisorSDK/./src/index.ts","webpack://FeaturevisorSDK/./src/instance.ts","webpack://FeaturevisorSDK/./src/logger.ts","webpack://FeaturevisorSDK/./src/segments.ts","webpack://FeaturevisorSDK/webpack/bootstrap","webpack://FeaturevisorSDK/webpack/runtime/define property getters","webpack://FeaturevisorSDK/webpack/runtime/hasOwnProperty shorthand","webpack://FeaturevisorSDK/webpack/runtime/make namespace object","webpack://FeaturevisorSDK/webpack/startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"FeaturevisorSDK\"] = factory();\n\telse\n\t\troot[\"FeaturevisorSDK\"] = factory();\n})(this, () => {\nreturn ","/**\n * Compare [semver](https://semver.org/) version strings to find greater, equal or lesser.\n * This library supports the full semver specification, including comparing versions with different number of digits like `1.0.0`, `1.0`, `1`, and pre-release versions like `1.0.0-alpha`.\n * @param v1 - First version to compare\n * @param v2 - Second version to compare\n * @returns Numeric value compatible with the [Array.sort(fn) interface](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#Parameters).\n */\nexport const compareVersions = (v1, v2) => {\n // validate input and split into segments\n const n1 = validateAndParse(v1);\n const n2 = validateAndParse(v2);\n // pop off the patch\n const p1 = n1.pop();\n const p2 = n2.pop();\n // validate numbers\n const r = compareSegments(n1, n2);\n if (r !== 0)\n return r;\n // validate pre-release\n if (p1 && p2) {\n return compareSegments(p1.split('.'), p2.split('.'));\n }\n else if (p1 || p2) {\n return p1 ? -1 : 1;\n }\n return 0;\n};\n/**\n * Validate [semver](https://semver.org/) version strings.\n *\n * @param version Version number to validate\n * @returns `true` if the version number is a valid semver version number, `false` otherwise.\n *\n * @example\n * ```\n * validate('1.0.0-rc.1'); // return true\n * validate('1.0-rc.1'); // return false\n * validate('foo'); // return false\n * ```\n */\nexport const validate = (version) => typeof version === 'string' && /^[v\\d]/.test(version) && semver.test(version);\n/**\n * Compare [semver](https://semver.org/) version strings using the specified operator.\n *\n * @param v1 First version to compare\n * @param v2 Second version to compare\n * @param operator Allowed arithmetic operator to use\n * @returns `true` if the comparison between the firstVersion and the secondVersion satisfies the operator, `false` otherwise.\n *\n * @example\n * ```\n * compare('10.1.8', '10.0.4', '>'); // return true\n * compare('10.0.1', '10.0.1', '='); // return true\n * compare('10.1.1', '10.2.2', '<'); // return true\n * compare('10.1.1', '10.2.2', '<='); // return true\n * compare('10.1.1', '10.2.2', '>='); // return false\n * ```\n */\nexport const compare = (v1, v2, operator) => {\n // validate input operator\n assertValidOperator(operator);\n // since result of compareVersions can only be -1 or 0 or 1\n // a simple map can be used to replace switch\n const res = compareVersions(v1, v2);\n return operatorResMap[operator].includes(res);\n};\n/**\n * Match [npm semver](https://docs.npmjs.com/cli/v6/using-npm/semver) version range.\n *\n * @param version Version number to match\n * @param range Range pattern for version\n * @returns `true` if the version number is within the range, `false` otherwise.\n *\n * @example\n * ```\n * satisfies('1.1.0', '^1.0.0'); // return true\n * satisfies('1.1.0', '~1.0.0'); // return false\n * ```\n */\nexport const satisfies = (version, range) => {\n // handle multiple comparators\n if (range.includes('||')) {\n return range.split('||').some((r) => satisfies(version, r));\n }\n else if (range.includes(' ')) {\n return range\n .trim()\n .replace(/\\s{2,}/g, ' ')\n .split(' ')\n .every((r) => satisfies(version, r));\n }\n // if no range operator then \"=\"\n const m = range.match(/^([<>=~^]+)/);\n const op = m ? m[1] : '=';\n // if gt/lt/eq then operator compare\n if (op !== '^' && op !== '~')\n return compare(version, range, op);\n // else range of either \"~\" or \"^\" is assumed\n const [v1, v2, v3, , vp] = validateAndParse(version);\n const [r1, r2, r3, , rp] = validateAndParse(range);\n const v = [v1, v2, v3];\n const r = [r1, r2 !== null && r2 !== void 0 ? r2 : 'x', r3 !== null && r3 !== void 0 ? r3 : 'x'];\n // validate pre-release\n if (rp) {\n if (!vp)\n return false;\n if (compareSegments(v, r) !== 0)\n return false;\n if (compareSegments(vp.split('.'), rp.split('.')) === -1)\n return false;\n }\n // first non-zero number\n const nonZero = r.findIndex((v) => v !== '0') + 1;\n // pointer to where segments can be >=\n const i = op === '~' ? 2 : nonZero > 1 ? nonZero : 1;\n // before pointer must be equal\n if (compareSegments(v.slice(0, i), r.slice(0, i)) !== 0)\n return false;\n // after pointer must be >=\n if (compareSegments(v.slice(i), r.slice(i)) === -1)\n return false;\n return true;\n};\nconst semver = /^[v^~<>=]*?(\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+)(?:\\.([x*]|\\d+))?(?:-([\\da-z\\-]+(?:\\.[\\da-z\\-]+)*))?(?:\\+[\\da-z\\-]+(?:\\.[\\da-z\\-]+)*)?)?)?$/i;\nconst validateAndParse = (version) => {\n if (typeof version !== 'string') {\n throw new TypeError('Invalid argument expected string');\n }\n const match = version.match(semver);\n if (!match) {\n throw new Error(`Invalid argument not valid semver ('${version}' received)`);\n }\n match.shift();\n return match;\n};\nconst isWildcard = (s) => s === '*' || s === 'x' || s === 'X';\nconst tryParse = (v) => {\n const n = parseInt(v, 10);\n return isNaN(n) ? v : n;\n};\nconst forceType = (a, b) => typeof a !== typeof b ? [String(a), String(b)] : [a, b];\nconst compareStrings = (a, b) => {\n if (isWildcard(a) || isWildcard(b))\n return 0;\n const [ap, bp] = forceType(tryParse(a), tryParse(b));\n if (ap > bp)\n return 1;\n if (ap < bp)\n return -1;\n return 0;\n};\nconst compareSegments = (a, b) => {\n for (let i = 0; i < Math.max(a.length, b.length); i++) {\n const r = compareStrings(a[i] || '0', b[i] || '0');\n if (r !== 0)\n return r;\n }\n return 0;\n};\nconst operatorResMap = {\n '>': [1],\n '>=': [0, 1],\n '=': [0],\n '<=': [-1, 0],\n '<': [-1],\n};\nconst allowedOperators = Object.keys(operatorResMap);\nconst assertValidOperator = (op) => {\n if (typeof op !== 'string') {\n throw new TypeError(`Invalid operator type, expected string but got ${typeof op}`);\n }\n if (allowedOperators.indexOf(op) === -1) {\n throw new Error(`Invalid operator, expected one of ${allowedOperators.join('|')}`);\n }\n};\n//# sourceMappingURL=index.js.map","(function(){\n const _global = this;\n\n const createBuffer = (val) => new TextEncoder().encode(val)\n\n /**\n * JS Implementation of MurmurHash2\n *\n * @author <a href=\"mailto:gary.court@gmail.com\">Gary Court</a>\n * @see http://github.com/garycourt/murmurhash-js\n * @author <a href=\"mailto:aappleby@gmail.com\">Austin Appleby</a>\n * @see http://sites.google.com/site/murmurhash/\n *\n * @param {Uint8Array | string} str ASCII only\n * @param {number} seed Positive integer only\n * @return {number} 32-bit positive integer hash\n */\n function MurmurHashV2(str, seed) {\n if (typeof str === 'string') str = createBuffer(str);\n let\n l = str.length,\n h = seed ^ l,\n i = 0,\n k;\n\n while (l >= 4) {\n k =\n ((str[i] & 0xff)) |\n ((str[++i] & 0xff) << 8) |\n ((str[++i] & 0xff) << 16) |\n ((str[++i] & 0xff) << 24);\n\n k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16));\n k ^= k >>> 24;\n k = (((k & 0xffff) * 0x5bd1e995) + ((((k >>> 16) * 0x5bd1e995) & 0xffff) << 16));\n\n h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16)) ^ k;\n\n l -= 4;\n ++i;\n }\n\n switch (l) {\n case 3: h ^= (str[i + 2] & 0xff) << 16;\n case 2: h ^= (str[i + 1] & 0xff) << 8;\n case 1: h ^= (str[i] & 0xff);\n h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16));\n }\n\n h ^= h >>> 13;\n h = (((h & 0xffff) * 0x5bd1e995) + ((((h >>> 16) * 0x5bd1e995) & 0xffff) << 16));\n h ^= h >>> 15;\n\n return h >>> 0;\n };\n\n /*\n * JS Implementation of MurmurHash3 (r136) (as of May 20, 2011)\n *\n * @author <a href=\"mailto:gary.court@gmail.com\">Gary Court</a>\n * @see http://github.com/garycourt/murmurhash-js\n * @author <a href=\"mailto:aappleby@gmail.com\">Austin Appleby</a>\n * @see http://sites.google.com/site/murmurhash/\n *\n * @param {Uint8Array | string} key ASCII only\n * @param {number} seed Positive integer only\n * @return {number} 32-bit positive integer hash\n */\n function MurmurHashV3(key, seed) {\n if (typeof key === 'string') key = createBuffer(key);\n\n let remainder, bytes, h1, h1b, c1, c1b, c2, c2b, k1, i;\n\n remainder = key.length & 3; // key.length % 4\n bytes = key.length - remainder;\n h1 = seed;\n c1 = 0xcc9e2d51;\n c2 = 0x1b873593;\n i = 0;\n\n while (i < bytes) {\n k1 =\n ((key[i] & 0xff)) |\n ((key[++i] & 0xff) << 8) |\n ((key[++i] & 0xff) << 16) |\n ((key[++i] & 0xff) << 24);\n ++i;\n\n k1 = ((((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16))) & 0xffffffff;\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 = ((((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16))) & 0xffffffff;\n\n h1 ^= k1;\n h1 = (h1 << 13) | (h1 >>> 19);\n h1b = ((((h1 & 0xffff) * 5) + ((((h1 >>> 16) * 5) & 0xffff) << 16))) & 0xffffffff;\n h1 = (((h1b & 0xffff) + 0x6b64) + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16));\n }\n\n k1 = 0;\n\n switch (remainder) {\n case 3: k1 ^= (key[i + 2] & 0xff) << 16;\n case 2: k1 ^= (key[i + 1] & 0xff) << 8;\n case 1: k1 ^= (key[i] & 0xff);\n\n k1 = (((k1 & 0xffff) * c1) + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff;\n k1 = (k1 << 15) | (k1 >>> 17);\n k1 = (((k1 & 0xffff) * c2) + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff;\n h1 ^= k1;\n }\n\n h1 ^= key.length;\n\n h1 ^= h1 >>> 16;\n h1 = (((h1 & 0xffff) * 0x85ebca6b) + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & 0xffffffff;\n h1 ^= h1 >>> 13;\n h1 = ((((h1 & 0xffff) * 0xc2b2ae35) + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16))) & 0xffffffff;\n h1 ^= h1 >>> 16;\n\n return h1 >>> 0;\n }\n\n const murmur = MurmurHashV3;\n murmur.v2 = MurmurHashV2;\n murmur.v3 = MurmurHashV3;\n\n if (typeof(module) != 'undefined') {\n module.exports = murmur;\n } else {\n const _previousRoot = _global.murmur;\n murmur.noConflict = function() {\n _global.murmur = _previousRoot;\n return murmur;\n }\n _global.murmur = murmur;\n }\n}());\n","import * as murmurhash from \"murmurhash\";\n\nconst HASH_SEED = 1;\nconst MAX_HASH_VALUE = Math.pow(2, 32);\n\nexport const MAX_BUCKETED_NUMBER = 100000; // 100% * 1000 to include three decimal places in the same integer value\n\nexport function getBucketedNumber(bucketKey: string): number {\n const hashValue = murmurhash.v3(bucketKey, HASH_SEED);\n const ratio = hashValue / MAX_HASH_VALUE;\n\n return Math.floor(ratio * MAX_BUCKETED_NUMBER);\n}\n","import { compareVersions } from \"compare-versions\";\n\nimport { Attributes, Condition, PlainCondition } from \"@featurevisor/types\";\n\nexport function conditionIsMatched(condition: PlainCondition, attributes: Attributes): boolean {\n const { attribute, operator, value } = condition;\n\n if (operator === \"equals\") {\n return attributes[attribute] === value;\n } else if (operator === \"notEquals\") {\n return attributes[attribute] !== value;\n } else if (operator === \"before\" || operator === \"after\") {\n // date comparisons\n const valueInAttributes = attributes[attribute] as string | Date;\n\n const dateInAttributes =\n valueInAttributes instanceof Date ? valueInAttributes : new Date(valueInAttributes);\n const dateInCondition = value instanceof Date ? value : new Date(value as string);\n\n return operator === \"before\"\n ? dateInAttributes < dateInCondition\n : dateInAttributes > dateInCondition;\n } else if (typeof attributes[attribute] === \"string\" && Array.isArray(value)) {\n // array\n const valueInAttributes = attributes[attribute] as string;\n\n if (operator === \"in\") {\n return value.indexOf(valueInAttributes) !== -1;\n } else if (operator === \"notIn\") {\n return value.indexOf(valueInAttributes) === -1;\n }\n } else if (typeof attributes[attribute] === \"string\" && typeof value === \"string\") {\n // string\n const valueInAttributes = attributes[attribute] as string;\n\n if (operator === \"contains\") {\n return valueInAttributes.indexOf(value) !== -1;\n } else if (operator === \"notContains\") {\n return valueInAttributes.indexOf(value) === -1;\n } else if (operator === \"startsWith\") {\n return valueInAttributes.startsWith(value);\n } else if (operator === \"endsWith\") {\n return valueInAttributes.endsWith(value);\n } else if (operator === \"semverEquals\") {\n return compareVersions(valueInAttributes, value) === 0;\n } else if (operator === \"semverNotEquals\") {\n return compareVersions(valueInAttributes, value) !== 0;\n } else if (operator === \"semverGreaterThan\") {\n return compareVersions(valueInAttributes, value) === 1;\n } else if (operator === \"semverGreaterThanOrEquals\") {\n return compareVersions(valueInAttributes, value) >= 0;\n } else if (operator === \"semverLessThan\") {\n return compareVersions(valueInAttributes, value) === -1;\n } else if (operator === \"semverLessThanOrEquals\") {\n return compareVersions(valueInAttributes, value) <= 0;\n }\n } else if (typeof attributes[attribute] === \"number\" && typeof value === \"number\") {\n // numeric\n const valueInAttributes = attributes[attribute] as number;\n\n if (operator === \"greaterThan\") {\n return valueInAttributes > value;\n } else if (operator === \"greaterThanOrEquals\") {\n return valueInAttributes >= value;\n } else if (operator === \"lessThan\") {\n return valueInAttributes < value;\n } else if (operator === \"lessThanOrEquals\") {\n return valueInAttributes <= value;\n }\n }\n\n return false;\n}\n\nexport function allConditionsAreMatched(\n conditions: Condition[] | Condition,\n attributes: Attributes,\n): boolean {\n if (\"attribute\" in conditions) {\n return conditionIsMatched(conditions, attributes);\n }\n\n if (\"and\" in conditions && Array.isArray(conditions.and)) {\n return conditions.and.every((c) => allConditionsAreMatched(c, attributes));\n }\n\n if (\"or\" in conditions && Array.isArray(conditions.or)) {\n return conditions.or.some((c) => allConditionsAreMatched(c, attributes));\n }\n\n if (\"not\" in conditions && Array.isArray(conditions.not)) {\n return conditions.not.every(\n (c) =>\n allConditionsAreMatched(\n {\n and: conditions.not,\n },\n attributes,\n ) === false,\n );\n }\n\n if (Array.isArray(conditions)) {\n return conditions.every((c) => allConditionsAreMatched(c, attributes));\n }\n\n return false;\n}\n","import {\n Feature,\n Segment,\n DatafileContent,\n Attribute,\n AttributeKey,\n SegmentKey,\n FeatureKey,\n} from \"@featurevisor/types\";\n\nexport function parseJsonConditionsIfStringified<T>(record: T, key: string): T {\n if (typeof record[key] === \"string\" && record[key] !== \"*\") {\n try {\n record[key] = JSON.parse(record[key]);\n } catch (e) {\n console.error(\"Error parsing JSON\", e);\n }\n }\n\n return record;\n}\n\nexport class DatafileReader {\n private schemaVersion: string;\n private revision: string;\n private attributes: Attribute[];\n private segments: Segment[];\n private features: Feature[];\n\n constructor(datafileJson: DatafileContent) {\n this.schemaVersion = datafileJson.schemaVersion;\n this.revision = datafileJson.revision;\n this.segments = datafileJson.segments;\n this.attributes = datafileJson.attributes;\n this.features = datafileJson.features;\n }\n\n getRevision(): string {\n return this.revision;\n }\n\n getSchemaVersion(): string {\n return this.schemaVersion;\n }\n\n getAllAttributes(): Attribute[] {\n return this.attributes;\n }\n\n getAttribute(attributeKey: AttributeKey): Attribute | undefined {\n return this.attributes.find((a) => a.key === attributeKey);\n }\n\n getSegment(segmentKey: SegmentKey): Segment | undefined {\n const segment = this.segments.find((s) => s.key === segmentKey);\n\n if (!segment) {\n return undefined;\n }\n\n return parseJsonConditionsIfStringified(segment, \"conditions\");\n }\n\n getFeature(featureKey: FeatureKey): Feature | undefined {\n const feature = this.features.find((s) => s.key === featureKey);\n\n if (!feature) {\n return undefined;\n }\n\n return feature;\n }\n}\n","export type EventName = \"ready\" | \"refresh\" | \"update\" | \"activation\";\n\nexport interface Listeners {\n [key: string]: Function[];\n}\n\nexport class Emitter {\n private _listeners: Listeners;\n\n constructor() {\n this._listeners = {};\n }\n\n public addListener(eventName: EventName, fn: Function): void {\n if (typeof this._listeners[eventName] === \"undefined\") {\n this._listeners[eventName] = [];\n }\n\n this._listeners[eventName].push(fn);\n }\n\n public removeListener(eventName: EventName, fn: Function): void {\n if (typeof this._listeners[eventName] === \"undefined\") {\n return;\n }\n\n const index = this._listeners[eventName].indexOf(fn);\n\n if (index !== -1) {\n this._listeners[eventName].splice(index, 1);\n }\n }\n\n public removeAllListeners(eventName?: EventName): void {\n if (eventName) {\n this._listeners[eventName] = [];\n } else {\n Object.keys(this._listeners).forEach((key) => {\n this._listeners[key] = [];\n });\n }\n }\n\n public emit(eventName: EventName, ...args: any[]): void {\n if (typeof this._listeners[eventName] === \"undefined\") {\n return;\n }\n\n this._listeners[eventName].forEach((fn) => {\n fn(...args);\n });\n }\n}\n","import {\n Allocation,\n Attributes,\n Traffic,\n Feature,\n Variation,\n VariableValue,\n Force,\n} from \"@featurevisor/types\";\nimport { DatafileReader } from \"./datafileReader\";\nimport { allGroupSegmentsAreMatched } from \"./segments\";\nimport { allConditionsAreMatched } from \"./conditions\";\nimport { VariableSchema } from \"@featurevisor/types/src\";\nimport { Logger } from \"./logger\";\n\n/**\n * Traffic\n */\nexport function getMatchedAllocation(\n traffic: Traffic,\n bucketValue: number,\n): Allocation | undefined {\n let total = 0; // @TODO: remove it in next breaking semver\n const usePercentage =\n traffic.allocation.length > 0 && typeof traffic.allocation[0].range === \"undefined\"; // @TODO: remove it in next breaking semver\n\n for (const allocation of traffic.allocation) {\n if (\n allocation.range &&\n allocation.range.start <= bucketValue &&\n allocation.range.end >= bucketValue\n ) {\n return allocation;\n }\n\n // @TODO: remove it in next breaking semver\n if (usePercentage) {\n total += allocation.percentage || 0;\n if (bucketValue <= total) {\n return allocation;\n }\n }\n }\n\n return undefined;\n}\n\nexport interface MatchedTrafficAndAllocation {\n matchedTraffic: Traffic | undefined;\n matchedAllocation: Allocation | undefined;\n}\n\nexport function getMatchedTrafficAndAllocation(\n traffic: Traffic[],\n attributes: Attributes,\n bucketValue: number,\n datafileReader: DatafileReader,\n logger: Logger,\n): MatchedTrafficAndAllocation {\n let matchedAllocation: Allocation | undefined;\n\n const matchedTraffic = traffic.find((t) => {\n if (\n !allGroupSegmentsAreMatched(\n typeof t.segments === \"string\" && t.segments !== \"*\" ? JSON.parse(t.segments) : t.segments,\n attributes,\n datafileReader,\n )\n ) {\n return false;\n }\n\n matchedAllocation = getMatchedAllocation(t, bucketValue);\n\n if (matchedAllocation) {\n return true;\n }\n\n return false;\n });\n\n return {\n matchedTraffic,\n matchedAllocation,\n };\n}\n\n/**\n * Variations and variables\n */\nfunction findForceFromFeature(\n feature: Feature,\n attributes: Attributes,\n datafileReader: DatafileReader,\n): Force | undefined {\n if (!feature.force) {\n return undefined;\n }\n\n return feature.force.find((f: Force) => {\n if (f.conditions) {\n return allConditionsAreMatched(f.conditions, attributes);\n }\n\n if (f.segments) {\n return allGroupSegmentsAreMatched(f.segments, attributes, datafileReader);\n }\n\n return false;\n });\n}\n\nexport function getForcedVariation(\n feature: Feature,\n attributes: Attributes,\n datafileReader: DatafileReader,\n): Variation | undefined {\n const force = findForceFromFeature(feature, attributes, datafileReader);\n\n if (!force || !force.variation) {\n return undefined;\n }\n\n return feature.variations.find((v) => v.value === force.variation);\n}\n\nexport function getBucketedVariation(\n feature: Feature,\n attributes: Attributes,\n bucketValue: number,\n datafileReader: DatafileReader,\n logger: Logger,\n): Variation | undefined {\n const { matchedTraffic, matchedAllocation } = getMatchedTrafficAndAllocation(\n feature.traffic,\n attributes,\n bucketValue,\n datafileReader,\n logger,\n );\n\n if (!matchedTraffic) {\n logger.debug(\"no matched rule found\", {\n featureKey: feature.key,\n bucketValue,\n });\n\n return undefined;\n }\n\n if (matchedTraffic.variation) {\n const variation = feature.variations.find((v) => {\n return v.value === matchedTraffic.variation;\n });\n\n if (variation) {\n logger.debug(\"using variation from rule\", {\n featureKey: feature.key,\n variation: variation.value,\n ruleKey: matchedTraffic.key,\n });\n\n return variation;\n }\n }\n\n if (!matchedAllocation) {\n logger.debug(\"no matched allocation found\", {\n featureKey: feature.key,\n bucketValue,\n });\n\n return undefined;\n }\n\n const variationValue = matchedAllocation.variation;\n\n const variation = feature.variations.find((v) => {\n return v.value === variationValue;\n });\n\n if (!variation) {\n // this should never happen\n logger.debug(\"no matched variation found\", {\n featureKey: feature.key,\n variation: variationValue,\n bucketValue,\n });\n\n return undefined;\n }\n\n logger.debug(\"matched variation\", {\n featureKey: feature.key,\n variation: variation.value,\n bucketValue,\n });\n\n return variation;\n}\n\nexport function getForcedVariableValue(\n feature: Feature,\n variableSchema: VariableSchema,\n attributes: Attributes,\n datafileReader: DatafileReader,\n): VariableValue | undefined {\n const force = findForceFromFeature(feature, attributes, datafileReader);\n\n if (!force || !force.variables) {\n return undefined;\n }\n\n const value = force.variables[variableSchema.key];\n\n if (typeof value === \"string\" && variableSchema.type === \"json\") {\n return JSON.parse(value);\n }\n\n return value;\n}\n\nexport function getBucketedVariableValue(\n feature: Feature,\n variableSchema: VariableSchema,\n attributes: Attributes,\n bucketValue: number,\n datafileReader: DatafileReader,\n logger: Logger,\n): VariableValue | undefined {\n // get traffic\n const { matchedTraffic, matchedAllocation } = getMatchedTrafficAndAllocation(\n feature.traffic,\n attributes,\n bucketValue,\n datafileReader,\n logger,\n );\n\n if (!matchedTraffic) {\n logger.debug(\"no matched rule found\", {\n featureKey: feature.key,\n variableKey: variableSchema.key,\n bucketValue,\n });\n\n return undefined;\n }\n\n const variableKey = variableSchema.key;\n\n // see if variable is set at traffic/rule level\n if (matchedTraffic.variables && typeof matchedTraffic.variables[variableKey] !== \"undefined\") {\n logger.debug(\"using variable from rule\", {\n featureKey: feature.key,\n variableKey,\n bucketValue,\n });\n\n return matchedTraffic.variables[variableKey];\n }\n\n if (!matchedAllocation) {\n logger.debug(\"no matched allocation found\", {\n featureKey: feature.key,\n variableKey,\n bucketValue,\n });\n\n return undefined;\n }\n\n const variationValue = matchedAllocation.variation;\n\n const variation = feature.variations.find((v) => {\n return v.value === variationValue;\n });\n\n if (!variation) {\n // this should never happen\n logger.debug(\"no matched variation found\", {\n feature: feature.key,\n variableKey,\n variation: variationValue,\n bucketValue,\n });\n\n return undefined;\n }\n\n const variableFromVariation = variation.variables?.find((v) => {\n return v.key === variableKey;\n });\n\n if (!variableFromVariation) {\n logger.debug(\"using default value as variation has no variable\", {\n featureKey: feature.key,\n variableKey,\n variation: variationValue,\n bucketValue,\n });\n\n if (variableSchema.type === \"json\") {\n return JSON.parse(variableSchema.defaultValue as string);\n }\n\n return variableSchema.defaultValue;\n }\n\n if (variableFromVariation.overrides) {\n const override = variableFromVariation.overrides.find((o) => {\n if (o.conditions) {\n return allConditionsAreMatched(\n typeof o.conditions === \"string\" ? JSON.parse(o.conditions) : o.conditions,\n attributes,\n );\n }\n\n if (o.segments) {\n return allGroupSegmentsAreMatched(\n typeof o.segments === \"string\" && o.segments !== \"*\"\n ? JSON.parse(o.segments)\n : o.segments,\n attributes,\n datafileReader,\n );\n }\n\n return false;\n });\n\n if (override) {\n logger.debug(\"using override value from variation\", {\n feature: feature.key,\n variableKey,\n variation: variationValue,\n bucketValue,\n });\n\n if (variableSchema.type === \"json\") {\n return JSON.parse(override.value as string);\n }\n\n return override.value;\n }\n }\n\n logger.debug(\"using value from variation\", {\n feature: feature.key,\n variableKey,\n variation: variationValue,\n bucketValue,\n });\n\n if (variableSchema.type === \"json\") {\n return JSON.parse(variableFromVariation.value as string);\n }\n\n return variableFromVariation.value;\n}\n","export * from \"./bucket\";\nexport * from \"./instance\";\nexport * from \"./logger\";\n","import {\n Attributes,\n AttributeValue,\n BucketKey,\n BucketValue,\n DatafileContent,\n Feature,\n FeatureKey,\n InitialFeatures,\n StickyFeatures,\n VariableType,\n VariableValue,\n VariationType,\n VariationValue,\n} from \"@featurevisor/types\";\n\nimport { createLogger, Logger } from \"./logger\";\nimport { DatafileReader } from \"./datafileReader\";\nimport { Emitter } from \"./emitter\";\nimport { getBucketedNumber } from \"./bucket\";\nimport {\n getBucketedVariation,\n getBucketedVariableValue,\n getForcedVariation,\n getForcedVariableValue,\n} from \"./feature\";\n\nexport type ReadyCallback = () => void;\n\nexport type ActivationCallback = (\n featureName: string,\n variation: VariationValue,\n attributes: Attributes,\n captureAttributes: Attributes,\n) => void;\n\nexport type ConfigureBucketValue = (feature, attributes, bucketValue: BucketValue) => BucketValue;\n\nexport interface Statuses {\n ready: boolean;\n refreshInProgress: boolean;\n}\n\nconst DEFAULT_BUCKET_KEY_SEPARATOR = \".\";\n\nexport interface InstanceOptions {\n bucketKeySeparator?: string;\n configureBucketValue?: ConfigureBucketValue;\n datafile?: DatafileContent | string;\n datafileUrl?: string;\n handleDatafileFetch?: (datafileUrl: string) => Promise<DatafileContent>;\n initialFeatures?: InitialFeatures;\n interceptAttributes?: (attributes: Attributes) => Attributes;\n logger?: Logger;\n onActivation?: ActivationCallback;\n onReady?: ReadyCallback;\n onRefresh?: () => void;\n onUpdate?: () => void;\n refreshInterval?: number; // seconds\n stickyFeatures?: StickyFeatures;\n}\n\nconst emptyDatafile: DatafileContent = {\n schemaVersion: \"1\",\n revision: \"unknown\",\n attributes: [],\n segments: [],\n features: [],\n};\n\nexport type DatafileFetchHandler = (datafileUrl: string) => Promise<DatafileContent>;\n\nfunction fetchDatafileContent(\n datafileUrl,\n handleDatafileFetch?: DatafileFetchHandler,\n): Promise<DatafileContent> {\n if (handleDatafileFetch) {\n return handleDatafileFetch(datafileUrl);\n }\n\n return fetch(datafileUrl).then((res) => res.json());\n}\n\ntype FieldType = VariationType | VariableType;\ntype ValueType = VariableValue;\n\nexport function getValueByType(value: ValueType, fieldType: FieldType): ValueType {\n if (value === undefined) {\n return undefined;\n }\n\n switch (fieldType) {\n case \"string\":\n return typeof value === \"string\" ? value : undefined;\n case \"integer\":\n return parseInt(value as string, 10);\n case \"double\":\n return parseFloat(value as string);\n case \"boolean\":\n return value === true;\n case \"array\":\n return Array.isArray(value) ? value : undefined;\n case \"object\":\n return typeof value === \"object\" ? value : undefined;\n // @NOTE: `json` is not handled here intentionally\n default:\n return value;\n }\n}\n\nexport class FeaturevisorInstance {\n // from options\n private bucketKeySeparator: string;\n private configureBucketValue?: ConfigureBucketValue;\n private datafileUrl?: string;\n private handleDatafileFetch?: DatafileFetchHandler;\n private initialFeatures?: InitialFeatures;\n private interceptAttributes?: (attributes: Attributes) => Attributes;\n private logger: Logger;\n private refreshInterval?: number; // seconds\n private stickyFeatures?: StickyFeatures;\n\n // internally created\n private datafileReader: DatafileReader;\n private emitter: Emitter;\n private statuses: Statuses;\n private intervalId?: ReturnType<typeof setInterval>;\n\n // exposed from emitter\n public on: Emitter[\"addListener\"];\n public addListener: Emitter[\"addListener\"];\n public off: Emitter[\"removeListener\"];\n public removeListener: Emitter[\"removeListener\"];\n public removeAllListeners: Emitter[\"removeAllListeners\"];\n\n constructor(options: InstanceOptions) {\n // from options\n this.bucketKeySeparator = options.bucketKeySeparator || DEFAULT_BUCKET_KEY_SEPARATOR;\n this.configureBucketValue = options.configureBucketValue;\n this.datafileUrl = options.datafileUrl;\n this.handleDatafileFetch = options.handleDatafileFetch;\n this.initialFeatures = options.initialFeatures;\n this.interceptAttributes = options.interceptAttributes;\n this.logger = options.logger || createLogger();\n this.refreshInterval = options.refreshInterval;\n this.stickyFeatures = options.stickyFeatures;\n\n // internal\n this.emitter = new Emitter();\n this.statuses = {\n ready: false,\n refreshInProgress: false,\n };\n\n // register events\n if (options.onReady) {\n this.emitter.addListener(\"ready\", options.onReady);\n }\n\n if (options.onRefresh) {\n this.emitter.addListener(\"refresh\", options.onRefresh);\n }\n\n if (options.onUpdate) {\n this.emitter.addListener(\"update\", options.onUpdate);\n }\n\n if (options.onActivation) {\n this.emitter.addListener(\"activation\", options.onActivation);\n }\n\n // expose emitter methods\n const on = this.emitter.addListener.bind(this.emitter);\n this.on = on;\n this.addListener = on;\n\n const off = this.emitter.removeListener.bind(this.emitter);\n this.off = off;\n this.removeListener = off;\n\n this.removeAllListeners = this.emitter.removeAllListeners.bind(this.emitter);\n\n // datafile\n if (options.datafileUrl) {\n this.setDatafile(options.datafile || emptyDatafile);\n\n fetchDatafileContent(options.datafileUrl, options.handleDatafileFetch)\n .then((datafile) => {\n this.setDatafile(datafile);\n\n this.statuses.ready = true;\n this.emitter.emit(\"ready\");\n\n if (this.refreshInterval) {\n this.startRefreshing();\n }\n })\n .catch((e) => {\n this.logger.error(\"failed to fetch datafile\", { error: e });\n });\n } else if (options.datafile) {\n this.setDatafile(options.datafile);\n this.statuses.ready = true;\n\n setTimeout(() => {\n this.emitter.emit(\"ready\");\n }, 0);\n } else {\n throw new Error(\n \"Featurevisor SDK instance cannot be created without both `datafile` and `datafileUrl` options\",\n );\n }\n }\n\n setDatafile(datafile: DatafileContent | string) {\n try {\n this.datafileReader = new DatafileReader(\n typeof datafile === \"string\" ? JSON.parse(datafile) : datafile,\n );\n } catch (e) {\n this.logger.error(\"could not parse datafile\", { error: e });\n }\n }\n\n setStickyFeatures(stickyFeatures: StickyFeatures | undefined) {\n this.stickyFeatures = stickyFeatures;\n }\n\n getRevision(): string {\n return this.datafileReader.getRevision();\n }\n\n private getFeature(featureKey: string | Feature): Feature | undefined {\n return typeof featureKey === \"string\"\n ? this.datafileReader.getFeature(featureKey) // only key provided\n : featureKey; // full feature provided\n }\n\n /**\n * Statuses\n */\n isReady(): boolean {\n return this.statuses.ready;\n }\n\n /**\n * Refresh\n */\n refresh() {\n this.logger.debug(\"refreshing datafile\");\n\n if (this.statuses.refreshInProgress) {\n return this.logger.warn(\"refresh in progress, skipping\");\n }\n\n if (!this.datafileUrl) {\n return this.logger.error(\"cannot refresh since `datafileUrl` is not provided\");\n }\n\n this.statuses.refreshInProgress = true;\n\n fetchDatafileContent(this.datafileUrl, this.handleDatafileFetch)\n .then((datafile) => {\n const currentRevision = this.getRevision();\n const newRevision = datafile.revision;\n const isNotSameRevision = currentRevision !== newRevision;\n\n this.setDatafile(datafile);\n this.logger.info(\"refreshed datafile\");\n\n this.emitter.emit(\"refresh\");\n\n if (isNotSameRevision) {\n this.emitter.emit(\"update\");\n }\n\n this.statuses.refreshInProgress = false;\n })\n .catch((e) => {\n this.logger.error(\"failed to refresh datafile\", { error: e });\n this.statuses.refreshInProgress = false;\n });\n }\n\n startRefreshing() {\n if (!this.datafileUrl) {\n return this.logger.error(\"cannot start refreshing since `datafileUrl` is not provided\");\n }\n\n if (this.intervalId) {\n return this.logger.warn(\"refreshing has already started\");\n }\n\n if (!this.refreshInterval) {\n return this.logger.warn(\"no `refreshInterval` option provided\");\n }\n\n this.intervalId = setInterval(() => {\n this.refresh();\n }, this.refreshInterval * 1000);\n }\n\n stopRefreshing() {\n if (!this.intervalId) {\n return this.logger.warn(\"refreshing has not started yet\");\n }\n\n clearInterval(this.intervalId);\n }\n\n /**\n * Bucketing\n */\n private getBucketKey(feature: Feature, attributes: Attributes): BucketKey {\n const featureKey = feature.key;\n\n const attributeKeys =\n typeof feature.bucketBy === \"string\" ? [feature.bucketBy] : feature.bucketBy;\n\n const bucketKey: AttributeValue[] = [];\n\n attributeKeys.forEach((attributeKey) => {\n const attributeValue = attributes[attributeKey];\n\n if (typeof attributeValue === \"undefined\") {\n return;\n }\n\n bucketKey.push(attributeValue);\n });\n\n bucketKey.push(featureKey);\n\n return bucketKey.join(this.bucketKeySeparator);\n }\n\n private getBucketValue(feature: Feature, attributes: Attributes): BucketValue {\n const bucketKey = this.getBucketKey(feature, attributes);\n\n const value = getBucketedNumber(bucketKey);\n\n if (this.configureBucketValue) {\n return this.configureBucketValue(feature, attributes, value);\n }\n\n return value;\n }\n\n /**\n * Variation\n */\n\n getVariation(\n featureKey: FeatureKey | Feature,\n attributes: Attributes = {},\n ): VariationValue | undefined {\n try {\n const key = typeof featureKey === \"string\" ? featureKey : featureKey.key;\n\n if (this.stickyFeatures && this.stickyFeatures[key]) {\n const result = this.stickyFeatures[key].variation;\n\n if (typeof result !== \"undefined\") {\n this.logger.debug(\"using sticky variation\", {\n featureKey: key,\n variation: result,\n });\n\n return result;\n }\n }\n\n if (\n this.statuses &&\n !this.statuses.ready &&\n this.initialFeatures &&\n this.initialFeatures[key]\n ) {\n const result = this.initialFeatures[key].variation;\n\n if (typeof result !== \"undefined\") {\n this.logger.debug(\"using initial variation\", {\n featureKey: key,\n variation: result,\n });\n\n return result;\n }\n }\n\n const feature = this.getFeature(featureKey);\n\n if (!feature) {\n this.logger.warn(\"feature not found in datafile\", { featureKey });\n\n return undefined;\n }\n\n const finalAttributes = this.interceptAttributes\n ? this.interceptAttributes(attributes)\n : attributes;\n\n const forcedVariation = getForcedVariation(feature, finalAttributes, this.datafileReader);\n\n if (forcedVariation) {\n this.logger.debug(\"forced variation found\", {\n featureKey,\n variation: forcedVariation.value,\n });\n\n return forcedVariation.value;\n }\n\n const bucketValue = this.getBucketValue(feature, finalAttributes);\n\n const variation = getBucketedVariation(\n feature,\n finalAttributes,\n bucketValue,\n this.datafileReader,\n this.logger,\n );\n\n if (!variation) {\n this.logger.debug(\"using default variation\", {\n featureKey,\n bucketValue,\n variation: feature.defaultVariation,\n });\n\n return feature.defaultVariation;\n }\n\n return variation.value;\n } catch (e) {\n this.logger.error(\"getVariation\", { featureKey, error: e });\n\n return undefined;\n }\n }\n\n getVariationBoolean(\n featureKey: FeatureKey | Feature,\n attributes: Attributes = {},\n ): boolean | undefined {\n const variationValue = this.getVariation(featureKey, attributes);\n\n return getValueByType(variationValue, \"boolean\") as boolean | undefined;\n }\n\n getVariationString(\n featureKey: FeatureKey | Feature,\n attributes: Attributes = {},\n ): string | undefined {\n const variationValue = this.getVariation(featureKey, attributes);\n\n return getValueByType(variationValue, \"string\") as string | undefined;\n }\n\n getVariationInteger(\n featureKey: FeatureKey | Feature,\n attributes: Attributes = {},\n ): number | undefined {\n const variationValue = this.getVariation(featureKey, attributes);\n\n return getValueByType(variationValue, \"integer\") as number | undefined;\n }\n\n getVariationDouble(\n featureKey: FeatureKey | Feature,\n attributes: Attributes = {},\n ): number | undefined {\n const variationValue = this.getVariation(featureKey, attributes);\n\n return getValueByType(variationValue, \"double\") as number | undefined;\n }\n\n /**\n * Activate\n */\n activate(featureKey: FeatureKey, attributes: Attributes = {}): VariationValue | undefined {\n try {\n const variationValue = this.getVariation(featureKey, attributes);\n\n if (typeof variationValue === \"undefined\") {\n return undefined;\n }\n\n const finalAttributes = this.interceptAttributes\n ? this.interceptAttributes(attributes)\n : attributes;\n\n const captureAttributes: Attributes = {};\n\n const attributesForCapturing = this.datafileReader\n .getAllAttributes()\n .filter((a) => a.capture === true);\n\n attributesForCapturing.forEach((a) => {\n if (typeof finalAttributes[a.key] !== \"undefined\") {\n captureAttributes[a.key] = attributes[a.key];\n }\n });\n\n this.emitter.emit(\n \"activation\",\n featureKey,\n variationValue,\n finalAttributes,\n captureAttributes,\n );\n\n return variationValue;\n } catch (e) {\n this.logger.error(\"activate\", { featureKey, error: e });\n\n return undefined;\n }\n }\n\n activateBoolean(featureKey: FeatureKey, attributes: Attributes = {}): boolean | undefined {\n const variationValue = this.activate(featureKey, attributes);\n\n return getValueByType(variationValue, \"boolean\") as boolean | undefined;\n }\n\n activateString(featureKey: FeatureKey, attributes: Attributes = {}): string | undefined {\n const variationValue = this.activate(featureKey, attributes);\n\n return getValueByType(variationValue, \"string\") as string | undefined;\n }\n\n activateInteger(featureKey: FeatureKey, attributes: Attributes = {}): number | undefined {\n const variationValue = this.activate(featureKey, attributes);\n\n return getValueByType(variationValue, \"integer\") as number | undefined;\n }\n\n activateDouble(featureKey: FeatureKey, attributes: Attributes = {}): number | undefined {\n const variationValue = this.activate(featureKey, attributes);\n\n return getValueByType(variationValue, \"double\") as number | undefined;\n }\n\n /**\n * Variable\n */\n\n getVariable(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): VariableValue | undefined {\n try {\n const key = typeof featureKey === \"string\" ? featureKey : featureKey.key;\n\n if (this.stickyFeatures && this.stickyFeatures[key] && this.stickyFeatures[key].variables) {\n const result = this.stickyFeatures[key].variables[variableKey];\n\n if (typeof result !== \"undefined\") {\n this.logger.debug(\"using sticky variable\", {\n featureKey: key,\n variableKey,\n });\n\n return result;\n }\n }\n\n if (\n this.statuses &&\n !this.statuses.ready &&\n this.initialFeatures &&\n this.initialFeatures[key] &&\n this.initialFeatures[key].variables\n ) {\n const result = this.initialFeatures[key].variables[variableKey];\n\n if (typeof result !== \"undefined\") {\n this.logger.debug(\"using initial variable\", {\n featureKey: key,\n variableKey,\n });\n\n return result;\n }\n }\n\n const feature = this.getFeature(featureKey);\n\n if (!feature) {\n this.logger.warn(\"feature not found in datafile\", { featureKey, variableKey });\n\n return undefined;\n }\n\n const variableSchema = Array.isArray(feature.variablesSchema)\n ? feature.variablesSchema.find((v) => v.key === variableKey)\n : undefined;\n\n if (!variableSchema) {\n this.logger.warn(\"variable schema not found\", { featureKey, variableKey });\n\n return undefined;\n }\n\n const finalAttributes = this.interceptAttributes\n ? this.interceptAttributes(attributes)\n : attributes;\n\n const forcedVariableValue = getForcedVariableValue(\n feature,\n variableSchema,\n finalAttributes,\n this.datafileReader,\n );\n\n if (typeof forcedVariableValue !== \"undefined\") {\n this.logger.debug(\"forced variable value found\", { featureKey, variableKey });\n\n return forcedVariableValue;\n }\n\n const bucketValue = this.getBucketValue(feature, finalAttributes);\n\n return getBucketedVariableValue(\n feature,\n variableSchema,\n finalAttributes,\n bucketValue,\n this.datafileReader,\n this.logger,\n );\n } catch (e) {\n this.logger.error(\"getVariable\", { featureKey, variableKey, error: e });\n\n return undefined;\n }\n }\n\n getVariableBoolean(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): boolean | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"boolean\") as boolean | undefined;\n }\n\n getVariableString(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): string | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"string\") as string | undefined;\n }\n\n getVariableInteger(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): number | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"integer\") as number | undefined;\n }\n\n getVariableDouble(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): number | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"double\") as number | undefined;\n }\n\n getVariableArray(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): string[] | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"array\") as string[] | undefined;\n }\n\n getVariableObject<T>(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): T | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"object\") as T | undefined;\n }\n\n getVariableJSON<T>(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): T | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"json\") as T | undefined;\n }\n}\n\nexport function createInstance(options: InstanceOptions): FeaturevisorInstance {\n return new FeaturevisorInstance(options);\n}\n","export type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\";\n\nexport type LogMessage = string;\n\nexport interface LogDetails {\n [key: string]: any;\n}\n\nexport type LogHandler = (level: LogLevel, message: LogMessage, details?: LogDetails) => void;\n\nexport interface CreateLoggerOptions {\n levels?: LogLevel[];\n handler?: LogHandler;\n}\n\nexport const loggerPrefix = \"[Featurevisor]\";\n\nexport const defaultLogLevels: LogLevel[] = [\n // supported, but not enabled by default\n // \"debug\",\n // \"info\",\n\n // enabled by default\n \"warn\",\n \"error\",\n];\n\nexport const defaultLogHandler: LogHandler = function defaultLogHandler(\n level,\n message,\n details = {},\n) {\n switch (level) {\n case \"debug\":\n console.log(loggerPrefix, message, details);\n case \"info\":\n console.info(loggerPrefix, message, details);\n case \"warn\":\n console.warn(loggerPrefix, message, details);\n case \"error\":\n console.error(loggerPrefix, message, details);\n }\n};\n\nexport class Logger {\n private levels: LogLevel[];\n private handle: LogHandler;\n\n constructor(options: CreateLoggerOptions) {\n this.levels = options.levels as LogLevel[];\n this.handle = options.handler as LogHandler;\n }\n\n setLevels(levels: LogLevel[]) {\n this.levels = levels;\n }\n\n log(level: LogLevel, message: LogMessage, details?: LogDetails) {\n if (this.levels.indexOf(level) !== -1) {\n this.handle(level, message, details);\n }\n }\n\n debug(message: LogMessage, details?: LogDetails) {\n this.log(\"debug\", message, details);\n }\n\n info(message: LogMessage, details?: LogDetails) {\n this.log(\"info\", message, details);\n }\n\n warn(message: LogMessage, details?: LogDetails) {\n this.log(\"warn\", message, details);\n }\n\n error(message: LogMessage, details?: LogDetails) {\n this.log(\"error\", message, details);\n }\n}\n\nexport function createLogger(options: CreateLoggerOptions = {}): Logger {\n const levels = options.levels || defaultLogLevels;\n const logHandler = options.handler || defaultLogHandler;\n\n return new Logger({ levels, handler: logHandler });\n}\n","import { Attributes, GroupSegment, Segment, Condition } from \"@featurevisor/types\";\nimport { allConditionsAreMatched } from \"./conditions\";\nimport { DatafileReader } from \"./datafileReader\";\n\nexport function segmentIsMatched(segment: Segment, attributes: Attributes): boolean {\n return allConditionsAreMatched(segment.conditions as Condition | Condition[], attributes);\n}\n\nexport function allGroupSegmentsAreMatched(\n groupSegments: GroupSegment | GroupSegment[] | \"*\",\n attributes: Attributes,\n datafileReader: DatafileReader,\n): boolean {\n if (groupSegments === \"*\") {\n return true;\n }\n\n if (typeof groupSegments === \"string\") {\n const segment = datafileReader.getSegment(groupSegments);\n\n if (segment) {\n return segmentIsMatched(segment, attributes);\n }\n\n return false;\n }\n\n if (typeof groupSegments === \"object\") {\n if (\"and\" in groupSegments && Array.isArray(groupSegments.and)) {\n return groupSegments.and.every((groupSegment) =>\n allGroupSegmentsAreMatched(groupSegment, attributes, datafileReader),\n );\n }\n\n if (\"or\" in groupSegments && Array.isArray(groupSegments.or)) {\n return groupSegments.or.some((groupSegment) =>\n allGroupSegmentsAreMatched(groupSegment, attributes, datafileReader),\n );\n }\n\n if (\"not\" in groupSegments && Array.isArray(groupSegments.not)) {\n return groupSegments.not.every(\n (groupSegment) =>\n allGroupSegmentsAreMatched(groupSegment, attributes, datafileReader) === false,\n );\n }\n }\n\n if (Array.isArray(groupSegments)) {\n return groupSegments.every((groupSegment) =>\n allGroupSegmentsAreMatched(groupSegment, attributes, datafileReader),\n );\n }\n\n return false;\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(97);\n"],"names":["root","factory","exports","module","define","amd","this","compareVersions","v1","v2","n1","validateAndParse","n2","p1","pop","p2","r","compareSegments","split","validate","version","test","semver","compare","operator","assertValidOperator","res","operatorResMap","includes","satisfies","range","some","trim","replace","every","m","match","op","v3","vp","r1","r2","r3","rp","v","nonZero","findIndex","i","slice","TypeError","Error","shift","isWildcard","s","tryParse","n","parseInt","isNaN","compareStrings","a","b","ap","bp","String","forceType","Math","max","length","allowedOperators","Object","keys","indexOf","join","createBuffer","val","TextEncoder","encode","MurmurHashV3","key","seed","remainder","bytes","h1","h1b","c1","c2","k1","murmur","str","k","l","h","MAX_HASH_VALUE","pow","MAX_BUCKETED_NUMBER","bucketKey","ratio","murmurhash","floor","conditionIsMatched","condition","attributes","attribute","value","dateInAttributes","valueInAttributes","Date","dateInCondition","Array","isArray","startsWith","endsWith","allConditionsAreMatched","conditions","and","c","or","not","parseJsonConditionsIfStringified","record","JSON","parse","e","console","error","datafileJson","schemaVersion","revision","segments","features","getRevision","getSchemaVersion","getAllAttributes","getAttribute","attributeKey","find","getSegment","segmentKey","segment","getFeature","featureKey","feature","DatafileReader","_listeners","addListener","eventName","fn","push","removeListener","index","splice","removeAllListeners","forEach","emit","args","Emitter","getMatchedAllocation","traffic","bucketValue","total","usePercentage","allocation","start","end","percentage","getMatchedTrafficAndAllocation","datafileReader","logger","matchedAllocation","matchedTraffic","t","allGroupSegmentsAreMatched","findForceFromFeature","force","f","variation","variations","debug","ruleKey","variationValue","variableSchema","variables","type","variableKey","variableFromVariation","defaultValue","overrides","override","o","DEFAULT_BUCKET_KEY_SEPARATOR","emptyDatafile","fetchDatafileContent","datafileUrl","handleDatafileFetch","fetch","then","json","getValueByType","fieldType","undefined","parseFloat","options","bucketKeySeparator","configureBucketValue","initialFeatures","interceptAttributes","createLogger","refreshInterval","stickyFeatures","emitter","statuses","ready","refreshInProgress","onReady","onRefresh","onUpdate","onActivation","on","bind","off","setDatafile","datafile","startRefreshing","catch","setTimeout","setStickyFeatures","isReady","refresh","warn","isNotSameRevision","info","intervalId","setInterval","stopRefreshing","clearInterval","getBucketKey","attributeKeys","bucketBy","attributeValue","getBucketValue","getBucketedNumber","getVariation","result","finalAttributes","forcedVariation","getForcedVariation","getBucketedVariation","defaultVariation","getVariationBoolean","getVariationString","getVariationInteger","getVariationDouble","activate","filter","capture","activateBoolean","activateString","activateInteger","activateDouble","getVariable","variablesSchema","forcedVariableValue","getForcedVariableValue","getBucketedVariableValue","getVariableBoolean","getVariableString","getVariableInteger","getVariableDouble","getVariableArray","getVariableObject","getVariableJSON","FeaturevisorInstance","loggerPrefix","defaultLogLevels","defaultLogHandler","level","message","details","log","levels","handle","handler","setLevels","Logger","logHandler","segmentIsMatched","groupSegments","groupSegment","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","call","d","definition","defineProperty","enumerable","get","obj","prop","prototype","hasOwnProperty","Symbol","toStringTag"],"sourceRoot":""}
package/lib/instance.d.ts CHANGED
@@ -9,6 +9,7 @@ export interface Statuses {
9
9
  refreshInProgress: boolean;
10
10
  }
11
11
  export interface InstanceOptions {
12
+ bucketKeySeparator?: string;
12
13
  configureBucketValue?: ConfigureBucketValue;
13
14
  datafile?: DatafileContent | string;
14
15
  datafileUrl?: string;
@@ -28,6 +29,7 @@ type FieldType = VariationType | VariableType;
28
29
  type ValueType = VariableValue;
29
30
  export declare function getValueByType(value: ValueType, fieldType: FieldType): ValueType;
30
31
  export declare class FeaturevisorInstance {
32
+ private bucketKeySeparator;
31
33
  private configureBucketValue?;
32
34
  private datafileUrl?;
33
35
  private handleDatafileFetch?;
package/lib/instance.js CHANGED
@@ -3,6 +3,7 @@ import { DatafileReader } from "./datafileReader";
3
3
  import { Emitter } from "./emitter";
4
4
  import { getBucketedNumber } from "./bucket";
5
5
  import { getBucketedVariation, getBucketedVariableValue, getForcedVariation, getForcedVariableValue, } from "./feature";
6
+ var DEFAULT_BUCKET_KEY_SEPARATOR = ".";
6
7
  var emptyDatafile = {
7
8
  schemaVersion: "1",
8
9
  revision: "unknown",
@@ -42,6 +43,7 @@ var FeaturevisorInstance = /** @class */ (function () {
42
43
  function FeaturevisorInstance(options) {
43
44
  var _this = this;
44
45
  // from options
46
+ this.bucketKeySeparator = options.bucketKeySeparator || DEFAULT_BUCKET_KEY_SEPARATOR;
45
47
  this.configureBucketValue = options.configureBucketValue;
46
48
  this.datafileUrl = options.datafileUrl;
47
49
  this.handleDatafileFetch = options.handleDatafileFetch;
@@ -186,8 +188,17 @@ var FeaturevisorInstance = /** @class */ (function () {
186
188
  */
187
189
  FeaturevisorInstance.prototype.getBucketKey = function (feature, attributes) {
188
190
  var featureKey = feature.key;
189
- var prefix = typeof feature.bucketBy === "string" ? feature.bucketBy : feature.bucketBy.join("_");
190
- return "".concat(prefix, "_").concat(featureKey);
191
+ var attributeKeys = typeof feature.bucketBy === "string" ? [feature.bucketBy] : feature.bucketBy;
192
+ var bucketKey = [];
193
+ attributeKeys.forEach(function (attributeKey) {
194
+ var attributeValue = attributes[attributeKey];
195
+ if (typeof attributeValue === "undefined") {
196
+ return;
197
+ }
198
+ bucketKey.push(attributeValue);
199
+ });
200
+ bucketKey.push(featureKey);
201
+ return bucketKey.join(this.bucketKeySeparator);
191
202
  };
192
203
  FeaturevisorInstance.prototype.getBucketValue = function (feature, attributes) {
193
204
  var bucketKey = this.getBucketKey(feature, attributes);
@@ -1 +1 @@
1
- {"version":3,"file":"instance.js","sourceRoot":"","sources":["../src/instance.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"instance.js","sourceRoot":"","sources":["../src/instance.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@featurevisor/sdk",
3
- "version": "0.20.1",
3
+ "version": "0.21.0",
4
4
  "description": "Featurevisor SDK for Node.js and the browser",
5
5
  "main": "dist/index.js",
6
6
  "module": "lib/index.js",
@@ -42,9 +42,9 @@
42
42
  },
43
43
  "license": "MIT",
44
44
  "dependencies": {
45
- "@featurevisor/types": "^0.20.0",
45
+ "@featurevisor/types": "^0.21.0",
46
46
  "compare-versions": "^6.0.0-rc.1",
47
47
  "murmurhash": "^2.0.1"
48
48
  },
49
- "gitHead": "33e3f3d03125c7ec72d837ed5285bcda7761be42"
49
+ "gitHead": "6de1db4b4eb559cb851daae8366d52577f9c3d96"
50
50
  }
package/src/instance.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  Attributes,
3
+ AttributeValue,
3
4
  BucketKey,
4
5
  BucketValue,
5
6
  DatafileContent,
@@ -40,7 +41,10 @@ export interface Statuses {
40
41
  refreshInProgress: boolean;
41
42
  }
42
43
 
44
+ const DEFAULT_BUCKET_KEY_SEPARATOR = ".";
45
+
43
46
  export interface InstanceOptions {
47
+ bucketKeySeparator?: string;
44
48
  configureBucketValue?: ConfigureBucketValue;
45
49
  datafile?: DatafileContent | string;
46
50
  datafileUrl?: string;
@@ -106,6 +110,7 @@ export function getValueByType(value: ValueType, fieldType: FieldType): ValueTyp
106
110
 
107
111
  export class FeaturevisorInstance {
108
112
  // from options
113
+ private bucketKeySeparator: string;
109
114
  private configureBucketValue?: ConfigureBucketValue;
110
115
  private datafileUrl?: string;
111
116
  private handleDatafileFetch?: DatafileFetchHandler;
@@ -130,6 +135,7 @@ export class FeaturevisorInstance {
130
135
 
131
136
  constructor(options: InstanceOptions) {
132
137
  // from options
138
+ this.bucketKeySeparator = options.bucketKeySeparator || DEFAULT_BUCKET_KEY_SEPARATOR;
133
139
  this.configureBucketValue = options.configureBucketValue;
134
140
  this.datafileUrl = options.datafileUrl;
135
141
  this.handleDatafileFetch = options.handleDatafileFetch;
@@ -308,10 +314,24 @@ export class FeaturevisorInstance {
308
314
  private getBucketKey(feature: Feature, attributes: Attributes): BucketKey {
309
315
  const featureKey = feature.key;
310
316
 
311
- const prefix =
312
- typeof feature.bucketBy === "string" ? feature.bucketBy : feature.bucketBy.join("_");
317
+ const attributeKeys =
318
+ typeof feature.bucketBy === "string" ? [feature.bucketBy] : feature.bucketBy;
319
+
320
+ const bucketKey: AttributeValue[] = [];
321
+
322
+ attributeKeys.forEach((attributeKey) => {
323
+ const attributeValue = attributes[attributeKey];
324
+
325
+ if (typeof attributeValue === "undefined") {
326
+ return;
327
+ }
328
+
329
+ bucketKey.push(attributeValue);
330
+ });
331
+
332
+ bucketKey.push(featureKey);
313
333
 
314
- return `${prefix}_${featureKey}`;
334
+ return bucketKey.join(this.bucketKeySeparator);
315
335
  }
316
336
 
317
337
  private getBucketValue(feature: Feature, attributes: Attributes): BucketValue {