@plasmicapp/loader-splits 1.0.44 → 1.0.46

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.esm.js CHANGED
@@ -135,15 +135,24 @@ function getActiveVariation(opts) {
135
135
  });
136
136
  return variation;
137
137
  }
138
- function getExternalIds(splits, variation) {
138
+ function getExternalIds(splits, variation, filters) {
139
139
  const externalVariation = {};
140
+ function shouldIncludeSplit(split) {
141
+ if (!filters) {
142
+ return true;
143
+ }
144
+ if (filters.projectIds && !filters.projectIds.includes(split.projectId)) {
145
+ return false;
146
+ }
147
+ return true;
148
+ }
140
149
  Object.keys(variation).forEach((variationKey) => {
141
150
  const [, splitId] = variationKey.split(".");
142
151
  const sliceId = variation[variationKey];
143
152
  const split = splits.find(
144
153
  (s) => s.id === splitId || s.externalId === splitId
145
154
  );
146
- if (split && split.externalId) {
155
+ if (split && split.externalId && shouldIncludeSplit(split)) {
147
156
  const slice = split.slices.find((s) => s.id === sliceId || s.externalId === sliceId);
148
157
  if (slice == null ? void 0 : slice.externalId) {
149
158
  externalVariation[`${split.externalId}`] = slice.externalId;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
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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",
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\ninterface ExternalIDsFilters {\n projectIds?: string[];\n}\n\nexport function getExternalIds(\n splits: Split[],\n variation: Record<string, string>,\n filters?: ExternalIDsFilters\n) {\n const externalVariation: Record<string, string> = {};\n\n function shouldIncludeSplit(split: Split) {\n if (!filters) {\n return true;\n }\n if (filters.projectIds && !filters.projectIds.includes(split.projectId)) {\n return false;\n }\n return true;\n }\n\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 && shouldIncludeSplit(split)) {\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": ";;;;;;;;;;;;;;;;;;AAAO,IAAM,0BAA0B,CAAC,YAAoB;AAE1D,WAAS,QAAQ,KAAa;AAC5B,QAAI,KAAK,YACP,KAAK,YACL,KAAK,YACL,KAAK;AACP,aAAS,IAAI,GAAG,GAAG,IAAI,IAAI,QAAQ,KAAK;AACtC,UAAI,IAAI,WAAW,CAAC;AACpB,WAAK,KAAK,KAAK,KAAK,KAAK,GAAG,SAAS;AACrC,WAAK,KAAK,KAAK,KAAK,KAAK,GAAG,UAAU;AACtC,WAAK,KAAK,KAAK,KAAK,KAAK,GAAG,SAAS;AACrC,WAAK,KAAK,KAAK,KAAK,KAAK,GAAG,UAAU;AAAA,IACxC;AACA,SAAK,KAAK,KAAK,KAAM,OAAO,IAAK,SAAS;AAC1C,SAAK,KAAK,KAAK,KAAM,OAAO,IAAK,UAAU;AAC3C,SAAK,KAAK,KAAK,KAAM,OAAO,IAAK,SAAS;AAC1C,SAAK,KAAK,KAAK,KAAM,OAAO,IAAK,UAAU;AAC3C,WAAO;AAAA,OACJ,KAAK,KAAK,KAAK,QAAQ;AAAA,OACvB,KAAK,QAAQ;AAAA,OACb,KAAK,QAAQ;AAAA,OACb,KAAK,QAAQ;AAAA,IAChB;AAAA,EACF;AACA,WAAS,MAAM,GAAW,GAAW,GAAW,GAAW;AACzD,WAAO,WAAY;AACjB,aAAO;AACP,aAAO;AACP,aAAO;AACP,aAAO;AACP,UAAI,IAAK,IAAI,IAAK;AAClB,UAAI,IAAK,MAAM;AACf,UAAK,KAAK,KAAK,KAAM;AACrB,UAAK,KAAK,KAAO,MAAM;AACvB,UAAK,IAAI,IAAK;AACd,UAAK,IAAI,IAAK;AACd,UAAK,IAAI,IAAK;AACd,cAAQ,MAAM,KAAK;AAAA,IACrB;AAAA,EACF;AACA,QAAM,OAAO,QAAQ,OAAO;AAC5B,QAAM,OAAO,MAAM,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AACrD,SAAO;AACT;;;ACvCA,OAAO,eAAe;AAGtB,IAAM,YACJ,OAAO,WAAW,eAClB,UAAU,QACV,OAAO,OAAO,aAAa;AAEtB,IAAM,eAAe;AAE5B,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,MAOhC;AACD,QAAM,EAAE,QAAQ,eAAe,iBAAiB,IAAI;AACpD,QAAM,iBAAiB,CAAC,QAAgB;AAzC1C;AA0CI,QAAI,KAAK,gBAAgB;AACvB,aAAO,KAAK,eAAe,GAAG;AAAA,IAChC;AAEA,QAAI,KAAK,OAAO,YAAY,GAAG;AAC7B,YAAM,OAAO;AAAA,UACV,UAAK,OAAO,YAAY,MAAxB,YAA6B,MAAM;AAAA,MACtC;AACA,aAAO,KAAK;AAAA,IACd;AAIA,QAAI,CAAC,KAAK,2BAA2B;AACnC,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,OAAO;AAAA,EACrB;AACA,QAAM,YAAoC,CAAC;AAC3C,SAAO,QAAQ,CAAC,UAAU;AACxB,UAAM,MAAM,YAAY,KAAK;AAC7B,UAAM,WAAW,+CAAgB;AACjC,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,6DAAmB,KAAK,YAAY;AAAA,MACtC;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAMO,SAAS,eACd,QACA,WACA,SACA;AACA,QAAM,oBAA4C,CAAC;AAEnD,WAAS,mBAAmB,OAAc;AACxC,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,cAAc,CAAC,QAAQ,WAAW,SAAS,MAAM,SAAS,GAAG;AACvE,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,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,cAAc,mBAAmB,KAAK,GAAG;AAC1D,YAAM,QACJ,MAAM,OACN,KAAK,CAAC,MAAM,EAAE,OAAO,WAAW,EAAE,eAAe,OAAO;AAC1D,UAAI,+BAAO,YAAY;AAErB,0BAAkB,GAAG,MAAM,YAAY,IAAI,MAAM;AAAA,MACnD;AAAA,IACF;AAAA,EACF,CAAC;AACD,SAAO;AACT;",
6
6
  "names": []
7
7
  }
package/dist/index.js CHANGED
@@ -171,15 +171,24 @@ function getActiveVariation(opts) {
171
171
  });
172
172
  return variation;
173
173
  }
174
- function getExternalIds(splits, variation) {
174
+ function getExternalIds(splits, variation, filters) {
175
175
  const externalVariation = {};
176
+ function shouldIncludeSplit(split) {
177
+ if (!filters) {
178
+ return true;
179
+ }
180
+ if (filters.projectIds && !filters.projectIds.includes(split.projectId)) {
181
+ return false;
182
+ }
183
+ return true;
184
+ }
176
185
  Object.keys(variation).forEach((variationKey) => {
177
186
  const [, splitId] = variationKey.split(".");
178
187
  const sliceId = variation[variationKey];
179
188
  const split = splits.find(
180
189
  (s) => s.id === splitId || s.externalId === splitId
181
190
  );
182
- if (split && split.externalId) {
191
+ if (split && split.externalId && shouldIncludeSplit(split)) {
183
192
  const slice = split.slices.find((s) => s.id === sliceId || s.externalId === sliceId);
184
193
  if (slice == null ? void 0 : slice.externalId) {
185
194
  externalVariation[`${split.externalId}`] = slice.externalId;
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
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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",
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\ninterface ExternalIDsFilters {\n projectIds?: string[];\n}\n\nexport function getExternalIds(\n splits: Split[],\n variation: Record<string, string>,\n filters?: ExternalIDsFilters\n) {\n const externalVariation: Record<string, string> = {};\n\n function shouldIncludeSplit(split: Split) {\n if (!filters) {\n return true;\n }\n if (filters.projectIds && !filters.projectIds.includes(split.projectId)) {\n return false;\n }\n return true;\n }\n\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 && shouldIncludeSplit(split)) {\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": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,0BAA0B,CAAC,YAAoB;AAE1D,WAAS,QAAQ,KAAa;AAC5B,QAAI,KAAK,YACP,KAAK,YACL,KAAK,YACL,KAAK;AACP,aAAS,IAAI,GAAG,GAAG,IAAI,IAAI,QAAQ,KAAK;AACtC,UAAI,IAAI,WAAW,CAAC;AACpB,WAAK,KAAK,KAAK,KAAK,KAAK,GAAG,SAAS;AACrC,WAAK,KAAK,KAAK,KAAK,KAAK,GAAG,UAAU;AACtC,WAAK,KAAK,KAAK,KAAK,KAAK,GAAG,SAAS;AACrC,WAAK,KAAK,KAAK,KAAK,KAAK,GAAG,UAAU;AAAA,IACxC;AACA,SAAK,KAAK,KAAK,KAAM,OAAO,IAAK,SAAS;AAC1C,SAAK,KAAK,KAAK,KAAM,OAAO,IAAK,UAAU;AAC3C,SAAK,KAAK,KAAK,KAAM,OAAO,IAAK,SAAS;AAC1C,SAAK,KAAK,KAAK,KAAM,OAAO,IAAK,UAAU;AAC3C,WAAO;AAAA,OACJ,KAAK,KAAK,KAAK,QAAQ;AAAA,OACvB,KAAK,QAAQ;AAAA,OACb,KAAK,QAAQ;AAAA,OACb,KAAK,QAAQ;AAAA,IAChB;AAAA,EACF;AACA,WAAS,MAAM,GAAW,GAAW,GAAW,GAAW;AACzD,WAAO,WAAY;AACjB,aAAO;AACP,aAAO;AACP,aAAO;AACP,aAAO;AACP,UAAI,IAAK,IAAI,IAAK;AAClB,UAAI,IAAK,MAAM;AACf,UAAK,KAAK,KAAK,KAAM;AACrB,UAAK,KAAK,KAAO,MAAM;AACvB,UAAK,IAAI,IAAK;AACd,UAAK,IAAI,IAAK;AACd,UAAK,IAAI,IAAK;AACd,cAAQ,MAAM,KAAK;AAAA,IACrB;AAAA,EACF;AACA,QAAM,OAAO,QAAQ,OAAO;AAC5B,QAAM,OAAO,MAAM,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,GAAG,KAAK,CAAC,CAAC;AACrD,SAAO;AACT;;;ACvCA,2BAAsB;AAGtB,IAAM,YACJ,OAAO,WAAW,eAClB,UAAU,QACV,OAAO,OAAO,aAAa;AAEtB,IAAM,eAAe;AAE5B,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,MAOhC;AACD,QAAM,EAAE,QAAQ,eAAe,iBAAiB,IAAI;AACpD,QAAM,iBAAiB,CAAC,QAAgB;AAzC1C;AA0CI,QAAI,KAAK,gBAAgB;AACvB,aAAO,KAAK,eAAe,GAAG;AAAA,IAChC;AAEA,QAAI,KAAK,OAAO,YAAY,GAAG;AAC7B,YAAM,OAAO;AAAA,UACV,UAAK,OAAO,YAAY,MAAxB,YAA6B,MAAM;AAAA,MACtC;AACA,aAAO,KAAK;AAAA,IACd;AAIA,QAAI,CAAC,KAAK,2BAA2B;AACnC,aAAO;AAAA,IACT;AAEA,WAAO,KAAK,OAAO;AAAA,EACrB;AACA,QAAM,YAAoC,CAAC;AAC3C,SAAO,QAAQ,CAAC,UAAU;AACxB,UAAM,MAAM,YAAY,KAAK;AAC7B,UAAM,WAAW,+CAAgB;AACjC,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,6DAAmB,KAAK,YAAY;AAAA,MACtC;AAAA,IACF;AAAA,EACF,CAAC;AAED,SAAO;AACT;AAMO,SAAS,eACd,QACA,WACA,SACA;AACA,QAAM,oBAA4C,CAAC;AAEnD,WAAS,mBAAmB,OAAc;AACxC,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AACA,QAAI,QAAQ,cAAc,CAAC,QAAQ,WAAW,SAAS,MAAM,SAAS,GAAG;AACvE,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAEA,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,cAAc,mBAAmB,KAAK,GAAG;AAC1D,YAAM,QACJ,MAAM,OACN,KAAK,CAAC,MAAM,EAAE,OAAO,WAAW,EAAE,eAAe,OAAO;AAC1D,UAAI,+BAAO,YAAY;AAErB,0BAAkB,GAAG,MAAM,YAAY,IAAI,MAAM;AAAA,MACnD;AAAA,IACF;AAAA,EACF,CAAC;AACD,SAAO;AACT;",
6
6
  "names": ["jsonLogic"]
7
7
  }
@@ -9,4 +9,8 @@ export declare function getActiveVariation(opts: {
9
9
  getRandomValue?: (key: string) => number;
10
10
  enableUnseededExperiments?: boolean;
11
11
  }): Record<string, string>;
12
- export declare function getExternalIds(splits: Split[], variation: Record<string, string>): Record<string, string>;
12
+ interface ExternalIDsFilters {
13
+ projectIds?: string[];
14
+ }
15
+ export declare function getExternalIds(splits: Split[], variation: Record<string, string>, filters?: ExternalIDsFilters): Record<string, string>;
16
+ export {};
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.0.44",
2
+ "version": "1.0.46",
3
3
  "license": "MIT",
4
4
  "types": "./dist/index.d.ts",
5
5
  "main": "./dist/index.js",
@@ -25,7 +25,7 @@
25
25
  "test": "yarn --cwd=../.. test --passWithNoTests",
26
26
  "coverage": "yarn --cwd=../.. test --coverage --passWithNoTests",
27
27
  "lint": "eslint",
28
- "prepare": "if-env PREPARE_NO_BUILD=true || yarn build",
28
+ "prepublishOnly": "npm run build",
29
29
  "size": "size-limit",
30
30
  "analyze": "size-limit --why"
31
31
  },
@@ -38,7 +38,7 @@
38
38
  }
39
39
  ],
40
40
  "devDependencies": {
41
- "@plasmicapp/loader-fetcher": "1.0.38",
41
+ "@plasmicapp/loader-fetcher": "1.0.40",
42
42
  "@types/json-logic-js": "^1.2.1"
43
43
  },
44
44
  "dependencies": {
@@ -47,5 +47,5 @@
47
47
  "publishConfig": {
48
48
  "access": "public"
49
49
  },
50
- "gitHead": "6db50a6b3e9ffd747e4a6521b42fcc0a8f32e97c"
50
+ "gitHead": "e4d957a6fbbb28c97004906a7b3f043c34f7f38f"
51
51
  }