@plasmicapp/loader-splits 1.0.41 → 1.0.43

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.d.ts CHANGED
@@ -1 +1,2 @@
1
- export { getActiveVariation, getExternalIds, getSplitKey } from './variation';
1
+ export { getSeededRandomFunction } from "./random";
2
+ export { getActiveVariation, getExternalIds, getSplitKey } from "./variation";
package/dist/index.esm.js CHANGED
@@ -15,9 +15,53 @@ var __spreadValues = (a, b) => {
15
15
  return a;
16
16
  };
17
17
 
18
+ // src/random.ts
19
+ var getSeededRandomFunction = (strSeed) => {
20
+ function cyrb128(str) {
21
+ let h1 = 1779033703, h2 = 3144134277, h3 = 1013904242, h4 = 2773480762;
22
+ for (let i = 0, k; i < str.length; i++) {
23
+ k = str.charCodeAt(i);
24
+ h1 = h2 ^ Math.imul(h1 ^ k, 597399067);
25
+ h2 = h3 ^ Math.imul(h2 ^ k, 2869860233);
26
+ h3 = h4 ^ Math.imul(h3 ^ k, 951274213);
27
+ h4 = h1 ^ Math.imul(h4 ^ k, 2716044179);
28
+ }
29
+ h1 = Math.imul(h3 ^ h1 >>> 18, 597399067);
30
+ h2 = Math.imul(h4 ^ h2 >>> 22, 2869860233);
31
+ h3 = Math.imul(h1 ^ h3 >>> 17, 951274213);
32
+ h4 = Math.imul(h2 ^ h4 >>> 19, 2716044179);
33
+ return [
34
+ (h1 ^ h2 ^ h3 ^ h4) >>> 0,
35
+ (h2 ^ h1) >>> 0,
36
+ (h3 ^ h1) >>> 0,
37
+ (h4 ^ h1) >>> 0
38
+ ];
39
+ }
40
+ function sfc32(a, b, c, d) {
41
+ return function() {
42
+ a >>>= 0;
43
+ b >>>= 0;
44
+ c >>>= 0;
45
+ d >>>= 0;
46
+ let t = a + b | 0;
47
+ a = b ^ b >>> 9;
48
+ b = c + (c << 3) | 0;
49
+ c = c << 21 | c >>> 11;
50
+ d = d + 1 | 0;
51
+ t = t + d | 0;
52
+ c = c + t | 0;
53
+ return (t >>> 0) / 4294967296;
54
+ };
55
+ }
56
+ const seed = cyrb128(strSeed);
57
+ const rand = sfc32(seed[0], seed[1], seed[2], seed[3]);
58
+ return rand;
59
+ };
60
+
18
61
  // src/variation.ts
19
62
  import jsonLogic from "json-logic-js";
20
63
  var isBrowser = typeof window !== "undefined" && window != null && typeof window.document !== "undefined";
64
+ var PLASMIC_SEED = "plasmic_seed";
21
65
  var BUILTIN_TRAITS_UNKNOWN = {
22
66
  pageUrl: "unknown"
23
67
  };
