@featurevisor/sdk 0.3.0 → 0.5.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 +22 -0
- package/README.md +2 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/lib/client.d.ts +1 -0
- package/lib/client.js +7 -2
- package/lib/client.js.map +1 -1
- package/lib/createInstance.d.ts +34 -0
- package/lib/createInstance.js +84 -0
- package/lib/createInstance.js.map +1 -0
- package/lib/feature.js +17 -1
- package/lib/feature.js.map +1 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +1 -0
- package/lib/index.js.map +1 -1
- package/package.json +3 -3
- package/src/client.ts +9 -3
- package/src/createInstance.ts +155 -0
- package/src/feature.ts +28 -1
- package/src/index.ts +1 -0
- package/tsconfig.cjs.json +2 -1
- package/tsconfig.esm.json +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,28 @@
|
|
|
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.5.0](https://github.com/fahad19/featurevisor/compare/v0.4.0...v0.5.0) (2023-03-22)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### Features
|
|
10
|
+
|
|
11
|
+
* Variable overrides at rule level ([#23](https://github.com/fahad19/featurevisor/issues/23)) ([c4792a0](https://github.com/fahad19/featurevisor/commit/c4792a0beaf33370a3afaafa665491a59e876412))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
# [0.4.0](https://github.com/fahad19/featurevisor/compare/v0.3.0...v0.4.0) (2023-03-19)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
### Features
|
|
21
|
+
|
|
22
|
+
* Create SDK instance for fetching datafile ([#19](https://github.com/fahad19/featurevisor/issues/19)) ([4560fb2](https://github.com/fahad19/featurevisor/commit/4560fb24a1989e46b2d18eb342806e0fc3a50af7))
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
6
28
|
# [0.3.0](https://github.com/fahad19/featurevisor/compare/v0.2.0...v0.3.0) (2023-03-17)
|
|
7
29
|
|
|
8
30
|
|
package/README.md
CHANGED
|
@@ -15,11 +15,11 @@ $ npm install --save @featurevisor/sdk
|
|
|
15
15
|
Initialize the SDK:
|
|
16
16
|
|
|
17
17
|
```js
|
|
18
|
-
import {
|
|
18
|
+
import { createInstance } from "@featurevisor/sdk";
|
|
19
19
|
|
|
20
20
|
const datafileContent = fetch(datafileURL).then((res) => res.json());
|
|
21
21
|
|
|
22
|
-
const sdk =
|
|
22
|
+
const sdk = createInstance({
|
|
23
23
|
// required
|
|
24
24
|
datafile: datafileContent,
|
|
25
25
|
|
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,(()=>{return e={77:e=>{!function(){const t=e=>(new TextEncoder).encode(e);function r(e,r){let n,i,o,a,u,s,c,f;for("string"==typeof e&&(e=t(e)),n=3&e.length,i=e.length-n,o=r,u=3432918353,s=461845907,f=0;f<i;)c=255&e[f]|(255&e[++f])<<8|(255&e[++f])<<16|(255&e[++f])<<24,++f,c=(65535&c)*u+(((c>>>16)*u&65535)<<16)&4294967295,c=c<<15|c>>>17,c=(65535&c)*s+(((c>>>16)*s&65535)<<16)&4294967295,o^=c,o=o<<13|o>>>19,a=5*(65535&o)+((5*(o>>>16)&65535)<<16)&4294967295,o=27492+(65535&a)+((58964+(a>>>16)&65535)<<16);switch(c=0,n){case 3:c^=(255&e[f+2])<<16;case 2:c^=(255&e[f+1])<<8;case 1:c^=255&e[f],c=(65535&c)*u+(((c>>>16)*u&65535)<<16)&4294967295,c=c<<15|c>>>17,c=(65535&c)*s+(((c>>>16)*s&65535)<<16)&4294967295,o^=c}return o^=e.length,o^=o>>>16,o=2246822507*(65535&o)+((2246822507*(o>>>16)&65535)<<16)&4294967295,o^=o>>>13,o=3266489909*(65535&o)+((3266489909*(o>>>16)&65535)<<16)&4294967295,o^=o>>>16,o>>>0}const n=r;n.v2=function(e,r){"string"==typeof e&&(e=t(e));let n,i=e.length,o=r^i,a=0;for(;i>=4;)n=255&e[a]|(255&e[++a])<<8|(255&e[++a])<<16|(255&e[++a])<<24,n=1540483477*(65535&n)+((1540483477*(n>>>16)&65535)<<16),n^=n>>>24,n=1540483477*(65535&n)+((1540483477*(n>>>16)&65535)<<16),o=1540483477*(65535&o)+((1540483477*(o>>>16)&65535)<<16)^n,i-=4,++a;switch(i){case 3:o^=(255&e[a+2])<<16;case 2:o^=(255&e[a+1])<<8;case 1:o^=255&e[a],o=1540483477*(65535&o)+((1540483477*(o>>>16)&65535)<<16)}return o^=o>>>13,o=1540483477*(65535&o)+((1540483477*(o>>>16)&65535)<<16),o^=o>>>15,o>>>0},n.v3=r,e.exports=n}()},725:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getBucketedNumber=t.MAX_BUCKETED_NUMBER=void 0;var n=r(77),i=Math.pow(2,32);t.MAX_BUCKETED_NUMBER=1e5,t.getBucketedNumber=function(e){var r=n.v3(e,1)/i;return Math.floor(r*t.MAX_BUCKETED_NUMBER)}},352:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FeaturevisorSDK=t.getValueByType=void 0;var n=r(913),i=r(522),o=r(725);function a(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=a;var u=function(){function e(e){e.onActivation&&(this.onActivation=e.onActivation),e.configureBucketValue&&(this.configureBucketValue=e.configureBucketValue);try{this.datafileReader=new n.DatafileReader("string"==typeof e.datafile?JSON.parse(e.datafile):e.datafile)}catch(e){console.error("Featurevisor could not parse the datafile"),console.error(e)}}return e.prototype.getFeature=function(e){return"string"==typeof e?this.datafileReader.getFeature(e):e},e.prototype.getBucketKey=function(e,t){var r=e.key,n="string"==typeof e.bucketBy?e.bucketBy:e.bucketBy.join("_");return"".concat(n,"_").concat(r)},e.prototype.getBucketValue=function(e,t){var r=this.getBucketKey(e,t),n=(0,o.getBucketedNumber)(r);return this.configureBucketValue?this.configureBucketValue(e,t,n):n},e.prototype.getVariation=function(e,t){void 0===t&&(t={});try{var r=this.getFeature(e);if(!r)return;var n=(0,i.getForcedVariation)(r,t,this.datafileReader);if(n)return n.value;var o=this.getBucketValue(r,t),a=(0,i.getBucketedVariation)(r,t,o,this.datafileReader);if(!a)return;return a.value}catch(e){return void console.error("[Featurevisor]",e)}},e.prototype.getVariationBoolean=function(e,t){return void 0===t&&(t={}),a(this.getVariation(e,t),"boolean")},e.prototype.getVariationString=function(e,t){return void 0===t&&(t={}),a(this.getVariation(e,t),"string")},e.prototype.getVariationInteger=function(e,t){return void 0===t&&(t={}),a(this.getVariation(e,t),"integer")},e.prototype.getVariationDouble=function(e,t){return void 0===t&&(t={}),a(this.getVariation(e,t),"double")},e.prototype.activate=function(e,t){void 0===t&&(t={});try{var r=this.getVariation(e,t);if(!r)return;if(this.onActivation){var n={};this.datafileReader.getAllAttributes().filter((function(e){return!0===e.capture})).forEach((function(e){void 0!==t[e.key]&&(n[e.key]=t[e.key])})),this.onActivation(e,r,t,n)}return r}catch(e){return void console.error("[Featurevisor]",e)}},e.prototype.activateBoolean=function(e,t){return void 0===t&&(t={}),a(this.activate(e,t),"boolean")},e.prototype.activateString=function(e,t){return void 0===t&&(t={}),a(this.activate(e,t),"string")},e.prototype.activateInteger=function(e,t){return void 0===t&&(t={}),a(this.activate(e,t),"integer")},e.prototype.activateDouble=function(e,t){return void 0===t&&(t={}),a(this.activate(e,t),"double")},e.prototype.getVariable=function(e,t,r){void 0===r&&(r={});try{var n=this.getFeature(e);if(!n)return;var o=(0,i.getForcedVariableValue)(n,t,r,this.datafileReader);if(void 0!==o)return o;var a=this.getBucketValue(n,r);return(0,i.getBucketedVariableValue)(n,t,r,a,this.datafileReader)}catch(e){return void console.error("[Featurevisor]",e)}},e.prototype.getVariableBoolean=function(e,t,r){return void 0===r&&(r={}),a(this.getVariable(e,t,r),"boolean")},e.prototype.getVariableString=function(e,t,r){return void 0===r&&(r={}),a(this.getVariable(e,t,r),"string")},e.prototype.getVariableInteger=function(e,t,r){return void 0===r&&(r={}),a(this.getVariable(e,t,r),"integer")},e.prototype.getVariableDouble=function(e,t,r){return void 0===r&&(r={}),a(this.getVariable(e,t,r),"double")},e.prototype.getVariableArray=function(e,t,r){return void 0===r&&(r={}),a(this.getVariable(e,t,r),"array")},e.prototype.getVariableObject=function(e,t,r){return void 0===r&&(r={}),a(this.getVariable(e,t,r),"object")},e}();t.FeaturevisorSDK=u},243:(e,t)=>{"use strict";function r(e,t){var r=e.attribute,n=e.operator,i=e.value;if("equals"===n)return t[r]===i;if("notEquals"===n)return t[r]!==i;if("string"==typeof t[r]&&Array.isArray(i)){var o=t[r];if("in"===n)return-1!==i.indexOf(o);if("notIn"===n)return-1===i.indexOf(o)}else if("string"==typeof t[r]&&"string"==typeof i){if(o=t[r],"contains"===n)return-1!==o.indexOf(i);if("notContains"===n)return-1===o.indexOf(i);if("startsWith"===n)return o.startsWith(i);if("endsWith"===n)return o.endsWith(i)}else if("number"==typeof t[r]&&"number"==typeof i){if(o=t[r],"greaterThan"===n)return o>i;if("greaterThanOrEquals"===n)return o>=i;if("lessThan"===n)return o<i;if("lessThanOrEquals"===n)return o<=i}return!1}Object.defineProperty(t,"__esModule",{value:!0}),t.allConditionsAreMatched=t.conditionIsMatched=void 0,t.conditionIsMatched=r,t.allConditionsAreMatched=function e(t,n){return"attribute"in t?r(t,n):"and"in t&&Array.isArray(t.and)?t.and.every((function(t){return e(t,n)})):"or"in t&&Array.isArray(t.or)?t.or.some((function(t){return e(t,n)})):"not"in t&&Array.isArray(t.not)?t.not.every((function(r){return!1===e({and:t.not},n)})):!!Array.isArray(t)&&t.every((function(t){return e(t,n)}))}},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 n=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=n},522:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getBucketedVariableValue=t.getForcedVariableValue=t.getBucketedVariation=t.getForcedVariation=t.getMatchedAllocation=t.getMatchedTraffic=void 0;var n=r(590),i=r(243);function o(e,t,r,i){return e.find((function(e){return!(r>e.percentage||!(0,n.allGroupSegmentsAreMatched)("string"==typeof e.segments&&"*"!==e.segments?JSON.parse(e.segments):e.segments,t,i))}))}function a(e,t){for(var r=0,n=0,i=e.allocation;n<i.length;n++){var o=i[n];if(t<=(r+=o.percentage))return o}}function u(e,t,r){if(e.force)return e.force.find((function(e){return e.conditions?(0,i.allConditionsAreMatched)(e.conditions,t):!!e.segments&&(0,n.allGroupSegmentsAreMatched)(e.segments,t,r)}))}function s(e,t,r,n){var i=o(e.traffic,t,r,n);if(i){var u=a(i,r);if(u){var s=u.variation,c=e.variations.find((function(e){return e.value===s}));if(c)return c}}}t.getMatchedTraffic=o,t.getMatchedAllocation=a,t.getForcedVariation=function(e,t,r){var n=u(e,t,r);if(n&&n.variation)return e.variations.find((function(e){return e.value===n.variation}))},t.getBucketedVariation=s,t.getForcedVariableValue=function(e,t,r,n){var i=u(e,r,n);if(i&&i.variables)return i.variables[t]},t.getBucketedVariableValue=function(e,t,r,o,a){var u,c=e.variablesSchema;if(c){var f=c.find((function(e){return e.key===t}));if(f){var d=s(e,r,o,a);if(d){var l=null===(u=d.variables)||void 0===u?void 0:u.find((function(e){return e.key===t}));if(!l)return f.defaultValue;if(l.overrides){var v=l.overrides.find((function(e){return e.conditions?(0,i.allConditionsAreMatched)("string"==typeof e.conditions?JSON.parse(e.conditions):e.conditions,r):!!e.segments&&(0,n.allGroupSegmentsAreMatched)("string"==typeof e.segments&&"*"!==e.segments?JSON.parse(e.segments):e.segments,r,a)}));if(v)return v.value}return l.value}}}}},97:function(e,t,r){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,r,n){void 0===n&&(n=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,n,i)}:function(e,t,r,n){void 0===n&&(n=r),e[n]=t[r]}),i=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||n(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),i(r(725),t),i(r(352),t)},590:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.allGroupSegmentsAreMatched=t.segmentIsMatched=void 0;var n=r(243);function i(e,t){return(0,n.allConditionsAreMatched)(e.conditions,t)}t.segmentIsMatched=i,t.allGroupSegmentsAreMatched=function e(t,r,n){if("*"===t)return!0;if("string"==typeof t){var o=n.getSegment(t);return!!o&&i(o,r)}if("object"==typeof t){if("and"in t&&Array.isArray(t.and))return t.and.every((function(t){return e(t,r,n)}));if("or"in t&&Array.isArray(t.or))return t.or.some((function(t){return e(t,r,n)}));if("not"in t&&Array.isArray(t.not))return t.not.every((function(t){return!1===e(t,r,n)}))}return!!Array.isArray(t)&&t.every((function(t){return e(t,r,n)}))}}},t={},function r(n){var i=t[n];if(void 0!==i)return i.exports;var o=t[n]={exports:{}};return e[n].call(o.exports,o,o.exports,r),o.exports}(97);var e,t}));
|
|
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,(()=>{return e={77:e=>{!function(){const t=e=>(new TextEncoder).encode(e);function r(e,r){let i,n,a,o,u,c,s,f;for("string"==typeof e&&(e=t(e)),i=3&e.length,n=e.length-i,a=r,u=3432918353,c=461845907,f=0;f<n;)s=255&e[f]|(255&e[++f])<<8|(255&e[++f])<<16|(255&e[++f])<<24,++f,s=(65535&s)*u+(((s>>>16)*u&65535)<<16)&4294967295,s=s<<15|s>>>17,s=(65535&s)*c+(((s>>>16)*c&65535)<<16)&4294967295,a^=s,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(s=0,i){case 3:s^=(255&e[f+2])<<16;case 2:s^=(255&e[f+1])<<8;case 1:s^=255&e[f],s=(65535&s)*u+(((s>>>16)*u&65535)<<16)&4294967295,s=s<<15|s>>>17,s=(65535&s)*c+(((s>>>16)*c&65535)<<16)&4294967295,a^=s}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)}},352:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FeaturevisorSDK=t.getValueByType=void 0;var i=r(913),n=r(522),a=r(725);function o(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=o;var u=function(){function e(e){e.onActivation&&(this.onActivation=e.onActivation),e.configureBucketValue&&(this.configureBucketValue=e.configureBucketValue),this.setDatafile(e.datafile)}return e.prototype.setDatafile=function(e){try{this.datafileReader=new i.DatafileReader("string"==typeof e?JSON.parse(e):e)}catch(e){console.error("Featurevisor could not parse the datafile"),console.error(e)}},e.prototype.getFeature=function(e){return"string"==typeof e?this.datafileReader.getFeature(e):e},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,a.getBucketedNumber)(r);return this.configureBucketValue?this.configureBucketValue(e,t,i):i},e.prototype.getVariation=function(e,t){void 0===t&&(t={});try{var r=this.getFeature(e);if(!r)return;var i=(0,n.getForcedVariation)(r,t,this.datafileReader);if(i)return i.value;var a=this.getBucketValue(r,t),o=(0,n.getBucketedVariation)(r,t,a,this.datafileReader);if(!o)return;return o.value}catch(e){return void console.error("[Featurevisor]",e)}},e.prototype.getVariationBoolean=function(e,t){return void 0===t&&(t={}),o(this.getVariation(e,t),"boolean")},e.prototype.getVariationString=function(e,t){return void 0===t&&(t={}),o(this.getVariation(e,t),"string")},e.prototype.getVariationInteger=function(e,t){return void 0===t&&(t={}),o(this.getVariation(e,t),"integer")},e.prototype.getVariationDouble=function(e,t){return void 0===t&&(t={}),o(this.getVariation(e,t),"double")},e.prototype.activate=function(e,t){void 0===t&&(t={});try{var r=this.getVariation(e,t);if(!r)return;if(this.onActivation){var i={};this.datafileReader.getAllAttributes().filter((function(e){return!0===e.capture})).forEach((function(e){void 0!==t[e.key]&&(i[e.key]=t[e.key])})),this.onActivation(e,r,t,i)}return r}catch(e){return void console.error("[Featurevisor]",e)}},e.prototype.activateBoolean=function(e,t){return void 0===t&&(t={}),o(this.activate(e,t),"boolean")},e.prototype.activateString=function(e,t){return void 0===t&&(t={}),o(this.activate(e,t),"string")},e.prototype.activateInteger=function(e,t){return void 0===t&&(t={}),o(this.activate(e,t),"integer")},e.prototype.activateDouble=function(e,t){return void 0===t&&(t={}),o(this.activate(e,t),"double")},e.prototype.getVariable=function(e,t,r){void 0===r&&(r={});try{var i=this.getFeature(e);if(!i)return;var a=(0,n.getForcedVariableValue)(i,t,r,this.datafileReader);if(void 0!==a)return a;var o=this.getBucketValue(i,r);return(0,n.getBucketedVariableValue)(i,t,r,o,this.datafileReader)}catch(e){return void console.error("[Featurevisor]",e)}},e.prototype.getVariableBoolean=function(e,t,r){return void 0===r&&(r={}),o(this.getVariable(e,t,r),"boolean")},e.prototype.getVariableString=function(e,t,r){return void 0===r&&(r={}),o(this.getVariable(e,t,r),"string")},e.prototype.getVariableInteger=function(e,t,r){return void 0===r&&(r={}),o(this.getVariable(e,t,r),"integer")},e.prototype.getVariableDouble=function(e,t,r){return void 0===r&&(r={}),o(this.getVariable(e,t,r),"double")},e.prototype.getVariableArray=function(e,t,r){return void 0===r&&(r={}),o(this.getVariable(e,t,r),"array")},e.prototype.getVariableObject=function(e,t,r){return void 0===r&&(r={}),o(this.getVariable(e,t,r),"object")},e}();t.FeaturevisorSDK=u},243:(e,t)=>{"use strict";function r(e,t){var r=e.attribute,i=e.operator,n=e.value;if("equals"===i)return t[r]===n;if("notEquals"===i)return t[r]!==n;if("string"==typeof t[r]&&Array.isArray(n)){var a=t[r];if("in"===i)return-1!==n.indexOf(a);if("notIn"===i)return-1===n.indexOf(a)}else if("string"==typeof t[r]&&"string"==typeof n){if(a=t[r],"contains"===i)return-1!==a.indexOf(n);if("notContains"===i)return-1===a.indexOf(n);if("startsWith"===i)return a.startsWith(n);if("endsWith"===i)return a.endsWith(n)}else if("number"==typeof t[r]&&"number"==typeof n){if(a=t[r],"greaterThan"===i)return a>n;if("greaterThanOrEquals"===i)return a>=n;if("lessThan"===i)return a<n;if("lessThanOrEquals"===i)return a<=n}return!1}Object.defineProperty(t,"__esModule",{value:!0}),t.allConditionsAreMatched=t.conditionIsMatched=void 0,t.conditionIsMatched=r,t.allConditionsAreMatched=function e(t,i){return"attribute"in t?r(t,i):"and"in t&&Array.isArray(t.and)?t.and.every((function(t){return e(t,i)})):"or"in t&&Array.isArray(t.or)?t.or.some((function(t){return e(t,i)})):"not"in t&&Array.isArray(t.not)?t.not.every((function(r){return!1===e({and:t.not},i)})):!!Array.isArray(t)&&t.every((function(t){return e(t,i)}))}},292:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.createInstance=void 0;var i=r(352);function n(e,t){return{getVariation:e.getVariation.bind(e),getVariationBoolean:e.getVariationBoolean.bind(e),getVariationInteger:e.getVariationInteger.bind(e),getVariationDouble:e.getVariationDouble.bind(e),getVariationString:e.getVariationString.bind(e),activate:e.activate,activateBoolean:e.activateBoolean.bind(e),activateInteger:e.activateInteger.bind(e),activateDouble:e.activateDouble.bind(e),activateString:e.activateString.bind(e),getVariable:e.getVariable.bind(e),getVariableBoolean:e.getVariableBoolean.bind(e),getVariableInteger:e.getVariableInteger.bind(e),getVariableDouble:e.getVariableDouble.bind(e),getVariableString:e.getVariableString.bind(e),getVariableArray:e.getVariableArray.bind(e),getVariableObject:e.getVariableObject.bind(e)}}var a={schemaVersion:"1",revision:"unknown",attributes:[],segments:[],features:[]};t.createInstance=function(e){if(!e.datafile&&!e.datafileUrl)throw new Error("Featurevisor SDK instance cannot be created without `datafile` or `datafileUrl` option");if(e.datafile){var t=new i.FeaturevisorSDK({datafile:e.datafile,onActivation:e.onActivation,configureBucketValue:e.configureBucketValue});if("function"==typeof e.onReady){var r=e.onReady;setTimeout((function(){r()}),0)}return n(t)}var o=new i.FeaturevisorSDK({datafile:a,onActivation:e.onActivation,configureBucketValue:e.configureBucketValue});return e.datafileUrl&&function(e,t){return t.handleDatafileFetch?t.handleDatafileFetch(e):fetch(e).then((function(e){return e.json()}))}(e.datafileUrl,e).then((function(t){o.setDatafile(t),"function"==typeof e.onReady&&e.onReady()})).catch((function(e){console.error("Featurevisor failed to fetch datafile:"),console.error(e)})),n(o)}},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},522:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getBucketedVariableValue=t.getForcedVariableValue=t.getBucketedVariation=t.getForcedVariation=t.getMatchedAllocation=t.getMatchedTraffic=void 0;var i=r(590),n=r(243);function a(e,t,r,n){return e.find((function(e){return!(r>e.percentage||!(0,i.allGroupSegmentsAreMatched)("string"==typeof e.segments&&"*"!==e.segments?JSON.parse(e.segments):e.segments,t,n))}))}function o(e,t){for(var r=0,i=0,n=e.allocation;i<n.length;i++){var a=n[i];if(t<=(r+=a.percentage))return a}}function u(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.getMatchedTraffic=a,t.getMatchedAllocation=o,t.getForcedVariation=function(e,t,r){var i=u(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){var n=a(e.traffic,t,r,i);if(n){var u=o(n,r);if(u){var c=u.variation,s=e.variations.find((function(e){return e.value===c}));if(s)return s}}},t.getForcedVariableValue=function(e,t,r,i){var n=u(e,r,i);if(n&&n.variables)return n.variables[t]},t.getBucketedVariableValue=function(e,t,r,u,c){var s,f=e.variablesSchema;if(f){var l=f.find((function(e){return e.key===t}));if(l){var d=a(e.traffic,r,u,c);if(d){if(d.variables&&void 0!==d.variables[t])return d.variables[t];var g=o(d,u);if(g){var v=g.variation,p=e.variations.find((function(e){return e.value===v}));if(p){var y=null===(s=p.variables)||void 0===s?void 0:s.find((function(e){return e.key===t}));if(!y)return l.defaultValue;if(y.overrides){var b=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,c)}));if(b)return b.value}return y.value}}}}}}},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(352),t),n(r(292),t)},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}(97);var e,t}));
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","mappings":"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","sources":["webpack://FeaturevisorSDK/webpack/universalModuleDefinition","webpack://FeaturevisorSDK/../../node_modules/murmurhash/murmurhash.js","webpack://FeaturevisorSDK/./src/bucket.ts","webpack://FeaturevisorSDK/./src/client.ts","webpack://FeaturevisorSDK/./src/conditions.ts","webpack://FeaturevisorSDK/./src/datafileReader.ts","webpack://FeaturevisorSDK/./src/feature.ts","webpack://FeaturevisorSDK/./src/index.ts","webpack://FeaturevisorSDK/./src/segments.ts","webpack://FeaturevisorSDK/webpack/bootstrap","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 ","(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 {\n Attributes,\n VariationValue,\n VariableValue,\n Feature,\n DatafileContent,\n BucketKey,\n BucketValue,\n FeatureKey,\n VariableObjectValue,\n} from \"@featurevisor/types\";\nimport { DatafileReader } from \"./datafileReader\";\nimport {\n getBucketedVariation,\n getBucketedVariableValue,\n getForcedVariation,\n getForcedVariableValue,\n} from \"./feature\";\nimport { getBucketedNumber } from \"./bucket\";\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;\nexport interface SdkOptions {\n datafile: DatafileContent | string;\n onActivation?: ActivationCallback;\n configureBucketValue?: ConfigureBucketValue;\n}\n\n// union of VariableValue and VariationValue\ntype FieldType = \"string\" | \"integer\" | \"double\" | \"boolean\" | \"array\" | \"object\";\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 default:\n return value;\n }\n}\n\nexport class FeaturevisorSDK {\n private onActivation?: ActivationCallback;\n private datafileReader: DatafileReader;\n private configureBucketValue?: ConfigureBucketValue;\n\n constructor(options: SdkOptions) {\n if (options.onActivation) {\n this.onActivation = options.onActivation;\n }\n\n if (options.configureBucketValue) {\n this.configureBucketValue = options.configureBucketValue;\n }\n\n try {\n this.datafileReader = new DatafileReader(\n typeof options.datafile === \"string\" ? JSON.parse(options.datafile) : options.datafile,\n );\n } catch (e) {\n console.error(`Featurevisor could not parse the datafile`);\n console.error(e);\n }\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 * Bucketing\n */\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 feature = this.getFeature(featureKey);\n\n if (!feature) {\n return undefined;\n }\n\n const forcedVariation = getForcedVariation(feature, attributes, this.datafileReader);\n\n if (forcedVariation) {\n return forcedVariation.value;\n }\n\n const bucketValue = this.getBucketValue(feature, attributes);\n\n const variation = getBucketedVariation(feature, attributes, bucketValue, this.datafileReader);\n\n if (!variation) {\n return undefined;\n }\n\n return variation.value;\n } catch (e) {\n console.error(\"[Featurevisor]\", 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 (!variationValue) {\n return undefined;\n }\n\n if (this.onActivation) {\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 attributes[a.key] !== \"undefined\") {\n captureAttributes[a.key] = attributes[a.key];\n }\n });\n\n this.onActivation(featureKey, variationValue, attributes, captureAttributes);\n }\n\n return variationValue;\n } catch (e) {\n console.error(\"[Featurevisor]\", 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 feature = this.getFeature(featureKey);\n\n if (!feature) {\n return undefined;\n }\n\n const forcedVariableValue = getForcedVariableValue(\n feature,\n variableKey,\n attributes,\n this.datafileReader,\n );\n\n if (typeof forcedVariableValue !== \"undefined\") {\n return forcedVariableValue;\n }\n\n const bucketValue = this.getBucketValue(feature, attributes);\n\n return getBucketedVariableValue(\n feature,\n variableKey,\n attributes,\n bucketValue,\n this.datafileReader,\n );\n } catch (e) {\n console.error(\"[Featurevisor]\", 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","import { 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 (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 }\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","import {\n Allocation,\n Attributes,\n Traffic,\n Feature,\n Variation,\n VariableKey,\n VariableValue,\n Force,\n} from \"@featurevisor/types\";\nimport { DatafileReader } from \"./datafileReader\";\nimport { allGroupSegmentsAreMatched } from \"./segments\";\nimport { allConditionsAreMatched } from \"./conditions\";\n\nexport function getMatchedTraffic(\n traffic: Traffic[],\n attributes: Attributes,\n bucketValue: number,\n datafileReader: DatafileReader,\n): Traffic | undefined {\n return traffic.find((traffic) => {\n if (bucketValue > traffic.percentage) {\n // out of bucket range\n return false;\n }\n\n if (\n !allGroupSegmentsAreMatched(\n typeof traffic.segments === \"string\" && traffic.segments !== \"*\"\n ? JSON.parse(traffic.segments)\n : traffic.segments,\n attributes,\n datafileReader,\n )\n ) {\n return false;\n }\n\n return true;\n });\n}\n\n// @TODO: make this function better with tests\nexport function getMatchedAllocation(\n matchedTraffic: Traffic,\n bucketValue: number,\n): Allocation | undefined {\n let total = 0;\n\n for (const allocation of matchedTraffic.allocation) {\n total += allocation.percentage;\n\n if (bucketValue <= total) {\n return allocation;\n }\n }\n\n return undefined;\n}\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): Variation | undefined {\n const matchedTraffic = getMatchedTraffic(\n feature.traffic,\n attributes,\n bucketValue,\n datafileReader,\n );\n\n if (!matchedTraffic) {\n return undefined;\n }\n\n const allocation = getMatchedAllocation(matchedTraffic, bucketValue);\n\n if (!allocation) {\n return undefined;\n }\n\n const variationValue = allocation.variation;\n\n const variation = feature.variations.find((v) => {\n return v.value === variationValue;\n });\n\n if (!variation) {\n return undefined;\n }\n\n return variation;\n}\n\nexport function getForcedVariableValue(\n feature: Feature,\n variableKey: VariableKey,\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 return force.variables[variableKey];\n}\n\nexport function getBucketedVariableValue(\n feature: Feature,\n variableKey: VariableKey,\n attributes: Attributes,\n bucketValue: number,\n datafileReader: DatafileReader,\n): VariableValue | undefined {\n // all variables\n const variablesSchema = feature.variablesSchema;\n\n if (!variablesSchema) {\n return undefined;\n }\n\n // single variable\n const variableSchema = variablesSchema.find((v) => {\n return v.key === variableKey;\n });\n\n if (!variableSchema) {\n return undefined;\n }\n\n const variation = getBucketedVariation(feature, attributes, bucketValue, datafileReader);\n\n if (!variation) {\n return undefined;\n }\n\n const variableFromVariation = variation.variables?.find((v) => {\n return v.key === variableKey;\n });\n\n if (!variableFromVariation) {\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 return override.value;\n }\n }\n\n return variableFromVariation.value;\n}\n","export * from \"./bucket\";\nexport * from \"./client\";\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","// 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","createBuffer","val","TextEncoder","encode","MurmurHashV3","key","seed","remainder","bytes","h1","h1b","c1","c2","k1","i","length","murmur","v2","str","k","l","h","v3","MAX_HASH_VALUE","Math","pow","MAX_BUCKETED_NUMBER","bucketKey","ratio","murmurhash","floor","getValueByType","value","fieldType","undefined","parseInt","parseFloat","Array","isArray","options","onActivation","configureBucketValue","datafileReader","DatafileReader","datafile","JSON","parse","e","console","error","getFeature","featureKey","getBucketKey","feature","attributes","prefix","bucketBy","join","getBucketValue","getBucketedNumber","getVariation","forcedVariation","getForcedVariation","bucketValue","variation","getBucketedVariation","getVariationBoolean","getVariationString","getVariationInteger","getVariationDouble","activate","variationValue","getAllAttributes","filter","a","capture","forEach","activateBoolean","activateString","activateInteger","activateDouble","getVariable","variableKey","forcedVariableValue","getForcedVariableValue","getBucketedVariableValue","getVariableBoolean","getVariableString","getVariableInteger","getVariableDouble","getVariableArray","getVariableObject","FeaturevisorSDK","conditionIsMatched","condition","attribute","operator","valueInAttributes","indexOf","startsWith","endsWith","allConditionsAreMatched","conditions","and","every","c","or","some","not","parseJsonConditionsIfStringified","record","datafileJson","schemaVersion","revision","segments","features","getRevision","getSchemaVersion","getAttribute","attributeKey","find","getSegment","segmentKey","segment","s","getMatchedTraffic","traffic","percentage","allGroupSegmentsAreMatched","getMatchedAllocation","matchedTraffic","total","allocation","findForceFromFeature","force","f","variations","v","variables","variablesSchema","variableSchema","variableFromVariation","defaultValue","overrides","override","o","segmentIsMatched","groupSegments","groupSegment","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","call"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"index.js","mappings":"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","sources":["webpack://FeaturevisorSDK/webpack/universalModuleDefinition","webpack://FeaturevisorSDK/../../node_modules/murmurhash/murmurhash.js","webpack://FeaturevisorSDK/./src/bucket.ts","webpack://FeaturevisorSDK/./src/client.ts","webpack://FeaturevisorSDK/./src/conditions.ts","webpack://FeaturevisorSDK/./src/createInstance.ts","webpack://FeaturevisorSDK/./src/datafileReader.ts","webpack://FeaturevisorSDK/./src/feature.ts","webpack://FeaturevisorSDK/./src/index.ts","webpack://FeaturevisorSDK/./src/segments.ts","webpack://FeaturevisorSDK/webpack/bootstrap","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 ","(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 {\n Attributes,\n VariationValue,\n VariableValue,\n Feature,\n DatafileContent,\n BucketKey,\n BucketValue,\n FeatureKey,\n} from \"@featurevisor/types\";\nimport { DatafileReader } from \"./datafileReader\";\nimport {\n getBucketedVariation,\n getBucketedVariableValue,\n getForcedVariation,\n getForcedVariableValue,\n} from \"./feature\";\nimport { getBucketedNumber } from \"./bucket\";\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 SdkOptions {\n datafile: DatafileContent | string;\n onActivation?: ActivationCallback; // @TODO: move it to FeaturevisorInstance in next breaking semver\n configureBucketValue?: ConfigureBucketValue;\n}\n\n// union of VariableValue and VariationValue\ntype FieldType = \"string\" | \"integer\" | \"double\" | \"boolean\" | \"array\" | \"object\";\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 default:\n return value;\n }\n}\n\n// @TODO: change it to FeaturevisorEngine in next breaking semver\n// @TODO: move activate*() methods to FeaturevisorInstance in next breaking semver\nexport class FeaturevisorSDK {\n private onActivation?: ActivationCallback;\n private datafileReader: DatafileReader;\n private configureBucketValue?: ConfigureBucketValue;\n\n constructor(options: SdkOptions) {\n if (options.onActivation) {\n this.onActivation = options.onActivation;\n }\n\n if (options.configureBucketValue) {\n this.configureBucketValue = options.configureBucketValue;\n }\n\n this.setDatafile(options.datafile);\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 console.error(`Featurevisor could not parse the datafile`);\n console.error(e);\n }\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 * Bucketing\n */\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 feature = this.getFeature(featureKey);\n\n if (!feature) {\n return undefined;\n }\n\n const forcedVariation = getForcedVariation(feature, attributes, this.datafileReader);\n\n if (forcedVariation) {\n return forcedVariation.value;\n }\n\n const bucketValue = this.getBucketValue(feature, attributes);\n\n const variation = getBucketedVariation(feature, attributes, bucketValue, this.datafileReader);\n\n if (!variation) {\n return undefined;\n }\n\n return variation.value;\n } catch (e) {\n console.error(\"[Featurevisor]\", 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 (!variationValue) {\n return undefined;\n }\n\n if (this.onActivation) {\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 attributes[a.key] !== \"undefined\") {\n captureAttributes[a.key] = attributes[a.key];\n }\n });\n\n this.onActivation(featureKey, variationValue, attributes, captureAttributes);\n }\n\n return variationValue;\n } catch (e) {\n console.error(\"[Featurevisor]\", 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 feature = this.getFeature(featureKey);\n\n if (!feature) {\n return undefined;\n }\n\n const forcedVariableValue = getForcedVariableValue(\n feature,\n variableKey,\n attributes,\n this.datafileReader,\n );\n\n if (typeof forcedVariableValue !== \"undefined\") {\n return forcedVariableValue;\n }\n\n const bucketValue = this.getBucketValue(feature, attributes);\n\n return getBucketedVariableValue(\n feature,\n variableKey,\n attributes,\n bucketValue,\n this.datafileReader,\n );\n } catch (e) {\n console.error(\"[Featurevisor]\", 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","import { 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 (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 }\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 { DatafileContent } from \"@featurevisor/types\";\nimport { FeaturevisorSDK, ConfigureBucketValue, ActivationCallback } from \"./client\";\n\nexport type ReadyCallback = () => void;\n\nexport interface InstanceOptions {\n // from SdkOptions\n datafile?: DatafileContent | string; // optional here, but not in SdkOptions\n onActivation?: ActivationCallback;\n configureBucketValue?: ConfigureBucketValue;\n\n // additions\n datafileUrl?: string;\n onReady?: ReadyCallback;\n handleDatafileFetch?: (datafileUrl: string) => Promise<DatafileContent>;\n}\n\n// @TODO: consider renaming it to FeaturevisorSDK in next breaking semver\nexport interface FeaturevisorInstance {\n /**\n * From FeaturevisorSDK\n */\n\n // variation\n getVariation: FeaturevisorSDK[\"getVariation\"];\n getVariationBoolean: FeaturevisorSDK[\"getVariationBoolean\"];\n getVariationInteger: FeaturevisorSDK[\"getVariationInteger\"];\n getVariationDouble: FeaturevisorSDK[\"getVariationDouble\"];\n getVariationString: FeaturevisorSDK[\"getVariationString\"];\n\n // activate\n activate: FeaturevisorSDK[\"activate\"];\n activateBoolean: FeaturevisorSDK[\"activateBoolean\"];\n activateInteger: FeaturevisorSDK[\"activateInteger\"];\n activateDouble: FeaturevisorSDK[\"activateDouble\"];\n activateString: FeaturevisorSDK[\"activateString\"];\n\n // variable\n getVariable: FeaturevisorSDK[\"getVariable\"];\n getVariableBoolean: FeaturevisorSDK[\"getVariableBoolean\"];\n getVariableInteger: FeaturevisorSDK[\"getVariableInteger\"];\n getVariableDouble: FeaturevisorSDK[\"getVariableDouble\"];\n getVariableString: FeaturevisorSDK[\"getVariableString\"];\n getVariableArray: FeaturevisorSDK[\"getVariableArray\"];\n getVariableObject: FeaturevisorSDK[\"getVariableObject\"];\n\n /**\n * Additions\n *\n * @TODO\n */\n // start: () => void;\n // stop: () => void;\n // refresh: () => void;\n}\n\nfunction getInstanceFromSdk(sdk: FeaturevisorSDK, options: InstanceOptions): FeaturevisorInstance {\n return {\n // variation\n getVariation: sdk.getVariation.bind(sdk),\n getVariationBoolean: sdk.getVariationBoolean.bind(sdk),\n getVariationInteger: sdk.getVariationInteger.bind(sdk),\n getVariationDouble: sdk.getVariationDouble.bind(sdk),\n getVariationString: sdk.getVariationString.bind(sdk),\n\n // activate\n activate: sdk.activate,\n activateBoolean: sdk.activateBoolean.bind(sdk),\n activateInteger: sdk.activateInteger.bind(sdk),\n activateDouble: sdk.activateDouble.bind(sdk),\n activateString: sdk.activateString.bind(sdk),\n\n // variable\n getVariable: sdk.getVariable.bind(sdk),\n getVariableBoolean: sdk.getVariableBoolean.bind(sdk),\n getVariableInteger: sdk.getVariableInteger.bind(sdk),\n getVariableDouble: sdk.getVariableDouble.bind(sdk),\n getVariableString: sdk.getVariableString.bind(sdk),\n getVariableArray: sdk.getVariableArray.bind(sdk),\n getVariableObject: sdk.getVariableObject.bind(sdk),\n\n // additions\n // @TODO\n // start: () => {},\n // stop: () => {},\n // refresh: () => {},\n };\n}\n\nconst emptyDatafile: DatafileContent = {\n schemaVersion: \"1\",\n revision: \"unknown\",\n attributes: [],\n segments: [],\n features: [],\n};\n\nfunction fetchDatafileContent(datafileUrl, options: InstanceOptions): Promise<DatafileContent> {\n if (options.handleDatafileFetch) {\n return options.handleDatafileFetch(datafileUrl);\n }\n\n return fetch(datafileUrl).then((res) => res.json());\n}\n\nexport function createInstance(options: InstanceOptions) {\n if (!options.datafile && !options.datafileUrl) {\n throw new Error(\n \"Featurevisor SDK instance cannot be created without `datafile` or `datafileUrl` option\",\n );\n }\n\n // datafile content is already provided\n if (options.datafile) {\n const sdk = new FeaturevisorSDK({\n datafile: options.datafile,\n onActivation: options.onActivation,\n configureBucketValue: options.configureBucketValue,\n });\n\n if (typeof options.onReady === \"function\") {\n const onReady = options.onReady;\n\n setTimeout(function () {\n onReady();\n }, 0);\n }\n\n return getInstanceFromSdk(sdk, options);\n }\n\n // datafile has to be fetched\n const sdk = new FeaturevisorSDK({\n datafile: emptyDatafile,\n onActivation: options.onActivation,\n configureBucketValue: options.configureBucketValue,\n });\n\n if (options.datafileUrl) {\n fetchDatafileContent(options.datafileUrl, options)\n .then((datafile) => {\n sdk.setDatafile(datafile);\n\n if (typeof options.onReady === \"function\") {\n options.onReady();\n }\n })\n .catch((e) => {\n console.error(\"Featurevisor failed to fetch datafile:\");\n console.error(e);\n });\n }\n\n return getInstanceFromSdk(sdk, options);\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","import {\n Allocation,\n Attributes,\n Traffic,\n Feature,\n Variation,\n VariableKey,\n VariableValue,\n Force,\n} from \"@featurevisor/types\";\nimport { DatafileReader } from \"./datafileReader\";\nimport { allGroupSegmentsAreMatched } from \"./segments\";\nimport { allConditionsAreMatched } from \"./conditions\";\n\nexport function getMatchedTraffic(\n traffic: Traffic[],\n attributes: Attributes,\n bucketValue: number,\n datafileReader: DatafileReader,\n): Traffic | undefined {\n return traffic.find((traffic) => {\n if (bucketValue > traffic.percentage) {\n // out of bucket range\n return false;\n }\n\n if (\n !allGroupSegmentsAreMatched(\n typeof traffic.segments === \"string\" && traffic.segments !== \"*\"\n ? JSON.parse(traffic.segments)\n : traffic.segments,\n attributes,\n datafileReader,\n )\n ) {\n return false;\n }\n\n return true;\n });\n}\n\n// @TODO: make this function better with tests\nexport function getMatchedAllocation(\n matchedTraffic: Traffic,\n bucketValue: number,\n): Allocation | undefined {\n let total = 0;\n\n for (const allocation of matchedTraffic.allocation) {\n total += allocation.percentage;\n\n if (bucketValue <= total) {\n return allocation;\n }\n }\n\n return undefined;\n}\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): Variation | undefined {\n const matchedTraffic = getMatchedTraffic(\n feature.traffic,\n attributes,\n bucketValue,\n datafileReader,\n );\n\n if (!matchedTraffic) {\n return undefined;\n }\n\n const allocation = getMatchedAllocation(matchedTraffic, bucketValue);\n\n if (!allocation) {\n return undefined;\n }\n\n const variationValue = allocation.variation;\n\n const variation = feature.variations.find((v) => {\n return v.value === variationValue;\n });\n\n if (!variation) {\n return undefined;\n }\n\n return variation;\n}\n\nexport function getForcedVariableValue(\n feature: Feature,\n variableKey: VariableKey,\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 return force.variables[variableKey];\n}\n\nexport function getBucketedVariableValue(\n feature: Feature,\n variableKey: VariableKey,\n attributes: Attributes,\n bucketValue: number,\n datafileReader: DatafileReader,\n): VariableValue | undefined {\n // all variables\n const variablesSchema = feature.variablesSchema;\n\n if (!variablesSchema) {\n return undefined;\n }\n\n // single variable\n const variableSchema = variablesSchema.find((v) => {\n return v.key === variableKey;\n });\n\n if (!variableSchema) {\n return undefined;\n }\n\n // get traffic\n const matchedTraffic = getMatchedTraffic(\n feature.traffic,\n attributes,\n bucketValue,\n datafileReader,\n );\n\n if (!matchedTraffic) {\n return undefined;\n }\n\n // see if variable is set at traffic/rule level\n if (matchedTraffic.variables && typeof matchedTraffic.variables[variableKey] !== \"undefined\") {\n return matchedTraffic.variables[variableKey];\n }\n\n const allocation = getMatchedAllocation(matchedTraffic, bucketValue);\n\n if (!allocation) {\n return undefined;\n }\n\n const variationValue = allocation.variation;\n\n const variation = feature.variations.find((v) => {\n return v.value === variationValue;\n });\n\n if (!variation) {\n return undefined;\n }\n\n const variableFromVariation = variation.variables?.find((v) => {\n return v.key === variableKey;\n });\n\n if (!variableFromVariation) {\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 return override.value;\n }\n }\n\n return variableFromVariation.value;\n}\n","export * from \"./bucket\";\nexport * from \"./client\";\nexport * from \"./createInstance\";\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","// 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","createBuffer","val","TextEncoder","encode","MurmurHashV3","key","seed","remainder","bytes","h1","h1b","c1","c2","k1","i","length","murmur","v2","str","k","l","h","v3","MAX_HASH_VALUE","Math","pow","MAX_BUCKETED_NUMBER","bucketKey","ratio","murmurhash","floor","getValueByType","value","fieldType","undefined","parseInt","parseFloat","Array","isArray","options","onActivation","configureBucketValue","setDatafile","datafile","datafileReader","DatafileReader","JSON","parse","e","console","error","getFeature","featureKey","getBucketKey","feature","attributes","prefix","bucketBy","join","getBucketValue","getBucketedNumber","getVariation","forcedVariation","getForcedVariation","bucketValue","variation","getBucketedVariation","getVariationBoolean","getVariationString","getVariationInteger","getVariationDouble","activate","variationValue","getAllAttributes","filter","a","capture","forEach","activateBoolean","activateString","activateInteger","activateDouble","getVariable","variableKey","forcedVariableValue","getForcedVariableValue","getBucketedVariableValue","getVariableBoolean","getVariableString","getVariableInteger","getVariableDouble","getVariableArray","getVariableObject","FeaturevisorSDK","conditionIsMatched","condition","attribute","operator","valueInAttributes","indexOf","startsWith","endsWith","allConditionsAreMatched","conditions","and","every","c","or","some","not","getInstanceFromSdk","sdk","bind","emptyDatafile","schemaVersion","revision","segments","features","datafileUrl","Error","onReady","setTimeout","handleDatafileFetch","fetch","then","res","json","fetchDatafileContent","catch","parseJsonConditionsIfStringified","record","datafileJson","getRevision","getSchemaVersion","getAttribute","attributeKey","find","getSegment","segmentKey","segment","s","getMatchedTraffic","traffic","percentage","allGroupSegmentsAreMatched","getMatchedAllocation","matchedTraffic","total","allocation","findForceFromFeature","force","f","variations","v","variables","variablesSchema","variableSchema","variableFromVariation","defaultValue","overrides","override","o","segmentIsMatched","groupSegments","groupSegment","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","call"],"sourceRoot":""}
|
package/lib/client.d.ts
CHANGED
package/lib/client.js
CHANGED
|
@@ -22,6 +22,8 @@ export function getValueByType(value, fieldType) {
|
|
|
22
22
|
return value;
|
|
23
23
|
}
|
|
24
24
|
}
|
|
25
|
+
// @TODO: change it to FeaturevisorEngine in next breaking semver
|
|
26
|
+
// @TODO: move activate*() methods to FeaturevisorInstance in next breaking semver
|
|
25
27
|
var FeaturevisorSDK = /** @class */ (function () {
|
|
26
28
|
function FeaturevisorSDK(options) {
|
|
27
29
|
if (options.onActivation) {
|
|
@@ -30,14 +32,17 @@ var FeaturevisorSDK = /** @class */ (function () {
|
|
|
30
32
|
if (options.configureBucketValue) {
|
|
31
33
|
this.configureBucketValue = options.configureBucketValue;
|
|
32
34
|
}
|
|
35
|
+
this.setDatafile(options.datafile);
|
|
36
|
+
}
|
|
37
|
+
FeaturevisorSDK.prototype.setDatafile = function (datafile) {
|
|
33
38
|
try {
|
|
34
|
-
this.datafileReader = new DatafileReader(typeof
|
|
39
|
+
this.datafileReader = new DatafileReader(typeof datafile === "string" ? JSON.parse(datafile) : datafile);
|
|
35
40
|
}
|
|
36
41
|
catch (e) {
|
|
37
42
|
console.error("Featurevisor could not parse the datafile");
|
|
38
43
|
console.error(e);
|
|
39
44
|
}
|
|
40
|
-
}
|
|
45
|
+
};
|
|
41
46
|
FeaturevisorSDK.prototype.getFeature = function (featureKey) {
|
|
42
47
|
return typeof featureKey === "string"
|
|
43
48
|
? this.datafileReader.getFeature(featureKey) // only key provided
|
package/lib/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { DatafileContent } from "@featurevisor/types";
|
|
2
|
+
import { FeaturevisorSDK, ConfigureBucketValue, ActivationCallback } from "./client";
|
|
3
|
+
export type ReadyCallback = () => void;
|
|
4
|
+
export interface InstanceOptions {
|
|
5
|
+
datafile?: DatafileContent | string;
|
|
6
|
+
onActivation?: ActivationCallback;
|
|
7
|
+
configureBucketValue?: ConfigureBucketValue;
|
|
8
|
+
datafileUrl?: string;
|
|
9
|
+
onReady?: ReadyCallback;
|
|
10
|
+
handleDatafileFetch?: (datafileUrl: string) => Promise<DatafileContent>;
|
|
11
|
+
}
|
|
12
|
+
export interface FeaturevisorInstance {
|
|
13
|
+
/**
|
|
14
|
+
* From FeaturevisorSDK
|
|
15
|
+
*/
|
|
16
|
+
getVariation: FeaturevisorSDK["getVariation"];
|
|
17
|
+
getVariationBoolean: FeaturevisorSDK["getVariationBoolean"];
|
|
18
|
+
getVariationInteger: FeaturevisorSDK["getVariationInteger"];
|
|
19
|
+
getVariationDouble: FeaturevisorSDK["getVariationDouble"];
|
|
20
|
+
getVariationString: FeaturevisorSDK["getVariationString"];
|
|
21
|
+
activate: FeaturevisorSDK["activate"];
|
|
22
|
+
activateBoolean: FeaturevisorSDK["activateBoolean"];
|
|
23
|
+
activateInteger: FeaturevisorSDK["activateInteger"];
|
|
24
|
+
activateDouble: FeaturevisorSDK["activateDouble"];
|
|
25
|
+
activateString: FeaturevisorSDK["activateString"];
|
|
26
|
+
getVariable: FeaturevisorSDK["getVariable"];
|
|
27
|
+
getVariableBoolean: FeaturevisorSDK["getVariableBoolean"];
|
|
28
|
+
getVariableInteger: FeaturevisorSDK["getVariableInteger"];
|
|
29
|
+
getVariableDouble: FeaturevisorSDK["getVariableDouble"];
|
|
30
|
+
getVariableString: FeaturevisorSDK["getVariableString"];
|
|
31
|
+
getVariableArray: FeaturevisorSDK["getVariableArray"];
|
|
32
|
+
getVariableObject: FeaturevisorSDK["getVariableObject"];
|
|
33
|
+
}
|
|
34
|
+
export declare function createInstance(options: InstanceOptions): FeaturevisorInstance;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { FeaturevisorSDK } from "./client";
|
|
2
|
+
function getInstanceFromSdk(sdk, options) {
|
|
3
|
+
return {
|
|
4
|
+
// variation
|
|
5
|
+
getVariation: sdk.getVariation.bind(sdk),
|
|
6
|
+
getVariationBoolean: sdk.getVariationBoolean.bind(sdk),
|
|
7
|
+
getVariationInteger: sdk.getVariationInteger.bind(sdk),
|
|
8
|
+
getVariationDouble: sdk.getVariationDouble.bind(sdk),
|
|
9
|
+
getVariationString: sdk.getVariationString.bind(sdk),
|
|
10
|
+
// activate
|
|
11
|
+
activate: sdk.activate,
|
|
12
|
+
activateBoolean: sdk.activateBoolean.bind(sdk),
|
|
13
|
+
activateInteger: sdk.activateInteger.bind(sdk),
|
|
14
|
+
activateDouble: sdk.activateDouble.bind(sdk),
|
|
15
|
+
activateString: sdk.activateString.bind(sdk),
|
|
16
|
+
// variable
|
|
17
|
+
getVariable: sdk.getVariable.bind(sdk),
|
|
18
|
+
getVariableBoolean: sdk.getVariableBoolean.bind(sdk),
|
|
19
|
+
getVariableInteger: sdk.getVariableInteger.bind(sdk),
|
|
20
|
+
getVariableDouble: sdk.getVariableDouble.bind(sdk),
|
|
21
|
+
getVariableString: sdk.getVariableString.bind(sdk),
|
|
22
|
+
getVariableArray: sdk.getVariableArray.bind(sdk),
|
|
23
|
+
getVariableObject: sdk.getVariableObject.bind(sdk),
|
|
24
|
+
// additions
|
|
25
|
+
// @TODO
|
|
26
|
+
// start: () => {},
|
|
27
|
+
// stop: () => {},
|
|
28
|
+
// refresh: () => {},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
var emptyDatafile = {
|
|
32
|
+
schemaVersion: "1",
|
|
33
|
+
revision: "unknown",
|
|
34
|
+
attributes: [],
|
|
35
|
+
segments: [],
|
|
36
|
+
features: [],
|
|
37
|
+
};
|
|
38
|
+
function fetchDatafileContent(datafileUrl, options) {
|
|
39
|
+
if (options.handleDatafileFetch) {
|
|
40
|
+
return options.handleDatafileFetch(datafileUrl);
|
|
41
|
+
}
|
|
42
|
+
return fetch(datafileUrl).then(function (res) { return res.json(); });
|
|
43
|
+
}
|
|
44
|
+
export function createInstance(options) {
|
|
45
|
+
if (!options.datafile && !options.datafileUrl) {
|
|
46
|
+
throw new Error("Featurevisor SDK instance cannot be created without `datafile` or `datafileUrl` option");
|
|
47
|
+
}
|
|
48
|
+
// datafile content is already provided
|
|
49
|
+
if (options.datafile) {
|
|
50
|
+
var sdk_1 = new FeaturevisorSDK({
|
|
51
|
+
datafile: options.datafile,
|
|
52
|
+
onActivation: options.onActivation,
|
|
53
|
+
configureBucketValue: options.configureBucketValue,
|
|
54
|
+
});
|
|
55
|
+
if (typeof options.onReady === "function") {
|
|
56
|
+
var onReady_1 = options.onReady;
|
|
57
|
+
setTimeout(function () {
|
|
58
|
+
onReady_1();
|
|
59
|
+
}, 0);
|
|
60
|
+
}
|
|
61
|
+
return getInstanceFromSdk(sdk_1, options);
|
|
62
|
+
}
|
|
63
|
+
// datafile has to be fetched
|
|
64
|
+
var sdk = new FeaturevisorSDK({
|
|
65
|
+
datafile: emptyDatafile,
|
|
66
|
+
onActivation: options.onActivation,
|
|
67
|
+
configureBucketValue: options.configureBucketValue,
|
|
68
|
+
});
|
|
69
|
+
if (options.datafileUrl) {
|
|
70
|
+
fetchDatafileContent(options.datafileUrl, options)
|
|
71
|
+
.then(function (datafile) {
|
|
72
|
+
sdk.setDatafile(datafile);
|
|
73
|
+
if (typeof options.onReady === "function") {
|
|
74
|
+
options.onReady();
|
|
75
|
+
}
|
|
76
|
+
})
|
|
77
|
+
.catch(function (e) {
|
|
78
|
+
console.error("Featurevisor failed to fetch datafile:");
|
|
79
|
+
console.error(e);
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
return getInstanceFromSdk(sdk, options);
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=createInstance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createInstance.js","sourceRoot":"","sources":["../src/createInstance.ts"],"names":[],"mappings":"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"}
|
package/lib/feature.js
CHANGED
|
@@ -86,7 +86,23 @@ export function getBucketedVariableValue(feature, variableKey, attributes, bucke
|
|
|
86
86
|
if (!variableSchema) {
|
|
87
87
|
return undefined;
|
|
88
88
|
}
|
|
89
|
-
|
|
89
|
+
// get traffic
|
|
90
|
+
var matchedTraffic = getMatchedTraffic(feature.traffic, attributes, bucketValue, datafileReader);
|
|
91
|
+
if (!matchedTraffic) {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
// see if variable is set at traffic/rule level
|
|
95
|
+
if (matchedTraffic.variables && typeof matchedTraffic.variables[variableKey] !== "undefined") {
|
|
96
|
+
return matchedTraffic.variables[variableKey];
|
|
97
|
+
}
|
|
98
|
+
var allocation = getMatchedAllocation(matchedTraffic, bucketValue);
|
|
99
|
+
if (!allocation) {
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
var variationValue = allocation.variation;
|
|
103
|
+
var variation = feature.variations.find(function (v) {
|
|
104
|
+
return v.value === variationValue;
|
|
105
|
+
});
|
|
90
106
|
if (!variation) {
|
|
91
107
|
return undefined;
|
|
92
108
|
}
|
package/lib/feature.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"feature.js","sourceRoot":"","sources":["../src/feature.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"feature.js","sourceRoot":"","sources":["../src/feature.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,UAAU,iBAAiB,CAC/B,OAAkB,EAClB,UAAsB,EACtB,WAAmB,EACnB,cAA8B;IAE9B,OAAO,OAAO,CAAC,IAAI,CAAC,UAAC,OAAO;QAC1B,IAAI,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE;YACpC,sBAAsB;YACtB,OAAO,KAAK,CAAC;SACd;QAED,IACE,CAAC,0BAA0B,CACzB,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ,IAAI,OAAO,CAAC,QAAQ,KAAK,GAAG;YAC9D,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC9B,CAAC,CAAC,OAAO,CAAC,QAAQ,EACpB,UAAU,EACV,cAAc,CACf,EACD;YACA,OAAO,KAAK,CAAC;SACd;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;AACL,CAAC;AAED,8CAA8C;AAC9C,MAAM,UAAU,oBAAoB,CAClC,cAAuB,EACvB,WAAmB;IAEnB,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,KAAyB,UAAyB,EAAzB,KAAA,cAAc,CAAC,UAAU,EAAzB,cAAyB,EAAzB,IAAyB,EAAE;QAA/C,IAAM,UAAU,SAAA;QACnB,KAAK,IAAI,UAAU,CAAC,UAAU,CAAC;QAE/B,IAAI,WAAW,IAAI,KAAK,EAAE;YACxB,OAAO,UAAU,CAAC;SACnB;KACF;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,oBAAoB,CAC3B,OAAgB,EAChB,UAAsB,EACtB,cAA8B;IAE9B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;QAClB,OAAO,SAAS,CAAC;KAClB;IAED,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,UAAC,CAAQ;QACjC,IAAI,CAAC,CAAC,UAAU,EAAE;YAChB,OAAO,uBAAuB,CAAC,CAAC,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;SAC1D;QAED,IAAI,CAAC,CAAC,QAAQ,EAAE;YACd,OAAO,0BAA0B,CAAC,CAAC,CAAC,QAAQ,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;SAC3E;QAED,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,kBAAkB,CAChC,OAAgB,EAChB,UAAsB,EACtB,cAA8B;IAE9B,IAAM,KAAK,GAAG,oBAAoB,CAAC,OAAO,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;IAExE,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;QAC9B,OAAO,SAAS,CAAC;KAClB;IAED,OAAO,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,UAAC,CAAC,IAAK,OAAA,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,SAAS,EAA3B,CAA2B,CAAC,CAAC;AACrE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,OAAgB,EAChB,UAAsB,EACtB,WAAmB,EACnB,cAA8B;IAE9B,IAAM,cAAc,GAAG,iBAAiB,CACtC,OAAO,CAAC,OAAO,EACf,UAAU,EACV,WAAW,EACX,cAAc,CACf,CAAC;IAEF,IAAI,CAAC,cAAc,EAAE;QACnB,OAAO,SAAS,CAAC;KAClB;IAED,IAAM,UAAU,GAAG,oBAAoB,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAErE,IAAI,CAAC,UAAU,EAAE;QACf,OAAO,SAAS,CAAC;KAClB;IAED,IAAM,cAAc,GAAG,UAAU,CAAC,SAAS,CAAC;IAE5C,IAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,UAAC,CAAC;QAC1C,OAAO,CAAC,CAAC,KAAK,KAAK,cAAc,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,SAAS,EAAE;QACd,OAAO,SAAS,CAAC;KAClB;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,OAAgB,EAChB,WAAwB,EACxB,UAAsB,EACtB,cAA8B;IAE9B,IAAM,KAAK,GAAG,oBAAoB,CAAC,OAAO,EAAE,UAAU,EAAE,cAAc,CAAC,CAAC;IAExE,IAAI,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE;QAC9B,OAAO,SAAS,CAAC;KAClB;IAED,OAAO,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,OAAgB,EAChB,WAAwB,EACxB,UAAsB,EACtB,WAAmB,EACnB,cAA8B;;IAE9B,gBAAgB;IAChB,IAAM,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IAEhD,IAAI,CAAC,eAAe,EAAE;QACpB,OAAO,SAAS,CAAC;KAClB;IAED,kBAAkB;IAClB,IAAM,cAAc,GAAG,eAAe,CAAC,IAAI,CAAC,UAAC,CAAC;QAC5C,OAAO,CAAC,CAAC,GAAG,KAAK,WAAW,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,cAAc,EAAE;QACnB,OAAO,SAAS,CAAC;KAClB;IAED,cAAc;IACd,IAAM,cAAc,GAAG,iBAAiB,CACtC,OAAO,CAAC,OAAO,EACf,UAAU,EACV,WAAW,EACX,cAAc,CACf,CAAC;IAEF,IAAI,CAAC,cAAc,EAAE;QACnB,OAAO,SAAS,CAAC;KAClB;IAED,+CAA+C;IAC/C,IAAI,cAAc,CAAC,SAAS,IAAI,OAAO,cAAc,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,WAAW,EAAE;QAC5F,OAAO,cAAc,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;KAC9C;IAED,IAAM,UAAU,GAAG,oBAAoB,CAAC,cAAc,EAAE,WAAW,CAAC,CAAC;IAErE,IAAI,CAAC,UAAU,EAAE;QACf,OAAO,SAAS,CAAC;KAClB;IAED,IAAM,cAAc,GAAG,UAAU,CAAC,SAAS,CAAC;IAE5C,IAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,UAAC,CAAC;QAC1C,OAAO,CAAC,CAAC,KAAK,KAAK,cAAc,CAAC;IACpC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,SAAS,EAAE;QACd,OAAO,SAAS,CAAC;KAClB;IAED,IAAM,qBAAqB,GAAG,MAAA,SAAS,CAAC,SAAS,0CAAE,IAAI,CAAC,UAAC,CAAC;QACxD,OAAO,CAAC,CAAC,GAAG,KAAK,WAAW,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qBAAqB,EAAE;QAC1B,OAAO,cAAc,CAAC,YAAY,CAAC;KACpC;IAED,IAAI,qBAAqB,CAAC,SAAS,EAAE;QACnC,IAAM,QAAQ,GAAG,qBAAqB,CAAC,SAAS,CAAC,IAAI,CAAC,UAAC,CAAC;YACtD,IAAI,CAAC,CAAC,UAAU,EAAE;gBAChB,OAAO,uBAAuB,CAC5B,OAAO,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,EAC1E,UAAU,CACX,CAAC;aACH;YAED,IAAI,CAAC,CAAC,QAAQ,EAAE;gBACd,OAAO,0BAA0B,CAC/B,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,KAAK,GAAG;oBAClD,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;oBACxB,CAAC,CAAC,CAAC,CAAC,QAAQ,EACd,UAAU,EACV,cAAc,CACf,CAAC;aACH;YAED,OAAO,KAAK,CAAC;QACf,CAAC,CAAC,CAAC;QAEH,IAAI,QAAQ,EAAE;YACZ,OAAO,QAAQ,CAAC,KAAK,CAAC;SACvB;KACF;IAED,OAAO,qBAAqB,CAAC,KAAK,CAAC;AACrC,CAAC"}
|
package/lib/index.d.ts
CHANGED
package/lib/index.js
CHANGED
package/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,kBAAkB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@featurevisor/sdk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.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,8 +42,8 @@
|
|
|
42
42
|
},
|
|
43
43
|
"license": "MIT",
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@featurevisor/types": "^0.
|
|
45
|
+
"@featurevisor/types": "^0.5.0",
|
|
46
46
|
"murmurhash": "^2.0.1"
|
|
47
47
|
},
|
|
48
|
-
"gitHead": "
|
|
48
|
+
"gitHead": "15345171bbdf0cf83cfb45e49d3987488bb1e4ce"
|
|
49
49
|
}
|
package/src/client.ts
CHANGED
|
@@ -7,7 +7,6 @@ import {
|
|
|
7
7
|
BucketKey,
|
|
8
8
|
BucketValue,
|
|
9
9
|
FeatureKey,
|
|
10
|
-
VariableObjectValue,
|
|
11
10
|
} from "@featurevisor/types";
|
|
12
11
|
import { DatafileReader } from "./datafileReader";
|
|
13
12
|
import {
|
|
@@ -26,9 +25,10 @@ export type ActivationCallback = (
|
|
|
26
25
|
) => void;
|
|
27
26
|
|
|
28
27
|
export type ConfigureBucketValue = (feature, attributes, bucketValue: BucketValue) => BucketValue;
|
|
28
|
+
|
|
29
29
|
export interface SdkOptions {
|
|
30
30
|
datafile: DatafileContent | string;
|
|
31
|
-
onActivation?: ActivationCallback;
|
|
31
|
+
onActivation?: ActivationCallback; // @TODO: move it to FeaturevisorInstance in next breaking semver
|
|
32
32
|
configureBucketValue?: ConfigureBucketValue;
|
|
33
33
|
}
|
|
34
34
|
|
|
@@ -59,6 +59,8 @@ export function getValueByType(value: ValueType, fieldType: FieldType): ValueTyp
|
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
+
// @TODO: change it to FeaturevisorEngine in next breaking semver
|
|
63
|
+
// @TODO: move activate*() methods to FeaturevisorInstance in next breaking semver
|
|
62
64
|
export class FeaturevisorSDK {
|
|
63
65
|
private onActivation?: ActivationCallback;
|
|
64
66
|
private datafileReader: DatafileReader;
|
|
@@ -73,9 +75,13 @@ export class FeaturevisorSDK {
|
|
|
73
75
|
this.configureBucketValue = options.configureBucketValue;
|
|
74
76
|
}
|
|
75
77
|
|
|
78
|
+
this.setDatafile(options.datafile);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
setDatafile(datafile: DatafileContent | string) {
|
|
76
82
|
try {
|
|
77
83
|
this.datafileReader = new DatafileReader(
|
|
78
|
-
typeof
|
|
84
|
+
typeof datafile === "string" ? JSON.parse(datafile) : datafile,
|
|
79
85
|
);
|
|
80
86
|
} catch (e) {
|
|
81
87
|
console.error(`Featurevisor could not parse the datafile`);
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
import { DatafileContent } from "@featurevisor/types";
|
|
2
|
+
import { FeaturevisorSDK, ConfigureBucketValue, ActivationCallback } from "./client";
|
|
3
|
+
|
|
4
|
+
export type ReadyCallback = () => void;
|
|
5
|
+
|
|
6
|
+
export interface InstanceOptions {
|
|
7
|
+
// from SdkOptions
|
|
8
|
+
datafile?: DatafileContent | string; // optional here, but not in SdkOptions
|
|
9
|
+
onActivation?: ActivationCallback;
|
|
10
|
+
configureBucketValue?: ConfigureBucketValue;
|
|
11
|
+
|
|
12
|
+
// additions
|
|
13
|
+
datafileUrl?: string;
|
|
14
|
+
onReady?: ReadyCallback;
|
|
15
|
+
handleDatafileFetch?: (datafileUrl: string) => Promise<DatafileContent>;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// @TODO: consider renaming it to FeaturevisorSDK in next breaking semver
|
|
19
|
+
export interface FeaturevisorInstance {
|
|
20
|
+
/**
|
|
21
|
+
* From FeaturevisorSDK
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
// variation
|
|
25
|
+
getVariation: FeaturevisorSDK["getVariation"];
|
|
26
|
+
getVariationBoolean: FeaturevisorSDK["getVariationBoolean"];
|
|
27
|
+
getVariationInteger: FeaturevisorSDK["getVariationInteger"];
|
|
28
|
+
getVariationDouble: FeaturevisorSDK["getVariationDouble"];
|
|
29
|
+
getVariationString: FeaturevisorSDK["getVariationString"];
|
|
30
|
+
|
|
31
|
+
// activate
|
|
32
|
+
activate: FeaturevisorSDK["activate"];
|
|
33
|
+
activateBoolean: FeaturevisorSDK["activateBoolean"];
|
|
34
|
+
activateInteger: FeaturevisorSDK["activateInteger"];
|
|
35
|
+
activateDouble: FeaturevisorSDK["activateDouble"];
|
|
36
|
+
activateString: FeaturevisorSDK["activateString"];
|
|
37
|
+
|
|
38
|
+
// variable
|
|
39
|
+
getVariable: FeaturevisorSDK["getVariable"];
|
|
40
|
+
getVariableBoolean: FeaturevisorSDK["getVariableBoolean"];
|
|
41
|
+
getVariableInteger: FeaturevisorSDK["getVariableInteger"];
|
|
42
|
+
getVariableDouble: FeaturevisorSDK["getVariableDouble"];
|
|
43
|
+
getVariableString: FeaturevisorSDK["getVariableString"];
|
|
44
|
+
getVariableArray: FeaturevisorSDK["getVariableArray"];
|
|
45
|
+
getVariableObject: FeaturevisorSDK["getVariableObject"];
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Additions
|
|
49
|
+
*
|
|
50
|
+
* @TODO
|
|
51
|
+
*/
|
|
52
|
+
// start: () => void;
|
|
53
|
+
// stop: () => void;
|
|
54
|
+
// refresh: () => void;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function getInstanceFromSdk(sdk: FeaturevisorSDK, options: InstanceOptions): FeaturevisorInstance {
|
|
58
|
+
return {
|
|
59
|
+
// variation
|
|
60
|
+
getVariation: sdk.getVariation.bind(sdk),
|
|
61
|
+
getVariationBoolean: sdk.getVariationBoolean.bind(sdk),
|
|
62
|
+
getVariationInteger: sdk.getVariationInteger.bind(sdk),
|
|
63
|
+
getVariationDouble: sdk.getVariationDouble.bind(sdk),
|
|
64
|
+
getVariationString: sdk.getVariationString.bind(sdk),
|
|
65
|
+
|
|
66
|
+
// activate
|
|
67
|
+
activate: sdk.activate,
|
|
68
|
+
activateBoolean: sdk.activateBoolean.bind(sdk),
|
|
69
|
+
activateInteger: sdk.activateInteger.bind(sdk),
|
|
70
|
+
activateDouble: sdk.activateDouble.bind(sdk),
|
|
71
|
+
activateString: sdk.activateString.bind(sdk),
|
|
72
|
+
|
|
73
|
+
// variable
|
|
74
|
+
getVariable: sdk.getVariable.bind(sdk),
|
|
75
|
+
getVariableBoolean: sdk.getVariableBoolean.bind(sdk),
|
|
76
|
+
getVariableInteger: sdk.getVariableInteger.bind(sdk),
|
|
77
|
+
getVariableDouble: sdk.getVariableDouble.bind(sdk),
|
|
78
|
+
getVariableString: sdk.getVariableString.bind(sdk),
|
|
79
|
+
getVariableArray: sdk.getVariableArray.bind(sdk),
|
|
80
|
+
getVariableObject: sdk.getVariableObject.bind(sdk),
|
|
81
|
+
|
|
82
|
+
// additions
|
|
83
|
+
// @TODO
|
|
84
|
+
// start: () => {},
|
|
85
|
+
// stop: () => {},
|
|
86
|
+
// refresh: () => {},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const emptyDatafile: DatafileContent = {
|
|
91
|
+
schemaVersion: "1",
|
|
92
|
+
revision: "unknown",
|
|
93
|
+
attributes: [],
|
|
94
|
+
segments: [],
|
|
95
|
+
features: [],
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
function fetchDatafileContent(datafileUrl, options: InstanceOptions): Promise<DatafileContent> {
|
|
99
|
+
if (options.handleDatafileFetch) {
|
|
100
|
+
return options.handleDatafileFetch(datafileUrl);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
return fetch(datafileUrl).then((res) => res.json());
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export function createInstance(options: InstanceOptions) {
|
|
107
|
+
if (!options.datafile && !options.datafileUrl) {
|
|
108
|
+
throw new Error(
|
|
109
|
+
"Featurevisor SDK instance cannot be created without `datafile` or `datafileUrl` option",
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// datafile content is already provided
|
|
114
|
+
if (options.datafile) {
|
|
115
|
+
const sdk = new FeaturevisorSDK({
|
|
116
|
+
datafile: options.datafile,
|
|
117
|
+
onActivation: options.onActivation,
|
|
118
|
+
configureBucketValue: options.configureBucketValue,
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
if (typeof options.onReady === "function") {
|
|
122
|
+
const onReady = options.onReady;
|
|
123
|
+
|
|
124
|
+
setTimeout(function () {
|
|
125
|
+
onReady();
|
|
126
|
+
}, 0);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return getInstanceFromSdk(sdk, options);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// datafile has to be fetched
|
|
133
|
+
const sdk = new FeaturevisorSDK({
|
|
134
|
+
datafile: emptyDatafile,
|
|
135
|
+
onActivation: options.onActivation,
|
|
136
|
+
configureBucketValue: options.configureBucketValue,
|
|
137
|
+
});
|
|
138
|
+
|
|
139
|
+
if (options.datafileUrl) {
|
|
140
|
+
fetchDatafileContent(options.datafileUrl, options)
|
|
141
|
+
.then((datafile) => {
|
|
142
|
+
sdk.setDatafile(datafile);
|
|
143
|
+
|
|
144
|
+
if (typeof options.onReady === "function") {
|
|
145
|
+
options.onReady();
|
|
146
|
+
}
|
|
147
|
+
})
|
|
148
|
+
.catch((e) => {
|
|
149
|
+
console.error("Featurevisor failed to fetch datafile:");
|
|
150
|
+
console.error(e);
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return getInstanceFromSdk(sdk, options);
|
|
155
|
+
}
|
package/src/feature.ts
CHANGED
|
@@ -168,7 +168,34 @@ export function getBucketedVariableValue(
|
|
|
168
168
|
return undefined;
|
|
169
169
|
}
|
|
170
170
|
|
|
171
|
-
|
|
171
|
+
// get traffic
|
|
172
|
+
const matchedTraffic = getMatchedTraffic(
|
|
173
|
+
feature.traffic,
|
|
174
|
+
attributes,
|
|
175
|
+
bucketValue,
|
|
176
|
+
datafileReader,
|
|
177
|
+
);
|
|
178
|
+
|
|
179
|
+
if (!matchedTraffic) {
|
|
180
|
+
return undefined;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// see if variable is set at traffic/rule level
|
|
184
|
+
if (matchedTraffic.variables && typeof matchedTraffic.variables[variableKey] !== "undefined") {
|
|
185
|
+
return matchedTraffic.variables[variableKey];
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
const allocation = getMatchedAllocation(matchedTraffic, bucketValue);
|
|
189
|
+
|
|
190
|
+
if (!allocation) {
|
|
191
|
+
return undefined;
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
const variationValue = allocation.variation;
|
|
195
|
+
|
|
196
|
+
const variation = feature.variations.find((v) => {
|
|
197
|
+
return v.value === variationValue;
|
|
198
|
+
});
|
|
172
199
|
|
|
173
200
|
if (!variation) {
|
|
174
201
|
return undefined;
|
package/src/index.ts
CHANGED
package/tsconfig.cjs.json
CHANGED