@lumiastream/lumia-types 3.9.1 → 3.9.3

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/esm/index.js CHANGED
@@ -1,5 +1,6 @@
1
1
  export { LumiaStreamingSites, LumiaActivityCommandTypes, LumiaExternalActivityCommandTypes, LumiaAlertValues, LumiaAlertFriendlyValues, LumiaActivityOriginTypes, LumiaActivityApiValueType, LumiaActivityNoValueTypes, LumiaActivityTestType, } from './activity.types.js';
2
2
  export { LumiaVariationConditions, LumiaVariationCurrency, VariationCurrencySymbol, LumiaRedemptionCurrency, LumiaRedemptionCurrencySymbol, LumiaAlertConfigs, } from './alert.types.js';
3
+ export { checkAlertVariation, resetVariationCumulativeTracking, sanitizeVariationVariableReference, } from './variation.helpers.js';
3
4
  export { LumiaIntegrations, LumiaEventTypes, } from './event.types.js';
4
5
  export { LumiaEventListTypes, LumiaMapAlertTypeToEventListType, AlertsToFilter, PlatformsToFilter, LumiaEventListTypeColors, getEventListCategoryColor } from './eventlist.types.js';
5
6
  export { SystemVariables, ReservedVariables, AllVariables, getAcceptedVariableName, getAcceptedVariableNames, } from './variables.types.js';
