@featurevisor/sdk 0.5.3 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,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.7.0](https://github.com/fahad19/featurevisor/compare/v0.6.0...v0.7.0) (2023-03-25)
7
+
8
+
9
+ ### Features
10
+
11
+ * Introduce semver operators ([#30](https://github.com/fahad19/featurevisor/issues/30)) ([b2841c3](https://github.com/fahad19/featurevisor/commit/b2841c3473e9100f9a7f404c7ed15903037523a7))
12
+
13
+
14
+
15
+
16
+
17
+ # [0.6.0](https://github.com/fahad19/featurevisor/compare/v0.5.3...v0.6.0) (2023-03-25)
18
+
19
+
20
+ ### Features
21
+
22
+ * Introduce new JSON type for variables ([#28](https://github.com/fahad19/featurevisor/issues/28)) ([49ff4cb](https://github.com/fahad19/featurevisor/commit/49ff4cb99f840f29e9ac8fcacfee9a9a961ff776))
23
+
24
+
25
+
26
+
27
+
6
28
  ## [0.5.3](https://github.com/fahad19/featurevisor/compare/v0.5.2...v0.5.3) (2023-03-25)
7
29
 
8
30
  **Note:** Version bump only for package @featurevisor/sdk
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 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);return o?o.value:r.defaultVariation}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}));
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,s,u,c,l;for("string"==typeof e&&(e=t(e)),i=3&e.length,n=e.length-i,a=r,s=3432918353,u=461845907,l=0;l<n;)c=255&e[l]|(255&e[++l])<<8|(255&e[++l])<<16|(255&e[++l])<<24,++l,c=(65535&c)*s+(((c>>>16)*s&65535)<<16)&4294967295,c=c<<15|c>>>17,c=(65535&c)*u+(((c>>>16)*u&65535)<<16)&4294967295,a^=c,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(c=0,i){case 3:c^=(255&e[l+2])<<16;case 2:c^=(255&e[l+1])<<8;case 1:c^=255&e[l],c=(65535&c)*s+(((c>>>16)*s&65535)<<16)&4294967295,c=c<<15|c>>>17,c=(65535&c)*u+(((c>>>16)*u&65535)<<16)&4294967295,a^=c}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 s=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);return o?o.value:r.defaultVariation}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=Array.isArray(i.variablesSchema)?i.variablesSchema.find((function(e){return e.key===t})):void 0;if(!a)return;var o=(0,n.getForcedVariableValue)(i,a,r,this.datafileReader);if(void 0!==o)return o;var s=this.getBucketValue(i,r);return(0,n.getBucketedVariableValue)(i,a,r,s,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.prototype.getVariableJSON=function(e,t,r){return void 0===r&&(r={}),o(this.getVariable(e,t,r),"json")},e}();t.FeaturevisorSDK=s},243:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.allConditionsAreMatched=t.conditionIsMatched=void 0;var i=r(312),n=r(544),a=r(718),o=r(194),s=r(903),u=r(56);function c(e,t){var r=e.attribute,c=e.operator,l=e.value;if("equals"===c)return t[r]===l;if("notEquals"===c)return t[r]!==l;if("string"==typeof t[r]&&Array.isArray(l)){var f=t[r];if("in"===c)return-1!==l.indexOf(f);if("notIn"===c)return-1===l.indexOf(f)}else if("string"==typeof t[r]&&"string"==typeof l){if(f=t[r],"contains"===c)return-1!==f.indexOf(l);if("notContains"===c)return-1===f.indexOf(l);if("startsWith"===c)return f.startsWith(l);if("endsWith"===c)return f.endsWith(l);if("semverEquals"===c)return a(f,l);if("semverNotEquals"===c)return o(f,l);if("semverGreaterThan"===c)return i(f,l);if("semverGreaterThanOrEquals"===c)return s(f,l);if("semverLessThan"===c)return n(f,l);if("semverLessThanOrEquals"===c)return u(f,l)}else if("number"==typeof t[r]&&"number"==typeof l){if(f=t[r],"greaterThan"===c)return f>l;if("greaterThanOrEquals"===c)return f>=l;if("lessThan"===c)return f<l;if("lessThanOrEquals"===c)return f<=l}return!1}t.conditionIsMatched=c,t.allConditionsAreMatched=function e(t,r){return"attribute"in t?c(t,r):"and"in t&&Array.isArray(t.and)?t.and.every((function(t){return e(t,r)})):"or"in t&&Array.isArray(t.or)?t.or.some((function(t){return e(t,r)})):"not"in t&&Array.isArray(t.not)?t.not.every((function(i){return!1===e({and:t.not},r)})):!!Array.isArray(t)&&t.every((function(t){return e(t,r)}))}},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 s(e,t,r){if(e.force)return e.force.find((function(e){return e.conditions?(0,n.allConditionsAreMatched)(e.conditions,t):!!e.segments&&(0,i.allGroupSegmentsAreMatched)(e.segments,t,r)}))}t.getMatchedTraffic=a,t.getMatchedAllocation=o,t.getForcedVariation=function(e,t,r){var i=s(e,t,r);if(i&&i.variation)return e.variations.find((function(e){return e.value===i.variation}))},t.getBucketedVariation=function(e,t,r,i){var n=a(e.traffic,t,r,i);if(n){var s=o(n,r);if(s){var u=s.variation,c=e.variations.find((function(e){return e.value===u}));if(c)return c}}},t.getForcedVariableValue=function(e,t,r,i){var n=s(e,r,i);if(n&&n.variables){var a=n.variables[t.key];return"string"==typeof a&&"json"===t.type?JSON.parse(a):a}},t.getBucketedVariableValue=function(e,t,r,s,u){var c,l=a(e.traffic,r,s,u);if(l){var f=t.key;if(l.variables&&void 0!==l.variables[f])return l.variables[f];var E=o(l,s);if(E){var p=E.variation,h=e.variations.find((function(e){return e.value===p}));if(h){var d=null===(c=h.variables)||void 0===c?void 0:c.find((function(e){return e.key===f}));if(!d)return"json"===t.type?JSON.parse(t.defaultValue):t.defaultValue;if(d.overrides){var v=d.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,u)}));if(v)return"json"===t.type?JSON.parse(v.value):v.value}return"json"===t.type?JSON.parse(d.value):d.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)}))}},376:(e,t,r)=>{const i=r(225),{MAX_LENGTH:n,MAX_SAFE_INTEGER:a}=r(295),{re:o,t:s}=r(765),u=r(893),{compareIdentifiers:c}=r(742);class l{constructor(e,t){if(t=u(t),e instanceof l){if(e.loose===!!t.loose&&e.includePrerelease===!!t.includePrerelease)return e;e=e.version}else if("string"!=typeof e)throw new TypeError(`Invalid Version: ${e}`);if(e.length>n)throw new TypeError(`version is longer than ${n} characters`);i("SemVer",e,t),this.options=t,this.loose=!!t.loose,this.includePrerelease=!!t.includePrerelease;const r=e.trim().match(t.loose?o[s.LOOSE]:o[s.FULL]);if(!r)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+r[1],this.minor=+r[2],this.patch=+r[3],this.major>a||this.major<0)throw new TypeError("Invalid major version");if(this.minor>a||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>a||this.patch<0)throw new TypeError("Invalid patch version");r[4]?this.prerelease=r[4].split(".").map((e=>{if(/^[0-9]+$/.test(e)){const t=+e;if(t>=0&&t<a)return t}return e})):this.prerelease=[],this.build=r[5]?r[5].split("."):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(".")}`),this.version}toString(){return this.version}compare(e){if(i("SemVer.compare",this.version,this.options,e),!(e instanceof l)){if("string"==typeof e&&e===this.version)return 0;e=new l(e,this.options)}return e.version===this.version?0:this.compareMain(e)||this.comparePre(e)}compareMain(e){return e instanceof l||(e=new l(e,this.options)),c(this.major,e.major)||c(this.minor,e.minor)||c(this.patch,e.patch)}comparePre(e){if(e instanceof l||(e=new l(e,this.options)),this.prerelease.length&&!e.prerelease.length)return-1;if(!this.prerelease.length&&e.prerelease.length)return 1;if(!this.prerelease.length&&!e.prerelease.length)return 0;let t=0;do{const r=this.prerelease[t],n=e.prerelease[t];if(i("prerelease compare",t,r,n),void 0===r&&void 0===n)return 0;if(void 0===n)return 1;if(void 0===r)return-1;if(r!==n)return c(r,n)}while(++t)}compareBuild(e){e instanceof l||(e=new l(e,this.options));let t=0;do{const r=this.build[t],n=e.build[t];if(i("prerelease compare",t,r,n),void 0===r&&void 0===n)return 0;if(void 0===n)return 1;if(void 0===r)return-1;if(r!==n)return c(r,n)}while(++t)}inc(e,t){switch(e){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",t);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",t);break;case"prepatch":this.prerelease.length=0,this.inc("patch",t),this.inc("pre",t);break;case"prerelease":0===this.prerelease.length&&this.inc("patch",t),this.inc("pre",t);break;case"major":0===this.minor&&0===this.patch&&0!==this.prerelease.length||this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":0===this.patch&&0!==this.prerelease.length||this.minor++,this.patch=0,this.prerelease=[];break;case"patch":0===this.prerelease.length&&this.patch++,this.prerelease=[];break;case"pre":if(0===this.prerelease.length)this.prerelease=[0];else{let e=this.prerelease.length;for(;--e>=0;)"number"==typeof this.prerelease[e]&&(this.prerelease[e]++,e=-2);-1===e&&this.prerelease.push(0)}t&&(0===c(this.prerelease[0],t)?isNaN(this.prerelease[1])&&(this.prerelease=[t,0]):this.prerelease=[t,0]);break;default:throw new Error(`invalid increment argument: ${e}`)}return this.format(),this.raw=this.version,this}}e.exports=l},269:(e,t,r)=>{const i=r(376);e.exports=(e,t,r)=>new i(e,r).compare(new i(t,r))},718:(e,t,r)=>{const i=r(269);e.exports=(e,t,r)=>0===i(e,t,r)},312:(e,t,r)=>{const i=r(269);e.exports=(e,t,r)=>i(e,t,r)>0},903:(e,t,r)=>{const i=r(269);e.exports=(e,t,r)=>i(e,t,r)>=0},544:(e,t,r)=>{const i=r(269);e.exports=(e,t,r)=>i(e,t,r)<0},56:(e,t,r)=>{const i=r(269);e.exports=(e,t,r)=>i(e,t,r)<=0},194:(e,t,r)=>{const i=r(269);e.exports=(e,t,r)=>0!==i(e,t,r)},295:e=>{const t=Number.MAX_SAFE_INTEGER||9007199254740991;e.exports={SEMVER_SPEC_VERSION:"2.0.0",MAX_LENGTH:256,MAX_SAFE_INTEGER:t,MAX_SAFE_COMPONENT_LENGTH:16}},225:e=>{const t="object"==typeof process&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...e)=>console.error("SEMVER",...e):()=>{};e.exports=t},742:e=>{const t=/^[0-9]+$/,r=(e,r)=>{const i=t.test(e),n=t.test(r);return i&&n&&(e=+e,r=+r),e===r?0:i&&!n?-1:n&&!i?1:e<r?-1:1};e.exports={compareIdentifiers:r,rcompareIdentifiers:(e,t)=>r(t,e)}},893:e=>{const t=["includePrerelease","loose","rtl"];e.exports=e=>e?"object"!=typeof e?{loose:!0}:t.filter((t=>e[t])).reduce(((e,t)=>(e[t]=!0,e)),{}):{}},765:(e,t,r)=>{const{MAX_SAFE_COMPONENT_LENGTH:i}=r(295),n=r(225),a=(t=e.exports={}).re=[],o=t.src=[],s=t.t={};let u=0;const c=(e,t,r)=>{const i=u++;n(e,i,t),s[e]=i,o[i]=t,a[i]=new RegExp(t,r?"g":void 0)};c("NUMERICIDENTIFIER","0|[1-9]\\d*"),c("NUMERICIDENTIFIERLOOSE","[0-9]+"),c("NONNUMERICIDENTIFIER","\\d*[a-zA-Z-][a-zA-Z0-9-]*"),c("MAINVERSION",`(${o[s.NUMERICIDENTIFIER]})\\.(${o[s.NUMERICIDENTIFIER]})\\.(${o[s.NUMERICIDENTIFIER]})`),c("MAINVERSIONLOOSE",`(${o[s.NUMERICIDENTIFIERLOOSE]})\\.(${o[s.NUMERICIDENTIFIERLOOSE]})\\.(${o[s.NUMERICIDENTIFIERLOOSE]})`),c("PRERELEASEIDENTIFIER",`(?:${o[s.NUMERICIDENTIFIER]}|${o[s.NONNUMERICIDENTIFIER]})`),c("PRERELEASEIDENTIFIERLOOSE",`(?:${o[s.NUMERICIDENTIFIERLOOSE]}|${o[s.NONNUMERICIDENTIFIER]})`),c("PRERELEASE",`(?:-(${o[s.PRERELEASEIDENTIFIER]}(?:\\.${o[s.PRERELEASEIDENTIFIER]})*))`),c("PRERELEASELOOSE",`(?:-?(${o[s.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${o[s.PRERELEASEIDENTIFIERLOOSE]})*))`),c("BUILDIDENTIFIER","[0-9A-Za-z-]+"),c("BUILD",`(?:\\+(${o[s.BUILDIDENTIFIER]}(?:\\.${o[s.BUILDIDENTIFIER]})*))`),c("FULLPLAIN",`v?${o[s.MAINVERSION]}${o[s.PRERELEASE]}?${o[s.BUILD]}?`),c("FULL",`^${o[s.FULLPLAIN]}$`),c("LOOSEPLAIN",`[v=\\s]*${o[s.MAINVERSIONLOOSE]}${o[s.PRERELEASELOOSE]}?${o[s.BUILD]}?`),c("LOOSE",`^${o[s.LOOSEPLAIN]}$`),c("GTLT","((?:<|>)?=?)"),c("XRANGEIDENTIFIERLOOSE",`${o[s.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`),c("XRANGEIDENTIFIER",`${o[s.NUMERICIDENTIFIER]}|x|X|\\*`),c("XRANGEPLAIN",`[v=\\s]*(${o[s.XRANGEIDENTIFIER]})(?:\\.(${o[s.XRANGEIDENTIFIER]})(?:\\.(${o[s.XRANGEIDENTIFIER]})(?:${o[s.PRERELEASE]})?${o[s.BUILD]}?)?)?`),c("XRANGEPLAINLOOSE",`[v=\\s]*(${o[s.XRANGEIDENTIFIERLOOSE]})(?:\\.(${o[s.XRANGEIDENTIFIERLOOSE]})(?:\\.(${o[s.XRANGEIDENTIFIERLOOSE]})(?:${o[s.PRERELEASELOOSE]})?${o[s.BUILD]}?)?)?`),c("XRANGE",`^${o[s.GTLT]}\\s*${o[s.XRANGEPLAIN]}$`),c("XRANGELOOSE",`^${o[s.GTLT]}\\s*${o[s.XRANGEPLAINLOOSE]}$`),c("COERCE",`(^|[^\\d])(\\d{1,${i}})(?:\\.(\\d{1,${i}}))?(?:\\.(\\d{1,${i}}))?(?:$|[^\\d])`),c("COERCERTL",o[s.COERCE],!0),c("LONETILDE","(?:~>?)"),c("TILDETRIM",`(\\s*)${o[s.LONETILDE]}\\s+`,!0),t.tildeTrimReplace="$1~",c("TILDE",`^${o[s.LONETILDE]}${o[s.XRANGEPLAIN]}$`),c("TILDELOOSE",`^${o[s.LONETILDE]}${o[s.XRANGEPLAINLOOSE]}$`),c("LONECARET","(?:\\^)"),c("CARETTRIM",`(\\s*)${o[s.LONECARET]}\\s+`,!0),t.caretTrimReplace="$1^",c("CARET",`^${o[s.LONECARET]}${o[s.XRANGEPLAIN]}$`),c("CARETLOOSE",`^${o[s.LONECARET]}${o[s.XRANGEPLAINLOOSE]}$`),c("COMPARATORLOOSE",`^${o[s.GTLT]}\\s*(${o[s.LOOSEPLAIN]})$|^$`),c("COMPARATOR",`^${o[s.GTLT]}\\s*(${o[s.FULLPLAIN]})$|^$`),c("COMPARATORTRIM",`(\\s*)${o[s.GTLT]}\\s*(${o[s.LOOSEPLAIN]}|${o[s.XRANGEPLAIN]})`,!0),t.comparatorTrimReplace="$1$2$3",c("HYPHENRANGE",`^\\s*(${o[s.XRANGEPLAIN]})\\s+-\\s+(${o[s.XRANGEPLAIN]})\\s*$`),c("HYPHENRANGELOOSE",`^\\s*(${o[s.XRANGEPLAINLOOSE]})\\s+-\\s+(${o[s.XRANGEPLAINLOOSE]})\\s*$`),c("STAR","(<|>)?=?\\s*\\*"),c("GTE0","^\\s*>=\\s*0\\.0\\.0\\s*$"),c("GTE0PRE","^\\s*>=\\s*0\\.0\\.0-0\\s*$")}},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
Binary file
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/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 feature.defaultVariation;\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","defaultVariation","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":""}
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/./node_modules/semver/classes/semver.js","webpack://FeaturevisorSDK/./node_modules/semver/functions/compare.js","webpack://FeaturevisorSDK/./node_modules/semver/functions/eq.js","webpack://FeaturevisorSDK/./node_modules/semver/functions/gt.js","webpack://FeaturevisorSDK/./node_modules/semver/functions/gte.js","webpack://FeaturevisorSDK/./node_modules/semver/functions/lt.js","webpack://FeaturevisorSDK/./node_modules/semver/functions/lte.js","webpack://FeaturevisorSDK/./node_modules/semver/functions/neq.js","webpack://FeaturevisorSDK/./node_modules/semver/internal/constants.js","webpack://FeaturevisorSDK/./node_modules/semver/internal/debug.js","webpack://FeaturevisorSDK/./node_modules/semver/internal/identifiers.js","webpack://FeaturevisorSDK/./node_modules/semver/internal/parse-options.js","webpack://FeaturevisorSDK/./node_modules/semver/internal/re.js","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 VariationType,\n VariableType,\n} from \"@featurevisor/types\";\nimport { DatafileReader } from \"./datafileReader\";\nimport {\n getBucketedVariation,\n getBucketedVariableValue,\n getForcedVariation,\n getForcedVariableValue,\n} from \"./feature\";\nimport { getBucketedNumber } from \"./bucket\";\nimport { VariableSchema } from \"@featurevisor/types/src\";\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\ntype FieldType = VariationType | VariableType;\ntype ValueType = VariableValue;\n\nexport function getValueByType(value: ValueType, fieldType: FieldType): ValueType {\n if (value === undefined) {\n return undefined;\n }\n\n switch (fieldType) {\n case \"string\":\n return typeof value === \"string\" ? value : undefined;\n case \"integer\":\n return parseInt(value as string, 10);\n case \"double\":\n return parseFloat(value as string);\n case \"boolean\":\n return value === true;\n case \"array\":\n return Array.isArray(value) ? value : undefined;\n case \"object\":\n return typeof value === \"object\" ? value : undefined;\n // @NOTE: `json` is not handled here intentionally\n default:\n return value;\n }\n}\n\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 feature.defaultVariation;\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 variableSchema = Array.isArray(feature.variablesSchema)\n ? feature.variablesSchema.find((v) => v.key === variableKey)\n : undefined;\n\n if (!variableSchema) {\n return undefined;\n }\n\n const forcedVariableValue = getForcedVariableValue(\n feature,\n variableSchema,\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 variableSchema,\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 getVariableJSON<T>(\n featureKey: FeatureKey | Feature,\n variableKey: string,\n attributes: Attributes = {},\n ): T | undefined {\n const variableValue = this.getVariable(featureKey, variableKey, attributes);\n\n return getValueByType(variableValue, \"json\") as T | undefined;\n }\n}\n","import { Attributes, Condition, PlainCondition } from \"@featurevisor/types\";\n\nimport * as semverGt from \"semver/functions/gt\";\nimport * as semverLt from \"semver/functions/lt\";\nimport * as semverEq from \"semver/functions/eq\";\nimport * as semverNeq from \"semver/functions/neq\";\nimport * as semverGte from \"semver/functions/gte\";\nimport * as semverLte from \"semver/functions/lte\";\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 } else if (operator === \"semverEquals\") {\n return semverEq(valueInAttributes, value);\n } else if (operator === \"semverNotEquals\") {\n return semverNeq(valueInAttributes, value);\n } else if (operator === \"semverGreaterThan\") {\n return semverGt(valueInAttributes, value);\n } else if (operator === \"semverGreaterThanOrEquals\") {\n return semverGte(valueInAttributes, value);\n } else if (operator === \"semverLessThan\") {\n return semverLt(valueInAttributes, value);\n } else if (operator === \"semverLessThanOrEquals\") {\n return semverLte(valueInAttributes, 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 VariableValue,\n Force,\n} from \"@featurevisor/types\";\nimport { DatafileReader } from \"./datafileReader\";\nimport { allGroupSegmentsAreMatched } from \"./segments\";\nimport { allConditionsAreMatched } from \"./conditions\";\nimport { VariableSchema } from \"@featurevisor/types/src\";\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 variableSchema: VariableSchema,\n attributes: Attributes,\n datafileReader: DatafileReader,\n): VariableValue | undefined {\n const force = findForceFromFeature(feature, attributes, datafileReader);\n\n if (!force || !force.variables) {\n return undefined;\n }\n\n const value = force.variables[variableSchema.key];\n\n if (typeof value === \"string\" && variableSchema.type === \"json\") {\n return JSON.parse(value);\n }\n\n return value;\n}\n\nexport function getBucketedVariableValue(\n feature: Feature,\n variableSchema: VariableSchema,\n attributes: Attributes,\n bucketValue: number,\n datafileReader: DatafileReader,\n): VariableValue | undefined {\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 const variableKey = variableSchema.key;\n\n // see if variable is set at traffic/rule level\n if (matchedTraffic.variables && typeof matchedTraffic.variables[variableKey] !== \"undefined\") {\n 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 if (variableSchema.type === \"json\") {\n return JSON.parse(variableSchema.defaultValue as string);\n }\n\n return variableSchema.defaultValue;\n }\n\n if (variableFromVariation.overrides) {\n const override = variableFromVariation.overrides.find((o) => {\n if (o.conditions) {\n return allConditionsAreMatched(\n typeof o.conditions === \"string\" ? JSON.parse(o.conditions) : o.conditions,\n attributes,\n );\n }\n\n if (o.segments) {\n return allGroupSegmentsAreMatched(\n typeof o.segments === \"string\" && o.segments !== \"*\"\n ? JSON.parse(o.segments)\n : o.segments,\n attributes,\n datafileReader,\n );\n }\n\n return false;\n });\n\n if (override) {\n if (variableSchema.type === \"json\") {\n return JSON.parse(override.value as string);\n }\n\n return override.value;\n }\n }\n\n if (variableSchema.type === \"json\") {\n return JSON.parse(variableFromVariation.value as string);\n }\n\n return variableFromVariation.value;\n}\n","export * from \"./bucket\";\nexport * from \"./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","const debug = require('../internal/debug')\nconst { MAX_LENGTH, MAX_SAFE_INTEGER } = require('../internal/constants')\nconst { re, t } = require('../internal/re')\n\nconst parseOptions = require('../internal/parse-options')\nconst { compareIdentifiers } = require('../internal/identifiers')\nclass SemVer {\n constructor (version, options) {\n options = parseOptions(options)\n\n if (version instanceof SemVer) {\n if (version.loose === !!options.loose &&\n version.includePrerelease === !!options.includePrerelease) {\n return version\n } else {\n version = version.version\n }\n } else if (typeof version !== 'string') {\n throw new TypeError(`Invalid Version: ${version}`)\n }\n\n if (version.length > MAX_LENGTH) {\n throw new TypeError(\n `version is longer than ${MAX_LENGTH} characters`\n )\n }\n\n debug('SemVer', version, options)\n this.options = options\n this.loose = !!options.loose\n // this isn't actually relevant for versions, but keep it so that we\n // don't run into trouble passing this.options around.\n this.includePrerelease = !!options.includePrerelease\n\n const m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])\n\n if (!m) {\n throw new TypeError(`Invalid Version: ${version}`)\n }\n\n this.raw = version\n\n // these are actually numbers\n this.major = +m[1]\n this.minor = +m[2]\n this.patch = +m[3]\n\n if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n throw new TypeError('Invalid major version')\n }\n\n if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n throw new TypeError('Invalid minor version')\n }\n\n if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n throw new TypeError('Invalid patch version')\n }\n\n // numberify any prerelease numeric ids\n if (!m[4]) {\n this.prerelease = []\n } else {\n this.prerelease = m[4].split('.').map((id) => {\n if (/^[0-9]+$/.test(id)) {\n const num = +id\n if (num >= 0 && num < MAX_SAFE_INTEGER) {\n return num\n }\n }\n return id\n })\n }\n\n this.build = m[5] ? m[5].split('.') : []\n this.format()\n }\n\n format () {\n this.version = `${this.major}.${this.minor}.${this.patch}`\n if (this.prerelease.length) {\n this.version += `-${this.prerelease.join('.')}`\n }\n return this.version\n }\n\n toString () {\n return this.version\n }\n\n compare (other) {\n debug('SemVer.compare', this.version, this.options, other)\n if (!(other instanceof SemVer)) {\n if (typeof other === 'string' && other === this.version) {\n return 0\n }\n other = new SemVer(other, this.options)\n }\n\n if (other.version === this.version) {\n return 0\n }\n\n return this.compareMain(other) || this.comparePre(other)\n }\n\n compareMain (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n return (\n compareIdentifiers(this.major, other.major) ||\n compareIdentifiers(this.minor, other.minor) ||\n compareIdentifiers(this.patch, other.patch)\n )\n }\n\n comparePre (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n // NOT having a prerelease is > having one\n if (this.prerelease.length && !other.prerelease.length) {\n return -1\n } else if (!this.prerelease.length && other.prerelease.length) {\n return 1\n } else if (!this.prerelease.length && !other.prerelease.length) {\n return 0\n }\n\n let i = 0\n do {\n const a = this.prerelease[i]\n const b = other.prerelease[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n compareBuild (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n let i = 0\n do {\n const a = this.build[i]\n const b = other.build[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n }\n\n // preminor will bump the version up to the next minor release, and immediately\n // down to pre-release. premajor and prepatch work the same way.\n inc (release, identifier) {\n switch (release) {\n case 'premajor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor = 0\n this.major++\n this.inc('pre', identifier)\n break\n case 'preminor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor++\n this.inc('pre', identifier)\n break\n case 'prepatch':\n // If this is already a prerelease, it will bump to the next version\n // drop any prereleases that might already exist, since they are not\n // relevant at this point.\n this.prerelease.length = 0\n this.inc('patch', identifier)\n this.inc('pre', identifier)\n break\n // If the input is a non-prerelease version, this acts the same as\n // prepatch.\n case 'prerelease':\n if (this.prerelease.length === 0) {\n this.inc('patch', identifier)\n }\n this.inc('pre', identifier)\n break\n\n case 'major':\n // If this is a pre-major version, bump up to the same major version.\n // Otherwise increment major.\n // 1.0.0-5 bumps to 1.0.0\n // 1.1.0 bumps to 2.0.0\n if (\n this.minor !== 0 ||\n this.patch !== 0 ||\n this.prerelease.length === 0\n ) {\n this.major++\n }\n this.minor = 0\n this.patch = 0\n this.prerelease = []\n break\n case 'minor':\n // If this is a pre-minor version, bump up to the same minor version.\n // Otherwise increment minor.\n // 1.2.0-5 bumps to 1.2.0\n // 1.2.1 bumps to 1.3.0\n if (this.patch !== 0 || this.prerelease.length === 0) {\n this.minor++\n }\n this.patch = 0\n this.prerelease = []\n break\n case 'patch':\n // If this is not a pre-release version, it will increment the patch.\n // If it is a pre-release it will bump up to the same patch version.\n // 1.2.0-5 patches to 1.2.0\n // 1.2.0 patches to 1.2.1\n if (this.prerelease.length === 0) {\n this.patch++\n }\n this.prerelease = []\n break\n // This probably shouldn't be used publicly.\n // 1.0.0 'pre' would become 1.0.0-0 which is the wrong direction.\n case 'pre':\n if (this.prerelease.length === 0) {\n this.prerelease = [0]\n } else {\n let i = this.prerelease.length\n while (--i >= 0) {\n if (typeof this.prerelease[i] === 'number') {\n this.prerelease[i]++\n i = -2\n }\n }\n if (i === -1) {\n // didn't increment anything\n this.prerelease.push(0)\n }\n }\n if (identifier) {\n // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n if (compareIdentifiers(this.prerelease[0], identifier) === 0) {\n if (isNaN(this.prerelease[1])) {\n this.prerelease = [identifier, 0]\n }\n } else {\n this.prerelease = [identifier, 0]\n }\n }\n break\n\n default:\n throw new Error(`invalid increment argument: ${release}`)\n }\n this.format()\n this.raw = this.version\n return this\n }\n}\n\nmodule.exports = SemVer\n","const SemVer = require('../classes/semver')\nconst compare = (a, b, loose) =>\n new SemVer(a, loose).compare(new SemVer(b, loose))\n\nmodule.exports = compare\n","const compare = require('./compare')\nconst eq = (a, b, loose) => compare(a, b, loose) === 0\nmodule.exports = eq\n","const compare = require('./compare')\nconst gt = (a, b, loose) => compare(a, b, loose) > 0\nmodule.exports = gt\n","const compare = require('./compare')\nconst gte = (a, b, loose) => compare(a, b, loose) >= 0\nmodule.exports = gte\n","const compare = require('./compare')\nconst lt = (a, b, loose) => compare(a, b, loose) < 0\nmodule.exports = lt\n","const compare = require('./compare')\nconst lte = (a, b, loose) => compare(a, b, loose) <= 0\nmodule.exports = lte\n","const compare = require('./compare')\nconst neq = (a, b, loose) => compare(a, b, loose) !== 0\nmodule.exports = neq\n","// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nconst SEMVER_SPEC_VERSION = '2.0.0'\n\nconst MAX_LENGTH = 256\nconst MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||\n/* istanbul ignore next */ 9007199254740991\n\n// Max safe segment length for coercion.\nconst MAX_SAFE_COMPONENT_LENGTH = 16\n\nmodule.exports = {\n SEMVER_SPEC_VERSION,\n MAX_LENGTH,\n MAX_SAFE_INTEGER,\n MAX_SAFE_COMPONENT_LENGTH,\n}\n","const debug = (\n typeof process === 'object' &&\n process.env &&\n process.env.NODE_DEBUG &&\n /\\bsemver\\b/i.test(process.env.NODE_DEBUG)\n) ? (...args) => console.error('SEMVER', ...args)\n : () => {}\n\nmodule.exports = debug\n","const numeric = /^[0-9]+$/\nconst compareIdentifiers = (a, b) => {\n const anum = numeric.test(a)\n const bnum = numeric.test(b)\n\n if (anum && bnum) {\n a = +a\n b = +b\n }\n\n return a === b ? 0\n : (anum && !bnum) ? -1\n : (bnum && !anum) ? 1\n : a < b ? -1\n : 1\n}\n\nconst rcompareIdentifiers = (a, b) => compareIdentifiers(b, a)\n\nmodule.exports = {\n compareIdentifiers,\n rcompareIdentifiers,\n}\n","// parse out just the options we care about so we always get a consistent\n// obj with keys in a consistent order.\nconst opts = ['includePrerelease', 'loose', 'rtl']\nconst parseOptions = options =>\n !options ? {}\n : typeof options !== 'object' ? { loose: true }\n : opts.filter(k => options[k]).reduce((o, k) => {\n o[k] = true\n return o\n }, {})\nmodule.exports = parseOptions\n","const { MAX_SAFE_COMPONENT_LENGTH } = require('./constants')\nconst debug = require('./debug')\nexports = module.exports = {}\n\n// The actual regexps go on exports.re\nconst re = exports.re = []\nconst src = exports.src = []\nconst t = exports.t = {}\nlet R = 0\n\nconst createToken = (name, value, isGlobal) => {\n const index = R++\n debug(name, index, value)\n t[name] = index\n src[index] = value\n re[index] = new RegExp(value, isGlobal ? 'g' : undefined)\n}\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\ncreateToken('NUMERICIDENTIFIER', '0|[1-9]\\\\d*')\ncreateToken('NUMERICIDENTIFIERLOOSE', '[0-9]+')\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\ncreateToken('NONNUMERICIDENTIFIER', '\\\\d*[a-zA-Z-][a-zA-Z0-9-]*')\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\ncreateToken('MAINVERSION', `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIER]})`)\n\ncreateToken('MAINVERSIONLOOSE', `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})\\\\.` +\n `(${src[t.NUMERICIDENTIFIERLOOSE]})`)\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n\ncreateToken('PRERELEASEIDENTIFIER', `(?:${src[t.NUMERICIDENTIFIER]\n}|${src[t.NONNUMERICIDENTIFIER]})`)\n\ncreateToken('PRERELEASEIDENTIFIERLOOSE', `(?:${src[t.NUMERICIDENTIFIERLOOSE]\n}|${src[t.NONNUMERICIDENTIFIER]})`)\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\ncreateToken('PRERELEASE', `(?:-(${src[t.PRERELEASEIDENTIFIER]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIER]})*))`)\n\ncreateToken('PRERELEASELOOSE', `(?:-?(${src[t.PRERELEASEIDENTIFIERLOOSE]\n}(?:\\\\.${src[t.PRERELEASEIDENTIFIERLOOSE]})*))`)\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\ncreateToken('BUILDIDENTIFIER', '[0-9A-Za-z-]+')\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\ncreateToken('BUILD', `(?:\\\\+(${src[t.BUILDIDENTIFIER]\n}(?:\\\\.${src[t.BUILDIDENTIFIER]})*))`)\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups. The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\ncreateToken('FULLPLAIN', `v?${src[t.MAINVERSION]\n}${src[t.PRERELEASE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('FULL', `^${src[t.FULLPLAIN]}$`)\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\ncreateToken('LOOSEPLAIN', `[v=\\\\s]*${src[t.MAINVERSIONLOOSE]\n}${src[t.PRERELEASELOOSE]}?${\n src[t.BUILD]}?`)\n\ncreateToken('LOOSE', `^${src[t.LOOSEPLAIN]}$`)\n\ncreateToken('GTLT', '((?:<|>)?=?)')\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\ncreateToken('XRANGEIDENTIFIERLOOSE', `${src[t.NUMERICIDENTIFIERLOOSE]}|x|X|\\\\*`)\ncreateToken('XRANGEIDENTIFIER', `${src[t.NUMERICIDENTIFIER]}|x|X|\\\\*`)\n\ncreateToken('XRANGEPLAIN', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIER]})` +\n `(?:${src[t.PRERELEASE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGEPLAINLOOSE', `[v=\\\\s]*(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:\\\\.(${src[t.XRANGEIDENTIFIERLOOSE]})` +\n `(?:${src[t.PRERELEASELOOSE]})?${\n src[t.BUILD]}?` +\n `)?)?`)\n\ncreateToken('XRANGE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAIN]}$`)\ncreateToken('XRANGELOOSE', `^${src[t.GTLT]}\\\\s*${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\ncreateToken('COERCE', `${'(^|[^\\\\d])' +\n '(\\\\d{1,'}${MAX_SAFE_COMPONENT_LENGTH}})` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n `(?:\\\\.(\\\\d{1,${MAX_SAFE_COMPONENT_LENGTH}}))?` +\n `(?:$|[^\\\\d])`)\ncreateToken('COERCERTL', src[t.COERCE], true)\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\ncreateToken('LONETILDE', '(?:~>?)')\n\ncreateToken('TILDETRIM', `(\\\\s*)${src[t.LONETILDE]}\\\\s+`, true)\nexports.tildeTrimReplace = '$1~'\n\ncreateToken('TILDE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('TILDELOOSE', `^${src[t.LONETILDE]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\ncreateToken('LONECARET', '(?:\\\\^)')\n\ncreateToken('CARETTRIM', `(\\\\s*)${src[t.LONECARET]}\\\\s+`, true)\nexports.caretTrimReplace = '$1^'\n\ncreateToken('CARET', `^${src[t.LONECARET]}${src[t.XRANGEPLAIN]}$`)\ncreateToken('CARETLOOSE', `^${src[t.LONECARET]}${src[t.XRANGEPLAINLOOSE]}$`)\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\ncreateToken('COMPARATORLOOSE', `^${src[t.GTLT]}\\\\s*(${src[t.LOOSEPLAIN]})$|^$`)\ncreateToken('COMPARATOR', `^${src[t.GTLT]}\\\\s*(${src[t.FULLPLAIN]})$|^$`)\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\ncreateToken('COMPARATORTRIM', `(\\\\s*)${src[t.GTLT]\n}\\\\s*(${src[t.LOOSEPLAIN]}|${src[t.XRANGEPLAIN]})`, true)\nexports.comparatorTrimReplace = '$1$2$3'\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\ncreateToken('HYPHENRANGE', `^\\\\s*(${src[t.XRANGEPLAIN]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAIN]})` +\n `\\\\s*$`)\n\ncreateToken('HYPHENRANGELOOSE', `^\\\\s*(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s+-\\\\s+` +\n `(${src[t.XRANGEPLAINLOOSE]})` +\n `\\\\s*$`)\n\n// Star ranges basically just allow anything at all.\ncreateToken('STAR', '(<|>)?=?\\\\s*\\\\*')\n// >=0.0.0 is like a star\ncreateToken('GTE0', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0\\\\s*$')\ncreateToken('GTE0PRE', '^\\\\s*>=\\\\s*0\\\\.0\\\\.0-0\\\\s*$')\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","defaultVariation","getVariationBoolean","getVariationString","getVariationInteger","getVariationDouble","activate","variationValue","getAllAttributes","filter","a","capture","forEach","activateBoolean","activateString","activateInteger","activateDouble","getVariable","variableKey","variableSchema","variablesSchema","find","v","forcedVariableValue","getForcedVariableValue","getBucketedVariableValue","getVariableBoolean","getVariableString","getVariableInteger","getVariableDouble","getVariableArray","getVariableObject","getVariableJSON","FeaturevisorSDK","conditionIsMatched","condition","attribute","operator","valueInAttributes","indexOf","startsWith","endsWith","semverEq","semverNeq","semverGt","semverGte","semverLt","semverLte","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","getSegment","segmentKey","segment","s","getMatchedTraffic","traffic","percentage","allGroupSegmentsAreMatched","getMatchedAllocation","matchedTraffic","total","allocation","findForceFromFeature","force","f","variations","variables","type","variableFromVariation","defaultValue","overrides","override","o","segmentIsMatched","groupSegments","groupSegment","debug","MAX_LENGTH","MAX_SAFE_INTEGER","re","t","parseOptions","compareIdentifiers","SemVer","constructor","version","loose","includePrerelease","TypeError","m","trim","match","LOOSE","FULL","raw","major","minor","patch","prerelease","split","map","id","test","num","build","format","toString","compare","other","compareMain","comparePre","b","compareBuild","inc","release","identifier","push","isNaN","Number","SEMVER_SPEC_VERSION","MAX_SAFE_COMPONENT_LENGTH","process","env","NODE_DEBUG","args","numeric","anum","bnum","rcompareIdentifiers","opts","reduce","src","R","createToken","name","isGlobal","index","RegExp","NUMERICIDENTIFIER","NUMERICIDENTIFIERLOOSE","NONNUMERICIDENTIFIER","PRERELEASEIDENTIFIER","PRERELEASEIDENTIFIERLOOSE","BUILDIDENTIFIER","MAINVERSION","PRERELEASE","BUILD","FULLPLAIN","MAINVERSIONLOOSE","PRERELEASELOOSE","LOOSEPLAIN","XRANGEIDENTIFIER","XRANGEIDENTIFIERLOOSE","GTLT","XRANGEPLAIN","XRANGEPLAINLOOSE","COERCE","LONETILDE","tildeTrimReplace","LONECARET","caretTrimReplace","comparatorTrimReplace","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","call"],"sourceRoot":""}
package/lib/client.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Attributes, VariationValue, VariableValue, Feature, DatafileContent, BucketValue, FeatureKey } from "@featurevisor/types";
1
+ import { Attributes, VariationValue, VariableValue, Feature, DatafileContent, BucketValue, FeatureKey, VariationType, VariableType } from "@featurevisor/types";
2
2
  export type ActivationCallback = (featureName: string, variation: VariationValue, attributes: Attributes, captureAttributes: Attributes) => void;
3
3
  export type ConfigureBucketValue = (feature: any, attributes: any, bucketValue: BucketValue) => BucketValue;
4
4
  export interface SdkOptions {
@@ -6,7 +6,7 @@ export interface SdkOptions {
6
6
  onActivation?: ActivationCallback;
7
7
  configureBucketValue?: ConfigureBucketValue;
8
8
  }
9
- type FieldType = "string" | "integer" | "double" | "boolean" | "array" | "object";
9
+ type FieldType = VariationType | VariableType;
10
10
  type ValueType = VariableValue;
11
11
  export declare function getValueByType(value: ValueType, fieldType: FieldType): ValueType;
12
12
  export declare class FeaturevisorSDK {
@@ -47,5 +47,6 @@ export declare class FeaturevisorSDK {
47
47
  getVariableDouble(featureKey: FeatureKey | Feature, variableKey: string, attributes?: Attributes): number | undefined;
48
48
  getVariableArray(featureKey: FeatureKey | Feature, variableKey: string, attributes?: Attributes): string[] | undefined;
49
49
  getVariableObject<T>(featureKey: FeatureKey | Feature, variableKey: string, attributes?: Attributes): T | undefined;
50
+ getVariableJSON<T>(featureKey: FeatureKey | Feature, variableKey: string, attributes?: Attributes): T | undefined;
50
51
  }
51
52
  export {};
package/lib/client.js CHANGED
@@ -18,6 +18,7 @@ export function getValueByType(value, fieldType) {
18
18
  return Array.isArray(value) ? value : undefined;
19
19
  case "object":
20
20
  return typeof value === "object" ? value : undefined;
21
+ // @NOTE: `json` is not handled here intentionally
21
22
  default:
22
23
  return value;
23
24
  }
@@ -169,12 +170,18 @@ var FeaturevisorSDK = /** @class */ (function () {
169
170
  if (!feature) {
170
171
  return undefined;
171
172
  }
172
- var forcedVariableValue = getForcedVariableValue(feature, variableKey, attributes, this.datafileReader);
173
+ var variableSchema = Array.isArray(feature.variablesSchema)
174
+ ? feature.variablesSchema.find(function (v) { return v.key === variableKey; })
175
+ : undefined;
176
+ if (!variableSchema) {
177
+ return undefined;
178
+ }
179
+ var forcedVariableValue = getForcedVariableValue(feature, variableSchema, attributes, this.datafileReader);
173
180
  if (typeof forcedVariableValue !== "undefined") {
174
181
  return forcedVariableValue;
175
182
  }
176
183
  var bucketValue = this.getBucketValue(feature, attributes);
177
- return getBucketedVariableValue(feature, variableKey, attributes, bucketValue, this.datafileReader);
184
+ return getBucketedVariableValue(feature, variableSchema, attributes, bucketValue, this.datafileReader);
178
185
  }
179
186
  catch (e) {
180
187
  console.error("[Featurevisor]", e);
@@ -211,6 +218,11 @@ var FeaturevisorSDK = /** @class */ (function () {
211
218
  var variableValue = this.getVariable(featureKey, variableKey, attributes);
212
219
  return getValueByType(variableValue, "object");
213
220
  };
221
+ FeaturevisorSDK.prototype.getVariableJSON = function (featureKey, variableKey, attributes) {
222
+ if (attributes === void 0) { attributes = {}; }
223
+ var variableValue = this.getVariable(featureKey, variableKey, attributes);
224
+ return getValueByType(variableValue, "json");
225
+ };
214
226
  return FeaturevisorSDK;
215
227
  }());
216
228
  export { FeaturevisorSDK };
package/lib/client.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/lib/conditions.js CHANGED
@@ -1,3 +1,9 @@
1
+ import * as semverGt from "semver/functions/gt";
2
+ import * as semverLt from "semver/functions/lt";
3
+ import * as semverEq from "semver/functions/eq";
4
+ import * as semverNeq from "semver/functions/neq";
5
+ import * as semverGte from "semver/functions/gte";
6
+ import * as semverLte from "semver/functions/lte";
1
7
  export function conditionIsMatched(condition, attributes) {
2
8
  var attribute = condition.attribute, operator = condition.operator, value = condition.value;
3
9
  if (operator === "equals") {
@@ -31,6 +37,24 @@ export function conditionIsMatched(condition, attributes) {
31
37
  else if (operator === "endsWith") {
32
38
  return valueInAttributes.endsWith(value);
33
39
  }
40
+ else if (operator === "semverEquals") {
41
+ return semverEq(valueInAttributes, value);
42
+ }
43
+ else if (operator === "semverNotEquals") {
44
+ return semverNeq(valueInAttributes, value);
45
+ }
46
+ else if (operator === "semverGreaterThan") {
47
+ return semverGt(valueInAttributes, value);
48
+ }
49
+ else if (operator === "semverGreaterThanOrEquals") {
50
+ return semverGte(valueInAttributes, value);
51
+ }
52
+ else if (operator === "semverLessThan") {
53
+ return semverLt(valueInAttributes, value);
54
+ }
55
+ else if (operator === "semverLessThanOrEquals") {
56
+ return semverLte(valueInAttributes, value);
57
+ }
34
58
  }
35
59
  else if (typeof attributes[attribute] === "number" && typeof value === "number") {
36
60
  // numeric
@@ -1 +1 @@
1
- {"version":3,"file":"conditions.js","sourceRoot":"","sources":["../src/conditions.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"conditions.js","sourceRoot":"","sources":["../src/conditions.ts"],"names":[],"mappings":"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"}
package/lib/feature.d.ts CHANGED
@@ -1,8 +1,9 @@
1
- import { Allocation, Attributes, Traffic, Feature, Variation, VariableKey, VariableValue } from "@featurevisor/types";
1
+ import { Allocation, Attributes, Traffic, Feature, Variation, VariableValue } from "@featurevisor/types";
2
2
  import { DatafileReader } from "./datafileReader";
3
+ import { VariableSchema } from "@featurevisor/types/src";
3
4
  export declare function getMatchedTraffic(traffic: Traffic[], attributes: Attributes, bucketValue: number, datafileReader: DatafileReader): Traffic | undefined;
4
5
  export declare function getMatchedAllocation(matchedTraffic: Traffic, bucketValue: number): Allocation | undefined;
5
6
  export declare function getForcedVariation(feature: Feature, attributes: Attributes, datafileReader: DatafileReader): Variation | undefined;
6
7
  export declare function getBucketedVariation(feature: Feature, attributes: Attributes, bucketValue: number, datafileReader: DatafileReader): Variation | undefined;
7
- export declare function getForcedVariableValue(feature: Feature, variableKey: VariableKey, attributes: Attributes, datafileReader: DatafileReader): VariableValue | undefined;
8
- export declare function getBucketedVariableValue(feature: Feature, variableKey: VariableKey, attributes: Attributes, bucketValue: number, datafileReader: DatafileReader): VariableValue | undefined;
8
+ export declare function getForcedVariableValue(feature: Feature, variableSchema: VariableSchema, attributes: Attributes, datafileReader: DatafileReader): VariableValue | undefined;
9
+ export declare function getBucketedVariableValue(feature: Feature, variableSchema: VariableSchema, attributes: Attributes, bucketValue: number, datafileReader: DatafileReader): VariableValue | undefined;
package/lib/feature.js CHANGED
@@ -65,32 +65,25 @@ export function getBucketedVariation(feature, attributes, bucketValue, datafileR
65
65
  }
66
66
  return variation;
67
67
  }
68
- export function getForcedVariableValue(feature, variableKey, attributes, datafileReader) {
68
+ export function getForcedVariableValue(feature, variableSchema, attributes, datafileReader) {
69
69
  var force = findForceFromFeature(feature, attributes, datafileReader);
70
70
  if (!force || !force.variables) {
71
71
  return undefined;
72
72
  }
73
- return force.variables[variableKey];
73
+ var value = force.variables[variableSchema.key];
74
+ if (typeof value === "string" && variableSchema.type === "json") {
75
+ return JSON.parse(value);
76
+ }
77
+ return value;
74
78
  }
75
- export function getBucketedVariableValue(feature, variableKey, attributes, bucketValue, datafileReader) {
79
+ export function getBucketedVariableValue(feature, variableSchema, attributes, bucketValue, datafileReader) {
76
80
  var _a;
77
- // all variables
78
- var variablesSchema = feature.variablesSchema;
79
- if (!variablesSchema) {
80
- return undefined;
81
- }
82
- // single variable
83
- var variableSchema = variablesSchema.find(function (v) {
84
- return v.key === variableKey;
85
- });
86
- if (!variableSchema) {
87
- return undefined;
88
- }
89
81
  // get traffic
90
82
  var matchedTraffic = getMatchedTraffic(feature.traffic, attributes, bucketValue, datafileReader);
91
83
  if (!matchedTraffic) {
92
84
  return undefined;
93
85
  }
86
+ var variableKey = variableSchema.key;
94
87
  // see if variable is set at traffic/rule level
95
88
  if (matchedTraffic.variables && typeof matchedTraffic.variables[variableKey] !== "undefined") {
96
89
  return matchedTraffic.variables[variableKey];
@@ -110,6 +103,9 @@ export function getBucketedVariableValue(feature, variableKey, attributes, bucke
110
103
  return v.key === variableKey;
111
104
  });
112
105
  if (!variableFromVariation) {
106
+ if (variableSchema.type === "json") {
107
+ return JSON.parse(variableSchema.defaultValue);
108
+ }
113
109
  return variableSchema.defaultValue;
114
110
  }
115
111
  if (variableFromVariation.overrides) {
@@ -125,9 +121,15 @@ export function getBucketedVariableValue(feature, variableKey, attributes, bucke
125
121
  return false;
126
122
  });
127
123
  if (override) {
124
+ if (variableSchema.type === "json") {
125
+ return JSON.parse(override.value);
126
+ }
128
127
  return override.value;
129
128
  }
130
129
  }
130
+ if (variableSchema.type === "json") {
131
+ return JSON.parse(variableFromVariation.value);
132
+ }
131
133
  return variableFromVariation.value;
132
134
  }
133
135
  //# sourceMappingURL=feature.js.map
@@ -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":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@featurevisor/sdk",
3
- "version": "0.5.3",
3
+ "version": "0.7.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,9 @@
42
42
  },
43
43
  "license": "MIT",
44
44
  "dependencies": {
45
- "@featurevisor/types": "^0.5.3",
46
- "murmurhash": "^2.0.1"
45
+ "@featurevisor/types": "^0.7.0",
46
+ "murmurhash": "^2.0.1",
47
+ "semver": "^7.3.8"
47
48
  },
48
- "gitHead": "66ed55a4be820cb16ecb5bfee7c4df1e06be912f"
49
+ "gitHead": "d06517f562f831dc61eebc531b85fabccc06ec2e"
49
50
  }
package/src/client.ts CHANGED
@@ -7,6 +7,8 @@ import {
7
7
  BucketKey,
8
8
  BucketValue,
9
9
  FeatureKey,
10
+ VariationType,
11
+ VariableType,
10
12
  } from "@featurevisor/types";
11
13
  import { DatafileReader } from "./datafileReader";
12
14
  import {
@@ -16,6 +18,7 @@ import {
16
18
  getForcedVariableValue,
17
19
  } from "./feature";
18
20
  import { getBucketedNumber } from "./bucket";
21
+ import { VariableSchema } from "@featurevisor/types/src";
19
22
 
20
23
  export type ActivationCallback = (
21
24
  featureName: string,
@@ -32,8 +35,7 @@ export interface SdkOptions {
32
35
  configureBucketValue?: ConfigureBucketValue;
33
36
  }
34
37
 
35
- // union of VariableValue and VariationValue
36
- type FieldType = "string" | "integer" | "double" | "boolean" | "array" | "object";
38
+ type FieldType = VariationType | VariableType;
37
39
  type ValueType = VariableValue;
38
40
 
39
41
  export function getValueByType(value: ValueType, fieldType: FieldType): ValueType {
@@ -54,6 +56,7 @@ export function getValueByType(value: ValueType, fieldType: FieldType): ValueTyp
54
56
  return Array.isArray(value) ? value : undefined;
55
57
  case "object":
56
58
  return typeof value === "object" ? value : undefined;
59
+ // @NOTE: `json` is not handled here intentionally
57
60
  default:
58
61
  return value;
59
62
  }
@@ -268,9 +271,17 @@ export class FeaturevisorSDK {
268
271
  return undefined;
269
272
  }
270
273
 
274
+ const variableSchema = Array.isArray(feature.variablesSchema)
275
+ ? feature.variablesSchema.find((v) => v.key === variableKey)
276
+ : undefined;
277
+
278
+ if (!variableSchema) {
279
+ return undefined;
280
+ }
281
+
271
282
  const forcedVariableValue = getForcedVariableValue(
272
283
  feature,
273
- variableKey,
284
+ variableSchema,
274
285
  attributes,
275
286
  this.datafileReader,
276
287
  );
@@ -283,7 +294,7 @@ export class FeaturevisorSDK {
283
294
 
284
295
  return getBucketedVariableValue(
285
296
  feature,
286
- variableKey,
297
+ variableSchema,
287
298
  attributes,
288
299
  bucketValue,
289
300
  this.datafileReader,
@@ -354,4 +365,14 @@ export class FeaturevisorSDK {
354
365
 
355
366
  return getValueByType(variableValue, "object") as T | undefined;
356
367
  }
368
+
369
+ getVariableJSON<T>(
370
+ featureKey: FeatureKey | Feature,
371
+ variableKey: string,
372
+ attributes: Attributes = {},
373
+ ): T | undefined {
374
+ const variableValue = this.getVariable(featureKey, variableKey, attributes);
375
+
376
+ return getValueByType(variableValue, "json") as T | undefined;
377
+ }
357
378
  }
@@ -70,6 +70,103 @@ describe("sdk: Conditions", function () {
70
70
  // not match
71
71
  expect(allConditionsAreMatched(conditions, { age: 19 })).toEqual(false);
72
72
  });
73
+
74
+ it("should match with operator: semverEquals", function () {
75
+ const conditions: Condition[] = [
76
+ {
77
+ attribute: "version",
78
+ operator: "semverEquals",
79
+ value: "1.0.0",
80
+ },
81
+ ];
82
+
83
+ // match
84
+ expect(allConditionsAreMatched(conditions, { version: "1.0.0" })).toEqual(true);
85
+
86
+ // not match
87
+ expect(allConditionsAreMatched(conditions, { version: "2.0.0" })).toEqual(false);
88
+ });
89
+
90
+ it("should match with operator: semverNotEquals", function () {
91
+ const conditions: Condition[] = [
92
+ {
93
+ attribute: "version",
94
+ operator: "semverNotEquals",
95
+ value: "1.0.0",
96
+ },
97
+ ];
98
+
99
+ // match
100
+ expect(allConditionsAreMatched(conditions, { version: "2.0.0" })).toEqual(true);
101
+
102
+ // not match
103
+ expect(allConditionsAreMatched(conditions, { version: "1.0.0" })).toEqual(false);
104
+ });
105
+
106
+ it("should match with operator: semverGreaterThan", function () {
107
+ const conditions: Condition[] = [
108
+ {
109
+ attribute: "version",
110
+ operator: "semverGreaterThan",
111
+ value: "1.0.0",
112
+ },
113
+ ];
114
+
115
+ // match
116
+ expect(allConditionsAreMatched(conditions, { version: "2.0.0" })).toEqual(true);
117
+
118
+ // not match
119
+ expect(allConditionsAreMatched(conditions, { version: "0.9.0" })).toEqual(false);
120
+ });
121
+
122
+ it("should match with operator: semverGreaterThanOrEquals", function () {
123
+ const conditions: Condition[] = [
124
+ {
125
+ attribute: "version",
126
+ operator: "semverGreaterThanOrEquals",
127
+ value: "1.0.0",
128
+ },
129
+ ];
130
+
131
+ // match
132
+ expect(allConditionsAreMatched(conditions, { version: "1.0.0" })).toEqual(true);
133
+ expect(allConditionsAreMatched(conditions, { version: "2.0.0" })).toEqual(true);
134
+
135
+ // not match
136
+ expect(allConditionsAreMatched(conditions, { version: "0.9.0" })).toEqual(false);
137
+ });
138
+
139
+ it("should match with operator: semverLessThan", function () {
140
+ const conditions: Condition[] = [
141
+ {
142
+ attribute: "version",
143
+ operator: "semverLessThan",
144
+ value: "1.0.0",
145
+ },
146
+ ];
147
+
148
+ // match
149
+ expect(allConditionsAreMatched(conditions, { version: "0.9.0" })).toEqual(true);
150
+
151
+ // not match
152
+ expect(allConditionsAreMatched(conditions, { version: "1.1.0" })).toEqual(false);
153
+ });
154
+
155
+ it("should match with operator: semverLessThanOrEquals", function () {
156
+ const conditions: Condition[] = [
157
+ {
158
+ attribute: "version",
159
+ operator: "semverLessThanOrEquals",
160
+ value: "1.0.0",
161
+ },
162
+ ];
163
+
164
+ // match
165
+ expect(allConditionsAreMatched(conditions, { version: "1.0.0" })).toEqual(true);
166
+
167
+ // not match
168
+ expect(allConditionsAreMatched(conditions, { version: "1.1.0" })).toEqual(false);
169
+ });
73
170
  });
74
171
 
75
172
  describe("simple condition", function () {
package/src/conditions.ts CHANGED
@@ -1,5 +1,12 @@
1
1
  import { Attributes, Condition, PlainCondition } from "@featurevisor/types";
2
2
 
3
+ import * as semverGt from "semver/functions/gt";
4
+ import * as semverLt from "semver/functions/lt";
5
+ import * as semverEq from "semver/functions/eq";
6
+ import * as semverNeq from "semver/functions/neq";
7
+ import * as semverGte from "semver/functions/gte";
8
+ import * as semverLte from "semver/functions/lte";
9
+
3
10
  export function conditionIsMatched(condition: PlainCondition, attributes: Attributes): boolean {
4
11
  const { attribute, operator, value } = condition;
5
12
 
@@ -28,6 +35,18 @@ export function conditionIsMatched(condition: PlainCondition, attributes: Attrib
28
35
  return valueInAttributes.startsWith(value);
29
36
  } else if (operator === "endsWith") {
30
37
  return valueInAttributes.endsWith(value);
38
+ } else if (operator === "semverEquals") {
39
+ return semverEq(valueInAttributes, value);
40
+ } else if (operator === "semverNotEquals") {
41
+ return semverNeq(valueInAttributes, value);
42
+ } else if (operator === "semverGreaterThan") {
43
+ return semverGt(valueInAttributes, value);
44
+ } else if (operator === "semverGreaterThanOrEquals") {
45
+ return semverGte(valueInAttributes, value);
46
+ } else if (operator === "semverLessThan") {
47
+ return semverLt(valueInAttributes, value);
48
+ } else if (operator === "semverLessThanOrEquals") {
49
+ return semverLte(valueInAttributes, value);
31
50
  }
32
51
  } else if (typeof attributes[attribute] === "number" && typeof value === "number") {
33
52
  // numeric
package/src/feature.ts CHANGED
@@ -4,13 +4,13 @@ import {
4
4
  Traffic,
5
5
  Feature,
6
6
  Variation,
7
- VariableKey,
8
7
  VariableValue,
9
8
  Force,
10
9
  } from "@featurevisor/types";
11
10
  import { DatafileReader } from "./datafileReader";
12
11
  import { allGroupSegmentsAreMatched } from "./segments";
13
12
  import { allConditionsAreMatched } from "./conditions";
13
+ import { VariableSchema } from "@featurevisor/types/src";
14
14
 
15
15
  export function getMatchedTraffic(
16
16
  traffic: Traffic[],
@@ -132,7 +132,7 @@ export function getBucketedVariation(
132
132
 
133
133
  export function getForcedVariableValue(
134
134
  feature: Feature,
135
- variableKey: VariableKey,
135
+ variableSchema: VariableSchema,
136
136
  attributes: Attributes,
137
137
  datafileReader: DatafileReader,
138
138
  ): VariableValue | undefined {
@@ -142,32 +142,22 @@ export function getForcedVariableValue(
142
142
  return undefined;
143
143
  }
144
144
 
145
- return force.variables[variableKey];
145
+ const value = force.variables[variableSchema.key];
146
+
147
+ if (typeof value === "string" && variableSchema.type === "json") {
148
+ return JSON.parse(value);
149
+ }
150
+
151
+ return value;
146
152
  }
147
153
 
148
154
  export function getBucketedVariableValue(
149
155
  feature: Feature,
150
- variableKey: VariableKey,
156
+ variableSchema: VariableSchema,
151
157
  attributes: Attributes,
152
158
  bucketValue: number,
153
159
  datafileReader: DatafileReader,
154
160
  ): VariableValue | undefined {
155
- // all variables
156
- const variablesSchema = feature.variablesSchema;
157
-
158
- if (!variablesSchema) {
159
- return undefined;
160
- }
161
-
162
- // single variable
163
- const variableSchema = variablesSchema.find((v) => {
164
- return v.key === variableKey;
165
- });
166
-
167
- if (!variableSchema) {
168
- return undefined;
169
- }
170
-
171
161
  // get traffic
172
162
  const matchedTraffic = getMatchedTraffic(
173
163
  feature.traffic,
@@ -180,6 +170,8 @@ export function getBucketedVariableValue(
180
170
  return undefined;
181
171
  }
182
172
 
173
+ const variableKey = variableSchema.key;
174
+
183
175
  // see if variable is set at traffic/rule level
184
176
  if (matchedTraffic.variables && typeof matchedTraffic.variables[variableKey] !== "undefined") {
185
177
  return matchedTraffic.variables[variableKey];
@@ -206,6 +198,10 @@ export function getBucketedVariableValue(
206
198
  });
207
199
 
208
200
  if (!variableFromVariation) {
201
+ if (variableSchema.type === "json") {
202
+ return JSON.parse(variableSchema.defaultValue as string);
203
+ }
204
+
209
205
  return variableSchema.defaultValue;
210
206
  }
211
207
 
@@ -232,9 +228,17 @@ export function getBucketedVariableValue(
232
228
  });
233
229
 
234
230
  if (override) {
231
+ if (variableSchema.type === "json") {
232
+ return JSON.parse(override.value as string);
233
+ }
234
+
235
235
  return override.value;
236
236
  }
237
237
  }
238
238
 
239
+ if (variableSchema.type === "json") {
240
+ return JSON.parse(variableFromVariation.value as string);
241
+ }
242
+
239
243
  return variableFromVariation.value;
240
244
  }