@obelism/improve-sdk 0.0.2 → 0.0.4
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.cts +7 -5
- package/dist/client.d.ts +7 -5
- package/dist/client.js +1 -1
- package/dist/index.d.ts +27 -26
- package/dist/server.cjs +1 -1
- package/dist/server.d.cts +8 -6
- package/dist/server.d.ts +8 -6
- package/dist/server.js +1 -1
- package/dist/types.d.ts +27 -26
- package/package.json +1 -1
package/dist/client.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,"__esModule",{value:!0});var
|
|
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="https://improve.obelism.studio",d=`${f}/config`,g=`${f}/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}){this.organizationId="",this.environment="develop",this.#i=null,this.config=null,this.fetchConfig=async()=>{if(this.config)return;if(!this.#i)throw Error("No config fetch setup provided");let i=await w(this.#i.timeout,this.#i.url);if(!i)throw Error("Configuration fetch timed-out");this.config=await i.json()},this.loadConfig=i=>{this.config=i},this.generateVisitorId=()=>`visi_${(function(i=5){return i&&"number"==typeof i?Array(i).fill("").reduce(i=>i+=v.charAt(Math.floor(Math.random()*v.length)),""):""})(26).toUpperCase()}`,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.organizationId=i,this.environment=t,s?this.config=s:this.#i={url:[d,i,t,e||"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=g,this.setupVisitor=(i=window.navigator.userAgent)=>{let t=y(this.getVisitorCookieName());this.#e=!!t,this.#s=t||this.generateVisitorId();let e=h(i);return e?(this.#t=e,I(this.getVisitorCookieName(),this.#s),this.#s):null},this.getFlagValue=i=>{if(!this.config)return null;let t=this.config.flags[i];if(!t)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)||c(t.options);return e?(this.#t[i]=e,I(i,e),e):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;this.#r[i]=this.#r[i]||{},this.#r[i][t]=!0,this.#t?.[i]||this.getTestValue(i);let r={organizationId:this.organizationId,environment:this.environment,testId:s.id,testValue:this.#t[i],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(r)})}}};
|
package/dist/client.d.cts
CHANGED
|
@@ -1,19 +1,21 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ImproveEnvironmentOption, ImproveConfiguration, ImproveSetupArgs } from './types.ts';
|
|
2
2
|
|
|
3
3
|
declare class BaseImproveSDK {
|
|
4
4
|
#private;
|
|
5
5
|
organizationId: string;
|
|
6
|
-
environment:
|
|
7
|
-
config:
|
|
8
|
-
constructor({ organizationId, environment, config, fetchTimeout, }:
|
|
6
|
+
environment: ImproveEnvironmentOption;
|
|
7
|
+
config: ImproveConfiguration | null;
|
|
8
|
+
constructor({ organizationId, environment, state, config, fetchTimeout, }: ImproveSetupArgs);
|
|
9
9
|
fetchConfig: () => Promise<void>;
|
|
10
|
+
loadConfig: (config: ImproveConfiguration) => void;
|
|
10
11
|
generateVisitorId: () => string;
|
|
11
12
|
getVisitorCookieName: () => string;
|
|
13
|
+
validateTestValue: (testName: string, testValue: string) => boolean;
|
|
12
14
|
}
|
|
13
15
|
|
|
14
16
|
type CreateAnalytic = {
|
|
15
17
|
organizationId: string;
|
|
16
|
-
environment:
|
|
18
|
+
environment: ImproveEnvironmentOption;
|
|
17
19
|
testId: string;
|
|
18
20
|
testValue: string;
|
|
19
21
|
visitorId: string;
|
package/dist/client.d.ts
CHANGED
|
@@ -1,19 +1,21 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ImproveEnvironmentOption, ImproveConfiguration, ImproveSetupArgs } from './types.ts';
|
|
2
2
|
|
|
3
3
|
declare class BaseImproveSDK {
|
|
4
4
|
#private;
|
|
5
5
|
organizationId: string;
|
|
6
|
-
environment:
|
|
7
|
-
config:
|
|
8
|
-
constructor({ organizationId, environment, config, fetchTimeout, }:
|
|
6
|
+
environment: ImproveEnvironmentOption;
|
|
7
|
+
config: ImproveConfiguration | null;
|
|
8
|
+
constructor({ organizationId, environment, state, config, fetchTimeout, }: ImproveSetupArgs);
|
|
9
9
|
fetchConfig: () => Promise<void>;
|
|
10
|
+
loadConfig: (config: ImproveConfiguration) => void;
|
|
10
11
|
generateVisitorId: () => string;
|
|
11
12
|
getVisitorCookieName: () => string;
|
|
13
|
+
validateTestValue: (testName: string, testValue: string) => boolean;
|
|
12
14
|
}
|
|
13
15
|
|
|
14
16
|
type CreateAnalytic = {
|
|
15
17
|
organizationId: string;
|
|
16
|
-
environment:
|
|
18
|
+
environment: ImproveEnvironmentOption;
|
|
17
19
|
testId: string;
|
|
18
20
|
testValue: string;
|
|
19
21
|
visitorId: string;
|
package/dist/client.js
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.
|
|
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="https://improve.obelism.studio",f=`${c}/config`,d=`${c}/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}){this.organizationId="",this.environment="develop",this.#i=null,this.config=null,this.fetchConfig=async()=>{if(this.config)return;if(!this.#i)throw Error("No config fetch setup provided");let i=await m(this.#i.timeout,this.#i.url);if(!i)throw Error("Configuration fetch timed-out");this.config=await i.json()},this.loadConfig=i=>{this.config=i},this.generateVisitorId=()=>`visi_${(function(i=5){return i&&"number"==typeof i?Array(i).fill("").reduce(i=>i+=g.charAt(Math.floor(Math.random()*g.length)),""):""})(26).toUpperCase()}`,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.organizationId=i,this.environment=t,s?this.config=s:this.#i={url:[f,i,t,e||"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=d,this.setupVisitor=(i=window.navigator.userAgent)=>{let t=b(this.getVisitorCookieName());this.#e=!!t,this.#s=t||this.generateVisitorId();let e=a(i);return e?(this.#t=e,y(this.getVisitorCookieName(),this.#s),this.#s):null},this.getFlagValue=i=>{if(!this.config)return null;let t=this.config.flags[i];if(!t)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)||u(t.options);return e?(this.#t[i]=e,y(i,e),e):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;this.#r[i]=this.#r[i]||{},this.#r[i][t]=!0,this.#t?.[i]||this.getTestValue(i);let r={organizationId:this.organizationId,environment:this.environment,testId:s.id,testValue:this.#t[i],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(r)})}}}export{V as ImproveClientSDK};
|
package/dist/index.d.ts
CHANGED
|
@@ -10,41 +10,42 @@ declare const AUDIENCE_PARAMS: {
|
|
|
10
10
|
};
|
|
11
11
|
type AudienceParamKey = keyof typeof AUDIENCE_PARAMS;
|
|
12
12
|
|
|
13
|
-
type
|
|
14
|
-
type
|
|
13
|
+
type ImproveEnvironmentOption = 'develop' | 'staging' | 'production';
|
|
14
|
+
type ImproveTestState = 'draft' | 'active' | 'finished' | 'archived';
|
|
15
|
+
type ImproveSetupArgs = {
|
|
15
16
|
organizationId: string;
|
|
16
|
-
environment:
|
|
17
|
-
|
|
17
|
+
environment: ImproveEnvironmentOption;
|
|
18
|
+
state?: ImproveTestState;
|
|
19
|
+
config?: ImproveConfiguration;
|
|
18
20
|
fetchTimeout?: number;
|
|
19
21
|
};
|
|
20
|
-
type
|
|
21
|
-
type FlagOption = {
|
|
22
|
+
type ImproveFlagOption = {
|
|
22
23
|
name: string;
|
|
23
24
|
slug: string;
|
|
24
25
|
value: string | undefined;
|
|
25
26
|
split: number;
|
|
26
27
|
};
|
|
27
|
-
type
|
|
28
|
+
type ImproveTestOption = {
|
|
28
29
|
name: string;
|
|
29
30
|
slug: string;
|
|
30
31
|
value: string | undefined;
|
|
31
32
|
split: number;
|
|
32
33
|
};
|
|
33
|
-
type
|
|
34
|
+
type ImproveFlag = {
|
|
34
35
|
id: string;
|
|
35
36
|
name: string;
|
|
36
37
|
audience: string;
|
|
37
|
-
options:
|
|
38
|
+
options: ImproveFlagOption[];
|
|
38
39
|
};
|
|
39
|
-
type
|
|
40
|
-
[flagSlug in string]:
|
|
40
|
+
type ImproveFlags = {
|
|
41
|
+
[flagSlug in string]: ImproveFlag;
|
|
41
42
|
};
|
|
42
|
-
type
|
|
43
|
+
type ImproveEvents = {
|
|
43
44
|
start: string;
|
|
44
45
|
metrics: string[];
|
|
45
46
|
conversion: string;
|
|
46
47
|
};
|
|
47
|
-
type
|
|
48
|
+
type ImproveResult = {
|
|
48
49
|
result: {
|
|
49
50
|
[variant: string]: {
|
|
50
51
|
[metric: string]: number;
|
|
@@ -57,30 +58,30 @@ type Result = {
|
|
|
57
58
|
}[];
|
|
58
59
|
}[];
|
|
59
60
|
};
|
|
60
|
-
type
|
|
61
|
+
type ImproveTest = {
|
|
61
62
|
id: string;
|
|
62
63
|
name: string;
|
|
63
64
|
defaultValue: string;
|
|
64
65
|
audience: string;
|
|
65
66
|
allocation: number;
|
|
66
|
-
options:
|
|
67
|
-
events:
|
|
67
|
+
options: ImproveTestOption[];
|
|
68
|
+
events: ImproveEvents;
|
|
68
69
|
};
|
|
69
|
-
type
|
|
70
|
-
[testSlug in string]:
|
|
70
|
+
type ImproveTests = {
|
|
71
|
+
[testSlug in string]: ImproveTest;
|
|
71
72
|
};
|
|
72
|
-
type
|
|
73
|
+
type ImproveAudienceValue = {
|
|
73
74
|
[Key in AudienceParamKey]: string;
|
|
74
75
|
};
|
|
75
|
-
type
|
|
76
|
-
[audienceSlug in string]:
|
|
76
|
+
type ImproveAudience = {
|
|
77
|
+
[audienceSlug in string]: ImproveAudienceValue;
|
|
77
78
|
};
|
|
78
|
-
type
|
|
79
|
+
type ImproveConfiguration = {
|
|
79
80
|
name: string;
|
|
80
81
|
version: number;
|
|
81
|
-
flags:
|
|
82
|
-
tests:
|
|
83
|
-
audience:
|
|
82
|
+
flags: ImproveFlags;
|
|
83
|
+
tests: ImproveTests;
|
|
84
|
+
audience: ImproveAudience;
|
|
84
85
|
};
|
|
85
86
|
|
|
86
|
-
export type {
|
|
87
|
+
export type { ImproveAudience, ImproveAudienceValue, ImproveConfiguration, ImproveEnvironmentOption, ImproveEvents, ImproveFlag, ImproveFlagOption, ImproveFlags, ImproveResult, ImproveSetupArgs, ImproveTest, ImproveTestOption, ImproveTestState, ImproveTests };
|
package/dist/server.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,"__esModule",{value:!0});var
|
|
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"],a=i=>n.includes(i)?"coarse":"fine",l=(i="")=>{if(!i)return"unix";let t=i.toLowerCase();return e.os.find(i=>t.includes(i))||"unix"},u=i=>{if(!i||"string"!=typeof i)return null;let e=new t.default(i).getResult(),r=s(e.device.type);return{pointer:a(r),device:r,browser:o(e.browser.name),os:l(e.os.name)}},h=(i,t)=>!i||Object.entries(i).every(([i,e])=>t[i]===e),f=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="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",g=i=>new Promise(t=>setTimeout(t,i)),d=async(i=1e3,t)=>(await g(i),t?.abort(),null),v=(i=3e3,t,e)=>{let s=new AbortController;return Promise.race([fetch(t,{...e,signal:s.signal}),d(i,s)])};class p{#i;constructor({organizationId:i,environment:t,state:e,config:s,fetchTimeout:r}){this.organizationId="",this.environment="develop",this.#i=null,this.config=null,this.fetchConfig=async()=>{if(this.config)return;if(!this.#i)throw Error("No config fetch setup provided");let i=await v(this.#i.timeout,this.#i.url);if(!i)throw Error("Configuration fetch timed-out");this.config=await i.json()},this.loadConfig=i=>{this.config=i},this.generateVisitorId=()=>`visi_${(function(i=5){return i&&"number"==typeof i?Array(i).fill("").reduce(i=>i+=c.charAt(Math.floor(Math.random()*c.length)),""):""})(26).toUpperCase()}`,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.organizationId=i,this.environment=t,s?this.config=s:this.#i={url:["https://improve.obelism.studio/config",i,t,e||"active"].join("/"),timeout:r||3e3}}}exports.ImproveServerSDK=class extends p{#t;constructor(...i){super(...i),this.#t={},this.getFlagConfig=i=>this.config?.flags?.[i],this.getTestConfig=i=>this.config?.tests?.[i],this.getFlagValue=(i,t,e)=>{let s=this.getFlagConfig(i);if(!s||!this.config)return null;if(!t)return s.options[0].slug;if(this.#t?.[t]?.[e]?.[i])return this.#t[t][e][i];if(this.#t[t]=this.#t[t]||{},this.#t[t][e]=this.#t[t][e]||u(e),!h(this.config.audience[s.audience],this.#t[t][e]))return s.options[0].slug;let r=f(s.options);return r?(this.#t[t][e][i]=r,r):null},this.getTestValue=(i,t,e)=>{let s=this.getTestConfig(i);if(!s||!this.config)return null;if(!t||!e)return s.defaultValue;if(this.#t?.[t]?.[e]?.[i])return this.#t[t][e][i];if(this.#t[t]=this.#t[t]||{},this.#t[t][e]=this.#t[t][e]||u(e),!h(this.config.audience[s.audience],this.#t[t][e]))return s.defaultValue;if(s.allocation<100&&100*Math.random()>s.allocation)return this.#t[t][e][i]=s.defaultValue,this.#t[t][e][i];let r=f(s.options);return r?(this.#t[t][e][i]=r,r):null}}};
|
package/dist/server.d.cts
CHANGED
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
import * as __types from './types.ts';
|
|
2
|
-
import {
|
|
2
|
+
import { ImproveEnvironmentOption, ImproveConfiguration, ImproveSetupArgs } from './types.ts';
|
|
3
3
|
|
|
4
4
|
declare class BaseImproveSDK {
|
|
5
5
|
#private;
|
|
6
6
|
organizationId: string;
|
|
7
|
-
environment:
|
|
8
|
-
config:
|
|
9
|
-
constructor({ organizationId, environment, config, fetchTimeout, }:
|
|
7
|
+
environment: ImproveEnvironmentOption;
|
|
8
|
+
config: ImproveConfiguration | null;
|
|
9
|
+
constructor({ organizationId, environment, state, config, fetchTimeout, }: ImproveSetupArgs);
|
|
10
10
|
fetchConfig: () => Promise<void>;
|
|
11
|
+
loadConfig: (config: ImproveConfiguration) => void;
|
|
11
12
|
generateVisitorId: () => string;
|
|
12
13
|
getVisitorCookieName: () => string;
|
|
14
|
+
validateTestValue: (testName: string, testValue: string) => boolean;
|
|
13
15
|
}
|
|
14
16
|
|
|
15
17
|
declare class ImproveServerSDK extends BaseImproveSDK {
|
|
16
18
|
#private;
|
|
17
|
-
getFlagConfig: (flagSlug: string) => __types.
|
|
18
|
-
getTestConfig: (testSlug: string) => __types.
|
|
19
|
+
getFlagConfig: (flagSlug: string) => __types.ImproveFlag | undefined;
|
|
20
|
+
getTestConfig: (testSlug: string) => __types.ImproveTest | undefined;
|
|
19
21
|
getFlagValue: (flagSlug: string, visitorId: string, userAgent: string) => string | null;
|
|
20
22
|
getTestValue: (testSlug: string, visitorId: string, userAgent: string) => string | null;
|
|
21
23
|
}
|
package/dist/server.d.ts
CHANGED
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
import * as __types from './types.ts';
|
|
2
|
-
import {
|
|
2
|
+
import { ImproveEnvironmentOption, ImproveConfiguration, ImproveSetupArgs } from './types.ts';
|
|
3
3
|
|
|
4
4
|
declare class BaseImproveSDK {
|
|
5
5
|
#private;
|
|
6
6
|
organizationId: string;
|
|
7
|
-
environment:
|
|
8
|
-
config:
|
|
9
|
-
constructor({ organizationId, environment, config, fetchTimeout, }:
|
|
7
|
+
environment: ImproveEnvironmentOption;
|
|
8
|
+
config: ImproveConfiguration | null;
|
|
9
|
+
constructor({ organizationId, environment, state, config, fetchTimeout, }: ImproveSetupArgs);
|
|
10
10
|
fetchConfig: () => Promise<void>;
|
|
11
|
+
loadConfig: (config: ImproveConfiguration) => void;
|
|
11
12
|
generateVisitorId: () => string;
|
|
12
13
|
getVisitorCookieName: () => string;
|
|
14
|
+
validateTestValue: (testName: string, testValue: string) => boolean;
|
|
13
15
|
}
|
|
14
16
|
|
|
15
17
|
declare class ImproveServerSDK extends BaseImproveSDK {
|
|
16
18
|
#private;
|
|
17
|
-
getFlagConfig: (flagSlug: string) => __types.
|
|
18
|
-
getTestConfig: (testSlug: string) => __types.
|
|
19
|
+
getFlagConfig: (flagSlug: string) => __types.ImproveFlag | undefined;
|
|
20
|
+
getTestConfig: (testSlug: string) => __types.ImproveTest | undefined;
|
|
19
21
|
getFlagValue: (flagSlug: string, visitorId: string, userAgent: string) => string | null;
|
|
20
22
|
getTestValue: (testSlug: string, visitorId: string, userAgent: string) => string | null;
|
|
21
23
|
}
|
package/dist/server.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import
|
|
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"],o=(i="")=>{if(!i)return"other";let e=i.toLowerCase();return t.browser.find(i=>e.includes(i))||(s.includes(e)?"social":"other")},r=["wearable","mobile","tablet"],n=i=>r.includes(i)?"coarse":"fine",a=(i="")=>{if(!i)return"unix";let e=i.toLowerCase();return t.os.find(i=>e.includes(i))||"unix"},l=t=>{if(!t||"string"!=typeof t)return null;let s=new i(t).getResult(),r=e(s.device.type);return{pointer:n(r),device:r,browser:o(s.browser.name),os:a(s.os.name)}},u=(i,t)=>!i||Object.entries(i).every(([i,e])=>t[i]===e),h=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="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789",c=i=>new Promise(t=>setTimeout(t,i)),g=async(i=1e3,t)=>(await c(i),t?.abort(),null),d=(i=3e3,t,e)=>{let s=new AbortController;return Promise.race([fetch(t,{...e,signal:s.signal}),g(i,s)])};class v{#i;constructor({organizationId:i,environment:t,state:e,config:s,fetchTimeout:o}){this.organizationId="",this.environment="develop",this.#i=null,this.config=null,this.fetchConfig=async()=>{if(this.config)return;if(!this.#i)throw Error("No config fetch setup provided");let i=await d(this.#i.timeout,this.#i.url);if(!i)throw Error("Configuration fetch timed-out");this.config=await i.json()},this.loadConfig=i=>{this.config=i},this.generateVisitorId=()=>`visi_${(function(i=5){return i&&"number"==typeof i?Array(i).fill("").reduce(i=>i+=f.charAt(Math.floor(Math.random()*f.length)),""):""})(26).toUpperCase()}`,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.organizationId=i,this.environment=t,s?this.config=s:this.#i={url:["https://improve.obelism.studio/config",i,t,e||"active"].join("/"),timeout:o||3e3}}}class m extends v{#t;constructor(...i){super(...i),this.#t={},this.getFlagConfig=i=>this.config?.flags?.[i],this.getTestConfig=i=>this.config?.tests?.[i],this.getFlagValue=(i,t,e)=>{let s=this.getFlagConfig(i);if(!s||!this.config)return null;if(!t)return s.options[0].slug;if(this.#t?.[t]?.[e]?.[i])return this.#t[t][e][i];if(this.#t[t]=this.#t[t]||{},this.#t[t][e]=this.#t[t][e]||l(e),!u(this.config.audience[s.audience],this.#t[t][e]))return s.options[0].slug;let o=h(s.options);return o?(this.#t[t][e][i]=o,o):null},this.getTestValue=(i,t,e)=>{let s=this.getTestConfig(i);if(!s||!this.config)return null;if(!t||!e)return s.defaultValue;if(this.#t?.[t]?.[e]?.[i])return this.#t[t][e][i];if(this.#t[t]=this.#t[t]||{},this.#t[t][e]=this.#t[t][e]||l(e),!u(this.config.audience[s.audience],this.#t[t][e]))return s.defaultValue;if(s.allocation<100&&100*Math.random()>s.allocation)return this.#t[t][e][i]=s.defaultValue,this.#t[t][e][i];let o=h(s.options);return o?(this.#t[t][e][i]=o,o):null}}}export{m as ImproveServerSDK};
|
package/dist/types.d.ts
CHANGED
|
@@ -10,41 +10,42 @@ declare const AUDIENCE_PARAMS: {
|
|
|
10
10
|
};
|
|
11
11
|
type AudienceParamKey = keyof typeof AUDIENCE_PARAMS;
|
|
12
12
|
|
|
13
|
-
type
|
|
14
|
-
type
|
|
13
|
+
type ImproveEnvironmentOption = 'develop' | 'staging' | 'production';
|
|
14
|
+
type ImproveTestState = 'draft' | 'active' | 'finished' | 'archived';
|
|
15
|
+
type ImproveSetupArgs = {
|
|
15
16
|
organizationId: string;
|
|
16
|
-
environment:
|
|
17
|
-
|
|
17
|
+
environment: ImproveEnvironmentOption;
|
|
18
|
+
state?: ImproveTestState;
|
|
19
|
+
config?: ImproveConfiguration;
|
|
18
20
|
fetchTimeout?: number;
|
|
19
21
|
};
|
|
20
|
-
type
|
|
21
|
-
type FlagOption = {
|
|
22
|
+
type ImproveFlagOption = {
|
|
22
23
|
name: string;
|
|
23
24
|
slug: string;
|
|
24
25
|
value: string | undefined;
|
|
25
26
|
split: number;
|
|
26
27
|
};
|
|
27
|
-
type
|
|
28
|
+
type ImproveTestOption = {
|
|
28
29
|
name: string;
|
|
29
30
|
slug: string;
|
|
30
31
|
value: string | undefined;
|
|
31
32
|
split: number;
|
|
32
33
|
};
|
|
33
|
-
type
|
|
34
|
+
type ImproveFlag = {
|
|
34
35
|
id: string;
|
|
35
36
|
name: string;
|
|
36
37
|
audience: string;
|
|
37
|
-
options:
|
|
38
|
+
options: ImproveFlagOption[];
|
|
38
39
|
};
|
|
39
|
-
type
|
|
40
|
-
[flagSlug in string]:
|
|
40
|
+
type ImproveFlags = {
|
|
41
|
+
[flagSlug in string]: ImproveFlag;
|
|
41
42
|
};
|
|
42
|
-
type
|
|
43
|
+
type ImproveEvents = {
|
|
43
44
|
start: string;
|
|
44
45
|
metrics: string[];
|
|
45
46
|
conversion: string;
|
|
46
47
|
};
|
|
47
|
-
type
|
|
48
|
+
type ImproveResult = {
|
|
48
49
|
result: {
|
|
49
50
|
[variant: string]: {
|
|
50
51
|
[metric: string]: number;
|
|
@@ -57,30 +58,30 @@ type Result = {
|
|
|
57
58
|
}[];
|
|
58
59
|
}[];
|
|
59
60
|
};
|
|
60
|
-
type
|
|
61
|
+
type ImproveTest = {
|
|
61
62
|
id: string;
|
|
62
63
|
name: string;
|
|
63
64
|
defaultValue: string;
|
|
64
65
|
audience: string;
|
|
65
66
|
allocation: number;
|
|
66
|
-
options:
|
|
67
|
-
events:
|
|
67
|
+
options: ImproveTestOption[];
|
|
68
|
+
events: ImproveEvents;
|
|
68
69
|
};
|
|
69
|
-
type
|
|
70
|
-
[testSlug in string]:
|
|
70
|
+
type ImproveTests = {
|
|
71
|
+
[testSlug in string]: ImproveTest;
|
|
71
72
|
};
|
|
72
|
-
type
|
|
73
|
+
type ImproveAudienceValue = {
|
|
73
74
|
[Key in AudienceParamKey]: string;
|
|
74
75
|
};
|
|
75
|
-
type
|
|
76
|
-
[audienceSlug in string]:
|
|
76
|
+
type ImproveAudience = {
|
|
77
|
+
[audienceSlug in string]: ImproveAudienceValue;
|
|
77
78
|
};
|
|
78
|
-
type
|
|
79
|
+
type ImproveConfiguration = {
|
|
79
80
|
name: string;
|
|
80
81
|
version: number;
|
|
81
|
-
flags:
|
|
82
|
-
tests:
|
|
83
|
-
audience:
|
|
82
|
+
flags: ImproveFlags;
|
|
83
|
+
tests: ImproveTests;
|
|
84
|
+
audience: ImproveAudience;
|
|
84
85
|
};
|
|
85
86
|
|
|
86
|
-
export type {
|
|
87
|
+
export type { ImproveAudience, ImproveAudienceValue, ImproveConfiguration, ImproveEnvironmentOption, ImproveEvents, ImproveFlag, ImproveFlagOption, ImproveFlags, ImproveResult, ImproveSetupArgs, ImproveTest, ImproveTestOption, ImproveTestState, ImproveTests };
|