@liquidcommercedev/rmn-sdk 1.5.0-beta.11 → 1.5.0-beta.13
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.cjs +145 -34
- package/dist/index.esm.js +145 -34
- package/dist/types/common/helpers/utils.helper.d.ts +5 -4
- package/dist/types/modules/helper-service/localstorage.service.d.ts +16 -3
- package/dist/types/modules/monitor/monitor.interface.d.ts +4 -0
- package/package.json +1 -1
- package/umd/liquidcommerce-rmn-sdk.min.js +1 -1
package/dist/index.cjs
CHANGED
@@ -584,6 +584,69 @@ const RB_SPOTS_SELECTION_EXAMPLE = {
|
|
584
584
|
},
|
585
585
|
],
|
586
586
|
};
|
587
|
+
const IAB_SPOTS_SELECTION_EXAMPLE = {
|
588
|
+
banner: [],
|
589
|
+
billboard: [
|
590
|
+
{
|
591
|
+
id: 'kol567',
|
592
|
+
spot: exports.RMN_SPOT_TYPE.BILLBOARD,
|
593
|
+
variant: `${exports.RMN_SPOT_TYPE.BILLBOARD}V2`,
|
594
|
+
width: 1140,
|
595
|
+
height: 640,
|
596
|
+
header: 'Holiday Gift Guide',
|
597
|
+
description: 'Perfect spirits for every occasion',
|
598
|
+
ctaText: 'Shop Gifts',
|
599
|
+
textColor: '#ffffff',
|
600
|
+
ctaTextColor: '#ffffff',
|
601
|
+
primaryImage: 'https://placehold.co/1140x640/png?text=Gift+Guide',
|
602
|
+
mobilePrimaryImage: 'https://placehold.co/640x640/png?text=Mobile+Gifts',
|
603
|
+
events: SPOT_EVENTS_EXAMPLE,
|
604
|
+
productIds: [25, 26],
|
605
|
+
},
|
606
|
+
{
|
607
|
+
id: 'hpm390',
|
608
|
+
spot: exports.RMN_SPOT_TYPE.BILLBOARD,
|
609
|
+
variant: `${exports.RMN_SPOT_TYPE.BILLBOARD}V2`,
|
610
|
+
width: 1140,
|
611
|
+
height: 640,
|
612
|
+
header: 'Summer Wine Festival',
|
613
|
+
description: 'Refreshing wines for summer',
|
614
|
+
ctaText: 'Shop Festival',
|
615
|
+
textColor: '#ffffff',
|
616
|
+
ctaTextColor: '#ffffff',
|
617
|
+
primaryImage: 'https://placehold.co/1140x640/png?text=Wine+Festival',
|
618
|
+
mobilePrimaryImage: 'https://placehold.co/640x640/png?text=Mobile+Festival',
|
619
|
+
events: SPOT_EVENTS_EXAMPLE,
|
620
|
+
productIds: [27, 28],
|
621
|
+
},
|
622
|
+
],
|
623
|
+
button2: [],
|
624
|
+
featurePhoneLargeBanner: [],
|
625
|
+
featurePhoneMediumBanner: [],
|
626
|
+
featurePhoneSmallBanner: [],
|
627
|
+
halfPage: [],
|
628
|
+
inText: [],
|
629
|
+
largeLeaderboard: [],
|
630
|
+
largeRectangle: [],
|
631
|
+
leaderboard: [],
|
632
|
+
mediumRectangle: [],
|
633
|
+
microBar: [],
|
634
|
+
mobilePhoneInterstitial1: [],
|
635
|
+
mobilePhoneInterstitial2: [],
|
636
|
+
mobilePhoneInterstitial3: [],
|
637
|
+
popUp: [],
|
638
|
+
portrait: [],
|
639
|
+
rbProductUpcs: [],
|
640
|
+
skyscraper: [],
|
641
|
+
smallRectangle: [],
|
642
|
+
smallSquare: [],
|
643
|
+
smartphoneBanner1: [],
|
644
|
+
smartphoneBanner2: [],
|
645
|
+
square: [],
|
646
|
+
verticalBanner: [],
|
647
|
+
verticalRectangle: [],
|
648
|
+
wideSkyscraper: [],
|
649
|
+
};
|
587
650
|
|
588
651
|
const REQUEST_CLOUD_PARTNER_SITE = 'X-Liquid-Partner-Site';
|
589
652
|
const REQUEST_CLOUD_PROTECTED_KEY = 'X-Liquid-Protected';
|
@@ -6803,40 +6866,60 @@ class ObjectHelper {
|
|
6803
6866
|
/**
|
6804
6867
|
* Recursively extracts ID values from a nested data structure.
|
6805
6868
|
* Searches for specified property names and collects their primitive values (strings/numbers).
|
6869
|
+
* Captures properties ending with 'id' and any additional specified property names.
|
6806
6870
|
*
|
6807
6871
|
* @param data - The data structure to search through (can be nested objects/arrays)
|
6808
|
-
* @param propertyNames - Array of property names to look for
|
6872
|
+
* @param propertyNames - Array of additional property names to look for (optional)
|
6809
6873
|
* @returns Array of extracted ID values (strings/numbers only)
|
6810
6874
|
*
|
6811
6875
|
* @example
|
6812
6876
|
* const data = {
|
6813
6877
|
* id: [1, 2, 3],
|
6814
|
-
* nested: { id: 'abc' },
|
6815
|
-
* items: [{ id: 456 }]
|
6878
|
+
* nested: { id: 'abc', userId: 123 },
|
6879
|
+
* items: [{ id: 456, productId: '789', sku: 'ABC123' }]
|
6816
6880
|
* };
|
6817
|
-
* extractDeepIds(data); // Returns [1, 2, 3, 'abc', 456]
|
6881
|
+
* extractDeepIds(data); // Returns [1, 2, 3, 'abc', 123, 456, '789', 'ABC123']
|
6818
6882
|
*/
|
6819
6883
|
function extractDeepIds(data, propertyNames) {
|
6820
6884
|
const ids = [];
|
6821
|
-
const
|
6822
|
-
|
6823
|
-
'
|
6824
|
-
'
|
6825
|
-
'
|
6826
|
-
'
|
6827
|
-
'
|
6828
|
-
'
|
6829
|
-
'
|
6830
|
-
'
|
6885
|
+
const defaultPropertyNames = [
|
6886
|
+
// Universal product identifiers
|
6887
|
+
'gtin', // Global Trade Item Number
|
6888
|
+
'gtin8', // 8-digit GTIN
|
6889
|
+
'gtin12', // 12-digit GTIN (UPC)
|
6890
|
+
'gtin13', // 13-digit GTIN (EAN)
|
6891
|
+
'gtin14', // 14-digit GTIN
|
6892
|
+
'mpn', // Manufacturer Part Number
|
6893
|
+
'sku', // Stock Keeping Unit
|
6894
|
+
'upc', // Universal Product Code
|
6895
|
+
'ean', // European Article Number
|
6896
|
+
'isbn', // International Standard Book Number
|
6897
|
+
'isbn10', // 10-digit ISBN
|
6898
|
+
'isbn13', // 13-digit ISBN
|
6899
|
+
'asin', // Amazon Standard Identification Number
|
6900
|
+
// Product codes and references
|
6901
|
+
'coupon',
|
6902
|
+
'barcode',
|
6903
|
+
'product_code',
|
6904
|
+
'part_number',
|
6831
6905
|
'model_number',
|
6832
|
-
'
|
6833
|
-
'variant_id',
|
6906
|
+
'item_variant',
|
6834
6907
|
'item_number',
|
6835
|
-
'
|
6836
|
-
'
|
6908
|
+
'article_number',
|
6909
|
+
'reference',
|
6910
|
+
'groupingId',
|
6837
6911
|
];
|
6838
|
-
//
|
6839
|
-
const
|
6912
|
+
// Convert property names to lowercase for consistent comparison
|
6913
|
+
const additionalProperties = new Set((defaultPropertyNames).map((name) => name.toLowerCase()));
|
6914
|
+
/**
|
6915
|
+
* Checks if a property name is an ID field
|
6916
|
+
* @param key - The property name to check
|
6917
|
+
* @returns boolean indicating if the key is an ID field
|
6918
|
+
*/
|
6919
|
+
const isIdField = (key) => {
|
6920
|
+
const lowercaseKey = key.toLowerCase();
|
6921
|
+
return lowercaseKey.endsWith('id') || additionalProperties.has(lowercaseKey);
|
6922
|
+
};
|
6840
6923
|
/**
|
6841
6924
|
* Processes a value and extracts IDs if it matches criteria
|
6842
6925
|
* @param value - The value to process
|
@@ -6847,7 +6930,7 @@ function extractDeepIds(data, propertyNames) {
|
|
6847
6930
|
if (value == null)
|
6848
6931
|
return;
|
6849
6932
|
// If current key matches our target properties
|
6850
|
-
if (currentKey &&
|
6933
|
+
if (currentKey && isIdField(currentKey)) {
|
6851
6934
|
if (Array.isArray(value)) {
|
6852
6935
|
// Filter and push valid array values in one pass
|
6853
6936
|
ids.push(...value.filter((item) => typeof item === 'string' || typeof item === 'number'));
|
@@ -6869,7 +6952,7 @@ function extractDeepIds(data, propertyNames) {
|
|
6869
6952
|
}
|
6870
6953
|
};
|
6871
6954
|
processValue(data);
|
6872
|
-
return ids;
|
6955
|
+
return ids;
|
6873
6956
|
}
|
6874
6957
|
// Fallback method using fetch if sendBeacon isn't available
|
6875
6958
|
async function fallbackEventFire(url) {
|
@@ -16122,6 +16205,17 @@ var ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX;
|
|
16122
16205
|
ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX[ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX["PRODUCT_IDS"] = 4] = "PRODUCT_IDS";
|
16123
16206
|
ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX[ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX["CREATED_AT"] = 5] = "CREATED_AT";
|
16124
16207
|
})(ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX || (ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX = {}));
|
16208
|
+
const LOCAL_STORAGE_SPOT_EVENTS_ARRAY_INDEX = {
|
16209
|
+
[exports.RMN_SPOT_EVENT.IMPRESSION]: 0,
|
16210
|
+
[exports.RMN_SPOT_EVENT.CLICK]: 1,
|
16211
|
+
[exports.RMN_SPOT_EVENT.PURCHASE]: 2,
|
16212
|
+
[exports.RMN_SPOT_EVENT.ADD_TO_CART]: 3,
|
16213
|
+
[exports.RMN_SPOT_EVENT.REMOVE_FROM_CART]: 4,
|
16214
|
+
[exports.RMN_SPOT_EVENT.ADD_TO_CART_FROM_DETAILS]: 5,
|
16215
|
+
[exports.RMN_SPOT_EVENT.ADD_TO_WISHLIST]: 6,
|
16216
|
+
[exports.RMN_SPOT_EVENT.EXPAND_PRODUCT]: 7,
|
16217
|
+
[exports.RMN_SPOT_EVENT.BUY_NOW]: 8,
|
16218
|
+
};
|
16125
16219
|
class LocalStorageService {
|
16126
16220
|
constructor() {
|
16127
16221
|
if (typeof window.localStorage === 'undefined') {
|
@@ -16149,7 +16243,7 @@ class LocalStorageService {
|
|
16149
16243
|
if (parsedData && typeof parsedData === 'object') {
|
16150
16244
|
const data = {};
|
16151
16245
|
for (const [key, value] of Object.entries(parsedData)) {
|
16152
|
-
data[key] = this.
|
16246
|
+
data[key] = this.spotArrayToObject(value);
|
16153
16247
|
}
|
16154
16248
|
this.spots = this.objectToMap(data);
|
16155
16249
|
}
|
@@ -16189,7 +16283,7 @@ class LocalStorageService {
|
|
16189
16283
|
const data = this.mapToObject(this.spots);
|
16190
16284
|
const dataArray = {};
|
16191
16285
|
for (const [key, value] of Object.entries(data)) {
|
16192
|
-
dataArray[key] = this.
|
16286
|
+
dataArray[key] = this.spotObjectToArray(value);
|
16193
16287
|
}
|
16194
16288
|
try {
|
16195
16289
|
const encryptedData = this.encryptData(JSON.stringify(dataArray));
|
@@ -16220,15 +16314,34 @@ class LocalStorageService {
|
|
16220
16314
|
objectToMap(obj) {
|
16221
16315
|
return new Map(Object.entries(obj));
|
16222
16316
|
}
|
16223
|
-
|
16224
|
-
return
|
16317
|
+
spotEventObjectToArray(events) {
|
16318
|
+
return Object.keys(LOCAL_STORAGE_SPOT_EVENTS_ARRAY_INDEX).map((type) => {
|
16319
|
+
const result = events.find((item) => item.event === type);
|
16320
|
+
return result && result.event === type ? result.url : '';
|
16321
|
+
});
|
16322
|
+
}
|
16323
|
+
spotEventArrayToObject(arr) {
|
16324
|
+
return Object.keys(LOCAL_STORAGE_SPOT_EVENTS_ARRAY_INDEX).map((type) => ({
|
16325
|
+
event: type,
|
16326
|
+
url: arr[LOCAL_STORAGE_SPOT_EVENTS_ARRAY_INDEX[type]],
|
16327
|
+
}));
|
16225
16328
|
}
|
16226
|
-
|
16329
|
+
spotObjectToArray(obj) {
|
16330
|
+
return [
|
16331
|
+
obj.placementId,
|
16332
|
+
obj.spotId,
|
16333
|
+
obj.spotType,
|
16334
|
+
this.spotEventObjectToArray(obj.events),
|
16335
|
+
obj.productIds,
|
16336
|
+
obj.createdAt,
|
16337
|
+
];
|
16338
|
+
}
|
16339
|
+
spotArrayToObject(arr) {
|
16227
16340
|
return {
|
16228
16341
|
placementId: arr[ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX.PLACEMENT_ID],
|
16229
16342
|
spotId: arr[ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX.SPOT_ID],
|
16230
16343
|
spotType: arr[ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX.SPOT_TYPE],
|
16231
|
-
events: arr[ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX.EVENTS],
|
16344
|
+
events: this.spotEventArrayToObject(arr[ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX.EVENTS]),
|
16232
16345
|
productIds: arr[ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX.PRODUCT_IDS],
|
16233
16346
|
createdAt: arr[ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX.CREATED_AT],
|
16234
16347
|
};
|
@@ -16238,16 +16351,14 @@ class LocalStorageService {
|
|
16238
16351
|
return data;
|
16239
16352
|
// For now, we are using base64 encoding to encrypt the data
|
16240
16353
|
// Later we will use Jose encryption
|
16241
|
-
|
16242
|
-
return encryptedData;
|
16354
|
+
return btoa(data);
|
16243
16355
|
}
|
16244
16356
|
decryptData(data) {
|
16245
16357
|
if (!LocalStorageService.encryptData)
|
16246
16358
|
return data;
|
16247
16359
|
// For now, we are using base64 encoding to encrypt
|
16248
16360
|
// Later we will use Jose encryption
|
16249
|
-
|
16250
|
-
return decryptedData;
|
16361
|
+
return atob(data);
|
16251
16362
|
}
|
16252
16363
|
}
|
16253
16364
|
LocalStorageService.localStorageKey = 'lc_rmn';
|
@@ -18895,7 +19006,7 @@ class DataLayerMonitor {
|
|
18895
19006
|
if (!eventName) {
|
18896
19007
|
return null;
|
18897
19008
|
}
|
18898
|
-
const productIds = extractDeepIds(data
|
19009
|
+
const productIds = extractDeepIds(data);
|
18899
19010
|
return {
|
18900
19011
|
event: eventName,
|
18901
19012
|
productIds,
|
@@ -19560,7 +19671,7 @@ class LiquidCommerceRmnClient {
|
|
19560
19671
|
}
|
19561
19672
|
}
|
19562
19673
|
useSpotSelectionExample(inject) {
|
19563
|
-
const examples = RB_SPOTS_SELECTION_EXAMPLE;
|
19674
|
+
const examples = { ...RB_SPOTS_SELECTION_EXAMPLE, ...IAB_SPOTS_SELECTION_EXAMPLE };
|
19564
19675
|
const data = {};
|
19565
19676
|
inject.map((item) => {
|
19566
19677
|
var _a, _b, _c;
|
package/dist/index.esm.js
CHANGED
@@ -582,6 +582,69 @@ const RB_SPOTS_SELECTION_EXAMPLE = {
|
|
582
582
|
},
|
583
583
|
],
|
584
584
|
};
|
585
|
+
const IAB_SPOTS_SELECTION_EXAMPLE = {
|
586
|
+
banner: [],
|
587
|
+
billboard: [
|
588
|
+
{
|
589
|
+
id: 'kol567',
|
590
|
+
spot: RMN_SPOT_TYPE.BILLBOARD,
|
591
|
+
variant: `${RMN_SPOT_TYPE.BILLBOARD}V2`,
|
592
|
+
width: 1140,
|
593
|
+
height: 640,
|
594
|
+
header: 'Holiday Gift Guide',
|
595
|
+
description: 'Perfect spirits for every occasion',
|
596
|
+
ctaText: 'Shop Gifts',
|
597
|
+
textColor: '#ffffff',
|
598
|
+
ctaTextColor: '#ffffff',
|
599
|
+
primaryImage: 'https://placehold.co/1140x640/png?text=Gift+Guide',
|
600
|
+
mobilePrimaryImage: 'https://placehold.co/640x640/png?text=Mobile+Gifts',
|
601
|
+
events: SPOT_EVENTS_EXAMPLE,
|
602
|
+
productIds: [25, 26],
|
603
|
+
},
|
604
|
+
{
|
605
|
+
id: 'hpm390',
|
606
|
+
spot: RMN_SPOT_TYPE.BILLBOARD,
|
607
|
+
variant: `${RMN_SPOT_TYPE.BILLBOARD}V2`,
|
608
|
+
width: 1140,
|
609
|
+
height: 640,
|
610
|
+
header: 'Summer Wine Festival',
|
611
|
+
description: 'Refreshing wines for summer',
|
612
|
+
ctaText: 'Shop Festival',
|
613
|
+
textColor: '#ffffff',
|
614
|
+
ctaTextColor: '#ffffff',
|
615
|
+
primaryImage: 'https://placehold.co/1140x640/png?text=Wine+Festival',
|
616
|
+
mobilePrimaryImage: 'https://placehold.co/640x640/png?text=Mobile+Festival',
|
617
|
+
events: SPOT_EVENTS_EXAMPLE,
|
618
|
+
productIds: [27, 28],
|
619
|
+
},
|
620
|
+
],
|
621
|
+
button2: [],
|
622
|
+
featurePhoneLargeBanner: [],
|
623
|
+
featurePhoneMediumBanner: [],
|
624
|
+
featurePhoneSmallBanner: [],
|
625
|
+
halfPage: [],
|
626
|
+
inText: [],
|
627
|
+
largeLeaderboard: [],
|
628
|
+
largeRectangle: [],
|
629
|
+
leaderboard: [],
|
630
|
+
mediumRectangle: [],
|
631
|
+
microBar: [],
|
632
|
+
mobilePhoneInterstitial1: [],
|
633
|
+
mobilePhoneInterstitial2: [],
|
634
|
+
mobilePhoneInterstitial3: [],
|
635
|
+
popUp: [],
|
636
|
+
portrait: [],
|
637
|
+
rbProductUpcs: [],
|
638
|
+
skyscraper: [],
|
639
|
+
smallRectangle: [],
|
640
|
+
smallSquare: [],
|
641
|
+
smartphoneBanner1: [],
|
642
|
+
smartphoneBanner2: [],
|
643
|
+
square: [],
|
644
|
+
verticalBanner: [],
|
645
|
+
verticalRectangle: [],
|
646
|
+
wideSkyscraper: [],
|
647
|
+
};
|
585
648
|
|
586
649
|
const REQUEST_CLOUD_PARTNER_SITE = 'X-Liquid-Partner-Site';
|
587
650
|
const REQUEST_CLOUD_PROTECTED_KEY = 'X-Liquid-Protected';
|
@@ -6801,40 +6864,60 @@ class ObjectHelper {
|
|
6801
6864
|
/**
|
6802
6865
|
* Recursively extracts ID values from a nested data structure.
|
6803
6866
|
* Searches for specified property names and collects their primitive values (strings/numbers).
|
6867
|
+
* Captures properties ending with 'id' and any additional specified property names.
|
6804
6868
|
*
|
6805
6869
|
* @param data - The data structure to search through (can be nested objects/arrays)
|
6806
|
-
* @param propertyNames - Array of property names to look for
|
6870
|
+
* @param propertyNames - Array of additional property names to look for (optional)
|
6807
6871
|
* @returns Array of extracted ID values (strings/numbers only)
|
6808
6872
|
*
|
6809
6873
|
* @example
|
6810
6874
|
* const data = {
|
6811
6875
|
* id: [1, 2, 3],
|
6812
|
-
* nested: { id: 'abc' },
|
6813
|
-
* items: [{ id: 456 }]
|
6876
|
+
* nested: { id: 'abc', userId: 123 },
|
6877
|
+
* items: [{ id: 456, productId: '789', sku: 'ABC123' }]
|
6814
6878
|
* };
|
6815
|
-
* extractDeepIds(data); // Returns [1, 2, 3, 'abc', 456]
|
6879
|
+
* extractDeepIds(data); // Returns [1, 2, 3, 'abc', 123, 456, '789', 'ABC123']
|
6816
6880
|
*/
|
6817
6881
|
function extractDeepIds(data, propertyNames) {
|
6818
6882
|
const ids = [];
|
6819
|
-
const
|
6820
|
-
|
6821
|
-
'
|
6822
|
-
'
|
6823
|
-
'
|
6824
|
-
'
|
6825
|
-
'
|
6826
|
-
'
|
6827
|
-
'
|
6828
|
-
'
|
6883
|
+
const defaultPropertyNames = [
|
6884
|
+
// Universal product identifiers
|
6885
|
+
'gtin', // Global Trade Item Number
|
6886
|
+
'gtin8', // 8-digit GTIN
|
6887
|
+
'gtin12', // 12-digit GTIN (UPC)
|
6888
|
+
'gtin13', // 13-digit GTIN (EAN)
|
6889
|
+
'gtin14', // 14-digit GTIN
|
6890
|
+
'mpn', // Manufacturer Part Number
|
6891
|
+
'sku', // Stock Keeping Unit
|
6892
|
+
'upc', // Universal Product Code
|
6893
|
+
'ean', // European Article Number
|
6894
|
+
'isbn', // International Standard Book Number
|
6895
|
+
'isbn10', // 10-digit ISBN
|
6896
|
+
'isbn13', // 13-digit ISBN
|
6897
|
+
'asin', // Amazon Standard Identification Number
|
6898
|
+
// Product codes and references
|
6899
|
+
'coupon',
|
6900
|
+
'barcode',
|
6901
|
+
'product_code',
|
6902
|
+
'part_number',
|
6829
6903
|
'model_number',
|
6830
|
-
'
|
6831
|
-
'variant_id',
|
6904
|
+
'item_variant',
|
6832
6905
|
'item_number',
|
6833
|
-
'
|
6834
|
-
'
|
6906
|
+
'article_number',
|
6907
|
+
'reference',
|
6908
|
+
'groupingId',
|
6835
6909
|
];
|
6836
|
-
//
|
6837
|
-
const
|
6910
|
+
// Convert property names to lowercase for consistent comparison
|
6911
|
+
const additionalProperties = new Set((defaultPropertyNames).map((name) => name.toLowerCase()));
|
6912
|
+
/**
|
6913
|
+
* Checks if a property name is an ID field
|
6914
|
+
* @param key - The property name to check
|
6915
|
+
* @returns boolean indicating if the key is an ID field
|
6916
|
+
*/
|
6917
|
+
const isIdField = (key) => {
|
6918
|
+
const lowercaseKey = key.toLowerCase();
|
6919
|
+
return lowercaseKey.endsWith('id') || additionalProperties.has(lowercaseKey);
|
6920
|
+
};
|
6838
6921
|
/**
|
6839
6922
|
* Processes a value and extracts IDs if it matches criteria
|
6840
6923
|
* @param value - The value to process
|
@@ -6845,7 +6928,7 @@ function extractDeepIds(data, propertyNames) {
|
|
6845
6928
|
if (value == null)
|
6846
6929
|
return;
|
6847
6930
|
// If current key matches our target properties
|
6848
|
-
if (currentKey &&
|
6931
|
+
if (currentKey && isIdField(currentKey)) {
|
6849
6932
|
if (Array.isArray(value)) {
|
6850
6933
|
// Filter and push valid array values in one pass
|
6851
6934
|
ids.push(...value.filter((item) => typeof item === 'string' || typeof item === 'number'));
|
@@ -6867,7 +6950,7 @@ function extractDeepIds(data, propertyNames) {
|
|
6867
6950
|
}
|
6868
6951
|
};
|
6869
6952
|
processValue(data);
|
6870
|
-
return ids;
|
6953
|
+
return ids;
|
6871
6954
|
}
|
6872
6955
|
// Fallback method using fetch if sendBeacon isn't available
|
6873
6956
|
async function fallbackEventFire(url) {
|
@@ -16120,6 +16203,17 @@ var ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX;
|
|
16120
16203
|
ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX[ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX["PRODUCT_IDS"] = 4] = "PRODUCT_IDS";
|
16121
16204
|
ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX[ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX["CREATED_AT"] = 5] = "CREATED_AT";
|
16122
16205
|
})(ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX || (ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX = {}));
|
16206
|
+
const LOCAL_STORAGE_SPOT_EVENTS_ARRAY_INDEX = {
|
16207
|
+
[RMN_SPOT_EVENT.IMPRESSION]: 0,
|
16208
|
+
[RMN_SPOT_EVENT.CLICK]: 1,
|
16209
|
+
[RMN_SPOT_EVENT.PURCHASE]: 2,
|
16210
|
+
[RMN_SPOT_EVENT.ADD_TO_CART]: 3,
|
16211
|
+
[RMN_SPOT_EVENT.REMOVE_FROM_CART]: 4,
|
16212
|
+
[RMN_SPOT_EVENT.ADD_TO_CART_FROM_DETAILS]: 5,
|
16213
|
+
[RMN_SPOT_EVENT.ADD_TO_WISHLIST]: 6,
|
16214
|
+
[RMN_SPOT_EVENT.EXPAND_PRODUCT]: 7,
|
16215
|
+
[RMN_SPOT_EVENT.BUY_NOW]: 8,
|
16216
|
+
};
|
16123
16217
|
class LocalStorageService {
|
16124
16218
|
constructor() {
|
16125
16219
|
if (typeof window.localStorage === 'undefined') {
|
@@ -16147,7 +16241,7 @@ class LocalStorageService {
|
|
16147
16241
|
if (parsedData && typeof parsedData === 'object') {
|
16148
16242
|
const data = {};
|
16149
16243
|
for (const [key, value] of Object.entries(parsedData)) {
|
16150
|
-
data[key] = this.
|
16244
|
+
data[key] = this.spotArrayToObject(value);
|
16151
16245
|
}
|
16152
16246
|
this.spots = this.objectToMap(data);
|
16153
16247
|
}
|
@@ -16187,7 +16281,7 @@ class LocalStorageService {
|
|
16187
16281
|
const data = this.mapToObject(this.spots);
|
16188
16282
|
const dataArray = {};
|
16189
16283
|
for (const [key, value] of Object.entries(data)) {
|
16190
|
-
dataArray[key] = this.
|
16284
|
+
dataArray[key] = this.spotObjectToArray(value);
|
16191
16285
|
}
|
16192
16286
|
try {
|
16193
16287
|
const encryptedData = this.encryptData(JSON.stringify(dataArray));
|
@@ -16218,15 +16312,34 @@ class LocalStorageService {
|
|
16218
16312
|
objectToMap(obj) {
|
16219
16313
|
return new Map(Object.entries(obj));
|
16220
16314
|
}
|
16221
|
-
|
16222
|
-
return
|
16315
|
+
spotEventObjectToArray(events) {
|
16316
|
+
return Object.keys(LOCAL_STORAGE_SPOT_EVENTS_ARRAY_INDEX).map((type) => {
|
16317
|
+
const result = events.find((item) => item.event === type);
|
16318
|
+
return result && result.event === type ? result.url : '';
|
16319
|
+
});
|
16320
|
+
}
|
16321
|
+
spotEventArrayToObject(arr) {
|
16322
|
+
return Object.keys(LOCAL_STORAGE_SPOT_EVENTS_ARRAY_INDEX).map((type) => ({
|
16323
|
+
event: type,
|
16324
|
+
url: arr[LOCAL_STORAGE_SPOT_EVENTS_ARRAY_INDEX[type]],
|
16325
|
+
}));
|
16223
16326
|
}
|
16224
|
-
|
16327
|
+
spotObjectToArray(obj) {
|
16328
|
+
return [
|
16329
|
+
obj.placementId,
|
16330
|
+
obj.spotId,
|
16331
|
+
obj.spotType,
|
16332
|
+
this.spotEventObjectToArray(obj.events),
|
16333
|
+
obj.productIds,
|
16334
|
+
obj.createdAt,
|
16335
|
+
];
|
16336
|
+
}
|
16337
|
+
spotArrayToObject(arr) {
|
16225
16338
|
return {
|
16226
16339
|
placementId: arr[ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX.PLACEMENT_ID],
|
16227
16340
|
spotId: arr[ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX.SPOT_ID],
|
16228
16341
|
spotType: arr[ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX.SPOT_TYPE],
|
16229
|
-
events: arr[ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX.EVENTS],
|
16342
|
+
events: this.spotEventArrayToObject(arr[ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX.EVENTS]),
|
16230
16343
|
productIds: arr[ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX.PRODUCT_IDS],
|
16231
16344
|
createdAt: arr[ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX.CREATED_AT],
|
16232
16345
|
};
|
@@ -16236,16 +16349,14 @@ class LocalStorageService {
|
|
16236
16349
|
return data;
|
16237
16350
|
// For now, we are using base64 encoding to encrypt the data
|
16238
16351
|
// Later we will use Jose encryption
|
16239
|
-
|
16240
|
-
return encryptedData;
|
16352
|
+
return btoa(data);
|
16241
16353
|
}
|
16242
16354
|
decryptData(data) {
|
16243
16355
|
if (!LocalStorageService.encryptData)
|
16244
16356
|
return data;
|
16245
16357
|
// For now, we are using base64 encoding to encrypt
|
16246
16358
|
// Later we will use Jose encryption
|
16247
|
-
|
16248
|
-
return decryptedData;
|
16359
|
+
return atob(data);
|
16249
16360
|
}
|
16250
16361
|
}
|
16251
16362
|
LocalStorageService.localStorageKey = 'lc_rmn';
|
@@ -18893,7 +19004,7 @@ class DataLayerMonitor {
|
|
18893
19004
|
if (!eventName) {
|
18894
19005
|
return null;
|
18895
19006
|
}
|
18896
|
-
const productIds = extractDeepIds(data
|
19007
|
+
const productIds = extractDeepIds(data);
|
18897
19008
|
return {
|
18898
19009
|
event: eventName,
|
18899
19010
|
productIds,
|
@@ -19558,7 +19669,7 @@ class LiquidCommerceRmnClient {
|
|
19558
19669
|
}
|
19559
19670
|
}
|
19560
19671
|
useSpotSelectionExample(inject) {
|
19561
|
-
const examples = RB_SPOTS_SELECTION_EXAMPLE;
|
19672
|
+
const examples = { ...RB_SPOTS_SELECTION_EXAMPLE, ...IAB_SPOTS_SELECTION_EXAMPLE };
|
19562
19673
|
const data = {};
|
19563
19674
|
inject.map((item) => {
|
19564
19675
|
var _a, _b, _c;
|
@@ -2,18 +2,19 @@ import type { IFireEventParams } from 'modules/event';
|
|
2
2
|
/**
|
3
3
|
* Recursively extracts ID values from a nested data structure.
|
4
4
|
* Searches for specified property names and collects their primitive values (strings/numbers).
|
5
|
+
* Captures properties ending with 'id' and any additional specified property names.
|
5
6
|
*
|
6
7
|
* @param data - The data structure to search through (can be nested objects/arrays)
|
7
|
-
* @param propertyNames - Array of property names to look for
|
8
|
+
* @param propertyNames - Array of additional property names to look for (optional)
|
8
9
|
* @returns Array of extracted ID values (strings/numbers only)
|
9
10
|
*
|
10
11
|
* @example
|
11
12
|
* const data = {
|
12
13
|
* id: [1, 2, 3],
|
13
|
-
* nested: { id: 'abc' },
|
14
|
-
* items: [{ id: 456 }]
|
14
|
+
* nested: { id: 'abc', userId: 123 },
|
15
|
+
* items: [{ id: 456, productId: '789', sku: 'ABC123' }]
|
15
16
|
* };
|
16
|
-
* extractDeepIds(data); // Returns [1, 2, 3, 'abc', 456]
|
17
|
+
* extractDeepIds(data); // Returns [1, 2, 3, 'abc', 123, 456, '789', 'ABC123']
|
17
18
|
*/
|
18
19
|
export declare function extractDeepIds(data: any, propertyNames?: string[]): Array<string | number>;
|
19
20
|
export declare function fallbackEventFire(url: string): Promise<boolean>;
|
@@ -16,7 +16,7 @@ export type LocalStorageSpotArray = [
|
|
16
16
|
string,
|
17
17
|
string,
|
18
18
|
RMN_SPOT_TYPE,
|
19
|
-
|
19
|
+
string[],
|
20
20
|
Array<string | number>,
|
21
21
|
// PRODUCT_IDS = 4
|
22
22
|
number | undefined
|
@@ -29,6 +29,17 @@ export declare enum ENUM_LOCAL_STORAGE_SPOT_ARRAY_INDEX {
|
|
29
29
|
PRODUCT_IDS = 4,
|
30
30
|
CREATED_AT = 5
|
31
31
|
}
|
32
|
+
export declare const LOCAL_STORAGE_SPOT_EVENTS_ARRAY_INDEX: {
|
33
|
+
readonly IMPRESSION: 0;
|
34
|
+
readonly CLICK: 1;
|
35
|
+
readonly PURCHASE: 2;
|
36
|
+
readonly ADD_TO_CART: 3;
|
37
|
+
readonly REMOVE_FROM_CART: 4;
|
38
|
+
readonly ADD_TO_CART_FROM_DETAILS: 5;
|
39
|
+
readonly ADD_TO_WISHLIST: 6;
|
40
|
+
readonly EXPAND_PRODUCT: 7;
|
41
|
+
readonly BUY_NOW: 8;
|
42
|
+
};
|
32
43
|
export type LocalStorageSpotsArrayType = Record<string, // spotId
|
33
44
|
LocalStorageSpotArray>;
|
34
45
|
export declare class LocalStorageService {
|
@@ -49,8 +60,10 @@ export declare class LocalStorageService {
|
|
49
60
|
private removeExpiredSpots;
|
50
61
|
private mapToObject;
|
51
62
|
private objectToMap;
|
52
|
-
private
|
53
|
-
private
|
63
|
+
private spotEventObjectToArray;
|
64
|
+
private spotEventArrayToObject;
|
65
|
+
private spotObjectToArray;
|
66
|
+
private spotArrayToObject;
|
54
67
|
private encryptData;
|
55
68
|
private decryptData;
|
56
69
|
}
|
package/package.json
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
"name": "@liquidcommercedev/rmn-sdk",
|
3
3
|
"description": "LiquidCommerce RMN SDK",
|
4
4
|
"author": "LiquidCommerce Tech",
|
5
|
-
"version": "1.5.0-beta.
|
5
|
+
"version": "1.5.0-beta.13",
|
6
6
|
"homepage": "https://docs.liquidcommerce.co/rmn-sdk",
|
7
7
|
"main": "./dist/index.cjs",
|
8
8
|
"module": "./dist/index.esm.js",
|