@featurevisor/sdk
Advanced tools
Comparing version 0.16.0 to 0.17.0
@@ -6,2 +6,13 @@ # Change Log | ||
# [0.17.0](https://github.com/fahad19/featurevisor/compare/v0.16.0...v0.17.0) (2023-05-12) | ||
### Features | ||
* sticky features ([#65](https://github.com/fahad19/featurevisor/issues/65)) ([eb4ff69](https://github.com/fahad19/featurevisor/commit/eb4ff69dcb3d6f979eb1c9dec3fe4cf1583e1fc9)) | ||
# [0.16.0](https://github.com/fahad19/featurevisor/compare/v0.15.0...v0.16.0) (2023-04-30) | ||
@@ -8,0 +19,0 @@ |
@@ -1,2 +0,2 @@ | ||
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.FeaturevisorSDK=t():e.FeaturevisorSDK=t()}(this,(()=>(()=>{var e={480:(e,t,r)=>{"use strict";r.r(t),r.d(t,{compare:()=>a,compareVersions:()=>i,satisfies:()=>o,validate:()=>n});const i=(e,t)=>{const r=u(e),i=u(t),n=r.pop(),a=i.pop(),o=d(r,i);return 0!==o?o:n&&a?d(n.split("."),a.split(".")):n||a?n?-1:1:0},n=e=>"string"==typeof e&&/^[v\d]/.test(e)&&s.test(e),a=(e,t,r)=>{h(r);const n=i(e,t);return g[r].includes(n)},o=(e,t)=>{if(t.includes("||"))return t.split("||").some((t=>o(e,t)));if(t.includes(" "))return t.trim().replace(/\s{2,}/g," ").split(" ").every((t=>o(e,t)));const r=t.match(/^([<>=~^]+)/),i=r?r[1]:"=";if("^"!==i&&"~"!==i)return a(e,t,i);const[n,s,l,,f]=u(e),[c,g,v,,h]=u(t),p=[n,s,l],y=[c,null!=g?g:"x",null!=v?v:"x"];if(h){if(!f)return!1;if(0!==d(p,y))return!1;if(-1===d(f.split("."),h.split(".")))return!1}const b=y.findIndex((e=>"0"!==e))+1,m="~"===i?2:b>1?b:1;return 0===d(p.slice(0,m),y.slice(0,m))&&-1!==d(p.slice(m),y.slice(m))},s=/^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\-]+(?:\.[\da-z\-]+)*))?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?)?)?$/i,u=e=>{if("string"!=typeof e)throw new TypeError("Invalid argument expected string");const t=e.match(s);if(!t)throw new Error(`Invalid argument not valid semver ('${e}' received)`);return t.shift(),t},l=e=>"*"===e||"x"===e||"X"===e,f=e=>{const t=parseInt(e,10);return isNaN(t)?e:t},c=(e,t)=>{if(l(e)||l(t))return 0;const[r,i]=((e,t)=>typeof e!=typeof t?[String(e),String(t)]:[e,t])(f(e),f(t));return r>i?1:r<i?-1:0},d=(e,t)=>{for(let r=0;r<Math.max(e.length,t.length);r++){const i=c(e[r]||"0",t[r]||"0");if(0!==i)return i}return 0},g={">":[1],">=":[0,1],"=":[0],"<=":[-1,0],"<":[-1]},v=Object.keys(g),h=e=>{if("string"!=typeof e)throw new TypeError("Invalid operator type, expected string but got "+typeof e);if(-1===v.indexOf(e))throw new Error(`Invalid operator, expected one of ${v.join("|")}`)}},77:e=>{!function(){const t=e=>(new TextEncoder).encode(e);function r(e,r){let i,n,a,o,s,u,l,f;for("string"==typeof e&&(e=t(e)),i=3&e.length,n=e.length-i,a=r,s=3432918353,u=461845907,f=0;f<n;)l=255&e[f]|(255&e[++f])<<8|(255&e[++f])<<16|(255&e[++f])<<24,++f,l=(65535&l)*s+(((l>>>16)*s&65535)<<16)&4294967295,l=l<<15|l>>>17,l=(65535&l)*u+(((l>>>16)*u&65535)<<16)&4294967295,a^=l,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(l=0,i){case 3:l^=(255&e[f+2])<<16;case 2:l^=(255&e[f+1])<<8;case 1:l^=255&e[f],l=(65535&l)*s+(((l>>>16)*s&65535)<<16)&4294967295,l=l<<15|l>>>17,l=(65535&l)*u+(((l>>>16)*u&65535)<<16)&4294967295,a^=l}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),o=r(687);function s(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=s;var u=function(){function e(e){e.onActivation&&(this.onActivation=e.onActivation),e.configureBucketValue&&(this.configureBucketValue=e.configureBucketValue),this.logger=e.logger||(0,o.createLogger)(),e.interceptAttributes&&(this.interceptAttributes=e.interceptAttributes),e.emitter&&(this.emitter=e.emitter),this.setDatafile(e.datafile),this.fromInstance=e.fromInstance||!1}return e.prototype.setDatafile=function(e){try{this.datafileReader=new i.DatafileReader("string"==typeof e?JSON.parse(e):e)}catch(e){this.logger.error("could not parse datafile",{error:e})}},e.prototype.getRevision=function(){return this.datafileReader.getRevision()},e.prototype.getFeature=function(e){return"string"==typeof e?this.datafileReader.getFeature(e):e},e.prototype.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 void this.logger.warn("feature not found in datafile",{featureKey:e});var i=this.interceptAttributes?this.interceptAttributes(t):t,a=(0,n.getForcedVariation)(r,i,this.datafileReader);if(a)return this.logger.debug("forced variation found",{featureKey:e,variation:a.value}),a.value;var o=this.getBucketValue(r,i),s=(0,n.getBucketedVariation)(r,i,o,this.datafileReader,this.logger);return s?s.value:(this.logger.debug("using default variation",{featureKey:e,bucketValue:o,variation:r.defaultVariation}),r.defaultVariation)}catch(t){return void this.logger.error("getVariation",{featureKey:e,error:t})}},e.prototype.getVariationBoolean=function(e,t){return void 0===t&&(t={}),s(this.getVariation(e,t),"boolean")},e.prototype.getVariationString=function(e,t){return void 0===t&&(t={}),s(this.getVariation(e,t),"string")},e.prototype.getVariationInteger=function(e,t){return void 0===t&&(t={}),s(this.getVariation(e,t),"integer")},e.prototype.getVariationDouble=function(e,t){return void 0===t&&(t={}),s(this.getVariation(e,t),"double")},e.prototype.activate=function(e,t){void 0===t&&(t={});try{var r=this.getVariation(e,t);if(void 0===r)return;var i=this.interceptAttributes?this.interceptAttributes(t):t,n={};return this.datafileReader.getAllAttributes().filter((function(e){return!0===e.capture})).forEach((function(e){void 0!==i[e.key]&&(n[e.key]=t[e.key])})),this.emitter&&this.emitter.emit("activation",e,r,i,n),this.fromInstance&&this.onActivation&&this.onActivation(e,r,i,n),r}catch(t){return void this.logger.error("activate",{featureKey:e,error:t})}},e.prototype.activateBoolean=function(e,t){return void 0===t&&(t={}),s(this.activate(e,t),"boolean")},e.prototype.activateString=function(e,t){return void 0===t&&(t={}),s(this.activate(e,t),"string")},e.prototype.activateInteger=function(e,t){return void 0===t&&(t={}),s(this.activate(e,t),"integer")},e.prototype.activateDouble=function(e,t){return void 0===t&&(t={}),s(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 void this.logger.warn("feature not found in datafile",{featureKey:e,variableKey:t});var a=Array.isArray(i.variablesSchema)?i.variablesSchema.find((function(e){return e.key===t})):void 0;if(!a)return void this.logger.warn("variable schema not found",{featureKey:e,variableKey:t});var o=this.interceptAttributes?this.interceptAttributes(r):r,s=(0,n.getForcedVariableValue)(i,a,o,this.datafileReader);if(void 0!==s)return this.logger.debug("forced variable value found",{featureKey:e,variableKey:t}),s;var u=this.getBucketValue(i,o);return(0,n.getBucketedVariableValue)(i,a,o,u,this.datafileReader,this.logger)}catch(r){return void this.logger.error("getVariable",{featureKey:e,variableKey:t,error:r})}},e.prototype.getVariableBoolean=function(e,t,r){return void 0===r&&(r={}),s(this.getVariable(e,t,r),"boolean")},e.prototype.getVariableString=function(e,t,r){return void 0===r&&(r={}),s(this.getVariable(e,t,r),"string")},e.prototype.getVariableInteger=function(e,t,r){return void 0===r&&(r={}),s(this.getVariable(e,t,r),"integer")},e.prototype.getVariableDouble=function(e,t,r){return void 0===r&&(r={}),s(this.getVariable(e,t,r),"double")},e.prototype.getVariableArray=function(e,t,r){return void 0===r&&(r={}),s(this.getVariable(e,t,r),"array")},e.prototype.getVariableObject=function(e,t,r){return void 0===r&&(r={}),s(this.getVariable(e,t,r),"object")},e.prototype.getVariableJSON=function(e,t,r){return void 0===r&&(r={}),s(this.getVariable(e,t,r),"json")},e}();t.FeaturevisorSDK=u},243:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.allConditionsAreMatched=t.conditionIsMatched=void 0;var i=r(480);function n(e,t){var r=e.attribute,n=e.operator,a=e.value;if("equals"===n)return t[r]===a;if("notEquals"===n)return t[r]!==a;if("string"==typeof t[r]&&Array.isArray(a)){var o=t[r];if("in"===n)return-1!==a.indexOf(o);if("notIn"===n)return-1===a.indexOf(o)}else if("string"==typeof t[r]&&"string"==typeof a){if(o=t[r],"contains"===n)return-1!==o.indexOf(a);if("notContains"===n)return-1===o.indexOf(a);if("startsWith"===n)return o.startsWith(a);if("endsWith"===n)return o.endsWith(a);if("semverEquals"===n)return 0===(0,i.compareVersions)(o,a);if("semverNotEquals"===n)return 0!==(0,i.compareVersions)(o,a);if("semverGreaterThan"===n)return 1===(0,i.compareVersions)(o,a);if("semverGreaterThanOrEquals"===n)return(0,i.compareVersions)(o,a)>=0;if("semverLessThan"===n)return-1===(0,i.compareVersions)(o,a);if("semverLessThanOrEquals"===n)return(0,i.compareVersions)(o,a)<=0}else if("number"==typeof t[r]&&"number"==typeof a){if(o=t[r],"greaterThan"===n)return o>a;if("greaterThanOrEquals"===n)return o>=a;if("lessThan"===n)return o<a;if("lessThanOrEquals"===n)return o<=a}return!1}t.conditionIsMatched=n,t.allConditionsAreMatched=function e(t,r){return"attribute"in t?n(t,r):"and"in t&&Array.isArray(t.and)?t.and.every((function(t){return e(t,r)})):"or"in t&&Array.isArray(t.or)?t.or.some((function(t){return e(t,r)})):"not"in t&&Array.isArray(t.not)?t.not.every((function(i){return!1===e({and:t.not},r)})):!!Array.isArray(t)&&t.every((function(t){return e(t,r)}))}},292:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.createInstance=void 0;var i=r(352),n=r(687),a=r(186);function o(e,t){return t.handleDatafileFetch?t.handleDatafileFetch(e):fetch(e).then((function(e){return e.json()}))}function s(e,t,r,i,n){var a,s=i.addListener.bind(i),u=i.removeListener.bind(i),l={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.bind(e),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),setLogLevels:r.setLevels.bind(r),on:s,addListener:s,off:u,removeListener:u,removeAllListeners:i.removeAllListeners.bind(i),refresh:function(){return r.debug("refreshing datafile"),n.refreshInProgress?r.warn("refresh in progress, skipping"):t.datafileUrl?(n.refreshInProgress=!0,void o(t.datafileUrl,t).then((function(t){var a=e.getRevision()!==t.revision;e.setDatafile(t),r.info("refreshed datafile"),i.emit("refresh"),a&&i.emit("update"),n.refreshInProgress=!1})).catch((function(e){r.error("failed to refresh datafile",{error:e}),n.refreshInProgress=!1}))):r.error("cannot refresh since `datafileUrl` is not provided")},startRefreshing:function(){return t.datafileUrl?a?r.warn("refreshing has already started"):t.refreshInterval?void(a=setInterval((function(){l.refresh()}),1e3*t.refreshInterval)):r.warn("no `refreshInterval` option provided"):r.error("cannot start refreshing since `datafileUrl` is not provided")},stopRefreshing:function(){if(!a)return r.warn("refreshing has not started yet");clearInterval(a)},isReady:function(){return n.ready}};return t.datafileUrl&&t.refreshInterval&&l.startRefreshing(),l}var u={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 both `datafile` and `datafileUrl` options");var t=e.logger||(0,n.createLogger)(),r=new a.Emitter,l={ready:!1,refreshInProgress:!1};if(!e.datafileUrl&&e.refreshInterval&&t.warn("refreshing datafile requires `datafileUrl` option"),e.onReady&&r.addListener("ready",e.onReady),e.onActivation&&r.addListener("activation",e.onActivation),e.onRefresh&&r.addListener("refresh",e.onRefresh),e.onUpdate&&r.addListener("update",e.onUpdate),e.datafile){var f=new i.FeaturevisorSDK({datafile:e.datafile,onActivation:e.onActivation,configureBucketValue:e.configureBucketValue,logger:t,emitter:r,interceptAttributes:e.interceptAttributes,fromInstance:!0});return l.ready=!0,setTimeout((function(){r.emit("ready")}),0),s(f,e,t,r,l)}var c=new i.FeaturevisorSDK({datafile:u,onActivation:e.onActivation,configureBucketValue:e.configureBucketValue,logger:t,emitter:r,interceptAttributes:e.interceptAttributes,fromInstance:!0});return e.datafileUrl&&o(e.datafileUrl,e).then((function(e){c.setDatafile(e),l.ready=!0,r.emit("ready")})).catch((function(e){t.error("failed to fetch datafile:"),console.error(e)})),s(c,e,t,r,l)}},913:(e,t)=>{"use strict";function r(e,t){if("string"==typeof e[t]&&"*"!==e[t])try{e[t]=JSON.parse(e[t])}catch(e){console.error("Error parsing JSON",e)}return e}Object.defineProperty(t,"__esModule",{value:!0}),t.DatafileReader=t.parseJsonConditionsIfStringified=void 0,t.parseJsonConditionsIfStringified=r;var i=function(){function e(e){this.schemaVersion=e.schemaVersion,this.revision=e.revision,this.segments=e.segments,this.attributes=e.attributes,this.features=e.features}return e.prototype.getRevision=function(){return this.revision},e.prototype.getSchemaVersion=function(){return this.schemaVersion},e.prototype.getAllAttributes=function(){return this.attributes},e.prototype.getAttribute=function(e){return this.attributes.find((function(t){return t.key===e}))},e.prototype.getSegment=function(e){var t=this.segments.find((function(t){return t.key===e}));if(t)return r(t,"conditions")},e.prototype.getFeature=function(e){var t=this.features.find((function(t){return t.key===e}));if(t)return t},e}();t.DatafileReader=i},186:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Emitter=void 0;var r=function(){function e(){this._listeners={}}return e.prototype.addListener=function(e,t){void 0===this._listeners[e]&&(this._listeners[e]=[]),this._listeners[e].push(t)},e.prototype.removeListener=function(e,t){if(void 0!==this._listeners[e]){var r=this._listeners[e].indexOf(t);-1!==r&&this._listeners[e].splice(r,1)}},e.prototype.removeAllListeners=function(e){var t=this;e?this._listeners[e]=[]:Object.keys(this._listeners).forEach((function(e){t._listeners[e]=[]}))},e.prototype.emit=function(e){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];void 0!==this._listeners[e]&&this._listeners[e].forEach((function(e){e.apply(void 0,t)}))},e}();t.Emitter=r},522:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getBucketedVariableValue=t.getForcedVariableValue=t.getBucketedVariation=t.getForcedVariation=t.getMatchedTrafficAndAllocation=t.getMatchedAllocation=void 0;var i=r(590),n=r(243);function a(e,t){for(var r=0,i=e.allocation.length>0&&void 0===e.allocation[0].range,n=0,a=e.allocation;n<a.length;n++){var o=a[n];if(o.range&&o.range.start<=t&&o.range.end>=t)return o;if(i&&t<=(r+=o.percentage||0))return o}}function o(e,t,r,n,o){var s;return{matchedTraffic:e.find((function(e){return!!(0,i.allGroupSegmentsAreMatched)("string"==typeof e.segments&&"*"!==e.segments?JSON.parse(e.segments):e.segments,t,n)&&!!(s=a(e,r))})),matchedAllocation:s}}function s(e,t,r){if(e.force)return e.force.find((function(e){return e.conditions?(0,n.allConditionsAreMatched)(e.conditions,t):!!e.segments&&(0,i.allGroupSegmentsAreMatched)(e.segments,t,r)}))}t.getMatchedAllocation=a,t.getMatchedTrafficAndAllocation=o,t.getForcedVariation=function(e,t,r){var i=s(e,t,r);if(i&&i.variation)return e.variations.find((function(e){return e.value===i.variation}))},t.getBucketedVariation=function(e,t,r,i,n){var a=o(e.traffic,t,r,i),s=a.matchedTraffic,u=a.matchedAllocation;if(s){if(s.variation){var l=e.variations.find((function(e){return e.value===s.variation}));if(l)return n.debug("using variation from rule",{featureKey:e.key,variation:l.value,ruleKey:s.key}),l}if(u){var f=u.variation,c=e.variations.find((function(e){return e.value===f}));if(c)return n.debug("matched variation",{featureKey:e.key,variation:c.value,bucketValue:r}),c;n.debug("no matched variation found",{featureKey:e.key,variation:f,bucketValue:r})}else n.debug("no matched allocation found",{featureKey:e.key,bucketValue:r})}else n.debug("no matched rule found",{featureKey:e.key,bucketValue:r})},t.getForcedVariableValue=function(e,t,r,i){var n=s(e,r,i);if(n&&n.variables){var a=n.variables[t.key];return"string"==typeof a&&"json"===t.type?JSON.parse(a):a}},t.getBucketedVariableValue=function(e,t,r,a,s,u){var l,f=o(e.traffic,r,a,s),c=f.matchedTraffic,d=f.matchedAllocation;if(c){var g=t.key;if(c.variables&&void 0!==c.variables[g])return u.debug("using variable from rule",{featureKey:e.key,variableKey:g,bucketValue:a}),c.variables[g];if(d){var v=d.variation,h=e.variations.find((function(e){return e.value===v}));if(h){var p=null===(l=h.variables)||void 0===l?void 0:l.find((function(e){return e.key===g}));if(!p)return u.debug("using default value as variation has no variable",{featureKey:e.key,variableKey:g,variation:v,bucketValue:a}),"json"===t.type?JSON.parse(t.defaultValue):t.defaultValue;if(p.overrides){var y=p.overrides.find((function(e){return e.conditions?(0,n.allConditionsAreMatched)("string"==typeof e.conditions?JSON.parse(e.conditions):e.conditions,r):!!e.segments&&(0,i.allGroupSegmentsAreMatched)("string"==typeof e.segments&&"*"!==e.segments?JSON.parse(e.segments):e.segments,r,s)}));if(y)return u.debug("using override value from variation",{feature:e.key,variableKey:g,variation:v,bucketValue:a}),"json"===t.type?JSON.parse(y.value):y.value}return u.debug("using value from variation",{feature:e.key,variableKey:g,variation:v,bucketValue:a}),"json"===t.type?JSON.parse(p.value):p.value}u.debug("no matched variation found",{feature:e.key,variableKey:g,variation:v,bucketValue:a})}else u.debug("no matched allocation found",{featureKey:e.key,variableKey:g,bucketValue:a})}else u.debug("no matched rule found",{featureKey:e.key,variableKey:t.key,bucketValue:a})}},97:function(e,t,r){"use strict";var i=this&&this.__createBinding||(Object.create?function(e,t,r,i){void 0===i&&(i=r);var n=Object.getOwnPropertyDescriptor(t,r);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,n)}:function(e,t,r,i){void 0===i&&(i=r),e[i]=t[r]}),n=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||i(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),n(r(725),t),n(r(352),t),n(r(292),t),n(r(687),t)},687:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.createLogger=t.Logger=t.defaultLogHandler=t.defaultLogLevels=t.loggerPrefix=void 0,t.loggerPrefix="[Featurevisor]",t.defaultLogLevels=["warn","error"],t.defaultLogHandler=function(e,r,i){switch(void 0===i&&(i={}),e){case"debug":console.log(t.loggerPrefix,r,i);case"info":console.info(t.loggerPrefix,r,i);case"warn":console.warn(t.loggerPrefix,r,i);case"error":console.error(t.loggerPrefix,r,i)}};var r=function(){function e(e){this.levels=e.levels,this.handle=e.handler}return e.prototype.setLevels=function(e){this.levels=e},e.prototype.log=function(e,t,r){-1!==this.levels.indexOf(e)&&this.handle(e,t,r)},e.prototype.debug=function(e,t){this.log("debug",e,t)},e.prototype.info=function(e,t){this.log("info",e,t)},e.prototype.warn=function(e,t){this.log("warn",e,t)},e.prototype.error=function(e,t){this.log("error",e,t)},e}();t.Logger=r,t.createLogger=function(e){void 0===e&&(e={});var i=e.levels||t.defaultLogLevels,n=e.handler||t.defaultLogHandler;return new r({levels:i,handler:n})}},590:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.allGroupSegmentsAreMatched=t.segmentIsMatched=void 0;var i=r(243);function n(e,t){return(0,i.allConditionsAreMatched)(e.conditions,t)}t.segmentIsMatched=n,t.allGroupSegmentsAreMatched=function e(t,r,i){if("*"===t)return!0;if("string"==typeof t){var a=i.getSegment(t);return!!a&&n(a,r)}if("object"==typeof t){if("and"in t&&Array.isArray(t.and))return t.and.every((function(t){return e(t,r,i)}));if("or"in t&&Array.isArray(t.or))return t.or.some((function(t){return e(t,r,i)}));if("not"in t&&Array.isArray(t.not))return t.not.every((function(t){return!1===e(t,r,i)}))}return!!Array.isArray(t)&&t.every((function(t){return e(t,r,i)}))}}},t={};function r(i){var n=t[i];if(void 0!==n)return n.exports;var a=t[i]={exports:{}};return e[i].call(a.exports,a,a.exports,r),a.exports}return r.d=(e,t)=>{for(var i in t)r.o(t,i)&&!r.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r(97)})())); | ||
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.FeaturevisorSDK=t():e.FeaturevisorSDK=t()}(this,(()=>(()=>{var e={480:(e,t,r)=>{"use strict";r.r(t),r.d(t,{compare:()=>a,compareVersions:()=>i,satisfies:()=>o,validate:()=>n});const i=(e,t)=>{const r=u(e),i=u(t),n=r.pop(),a=i.pop(),o=d(r,i);return 0!==o?o:n&&a?d(n.split("."),a.split(".")):n||a?n?-1:1:0},n=e=>"string"==typeof e&&/^[v\d]/.test(e)&&s.test(e),a=(e,t,r)=>{h(r);const n=i(e,t);return g[r].includes(n)},o=(e,t)=>{if(t.includes("||"))return t.split("||").some((t=>o(e,t)));if(t.includes(" "))return t.trim().replace(/\s{2,}/g," ").split(" ").every((t=>o(e,t)));const r=t.match(/^([<>=~^]+)/),i=r?r[1]:"=";if("^"!==i&&"~"!==i)return a(e,t,i);const[n,s,c,,f]=u(e),[l,g,v,,h]=u(t),y=[n,s,c],p=[l,null!=g?g:"x",null!=v?v:"x"];if(h){if(!f)return!1;if(0!==d(y,p))return!1;if(-1===d(f.split("."),h.split(".")))return!1}const b=p.findIndex((e=>"0"!==e))+1,m="~"===i?2:b>1?b:1;return 0===d(y.slice(0,m),p.slice(0,m))&&-1!==d(y.slice(m),p.slice(m))},s=/^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\-]+(?:\.[\da-z\-]+)*))?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?)?)?$/i,u=e=>{if("string"!=typeof e)throw new TypeError("Invalid argument expected string");const t=e.match(s);if(!t)throw new Error(`Invalid argument not valid semver ('${e}' received)`);return t.shift(),t},c=e=>"*"===e||"x"===e||"X"===e,f=e=>{const t=parseInt(e,10);return isNaN(t)?e:t},l=(e,t)=>{if(c(e)||c(t))return 0;const[r,i]=((e,t)=>typeof e!=typeof t?[String(e),String(t)]:[e,t])(f(e),f(t));return r>i?1:r<i?-1:0},d=(e,t)=>{for(let r=0;r<Math.max(e.length,t.length);r++){const i=l(e[r]||"0",t[r]||"0");if(0!==i)return i}return 0},g={">":[1],">=":[0,1],"=":[0],"<=":[-1,0],"<":[-1]},v=Object.keys(g),h=e=>{if("string"!=typeof e)throw new TypeError("Invalid operator type, expected string but got "+typeof e);if(-1===v.indexOf(e))throw new Error(`Invalid operator, expected one of ${v.join("|")}`)}},77:e=>{!function(){const t=e=>(new TextEncoder).encode(e);function r(e,r){let i,n,a,o,s,u,c,f;for("string"==typeof e&&(e=t(e)),i=3&e.length,n=e.length-i,a=r,s=3432918353,u=461845907,f=0;f<n;)c=255&e[f]|(255&e[++f])<<8|(255&e[++f])<<16|(255&e[++f])<<24,++f,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[f+2])<<16;case 2:c^=(255&e[f+1])<<8;case 1:c^=255&e[f],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),o=r(687);function s(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=s;var u=function(){function e(e){e.onActivation&&(this.onActivation=e.onActivation),e.configureBucketValue&&(this.configureBucketValue=e.configureBucketValue),this.logger=e.logger||(0,o.createLogger)(),e.interceptAttributes&&(this.interceptAttributes=e.interceptAttributes),e.emitter&&(this.emitter=e.emitter),e.stickyFeatures&&(this.stickyFeatures=e.stickyFeatures),this.setDatafile(e.datafile),this.fromInstance=e.fromInstance||!1}return e.prototype.setDatafile=function(e){try{this.datafileReader=new i.DatafileReader("string"==typeof e?JSON.parse(e):e)}catch(e){this.logger.error("could not parse datafile",{error:e})}},e.prototype.setStickyFeatures=function(e){this.stickyFeatures=e},e.prototype.getRevision=function(){return this.datafileReader.getRevision()},e.prototype.getFeature=function(e){return"string"==typeof e?this.datafileReader.getFeature(e):e},e.prototype.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="string"==typeof e?e:e.key;if(this.stickyFeatures&&this.stickyFeatures[r]){var i=this.stickyFeatures[r].variation;if(void 0!==i)return this.logger.debug("using sticky variation",{featureKey:r,variation:i}),i}var a=this.getFeature(e);if(!a)return void this.logger.warn("feature not found in datafile",{featureKey:e});var o=this.interceptAttributes?this.interceptAttributes(t):t,s=(0,n.getForcedVariation)(a,o,this.datafileReader);if(s)return this.logger.debug("forced variation found",{featureKey:e,variation:s.value}),s.value;var u=this.getBucketValue(a,o),c=(0,n.getBucketedVariation)(a,o,u,this.datafileReader,this.logger);return c?c.value:(this.logger.debug("using default variation",{featureKey:e,bucketValue:u,variation:a.defaultVariation}),a.defaultVariation)}catch(t){return void this.logger.error("getVariation",{featureKey:e,error:t})}},e.prototype.getVariationBoolean=function(e,t){return void 0===t&&(t={}),s(this.getVariation(e,t),"boolean")},e.prototype.getVariationString=function(e,t){return void 0===t&&(t={}),s(this.getVariation(e,t),"string")},e.prototype.getVariationInteger=function(e,t){return void 0===t&&(t={}),s(this.getVariation(e,t),"integer")},e.prototype.getVariationDouble=function(e,t){return void 0===t&&(t={}),s(this.getVariation(e,t),"double")},e.prototype.activate=function(e,t){void 0===t&&(t={});try{var r=this.getVariation(e,t);if(void 0===r)return;var i=this.interceptAttributes?this.interceptAttributes(t):t,n={};return this.datafileReader.getAllAttributes().filter((function(e){return!0===e.capture})).forEach((function(e){void 0!==i[e.key]&&(n[e.key]=t[e.key])})),this.emitter&&this.emitter.emit("activation",e,r,i,n),this.fromInstance&&this.onActivation&&this.onActivation(e,r,i,n),r}catch(t){return void this.logger.error("activate",{featureKey:e,error:t})}},e.prototype.activateBoolean=function(e,t){return void 0===t&&(t={}),s(this.activate(e,t),"boolean")},e.prototype.activateString=function(e,t){return void 0===t&&(t={}),s(this.activate(e,t),"string")},e.prototype.activateInteger=function(e,t){return void 0===t&&(t={}),s(this.activate(e,t),"integer")},e.prototype.activateDouble=function(e,t){return void 0===t&&(t={}),s(this.activate(e,t),"double")},e.prototype.getVariable=function(e,t,r){void 0===r&&(r={});try{var i="string"==typeof e?e:e.key;if(this.stickyFeatures&&this.stickyFeatures[i]&&this.stickyFeatures[i].variables){var a=this.stickyFeatures[i].variables[t];if(void 0!==a)return this.logger.debug("using sticky variable",{featureKey:i,variableKey:t}),a}var o=this.getFeature(e);if(!o)return void this.logger.warn("feature not found in datafile",{featureKey:e,variableKey:t});var s=Array.isArray(o.variablesSchema)?o.variablesSchema.find((function(e){return e.key===t})):void 0;if(!s)return void this.logger.warn("variable schema not found",{featureKey:e,variableKey:t});var u=this.interceptAttributes?this.interceptAttributes(r):r,c=(0,n.getForcedVariableValue)(o,s,u,this.datafileReader);if(void 0!==c)return this.logger.debug("forced variable value found",{featureKey:e,variableKey:t}),c;var f=this.getBucketValue(o,u);return(0,n.getBucketedVariableValue)(o,s,u,f,this.datafileReader,this.logger)}catch(r){return void this.logger.error("getVariable",{featureKey:e,variableKey:t,error:r})}},e.prototype.getVariableBoolean=function(e,t,r){return void 0===r&&(r={}),s(this.getVariable(e,t,r),"boolean")},e.prototype.getVariableString=function(e,t,r){return void 0===r&&(r={}),s(this.getVariable(e,t,r),"string")},e.prototype.getVariableInteger=function(e,t,r){return void 0===r&&(r={}),s(this.getVariable(e,t,r),"integer")},e.prototype.getVariableDouble=function(e,t,r){return void 0===r&&(r={}),s(this.getVariable(e,t,r),"double")},e.prototype.getVariableArray=function(e,t,r){return void 0===r&&(r={}),s(this.getVariable(e,t,r),"array")},e.prototype.getVariableObject=function(e,t,r){return void 0===r&&(r={}),s(this.getVariable(e,t,r),"object")},e.prototype.getVariableJSON=function(e,t,r){return void 0===r&&(r={}),s(this.getVariable(e,t,r),"json")},e}();t.FeaturevisorSDK=u},243:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.allConditionsAreMatched=t.conditionIsMatched=void 0;var i=r(480);function n(e,t){var r=e.attribute,n=e.operator,a=e.value;if("equals"===n)return t[r]===a;if("notEquals"===n)return t[r]!==a;if("string"==typeof t[r]&&Array.isArray(a)){var o=t[r];if("in"===n)return-1!==a.indexOf(o);if("notIn"===n)return-1===a.indexOf(o)}else if("string"==typeof t[r]&&"string"==typeof a){if(o=t[r],"contains"===n)return-1!==o.indexOf(a);if("notContains"===n)return-1===o.indexOf(a);if("startsWith"===n)return o.startsWith(a);if("endsWith"===n)return o.endsWith(a);if("semverEquals"===n)return 0===(0,i.compareVersions)(o,a);if("semverNotEquals"===n)return 0!==(0,i.compareVersions)(o,a);if("semverGreaterThan"===n)return 1===(0,i.compareVersions)(o,a);if("semverGreaterThanOrEquals"===n)return(0,i.compareVersions)(o,a)>=0;if("semverLessThan"===n)return-1===(0,i.compareVersions)(o,a);if("semverLessThanOrEquals"===n)return(0,i.compareVersions)(o,a)<=0}else if("number"==typeof t[r]&&"number"==typeof a){if(o=t[r],"greaterThan"===n)return o>a;if("greaterThanOrEquals"===n)return o>=a;if("lessThan"===n)return o<a;if("lessThanOrEquals"===n)return o<=a}return!1}t.conditionIsMatched=n,t.allConditionsAreMatched=function e(t,r){return"attribute"in t?n(t,r):"and"in t&&Array.isArray(t.and)?t.and.every((function(t){return e(t,r)})):"or"in t&&Array.isArray(t.or)?t.or.some((function(t){return e(t,r)})):"not"in t&&Array.isArray(t.not)?t.not.every((function(i){return!1===e({and:t.not},r)})):!!Array.isArray(t)&&t.every((function(t){return e(t,r)}))}},292:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.createInstance=void 0;var i=r(352),n=r(687),a=r(186);function o(e,t){return t.handleDatafileFetch?t.handleDatafileFetch(e):fetch(e).then((function(e){return e.json()}))}function s(e,t,r,i,n){var a,s=i.addListener.bind(i),u=i.removeListener.bind(i),c={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.bind(e),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),setLogLevels:r.setLevels.bind(r),setStickyFeatures:e.setStickyFeatures.bind(e),on:s,addListener:s,off:u,removeListener:u,removeAllListeners:i.removeAllListeners.bind(i),refresh:function(){return r.debug("refreshing datafile"),n.refreshInProgress?r.warn("refresh in progress, skipping"):t.datafileUrl?(n.refreshInProgress=!0,void o(t.datafileUrl,t).then((function(t){var a=e.getRevision()!==t.revision;e.setDatafile(t),r.info("refreshed datafile"),i.emit("refresh"),a&&i.emit("update"),n.refreshInProgress=!1})).catch((function(e){r.error("failed to refresh datafile",{error:e}),n.refreshInProgress=!1}))):r.error("cannot refresh since `datafileUrl` is not provided")},startRefreshing:function(){return t.datafileUrl?a?r.warn("refreshing has already started"):t.refreshInterval?void(a=setInterval((function(){c.refresh()}),1e3*t.refreshInterval)):r.warn("no `refreshInterval` option provided"):r.error("cannot start refreshing since `datafileUrl` is not provided")},stopRefreshing:function(){if(!a)return r.warn("refreshing has not started yet");clearInterval(a)},isReady:function(){return n.ready}};return t.datafileUrl&&t.refreshInterval&&c.startRefreshing(),c}var u={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 both `datafile` and `datafileUrl` options");var t=e.logger||(0,n.createLogger)(),r=new a.Emitter,c={ready:!1,refreshInProgress:!1};if(!e.datafileUrl&&e.refreshInterval&&t.warn("refreshing datafile requires `datafileUrl` option"),e.onReady&&r.addListener("ready",e.onReady),e.onActivation&&r.addListener("activation",e.onActivation),e.onRefresh&&r.addListener("refresh",e.onRefresh),e.onUpdate&&r.addListener("update",e.onUpdate),e.datafile){var f=new i.FeaturevisorSDK({datafile:e.datafile,onActivation:e.onActivation,configureBucketValue:e.configureBucketValue,logger:t,emitter:r,interceptAttributes:e.interceptAttributes,stickyFeatures:e.stickyFeatures,fromInstance:!0});return c.ready=!0,setTimeout((function(){r.emit("ready")}),0),s(f,e,t,r,c)}var l=new i.FeaturevisorSDK({datafile:u,onActivation:e.onActivation,configureBucketValue:e.configureBucketValue,logger:t,emitter:r,interceptAttributes:e.interceptAttributes,stickyFeatures:e.stickyFeatures,fromInstance:!0});return e.datafileUrl&&o(e.datafileUrl,e).then((function(e){l.setDatafile(e),c.ready=!0,r.emit("ready")})).catch((function(e){t.error("failed to fetch datafile:"),console.error(e)})),s(l,e,t,r,c)}},913:(e,t)=>{"use strict";function r(e,t){if("string"==typeof e[t]&&"*"!==e[t])try{e[t]=JSON.parse(e[t])}catch(e){console.error("Error parsing JSON",e)}return e}Object.defineProperty(t,"__esModule",{value:!0}),t.DatafileReader=t.parseJsonConditionsIfStringified=void 0,t.parseJsonConditionsIfStringified=r;var i=function(){function e(e){this.schemaVersion=e.schemaVersion,this.revision=e.revision,this.segments=e.segments,this.attributes=e.attributes,this.features=e.features}return e.prototype.getRevision=function(){return this.revision},e.prototype.getSchemaVersion=function(){return this.schemaVersion},e.prototype.getAllAttributes=function(){return this.attributes},e.prototype.getAttribute=function(e){return this.attributes.find((function(t){return t.key===e}))},e.prototype.getSegment=function(e){var t=this.segments.find((function(t){return t.key===e}));if(t)return r(t,"conditions")},e.prototype.getFeature=function(e){var t=this.features.find((function(t){return t.key===e}));if(t)return t},e}();t.DatafileReader=i},186:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Emitter=void 0;var r=function(){function e(){this._listeners={}}return e.prototype.addListener=function(e,t){void 0===this._listeners[e]&&(this._listeners[e]=[]),this._listeners[e].push(t)},e.prototype.removeListener=function(e,t){if(void 0!==this._listeners[e]){var r=this._listeners[e].indexOf(t);-1!==r&&this._listeners[e].splice(r,1)}},e.prototype.removeAllListeners=function(e){var t=this;e?this._listeners[e]=[]:Object.keys(this._listeners).forEach((function(e){t._listeners[e]=[]}))},e.prototype.emit=function(e){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];void 0!==this._listeners[e]&&this._listeners[e].forEach((function(e){e.apply(void 0,t)}))},e}();t.Emitter=r},522:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getBucketedVariableValue=t.getForcedVariableValue=t.getBucketedVariation=t.getForcedVariation=t.getMatchedTrafficAndAllocation=t.getMatchedAllocation=void 0;var i=r(590),n=r(243);function a(e,t){for(var r=0,i=e.allocation.length>0&&void 0===e.allocation[0].range,n=0,a=e.allocation;n<a.length;n++){var o=a[n];if(o.range&&o.range.start<=t&&o.range.end>=t)return o;if(i&&t<=(r+=o.percentage||0))return o}}function o(e,t,r,n,o){var s;return{matchedTraffic:e.find((function(e){return!!(0,i.allGroupSegmentsAreMatched)("string"==typeof e.segments&&"*"!==e.segments?JSON.parse(e.segments):e.segments,t,n)&&!!(s=a(e,r))})),matchedAllocation:s}}function s(e,t,r){if(e.force)return e.force.find((function(e){return e.conditions?(0,n.allConditionsAreMatched)(e.conditions,t):!!e.segments&&(0,i.allGroupSegmentsAreMatched)(e.segments,t,r)}))}t.getMatchedAllocation=a,t.getMatchedTrafficAndAllocation=o,t.getForcedVariation=function(e,t,r){var i=s(e,t,r);if(i&&i.variation)return e.variations.find((function(e){return e.value===i.variation}))},t.getBucketedVariation=function(e,t,r,i,n){var a=o(e.traffic,t,r,i),s=a.matchedTraffic,u=a.matchedAllocation;if(s){if(s.variation){var c=e.variations.find((function(e){return e.value===s.variation}));if(c)return n.debug("using variation from rule",{featureKey:e.key,variation:c.value,ruleKey:s.key}),c}if(u){var f=u.variation,l=e.variations.find((function(e){return e.value===f}));if(l)return n.debug("matched variation",{featureKey:e.key,variation:l.value,bucketValue:r}),l;n.debug("no matched variation found",{featureKey:e.key,variation:f,bucketValue:r})}else n.debug("no matched allocation found",{featureKey:e.key,bucketValue:r})}else n.debug("no matched rule found",{featureKey:e.key,bucketValue:r})},t.getForcedVariableValue=function(e,t,r,i){var n=s(e,r,i);if(n&&n.variables){var a=n.variables[t.key];return"string"==typeof a&&"json"===t.type?JSON.parse(a):a}},t.getBucketedVariableValue=function(e,t,r,a,s,u){var c,f=o(e.traffic,r,a,s),l=f.matchedTraffic,d=f.matchedAllocation;if(l){var g=t.key;if(l.variables&&void 0!==l.variables[g])return u.debug("using variable from rule",{featureKey:e.key,variableKey:g,bucketValue:a}),l.variables[g];if(d){var v=d.variation,h=e.variations.find((function(e){return e.value===v}));if(h){var y=null===(c=h.variables)||void 0===c?void 0:c.find((function(e){return e.key===g}));if(!y)return u.debug("using default value as variation has no variable",{featureKey:e.key,variableKey:g,variation:v,bucketValue:a}),"json"===t.type?JSON.parse(t.defaultValue):t.defaultValue;if(y.overrides){var p=y.overrides.find((function(e){return e.conditions?(0,n.allConditionsAreMatched)("string"==typeof e.conditions?JSON.parse(e.conditions):e.conditions,r):!!e.segments&&(0,i.allGroupSegmentsAreMatched)("string"==typeof e.segments&&"*"!==e.segments?JSON.parse(e.segments):e.segments,r,s)}));if(p)return u.debug("using override value from variation",{feature:e.key,variableKey:g,variation:v,bucketValue:a}),"json"===t.type?JSON.parse(p.value):p.value}return u.debug("using value from variation",{feature:e.key,variableKey:g,variation:v,bucketValue:a}),"json"===t.type?JSON.parse(y.value):y.value}u.debug("no matched variation found",{feature:e.key,variableKey:g,variation:v,bucketValue:a})}else u.debug("no matched allocation found",{featureKey:e.key,variableKey:g,bucketValue:a})}else u.debug("no matched rule found",{featureKey:e.key,variableKey:t.key,bucketValue:a})}},97:function(e,t,r){"use strict";var i=this&&this.__createBinding||(Object.create?function(e,t,r,i){void 0===i&&(i=r);var n=Object.getOwnPropertyDescriptor(t,r);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,i,n)}:function(e,t,r,i){void 0===i&&(i=r),e[i]=t[r]}),n=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||i(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),n(r(725),t),n(r(352),t),n(r(292),t),n(r(687),t)},687:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.createLogger=t.Logger=t.defaultLogHandler=t.defaultLogLevels=t.loggerPrefix=void 0,t.loggerPrefix="[Featurevisor]",t.defaultLogLevels=["warn","error"],t.defaultLogHandler=function(e,r,i){switch(void 0===i&&(i={}),e){case"debug":console.log(t.loggerPrefix,r,i);case"info":console.info(t.loggerPrefix,r,i);case"warn":console.warn(t.loggerPrefix,r,i);case"error":console.error(t.loggerPrefix,r,i)}};var r=function(){function e(e){this.levels=e.levels,this.handle=e.handler}return e.prototype.setLevels=function(e){this.levels=e},e.prototype.log=function(e,t,r){-1!==this.levels.indexOf(e)&&this.handle(e,t,r)},e.prototype.debug=function(e,t){this.log("debug",e,t)},e.prototype.info=function(e,t){this.log("info",e,t)},e.prototype.warn=function(e,t){this.log("warn",e,t)},e.prototype.error=function(e,t){this.log("error",e,t)},e}();t.Logger=r,t.createLogger=function(e){void 0===e&&(e={});var i=e.levels||t.defaultLogLevels,n=e.handler||t.defaultLogHandler;return new r({levels:i,handler:n})}},590:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.allGroupSegmentsAreMatched=t.segmentIsMatched=void 0;var i=r(243);function n(e,t){return(0,i.allConditionsAreMatched)(e.conditions,t)}t.segmentIsMatched=n,t.allGroupSegmentsAreMatched=function e(t,r,i){if("*"===t)return!0;if("string"==typeof t){var a=i.getSegment(t);return!!a&&n(a,r)}if("object"==typeof t){if("and"in t&&Array.isArray(t.and))return t.and.every((function(t){return e(t,r,i)}));if("or"in t&&Array.isArray(t.or))return t.or.some((function(t){return e(t,r,i)}));if("not"in t&&Array.isArray(t.not))return t.not.every((function(t){return!1===e(t,r,i)}))}return!!Array.isArray(t)&&t.every((function(t){return e(t,r,i)}))}}},t={};function r(i){var n=t[i];if(void 0!==n)return n.exports;var a=t[i]={exports:{}};return e[i].call(a.exports,a,a.exports,r),a.exports}return r.d=(e,t)=>{for(var i in t)r.o(t,i)&&!r.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:t[i]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r(97)})())); | ||
//# sourceMappingURL=index.js.map |
@@ -1,2 +0,2 @@ | ||
import { Attributes, VariationValue, VariableValue, Feature, DatafileContent, BucketValue, FeatureKey, VariationType, VariableType } from "@featurevisor/types"; | ||
import { Attributes, VariationValue, VariableValue, Feature, DatafileContent, BucketValue, FeatureKey, VariationType, VariableType, StickyFeatures } from "@featurevisor/types"; | ||
import { Logger } from "./logger"; | ||
@@ -13,2 +13,3 @@ import { Emitter } from "./emitter"; | ||
interceptAttributes?: (attributes: Attributes) => Attributes; | ||
stickyFeatures?: StickyFeatures; | ||
fromInstance?: boolean; | ||
@@ -26,5 +27,7 @@ } | ||
private interceptAttributes?; | ||
private stickyFeatures?; | ||
private fromInstance; | ||
constructor(options: SdkOptions); | ||
setDatafile(datafile: DatafileContent | string): void; | ||
setStickyFeatures(stickyFeatures: StickyFeatures | undefined): void; | ||
getRevision(): string; | ||
@@ -31,0 +34,0 @@ private getFeature; |
@@ -44,2 +44,5 @@ import { DatafileReader } from "./datafileReader"; | ||
} | ||
if (options.stickyFeatures) { | ||
this.stickyFeatures = options.stickyFeatures; | ||
} | ||
this.setDatafile(options.datafile); | ||
@@ -56,2 +59,5 @@ this.fromInstance = options.fromInstance || false; | ||
}; | ||
FeaturevisorSDK.prototype.setStickyFeatures = function (stickyFeatures) { | ||
this.stickyFeatures = stickyFeatures; | ||
}; | ||
FeaturevisorSDK.prototype.getRevision = function () { | ||
@@ -87,2 +93,13 @@ return this.datafileReader.getRevision(); | ||
try { | ||
var key = typeof featureKey === "string" ? featureKey : featureKey.key; | ||
if (this.stickyFeatures && this.stickyFeatures[key]) { | ||
var result = this.stickyFeatures[key].variation; | ||
if (typeof result !== "undefined") { | ||
this.logger.debug("using sticky variation", { | ||
featureKey: key, | ||
variation: result, | ||
}); | ||
return result; | ||
} | ||
} | ||
var feature = this.getFeature(featureKey); | ||
@@ -202,2 +219,13 @@ if (!feature) { | ||
try { | ||
var key = typeof featureKey === "string" ? featureKey : featureKey.key; | ||
if (this.stickyFeatures && this.stickyFeatures[key] && this.stickyFeatures[key].variables) { | ||
var result = this.stickyFeatures[key].variables[variableKey]; | ||
if (typeof result !== "undefined") { | ||
this.logger.debug("using sticky variable", { | ||
featureKey: key, | ||
variableKey: variableKey, | ||
}); | ||
return result; | ||
} | ||
} | ||
var feature = this.getFeature(featureKey); | ||
@@ -204,0 +232,0 @@ if (!feature) { |
@@ -1,2 +0,2 @@ | ||
import { DatafileContent, Attributes } from "@featurevisor/types"; | ||
import { DatafileContent, Attributes, StickyFeatures } from "@featurevisor/types"; | ||
import { FeaturevisorSDK, ConfigureBucketValue, ActivationCallback } from "./client"; | ||
@@ -18,2 +18,3 @@ import { Logger } from "./logger"; | ||
onUpdate?: () => void; | ||
stickyFeatures?: StickyFeatures; | ||
} | ||
@@ -46,2 +47,3 @@ export type Event = "ready" | "refresh" | "update" | "activation"; | ||
setLogLevels: Logger["setLevels"]; | ||
setStickyFeatures: FeaturevisorSDK["setStickyFeatures"]; | ||
refresh: () => void; | ||
@@ -48,0 +50,0 @@ startRefreshing: () => void; |
@@ -37,2 +37,3 @@ import { FeaturevisorSDK } from "./client"; | ||
setLogLevels: logger.setLevels.bind(logger), | ||
setStickyFeatures: sdk.setStickyFeatures.bind(sdk), | ||
// emitter | ||
@@ -142,2 +143,3 @@ on: on, | ||
interceptAttributes: options.interceptAttributes, | ||
stickyFeatures: options.stickyFeatures, | ||
fromInstance: true, | ||
@@ -159,2 +161,3 @@ }); | ||
interceptAttributes: options.interceptAttributes, | ||
stickyFeatures: options.stickyFeatures, | ||
fromInstance: true, | ||
@@ -161,0 +164,0 @@ }); |
{ | ||
"name": "@featurevisor/sdk", | ||
"version": "0.16.0", | ||
"version": "0.17.0", | ||
"description": "Featurevisor SDK for Node.js and the browser", | ||
@@ -45,7 +45,7 @@ "main": "dist/index.js", | ||
"dependencies": { | ||
"@featurevisor/types": "^0.16.0", | ||
"@featurevisor/types": "^0.17.0", | ||
"compare-versions": "^6.0.0-rc.1", | ||
"murmurhash": "^2.0.1" | ||
}, | ||
"gitHead": "7e9b87c4653e4f2940fb399a53e919a2c7450c14" | ||
"gitHead": "4e00e7a43d21c668f2a313750c22613dbd0b3ad3" | ||
} |
@@ -12,2 +12,3 @@ import { | ||
VariableType, | ||
StickyFeatures, | ||
} from "@featurevisor/types"; | ||
@@ -41,2 +42,3 @@ import { DatafileReader } from "./datafileReader"; | ||
interceptAttributes?: (attributes: Attributes) => Attributes; // @TODO: move it to FeaturevisorInstance in next breaking semver | ||
stickyFeatures?: StickyFeatures; | ||
fromInstance?: boolean; | ||
@@ -81,2 +83,3 @@ } | ||
private interceptAttributes?: (attributes: Attributes) => Attributes; | ||
private stickyFeatures?: StickyFeatures; | ||
private fromInstance: boolean; | ||
@@ -103,2 +106,6 @@ | ||
if (options.stickyFeatures) { | ||
this.stickyFeatures = options.stickyFeatures; | ||
} | ||
this.setDatafile(options.datafile); | ||
@@ -119,2 +126,6 @@ | ||
setStickyFeatures(stickyFeatures: StickyFeatures | undefined) { | ||
this.stickyFeatures = stickyFeatures; | ||
} | ||
getRevision(): string { | ||
@@ -164,2 +175,17 @@ return this.datafileReader.getRevision(); | ||
try { | ||
const key = typeof featureKey === "string" ? featureKey : featureKey.key; | ||
if (this.stickyFeatures && this.stickyFeatures[key]) { | ||
const result = this.stickyFeatures[key].variation; | ||
if (typeof result !== "undefined") { | ||
this.logger.debug("using sticky variation", { | ||
featureKey: key, | ||
variation: result, | ||
}); | ||
return result; | ||
} | ||
} | ||
const feature = this.getFeature(featureKey); | ||
@@ -335,2 +361,17 @@ | ||
try { | ||
const key = typeof featureKey === "string" ? featureKey : featureKey.key; | ||
if (this.stickyFeatures && this.stickyFeatures[key] && this.stickyFeatures[key].variables) { | ||
const result = this.stickyFeatures[key].variables[variableKey]; | ||
if (typeof result !== "undefined") { | ||
this.logger.debug("using sticky variable", { | ||
featureKey: key, | ||
variableKey, | ||
}); | ||
return result; | ||
} | ||
} | ||
const feature = this.getFeature(featureKey); | ||
@@ -337,0 +378,0 @@ |
@@ -207,2 +207,72 @@ import { DatafileContent } from "@featurevisor/types"; | ||
}); | ||
it("should initialize with sticky features", function (done) { | ||
const sdk = createInstance({ | ||
stickyFeatures: { | ||
test: { | ||
variation: false, | ||
}, | ||
}, | ||
datafileUrl: "http://localhost:3000/datafile.json", | ||
handleDatafileFetch: function (datafileUrl) { | ||
const content: DatafileContent = { | ||
schemaVersion: "1", | ||
revision: "1.0", | ||
features: [ | ||
{ | ||
key: "test", | ||
defaultVariation: false, | ||
bucketBy: "userId", | ||
variations: [{ value: true }, { value: false }], | ||
traffic: [ | ||
{ | ||
key: "1", | ||
segments: "*", | ||
percentage: 100000, | ||
allocation: [ | ||
{ variation: true, range: { start: 0, end: 100000 } }, | ||
{ variation: false, range: { start: 0, end: 0 } }, | ||
], | ||
}, | ||
], | ||
}, | ||
], | ||
attributes: [], | ||
segments: [], | ||
}; | ||
return new Promise(function (resolve, reject) { | ||
setTimeout(function () { | ||
resolve(content); | ||
}, 50); | ||
}); | ||
}, | ||
}); | ||
// initially false | ||
expect( | ||
sdk.getVariation("test", { | ||
userId: "123", | ||
}), | ||
).toEqual(false); | ||
setTimeout(function () { | ||
// still false after fetching datafile | ||
expect( | ||
sdk.getVariation("test", { | ||
userId: "123", | ||
}), | ||
).toEqual(false); | ||
// unsetting sticky features will make it true | ||
sdk.setStickyFeatures({}); | ||
expect( | ||
sdk.getVariation("test", { | ||
userId: "123", | ||
}), | ||
).toEqual(true); | ||
done(); | ||
}, 75); | ||
}); | ||
}); |
@@ -1,2 +0,2 @@ | ||
import { DatafileContent, Attributes } from "@featurevisor/types"; | ||
import { DatafileContent, Attributes, StickyFeatures } from "@featurevisor/types"; | ||
import { FeaturevisorSDK, ConfigureBucketValue, ActivationCallback } from "./client"; | ||
@@ -23,2 +23,3 @@ import { createLogger, Logger } from "./logger"; | ||
onUpdate?: () => void; | ||
stickyFeatures?: StickyFeatures; | ||
} | ||
@@ -61,2 +62,3 @@ | ||
setLogLevels: Logger["setLevels"]; | ||
setStickyFeatures: FeaturevisorSDK["setStickyFeatures"]; | ||
@@ -131,2 +133,3 @@ refresh: () => void; | ||
setLogLevels: logger.setLevels.bind(logger), | ||
setStickyFeatures: sdk.setStickyFeatures.bind(sdk), | ||
@@ -266,2 +269,3 @@ // emitter | ||
interceptAttributes: options.interceptAttributes, | ||
stickyFeatures: options.stickyFeatures, | ||
fromInstance: true, | ||
@@ -271,3 +275,3 @@ }); | ||
statuses.ready = true; | ||
setTimeout(function() { | ||
setTimeout(function () { | ||
emitter.emit("ready"); | ||
@@ -287,2 +291,3 @@ }, 0); | ||
interceptAttributes: options.interceptAttributes, | ||
stickyFeatures: options.stickyFeatures, | ||
fromInstance: true, | ||
@@ -289,0 +294,0 @@ }); |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
280903
3632
+ Added@featurevisor/types@0.17.0(transitive)
- Removed@featurevisor/types@0.16.0(transitive)
Updated@featurevisor/types@^0.17.0