@@ -0,0 +1,432 @@
1
+ import { LumiaVariationConditions, LumiaVariationCurrency } from './alert.types.js';
2
+ const lastCountMultipleIdxByKey = new Map();
3
+ const subscriptionOrderNumbers = {
4
+ [LumiaVariationConditions.GIFT_SUB_EQUAL]: 1,
5
+ [LumiaVariationConditions.GIFT_SUB_GREATER]: 2,
6
+ [LumiaVariationConditions.IS_GIFT]: 3,
7
+ [LumiaVariationConditions.SUBSCRIBED_MONTHS_EQUAL]: 4,
8
+ [LumiaVariationConditions.SUBSCRIBED_MONTHS_GREATER]: 5,
9
+ [LumiaVariationConditions.IS_PRIME]: 6,
10
+ [LumiaVariationConditions.EQUAL_SELECTION]: 7,
11
+ [LumiaVariationConditions.RANDOM]: 8,
12
+ };
13
+ const variationBucketTypes = {
14
+ equals: [
15
+ LumiaVariationConditions.EQUAL_NUMBER,
16
+ LumiaVariationConditions.EQUAL_VARIABLE,
17
+ LumiaVariationConditions.EQUAL_CURRENCY_NUMBER,
18
+ LumiaVariationConditions.EQUAL_SELECTION,
19
+ LumiaVariationConditions.EQUAL_STRING,
20
+ LumiaVariationConditions.EQUAL_USERNAME,
21
+ LumiaVariationConditions.EQUAL_USER_LEVEL,
22
+ LumiaVariationConditions.SUBSCRIBED_MONTHS_EQUAL,
23
+ LumiaVariationConditions.GIFT_SUB_EQUAL,
24
+ LumiaVariationConditions.COUNT_IS_MULTIPLE_OF,
25
+ ],
26
+ greaters: [
27
+ LumiaVariationConditions.GREATER_NUMBER,
28
+ LumiaVariationConditions.GREATER_CURRENCY_NUMBER,
29
+ LumiaVariationConditions.SUBSCRIBED_MONTHS_GREATER,
30
+ LumiaVariationConditions.GIFT_SUB_GREATER,
31
+ ],
32
+ lessers: [LumiaVariationConditions.LESS_NUMBER],
33
+ checks: [LumiaVariationConditions.IS_GIFT, LumiaVariationConditions.IS_PRIME],
34
+ randoms: [LumiaVariationConditions.RANDOM],
35
+ };
36
+ export const sanitizeVariationVariableReference = (value) => (value ? value.trim().replace(/[={}]/g, '') : '');
37
+ const isVariationOnly = (config) => Boolean(config.onlyVariation || config.disableBaseAlert);
38
+ const isBaseAlertEnabled = (config, options) => { var _a, _b; return (_b = (_a = options.isBaseAlertEnabled) === null || _a === void 0 ? void 0 : _a.call(options, config)) !== null && _b !== void 0 ? _b : !isVariationOnly(config); };
39
+ const isVariationEnabled = (variation, config, options) => { var _a, _b; return (_b = (_a = options.isVariationEnabled) === null || _a === void 0 ? void 0 : _a.call(options, variation, config)) !== null && _b !== void 0 ? _b : variation.on !== false; };
40
+ const safeParse = (value, floor = false) => {
41
+ if (typeof value === 'number') {
42
+ return floor ? Math.floor(value) : value;
43
+ }
44
+ if (typeof value === 'boolean' || value === undefined || value === null) {
45
+ return value;
46
+ }
47
+ if (value.includes('.')) {
48
+ const parsedValue = parseFloat(value);
49
+ return floor ? Math.floor(parsedValue) : parsedValue;
50
+ }
51
+ const parsedValue = parseInt(value);
52
+ return floor ? Math.floor(parsedValue) : parsedValue;
53
+ };
54
+ const toFiniteNumber = (value) => {
55
+ if (typeof value === 'number') {
56
+ return Number.isFinite(value) ? value : undefined;
57
+ }
58
+ if (typeof value === 'string') {
59
+ const trimmedValue = value.trim();
60
+ if (!trimmedValue.length) {
61
+ return undefined;
62
+ }
63
+ const parsedValue = Number(trimmedValue);
64
+ return Number.isFinite(parsedValue) ? parsedValue : undefined;
65
+ }
66
+ return undefined;
67
+ };
68
+ const getRandomNumber = (min = 0, max = 255, random = Math.random) => Math.floor(random() * (max - min + 1) + min);
69
+ const rollChance = (percent = 100, random = Math.random) => getRandomNumber(0, 100, random) < percent;
70
+ const shuffle = (array, random = Math.random) => {
71
+ const newArray = [...array];
72
+ const startIndex = newArray.length;
73
+ let randomIndex = Math.floor(random() * startIndex);
74
+ for (let currentIndex = startIndex - 1; currentIndex >= 1; currentIndex--) {
75
+ [newArray[currentIndex], newArray[randomIndex]] = [newArray[randomIndex], newArray[currentIndex]];
76
+ randomIndex = Math.floor(random() * currentIndex);
77
+ }
78
+ return newArray;
79
+ };
80
+ const compareVariationValue = ({ expected, actual, caseSensitive }) => {
81
+ if (expected === undefined || expected === null || (typeof expected === 'string' && expected.trim().length === 0)) {
82
+ return actual !== undefined && actual !== null;
83
+ }
84
+ const expectedNumber = toFiniteNumber(expected);
85
+ const actualNumber = toFiniteNumber(actual);
86
+ if (expectedNumber !== undefined && actualNumber !== undefined) {
87
+ return expectedNumber === actualNumber;
88
+ }
89
+ const expectedString = `${expected}`;
90
+ const actualString = actual === undefined || actual === null ? '' : `${actual}`;
91
+ if (caseSensitive ? expectedString === actualString : expectedString.toLowerCase() === actualString.toLowerCase()) {
92
+ return true;
93
+ }
94
+ return expected == actual;
95
+ };
96
+ const getVariableValueFromCondition = (condition, variableReference, options) => {
97
+ var _a;
98
+ const normalizedVariableName = sanitizeVariationVariableReference(variableReference);
99
+ if (!normalizedVariableName) {
100
+ return undefined;
101
+ }
102
+ const conditionRecord = condition;
103
+ if (conditionRecord[normalizedVariableName] !== undefined) {
104
+ return conditionRecord[normalizedVariableName];
105
+ }
106
+ if (variableReference && conditionRecord[variableReference] !== undefined) {
107
+ return conditionRecord[variableReference];
108
+ }
109
+ return (_a = options.getVariableValue) === null || _a === void 0 ? void 0 : _a.call(options, { condition, variableReference, normalizedVariableName });
110
+ };
111
+ const toSortableCondition = (condition) => (typeof condition !== 'boolean' ? safeParse(condition) : condition);
112
+ const compareVariationCondition = (a, b, bucketKey) => {
113
+ const aCondition = toSortableCondition(a.condition);
114
+ const bCondition = toSortableCondition(b.condition);
115
+ if (aCondition === bCondition) {
116
+ return 0;
117
+ }
118
+ if (bucketKey === 'lessers') {
119
+ return aCondition <= bCondition ? -1 : 1;
120
+ }
121
+ return aCondition >= bCondition ? -1 : 1;
122
+ };
123
+ const getVariationBucketKey = (conditionType) => {
124
+ var _a;
125
+ if (!conditionType) {
126
+ return undefined;
127
+ }
128
+ return (_a = Object.entries(variationBucketTypes).find(([, conditionTypes]) => conditionTypes.includes(conditionType))) === null || _a === void 0 ? void 0 : _a[0];
129
+ };
130
+ const compareSubscriptionOrder = (currentVariation, previousVariation) => {
131
+ if (typeof currentVariation.conditionType === 'undefined' || typeof previousVariation.conditionType === 'undefined') {
132
+ return 0;
133
+ }
134
+ const currentOrder = subscriptionOrderNumbers[currentVariation.conditionType];
135
+ const previousOrder = subscriptionOrderNumbers[previousVariation.conditionType];
136
+ if (currentOrder === previousOrder) {
137
+ const currentBucketKey = getVariationBucketKey(currentVariation.conditionType);
138
+ const previousBucketKey = getVariationBucketKey(previousVariation.conditionType);
139
+ if (currentBucketKey && currentBucketKey === previousBucketKey) {
140
+ return compareVariationCondition(currentVariation, previousVariation, currentBucketKey);
141
+ }
142
+ return 0;
143
+ }
144
+ return currentOrder > previousOrder ? 1 : -1;
145
+ };
146
+ export const resetVariationCumulativeTracking = (logger = console) => {
147
+ lastCountMultipleIdxByKey.clear();
148
+ logger.debug('Cumulative tracking reset for new stream session');
149
+ };
150
+ const getBaseAlertFallback = (config, options) => {
151
+ var _a;
152
+ if (!isBaseAlertEnabled(config, options)) {
153
+ (_a = options.logger) === null || _a === void 0 ? void 0 : _a.debug('No variation found. Only accepting variations');
154
+ return null;
155
+ }
156
+ return { ...config };
157
+ };
158
+ const isEmptyVariationCondition = (variation) => {
159
+ const condition = variation.condition;
160
+ if (condition === undefined || condition === null) {
161
+ return true;
162
+ }
163
+ if (typeof condition === 'string') {
164
+ return condition.trim().length === 0;
165
+ }
166
+ if (typeof condition === 'number') {
167
+ return Number.isNaN(condition);
168
+ }
169
+ return false;
170
+ };
171
+ const evaluateVariationMatch = ({ variation, condition, config, options, }) => {
172
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s, _t, _u, _v;
173
+ try {
174
+ if (!condition && variation.conditionType !== LumiaVariationConditions.RANDOM) {
175
+ return false;
176
+ }
177
+ if (config.matchEmptyCondition &&
178
+ isEmptyVariationCondition(variation) &&
179
+ variation.conditionType &&
180
+ [
181
+ LumiaVariationConditions.EQUAL_NUMBER,
182
+ LumiaVariationConditions.EQUAL_VARIABLE,
183
+ LumiaVariationConditions.EQUAL_STRING,
184
+ LumiaVariationConditions.EQUAL_SELECTION,
185
+ LumiaVariationConditions.GREATER_NUMBER,
186
+ LumiaVariationConditions.LESS_NUMBER,
187
+ ].includes(variation.conditionType)) {
188
+ return true;
189
+ }
190
+ switch (variation.conditionType) {
191
+ case LumiaVariationConditions.EQUAL_NUMBER:
192
+ return typeof variation.condition !== 'undefined' && safeParse(variation.condition) === safeParse(condition === null || condition === void 0 ? void 0 : condition.value);
193
+ case LumiaVariationConditions.EQUAL_SELECTION: {
194
+ let variationCondition = variation.condition;
195
+ let value = (_a = condition === null || condition === void 0 ? void 0 : condition.name) !== null && _a !== void 0 ? _a : condition === null || condition === void 0 ? void 0 : condition.value;
196
+ if (typeof variationCondition === 'string') {
197
+ variationCondition = variationCondition.toLowerCase();
198
+ }
199
+ if (typeof value === 'string') {
200
+ value = value.toLowerCase();
201
+ }
202
+ return variationCondition == value;
203
+ }
204
+ case LumiaVariationConditions.EQUAL_STRING: {
205
+ const name = (_b = condition === null || condition === void 0 ? void 0 : condition.name) !== null && _b !== void 0 ? _b : condition === null || condition === void 0 ? void 0 : condition.value;
206
+ if (config.caseSensitive) {
207
+ return ((_c = variation.condition) === null || _c === void 0 ? void 0 : _c.toString()) === (name === null || name === void 0 ? void 0 : name.toString());
208
+ }
209
+ return ((_e = (_d = variation.condition) === null || _d === void 0 ? void 0 : _d.toString()) === null || _e === void 0 ? void 0 : _e.toLowerCase()) == ((_f = name === null || name === void 0 ? void 0 : name.toString()) === null || _f === void 0 ? void 0 : _f.toLowerCase());
210
+ }
211
+ case LumiaVariationConditions.EQUAL_VARIABLE: {
212
+ const variableValue = condition ? getVariableValueFromCondition(condition, (_g = variation.conditionExtra) === null || _g === void 0 ? void 0 : _g.toString(), options) : undefined;
213
+ return compareVariationValue({ expected: variation.condition, actual: variableValue, caseSensitive: config.caseSensitive });
214
+ }
215
+ case LumiaVariationConditions.EQUAL_USERNAME: {
216
+ const name = (_h = condition === null || condition === void 0 ? void 0 : condition.username) !== null && _h !== void 0 ? _h : condition === null || condition === void 0 ? void 0 : condition.value;
217
+ return ((_k = (_j = variation.condition) === null || _j === void 0 ? void 0 : _j.toString()) === null || _k === void 0 ? void 0 : _k.toLowerCase()) == ((_l = name === null || name === void 0 ? void 0 : name.toString()) === null || _l === void 0 ? void 0 : _l.toLowerCase());
218
+ }
219
+ case LumiaVariationConditions.EQUAL_USER_LEVEL:
220
+ return Boolean((_m = condition === null || condition === void 0 ? void 0 : condition.lumiauserlevels) === null || _m === void 0 ? void 0 : _m.includes(safeParse(variation.condition)));
221
+ case LumiaVariationConditions.GREATER_NUMBER:
222
+ return typeof variation.condition !== 'undefined' && safeParse(condition === null || condition === void 0 ? void 0 : condition.value) >= safeParse(variation.condition);
223
+ case LumiaVariationConditions.LESS_NUMBER:
224
+ return typeof variation.condition !== 'undefined' && safeParse(condition === null || condition === void 0 ? void 0 : condition.value) <= safeParse(variation.condition);
225
+ case LumiaVariationConditions.EQUAL_CURRENCY_NUMBER: {
226
+ if (typeof variation.condition === 'undefined' || safeParse(variation.condition) !== safeParse(condition === null || condition === void 0 ? void 0 : condition.value)) {
227
+ return false;
228
+ }
229
+ const checkCurrency = (_p = (_o = condition === null || condition === void 0 ? void 0 : condition.currency) === null || _o === void 0 ? void 0 : _o.toUpperCase()) !== null && _p !== void 0 ? _p : condition === null || condition === void 0 ? void 0 : condition.currency;
230
+ return variation.conditionExtra === checkCurrency || variation.conditionExtra === LumiaVariationCurrency.NONE || !variation.conditionExtra;
231
+ }
232
+ case LumiaVariationConditions.GREATER_CURRENCY_NUMBER: {
233
+ const checkCurrency = (_r = (_q = condition === null || condition === void 0 ? void 0 : condition.currency) === null || _q === void 0 ? void 0 : _q.toUpperCase()) !== null && _r !== void 0 ? _r : condition === null || condition === void 0 ? void 0 : condition.currency;
234
+ if (typeof variation.condition !== 'undefined' && safeParse(condition === null || condition === void 0 ? void 0 : condition.value) >= safeParse(variation.condition)) {
235
+ return variation.conditionExtra === checkCurrency || variation.conditionExtra === LumiaVariationCurrency.NONE || !variation.conditionExtra;
236
+ }
237
+ return false;
238
+ }
239
+ case LumiaVariationConditions.GIFT_SUB_EQUAL:
240
+ return typeof variation.condition !== 'undefined' && safeParse(variation.condition) === safeParse(condition === null || condition === void 0 ? void 0 : condition.giftAmount);
241
+ case LumiaVariationConditions.GIFT_SUB_GREATER:
242
+ return typeof variation.condition !== 'undefined' && safeParse(condition === null || condition === void 0 ? void 0 : condition.giftAmount) >= safeParse(variation.condition);
243
+ case LumiaVariationConditions.IS_GIFT:
244
+ return Boolean((condition === null || condition === void 0 ? void 0 : condition.isGift) || (condition === null || condition === void 0 ? void 0 : condition.giftAmount));
245
+ case LumiaVariationConditions.IS_PRIME:
246
+ return Boolean((condition === null || condition === void 0 ? void 0 : condition.isPrime) || (condition === null || condition === void 0 ? void 0 : condition.value) === 'Prime');
247
+ case LumiaVariationConditions.SUBSCRIBED_MONTHS_EQUAL:
248
+ return typeof variation.condition !== 'undefined' && safeParse(variation.condition) === safeParse(condition === null || condition === void 0 ? void 0 : condition.subMonths);
249
+ case LumiaVariationConditions.SUBSCRIBED_MONTHS_GREATER:
250
+ return typeof variation.condition !== 'undefined' && safeParse(condition === null || condition === void 0 ? void 0 : condition.subMonths) >= safeParse(variation.condition);
251
+ case LumiaVariationConditions.RANDOM:
252
+ return rollChance((_u = (_t = (_s = options.getRandomChance) === null || _s === void 0 ? void 0 : _s.call(options, variation)) !== null && _t !== void 0 ? _t : variation.randomChance) !== null && _u !== void 0 ? _u : variation.condition, options.random);
253
+ case LumiaVariationConditions.COUNT_IS_MULTIPLE_OF:
254
+ return evaluateCountIsMultipleOf({ variation, condition, options });
255
+ default:
256
+ return false;
257
+ }
258
+ }
259
+ catch (error) {
260
+ (_v = options.logger) === null || _v === void 0 ? void 0 : _v.error('Error in variationCheck', error, variation, condition);
261
+ return false;
262
+ }
263
+ };
264
+ const evaluateCountIsMultipleOf = ({ variation, condition, options, }) => {
265
+ if (variation.condition === undefined || condition === undefined || condition === null) {
266
+ return false;
267
+ }
268
+ const step = safeParse(variation.condition);
269
+ const totalSource = condition.total !== undefined ? condition.total : options.useConditionValueForCountTotal ? condition.value : undefined;
270
+ const total = safeParse(totalSource);
271
+ const previousTotal = condition.previousTotal === undefined ? undefined : safeParse(condition.previousTotal);
272
+ const key = `${variation.id || 'unknown'}:${variation.name || 'variation'}`;
273
+ const numericStep = Number(step);
274
+ const numericTotal = Number(total);
275
+ if (!Number.isFinite(numericTotal) || !Number.isFinite(numericStep) || numericStep <= 0) {
276
+ return false;
277
+ }
278
+ const currIdx = Math.floor(numericTotal / numericStep);
279
+ const storedIdx = lastCountMultipleIdxByKey.get(key);
280
+ const hasPrevTotal = previousTotal !== undefined;
281
+ const shouldCommit = !options.skipVariationUpdates;
282
+ if (storedIdx !== undefined && currIdx < storedIdx) {
283
+ if (shouldCommit) {
284
+ lastCountMultipleIdxByKey.set(key, currIdx);
285
+ }
286
+ return false;
287
+ }
288
+ let baseIdx = storedIdx;
289
+ if (baseIdx === undefined) {
290
+ if (hasPrevTotal) {
291
+ const numericPreviousTotal = Number(previousTotal);
292
+ if (numericPreviousTotal > numericTotal) {
293
+ if (shouldCommit) {
294
+ lastCountMultipleIdxByKey.set(key, currIdx);
295
+ }
296
+ return false;
297
+ }
298
+ baseIdx = Math.floor(numericPreviousTotal / numericStep);
299
+ }
300
+ else {
301
+ if (shouldCommit) {
302
+ lastCountMultipleIdxByKey.set(key, currIdx);
303
+ }
304
+ return false;
305
+ }
306
+ }
307
+ const crossed = currIdx > baseIdx;
308
+ if (crossed) {
309
+ if (shouldCommit) {
310
+ lastCountMultipleIdxByKey.set(key, currIdx);
311
+ }
312
+ return true;
313
+ }
314
+ if (storedIdx === undefined && shouldCommit) {
315
+ lastCountMultipleIdxByKey.set(key, baseIdx);
316
+ }
317
+ return false;
318
+ };
319
+ const variationCheck = ({ variation, condition, config, options, }) => {
320
+ var _a, _b, _c;
321
+ if (variation.triggerOncePerStream && ((_a = options.hasTriggeredOnce) === null || _a === void 0 ? void 0 : _a.call(options, variation, config))) {
322
+ (_b = options.logger) === null || _b === void 0 ? void 0 : _b.debug('Variation already triggered this stream', variation.name);
323
+ return false;
324
+ }
325
+ const matched = evaluateVariationMatch({ variation, condition, config, options });
326
+ if (matched && variation.triggerOncePerStream && !options.skipVariationUpdates) {
327
+ (_c = options.markTriggeredOnce) === null || _c === void 0 ? void 0 : _c.call(options, variation, config);
328
+ }
329
+ return matched;
330
+ };
331
+ const checkByOrder = (config, condition, options) => {
332
+ var _a;
333
+ if (typeof config.variations === 'undefined') {
334
+ return undefined;
335
+ }
336
+ const variations = config.variations.filter((variation) => isVariationEnabled(variation, config, options)).sort(compareSubscriptionOrder);
337
+ let foundVariation;
338
+ let randoms = [];
339
+ variations.some((variation) => {
340
+ if (typeof variation.conditionType !== 'undefined' && variationBucketTypes.randoms.includes(variation.conditionType)) {
341
+ randoms.push(variation);
342
+ return false;
343
+ }
344
+ if (variationCheck({ variation, condition, config, options })) {
345
+ foundVariation = variation;
346
+ return true;
347
+ }
348
+ return false;
349
+ });
350
+ if (typeof foundVariation === 'undefined' && randoms.length) {
351
+ randoms = shuffle(randoms, options.random);
352
+ randoms.some((variation) => {
353
+ if (variationCheck({ variation, condition, config, options })) {
354
+ foundVariation = variation;
355
+ return true;
356
+ }
357
+ return false;
358
+ });
359
+ if (!foundVariation && ((_a = options.shouldUseRandomFallback) === null || _a === void 0 ? void 0 : _a.call(options, config))) {
360
+ foundVariation = randoms[0];
361
+ }
362
+ }
363
+ return foundVariation;
364
+ };
365
+ const checkByPriorities = (config, condition, options) => {
366
+ if (typeof config.variations === 'undefined') {
367
+ return undefined;
368
+ }
369
+ const variationBucket = {
370
+ equals: [],
371
+ greaters: [],
372
+ lessers: [],
373
+ checks: [],
374
+ randoms: [],
375
+ };
376
+ config.variations.forEach((variation) => {
377
+ if (!isVariationEnabled(variation, config, options) || typeof variation.conditionType === 'undefined') {
378
+ return;
379
+ }
380
+ if (variationBucketTypes.equals.includes(variation.conditionType)) {
381
+ variationBucket.equals.push(variation);
382
+ }
383
+ else if (variationBucketTypes.greaters.includes(variation.conditionType)) {
384
+ variationBucket.greaters.push(variation);
385
+ }
386
+ else if (variationBucketTypes.lessers.includes(variation.conditionType)) {
387
+ variationBucket.lessers.push(variation);
388
+ }
389
+ else if (variationBucketTypes.checks.includes(variation.conditionType)) {
390
+ variationBucket.checks.push(variation);
391
+ }
392
+ else if (variationBucketTypes.randoms.includes(variation.conditionType)) {
393
+ variationBucket.randoms.push(variation);
394
+ }
395
+ });
396
+ Object.keys(variationBucket).forEach((bucketKey) => {
397
+ variationBucket[bucketKey].sort((a, b) => compareVariationCondition(a, b, bucketKey));
398
+ });
399
+ let foundVariation;
400
+ const bucketKeys = ['equals', 'greaters', 'lessers', 'checks', 'randoms'];
401
+ bucketKeys.some((bucketKey) => {
402
+ var _a;
403
+ if (!variationBucket[bucketKey].length) {
404
+ return false;
405
+ }
406
+ const variations = bucketKey === 'randoms' ? shuffle(variationBucket[bucketKey], options.random) : variationBucket[bucketKey];
407
+ variations.some((variation) => {
408
+ if (variationCheck({ variation, condition, config, options })) {
409
+ foundVariation = variation;
410
+ return true;
411
+ }
412
+ return false;
413
+ });
414
+ if (!foundVariation && bucketKey === 'randoms' && ((_a = options.shouldUseRandomFallback) === null || _a === void 0 ? void 0 : _a.call(options, config))) {
415
+ foundVariation = variations[0];
416
+ }
417
+ return Boolean(foundVariation);
418
+ });
419
+ return foundVariation;
420
+ };
421
+ export const checkAlertVariation = (config, condition, options = {}) => {
422
+ var _a, _b;
423
+ if (!config.variations) {
424
+ return getBaseAlertFallback(config, options);
425
+ }
426
+ const foundVariation = ((_a = options.shouldUseSubscriptionOrder) === null || _a === void 0 ? void 0 : _a.call(options, config, condition)) ? checkByOrder(config, condition, options) : checkByPriorities(config, condition, options);
427
+ if (foundVariation) {
428
+ (_b = options.logger) === null || _b === void 0 ? void 0 : _b.debug('Found variation: ', foundVariation === null || foundVariation === void 0 ? void 0 : foundVariation.name);
429
+ return foundVariation;
430
+ }
431
+ return getBaseAlertFallback(config, options);
432
+ };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export { LumiaStreamingSites, LumiaActivityCommandTypes, LumiaExternalActivityCommandTypes, LumiaAlertValues, LumiaAlertFriendlyValues, LumiaActivityOriginTypes, LumiaActivityApiValueType, LumiaActivityNoValueTypes, LumiaActivityTestType, } from './activity.types';
2
2
  export { LumiaVariationConditions, LumiaVariationCurrency, VariationCurrencySymbol, LumiaRedemptionCurrency, LumiaRedemptionCurrencySymbol, LumiaAlertConfigs, LumiaDynamicCondition, type LumiaSelectionOption, } from './alert.types';
