@featurevisor/sdk 1.29.2 → 1.29.3

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/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- var e={784:e=>{!function(){const t=e=>(new TextEncoder).encode(e);function r(e,r){let i,a,s,n,o,u,l,c;for("string"==typeof e&&(e=t(e)),i=3&e.length,a=e.length-i,s=r,o=3432918353,u=461845907,c=0;c<a;)l=255&e[c]|(255&e[++c])<<8|(255&e[++c])<<16|(255&e[++c])<<24,++c,l=(65535&l)*o+(((l>>>16)*o&65535)<<16)&4294967295,l=l<<15|l>>>17,l=(65535&l)*u+(((l>>>16)*u&65535)<<16)&4294967295,s^=l,s=s<<13|s>>>19,n=5*(65535&s)+((5*(s>>>16)&65535)<<16)&4294967295,s=27492+(65535&n)+((58964+(n>>>16)&65535)<<16);switch(l=0,i){case 3:l^=(255&e[c+2])<<16;case 2:l^=(255&e[c+1])<<8;case 1:l^=255&e[c],l=(65535&l)*o+(((l>>>16)*o&65535)<<16)&4294967295,l=l<<15|l>>>17,l=(65535&l)*u+(((l>>>16)*u&65535)<<16)&4294967295,s^=l}return s^=e.length,s^=s>>>16,s=2246822507*(65535&s)+((2246822507*(s>>>16)&65535)<<16)&4294967295,s^=s>>>13,s=3266489909*(65535&s)+((3266489909*(s>>>16)&65535)<<16)&4294967295,s^=s>>>16,s>>>0}const i=r;i.v2=function(e,r){"string"==typeof e&&(e=t(e));let i,a=e.length,s=r^a,n=0;for(;a>=4;)i=255&e[n]|(255&e[++n])<<8|(255&e[++n])<<16|(255&e[++n])<<24,i=1540483477*(65535&i)+((1540483477*(i>>>16)&65535)<<16),i^=i>>>24,i=1540483477*(65535&i)+((1540483477*(i>>>16)&65535)<<16),s=1540483477*(65535&s)+((1540483477*(s>>>16)&65535)<<16)^i,a-=4,++n;switch(a){case 3:s^=(255&e[n+2])<<16;case 2:s^=(255&e[n+1])<<8;case 1:s^=255&e[n],s=1540483477*(65535&s)+((1540483477*(s>>>16)&65535)<<16)}return s^=s>>>13,s=1540483477*(65535&s)+((1540483477*(s>>>16)&65535)<<16),s^=s>>>15,s>>>0},i.v3=r,e.exports=i}()}},t={};function r(i){var a=t[i];if(void 0!==a)return a.exports;var s=t[i]={exports:{}};return e[i](s,s.exports,r),s.exports}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);var i={};r.d(i,{vl:()=>y,f6:()=>D,Jr:()=>w,Vy:()=>h,lb:()=>o,i4:()=>E,mx:()=>A,Q_:()=>_,h:()=>d,K_:()=>f,DU:()=>c,dg:()=>u,Zy:()=>T,xE:()=>l});var a=r(784);const s=1,n=Math.pow(2,32),o=1e5;function u(e){const t=a.v3(e,s)/n;return Math.floor(t*o)}const l="[Featurevisor]",c=["warn","error"],f=function(e,t,r={}){switch(e){case"debug":console.log(l,t,r);break;case"info":console.info(l,t,r);break;case"warn":console.warn(l,t,r);break;case"error":console.error(l,t,r)}};class h{constructor(e){this.levels=e.levels,this.handle=e.handler}setLevels(e){this.levels=e}log(e,t,r){-1!==this.levels.indexOf(e)&&this.handle(e,t,r)}debug(e,t){this.log("debug",e,t)}info(e,t){this.log("info",e,t)}warn(e,t){this.log("warn",e,t)}error(e,t){this.log("error",e,t)}}function d(e={}){const t=e.levels||c,r=e.handler||f;return new h({levels:t,handler:r})}class g{constructor(e){if(this.schemaVersion=e.schemaVersion,this.revision=e.revision,"2"===this.schemaVersion){const t=e;this.attributes=t.attributes,this.segments=t.segments,this.features=t.features}else{const t=e;this.attributes={},t.attributes.forEach((e=>{this.attributes[e.key]=e})),this.segments={},t.segments.forEach((e=>{this.segments[e.key]=e})),this.features={},t.features.forEach((e=>{this.features[e.key]=e}))}}getRevision(){return this.revision}getSchemaVersion(){return this.schemaVersion}getAllAttributes(){const e=[];return Object.keys(this.attributes).forEach((t=>{e.push(this.attributes[t])})),e}getAttribute(e){return this.attributes[e]}getSegment(e){const t=this.segments[e];if(t)return function(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}(t,"conditions")}getFeature(e){return this.features[e]}}class y{constructor(){this._listeners={}}addListener(e,t){void 0===this._listeners[e]&&(this._listeners[e]=[]),this._listeners[e].push(t)}removeListener(e,t){if(void 0===this._listeners[e])return;const r=this._listeners[e].indexOf(t);-1!==r&&this._listeners[e].splice(r,1)}removeAllListeners(e){e?this._listeners[e]=[]:Object.keys(this._listeners).forEach((e=>{this._listeners[e]=[]}))}emit(e,...t){void 0!==this._listeners[e]&&this._listeners[e].forEach((e=>{e(...t)}))}}const v=(e,t)=>{const r=k(e),i=k(t),a=r.pop(),s=i.pop(),n=V(r,i);return 0!==n?n:a&&s?V(a.split("."),s.split(".")):a||s?a?-1:1:0},b=/^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\-]+(?:\.[\da-z\-]+)*))?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?)?)?$/i,k=e=>{if("string"!=typeof e)throw new TypeError("Invalid argument expected string");const t=e.match(b);if(!t)throw new Error(`Invalid argument not valid semver ('${e}' received)`);return t.shift(),t},m=e=>"*"===e||"x"===e||"X"===e,p=e=>{const t=parseInt(e,10);return isNaN(t)?e:t},K=(e,t)=>{if(m(e)||m(t))return 0;const[r,i]=((e,t)=>typeof e!=typeof t?[String(e),String(t)]:[e,t])(p(e),p(t));return r>i?1:r<i?-1:0},V=(e,t)=>{for(let r=0;r<Math.max(e.length,t.length);r++){const i=K(e[r]||"0",t[r]||"0");if(0!==i)return i}return 0};function A(e,t){const{attribute:r,operator:i,value:a}=e;if("equals"===i)return t[r]===a;if("notEquals"===i)return t[r]!==a;if("before"===i||"after"===i){const e=t[r],s=e instanceof Date?e:new Date(e),n=a instanceof Date?a:new Date(a);return"before"===i?s<n:s>n}if(!Array.isArray(a)||-1===["string","number"].indexOf(typeof t[r])&&null!==t[r]){if("string"==typeof t[r]&&"string"==typeof a){const e=t[r];if("contains"===i)return-1!==e.indexOf(a);if("notContains"===i)return-1===e.indexOf(a);if("startsWith"===i)return e.startsWith(a);if("endsWith"===i)return e.endsWith(a);if("semverEquals"===i)return 0===v(e,a);if("semverNotEquals"===i)return 0!==v(e,a);if("semverGreaterThan"===i)return 1===v(e,a);if("semverGreaterThanOrEquals"===i)return v(e,a)>=0;if("semverLessThan"===i)return-1===v(e,a);if("semverLessThanOrEquals"===i)return v(e,a)<=0}else if("number"==typeof t[r]&&"number"==typeof a){const e=t[r];if("greaterThan"===i)return e>a;if("greaterThanOrEquals"===i)return e>=a;if("lessThan"===i)return e<a;if("lessThanOrEquals"===i)return e<=a}}else{const e=t[r];if("in"===i)return-1!==a.indexOf(e);if("notIn"===i)return-1===a.indexOf(e)}return!1}function E(e,t,r){if("attribute"in e)try{return A(e,t)}catch(i){return r.warn(i.message,{error:i,details:{condition:e,context:t}}),!1}return"and"in e&&Array.isArray(e.and)?e.and.every((e=>E(e,t,r))):"or"in e&&Array.isArray(e.or)?e.or.some((e=>E(e,t,r))):"not"in e&&Array.isArray(e.not)?e.not.every((()=>!1===E({and:e.not},t,r))):!!Array.isArray(e)&&e.every((e=>E(e,t,r)))}function I(e,t,r,i){if("*"===e)return!0;if("string"==typeof e){const a=r.getSegment(e);return!!a&&function(e,t,r){return E(e.conditions,t,r)}(a,t,i)}if("object"==typeof e){if("and"in e&&Array.isArray(e.and))return e.and.every((e=>I(e,t,r,i)));if("or"in e&&Array.isArray(e.or))return e.or.some((e=>I(e,t,r,i)));if("not"in e&&Array.isArray(e.not))return e.not.every((e=>!1===I(e,t,r,i)))}return!!Array.isArray(e)&&e.every((e=>I(e,t,r,i)))}function O(e){return"string"==typeof e&&(e.startsWith("{")||e.startsWith("["))?JSON.parse(e):e}function F(e,t,r,i,a){const s=e.find((e=>I(O(e.segments),t,i,a)));if(!s)return{matchedTraffic:void 0,matchedAllocation:void 0};const n=function(e,t){for(const r of e.allocation){const[e,i]=r.range;if(r.range&&e<=t&&i>=t)return r}}(s,r);return{matchedTraffic:s,matchedAllocation:n}}function R(e,t,r,i){const a={force:void 0,forceIndex:void 0};if(!e.force)return a;for(let s=0;s<e.force.length;s++){const n=e.force[s];if(n.conditions&&E(n.conditions,t,i)){a.force=n,a.forceIndex=s;break}if(n.segments&&I(n.segments,t,r,i)){a.force=n,a.forceIndex=s;break}}return a}Object.keys({">":[1],">=":[0,1],"=":[0],"<=":[-1,0],"<":[-1]});const L={schemaVersion:"1",revision:"unknown",attributes:[],segments:[],features:[]};var D;function x(e,t){return t?t(e):fetch(e).then((e=>e.json()))}function T(e,t){try{if(void 0===e)return;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}}catch(e){return}}!function(e){e.NOT_FOUND="not_found",e.NO_VARIATIONS="no_variations",e.NO_MATCH="no_match",e.DISABLED="disabled",e.REQUIRED="required",e.OUT_OF_RANGE="out_of_range",e.FORCED="forced",e.INITIAL="initial",e.STICKY="sticky",e.RULE="rule",e.ALLOCATED="allocated",e.DEFAULTED="defaulted",e.OVERRIDE="override",e.ERROR="error"}(D||(D={}));class w{constructor(e){this.bucketKeySeparator=e.bucketKeySeparator||".",this.configureBucketKey=e.configureBucketKey,this.configureBucketValue=e.configureBucketValue,this.datafileUrl=e.datafileUrl,this.handleDatafileFetch=e.handleDatafileFetch,this.initialFeatures=e.initialFeatures,this.interceptContext=e.interceptContext,this.logger=e.logger||d(),this.refreshInterval=e.refreshInterval,this.stickyFeatures=e.stickyFeatures,this.emitter=new y,this.statuses={ready:!1,refreshInProgress:!1},e.onReady&&this.emitter.addListener("ready",e.onReady),e.onRefresh&&this.emitter.addListener("refresh",e.onRefresh),e.onUpdate&&this.emitter.addListener("update",e.onUpdate),e.onActivation&&this.emitter.addListener("activation",e.onActivation);const t=this.emitter.addListener.bind(this.emitter);this.on=t,this.addListener=t;const r=this.emitter.removeListener.bind(this.emitter);if(this.off=r,this.removeListener=r,this.removeAllListeners=this.emitter.removeAllListeners.bind(this.emitter),e.datafileUrl)this.setDatafile(e.datafile||L),x(e.datafileUrl,e.handleDatafileFetch).then((e=>{this.setDatafile(e),this.statuses.ready=!0,this.emitter.emit("ready"),this.refreshInterval&&this.startRefreshing()})).catch((e=>{this.logger.error("failed to fetch datafile",{error:e})}));else{if(!e.datafile)throw new Error("Featurevisor SDK instance cannot be created without both `datafile` and `datafileUrl` options");this.setDatafile(e.datafile),this.statuses.ready=!0,setTimeout((()=>{this.emitter.emit("ready")}),0)}}setLogLevels(e){this.logger.setLevels(e)}onReady(){return new Promise((e=>{if(this.statuses.ready)return e(this);const t=()=>{this.emitter.removeListener("ready",t),e(this)};this.emitter.addListener("ready",t)}))}setDatafile(e){try{this.datafileReader=new g("string"==typeof e?JSON.parse(e):e)}catch(e){this.logger.error("could not parse datafile",{error:e})}}setStickyFeatures(e){this.stickyFeatures=e}getRevision(){return this.datafileReader.getRevision()}getFeature(e){return"string"==typeof e?this.datafileReader.getFeature(e):e}getBucketKey(e,t){const r=e.key;let i,a;if("string"==typeof e.bucketBy)i="plain",a=[e.bucketBy];else if(Array.isArray(e.bucketBy))i="and",a=e.bucketBy;else{if("object"!=typeof e.bucketBy||!Array.isArray(e.bucketBy.or))throw this.logger.error("invalid bucketBy",{featureKey:r,bucketBy:e.bucketBy}),new Error("invalid bucketBy");i="or",a=e.bucketBy.or}const s=[];a.forEach((e=>{const r=t[e];void 0!==r&&("plain"===i||"and"===i||0===s.length)&&s.push(r)})),s.push(r);const n=s.join(this.bucketKeySeparator);return this.configureBucketKey?this.configureBucketKey(e,t,n):n}getBucketValue(e,t){const r=this.getBucketKey(e,t),i=u(r);return this.configureBucketValue?{bucketKey:r,bucketValue:this.configureBucketValue(e,t,i)}:{bucketKey:r,bucketValue:i}}isReady(){return this.statuses.ready}refresh(){return this.logger.debug("refreshing datafile"),this.statuses.refreshInProgress?this.logger.warn("refresh in progress, skipping"):this.datafileUrl?(this.statuses.refreshInProgress=!0,void x(this.datafileUrl,this.handleDatafileFetch).then((e=>{const t=this.getRevision()!==e.revision;this.setDatafile(e),this.logger.info("refreshed datafile"),this.emitter.emit("refresh"),t&&this.emitter.emit("update"),this.statuses.refreshInProgress=!1})).catch((e=>{this.logger.error("failed to refresh datafile",{error:e}),this.statuses.refreshInProgress=!1}))):this.logger.error("cannot refresh since `datafileUrl` is not provided")}startRefreshing(){return this.datafileUrl?this.intervalId?this.logger.warn("refreshing has already started"):this.refreshInterval?void(this.intervalId=setInterval((()=>{this.refresh()}),1e3*this.refreshInterval)):this.logger.warn("no `refreshInterval` option provided"):this.logger.error("cannot start refreshing since `datafileUrl` is not provided")}stopRefreshing(){if(!this.intervalId)return this.logger.warn("refreshing has not started yet");clearInterval(this.intervalId)}evaluateFlag(e,t={}){let r;try{const i="string"==typeof e?e:e.key;if(this.stickyFeatures&&this.stickyFeatures[i]&&void 0!==this.stickyFeatures[i].enabled)return r={featureKey:i,reason:D.STICKY,sticky:this.stickyFeatures[i],enabled:this.stickyFeatures[i].enabled},this.logger.debug("using sticky enabled",r),r;if(this.statuses&&!this.statuses.ready&&this.initialFeatures&&this.initialFeatures[i]&&void 0!==this.initialFeatures[i].enabled)return r={featureKey:i,reason:D.INITIAL,initial:this.initialFeatures[i],enabled:this.initialFeatures[i].enabled},this.logger.debug("using initial enabled",r),r;const a=this.getFeature(e);if(!a)return r={featureKey:i,reason:D.NOT_FOUND},this.logger.warn("feature not found",r),r;a.deprecated&&this.logger.warn("feature is deprecated",{featureKey:a.key});const s=this.interceptContext?this.interceptContext(t):t,{force:n,forceIndex:o}=R(a,t,this.datafileReader,this.logger);if(n&&void 0!==n.enabled)return r={featureKey:a.key,reason:D.FORCED,forceIndex:o,force:n,enabled:n.enabled},this.logger.debug("forced enabled found",r),r;if(a.required&&a.required.length>0){const e=a.required.every((e=>{let t,r;return"string"==typeof e?t=e:(t=e.key,r=e.variation),!!this.isEnabled(t,s)&&(void 0===r||this.getVariation(t,s)===r)}));if(!e)return r={featureKey:a.key,reason:D.REQUIRED,required:a.required,enabled:e},this.logger.debug("required features not enabled",r),r}const{bucketKey:u,bucketValue:l}=this.getBucketValue(a,s),c=function(e,t,r,i){return e.find((e=>!!I(O(e.segments),t,r,i)))}(a.traffic,s,this.datafileReader,this.logger);if(c){if(a.ranges&&a.ranges.length>0)return a.ranges.find((e=>l>=e[0]&&l<e[1]))?(r={featureKey:a.key,reason:D.ALLOCATED,bucketKey:u,bucketValue:l,ruleKey:c.key,traffic:c,enabled:void 0===c.enabled||c.enabled},this.logger.debug("matched",r),r):(r={featureKey:a.key,reason:D.OUT_OF_RANGE,bucketKey:u,bucketValue:l,enabled:!1},this.logger.debug("not matched",r),r);if(void 0!==c.enabled)return r={featureKey:a.key,reason:D.OVERRIDE,bucketKey:u,bucketValue:l,ruleKey:c.key,traffic:c,enabled:c.enabled},this.logger.debug("override from rule",r),r;if(l<=c.percentage)return r={featureKey:a.key,reason:D.RULE,bucketKey:u,bucketValue:l,ruleKey:c.key,traffic:c,enabled:!0},this.logger.debug("matched traffic",r),r}return r={featureKey:a.key,reason:D.NO_MATCH,bucketKey:u,bucketValue:l,enabled:!1},this.logger.debug("nothing matched",r),r}catch(t){return r={featureKey:"string"==typeof e?e:e.key,reason:D.ERROR,error:t},this.logger.error("error",r),r}}isEnabled(e,t={}){try{return!0===this.evaluateFlag(e,t).enabled}catch(t){return this.logger.error("isEnabled",{featureKey:e,error:t}),!1}}evaluateVariation(e,t={}){let r;try{const i="string"==typeof e?e:e.key;if(!1===this.evaluateFlag(e,t).enabled)return r={featureKey:i,reason:D.DISABLED},this.logger.debug("feature is disabled",r),r;if(this.stickyFeatures&&this.stickyFeatures[i]){const e=this.stickyFeatures[i].variation;if(void 0!==e)return r={featureKey:i,reason:D.STICKY,variationValue:e},this.logger.debug("using sticky variation",r),r}if(this.statuses&&!this.statuses.ready&&this.initialFeatures&&this.initialFeatures[i]&&void 0!==this.initialFeatures[i].variation){const e=this.initialFeatures[i].variation;return r={featureKey:i,reason:D.INITIAL,variationValue:e},this.logger.debug("using initial variation",r),r}const a=this.getFeature(e);if(!a)return r={featureKey:i,reason:D.NOT_FOUND},this.logger.warn("feature not found",r),r;if(!a.variations||0===a.variations.length)return r={featureKey:i,reason:D.NO_VARIATIONS},this.logger.warn("no variations",r),r;const s=this.interceptContext?this.interceptContext(t):t,{force:n,forceIndex:o}=R(a,t,this.datafileReader,this.logger);if(n&&n.variation){const e=a.variations.find((e=>e.value===n.variation));if(e)return r={featureKey:a.key,reason:D.FORCED,forceIndex:o,force:n,variation:e},this.logger.debug("forced variation found",r),r}const{bucketKey:u,bucketValue:l}=this.getBucketValue(a,s),{matchedTraffic:c,matchedAllocation:f}=F(a.traffic,s,l,this.datafileReader,this.logger);if(c){if(c.variation){const e=a.variations.find((e=>e.value===c.variation));if(e)return r={featureKey:a.key,reason:D.RULE,bucketKey:u,bucketValue:l,ruleKey:c.key,traffic:c,variation:e},this.logger.debug("override from rule",r),r}if(f&&f.variation){const e=a.variations.find((e=>e.value===f.variation));if(e)return r={featureKey:a.key,reason:D.ALLOCATED,bucketKey:u,bucketValue:l,ruleKey:c.key,traffic:c,variation:e},this.logger.debug("allocated variation",r),r}}return r={featureKey:a.key,reason:D.NO_MATCH,bucketKey:u,bucketValue:l},this.logger.debug("no matched variation",r),r}catch(t){return r={featureKey:"string"==typeof e?e:e.key,reason:D.ERROR,error:t},this.logger.error("error",r),r}}getVariation(e,t={}){try{const r=this.evaluateVariation(e,t);return void 0!==r.variationValue?r.variationValue:r.variation?r.variation.value:void 0}catch(t){return void this.logger.error("getVariation",{featureKey:e,error:t})}}activate(e,t={}){try{const r=this.evaluateVariation(e,t),i=r.variation?r.variation.value:r.variationValue;if(void 0===i)return;const a=this.interceptContext?this.interceptContext(t):t,s={};return this.datafileReader.getAllAttributes().filter((e=>!0===e.capture)).forEach((e=>{void 0!==a[e.key]&&(s[e.key]=t[e.key])})),this.emitter.emit("activation",e,i,a,s,r),i}catch(t){return void this.logger.error("activate",{featureKey:e,error:t})}}evaluateVariable(e,t,r={}){let i;try{const a="string"==typeof e?e:e.key;if(!1===this.evaluateFlag(e,r).enabled)return i={featureKey:a,reason:D.DISABLED},this.logger.debug("feature is disabled",i),i;if(this.stickyFeatures&&this.stickyFeatures[a]){const e=this.stickyFeatures[a].variables;if(e){const r=e[t];if(void 0!==r)return i={featureKey:a,reason:D.STICKY,variableKey:t,variableValue:r},this.logger.debug("using sticky variable",i),i}}if(this.statuses&&!this.statuses.ready&&this.initialFeatures&&this.initialFeatures[a]){const e=this.initialFeatures[a].variables;if(e&&void 0!==e[t])return i={featureKey:a,reason:D.INITIAL,variableKey:t,variableValue:e[t]},this.logger.debug("using initial variable",i),i}const s=this.getFeature(e);if(!s)return i={featureKey:a,reason:D.NOT_FOUND,variableKey:t},this.logger.warn("feature not found in datafile",i),i;const n=Array.isArray(s.variablesSchema)?s.variablesSchema.find((e=>e.key===t)):void 0;if(!n)return i={featureKey:a,reason:D.NOT_FOUND,variableKey:t},this.logger.warn("variable schema not found",i),i;const o=this.interceptContext?this.interceptContext(r):r,{force:u,forceIndex:l}=R(s,r,this.datafileReader,this.logger);if(u&&u.variables&&void 0!==u.variables[t])return i={featureKey:s.key,reason:D.FORCED,forceIndex:l,force:u,variableKey:t,variableSchema:n,variableValue:u.variables[t]},this.logger.debug("forced variable",i),i;const{bucketKey:c,bucketValue:f}=this.getBucketValue(s,o),{matchedTraffic:h,matchedAllocation:d}=F(s.traffic,o,f,this.datafileReader,this.logger);if(h){if(h.variables&&void 0!==h.variables[t])return i={featureKey:s.key,reason:D.RULE,bucketKey:c,bucketValue:f,ruleKey:h.key,traffic:h,variableKey:t,variableSchema:n,variableValue:h.variables[t]},this.logger.debug("override from rule",i),i;let e;if(u&&u.variation?e=u.variation:d&&d.variation&&(e=d.variation),e&&Array.isArray(s.variations)){const r=s.variations.find((t=>t.value===e));if(r&&r.variables){const e=r.variables.find((e=>e.key===t));if(e){if(e.overrides){const r=e.overrides.find((e=>e.conditions?E("string"==typeof e.conditions?JSON.parse(e.conditions):e.conditions,o,this.logger):!!e.segments&&I(O(e.segments),o,this.datafileReader,this.logger)));if(r)return i={featureKey:s.key,reason:D.OVERRIDE,bucketKey:c,bucketValue:f,ruleKey:h.key,traffic:h,variableKey:t,variableSchema:n,variableValue:r.value},this.logger.debug("variable override",i),i}if(void 0!==e.value)return i={featureKey:s.key,reason:D.ALLOCATED,bucketKey:c,bucketValue:f,ruleKey:h.key,traffic:h,variableKey:t,variableSchema:n,variableValue:e.value},this.logger.debug("allocated variable",i),i}}}}return i={featureKey:s.key,reason:D.DEFAULTED,bucketKey:c,bucketValue:f,variableKey:t,variableSchema:n,variableValue:n.defaultValue},this.logger.debug("using default value",i),i}catch(r){return i={featureKey:"string"==typeof e?e:e.key,reason:D.ERROR,variableKey:t,error:r},this.logger.error("error",i),i}}getVariable(e,t,r={}){try{const i=this.evaluateVariable(e,t,r);return void 0!==i.variableValue?i.variableSchema&&"json"===i.variableSchema.type&&"string"==typeof i.variableValue?JSON.parse(i.variableValue):i.variableValue:void 0}catch(r){return void this.logger.error("getVariable",{featureKey:e,variableKey:t,error:r})}}getVariableBoolean(e,t,r={}){return T(this.getVariable(e,t,r),"boolean")}getVariableString(e,t,r={}){return T(this.getVariable(e,t,r),"string")}getVariableInteger(e,t,r={}){return T(this.getVariable(e,t,r),"integer")}getVariableDouble(e,t,r={}){return T(this.getVariable(e,t,r),"double")}getVariableArray(e,t,r={}){return T(this.getVariable(e,t,r),"array")}getVariableObject(e,t,r={}){return T(this.getVariable(e,t,r),"object")}getVariableJSON(e,t,r={}){return T(this.getVariable(e,t,r),"json")}}function _(e){return new w(e)}var S=i.vl,N=i.f6,B=i.Jr,U=i.Vy,C=i.lb,j=i.i4,q=i.mx,M=i.Q_,J=i.h,P=i.K_,W=i.DU,z=i.dg,G=i.Zy,H=i.xE;export{S as Emitter,N as EvaluationReason,B as FeaturevisorInstance,U as Logger,C as MAX_BUCKETED_NUMBER,j as allConditionsAreMatched,q as conditionIsMatched,M as createInstance,J as createLogger,P as defaultLogHandler,W as defaultLogLevels,z as getBucketedNumber,G as getValueByType,H as loggerPrefix};
1
+ var e={784:e=>{!function(){const t=e=>(new TextEncoder).encode(e);function r(e,r){let i,a,s,n,o,u,l,c;for("string"==typeof e&&(e=t(e)),i=3&e.length,a=e.length-i,s=r,o=3432918353,u=461845907,c=0;c<a;)l=255&e[c]|(255&e[++c])<<8|(255&e[++c])<<16|(255&e[++c])<<24,++c,l=(65535&l)*o+(((l>>>16)*o&65535)<<16)&4294967295,l=l<<15|l>>>17,l=(65535&l)*u+(((l>>>16)*u&65535)<<16)&4294967295,s^=l,s=s<<13|s>>>19,n=5*(65535&s)+((5*(s>>>16)&65535)<<16)&4294967295,s=27492+(65535&n)+((58964+(n>>>16)&65535)<<16);switch(l=0,i){case 3:l^=(255&e[c+2])<<16;case 2:l^=(255&e[c+1])<<8;case 1:l^=255&e[c],l=(65535&l)*o+(((l>>>16)*o&65535)<<16)&4294967295,l=l<<15|l>>>17,l=(65535&l)*u+(((l>>>16)*u&65535)<<16)&4294967295,s^=l}return s^=e.length,s^=s>>>16,s=2246822507*(65535&s)+((2246822507*(s>>>16)&65535)<<16)&4294967295,s^=s>>>13,s=3266489909*(65535&s)+((3266489909*(s>>>16)&65535)<<16)&4294967295,s^=s>>>16,s>>>0}const i=r;i.v2=function(e,r){"string"==typeof e&&(e=t(e));let i,a=e.length,s=r^a,n=0;for(;a>=4;)i=255&e[n]|(255&e[++n])<<8|(255&e[++n])<<16|(255&e[++n])<<24,i=1540483477*(65535&i)+((1540483477*(i>>>16)&65535)<<16),i^=i>>>24,i=1540483477*(65535&i)+((1540483477*(i>>>16)&65535)<<16),s=1540483477*(65535&s)+((1540483477*(s>>>16)&65535)<<16)^i,a-=4,++n;switch(a){case 3:s^=(255&e[n+2])<<16;case 2:s^=(255&e[n+1])<<8;case 1:s^=255&e[n],s=1540483477*(65535&s)+((1540483477*(s>>>16)&65535)<<16)}return s^=s>>>13,s=1540483477*(65535&s)+((1540483477*(s>>>16)&65535)<<16),s^=s>>>15,s>>>0},i.v3=r,e.exports=i}()}},t={};function r(i){var a=t[i];if(void 0!==a)return a.exports;var s=t[i]={exports:{}};return e[i](s,s.exports,r),s.exports}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);var i={};r.d(i,{vl:()=>y,f6:()=>D,Jr:()=>w,Vy:()=>h,lb:()=>o,i4:()=>E,mx:()=>A,Q_:()=>_,h:()=>d,K_:()=>f,DU:()=>c,dg:()=>u,Zy:()=>T,xE:()=>l});var a=r(784);const s=1,n=Math.pow(2,32),o=1e5;function u(e){const t=a.v3(e,s)/n;return Math.floor(t*o)}const l="[Featurevisor]",c=["warn","error"],f=function(e,t,r={}){switch(e){case"debug":console.log(l,t,r);break;case"info":console.info(l,t,r);break;case"warn":console.warn(l,t,r);break;case"error":console.error(l,t,r)}};class h{constructor(e){this.levels=e.levels,this.handle=e.handler}setLevels(e){this.levels=e}log(e,t,r){-1!==this.levels.indexOf(e)&&this.handle(e,t,r)}debug(e,t){this.log("debug",e,t)}info(e,t){this.log("info",e,t)}warn(e,t){this.log("warn",e,t)}error(e,t){this.log("error",e,t)}}function d(e={}){const t=e.levels||c,r=e.handler||f;return new h({levels:t,handler:r})}class g{constructor(e){if(this.schemaVersion=e.schemaVersion,this.revision=e.revision,"2"===this.schemaVersion){const t=e;this.attributes=t.attributes,this.segments=t.segments,this.features=t.features}else{const t=e;this.attributes={},t.attributes.forEach((e=>{this.attributes[e.key]=e})),this.segments={},t.segments.forEach((e=>{this.segments[e.key]=e})),this.features={},t.features.forEach((e=>{this.features[e.key]=e}))}}getRevision(){return this.revision}getSchemaVersion(){return this.schemaVersion}getAllAttributes(){const e=[];return Object.keys(this.attributes).forEach((t=>{e.push(this.attributes[t])})),e}getAttribute(e){return this.attributes[e]}getSegment(e){const t=this.segments[e];if(t)return function(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}(t,"conditions")}getFeature(e){return this.features[e]}}class y{constructor(){this._listeners={}}addListener(e,t){void 0===this._listeners[e]&&(this._listeners[e]=[]),this._listeners[e].push(t)}removeListener(e,t){if(void 0===this._listeners[e])return;const r=this._listeners[e].indexOf(t);-1!==r&&this._listeners[e].splice(r,1)}removeAllListeners(e){e?this._listeners[e]=[]:Object.keys(this._listeners).forEach((e=>{this._listeners[e]=[]}))}emit(e,...t){void 0!==this._listeners[e]&&this._listeners[e].forEach((e=>{e(...t)}))}}const v=(e,t)=>{const r=k(e),i=k(t),a=r.pop(),s=i.pop(),n=V(r,i);return 0!==n?n:a&&s?V(a.split("."),s.split(".")):a||s?a?-1:1:0},b=/^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\-]+(?:\.[\da-z\-]+)*))?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?)?)?$/i,k=e=>{if("string"!=typeof e)throw new TypeError("Invalid argument expected string");const t=e.match(b);if(!t)throw new Error(`Invalid argument not valid semver ('${e}' received)`);return t.shift(),t},m=e=>"*"===e||"x"===e||"X"===e,p=e=>{const t=parseInt(e,10);return isNaN(t)?e:t},K=(e,t)=>{if(m(e)||m(t))return 0;const[r,i]=((e,t)=>typeof e!=typeof t?[String(e),String(t)]:[e,t])(p(e),p(t));return r>i?1:r<i?-1:0},V=(e,t)=>{for(let r=0;r<Math.max(e.length,t.length);r++){const i=K(e[r]||"0",t[r]||"0");if(0!==i)return i}return 0};function A(e,t){const{attribute:r,operator:i,value:a}=e;if("equals"===i)return t[r]===a;if("notEquals"===i)return t[r]!==a;if("before"===i||"after"===i){const e=t[r],s=e instanceof Date?e:new Date(e),n=a instanceof Date?a:new Date(a);return"before"===i?s<n:s>n}if(!Array.isArray(a)||-1===["string","number"].indexOf(typeof t[r])&&null!==t[r]){if("string"==typeof t[r]&&"string"==typeof a){const e=t[r];if("contains"===i)return-1!==e.indexOf(a);if("notContains"===i)return-1===e.indexOf(a);if("startsWith"===i)return e.startsWith(a);if("endsWith"===i)return e.endsWith(a);if("semverEquals"===i)return 0===v(e,a);if("semverNotEquals"===i)return 0!==v(e,a);if("semverGreaterThan"===i)return 1===v(e,a);if("semverGreaterThanOrEquals"===i)return v(e,a)>=0;if("semverLessThan"===i)return-1===v(e,a);if("semverLessThanOrEquals"===i)return v(e,a)<=0}else if("number"==typeof t[r]&&"number"==typeof a){const e=t[r];if("greaterThan"===i)return e>a;if("greaterThanOrEquals"===i)return e>=a;if("lessThan"===i)return e<a;if("lessThanOrEquals"===i)return e<=a}}else{const e=t[r];if("in"===i)return-1!==a.indexOf(e);if("notIn"===i)return-1===a.indexOf(e)}return!1}function E(e,t,r){if("attribute"in e)try{return A(e,t)}catch(i){return r.warn(i.message,{error:i,details:{condition:e,context:t}}),!1}return"and"in e&&Array.isArray(e.and)?e.and.every((e=>E(e,t,r))):"or"in e&&Array.isArray(e.or)?e.or.some((e=>E(e,t,r))):"not"in e&&Array.isArray(e.not)?e.not.every((()=>!1===E({and:e.not},t,r))):!!Array.isArray(e)&&e.every((e=>E(e,t,r)))}function I(e,t,r,i){if("*"===e)return!0;if("string"==typeof e){const a=r.getSegment(e);return!!a&&function(e,t,r){return E(e.conditions,t,r)}(a,t,i)}if("object"==typeof e){if("and"in e&&Array.isArray(e.and))return e.and.every((e=>I(e,t,r,i)));if("or"in e&&Array.isArray(e.or))return e.or.some((e=>I(e,t,r,i)));if("not"in e&&Array.isArray(e.not))return e.not.every((e=>!1===I(e,t,r,i)))}return!!Array.isArray(e)&&e.every((e=>I(e,t,r,i)))}function O(e){return"string"==typeof e&&(e.startsWith("{")||e.startsWith("["))?JSON.parse(e):e}function F(e,t,r,i,a){const s=e.find((e=>I(O(e.segments),t,i,a)));if(!s)return{matchedTraffic:void 0,matchedAllocation:void 0};const n=function(e,t){for(const r of e.allocation){const[e,i]=r.range;if(r.range&&e<=t&&i>=t)return r}}(s,r);return{matchedTraffic:s,matchedAllocation:n}}function R(e,t,r,i){const a={force:void 0,forceIndex:void 0};if(!e.force)return a;for(let s=0;s<e.force.length;s++){const n=e.force[s];if(n.conditions&&E(n.conditions,t,i)){a.force=n,a.forceIndex=s;break}if(n.segments&&I(n.segments,t,r,i)){a.force=n,a.forceIndex=s;break}}return a}Object.keys({">":[1],">=":[0,1],"=":[0],"<=":[-1,0],"<":[-1]});const L={schemaVersion:"1",revision:"unknown",attributes:[],segments:[],features:[]};var D;function x(e,t){return t?t(e):fetch(e).then((e=>e.json()))}function T(e,t){try{if(void 0===e)return;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}}catch(e){return}}!function(e){e.NOT_FOUND="not_found",e.NO_VARIATIONS="no_variations",e.NO_MATCH="no_match",e.DISABLED="disabled",e.REQUIRED="required",e.OUT_OF_RANGE="out_of_range",e.FORCED="forced",e.INITIAL="initial",e.STICKY="sticky",e.RULE="rule",e.ALLOCATED="allocated",e.DEFAULTED="defaulted",e.OVERRIDE="override",e.ERROR="error"}(D||(D={}));class w{constructor(e){this.bucketKeySeparator=e.bucketKeySeparator||".",this.configureBucketKey=e.configureBucketKey,this.configureBucketValue=e.configureBucketValue,this.datafileUrl=e.datafileUrl,this.handleDatafileFetch=e.handleDatafileFetch,this.initialFeatures=e.initialFeatures,this.interceptContext=e.interceptContext,this.logger=e.logger||d(),this.refreshInterval=e.refreshInterval,this.stickyFeatures=e.stickyFeatures,this.emitter=new y,this.statuses={ready:!1,refreshInProgress:!1},e.onReady&&this.emitter.addListener("ready",e.onReady),e.onRefresh&&this.emitter.addListener("refresh",e.onRefresh),e.onUpdate&&this.emitter.addListener("update",e.onUpdate),e.onActivation&&this.emitter.addListener("activation",e.onActivation);const t=this.emitter.addListener.bind(this.emitter);this.on=t,this.addListener=t;const r=this.emitter.removeListener.bind(this.emitter);if(this.off=r,this.removeListener=r,this.removeAllListeners=this.emitter.removeAllListeners.bind(this.emitter),e.datafileUrl)this.setDatafile(e.datafile||L),x(e.datafileUrl,e.handleDatafileFetch).then((e=>{this.setDatafile(e),this.statuses.ready=!0,this.emitter.emit("ready"),this.refreshInterval&&this.startRefreshing()})).catch((e=>{this.logger.error("failed to fetch datafile",{error:e})}));else{if(!e.datafile)throw new Error("Featurevisor SDK instance cannot be created without both `datafile` and `datafileUrl` options");this.setDatafile(e.datafile),this.statuses.ready=!0,setTimeout((()=>{this.emitter.emit("ready")}),0)}}setLogLevels(e){this.logger.setLevels(e)}onReady(){return new Promise((e=>{if(this.statuses.ready)return e(this);const t=()=>{this.emitter.removeListener("ready",t),e(this)};this.emitter.addListener("ready",t)}))}setDatafile(e){try{this.datafileReader=new g("string"==typeof e?JSON.parse(e):e)}catch(e){this.logger.error("could not parse datafile",{error:e})}}setStickyFeatures(e){this.stickyFeatures=e}getRevision(){return this.datafileReader.getRevision()}getFeature(e){return"string"==typeof e?this.datafileReader.getFeature(e):e}getBucketKey(e,t){const r=e.key;let i,a;if("string"==typeof e.bucketBy)i="plain",a=[e.bucketBy];else if(Array.isArray(e.bucketBy))i="and",a=e.bucketBy;else{if("object"!=typeof e.bucketBy||!Array.isArray(e.bucketBy.or))throw this.logger.error("invalid bucketBy",{featureKey:r,bucketBy:e.bucketBy}),new Error("invalid bucketBy");i="or",a=e.bucketBy.or}const s=[];a.forEach((e=>{const r=t[e];void 0!==r&&("plain"===i||"and"===i||0===s.length)&&s.push(r)})),s.push(r);const n=s.join(this.bucketKeySeparator);return this.configureBucketKey?this.configureBucketKey(e,t,n):n}getBucketValue(e,t){const r=this.getBucketKey(e,t),i=u(r);return this.configureBucketValue?{bucketKey:r,bucketValue:this.configureBucketValue(e,t,i)}:{bucketKey:r,bucketValue:i}}isReady(){return this.statuses.ready}refresh(){return this.logger.debug("refreshing datafile"),this.statuses.refreshInProgress?this.logger.warn("refresh in progress, skipping"):this.datafileUrl?(this.statuses.refreshInProgress=!0,void x(this.datafileUrl,this.handleDatafileFetch).then((e=>{const t=this.getRevision()!==e.revision;this.setDatafile(e),this.logger.info("refreshed datafile"),this.emitter.emit("refresh"),t&&this.emitter.emit("update"),this.statuses.refreshInProgress=!1})).catch((e=>{this.logger.error("failed to refresh datafile",{error:e}),this.statuses.refreshInProgress=!1}))):this.logger.error("cannot refresh since `datafileUrl` is not provided")}startRefreshing(){return this.datafileUrl?this.intervalId?this.logger.warn("refreshing has already started"):this.refreshInterval?void(this.intervalId=setInterval((()=>{this.refresh()}),1e3*this.refreshInterval)):this.logger.warn("no `refreshInterval` option provided"):this.logger.error("cannot start refreshing since `datafileUrl` is not provided")}stopRefreshing(){if(!this.intervalId)return this.logger.warn("refreshing has not started yet");clearInterval(this.intervalId)}evaluateFlag(e,t={}){let r;try{const i="string"==typeof e?e:e.key;if(this.stickyFeatures&&this.stickyFeatures[i]&&void 0!==this.stickyFeatures[i].enabled)return r={featureKey:i,reason:D.STICKY,sticky:this.stickyFeatures[i],enabled:this.stickyFeatures[i].enabled},this.logger.debug("using sticky enabled",r),r;if(this.statuses&&!this.statuses.ready&&this.initialFeatures&&this.initialFeatures[i]&&void 0!==this.initialFeatures[i].enabled)return r={featureKey:i,reason:D.INITIAL,initial:this.initialFeatures[i],enabled:this.initialFeatures[i].enabled},this.logger.debug("using initial enabled",r),r;const a=this.getFeature(e);if(!a)return r={featureKey:i,reason:D.NOT_FOUND},this.logger.warn("feature not found",r),r;a.deprecated&&this.logger.warn("feature is deprecated",{featureKey:a.key});const s=this.interceptContext?this.interceptContext(t):t,{force:n,forceIndex:o}=R(a,t,this.datafileReader,this.logger);if(n&&void 0!==n.enabled)return r={featureKey:a.key,reason:D.FORCED,forceIndex:o,force:n,enabled:n.enabled},this.logger.debug("forced enabled found",r),r;if(a.required&&a.required.length>0){const e=a.required.every((e=>{let t,r;return"string"==typeof e?t=e:(t=e.key,r=e.variation),!!this.isEnabled(t,s)&&(void 0===r||this.getVariation(t,s)===r)}));if(!e)return r={featureKey:a.key,reason:D.REQUIRED,required:a.required,enabled:e},this.logger.debug("required features not enabled",r),r}const{bucketKey:u,bucketValue:l}=this.getBucketValue(a,s),c=function(e,t,r,i){const a=e.find((e=>!!I(O(e.segments),t,r,i)));if(a&&a.percentage>0)return a}(a.traffic,s,this.datafileReader,this.logger);if(c){if(a.ranges&&a.ranges.length>0)return a.ranges.find((e=>l>=e[0]&&l<e[1]))?(r={featureKey:a.key,reason:D.ALLOCATED,bucketKey:u,bucketValue:l,ruleKey:c.key,traffic:c,enabled:void 0===c.enabled||c.enabled},this.logger.debug("matched",r),r):(r={featureKey:a.key,reason:D.OUT_OF_RANGE,bucketKey:u,bucketValue:l,enabled:!1},this.logger.debug("not matched",r),r);if(void 0!==c.enabled)return r={featureKey:a.key,reason:D.OVERRIDE,bucketKey:u,bucketValue:l,ruleKey:c.key,traffic:c,enabled:c.enabled},this.logger.debug("override from rule",r),r;if(l<=c.percentage)return r={featureKey:a.key,reason:D.RULE,bucketKey:u,bucketValue:l,ruleKey:c.key,traffic:c,enabled:!0},this.logger.debug("matched traffic",r),r}return r={featureKey:a.key,reason:D.NO_MATCH,bucketKey:u,bucketValue:l,enabled:!1},this.logger.debug("nothing matched",r),r}catch(t){return r={featureKey:"string"==typeof e?e:e.key,reason:D.ERROR,error:t},this.logger.error("error",r),r}}isEnabled(e,t={}){try{return!0===this.evaluateFlag(e,t).enabled}catch(t){return this.logger.error("isEnabled",{featureKey:e,error:t}),!1}}evaluateVariation(e,t={}){let r;try{const i="string"==typeof e?e:e.key;if(!1===this.evaluateFlag(e,t).enabled)return r={featureKey:i,reason:D.DISABLED},this.logger.debug("feature is disabled",r),r;if(this.stickyFeatures&&this.stickyFeatures[i]){const e=this.stickyFeatures[i].variation;if(void 0!==e)return r={featureKey:i,reason:D.STICKY,variationValue:e},this.logger.debug("using sticky variation",r),r}if(this.statuses&&!this.statuses.ready&&this.initialFeatures&&this.initialFeatures[i]&&void 0!==this.initialFeatures[i].variation){const e=this.initialFeatures[i].variation;return r={featureKey:i,reason:D.INITIAL,variationValue:e},this.logger.debug("using initial variation",r),r}const a=this.getFeature(e);if(!a)return r={featureKey:i,reason:D.NOT_FOUND},this.logger.warn("feature not found",r),r;if(!a.variations||0===a.variations.length)return r={featureKey:i,reason:D.NO_VARIATIONS},this.logger.warn("no variations",r),r;const s=this.interceptContext?this.interceptContext(t):t,{force:n,forceIndex:o}=R(a,t,this.datafileReader,this.logger);if(n&&n.variation){const e=a.variations.find((e=>e.value===n.variation));if(e)return r={featureKey:a.key,reason:D.FORCED,forceIndex:o,force:n,variation:e},this.logger.debug("forced variation found",r),r}const{bucketKey:u,bucketValue:l}=this.getBucketValue(a,s),{matchedTraffic:c,matchedAllocation:f}=F(a.traffic,s,l,this.datafileReader,this.logger);if(c){if(c.variation){const e=a.variations.find((e=>e.value===c.variation));if(e)return r={featureKey:a.key,reason:D.RULE,bucketKey:u,bucketValue:l,ruleKey:c.key,traffic:c,variation:e},this.logger.debug("override from rule",r),r}if(f&&f.variation){const e=a.variations.find((e=>e.value===f.variation));if(e)return r={featureKey:a.key,reason:D.ALLOCATED,bucketKey:u,bucketValue:l,ruleKey:c.key,traffic:c,variation:e},this.logger.debug("allocated variation",r),r}}return r={featureKey:a.key,reason:D.NO_MATCH,bucketKey:u,bucketValue:l},this.logger.debug("no matched variation",r),r}catch(t){return r={featureKey:"string"==typeof e?e:e.key,reason:D.ERROR,error:t},this.logger.error("error",r),r}}getVariation(e,t={}){try{const r=this.evaluateVariation(e,t);return void 0!==r.variationValue?r.variationValue:r.variation?r.variation.value:void 0}catch(t){return void this.logger.error("getVariation",{featureKey:e,error:t})}}activate(e,t={}){try{const r=this.evaluateVariation(e,t),i=r.variation?r.variation.value:r.variationValue;if(void 0===i)return;const a=this.interceptContext?this.interceptContext(t):t,s={};return this.datafileReader.getAllAttributes().filter((e=>!0===e.capture)).forEach((e=>{void 0!==a[e.key]&&(s[e.key]=t[e.key])})),this.emitter.emit("activation",e,i,a,s,r),i}catch(t){return void this.logger.error("activate",{featureKey:e,error:t})}}evaluateVariable(e,t,r={}){let i;try{const a="string"==typeof e?e:e.key;if(!1===this.evaluateFlag(e,r).enabled)return i={featureKey:a,reason:D.DISABLED},this.logger.debug("feature is disabled",i),i;if(this.stickyFeatures&&this.stickyFeatures[a]){const e=this.stickyFeatures[a].variables;if(e){const r=e[t];if(void 0!==r)return i={featureKey:a,reason:D.STICKY,variableKey:t,variableValue:r},this.logger.debug("using sticky variable",i),i}}if(this.statuses&&!this.statuses.ready&&this.initialFeatures&&this.initialFeatures[a]){const e=this.initialFeatures[a].variables;if(e&&void 0!==e[t])return i={featureKey:a,reason:D.INITIAL,variableKey:t,variableValue:e[t]},this.logger.debug("using initial variable",i),i}const s=this.getFeature(e);if(!s)return i={featureKey:a,reason:D.NOT_FOUND,variableKey:t},this.logger.warn("feature not found in datafile",i),i;const n=Array.isArray(s.variablesSchema)?s.variablesSchema.find((e=>e.key===t)):void 0;if(!n)return i={featureKey:a,reason:D.NOT_FOUND,variableKey:t},this.logger.warn("variable schema not found",i),i;const o=this.interceptContext?this.interceptContext(r):r,{force:u,forceIndex:l}=R(s,r,this.datafileReader,this.logger);if(u&&u.variables&&void 0!==u.variables[t])return i={featureKey:s.key,reason:D.FORCED,forceIndex:l,force:u,variableKey:t,variableSchema:n,variableValue:u.variables[t]},this.logger.debug("forced variable",i),i;const{bucketKey:c,bucketValue:f}=this.getBucketValue(s,o),{matchedTraffic:h,matchedAllocation:d}=F(s.traffic,o,f,this.datafileReader,this.logger);if(h){if(h.variables&&void 0!==h.variables[t])return i={featureKey:s.key,reason:D.RULE,bucketKey:c,bucketValue:f,ruleKey:h.key,traffic:h,variableKey:t,variableSchema:n,variableValue:h.variables[t]},this.logger.debug("override from rule",i),i;let e;if(u&&u.variation?e=u.variation:d&&d.variation&&(e=d.variation),e&&Array.isArray(s.variations)){const r=s.variations.find((t=>t.value===e));if(r&&r.variables){const e=r.variables.find((e=>e.key===t));if(e){if(e.overrides){const r=e.overrides.find((e=>e.conditions?E("string"==typeof e.conditions?JSON.parse(e.conditions):e.conditions,o,this.logger):!!e.segments&&I(O(e.segments),o,this.datafileReader,this.logger)));if(r)return i={featureKey:s.key,reason:D.OVERRIDE,bucketKey:c,bucketValue:f,ruleKey:h.key,traffic:h,variableKey:t,variableSchema:n,variableValue:r.value},this.logger.debug("variable override",i),i}if(void 0!==e.value)return i={featureKey:s.key,reason:D.ALLOCATED,bucketKey:c,bucketValue:f,ruleKey:h.key,traffic:h,variableKey:t,variableSchema:n,variableValue:e.value},this.logger.debug("allocated variable",i),i}}}}return i={featureKey:s.key,reason:D.DEFAULTED,bucketKey:c,bucketValue:f,variableKey:t,variableSchema:n,variableValue:n.defaultValue},this.logger.debug("using default value",i),i}catch(r){return i={featureKey:"string"==typeof e?e:e.key,reason:D.ERROR,variableKey:t,error:r},this.logger.error("error",i),i}}getVariable(e,t,r={}){try{const i=this.evaluateVariable(e,t,r);return void 0!==i.variableValue?i.variableSchema&&"json"===i.variableSchema.type&&"string"==typeof i.variableValue?JSON.parse(i.variableValue):i.variableValue:void 0}catch(r){return void this.logger.error("getVariable",{featureKey:e,variableKey:t,error:r})}}getVariableBoolean(e,t,r={}){return T(this.getVariable(e,t,r),"boolean")}getVariableString(e,t,r={}){return T(this.getVariable(e,t,r),"string")}getVariableInteger(e,t,r={}){return T(this.getVariable(e,t,r),"integer")}getVariableDouble(e,t,r={}){return T(this.getVariable(e,t,r),"double")}getVariableArray(e,t,r={}){return T(this.getVariable(e,t,r),"array")}getVariableObject(e,t,r={}){return T(this.getVariable(e,t,r),"object")}getVariableJSON(e,t,r={}){return T(this.getVariable(e,t,r),"json")}}function _(e){return new w(e)}var S=i.vl,N=i.f6,B=i.Jr,U=i.Vy,C=i.lb,j=i.i4,q=i.mx,M=i.Q_,J=i.h,P=i.K_,W=i.DU,z=i.dg,G=i.Zy,H=i.xE;export{S as Emitter,N as EvaluationReason,B as FeaturevisorInstance,U as Logger,C as MAX_BUCKETED_NUMBER,j as allConditionsAreMatched,q as conditionIsMatched,M as createInstance,J as createLogger,P as defaultLogHandler,W as defaultLogLevels,z as getBucketedNumber,G as getValueByType,H as loggerPrefix};
2
2
  //# sourceMappingURL=index.mjs.map
package/dist/index.mjs.gz CHANGED
Binary file