@@ -35,15 +79,25 @@ var getSplitKey = (split) => {
35
79
  function getActiveVariation(opts) {
36
80
  const { splits, getKnownValue, updateKnownValue } = opts;
37
81
  const getRandomValue = (key) => {
82
+ var _a;
38
83
  if (opts.getRandomValue) {
39
84
  return opts.getRandomValue(key);
40
85
  }
86
+ if (opts.traits[PLASMIC_SEED]) {
87
+ const rand = getSeededRandomFunction(
88
+ ((_a = opts.traits[PLASMIC_SEED]) != null ? _a : "") + key
89
+ );
90
+ return rand();
91
+ }
92
+ if (!opts.enableUnseededExperiments) {
93
+ return 0;
94
+ }
41
95
  return Math.random();
42
96
  };
43
97
  const variation = {};
44
98
  splits.forEach((split) => {
45
99
  const key = getSplitKey(split);
46
- const knownVal = getKnownValue(key);
100
+ const knownVal = getKnownValue == null ? void 0 : getKnownValue(key);
47
101
  if (knownVal) {
48
102
  variation[key] = knownVal;
49
103
  return;
@@ -75,7 +129,7 @@ function getActiveVariation(opts) {
75
129
  variation[`ext.${split.externalId}`] = chosenSlice.externalId;
76
130
  }
77
131
  if (split.type === "experiment") {
78
- updateKnownValue(key, chosenSlice.id);
132
+ updateKnownValue == null ? void 0 : updateKnownValue(key, chosenSlice.id);
79
133
  }
80
134
  }
81
135
  });
@@ -101,6 +155,7 @@ function getExternalIds(splits, variation) {
101
155
  export {
102
156
  getActiveVariation,
103
157
  getExternalIds,
158
+ getSeededRandomFunction,
104
159
  getSplitKey
105
160
  };
106
161
  //# sourceMappingURL=index.esm.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/variation.ts"],
4
- "sourcesContent": ["import {\n ExperimentSlice,\n SegmentSlice,\n Split,\n} from '@plasmicapp/loader-fetcher';\nimport jsonLogic from 'json-logic-js';\n\nconst isBrowser =\n typeof window !== 'undefined' &&\n window != null &&\n typeof window.document !== 'undefined';\n\nconst BUILTIN_TRAITS_UNKNOWN = {\n pageUrl: 'unknown',\n};\n\nconst getBrowserBuiltinTraits = () => {\n if (!isBrowser) {\n return {};\n }\n return {\n pageUrl: document.location.href,\n };\n};\n\nexport const getSplitKey = (split: Split) => {\n return `${split.type === 'experiment' ? 'exp.' : 'seg.'}${split.id}`;\n};\n\nexport function getActiveVariation(opts: {\n splits: Split[];\n traits: Record<string, string | number | boolean>;\n getKnownValue: (key: string) => string | undefined;\n updateKnownValue: (key: string, value: string) => void;\n getRandomValue?: (key: string) => number;\n}) {\n const { splits, getKnownValue, updateKnownValue } = opts;\n const getRandomValue = (key: string) => {\n if (opts.getRandomValue) {\n return opts.getRandomValue(key);\n }\n return Math.random();\n };\n const variation: Record<string, string> = {};\n splits.forEach((split) => {\n const key = getSplitKey(split);\n const knownVal = getKnownValue(key);\n if (knownVal) {\n variation[key] = knownVal;\n return;\n }\n const numSlices = split.slices.length;\n let chosenSlice = undefined;\n if (split.type === 'experiment') {\n let p = getRandomValue(split.id);\n chosenSlice = split.slices[numSlices - 1];\n for (let i = 0; i < numSlices; i++) {\n if (p - split.slices[i].prob <= 0) {\n chosenSlice = split.slices[i];\n break;\n }\n p -= split.slices[i].prob;\n }\n } else if (split.type === 'segment') {\n for (let i = 0; i < numSlices; i++) {\n if (\n jsonLogic.apply(split.slices[i].cond, {\n time: new Date().toISOString(),\n ...BUILTIN_TRAITS_UNKNOWN,\n ...getBrowserBuiltinTraits(),\n ...opts.traits,\n })\n ) {\n chosenSlice = split.slices[i];\n }\n }\n }\n\n if (chosenSlice) {\n variation[key] = chosenSlice.id;\n if (split.externalId && chosenSlice.externalId) {\n variation[`ext.${split.externalId}`] = chosenSlice.externalId;\n }\n if (split.type === 'experiment') {\n updateKnownValue(key, chosenSlice.id);\n }\n }\n });\n\n return variation;\n}\n\nexport function getExternalIds(\n splits: Split[],\n variation: Record<string, string>\n) {\n const externalVariation: Record<string, string> = {};\n Object.keys(variation).forEach((variationKey) => {\n const [, splitId] = variationKey.split('.');\n const sliceId = variation[variationKey];\n const split = splits.find(\n (s) => s.id === splitId || s.externalId === splitId\n );\n if (split && split.externalId) {\n const slice = (split.slices as Array<\n ExperimentSlice | SegmentSlice\n >).find((s) => s.id === sliceId || s.externalId === sliceId);\n if (slice?.externalId) {\n // Save variation without ext prefix\n externalVariation[`${split.externalId}`] = slice.externalId;\n }\n }\n });\n return externalVariation;\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;AAKA,OAAO,eAAe;AAEtB,IAAM,YACJ,OAAO,WAAW,eAClB,UAAU,QACV,OAAO,OAAO,aAAa;AAE7B,IAAM,yBAAyB;AAAA,EAC7B,SAAS;AACX;AAEA,IAAM,0BAA0B,MAAM;AACpC,MAAI,CAAC,WAAW;AACd,WAAO,CAAC;AAAA,EACV;AACA,SAAO;AAAA,IACL,SAAS,SAAS,SAAS;AAAA,EAC7B;AACF;AAEO,IAAM,cAAc,CAAC,UAAiB;AAC3C,SAAO,GAAG,MAAM,SAAS,eAAe,SAAS,SAAS,MAAM;AAClE;AAEO,SAAS,mBAAmB,MAMhC;AACD,QAAM,EAAE,QAAQ,eAAe,iBAAiB,IAAI;AACpD,QAAM,iBAAiB,CAAC,QAAgB;AACtC,QAAI,KAAK,gBAAgB;AACvB,aAAO,KAAK,eAAe,GAAG;AAAA,IAChC;AACA,WAAO,KAAK,OAAO;AAAA,EACrB;AACA,QAAM,YAAoC,CAAC;AAC3C,SAAO,QAAQ,CAAC,UAAU;AACxB,UAAM,MAAM,YAAY,KAAK;AAC7B,UAAM,WAAW,cAAc,GAAG;AAClC,QAAI,UAAU;AACZ,gBAAU,GAAG,IAAI;AACjB;AAAA,IACF;AACA,UAAM,YAAY,MAAM,OAAO;AAC/B,QAAI,cAAc;AAClB,QAAI,MAAM,SAAS,cAAc;AAC/B,UAAI,IAAI,eAAe,MAAM,EAAE;AAC/B,oBAAc,MAAM,OAAO,YAAY,CAAC;AACxC,eAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,YAAI,IAAI,MAAM,OAAO,CAAC,EAAE,QAAQ,GAAG;AACjC,wBAAc,MAAM,OAAO,CAAC;AAC5B;AAAA,QACF;AACA,aAAK,MAAM,OAAO,CAAC,EAAE;AAAA,MACvB;AAAA,IACF,WAAW,MAAM,SAAS,WAAW;AACnC,eAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,YACE,UAAU,MAAM,MAAM,OAAO,CAAC,EAAE,MAAM;AAAA,UACpC,OAAM,oBAAI,KAAK,GAAE,YAAY;AAAA,WAC1B,yBACA,wBAAwB,IACxB,KAAK,OACT,GACD;AACA,wBAAc,MAAM,OAAO,CAAC;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAEA,QAAI,aAAa;AACf,gBAAU,GAAG,IAAI,YAAY;AAC7B,UAAI,MAAM,cAAc,YAAY,YAAY;AAC9C,kBAAU,OAAO,MAAM,YAAY,IAAI,YAAY;AAAA,MACrD;AACA,UAAI,MAAM,SAAS,cAAc;AAC/B,yBAAiB,KAAK,YAAY,EAAE;AAAA,MACtC;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEO,SAAS,eACd,QACA,WACA;AACA,QAAM,oBAA4C,CAAC;AACnD,SAAO,KAAK,SAAS,EAAE,QAAQ,CAAC,iBAAiB;AAC/C,UAAM,CAAC,EAAE,OAAO,IAAI,aAAa,MAAM,GAAG;AAC1C,UAAM,UAAU,UAAU,YAAY;AACtC,UAAM,QAAQ,OAAO;AAAA,MACnB,CAAC,MAAM,EAAE,OAAO,WAAW,EAAE,eAAe;AAAA,IAC9C;AACA,QAAI,SAAS,MAAM,YAAY;AAC7B,YAAM,QAAS,MAAM,OAElB,KAAK,CAAC,MAAM,EAAE,OAAO,WAAW,EAAE,eAAe,OAAO;AAC3D,UAAI,+BAAO,YAAY;AAErB,0BAAkB,GAAG,MAAM,YAAY,IAAI,MAAM;AAAA,MACnD;AAAA,IACF;AAAA,EACF,CAAC;AACD,SAAO;AACT;",
3
+ "sources": ["../src/random.ts", "../src/variation.ts"],
4
+ "sourcesContent": ["export const getSeededRandomFunction = (strSeed: string) => {\n // https://stackoverflow.com/questions/521295/seeding-the-random-number-generator-in-javascript\n function cyrb128(str: string) {\n let h1 = 1779033703,\n h2 = 3144134277,\n h3 = 1013904242,\n h4 = 2773480762;\n for (let i = 0, k; i < str.length; i++) {\n k = str.charCodeAt(i);\n h1 = h2 ^ Math.imul(h1 ^ k, 597399067);\n h2 = h3 ^ Math.imul(h2 ^ k, 2869860233);\n h3 = h4 ^ Math.imul(h3 ^ k, 951274213);\n h4 = h1 ^ Math.imul(h4 ^ k, 2716044179);\n }\n h1 = Math.imul(h3 ^ (h1 >>> 18), 597399067);\n h2 = Math.imul(h4 ^ (h2 >>> 22), 2869860233);\n h3 = Math.imul(h1 ^ (h3 >>> 17), 951274213);\n h4 = Math.imul(h2 ^ (h4 >>> 19), 2716044179);\n return [\n (h1 ^ h2 ^ h3 ^ h4) >>> 0,\n (h2 ^ h1) >>> 0,\n (h3 ^ h1) >>> 0,\n (h4 ^ h1) >>> 0,\n ];\n }\n function sfc32(a: number, b: number, c: number, d: number) {\n return function () {\n a >>>= 0;\n b >>>= 0;\n c >>>= 0;\n d >>>= 0;\n let t = (a + b) | 0;\n a = b ^ (b >>> 9);\n b = (c + (c << 3)) | 0;\n c = (c << 21) | (c >>> 11);\n d = (d + 1) | 0;\n t = (t + d) | 0;\n c = (c + t) | 0;\n return (t >>> 0) / 4294967296;\n };\n }\n const seed = cyrb128(strSeed);\n const rand = sfc32(seed[0], seed[1], seed[2], seed[3]);\n return rand;\n};\n", "import type {\n ExperimentSlice,\n SegmentSlice,\n Split,\n} from \"@plasmicapp/loader-fetcher\";\nimport jsonLogic from \"json-logic-js\";\nimport { getSeededRandomFunction } from \"./random\";\n\nconst isBrowser =\n typeof window !== \"undefined\" &&\n window != null &&\n typeof window.document !== \"undefined\";\n\nexport const PLASMIC_SEED = \"plasmic_seed\";\n\nconst BUILTIN_TRAITS_UNKNOWN = {\n pageUrl: \"unknown\",\n};\n\nconst getBrowserBuiltinTraits = () => {\n if (!isBrowser) {\n return {};\n }\n return {\n pageUrl: document.location.href,\n };\n};\n\nexport const getSplitKey = (split: Split) => {\n return `${split.type === \"experiment\" ? \"exp.\" : \"seg.\"}${split.id}`;\n};\n\nexport function getActiveVariation(opts: {\n splits: Split[];\n traits: Record<string, string | number | boolean>;\n getKnownValue?: (key: string) => string | undefined;\n updateKnownValue?: (key: string, value: string) => void;\n getRandomValue?: (key: string) => number;\n enableUnseededExperiments?: boolean;\n}) {\n const { splits, getKnownValue, updateKnownValue } = opts;\n const getRandomValue = (key: string) => {\n if (opts.getRandomValue) {\n return opts.getRandomValue(key);\n }\n\n if (opts.traits[PLASMIC_SEED]) {\n const rand = getSeededRandomFunction(\n (opts.traits[PLASMIC_SEED] ?? \"\") + key\n );\n return rand();\n }\n\n // If we don't have a seed we won't be able to get a consistent variation\n // in SSR, so we just return 0. Unless if expressly enabled.\n if (!opts.enableUnseededExperiments) {\n return 0;\n }\n\n return Math.random();\n };\n const variation: Record<string, string> = {};\n splits.forEach((split) => {\n const key = getSplitKey(split);\n const knownVal = getKnownValue?.(key);\n if (knownVal) {\n variation[key] = knownVal;\n return;\n }\n const numSlices = split.slices.length;\n let chosenSlice = undefined;\n if (split.type === \"experiment\") {\n let p = getRandomValue(split.id);\n chosenSlice = split.slices[numSlices - 1];\n for (let i = 0; i < numSlices; i++) {\n if (p - split.slices[i].prob <= 0) {\n chosenSlice = split.slices[i];\n break;\n }\n p -= split.slices[i].prob;\n }\n } else if (split.type === \"segment\") {\n for (let i = 0; i < numSlices; i++) {\n if (\n jsonLogic.apply(split.slices[i].cond, {\n time: new Date().toISOString(),\n ...BUILTIN_TRAITS_UNKNOWN,\n ...getBrowserBuiltinTraits(),\n ...opts.traits,\n })\n ) {\n chosenSlice = split.slices[i];\n }\n }\n }\n\n if (chosenSlice) {\n variation[key] = chosenSlice.id;\n if (split.externalId && chosenSlice.externalId) {\n variation[`ext.${split.externalId}`] = chosenSlice.externalId;\n }\n if (split.type === \"experiment\") {\n updateKnownValue?.(key, chosenSlice.id);\n }\n }\n });\n\n return variation;\n}\n\nexport function getExternalIds(\n splits: Split[],\n variation: Record<string, string>\n) {\n const externalVariation: Record<string, string> = {};\n Object.keys(variation).forEach((variationKey) => {\n const [, splitId] = variationKey.split(\".\");\n const sliceId = variation[variationKey];\n const split = splits.find(\n (s) => s.id === splitId || s.externalId === splitId\n );\n if (split && split.externalId) {\n const slice = (\n split.slices as Array<ExperimentSlice | SegmentSlice>\n ).find((s) => s.id === sliceId || s.externalId === sliceId);\n if (slice?.externalId) {\n // Save variation without ext prefix\n externalVariation[`${split.externalId}`] = slice.externalId;\n }\n }\n });\n return externalVariation;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
package/dist/index.js CHANGED
@@ -46,13 +46,58 @@ var src_exports = {};
46
46
  __export(src_exports, {
47
47
  getActiveVariation: () => getActiveVariation,
48
48
  getExternalIds: () => getExternalIds,
49
+ getSeededRandomFunction: () => getSeededRandomFunction,
49
50
  getSplitKey: () => getSplitKey
50
51
  });
51
52
  module.exports = __toCommonJS(src_exports);
52
53
 
54
+ // src/random.ts
55
+ var getSeededRandomFunction = (strSeed) => {
56
+ function cyrb128(str) {
57
+ let h1 = 1779033703, h2 = 3144134277, h3 = 1013904242, h4 = 2773480762;
58
+ for (let i = 0, k; i < str.length; i++) {
59
+ k = str.charCodeAt(i);
60
+ h1 = h2 ^ Math.imul(h1 ^ k, 597399067);
61
+ h2 = h3 ^ Math.imul(h2 ^ k, 2869860233);
62
+ h3 = h4 ^ Math.imul(h3 ^ k, 951274213);
63
+ h4 = h1 ^ Math.imul(h4 ^ k, 2716044179);
64
+ }
65
+ h1 = Math.imul(h3 ^ h1 >>> 18, 597399067);
66
+ h2 = Math.imul(h4 ^ h2 >>> 22, 2869860233);
67
+ h3 = Math.imul(h1 ^ h3 >>> 17, 951274213);
68
+ h4 = Math.imul(h2 ^ h4 >>> 19, 2716044179);
69
+ return [
70
+ (h1 ^ h2 ^ h3 ^ h4) >>> 0,
71
+ (h2 ^ h1) >>> 0,
72
+ (h3 ^ h1) >>> 0,
73
+ (h4 ^ h1) >>> 0
74
+ ];
75
+ }
76
+ function sfc32(a, b, c, d) {
77
+ return function() {
78
+ a >>>= 0;
79
+ b >>>= 0;
80
+ c >>>= 0;
81
+ d >>>= 0;
82
+ let t = a + b | 0;
83
+ a = b ^ b >>> 9;
84
+ b = c + (c << 3) | 0;
85
+ c = c << 21 | c >>> 11;
86
+ d = d + 1 | 0;
87
+ t = t + d | 0;
88
+ c = c + t | 0;
89
+ return (t >>> 0) / 4294967296;
90
+ };
91
+ }
92
+ const seed = cyrb128(strSeed);
93
+ const rand = sfc32(seed[0], seed[1], seed[2], seed[3]);
94
+ return rand;
95
+ };
96
+
53
97
  // src/variation.ts
54
98
  var import_json_logic_js = __toESM(require("json-logic-js"));
55
99
  var isBrowser = typeof window !== "undefined" && window != null && typeof window.document !== "undefined";
100
+ var PLASMIC_SEED = "plasmic_seed";
56
101
  var BUILTIN_TRAITS_UNKNOWN = {
57
102
  pageUrl: "unknown"
58
103
  };
@@ -70,15 +115,25 @@ var getSplitKey = (split) => {
70
115
  function getActiveVariation(opts) {
71
116
  const { splits, getKnownValue, updateKnownValue } = opts;
72
117
  const getRandomValue = (key) => {
118
+ var _a;
73
119
  if (opts.getRandomValue) {
74
120
  return opts.getRandomValue(key);
75
121
  }
122
+ if (opts.traits[PLASMIC_SEED]) {
123
+ const rand = getSeededRandomFunction(
124
+ ((_a = opts.traits[PLASMIC_SEED]) != null ? _a : "") + key
125
+ );
126
+ return rand();
127
+ }
128
+ if (!opts.enableUnseededExperiments) {
129
+ return 0;
130
+ }
76
131
  return Math.random();
77
132
  };
78
133
  const variation = {};
79
134
  splits.forEach((split) => {
80
135
  const key = getSplitKey(split);
81
- const knownVal = getKnownValue(key);
136
+ const knownVal = getKnownValue == null ? void 0 : getKnownValue(key);
82
137
  if (knownVal) {
83
138
  variation[key] = knownVal;
84
139
  return;
@@ -110,7 +165,7 @@ function getActiveVariation(opts) {
110
165
  variation[`ext.${split.externalId}`] = chosenSlice.externalId;
111
166
  }
112
167
  if (split.type === "experiment") {
113
- updateKnownValue(key, chosenSlice.id);
168
+ updateKnownValue == null ? void 0 : updateKnownValue(key, chosenSlice.id);
114
169
  }
115
170
  }
116
171
  });
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/index.ts", "../src/variation.ts"],
4
- "sourcesContent": ["export { getActiveVariation, getExternalIds, getSplitKey } from './variation';\n", "import {\n ExperimentSlice,\n SegmentSlice,\n Split,\n} from '@plasmicapp/loader-fetcher';\nimport jsonLogic from 'json-logic-js';\n\nconst isBrowser =\n typeof window !== 'undefined' &&\n window != null &&\n typeof window.document !== 'undefined';\n\nconst BUILTIN_TRAITS_UNKNOWN = {\n pageUrl: 'unknown',\n};\n\nconst getBrowserBuiltinTraits = () => {\n if (!isBrowser) {\n return {};\n }\n return {\n pageUrl: document.location.href,\n };\n};\n\nexport const getSplitKey = (split: Split) => {\n return `${split.type === 'experiment' ? 'exp.' : 'seg.'}${split.id}`;\n};\n\nexport function getActiveVariation(opts: {\n splits: Split[];\n traits: Record<string, string | number | boolean>;\n getKnownValue: (key: string) => string | undefined;\n updateKnownValue: (key: string, value: string) => void;\n getRandomValue?: (key: string) => number;\n}) {\n const { splits, getKnownValue, updateKnownValue } = opts;\n const getRandomValue = (key: string) => {\n if (opts.getRandomValue) {\n return opts.getRandomValue(key);\n }\n return Math.random();\n };\n const variation: Record<string, string> = {};\n splits.forEach((split) => {\n const key = getSplitKey(split);\n const knownVal = getKnownValue(key);\n if (knownVal) {\n variation[key] = knownVal;\n return;\n }\n const numSlices = split.slices.length;\n let chosenSlice = undefined;\n if (split.type === 'experiment') {\n let p = getRandomValue(split.id);\n chosenSlice = split.slices[numSlices - 1];\n for (let i = 0; i < numSlices; i++) {\n if (p - split.slices[i].prob <= 0) {\n chosenSlice = split.slices[i];\n break;\n }\n p -= split.slices[i].prob;\n }\n } else if (split.type === 'segment') {\n for (let i = 0; i < numSlices; i++) {\n if (\n jsonLogic.apply(split.slices[i].cond, {\n time: new Date().toISOString(),\n ...BUILTIN_TRAITS_UNKNOWN,\n ...getBrowserBuiltinTraits(),\n ...opts.traits,\n })\n ) {\n chosenSlice = split.slices[i];\n }\n }\n }\n\n if (chosenSlice) {\n variation[key] = chosenSlice.id;\n if (split.externalId && chosenSlice.externalId) {\n variation[`ext.${split.externalId}`] = chosenSlice.externalId;\n }\n if (split.type === 'experiment') {\n updateKnownValue(key, chosenSlice.id);\n }\n }\n });\n\n return variation;\n}\n\nexport function getExternalIds(\n splits: Split[],\n variation: Record<string, string>\n) {\n const externalVariation: Record<string, string> = {};\n Object.keys(variation).forEach((variationKey) => {\n const [, splitId] = variationKey.split('.');\n const sliceId = variation[variationKey];\n const split = splits.find(\n (s) => s.id === splitId || s.externalId === splitId\n );\n if (split && split.externalId) {\n const slice = (split.slices as Array<\n ExperimentSlice | SegmentSlice\n >).find((s) => s.id === sliceId || s.externalId === sliceId);\n if (slice?.externalId) {\n // Save variation without ext prefix\n externalVariation[`${split.externalId}`] = slice.externalId;\n }\n }\n });\n return externalVariation;\n}\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACKA,2BAAsB;AAEtB,IAAM,YACJ,OAAO,WAAW,eAClB,UAAU,QACV,OAAO,OAAO,aAAa;AAE7B,IAAM,yBAAyB;AAAA,EAC7B,SAAS;AACX;AAEA,IAAM,0BAA0B,MAAM;AACpC,MAAI,CAAC,WAAW;AACd,WAAO,CAAC;AAAA,EACV;AACA,SAAO;AAAA,IACL,SAAS,SAAS,SAAS;AAAA,EAC7B;AACF;AAEO,IAAM,cAAc,CAAC,UAAiB;AAC3C,SAAO,GAAG,MAAM,SAAS,eAAe,SAAS,SAAS,MAAM;AAClE;AAEO,SAAS,mBAAmB,MAMhC;AACD,QAAM,EAAE,QAAQ,eAAe,iBAAiB,IAAI;AACpD,QAAM,iBAAiB,CAAC,QAAgB;AACtC,QAAI,KAAK,gBAAgB;AACvB,aAAO,KAAK,eAAe,GAAG;AAAA,IAChC;AACA,WAAO,KAAK,OAAO;AAAA,EACrB;AACA,QAAM,YAAoC,CAAC;AAC3C,SAAO,QAAQ,CAAC,UAAU;AACxB,UAAM,MAAM,YAAY,KAAK;AAC7B,UAAM,WAAW,cAAc,GAAG;AAClC,QAAI,UAAU;AACZ,gBAAU,GAAG,IAAI;AACjB;AAAA,IACF;AACA,UAAM,YAAY,MAAM,OAAO;AAC/B,QAAI,cAAc;AAClB,QAAI,MAAM,SAAS,cAAc;AAC/B,UAAI,IAAI,eAAe,MAAM,EAAE;AAC/B,oBAAc,MAAM,OAAO,YAAY,CAAC;AACxC,eAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,YAAI,IAAI,MAAM,OAAO,CAAC,EAAE,QAAQ,GAAG;AACjC,wBAAc,MAAM,OAAO,CAAC;AAC5B;AAAA,QACF;AACA,aAAK,MAAM,OAAO,CAAC,EAAE;AAAA,MACvB;AAAA,IACF,WAAW,MAAM,SAAS,WAAW;AACnC,eAAS,IAAI,GAAG,IAAI,WAAW,KAAK;AAClC,YACE,qBAAAA,QAAU,MAAM,MAAM,OAAO,CAAC,EAAE,MAAM;AAAA,UACpC,OAAM,oBAAI,KAAK,GAAE,YAAY;AAAA,WAC1B,yBACA,wBAAwB,IACxB,KAAK,OACT,GACD;AACA,wBAAc,MAAM,OAAO,CAAC;AAAA,QAC9B;AAAA,MACF;AAAA,IACF;AAEA,QAAI,aAAa;AACf,gBAAU,GAAG,IAAI,YAAY;AAC7B,UAAI,MAAM,cAAc,YAAY,YAAY;AAC9C,kBAAU,OAAO,MAAM,YAAY,IAAI,YAAY;AAAA,MACrD;AACA,UAAI,MAAM,SAAS,cAAc;AAC/B,yBAAiB,KAAK,YAAY,EAAE;AAAA,MACtC;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAEO,SAAS,eACd,QACA,WACA;AACA,QAAM,oBAA4C,CAAC;AACnD,SAAO,KAAK,SAAS,EAAE,QAAQ,CAAC,iBAAiB;AAC/C,UAAM,CAAC,EAAE,OAAO,IAAI,aAAa,MAAM,GAAG;AAC1C,UAAM,UAAU,UAAU,YAAY;AACtC,UAAM,QAAQ,OAAO;AAAA,MACnB,CAAC,MAAM,EAAE,OAAO,WAAW,EAAE,eAAe;AAAA,IAC9C;AACA,QAAI,SAAS,MAAM,YAAY;AAC7B,YAAM,QAAS,MAAM,OAElB,KAAK,CAAC,MAAM,EAAE,OAAO,WAAW,EAAE,eAAe,OAAO;AAC3D,UAAI,+BAAO,YAAY;AAErB,0BAAkB,GAAG,MAAM,YAAY,IAAI,MAAM;AAAA,MACnD;AAAA,IACF;AAAA,EACF,CAAC;AACD,SAAO;AACT;",
3
+ "sources": ["../src/index.ts", "../src/random.ts", "../src/variation.ts"],
4
+ "sourcesContent": ["export { getSeededRandomFunction } from \"./random\";\nexport { getActiveVariation, getExternalIds, getSplitKey } from \"./variation\";\n", "export const getSeededRandomFunction = (strSeed: string) => {\n // https://stackoverflow.com/questions/521295/seeding-the-random-number-generator-in-javascript\n function cyrb128(str: string) {\n let h1 = 1779033703,\n h2 = 3144134277,\n h3 = 1013904242,\n h4 = 2773480762;\n for (let i = 0, k; i < str.length; i++) {\n k = str.charCodeAt(i);\n h1 = h2 ^ Math.imul(h1 ^ k, 597399067);\n h2 = h3 ^ Math.imul(h2 ^ k, 2869860233);\n h3 = h4 ^ Math.imul(h3 ^ k, 951274213);\n h4 = h1 ^ Math.imul(h4 ^ k, 2716044179);\n }\n h1 = Math.imul(h3 ^ (h1 >>> 18), 597399067);\n h2 = Math.imul(h4 ^ (h2 >>> 22), 2869860233);\n h3 = Math.imul(h1 ^ (h3 >>> 17), 951274213);\n h4 = Math.imul(h2 ^ (h4 >>> 19), 2716044179);\n return [\n (h1 ^ h2 ^ h3 ^ h4) >>> 0,\n (h2 ^ h1) >>> 0,\n (h3 ^ h1) >>> 0,\n (h4 ^ h1) >>> 0,\n ];\n }\n function sfc32(a: number, b: number, c: number, d: number) {\n return function () {\n a >>>= 0;\n b >>>= 0;\n c >>>= 0;\n d >>>= 0;\n let t = (a + b) | 0;\n a = b ^ (b >>> 9);\n b = (c + (c << 3)) | 0;\n c = (c << 21) | (c >>> 11);\n d = (d + 1) | 0;\n t = (t + d) | 0;\n c = (c + t) | 0;\n return (t >>> 0) / 4294967296;\n };\n }\n const seed = cyrb128(strSeed);\n const rand = sfc32(seed[0], seed[1], seed[2], seed[3]);\n return rand;\n};\n", "import type {\n ExperimentSlice,\n SegmentSlice,\n Split,\n} from \"@plasmicapp/loader-fetcher\";\nimport jsonLogic from \"json-logic-js\";\nimport { getSeededRandomFunction } from \"./random\";\n\nconst isBrowser =\n typeof window !== \"undefined\" &&\n window != null &&\n typeof window.document !== \"undefined\";\n\nexport const PLASMIC_SEED = \"plasmic_seed\";\n\nconst BUILTIN_TRAITS_UNKNOWN = {\n pageUrl: \"unknown\",\n};\n\nconst getBrowserBuiltinTraits = () => {\n if (!isBrowser) {\n return {};\n }\n return {\n pageUrl: document.location.href,\n };\n};\n\nexport const getSplitKey = (split: Split) => {\n return `${split.type === \"experiment\" ? \"exp.\" : \"seg.\"}${split.id}`;\n};\n\nexport function getActiveVariation(opts: {\n splits: Split[];\n traits: Record<string, string | number | boolean>;\n getKnownValue?: (key: string) => string | undefined;\n updateKnownValue?: (key: string, value: string) => void;\n getRandomValue?: (key: string) => number;\n enableUnseededExperiments?: boolean;\n}) {\n const { splits, getKnownValue, updateKnownValue } = opts;\n const getRandomValue = (key: string) => {\n if (opts.getRandomValue) {\n return opts.getRandomValue(key);\n }\n\n if (opts.traits[PLASMIC_SEED]) {\n const rand = getSeededRandomFunction(\n (opts.traits[PLASMIC_SEED] ?? \"\") + key\n );\n return rand();\n }\n\n // If we don't have a seed we won't be able to get a consistent variation\n // in SSR, so we just return 0. Unless if expressly enabled.\n if (!opts.enableUnseededExperiments) {\n return 0;\n }\n\n return Math.random();\n };\n const variation: Record<string, string> = {};\n splits.forEach((split) => {\n const key = getSplitKey(split);\n const knownVal = getKnownValue?.(key);\n if (knownVal) {\n variation[key] = knownVal;\n return;\n }\n const numSlices = split.slices.length;\n let chosenSlice = undefined;\n if (split.type === \"experiment\") {\n let p = getRandomValue(split.id);\n chosenSlice = split.slices[numSlices - 1];\n for (let i = 0; i < numSlices; i++) {\n if (p - split.slices[i].prob <= 0) {\n chosenSlice = split.slices[i];\n break;\n }\n p -= split.slices[i].prob;\n }\n } else if (split.type === \"segment\") {\n for (let i = 0; i < numSlices; i++) {\n if (\n jsonLogic.apply(split.slices[i].cond, {\n time: new Date().toISOString(),\n ...BUILTIN_TRAITS_UNKNOWN,\n ...getBrowserBuiltinTraits(),\n ...opts.traits,\n })\n ) {\n chosenSlice = split.slices[i];\n }\n }\n }\n\n if (chosenSlice) {\n variation[key] = chosenSlice.id;\n if (split.externalId && chosenSlice.externalId) {\n variation[`ext.${split.externalId}`] = chosenSlice.externalId;\n }\n if (split.type === \"experiment\") {\n updateKnownValue?.(key, chosenSlice.id);\n }\n }\n });\n\n return variation;\n}\n\nexport function getExternalIds(\n splits: Split[],\n variation: Record<string, string>\n) {\n const externalVariation: Record<string, string> = {};\n Object.keys(variation).forEach((variationKey) => {\n const [, splitId] = variationKey.split(\".\");\n const sliceId = variation[variationKey];\n const split = splits.find(\n (s) => s.id === splitId || s.externalId === splitId\n );\n if (split && split.externalId) {\n const slice = (\n split.slices as Array<ExperimentSlice | SegmentSlice>\n ).find((s) => s.id === sliceId || s.externalId === sliceId);\n if (slice?.externalId) {\n // Save variation without ext prefix\n externalVariation[`${split.externalId}`] = slice.externalId;\n }\n }\n });\n return externalVariation;\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["jsonLogic"]
7
7
  }
@@ -0,0 +1 @@
1
+ export declare const getSeededRandomFunction: (strSeed: string) => () => number;
@@ -1,10 +1,12 @@
1
- import { Split } from '@plasmicapp/loader-fetcher';
1
+ import type { Split } from "@plasmicapp/loader-fetcher";
2
+ export declare const PLASMIC_SEED = "plasmic_seed";
2
3
  export declare const getSplitKey: (split: Split) => string;
3
4
  export declare function getActiveVariation(opts: {
4
5
  splits: Split[];
5
6
  traits: Record<string, string | number | boolean>;
6
- getKnownValue: (key: string) => string | undefined;
7
- updateKnownValue: (key: string, value: string) => void;
7
+ getKnownValue?: (key: string) => string | undefined;
8
+ updateKnownValue?: (key: string, value: string) => void;
8
9
  getRandomValue?: (key: string) => number;
10
+ enableUnseededExperiments?: boolean;
9
11
  }): Record<string, string>;
10
12
  export declare function getExternalIds(splits: Split[], variation: Record<string, string>): Record<string, string>;
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.0.41",
2
+ "version": "1.0.43",
3
3
  "license": "MIT",
4
4
  "types": "./dist/index.d.ts",
5
5
  "main": "./dist/index.js",
@@ -38,14 +38,14 @@
38
38
  }
39
39
  ],
40
40
  "devDependencies": {
41
+ "@plasmicapp/loader-fetcher": "1.0.37",
41
42
  "@types/json-logic-js": "^1.2.1"
42
43
  },
43
44
  "dependencies": {
44
- "@plasmicapp/loader-fetcher": "1.0.36",
45
45
  "json-logic-js": "^2.0.2"
46
46
  },
47
47
  "publishConfig": {
48
48
  "access": "public"
49
49
  },
50
- "gitHead": "061bfb393e0e5faabf92ef07b21e60107a5e7971"
50
+ "gitHead": "f9ffe94b022627f4677d77f8d953e27a4076dc39"
51
51
  }