3
+ export { checkAlertVariation, resetVariationCumulativeTracking, sanitizeVariationVariableReference, type LumiaVariationCheckerOptions, type LumiaVariationConfigLike, type LumiaVariationLike, type LumiaVariationLogger, } from './variation.helpers';
3
4
  export { ILumiaSendPack, ILumiaEvent, ILumiaEventChatCommandBody, ILumiaEventChatBody, ILumiaEventAlertBody, ILumiaEventStateBody, ILumiaLight, LumiaIntegrations, LumiaEventTypes, } from './event.types';
4
5
  export { LumiaEventListTypes, LumiaMapAlertTypeToEventListType, AlertsToFilter, PlatformsToFilter, LumiaEventListTypeColors, getEventListCategoryColor } from './eventlist.types';
5
6
  export { SystemVariables, ReservedVariables, AllVariables, getAcceptedVariableName, getAcceptedVariableNames, type LumiaAcceptedVariable, type LumiaAcceptedVariableDefinition, type CountableVariableValue, type DonatorVariableValue, } from './variables.types';
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.SongRequestPlaybackTarget = exports.SongRequestProvider = exports.SongRequestSource = exports.SongRequestStatus = exports.VIEWER_PROFILE_ACHIEVEMENTS = exports.YoutubeSuperstickerImageSelections = exports.YoutubeSuperstickersData = exports.TiktokGiftImageSelections = exports.TiktokGiftsData = exports.BLANK_OVERLAY_TEMPLATE_ID = exports.KickKicksImageSelections = exports.KickKicksData = exports.syncLinkedVariableFields = exports.isRedundantInputField = exports.aliasContentImageFromLegacy = exports.coerceNumericAlertFields = exports.buildExampleAlertVariables = exports.getExampleAlertVariableValue = exports.EMULATE_EXAMPLE_AVATAR_URL = exports.formatCondition = exports.getVariableExamples = exports.VARIABLE_EXAMPLES = exports.getAcceptedVariableNames = exports.getAcceptedVariableName = exports.AllVariables = exports.ReservedVariables = exports.SystemVariables = exports.getEventListCategoryColor = exports.LumiaEventListTypeColors = exports.PlatformsToFilter = exports.AlertsToFilter = exports.LumiaMapAlertTypeToEventListType = exports.LumiaEventListTypes = exports.LumiaEventTypes = exports.LumiaIntegrations = exports.LumiaAlertConfigs = exports.LumiaRedemptionCurrencySymbol = exports.LumiaRedemptionCurrency = exports.VariationCurrencySymbol = exports.LumiaVariationCurrency = exports.LumiaVariationConditions = exports.LumiaActivityTestType = exports.LumiaActivityNoValueTypes = exports.LumiaActivityApiValueType = exports.LumiaActivityOriginTypes = exports.LumiaAlertFriendlyValues = exports.LumiaAlertValues = exports.LumiaExternalActivityCommandTypes = exports.LumiaActivityCommandTypes = exports.LumiaStreamingSites = void 0;
3
+ exports.SongRequestStatus = exports.VIEWER_PROFILE_ACHIEVEMENTS = exports.YoutubeSuperstickerImageSelections = exports.YoutubeSuperstickersData = exports.TiktokGiftImageSelections = exports.TiktokGiftsData = exports.BLANK_OVERLAY_TEMPLATE_ID = exports.KickKicksImageSelections = exports.KickKicksData = exports.syncLinkedVariableFields = exports.isRedundantInputField = exports.aliasContentImageFromLegacy = exports.coerceNumericAlertFields = exports.buildExampleAlertVariables = exports.getExampleAlertVariableValue = exports.EMULATE_EXAMPLE_AVATAR_URL = exports.formatCondition = exports.getVariableExamples = exports.VARIABLE_EXAMPLES = exports.getAcceptedVariableNames = exports.getAcceptedVariableName = exports.AllVariables = exports.ReservedVariables = exports.SystemVariables = exports.getEventListCategoryColor = exports.LumiaEventListTypeColors = exports.PlatformsToFilter = exports.AlertsToFilter = exports.LumiaMapAlertTypeToEventListType = exports.LumiaEventListTypes = exports.LumiaEventTypes = exports.LumiaIntegrations = exports.sanitizeVariationVariableReference = exports.resetVariationCumulativeTracking = exports.checkAlertVariation = exports.LumiaAlertConfigs = exports.LumiaRedemptionCurrencySymbol = exports.LumiaRedemptionCurrency = exports.VariationCurrencySymbol = exports.LumiaVariationCurrency = exports.LumiaVariationConditions = exports.LumiaActivityTestType = exports.LumiaActivityNoValueTypes = exports.LumiaActivityApiValueType = exports.LumiaActivityOriginTypes = exports.LumiaAlertFriendlyValues = exports.LumiaAlertValues = exports.LumiaExternalActivityCommandTypes = exports.LumiaActivityCommandTypes = exports.LumiaStreamingSites = void 0;
4
+ exports.SongRequestPlaybackTarget = exports.SongRequestProvider = exports.SongRequestSource = void 0;
4
5
  var activity_types_1 = require("./activity.types");
