@liquidcommercedev/rmn-sdk 1.5.0-beta.16 → 1.5.0-beta.18

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
@@ -6128,6 +6128,120 @@ function getEventTypeFromRawEvent(event) {
6128
6128
  return null;
6129
6129
  }
6130
6130
 
6131
+ // Configuration object with target field names
6132
+ const extractorConfig = {
6133
+ ids: [
6134
+ // Universal product identifiers
6135
+ 'gtin',
6136
+ 'gtin8',
6137
+ 'gtin12',
6138
+ 'gtin13',
6139
+ 'gtin14',
6140
+ 'mpn',
6141
+ 'sku',
6142
+ 'upc',
6143
+ 'ean',
6144
+ 'isbn',
6145
+ 'isbn10',
6146
+ 'isbn13',
6147
+ 'asin',
6148
+ // Product codes and references
6149
+ 'coupon',
6150
+ 'barcode',
6151
+ 'product_code',
6152
+ 'part_number',
6153
+ 'model_number',
6154
+ 'item_variant',
6155
+ 'item_number',
6156
+ 'article_number',
6157
+ 'reference',
6158
+ 'groupingId',
6159
+ ],
6160
+ price: [
6161
+ 'price',
6162
+ 'unitPrice',
6163
+ 'cost',
6164
+ 'current_price',
6165
+ 'sale_price',
6166
+ 'price_value',
6167
+ 'sale_price_value',
6168
+ 'regular_price',
6169
+ 'discount_price',
6170
+ 'unit_price',
6171
+ 'original_price',
6172
+ 'final_price',
6173
+ 'retail_price',
6174
+ ],
6175
+ };
6176
+ /**
6177
+ * Extracts deep values from an object based on specified target type
6178
+ * @param data - The source data object to extract values from
6179
+ * @param target - The type of values to extract ('ids' or 'price')
6180
+ * @param options - Optional configuration for the extraction process
6181
+ * @returns Array of extracted values or a single value if onlyFirst is true
6182
+ */
6183
+ function extractDeepValues(data, target, options = {}) {
6184
+ const {
6185
+ // eslint-disable-next-line @typescript-eslint/naming-convention
6186
+ onlyFirst = false, shouldIncludeZero = false, } = options;
6187
+ const values = [];
6188
+ const targetProperties = new Set(extractorConfig[target].map((name) => name.toLowerCase()));
6189
+ /**
6190
+ * Checks if a property name matches the target criteria
6191
+ */
6192
+ const isTargetField = (key) => {
6193
+ const normalizedKey = key.toLowerCase();
6194
+ const hasTarget = targetProperties.has(normalizedKey);
6195
+ if (target === 'ids') {
6196
+ return normalizedKey.endsWith('id') || normalizedKey.endsWith('ids') || hasTarget;
6197
+ }
6198
+ return hasTarget;
6199
+ };
6200
+ /**
6201
+ * Validates and normalizes extracted values
6202
+ */
6203
+ const validateValue = (value) => {
6204
+ if (typeof value === 'string') {
6205
+ return value.trim().length > 0;
6206
+ }
6207
+ if (typeof value === 'number') {
6208
+ return !isNaN(value) && (shouldIncludeZero || value !== 0);
6209
+ }
6210
+ return false;
6211
+ };
6212
+ /**
6213
+ * Processes a value and extracts matching fields
6214
+ */
6215
+ const processValue = (value, currentKey) => {
6216
+ // Early exit conditions
6217
+ if (value == null || (onlyFirst && values.length > 0))
6218
+ return;
6219
+ // Process current value if it matches target criteria
6220
+ if (currentKey && isTargetField(currentKey)) {
6221
+ if (Array.isArray(value)) {
6222
+ const validValues = value.filter(validateValue);
6223
+ values.push(...validValues);
6224
+ }
6225
+ else if (validateValue(value)) {
6226
+ values.push(value);
6227
+ }
6228
+ return;
6229
+ }
6230
+ // Recursive processing for nested structures
6231
+ if (Array.isArray(value)) {
6232
+ value.forEach((item) => processValue(item));
6233
+ }
6234
+ else if (typeof value === 'object') {
6235
+ Object.entries(value).forEach(([key, val]) => processValue(val, key));
6236
+ }
6237
+ };
6238
+ processValue(data);
6239
+ // Return based on options
6240
+ if (values.length === 0)
6241
+ return undefined;
6242
+ return onlyFirst ? values[0] : values;
6243
+ }
6244
+
6131
6245
  class SingletonManager {
6132
6246
  /**
6133
6247
  * Retrieves an instance of the specified class using the provided instance creator function.
@@ -6293,97 +6407,6 @@ class ObjectHelper {
6293
6407
  }
6294
6408
  }
6295
6409
 
6296
- /**
6297
- * Recursively extracts ID values from a nested data structure.
6298
- * Searches for specified property names and collects their primitive values (strings/numbers).
6299
- * Captures properties ending with 'id' and any additional specified property names.
6300
- *
6301
- * @param data - The data structure to search through (can be nested objects/arrays)
6302
- * @param propertyNames - Array of additional property names to look for (optional)
6303
- * @returns Array of extracted ID values (strings/numbers only)
6304
- *
6305
- * @example
6306
- * const data = {
6307
- * id: [1, 2, 3],
6308
- * nested: { id: 'abc', userId: 123 },
6309
- * items: [{ id: 456, productId: '789', sku: 'ABC123' }]
6310
- * };
6311
- * extractDeepIds(data); // Returns [1, 2, 3, 'abc', 123, 456, '789', 'ABC123']
6312
- */
6313
- function extractDeepIds(data, propertyNames) {
6314
- const ids = [];
6315
- const defaultPropertyNames = [
6316
- // Universal product identifiers
6317
- 'gtin', // Global Trade Item Number
6318
- 'gtin8', // 8-digit GTIN
6319
- 'gtin12', // 12-digit GTIN (UPC)
6320
- 'gtin13', // 13-digit GTIN (EAN)
6321
- 'gtin14', // 14-digit GTIN
6322
- 'mpn', // Manufacturer Part Number
6323
- 'sku', // Stock Keeping Unit
6324
- 'upc', // Universal Product Code
6325
- 'ean', // European Article Number
6326
- 'isbn', // International Standard Book Number
6327
- 'isbn10', // 10-digit ISBN
6328
- 'isbn13', // 13-digit ISBN
6329
- 'asin', // Amazon Standard Identification Number
6330
- // Product codes and references
6331
- 'coupon',
6332
- 'barcode',
6333
- 'product_code',
6334
- 'part_number',
6335
- 'model_number',
6336
- 'item_variant',
6337
- 'item_number',
6338
- 'article_number',
6339
- 'reference',
6340
- 'groupingId',
6341
- ];
6342
- // Convert property names to lowercase for consistent comparison
6343
- const additionalProperties = new Set((defaultPropertyNames).map((name) => name.toLowerCase()));
6344
- /**
6345
- * Checks if a property name is an ID field
6346
- * @param key - The property name to check
6347
- * @returns boolean indicating if the key is an ID field
6348
- */
6349
- const isIdField = (key) => {
6350
- const lowercaseKey = key.toLowerCase();
6351
- return lowercaseKey.endsWith('id') || additionalProperties.has(lowercaseKey);
6352
- };
6353
- /**
6354
- * Processes a value and extracts IDs if it matches criteria
6355
- * @param value - The value to process
6356
- * @param currentKey - The property name of the current value
6357
- */
6358
- const processValue = (value, currentKey) => {
6359
- // Early exit for null/undefined values
6360
- if (value == null)
6361
- return;
6362
- // If current key matches our target properties
6363
- if (currentKey && isIdField(currentKey)) {
6364
- if (Array.isArray(value)) {
6365
- // Filter and push valid array values in one pass
6366
- ids.push(...value.filter((item) => typeof item === 'string' || typeof item === 'number'));
6367
- }
6368
- else if (typeof value === 'string' || typeof value === 'number') {
6369
- ids.push(value);
6370
- }
6371
- return; // Stop processing this branch after handling the ID
6372
- }
6373
- // Recursively process nested structures
6374
- if (Array.isArray(value)) {
6375
- value.forEach((item) => processValue(item));
6376
- }
6377
- else if (typeof value === 'object') {
6378
- // Process all enumerable properties
6379
- for (const [key, val] of Object.entries(value)) {
6380
- processValue(val, key);
6381
- }
6382
- }
6383
- };
6384
- processValue(data);
6385
- return ids;
6386
- }
6387
6410
  // Fallback method using fetch if sendBeacon isn't available
6388
6411
  async function fallbackEventFire(url) {
6389
6412
  try {
@@ -6409,22 +6432,49 @@ async function fallbackEventFire(url) {
6409
6432
  return false;
6410
6433
  }
6411
6434
  }
6435
+ /**
6436
+ * Helper function to decode base64 string and parse JSON
6437
+ *
6438
+ * @param {string} base64String - The base64 encoded JSON string
6439
+ * @returns {T | null} - Decoded and parsed object or null if invalid
6440
+ */
6441
+ function decodeBase64Json(base64String) {
6442
+ try {
6443
+ return JSON.parse(atob(base64String));
6444
+ }
6445
+ catch (_a) {
6446
+ return null;
6447
+ }
6448
+ }
6412
6449
  /**
6413
6450
  * Extracts and decodes a URL from a base64-encoded query parameter.
6414
6451
  *
6415
6452
  * @param {string} url - The URL containing the base64-encoded query parameter.
6416
6453
  * @returns {string | null} - The decoded URL or null if not found or invalid.
6454
+ * @throws {Error} - If URL is malformed or payload is invalid.
6417
6455
  */
6418
6456
  function getRedirectUrlFromPayload(url) {
6457
+ if (!url)
6458
+ return null;
6419
6459
  try {
6420
- const base64String = new URL(url).searchParams.get('e');
6421
- if (!base64String) {
6460
+ // Extract initial payload
6461
+ const payload = new URL(url).searchParams.get('p');
6462
+ if (!payload)
6422
6463
  return null;
6423
- }
6424
- const data = JSON.parse(atob(base64String));
6425
- return data.ur || null;
6464
+ // Decode first layer
6465
+ const decodedData = decodeBase64Json(payload);
6466
+ if (!(decodedData === null || decodedData === void 0 ? void 0 : decodedData.u))
6467
+ return null;
6468
+ // Extract URL from nested query
6469
+ const eventPayload = new URLSearchParams(decodedData.u).get('e');
6470
+ if (!eventPayload)
6471
+ return null;
6472
+ // Decode second layer
6473
+ const eventData = decodeBase64Json(eventPayload);
6474
+ return (eventData === null || eventData === void 0 ? void 0 : eventData.ur) || null;
6426
6475
  }
6427
6476
  catch (_a) {
6477
+ console.warn('RmnSdk: Failed to extract redirect URL from payload.');
6428
6478
  return null;
6429
6479
  }
6430
6480
  }
@@ -6484,6 +6534,23 @@ function calculateScaleFactor(elementScale) {
6484
6534
  // Math.max ensures the value isn't less than minScale
6485
6535
  return Math.max(minScale, Math.min(maxScale, scaleFactor));
6486
6536
  }
6537
+ /**
6538
+ * Converts an object to a query string.
6539
+ *
6540
+ * @param {Record<string, string|number|undefined|null>} obj - The object to be converted to a query string.
6541
+ * @returns {string} - The query string.
6542
+ */
6543
+ function objectToQueryParams(obj) {
6544
+ return Object.entries(obj !== null && obj !== void 0 ? obj : {})
6545
+ .map(([key, value]) => {
6546
+ if (value == null) {
6547
+ return '';
6548
+ }
6549
+ return `${encodeURIComponent(key)}=${encodeURIComponent(value)}`;
6550
+ })
6551
+ .filter(Boolean)
6552
+ .join('&');
6553
+ }
6487
6554
 
6488
6555
  class UniqueIdGenerator {
6489
6556
  /**
@@ -15781,7 +15848,11 @@ class LocalStorageService {
15781
15848
  }
15782
15849
  // ======================== Utility functions ======================== //
15783
15850
  getUserId() {
15784
- return LocalStorageService.localStorageKey.replace(`${LocalStorageService.localStorageKeyPrefix}_`, '');
15851
+ const key = LocalStorageService.localStorageKey;
15852
+ if (!key) {
15853
+ this.setUserId();
15854
+ }
15855
+ return key.replace(`${LocalStorageService.localStorageKeyPrefix}_`, '');
15785
15856
  }
15786
15857
  /**
15787
15858
  * Sets the user ID in the local storage.
@@ -18652,11 +18723,27 @@ class DataLayerMonitor {
18652
18723
  if (!eventName) {
18653
18724
  return null;
18654
18725
  }
18655
- const productIds = extractDeepIds(data);
18656
- return {
18726
+ const productIds = extractDeepValues(data, 'ids', {
18727
+ onlyFirst: false,
18728
+ shouldIncludeZero: true,
18729
+ });
18730
+ if (Array.isArray(productIds) && productIds.length === 0) {
18731
+ return null;
18732
+ }
18733
+ const normalizedData = {
18657
18734
  event: eventName,
18658
18735
  productIds,
18659
18736
  };
18737
+ if (eventName === RMN_SPOT_EVENT.PURCHASE) {
18738
+ const productPrice = extractDeepValues(data, 'price', {
18739
+ onlyFirst: true,
18740
+ shouldIncludeZero: true,
18741
+ });
18742
+ if (productPrice) {
18743
+ normalizedData.productPrice = productPrice;
18744
+ }
18745
+ }
18746
+ return normalizedData;
18660
18747
  }
18661
18748
  stop() {
18662
18749
  if (this.originalPush) {
@@ -18710,16 +18797,19 @@ class MonitorService {
18710
18797
  if (!spot.productIds.length)
18711
18798
  continue;
18712
18799
  const hasCommonProductIds = spot.productIds.find((productId) => eventProductIds.has(String(productId)));
18713
- if (hasCommonProductIds) {
18714
- if (Object.values(RMN_SPOT_EVENT).includes(eventData.event)) {
18715
- await this.fireAndPublishSpotEvent({
18716
- spotEvent: eventData.event,
18717
- eventUrl: (_b = (_a = spot.events.find((event) => event.event === eventData.event)) === null || _a === void 0 ? void 0 : _a.url) !== null && _b !== void 0 ? _b : '',
18718
- placementId: spot.placementId,
18719
- spotId: spot.spotId,
18720
- });
18721
- }
18800
+ if (!hasCommonProductIds || !Object.values(RMN_SPOT_EVENT).includes(eventData.event)) {
18801
+ continue;
18722
18802
  }
18803
+ const eventUrl = (_b = (_a = spot.events.find((event) => event.event === eventData.event)) === null || _a === void 0 ? void 0 : _a.url) !== null && _b !== void 0 ? _b : '';
18804
+ const additionalQueryParams = objectToQueryParams({
18805
+ override: eventData.productPrice,
18806
+ });
18807
+ await this.fireAndPublishSpotEvent({
18808
+ spotEvent: eventData.event,
18809
+ eventUrl: `${eventUrl}${additionalQueryParams ? `&${additionalQueryParams}` : ''}`,
18810
+ placementId: spot.placementId,
18811
+ spotId: spot.spotId,
18812
+ });
18723
18813
  }
18724
18814
  }
18725
18815
  async fireAndPublishSpotEvent({ spotEvent, eventUrl, placementId, spotId, }) {
@@ -18943,6 +19033,9 @@ class SelectionService extends BaseApi {
18943
19033
  * @return {Promise<ISpots | { error: string }>} - The spots response object.
18944
19034
  */
18945
19035
  async spotSelection(data) {
19036
+ if (data.userId === undefined) {
19037
+ data.userId = this.getUserId();
19038
+ }
18946
19039
  const { isOk, val, isErr } = await this.post(SELECTION_API_PATH, data, {});
18947
19040
  if (isErr) {
18948
19041
  return { error: `There was an error during spot selection: (${isErr === null || isErr === void 0 ? void 0 : isErr.errorMessage})` };
@@ -18954,6 +19047,14 @@ class SelectionService extends BaseApi {
18954
19047
  }
18955
19048
  return { error: 'Spot selection response was not successful' };
18956
19049
  }
19050
+ getUserId() {
19051
+ const isWeb = typeof window !== 'undefined';
19052
+ if (isWeb) {
19053
+ const localStorageService = LocalStorageService.getInstance();
19054
+ return localStorageService.getUserId();
19055
+ }
19056
+ return undefined;
19057
+ }
18957
19058
  }
18958
19059
 
18959
19060
  const SPOT_EVENTS_EXAMPLE = [
@@ -19619,9 +19720,18 @@ async function waitForDOM() {
19619
19720
  });
19620
19721
  });
19621
19722
  }
