@obelism/improve-sdk 0.3.0 → 0.3.2
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/client.cjs +1 -1
- package/dist/client.d.ts +8 -4
- package/dist/client.mjs +1 -1
- package/dist/server.cjs +1 -1
- package/dist/server.d.ts +7 -5
- package/dist/server.mjs +1 -1
- package/dist/types.d.ts +1 -0
- package/package.json +1 -1
package/dist/client.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,"__esModule",{value:!0});var i=require("ua-parser-js"),t=i&&i.__esModule?i:{default:i};const e={device:["wearable","mobile","tablet","console","smarttv","embedded","desktop"],browser:["chrome","safari","firefox","edge","ie","samsung internet","social","other"],os:["mac os","ios","android","windows","unix"]},s=i=>i&&e.device.includes(i)?i:"desktop",r=["tiktok","wechat","weibo","snapchat","klarna","Line","instagram","facebook","alipay","Baidu"],o=(i="")=>{if(!i)return"other";let t=i.toLowerCase();return e.browser.find(i=>t.includes(i))||(r.includes(t)?"social":"other")},n=["wearable","mobile","tablet"],l=i=>n.includes(i)?"coarse":"fine",a=(i="")=>{if(!i)return"unix";let t=i.toLowerCase();return e.os.find(i=>t.includes(i))||"unix"},h=i=>{if(!i||"string"!=typeof i)return null;let e=new t.default(i).getResult(),r=s(e.device.type);return{pointer:l(r),device:r,browser:o(e.browser.name),os:a(e.os.name)}},u=(i,t)=>!i||Object.entries(i).every(([i,e])=>t[i]===e),c=i=>{if(0===i.length)return null;if(1===i.length)return i[0].slug;let t=Math.random()*i.reduce((i,{split:t})=>i+t,0);return(i.find(({split:i})=>(t-=i)<=0)||i[0]).slug},f="visi",d="https://improve.obelism.studio",g
|
|
1
|
+
Object.defineProperty(exports,"__esModule",{value:!0});var i=require("ua-parser-js"),t=i&&i.__esModule?i:{default:i};const e={device:["wearable","mobile","tablet","console","smarttv","embedded","desktop"],browser:["chrome","safari","firefox","edge","ie","samsung internet","social","other"],os:["mac os","ios","android","windows","unix"]},s=i=>i&&e.device.includes(i)?i:"desktop",r=["tiktok","wechat","weibo","snapchat","klarna","Line","instagram","facebook","alipay","Baidu"],o=(i="")=>{if(!i)return"other";let t=i.toLowerCase();return e.browser.find(i=>t.includes(i))||(r.includes(t)?"social":"other")},n=["wearable","mobile","tablet"],l=i=>n.includes(i)?"coarse":"fine",a=(i="")=>{if(!i)return"unix";let t=i.toLowerCase();return e.os.find(i=>t.includes(i))||"unix"},h=i=>{if(!i||"string"!=typeof i)return null;let e=new t.default(i).getResult(),r=s(e.device.type);return{pointer:l(r),device:r,browser:o(e.browser.name),os:a(e.os.name)}},u=(i,t)=>!i||Object.entries(i).every(([i,e])=>t[i]===e),c=i=>{if(0===i.length)return null;if(1===i.length)return i[0].slug;let t=Math.random()*i.reduce((i,{split:t})=>i+t,0);return(i.find(({split:i})=>(t-=i)<=0)||i[0]).slug},f="visi",d="https://improve.obelism.studio",g="/api/log",v="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",p=i=>new Promise(t=>setTimeout(t,i)),m=async(i=1e3,t)=>(await p(i),t?.abort(),null),w=(i=3e3,t,e)=>{let s=new AbortController;return Promise.race([fetch(t,{...e,signal:s.signal}),m(i,s)])};class b{#i;constructor({organizationId:i,environment:t,state:e,config:s,fetchTimeout:r,baseUrl:o}){this.environment="develop",this.#i=null,this.config=null,this._fetchConfig=async i=>{if(this.config)return;if(!this.#i)throw Error("No config fetch setup provided");let t=await w(this.#i.timeout,this.#i.url,i);if(!t||!t.ok)throw Error("Configuration fetch timed-out");return this.config=await t.json(),this.config},this.loadConfig=i=>{this.config=i},this.generateVisitorId=()=>[f,(function(i=5){return i&&"number"==typeof i?Array(i).fill("").reduce(i=>i+=v.charAt(Math.floor(Math.random()*v.length)),""):""})(26).toUpperCase()].join("_"),this.getVisitorCookieName=()=>"visitorId",this.validateTestValue=(i,t)=>{if(!this.config)throw Error("Config is required before validating, either use `.fetchConfig()`, .loadConfig(config) or provide it during setup");let e=this.config.tests[i];if(!e)throw Error(`No config found for ${i}`);return!!e.options.find(i=>i.slug===t)},this.validateVisitorId=i=>{let t=i.split("_");if(2!==t.length)return!1;let[e,s]=t;return e===f&&26===s.length},this.organizationId=i,this.environment=t,this.state=e,this._baseUrl=o||d,s?this.config=s:this.#i={url:[`${this._baseUrl}/config`,this.organizationId,this.environment,this.state||"active"].join("/"),timeout:r||3e3}}}const y=i=>{if(!i)return!1;let t=document.cookie.split("; ").find(t=>{let[e]=t.split("=");return i===e});return!!t&&t.split("=")[1]},I=(i,t)=>{let e=new Date;e.setMonth(e.getMonth()+1),document.cookie=`${i}=${t};path=/;expires=${e.toUTCString()}`},V=()=>{let i=window.innerWidth;return i<=768?"small":i<=1024?"medium":i<=1200?"large":"huge"};exports.ImproveClientSDK=class extends b{#t;#e;#s;#r;#o;constructor(i){super(i),this.#e=!1,this.#s="",this.#r={},this.#o=`${d}${g}`,this.fetchConfig=this._fetchConfig,this.setupVisitor=(i=window.navigator.userAgent)=>{let t=y(this.getVisitorCookieName()),e=t&&this.validateVisitorId(t);this.#e=e,this.#s=e?t:this.generateVisitorId();let s=h(i);return s?(this.#t=s,I(this.getVisitorCookieName(),this.#s),this.#s):null},this.getFlagValue=i=>{if(!this.config)return null;let t=this.config.flags[i];if(!t||!t.options[0])return null;if(this.#t||this.setupVisitor(),!this.#s||!this.#t)return t.options[0].slug;if(this.#t?.[i])return this.#t[i];if(!u(this.config.audience[t.audience],this.#t))return t.options[0].slug;let e=y(i)||c(t.options);return e?(this.#t[i]=e,I(i,e),e):null},this.getTestValue=i=>{if(!this.config)return null;let t=this.config.tests[i];if(!t)return null;if(this.#t||this.setupVisitor(),!this.#s||!this.#t)return t.defaultValue;if(this.#t?.[i])return this.#t[i];if(!u(this.config.audience[t.audience],this.#t))return t.defaultValue;if(t.allocation<100&&100*Math.random()>t.allocation)return this.#t[i]=t.defaultValue,this.#t?.[i];let e=y(i),s=e&&this.validateTestValue(i,e)?e:c(t.options);return s?(this.#t[i]=s,I(i,s),s):null},this.setAnalyticsUrls=i=>{this.#o=i},this.postAnalytic=(i,t,e)=>{if(!this.config)return null;let s=this.config.tests[i];if(this.#t||this.setupVisitor(),!s||!this.#t||this.#r?.[i]?.[t])return null;let r=this.#r[i]||{};r[t]=!0,this.#r[i]=r;let o=this.#t?.[i]||null;if(o||(o=this.getTestValue(i)||null),!o)return;let n={organizationId:this.organizationId,environment:this.environment,testId:s.id,testValue:o,visitorId:this.#s,pointer:this.#t.pointer,device:this.#t.device,screen:V(),browser:this.#t.browser,os:this.#t.os,visitor:this.#e?"recurring":"new",event:t,message:e||""};return fetch(this.#o,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)})},this.#o=`${this._baseUrl}${g}`}};
|
package/dist/client.d.ts
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
|
-
import
|
|
1
|
+
import * as __types from './types.js';
|
|
2
|
+
import { ImproveEnvironmentOption, ImproveTestState, ImproveConfiguration, ImproveSetupArgs } from './types.js';
|
|
2
3
|
|
|
3
4
|
declare class BaseImproveSDK {
|
|
4
5
|
#private;
|
|
5
6
|
organizationId: string;
|
|
6
7
|
environment: ImproveEnvironmentOption;
|
|
8
|
+
state: ImproveTestState;
|
|
7
9
|
config: ImproveConfiguration | null;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
+
_baseUrl: undefined | string;
|
|
11
|
+
constructor({ organizationId, environment, state, config, fetchTimeout, baseUrl, }: ImproveSetupArgs);
|
|
12
|
+
_fetchConfig: (config?: RequestInit) => Promise<ImproveConfiguration>;
|
|
10
13
|
loadConfig: (config: ImproveConfiguration) => void;
|
|
11
14
|
generateVisitorId: () => string;
|
|
12
15
|
getVisitorCookieName: () => string;
|
|
@@ -31,7 +34,8 @@ type CreateAnalytic = {
|
|
|
31
34
|
};
|
|
32
35
|
declare class ImproveClientSDK extends BaseImproveSDK {
|
|
33
36
|
#private;
|
|
34
|
-
fetchConfig: (config?: RequestInit) => Promise<
|
|
37
|
+
fetchConfig: (config?: RequestInit) => Promise<__types.ImproveConfiguration>;
|
|
38
|
+
constructor(args: ImproveSetupArgs);
|
|
35
39
|
setupVisitor: (userAgent?: string) => string;
|
|
36
40
|
getFlagValue: (flagSlug: string) => string;
|
|
37
41
|
getTestValue: (testSlug: string) => string;
|
package/dist/client.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import i from"ua-parser-js";let t={device:["wearable","mobile","tablet","console","smarttv","embedded","desktop"],browser:["chrome","safari","firefox","edge","ie","samsung internet","social","other"],os:["mac os","ios","android","windows","unix"]},e=i=>i&&t.device.includes(i)?i:"desktop",s=["tiktok","wechat","weibo","snapchat","klarna","Line","instagram","facebook","alipay","Baidu"],r=(i="")=>{if(!i)return"other";let e=i.toLowerCase();return t.browser.find(i=>e.includes(i))||(s.includes(e)?"social":"other")},o=["wearable","mobile","tablet"],n=i=>o.includes(i)?"coarse":"fine",l=(i="")=>{if(!i)return"unix";let e=i.toLowerCase();return t.os.find(i=>e.includes(i))||"unix"},a=t=>{if(!t||"string"!=typeof t)return null;let s=new i(t).getResult(),o=e(s.device.type);return{pointer:n(o),device:o,browser:r(s.browser.name),os:l(s.os.name)}},h=(i,t)=>!i||Object.entries(i).every(([i,e])=>t[i]===e),u=i=>{if(0===i.length)return null;if(1===i.length)return i[0].slug;let t=Math.random()*i.reduce((i,{split:t})=>i+t,0);return(i.find(({split:i})=>(t-=i)<=0)||i[0]).slug},c="visi",f="https://improve.obelism.studio",d
|
|
1
|
+
import i from"ua-parser-js";let t={device:["wearable","mobile","tablet","console","smarttv","embedded","desktop"],browser:["chrome","safari","firefox","edge","ie","samsung internet","social","other"],os:["mac os","ios","android","windows","unix"]},e=i=>i&&t.device.includes(i)?i:"desktop",s=["tiktok","wechat","weibo","snapchat","klarna","Line","instagram","facebook","alipay","Baidu"],r=(i="")=>{if(!i)return"other";let e=i.toLowerCase();return t.browser.find(i=>e.includes(i))||(s.includes(e)?"social":"other")},o=["wearable","mobile","tablet"],n=i=>o.includes(i)?"coarse":"fine",l=(i="")=>{if(!i)return"unix";let e=i.toLowerCase();return t.os.find(i=>e.includes(i))||"unix"},a=t=>{if(!t||"string"!=typeof t)return null;let s=new i(t).getResult(),o=e(s.device.type);return{pointer:n(o),device:o,browser:r(s.browser.name),os:l(s.os.name)}},h=(i,t)=>!i||Object.entries(i).every(([i,e])=>t[i]===e),u=i=>{if(0===i.length)return null;if(1===i.length)return i[0].slug;let t=Math.random()*i.reduce((i,{split:t})=>i+t,0);return(i.find(({split:i})=>(t-=i)<=0)||i[0]).slug},c="visi",f="https://improve.obelism.studio",d="/api/log",g="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",v=i=>new Promise(t=>setTimeout(t,i)),p=async(i=1e3,t)=>(await v(i),t?.abort(),null),m=(i=3e3,t,e)=>{let s=new AbortController;return Promise.race([fetch(t,{...e,signal:s.signal}),p(i,s)])};class w{#i;constructor({organizationId:i,environment:t,state:e,config:s,fetchTimeout:r,baseUrl:o}){this.environment="develop",this.#i=null,this.config=null,this._fetchConfig=async i=>{if(this.config)return;if(!this.#i)throw Error("No config fetch setup provided");let t=await m(this.#i.timeout,this.#i.url,i);if(!t||!t.ok)throw Error("Configuration fetch timed-out");return this.config=await t.json(),this.config},this.loadConfig=i=>{this.config=i},this.generateVisitorId=()=>[c,(function(i=5){return i&&"number"==typeof i?Array(i).fill("").reduce(i=>i+=g.charAt(Math.floor(Math.random()*g.length)),""):""})(26).toUpperCase()].join("_"),this.getVisitorCookieName=()=>"visitorId",this.validateTestValue=(i,t)=>{if(!this.config)throw Error("Config is required before validating, either use `.fetchConfig()`, .loadConfig(config) or provide it during setup");let e=this.config.tests[i];if(!e)throw Error(`No config found for ${i}`);return!!e.options.find(i=>i.slug===t)},this.validateVisitorId=i=>{let t=i.split("_");if(2!==t.length)return!1;let[e,s]=t;return e===c&&26===s.length},this.organizationId=i,this.environment=t,this.state=e,this._baseUrl=o||f,s?this.config=s:this.#i={url:[`${this._baseUrl}/config`,this.organizationId,this.environment,this.state||"active"].join("/"),timeout:r||3e3}}}let b=i=>{if(!i)return!1;let t=document.cookie.split("; ").find(t=>{let[e]=t.split("=");return i===e});return!!t&&t.split("=")[1]},y=(i,t)=>{let e=new Date;e.setMonth(e.getMonth()+1),document.cookie=`${i}=${t};path=/;expires=${e.toUTCString()}`},I=()=>{let i=window.innerWidth;return i<=768?"small":i<=1024?"medium":i<=1200?"large":"huge"};class V extends w{#t;#e;#s;#r;#o;constructor(i){super(i),this.#e=!1,this.#s="",this.#r={},this.#o=`${f}${d}`,this.fetchConfig=this._fetchConfig,this.setupVisitor=(i=window.navigator.userAgent)=>{let t=b(this.getVisitorCookieName()),e=t&&this.validateVisitorId(t);this.#e=e,this.#s=e?t:this.generateVisitorId();let s=a(i);return s?(this.#t=s,y(this.getVisitorCookieName(),this.#s),this.#s):null},this.getFlagValue=i=>{if(!this.config)return null;let t=this.config.flags[i];if(!t||!t.options[0])return null;if(this.#t||this.setupVisitor(),!this.#s||!this.#t)return t.options[0].slug;if(this.#t?.[i])return this.#t[i];if(!h(this.config.audience[t.audience],this.#t))return t.options[0].slug;let e=b(i)||u(t.options);return e?(this.#t[i]=e,y(i,e),e):null},this.getTestValue=i=>{if(!this.config)return null;let t=this.config.tests[i];if(!t)return null;if(this.#t||this.setupVisitor(),!this.#s||!this.#t)return t.defaultValue;if(this.#t?.[i])return this.#t[i];if(!h(this.config.audience[t.audience],this.#t))return t.defaultValue;if(t.allocation<100&&100*Math.random()>t.allocation)return this.#t[i]=t.defaultValue,this.#t?.[i];let e=b(i),s=e&&this.validateTestValue(i,e)?e:u(t.options);return s?(this.#t[i]=s,y(i,s),s):null},this.setAnalyticsUrls=i=>{this.#o=i},this.postAnalytic=(i,t,e)=>{if(!this.config)return null;let s=this.config.tests[i];if(this.#t||this.setupVisitor(),!s||!this.#t||this.#r?.[i]?.[t])return null;let r=this.#r[i]||{};r[t]=!0,this.#r[i]=r;let o=this.#t?.[i]||null;if(o||(o=this.getTestValue(i)||null),!o)return;let n={organizationId:this.organizationId,environment:this.environment,testId:s.id,testValue:o,visitorId:this.#s,pointer:this.#t.pointer,device:this.#t.device,screen:I(),browser:this.#t.browser,os:this.#t.os,visitor:this.#e?"recurring":"new",event:t,message:e||""};return fetch(this.#o,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(n)})},this.#o=`${this._baseUrl}${d}`}}export{V as ImproveClientSDK};
|
package/dist/server.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,"__esModule",{value:!0});var
|
|
1
|
+
Object.defineProperty(exports,"__esModule",{value:!0});var t=require("ua-parser-js"),i=t&&t.__esModule?t:{default:t};const e={device:["wearable","mobile","tablet","console","smarttv","embedded","desktop"],browser:["chrome","safari","firefox","edge","ie","samsung internet","social","other"],os:["mac os","ios","android","windows","unix"]},s=t=>t&&e.device.includes(t)?t:"desktop",r=["tiktok","wechat","weibo","snapchat","klarna","Line","instagram","facebook","alipay","Baidu"],o=(t="")=>{if(!t)return"other";let i=t.toLowerCase();return e.browser.find(t=>i.includes(t))||(r.includes(i)?"social":"other")},n=["wearable","mobile","tablet"],a=t=>n.includes(t)?"coarse":"fine",l=(t="")=>{if(!t)return"unix";let i=t.toLowerCase();return e.os.find(t=>i.includes(t))||"unix"},h=t=>{if(!t||"string"!=typeof t)return null;let e=new i.default(t).getResult(),r=s(e.device.type);return{pointer:a(r),device:r,browser:o(e.browser.name),os:l(e.os.name)}},u=(t,i)=>!t||Object.entries(t).every(([t,e])=>i[t]===e),f=t=>{if(0===t.length)return null;if(1===t.length)return t[0].slug;let i=Math.random()*t.reduce((t,{split:i})=>t+i,0);return(t.find(({split:t})=>(i-=t)<=0)||t[0]).slug},c="visi",g="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",d=t=>new Promise(i=>setTimeout(i,t)),v=async(t=1e3,i)=>(await d(t),i?.abort(),null),p=(t=3e3,i,e)=>{let s=new AbortController;return Promise.race([fetch(i,{...e,signal:s.signal}),v(t,s)])};class m{#t;constructor({organizationId:t,environment:i,state:e,config:s,fetchTimeout:r,baseUrl:o}){this.environment="develop",this.#t=null,this.config=null,this._fetchConfig=async t=>{if(this.config)return;if(!this.#t)throw Error("No config fetch setup provided");let i=await p(this.#t.timeout,this.#t.url,t);if(!i||!i.ok)throw Error("Configuration fetch timed-out");return this.config=await i.json(),this.config},this.loadConfig=t=>{this.config=t},this.generateVisitorId=()=>[c,(function(t=5){return t&&"number"==typeof t?Array(t).fill("").reduce(t=>t+=g.charAt(Math.floor(Math.random()*g.length)),""):""})(26).toUpperCase()].join("_"),this.getVisitorCookieName=()=>"visitorId",this.validateTestValue=(t,i)=>{if(!this.config)throw Error("Config is required before validating, either use `.fetchConfig()`, .loadConfig(config) or provide it during setup");let e=this.config.tests[t];if(!e)throw Error(`No config found for ${t}`);return!!e.options.find(t=>t.slug===i)},this.validateVisitorId=t=>{let i=t.split("_");if(2!==i.length)return!1;let[e,s]=i;return e===c&&26===s.length},this.organizationId=t,this.environment=i,this.state=e,this._baseUrl=o||"https://improve.obelism.studio",s?this.config=s:this.#t={url:[`${this._baseUrl}/config`,this.organizationId,this.environment,this.state||"active"].join("/"),timeout:r||3e3}}}exports.ImproveServerSDK=class extends m{#i;#e;constructor({token:t,...i}){super(i),this.#i={},this.fetchConfig=async t=>this._fetchConfig({...t,headers:{...t?.headers,token:this.#e}}),this.getFlagConfig=t=>this.config?.flags?.[t],this.getTestConfig=t=>this.config?.tests?.[t],this.getFlagValue=(t,i,e)=>{let s=this.getFlagConfig(t);if(!s||!this.config)return null;if(!i)return s.options[0].slug;if(this.#i?.[i]?.[e]?.[t])return this.#i[i][e][t];if(this.#i[i]=this.#i[i]||{},this.#i[i][e]=this.#i[i][e]||h(e),!u(this.config.audience[s.audience],this.#i[i][e]))return s.options[0].slug;let r=f(s.options);return r?(this.#i[i][e][t]=r,r):null},this.getTestValue=(t,i,e)=>{let s=this.getTestConfig(t);if(!s||!this.config)return null;if(!i||!e)return s.defaultValue;if(this.#i?.[i]?.[e]?.[t])return this.#i[i][e][t];if(this.#i[i]=this.#i[i]||{},this.#i[i][e]=this.#i[i][e]||h(e),!u(this.config.audience[s.audience],this.#i[i][e]))return s.defaultValue;if(s.allocation<100&&100*Math.random()>s.allocation)return this.#i[i][e][t]=s.defaultValue,this.#i[i][e][t];let r=f(s.options);return r?(this.#i[i][e][t]=r,r):null},this.#e=t}};
|
package/dist/server.d.ts
CHANGED
|
@@ -1,13 +1,15 @@
|
|
|
1
1
|
import * as __types from './types.js';
|
|
2
|
-
import { ImproveEnvironmentOption, ImproveConfiguration, ImproveSetupArgs } from './types.js';
|
|
2
|
+
import { ImproveEnvironmentOption, ImproveTestState, ImproveConfiguration, ImproveSetupArgs } from './types.js';
|
|
3
3
|
|
|
4
4
|
declare class BaseImproveSDK {
|
|
5
5
|
#private;
|
|
6
6
|
organizationId: string;
|
|
7
7
|
environment: ImproveEnvironmentOption;
|
|
8
|
+
state: ImproveTestState;
|
|
8
9
|
config: ImproveConfiguration | null;
|
|
9
|
-
|
|
10
|
-
|
|
10
|
+
_baseUrl: undefined | string;
|
|
11
|
+
constructor({ organizationId, environment, state, config, fetchTimeout, baseUrl, }: ImproveSetupArgs);
|
|
12
|
+
_fetchConfig: (config?: RequestInit) => Promise<ImproveConfiguration>;
|
|
11
13
|
loadConfig: (config: ImproveConfiguration) => void;
|
|
12
14
|
generateVisitorId: () => string;
|
|
13
15
|
getVisitorCookieName: () => string;
|
|
@@ -15,7 +17,7 @@ declare class BaseImproveSDK {
|
|
|
15
17
|
validateVisitorId: (possibleVisitorId: string) => boolean;
|
|
16
18
|
}
|
|
17
19
|
|
|
18
|
-
type ImproveServerSetupArgs = (Omit<ImproveSetupArgs, 'config'> & {
|
|
20
|
+
type ImproveServerSetupArgs = (Omit<ImproveSetupArgs, 'config' | 'baseUrl'> & {
|
|
19
21
|
config: ImproveConfiguration;
|
|
20
22
|
}) | (Omit<ImproveSetupArgs, 'config'> & {
|
|
21
23
|
token: string;
|
|
@@ -23,7 +25,7 @@ type ImproveServerSetupArgs = (Omit<ImproveSetupArgs, 'config'> & {
|
|
|
23
25
|
declare class ImproveServerSDK extends BaseImproveSDK {
|
|
24
26
|
#private;
|
|
25
27
|
constructor({ token, ...args }: ImproveServerSetupArgs);
|
|
26
|
-
fetchConfig: (config?: RequestInit) => Promise<
|
|
28
|
+
fetchConfig: (config?: RequestInit) => Promise<ImproveConfiguration>;
|
|
27
29
|
getFlagConfig: (flagSlug: string) => __types.ImproveFlag;
|
|
28
30
|
getTestConfig: (testSlug: string) => __types.ImproveTest;
|
|
29
31
|
getFlagValue: (flagSlug: string, visitorId: string, userAgent: string) => string;
|
package/dist/server.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
1
|
+
import t from"ua-parser-js";let i={device:["wearable","mobile","tablet","console","smarttv","embedded","desktop"],browser:["chrome","safari","firefox","edge","ie","samsung internet","social","other"],os:["mac os","ios","android","windows","unix"]},e=t=>t&&i.device.includes(t)?t:"desktop",s=["tiktok","wechat","weibo","snapchat","klarna","Line","instagram","facebook","alipay","Baidu"],o=(t="")=>{if(!t)return"other";let e=t.toLowerCase();return i.browser.find(t=>e.includes(t))||(s.includes(e)?"social":"other")},r=["wearable","mobile","tablet"],n=t=>r.includes(t)?"coarse":"fine",a=(t="")=>{if(!t)return"unix";let e=t.toLowerCase();return i.os.find(t=>e.includes(t))||"unix"},h=i=>{if(!i||"string"!=typeof i)return null;let s=new t(i).getResult(),r=e(s.device.type);return{pointer:n(r),device:r,browser:o(s.browser.name),os:a(s.os.name)}},l=(t,i)=>!t||Object.entries(t).every(([t,e])=>i[t]===e),u=t=>{if(0===t.length)return null;if(1===t.length)return t[0].slug;let i=Math.random()*t.reduce((t,{split:i})=>t+i,0);return(t.find(({split:t})=>(i-=t)<=0)||t[0]).slug},f="visi",c="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",g=t=>new Promise(i=>setTimeout(i,t)),d=async(t=1e3,i)=>(await g(t),i?.abort(),null),v=(t=3e3,i,e)=>{let s=new AbortController;return Promise.race([fetch(i,{...e,signal:s.signal}),d(t,s)])};class m{#t;constructor({organizationId:t,environment:i,state:e,config:s,fetchTimeout:o,baseUrl:r}){this.environment="develop",this.#t=null,this.config=null,this._fetchConfig=async t=>{if(this.config)return;if(!this.#t)throw Error("No config fetch setup provided");let i=await v(this.#t.timeout,this.#t.url,t);if(!i||!i.ok)throw Error("Configuration fetch timed-out");return this.config=await i.json(),this.config},this.loadConfig=t=>{this.config=t},this.generateVisitorId=()=>[f,(function(t=5){return t&&"number"==typeof t?Array(t).fill("").reduce(t=>t+=c.charAt(Math.floor(Math.random()*c.length)),""):""})(26).toUpperCase()].join("_"),this.getVisitorCookieName=()=>"visitorId",this.validateTestValue=(t,i)=>{if(!this.config)throw Error("Config is required before validating, either use `.fetchConfig()`, .loadConfig(config) or provide it during setup");let e=this.config.tests[t];if(!e)throw Error(`No config found for ${t}`);return!!e.options.find(t=>t.slug===i)},this.validateVisitorId=t=>{let i=t.split("_");if(2!==i.length)return!1;let[e,s]=i;return e===f&&26===s.length},this.organizationId=t,this.environment=i,this.state=e,this._baseUrl=r||"https://improve.obelism.studio",s?this.config=s:this.#t={url:[`${this._baseUrl}/config`,this.organizationId,this.environment,this.state||"active"].join("/"),timeout:o||3e3}}}class p extends m{#i;#e;constructor({token:t,...i}){super(i),this.#i={},this.fetchConfig=async t=>this._fetchConfig({...t,headers:{...t?.headers,token:this.#e}}),this.getFlagConfig=t=>this.config?.flags?.[t],this.getTestConfig=t=>this.config?.tests?.[t],this.getFlagValue=(t,i,e)=>{let s=this.getFlagConfig(t);if(!s||!this.config)return null;if(!i)return s.options[0].slug;if(this.#i?.[i]?.[e]?.[t])return this.#i[i][e][t];if(this.#i[i]=this.#i[i]||{},this.#i[i][e]=this.#i[i][e]||h(e),!l(this.config.audience[s.audience],this.#i[i][e]))return s.options[0].slug;let o=u(s.options);return o?(this.#i[i][e][t]=o,o):null},this.getTestValue=(t,i,e)=>{let s=this.getTestConfig(t);if(!s||!this.config)return null;if(!i||!e)return s.defaultValue;if(this.#i?.[i]?.[e]?.[t])return this.#i[i][e][t];if(this.#i[i]=this.#i[i]||{},this.#i[i][e]=this.#i[i][e]||h(e),!l(this.config.audience[s.audience],this.#i[i][e]))return s.defaultValue;if(s.allocation<100&&100*Math.random()>s.allocation)return this.#i[i][e][t]=s.defaultValue,this.#i[i][e][t];let o=u(s.options);return o?(this.#i[i][e][t]=o,o):null},this.#e=t}}export{p as ImproveServerSDK};
|
package/dist/types.d.ts
CHANGED