5
6
  Object.defineProperty(exports, "LumiaStreamingSites", { enumerable: true, get: function () { return activity_types_1.LumiaStreamingSites; } });
6
7
  Object.defineProperty(exports, "LumiaActivityCommandTypes", { enumerable: true, get: function () { return activity_types_1.LumiaActivityCommandTypes; } });
@@ -18,6 +19,10 @@ Object.defineProperty(exports, "VariationCurrencySymbol", { enumerable: true, ge
18
19
  Object.defineProperty(exports, "LumiaRedemptionCurrency", { enumerable: true, get: function () { return alert_types_1.LumiaRedemptionCurrency; } });
19
20
  Object.defineProperty(exports, "LumiaRedemptionCurrencySymbol", { enumerable: true, get: function () { return alert_types_1.LumiaRedemptionCurrencySymbol; } });
20
21
  Object.defineProperty(exports, "LumiaAlertConfigs", { enumerable: true, get: function () { return alert_types_1.LumiaAlertConfigs; } });
22
+ var variation_helpers_1 = require("./variation.helpers");
23
+ Object.defineProperty(exports, "checkAlertVariation", { enumerable: true, get: function () { return variation_helpers_1.checkAlertVariation; } });
24
+ Object.defineProperty(exports, "resetVariationCumulativeTracking", { enumerable: true, get: function () { return variation_helpers_1.resetVariationCumulativeTracking; } });
25
+ Object.defineProperty(exports, "sanitizeVariationVariableReference", { enumerable: true, get: function () { return variation_helpers_1.sanitizeVariationVariableReference; } });
21
26
  var event_types_1 = require("./event.types");
22
27
  Object.defineProperty(exports, "LumiaIntegrations", { enumerable: true, get: function () { return event_types_1.LumiaIntegrations; } });
23
28
  Object.defineProperty(exports, "LumiaEventTypes", { enumerable: true, get: function () { return event_types_1.LumiaEventTypes; } });
@@ -0,0 +1,48 @@
1
+ import { type LumiaDynamicCondition, LumiaVariationConditions, LumiaVariationCurrency } from './alert.types';
2
+ export interface LumiaVariationLike {
3
+ id?: string | number;
4
+ name?: string;
5
+ on?: boolean;
6
+ condition?: string | number | boolean | null;
7
+ conditionType?: LumiaVariationConditions;
8
+ conditionExtra?: LumiaVariationCurrency | string | number | null;
9
+ randomChance?: number;
10
+ triggerOncePerStream?: boolean;
11
+ settings?: {
12
+ enabled?: boolean;
13
+ };
14
+ }
15
+ export interface LumiaVariationConfigLike<TVariation extends LumiaVariationLike> {
16
+ variations?: TVariation[];
17
+ onlyVariation?: boolean;
18
+ disableBaseAlert?: boolean;
19
+ subgift?: boolean;
20
+ on?: boolean;
21
+ matchEmptyCondition?: boolean;
22
+ caseSensitive?: boolean;
23
+ settings?: {
24
+ enabled?: boolean;
25
+ };
26
+ }
27
+ export type LumiaVariationLogger = Pick<Console, 'debug' | 'error'>;
28
+ export interface LumiaVariationCheckerOptions<TConfig extends LumiaVariationConfigLike<TVariation>, TVariation extends LumiaVariationLike> {
29
+ getRandomChance?: (variation: TVariation) => unknown;
30
+ getVariableValue?: (params: {
31
+ condition: LumiaDynamicCondition;
32
+ variableReference?: string;
33
+ normalizedVariableName: string;
34
+ }) => unknown;
35
+ hasTriggeredOnce?: (variation: TVariation, config: TConfig) => boolean;
36
+ isBaseAlertEnabled?: (config: TConfig) => boolean;
37
+ isVariationEnabled?: (variation: TVariation, config: TConfig) => boolean;
38
+ logger?: LumiaVariationLogger;
39
+ markTriggeredOnce?: (variation: TVariation, config: TConfig) => void;
40
+ random?: () => number;
41
+ shouldUseRandomFallback?: (config: TConfig) => boolean;
42
+ shouldUseSubscriptionOrder?: (config: TConfig, condition: LumiaDynamicCondition | undefined | null) => boolean;
43
+ skipVariationUpdates?: boolean;
44
+ useConditionValueForCountTotal?: boolean;
45
+ }
46
+ export declare const sanitizeVariationVariableReference: (value?: string) => string;
47
+ export declare const resetVariationCumulativeTracking: (logger?: LumiaVariationLogger) => void;
48
+ export declare const checkAlertVariation: <TConfig extends LumiaVariationConfigLike<TVariation>, TVariation extends LumiaVariationLike>(config: TConfig, condition: LumiaDynamicCondition | undefined | null, options?: LumiaVariationCheckerOptions<TConfig, TVariation>) => TVariation | TConfig | null;