@splitlab/core 0.3.0 → 0.3.1

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.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var d=Object.defineProperty;var _=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var w=(r,i)=>{for(var t in i)d(r,t,{get:i[t],enumerable:!0})},R=(r,i,t,u)=>{if(i&&typeof i=="object"||typeof i=="function")for(let l of k(i))!A.call(r,l)&&l!==t&&d(r,l,{get:()=>i[l],enumerable:!(u=_(i,l))||u.enumerable});return r};var O=r=>R(d({},"__esModule",{value:!0}),r);var M={};w(M,{evaluateRules:()=>m,hashToFloat:()=>S,localEvaluate:()=>b,murmurhash3:()=>g,parseUserAgent:()=>v});module.exports=O(M);function g(r,i=0){let t=i>>>0,u=r.length,l=u>>2,n=3432918353,s=461845907;for(let o=0;o<l;o++){let a=r.charCodeAt(o*4)&255|(r.charCodeAt(o*4+1)&255)<<8|(r.charCodeAt(o*4+2)&255)<<16|(r.charCodeAt(o*4+3)&255)<<24;a=Math.imul(a,n),a=a<<15|a>>>17,a=Math.imul(a,s),t^=a,t=t<<13|t>>>19,t=Math.imul(t,5)+3864292196}let f=l*4,e=0;switch(u&3){case 3:e^=(r.charCodeAt(f+2)&255)<<16;case 2:e^=(r.charCodeAt(f+1)&255)<<8;case 1:e^=r.charCodeAt(f)&255,e=Math.imul(e,n),e=e<<15|e>>>17,e=Math.imul(e,s),t^=e}return t^=u,t^=t>>>16,t=Math.imul(t,2246822507),t^=t>>>13,t=Math.imul(t,3266489909),t^=t>>>16,t>>>0}function S(r,i){return g(r,i)/4294967295}function b(r,i,t={}){let u={},l={},n=r.segments||[],s=r.exclusion_groups||[],f=new Map;for(let e of s)for(let[o,a]of Object.entries(e.experiments))f.set(o,{layer_key:e.layer_key,...a});for(let e of r.experiments){if(e.targeting_rules&&!m(e.targeting_rules,t,n)){u[e.key]=null;continue}let o=f.get(e.key);if(o){let c=g(o.layer_key+":"+i)%1e4;if(c<o.bucket_start||c>=o.bucket_end){u[e.key]=null;continue}}let a=g(e.key+":"+i);if(a%1e4/100>=e.traffic_percentage){u[e.key]=null;continue}let x=e.variants.reduce((c,y)=>c+y.weight,0),C=a%x,h=0,p=null;for(let c of e.variants)if(h+=c.weight,C<h){p=c.key;break}p||(p=e.variants[e.variants.length-1].key),u[e.key]=p}for(let e of r.flags){if(e.rules&&!m(e.rules,t,n)){l[e.key]=!1;continue}let a=g(e.key+":"+i)%100;l[e.key]=a<e.rollout_percentage}return{experiments:u,flags:l}}function m(r,i,t=[]){if(!r.groups||r.groups.length===0)return!0;let u=n=>{if(n.attribute==="$segment"){if(!Array.isArray(n.value))return!1;let f=n.value.map(String);return n.operator==="in"?f.some(e=>{let o=t.find(a=>a.id===e||a.key===e);return o?m(o.rules,i,t):!1}):n.operator==="not_in"?!f.some(e=>{let o=t.find(a=>a.id===e||a.key===e);return o?m(o.rules,i,t):!1}):!1}let s=i[n.attribute];if(s==null)return!1;switch(n.operator){case"is":return String(s)===String(n.value);case"is_not":return String(s)!==String(n.value);case"contains":return String(s).toLowerCase().includes(String(n.value).toLowerCase());case"not_contains":return!String(s).toLowerCase().includes(String(n.value).toLowerCase());case"gt":return Number(s)>Number(n.value);case"lt":return Number(s)<Number(n.value);case"gte":return Number(s)>=Number(n.value);case"lte":return Number(s)<=Number(n.value);case"in":return Array.isArray(n.value)&&n.value.map(String).includes(String(s));case"not_in":return Array.isArray(n.value)&&!n.value.map(String).includes(String(s));default:return!1}},l=n=>n.conditions.every(u);return r.match==="any"?r.groups.some(l):r.groups.every(l)}var E=[[/Edg(?:e|A|iOS)?\/(\S+)/,"Edge"],[/OPR\/(\S+)/,"Opera"],[/SamsungBrowser\/(\S+)/,"Samsung Internet"],[/UCBrowser\/(\S+)/,"UC Browser"],[/Firefox\/(\S+)/,"Firefox"],[/CriOS\/(\S+)/,"Chrome"],[/FxiOS\/(\S+)/,"Firefox"],[/Chrome\/(\S+)/,"Chrome"],[/Safari\/(\S+)/,"Safari"]],T=[[/Windows NT (\d+\.\d+)/,"Windows"],[/Mac OS X ([\d_]+)/,"macOS"],[/Android ([\d.]+)/,"Android"],[/iPhone OS ([\d_]+)/,"iOS"],[/iPad.*OS ([\d_]+)/,"iPadOS"],[/CrOS/,"ChromeOS"],[/Linux/,"Linux"]];function v(r){if(!r)return{browser:null,browser_version:null,os:null,os_version:null,device_type:null};let i=null,t=null,u=null,l=null;if(/Safari/.test(r)&&!/Chrome|CriOS|Chromium|Edg|OPR|SamsungBrowser|UCBrowser/.test(r)){let f=r.match(/Version\/(\S+)/);i="Safari",t=f?f[1]:null}else for(let[f,e]of E){let o=r.match(f);if(o){i=e,t=o[1]||null;break}}for(let[f,e]of T){let o=r.match(f);if(o){u=e,l=o[1]?.replace(/_/g,".")||null;break}}let s="desktop";return/Mobi|Android.*Mobile|iPhone/.test(r)?s="mobile":/iPad|Android(?!.*Mobile)|Tablet/.test(r)&&(s="tablet"),{browser:i,browser_version:t,os:u,os_version:l,device_type:s}}0&&(module.exports={evaluateRules,hashToFloat,localEvaluate,murmurhash3,parseUserAgent});
1
+ "use strict";var d=Object.defineProperty;var _=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var w=(r,i)=>{for(var t in i)d(r,t,{get:i[t],enumerable:!0})},R=(r,i,t,u)=>{if(i&&typeof i=="object"||typeof i=="function")for(let l of k(i))!A.call(r,l)&&l!==t&&d(r,l,{get:()=>i[l],enumerable:!(u=_(i,l))||u.enumerable});return r};var O=r=>R(d({},"__esModule",{value:!0}),r);var M={};w(M,{evaluateRules:()=>m,hashToFloat:()=>S,localEvaluate:()=>b,murmurhash3:()=>g,parseUserAgent:()=>v});module.exports=O(M);function g(r,i=0){let t=i>>>0,u=r.length,l=u>>2,n=3432918353,s=461845907;for(let o=0;o<l;o++){let a=r.charCodeAt(o*4)&255|(r.charCodeAt(o*4+1)&255)<<8|(r.charCodeAt(o*4+2)&255)<<16|(r.charCodeAt(o*4+3)&255)<<24;a=Math.imul(a,n),a=a<<15|a>>>17,a=Math.imul(a,s),t^=a,t=t<<13|t>>>19,t=Math.imul(t,5)+3864292196}let f=l*4,e=0;switch(u&3){case 3:e^=(r.charCodeAt(f+2)&255)<<16;case 2:e^=(r.charCodeAt(f+1)&255)<<8;case 1:e^=r.charCodeAt(f)&255,e=Math.imul(e,n),e=e<<15|e>>>17,e=Math.imul(e,s),t^=e}return t^=u,t^=t>>>16,t=Math.imul(t,2246822507),t^=t>>>13,t=Math.imul(t,3266489909),t^=t>>>16,t>>>0}function S(r,i){return g(r,i)/4294967295}function b(r,i,t={}){let u={},l={},n=r.segments||[],s=r.exclusion_groups||[],f=new Map;for(let e of s)for(let[o,a]of Object.entries(e.experiments))f.set(o,{layer_key:e.layer_key,...a});for(let e of r.experiments){if(e.targeting_rules&&!m(e.targeting_rules,t,n)){u[e.key]=null;continue}let o=f.get(e.key);if(o){let c=g(o.layer_key+":"+i)%1e4;if(c<o.bucket_start||c>=o.bucket_end){u[e.key]=null;continue}}let a=g(e.key+":"+i);if(a%1e4/100>=e.traffic_percentage){u[e.key]=null;continue}let x=e.variants.reduce((c,y)=>c+y.weight,0),C=a%x,h=0,p=null;for(let c of e.variants)if(h+=c.weight,C<h){p=c.key;break}p||(p=e.variants[e.variants.length-1].key),u[e.key]=p}for(let e of r.flags){if(e.rules&&!m(e.rules,t,n)){l[e.key]=!1;continue}let a=g(e.key+":"+i)%100;l[e.key]=a<e.rollout_percentage}return{experiments:u,flags:l}}function m(r,i,t=[]){if(!r.groups||r.groups.length===0)return!0;let u=n=>{if(!n.attribute)return!0;if(n.attribute==="$segment"){if(!Array.isArray(n.value))return!1;let f=n.value.map(String);return n.operator==="in"?f.some(e=>{let o=t.find(a=>a.id===e||a.key===e);return o?m(o.rules,i,t):!1}):n.operator==="not_in"?!f.some(e=>{let o=t.find(a=>a.id===e||a.key===e);return o?m(o.rules,i,t):!1}):!1}let s=i[n.attribute];if(s==null)return!1;switch(n.operator){case"is":return String(s)===String(n.value);case"is_not":return String(s)!==String(n.value);case"contains":return String(s).toLowerCase().includes(String(n.value).toLowerCase());case"not_contains":return!String(s).toLowerCase().includes(String(n.value).toLowerCase());case"gt":return Number(s)>Number(n.value);case"lt":return Number(s)<Number(n.value);case"gte":return Number(s)>=Number(n.value);case"lte":return Number(s)<=Number(n.value);case"in":return Array.isArray(n.value)&&n.value.map(String).includes(String(s));case"not_in":return Array.isArray(n.value)&&!n.value.map(String).includes(String(s));default:return!1}},l=n=>n.conditions.every(u);return r.match==="any"?r.groups.some(l):r.groups.every(l)}var E=[[/Edg(?:e|A|iOS)?\/(\S+)/,"Edge"],[/OPR\/(\S+)/,"Opera"],[/SamsungBrowser\/(\S+)/,"Samsung Internet"],[/UCBrowser\/(\S+)/,"UC Browser"],[/Firefox\/(\S+)/,"Firefox"],[/CriOS\/(\S+)/,"Chrome"],[/FxiOS\/(\S+)/,"Firefox"],[/Chrome\/(\S+)/,"Chrome"],[/Safari\/(\S+)/,"Safari"]],T=[[/Windows NT (\d+\.\d+)/,"Windows"],[/Mac OS X ([\d_]+)/,"macOS"],[/Android ([\d.]+)/,"Android"],[/iPhone OS ([\d_]+)/,"iOS"],[/iPad.*OS ([\d_]+)/,"iPadOS"],[/CrOS/,"ChromeOS"],[/Linux/,"Linux"]];function v(r){if(!r)return{browser:null,browser_version:null,os:null,os_version:null,device_type:null};let i=null,t=null,u=null,l=null;if(/Safari/.test(r)&&!/Chrome|CriOS|Chromium|Edg|OPR|SamsungBrowser|UCBrowser/.test(r)){let f=r.match(/Version\/(\S+)/);i="Safari",t=f?f[1]:null}else for(let[f,e]of E){let o=r.match(f);if(o){i=e,t=o[1]||null;break}}for(let[f,e]of T){let o=r.match(f);if(o){u=e,l=o[1]?.replace(/_/g,".")||null;break}}let s="desktop";return/Mobi|Android.*Mobile|iPhone/.test(r)?s="mobile":/iPad|Android(?!.*Mobile)|Tablet/.test(r)&&(s="tablet"),{browser:i,browser_version:t,os:u,os_version:l,device_type:s}}0&&(module.exports={evaluateRules,hashToFloat,localEvaluate,murmurhash3,parseUserAgent});
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- function g(t,l=0){let r=l>>>0,u=t.length,f=u>>2,n=3432918353,i=461845907;for(let o=0;o<f;o++){let s=t.charCodeAt(o*4)&255|(t.charCodeAt(o*4+1)&255)<<8|(t.charCodeAt(o*4+2)&255)<<16|(t.charCodeAt(o*4+3)&255)<<24;s=Math.imul(s,n),s=s<<15|s>>>17,s=Math.imul(s,i),r^=s,r=r<<13|r>>>19,r=Math.imul(r,5)+3864292196}let a=f*4,e=0;switch(u&3){case 3:e^=(t.charCodeAt(a+2)&255)<<16;case 2:e^=(t.charCodeAt(a+1)&255)<<8;case 1:e^=t.charCodeAt(a)&255,e=Math.imul(e,n),e=e<<15|e>>>17,e=Math.imul(e,i),r^=e}return r^=u,r^=r>>>16,r=Math.imul(r,2246822507),r^=r>>>13,r=Math.imul(r,3266489909),r^=r>>>16,r>>>0}function v(t,l){return g(t,l)/4294967295}function x(t,l,r={}){let u={},f={},n=t.segments||[],i=t.exclusion_groups||[],a=new Map;for(let e of i)for(let[o,s]of Object.entries(e.experiments))a.set(o,{layer_key:e.layer_key,...s});for(let e of t.experiments){if(e.targeting_rules&&!m(e.targeting_rules,r,n)){u[e.key]=null;continue}let o=a.get(e.key);if(o){let c=g(o.layer_key+":"+l)%1e4;if(c<o.bucket_start||c>=o.bucket_end){u[e.key]=null;continue}}let s=g(e.key+":"+l);if(s%1e4/100>=e.traffic_percentage){u[e.key]=null;continue}let h=e.variants.reduce((c,b)=>c+b.weight,0),S=s%h,d=0,p=null;for(let c of e.variants)if(d+=c.weight,S<d){p=c.key;break}p||(p=e.variants[e.variants.length-1].key),u[e.key]=p}for(let e of t.flags){if(e.rules&&!m(e.rules,r,n)){f[e.key]=!1;continue}let s=g(e.key+":"+l)%100;f[e.key]=s<e.rollout_percentage}return{experiments:u,flags:f}}function m(t,l,r=[]){if(!t.groups||t.groups.length===0)return!0;let u=n=>{if(n.attribute==="$segment"){if(!Array.isArray(n.value))return!1;let a=n.value.map(String);return n.operator==="in"?a.some(e=>{let o=r.find(s=>s.id===e||s.key===e);return o?m(o.rules,l,r):!1}):n.operator==="not_in"?!a.some(e=>{let o=r.find(s=>s.id===e||s.key===e);return o?m(o.rules,l,r):!1}):!1}let i=l[n.attribute];if(i==null)return!1;switch(n.operator){case"is":return String(i)===String(n.value);case"is_not":return String(i)!==String(n.value);case"contains":return String(i).toLowerCase().includes(String(n.value).toLowerCase());case"not_contains":return!String(i).toLowerCase().includes(String(n.value).toLowerCase());case"gt":return Number(i)>Number(n.value);case"lt":return Number(i)<Number(n.value);case"gte":return Number(i)>=Number(n.value);case"lte":return Number(i)<=Number(n.value);case"in":return Array.isArray(n.value)&&n.value.map(String).includes(String(i));case"not_in":return Array.isArray(n.value)&&!n.value.map(String).includes(String(i));default:return!1}},f=n=>n.conditions.every(u);return t.match==="any"?t.groups.some(f):t.groups.every(f)}var C=[[/Edg(?:e|A|iOS)?\/(\S+)/,"Edge"],[/OPR\/(\S+)/,"Opera"],[/SamsungBrowser\/(\S+)/,"Samsung Internet"],[/UCBrowser\/(\S+)/,"UC Browser"],[/Firefox\/(\S+)/,"Firefox"],[/CriOS\/(\S+)/,"Chrome"],[/FxiOS\/(\S+)/,"Firefox"],[/Chrome\/(\S+)/,"Chrome"],[/Safari\/(\S+)/,"Safari"]],y=[[/Windows NT (\d+\.\d+)/,"Windows"],[/Mac OS X ([\d_]+)/,"macOS"],[/Android ([\d.]+)/,"Android"],[/iPhone OS ([\d_]+)/,"iOS"],[/iPad.*OS ([\d_]+)/,"iPadOS"],[/CrOS/,"ChromeOS"],[/Linux/,"Linux"]];function _(t){if(!t)return{browser:null,browser_version:null,os:null,os_version:null,device_type:null};let l=null,r=null,u=null,f=null;if(/Safari/.test(t)&&!/Chrome|CriOS|Chromium|Edg|OPR|SamsungBrowser|UCBrowser/.test(t)){let a=t.match(/Version\/(\S+)/);l="Safari",r=a?a[1]:null}else for(let[a,e]of C){let o=t.match(a);if(o){l=e,r=o[1]||null;break}}for(let[a,e]of y){let o=t.match(a);if(o){u=e,f=o[1]?.replace(/_/g,".")||null;break}}let i="desktop";return/Mobi|Android.*Mobile|iPhone/.test(t)?i="mobile":/iPad|Android(?!.*Mobile)|Tablet/.test(t)&&(i="tablet"),{browser:l,browser_version:r,os:u,os_version:f,device_type:i}}export{m as evaluateRules,v as hashToFloat,x as localEvaluate,g as murmurhash3,_ as parseUserAgent};
1
+ function g(t,l=0){let r=l>>>0,u=t.length,f=u>>2,n=3432918353,i=461845907;for(let o=0;o<f;o++){let s=t.charCodeAt(o*4)&255|(t.charCodeAt(o*4+1)&255)<<8|(t.charCodeAt(o*4+2)&255)<<16|(t.charCodeAt(o*4+3)&255)<<24;s=Math.imul(s,n),s=s<<15|s>>>17,s=Math.imul(s,i),r^=s,r=r<<13|r>>>19,r=Math.imul(r,5)+3864292196}let a=f*4,e=0;switch(u&3){case 3:e^=(t.charCodeAt(a+2)&255)<<16;case 2:e^=(t.charCodeAt(a+1)&255)<<8;case 1:e^=t.charCodeAt(a)&255,e=Math.imul(e,n),e=e<<15|e>>>17,e=Math.imul(e,i),r^=e}return r^=u,r^=r>>>16,r=Math.imul(r,2246822507),r^=r>>>13,r=Math.imul(r,3266489909),r^=r>>>16,r>>>0}function v(t,l){return g(t,l)/4294967295}function x(t,l,r={}){let u={},f={},n=t.segments||[],i=t.exclusion_groups||[],a=new Map;for(let e of i)for(let[o,s]of Object.entries(e.experiments))a.set(o,{layer_key:e.layer_key,...s});for(let e of t.experiments){if(e.targeting_rules&&!m(e.targeting_rules,r,n)){u[e.key]=null;continue}let o=a.get(e.key);if(o){let c=g(o.layer_key+":"+l)%1e4;if(c<o.bucket_start||c>=o.bucket_end){u[e.key]=null;continue}}let s=g(e.key+":"+l);if(s%1e4/100>=e.traffic_percentage){u[e.key]=null;continue}let h=e.variants.reduce((c,b)=>c+b.weight,0),S=s%h,d=0,p=null;for(let c of e.variants)if(d+=c.weight,S<d){p=c.key;break}p||(p=e.variants[e.variants.length-1].key),u[e.key]=p}for(let e of t.flags){if(e.rules&&!m(e.rules,r,n)){f[e.key]=!1;continue}let s=g(e.key+":"+l)%100;f[e.key]=s<e.rollout_percentage}return{experiments:u,flags:f}}function m(t,l,r=[]){if(!t.groups||t.groups.length===0)return!0;let u=n=>{if(!n.attribute)return!0;if(n.attribute==="$segment"){if(!Array.isArray(n.value))return!1;let a=n.value.map(String);return n.operator==="in"?a.some(e=>{let o=r.find(s=>s.id===e||s.key===e);return o?m(o.rules,l,r):!1}):n.operator==="not_in"?!a.some(e=>{let o=r.find(s=>s.id===e||s.key===e);return o?m(o.rules,l,r):!1}):!1}let i=l[n.attribute];if(i==null)return!1;switch(n.operator){case"is":return String(i)===String(n.value);case"is_not":return String(i)!==String(n.value);case"contains":return String(i).toLowerCase().includes(String(n.value).toLowerCase());case"not_contains":return!String(i).toLowerCase().includes(String(n.value).toLowerCase());case"gt":return Number(i)>Number(n.value);case"lt":return Number(i)<Number(n.value);case"gte":return Number(i)>=Number(n.value);case"lte":return Number(i)<=Number(n.value);case"in":return Array.isArray(n.value)&&n.value.map(String).includes(String(i));case"not_in":return Array.isArray(n.value)&&!n.value.map(String).includes(String(i));default:return!1}},f=n=>n.conditions.every(u);return t.match==="any"?t.groups.some(f):t.groups.every(f)}var C=[[/Edg(?:e|A|iOS)?\/(\S+)/,"Edge"],[/OPR\/(\S+)/,"Opera"],[/SamsungBrowser\/(\S+)/,"Samsung Internet"],[/UCBrowser\/(\S+)/,"UC Browser"],[/Firefox\/(\S+)/,"Firefox"],[/CriOS\/(\S+)/,"Chrome"],[/FxiOS\/(\S+)/,"Firefox"],[/Chrome\/(\S+)/,"Chrome"],[/Safari\/(\S+)/,"Safari"]],y=[[/Windows NT (\d+\.\d+)/,"Windows"],[/Mac OS X ([\d_]+)/,"macOS"],[/Android ([\d.]+)/,"Android"],[/iPhone OS ([\d_]+)/,"iOS"],[/iPad.*OS ([\d_]+)/,"iPadOS"],[/CrOS/,"ChromeOS"],[/Linux/,"Linux"]];function _(t){if(!t)return{browser:null,browser_version:null,os:null,os_version:null,device_type:null};let l=null,r=null,u=null,f=null;if(/Safari/.test(t)&&!/Chrome|CriOS|Chromium|Edg|OPR|SamsungBrowser|UCBrowser/.test(t)){let a=t.match(/Version\/(\S+)/);l="Safari",r=a?a[1]:null}else for(let[a,e]of C){let o=t.match(a);if(o){l=e,r=o[1]||null;break}}for(let[a,e]of y){let o=t.match(a);if(o){u=e,f=o[1]?.replace(/_/g,".")||null;break}}let i="desktop";return/Mobi|Android.*Mobile|iPhone/.test(t)?i="mobile":/iPad|Android(?!.*Mobile)|Tablet/.test(t)&&(i="tablet"),{browser:l,browser_version:r,os:u,os_version:f,device_type:i}}export{m as evaluateRules,v as hashToFloat,x as localEvaluate,g as murmurhash3,_ as parseUserAgent};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@splitlab/core",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "Shared evaluation engine for SplitLab SDKs — hashing, targeting, bucketing",
5
5
  "license": "MIT",
6
6
  "publishConfig": {