19723
+ // Sets the id for the user who is browsing the website
19724
+ // This id is used to identify the user and provide personalized content
19725
+ function setUserId() {
19726
+ if (isBrowserEnvironment()) {
19727
+ const localStorageService = LocalStorageService.getInstance();
19728
+ localStorageService.setUserId();
19729
+ }
19730
+ }
19622
19731
 
19623
19732
  /**
19624
19733
  * LiquidCommerce Rmn Client
19734
+ *
19625
19735
  * @class
19626
19736
  */
19627
19737
  class LiquidCommerceRmnClient {
@@ -19750,7 +19860,8 @@ class LiquidCommerceRmnClient {
19750
19860
  * If it is near, make the spot selection request.
19751
19861
  */
19752
19862
  this.intersectionObserver.observe(placement, spotPlacementIsNearCallback, {
19753
- rootMargin: '500px',
19863
+ rootMargin: '1000px',
19864
+ threshold: 0,
19754
19865
  });
19755
19866
  }
19756
19867
  }
@@ -19926,7 +20037,6 @@ class LiquidCommerceRmnClient {
19926
20037
  */
19927
20038
  async injectSpotSelectionRequest(params) {
19928
20039
  const { inject, filter, config } = params;
19929
- const localStorageService = LocalStorageService.getInstance();
19930
20040
  const spots = inject.map((item) => ({
19931
20041
  placementId: item.placementId,
19932
20042
  spot: item.spotType,
@@ -19934,7 +20044,6 @@ class LiquidCommerceRmnClient {
19934
20044
  ...item === null || item === void 0 ? void 0 : item.filter,
19935
20045
  }));
19936
20046
  const request = {
19937
- userId: localStorageService.getUserId(),
19938
20047
  url: config === null || config === void 0 ? void 0 : config.url,
19939
20048
  filter,
19940
20049
  spots,
@@ -19953,6 +20062,7 @@ class LiquidCommerceRmnClient {
19953
20062
  async function RmnClient(apiKey, config) {
19954
20063
  const authService = AuthService.getInstance(apiKey, config.env);
19955
20064
  const credentials = await authService.initialize();
20065
+ setUserId();
19956
20066
  return new LiquidCommerceRmnClient(credentials);
19957
20067
  }
19958
20068
  /**
@@ -0,0 +1,14 @@
1
+ type ExtractorTarget = 'ids' | 'price';
2
+ type ExtractedValue = string | number;
3
+ /**
4
+ * Extracts deep values from an object based on specified target type
5
+ * @param data - The source data object to extract values from
6
+ * @param target - The type of values to extract ('ids' or 'price')
7
+ * @param options - Optional configuration for the extraction process
8
+ * @returns Array of extracted values or a single value if onlyFirst is true
9
+ */
10
+ export declare function extractDeepValues(data: unknown, target: ExtractorTarget, options?: {
11
+ onlyFirst?: boolean;
12
+ shouldIncludeZero?: boolean;
13
+ }): ExtractedValue[] | ExtractedValue | undefined;
14
+ export {};
@@ -1,4 +1,5 @@
1
1
  export * from './event-type.helper';
2
+ export * from './extract-deep.helper';
2
3
  export * from './helpers.interface';
3
4
  export * from './object.helper';
4
5
  export * from './string.helper';
@@ -1,28 +1,18 @@
1
1
  import type { IFireEventParams } from 'modules/event';
2
+ export declare function fallbackEventFire(url: string): Promise<boolean>;
2
3
  /**
3
- * Recursively extracts ID values from a nested data structure.
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.
6
- *
7
- * @param data - The data structure to search through (can be nested objects/arrays)
8
- * @param propertyNames - Array of additional property names to look for (optional)
9
- * @returns Array of extracted ID values (strings/numbers only)
4
+ * Helper function to decode base64 string and parse JSON
10
5
  *
11
- * @example
12
- * const data = {
13
- * id: [1, 2, 3],
14
- * nested: { id: 'abc', userId: 123 },
15
- * items: [{ id: 456, productId: '789', sku: 'ABC123' }]
16
- * };
17
- * extractDeepIds(data); // Returns [1, 2, 3, 'abc', 123, 456, '789', 'ABC123']
6
+ * @param {string} base64String - The base64 encoded JSON string
7
+ * @returns {T | null} - Decoded and parsed object or null if invalid
18
8
  */
19
- export declare function extractDeepIds(data: any, propertyNames?: string[]): Array<string | number>;
20
- export declare function fallbackEventFire(url: string): Promise<boolean>;
9
+ export declare function decodeBase64Json<T>(base64String: string): T | null;
21
10
  /**
22
11
  * Extracts and decodes a URL from a base64-encoded query parameter.
23
12
  *
24
13
  * @param {string} url - The URL containing the base64-encoded query parameter.
25
14
  * @returns {string | null} - The decoded URL or null if not found or invalid.
15
+ * @throws {Error} - If URL is malformed or payload is invalid.
26
16
  */
27
17
  export declare function getRedirectUrlFromPayload(url: string): string | null;
28
18
  /**
@@ -36,3 +26,10 @@ export declare function getRedirectUrlFromPayload(url: string): string | null;
36
26
  */
37
27
  export declare function fireEvent({ event, eventUrl }: IFireEventParams): Promise<void>;
38
28
  export declare function calculateScaleFactor(elementScale: number): number;
29
+ /**
30
+ * Converts an object to a query string.
31
+ *
32
+ * @param {Record<string, string|number|undefined|null>} obj - The object to be converted to a query string.
33
+ * @returns {string} - The query string.
34
+ */
35
+ export declare function objectToQueryParams(obj?: Record<string, string | number | undefined | null>): string;
@@ -6,6 +6,7 @@ export interface IDataLayerEvent {
6
6
  export interface INormalizedEventData {
7
7
  event: RMN_SPOT_EVENT;
8
8
  productIds: Array<string | number>;
9
+ productPrice?: number;
9
10
  }
10
11
  export interface IFireAndPublishSpotEventParams {
11
12
  spotEvent: RMN_SPOT_EVENT;
@@ -2,14 +2,20 @@ import type { RMN_SPOT_EVENT, RMN_SPOT_TYPE } from 'enums';
2
2
  import type { PlacementIdType, SpotVariantType } from 'modules/selection';
3
3
  import type { RmnFilterType, RmnSpotType } from 'types';
4
4
  export interface ISpotSelectionParams {
5
- url?: string;
6
5
  spots: RmnSpotType[];
7
6
  filter?: Partial<RmnFilterType>;
7
+ userId?: string;
8
+ url?: string;
8
9
  }
9
10
  export interface ISpotEvent {
10
11
  event: RMN_SPOT_EVENT;
11
12
  url: string;
12
13
  }
14
+ export interface ISpotEventPayload {
15
+ e: number;
16
+ u: string;
17
+ ss: string;
18
+ }
13
19
  export interface ISpot {
14
20
  id: string;
15
21
  events: ISpotEvent[];
@@ -15,4 +15,5 @@ export declare class SelectionService extends BaseApi implements ISelectionServi
15
15
  spotSelection(data: ISpotSelectionParams): Promise<ISpots | {
16
16
  error: string;
17
17
  }>;
18
+ private getUserId;
18
19
  }
@@ -4,6 +4,7 @@ import type { ISpot, ISpots, ISpotSelectionParams } from 'modules/selection';
4
4
  import type { IRmnClient, IRmnConfig, IRmnEventManager } from 'types';
5
5
  /**
6
6
  * LiquidCommerce Rmn Client
7
+ *
7
8
  * @class
8
9
  */
9
10
  export declare class LiquidCommerceRmnClient implements IRmnClient {
@@ -38,3 +38,4 @@ export declare function waitForDOM(): Promise<void>;
38
38
  export declare function useSpotSelectionExample(inject: IInjectSpotElement[]): Promise<ISpots | {
39
39
  error: string;
40
40
  }>;
41
+ export declare function setUserId(): void;
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.16",
5
+ "version": "1.5.0-beta.18",
6
6
  "homepage": "https://docs.liquidcommerce.co/rmn-sdk",
7
7
  "main": "./dist/index.cjs",
8
8
  "module": "./dist/index.esm.js",