Skip to content

Commit a08f703

Browse files
committed
fix: replace nested ternaries with if/else for GTM compatibility and add unit tests
1 parent 1dcea8e commit a08f703

File tree

5 files changed

+829
-137
lines changed

5 files changed

+829
-137
lines changed

src/template-parameters.json

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,26 @@
531531
}
532532
]
533533
},
534+
{
535+
"displayName": "Infer Query ID",
536+
"name": "inferQueryID",
537+
"help": "When enabled, the search-insights library will attempt to look up the queryID from its internal cache instead of requiring it to be passed explicitly.",
538+
"type": "CHECKBOX",
539+
"simpleValueType": true,
540+
"defaultValue": false,
541+
"enablingConditions": [
542+
{
543+
"paramName": "method",
544+
"type": "EQUALS",
545+
"paramValue": "convertedObjectIDs"
546+
},
547+
{
548+
"paramName": "method",
549+
"type": "EQUALS",
550+
"paramValue": "convertedObjectIDsAfterSearch"
551+
}
552+
]
553+
},
534554
{
535555
"displayName": "Positions",
536556
"name": "positions",

src/template.ts

Lines changed: 64 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,23 @@
11
import type {
22
InsightsClient,
3-
InsightsEvent,
43
Init,
54
InsightsEventObjectData,
5+
InsightsAdditionalEventParams,
66
} from 'search-insights';
7+
import type {
8+
InsightsSearchClickEvent,
9+
InsightsClickObjectIDsEvent,
10+
InsightsClickFiltersEvent,
11+
} from '../node_modules/search-insights/dist/click';
12+
import type {
13+
InsightsSearchConversionEvent,
14+
InsightsSearchConversionObjectIDsEvent,
15+
InsightsSearchConversionFiltersEvent,
16+
} from '../node_modules/search-insights/dist/conversion';
17+
import type {
18+
InsightsSearchViewObjectIDsEvent,
19+
InsightsSearchViewFiltersEvent,
20+
} from '../node_modules/search-insights/dist/view';
721
import { devDependencies, version } from '../package.json';
822

923
const log = require('logToConsole');
@@ -125,6 +139,18 @@ function transformObjectData(
125139
});
126140
}
127141

142+
function getConvertedObjectIDsAfterSearchMethod(subtype: GtmEventSubtype) {
143+
if (subtype === 'addToCart') return 'addedToCartObjectIDsAfterSearch' as const;
144+
if (subtype === 'purchase') return 'purchasedObjectIDsAfterSearch' as const;
145+
return 'convertedObjectIDsAfterSearch' as const;
146+
}
147+
148+
function getConvertedObjectIDsMethod(subtype: GtmEventSubtype) {
149+
if (subtype === 'addToCart') return 'addedToCartObjectIDs' as const;
150+
if (subtype === 'purchase') return 'purchasedObjectIDs' as const;
151+
return 'convertedObjectIDs' as const;
152+
}
153+
128154
function getLibraryURL(useIIFE: boolean) {
129155
return (
130156
INSIGHTS_LIBRARY_URL +
@@ -291,23 +317,17 @@ switch (data.method) {
291317
break;
292318
}
293319

294-
const payload: InsightsEvent = {
295-
eventType: 'view',
320+
const payload: InsightsSearchViewObjectIDsEvent = {
296321
eventName: data.eventName,
297322
index: data.index,
298323
objectIDs: formatValueToList(data.objectIDs),
299-
objectData: transformObjectData(data.objectData),
300324
userToken: data.userToken,
301325
authenticatedUserToken: data.authenticatedUserToken,
302326
};
303-
const chunks = chunkPayload(
304-
payload,
305-
['objectIDs', 'objectData'],
306-
MAX_OBJECT_IDS
307-
);
327+
const chunks = chunkPayload(payload, ['objectIDs'], MAX_OBJECT_IDS);
308328

309-
logger('sendEvents', chunks);
310-
aa('sendEvents', chunks);
329+
logger('viewedObjectIDs', chunks);
330+
chunks.forEach((chunk) => aa('viewedObjectIDs', chunk));
311331
data.gtmOnSuccess();
312332
break;
313333
}
@@ -319,25 +339,23 @@ switch (data.method) {
319339
break;
320340
}
321341

322-
const payload: InsightsEvent = {
323-
eventType: 'click',
342+
const payload: InsightsSearchClickEvent = {
324343
eventName: data.eventName,
325344
index: data.index,
326345
objectIDs: formatValueToList(data.objectIDs),
327-
objectData: transformObjectData(data.objectData),
328346
positions: formatValueToList(data.positions).map(makeInteger),
329347
queryID: data.queryID,
330348
userToken: data.userToken,
331349
authenticatedUserToken: data.authenticatedUserToken,
332350
};
333351
const chunks = chunkPayload(
334352
payload,
335-
['objectIDs', 'objectData', 'positions'],
353+
['objectIDs', 'positions'],
336354
MAX_OBJECT_IDS
337355
);
338356

339-
logger('sendEvents', chunks);
340-
aa('sendEvents', chunks);
357+
logger('clickedObjectIDsAfterSearch', chunks);
358+
chunks.forEach((chunk) => aa('clickedObjectIDsAfterSearch', chunk));
341359
data.gtmOnSuccess();
342360
break;
343361
}
@@ -349,24 +367,17 @@ switch (data.method) {
349367
break;
350368
}
351369

352-
const payload: InsightsEvent = {
353-
eventType: 'click',
370+
const payload: InsightsClickObjectIDsEvent = {
354371
eventName: data.eventName,
355372
index: data.index,
356-
queryID: data.queryID,
357373
objectIDs: formatValueToList(data.objectIDs),
358-
objectData: transformObjectData(data.objectData),
359374
userToken: data.userToken,
360375
authenticatedUserToken: data.authenticatedUserToken,
361376
};
362-
const chunks = chunkPayload(
363-
payload,
364-
['objectIDs', 'objectData'],
365-
MAX_OBJECT_IDS
366-
);
377+
const chunks = chunkPayload(payload, ['objectIDs'], MAX_OBJECT_IDS);
367378

368-
logger('sendEvents', chunks);
369-
aa('sendEvents', chunks);
379+
logger('clickedObjectIDs', chunks);
380+
chunks.forEach((chunk) => aa('clickedObjectIDs', chunk));
370381
data.gtmOnSuccess();
371382
break;
372383
}
@@ -378,8 +389,7 @@ switch (data.method) {
378389
break;
379390
}
380391

381-
const payload: InsightsEvent = {
382-
eventType: 'click',
392+
const payload: InsightsClickFiltersEvent = {
383393
eventName: data.eventName,
384394
filters: formatValueToList(data.filters),
385395
index: data.index,
@@ -388,8 +398,8 @@ switch (data.method) {
388398
};
389399
const chunks = chunkPayload(payload, ['filters'], MAX_FILTERS);
390400

391-
logger('sendEvents', chunks);
392-
aa('sendEvents', chunks);
401+
logger('clickedFilters', chunks);
402+
chunks.forEach((chunk) => aa('clickedFilters', chunk));
393403
data.gtmOnSuccess();
394404
break;
395405
}
@@ -401,8 +411,9 @@ switch (data.method) {
401411
break;
402412
}
403413

404-
const payload: InsightsEvent = {
405-
eventType: 'conversion',
414+
const methodName = getConvertedObjectIDsAfterSearchMethod(data.eventSubtype);
415+
416+
const payload: InsightsSearchConversionEvent = {
406417
eventName: data.eventName,
407418
index: data.index,
408419
objectIDs: formatValueToList(data.objectIDs),
@@ -413,17 +424,17 @@ switch (data.method) {
413424
value: data.value,
414425
currency: data.currency,
415426
};
416-
if (data.eventSubtype) {
417-
payload.eventSubtype = data.eventSubtype;
418-
}
419427
const chunks = chunkPayload(
420428
payload,
421429
['objectIDs', 'objectData'],
422430
MAX_OBJECT_IDS
423431
);
424432

425-
logger('sendEvents', chunks);
426-
aa('sendEvents', chunks);
433+
logger(methodName, chunks);
434+
const additionalParams: InsightsAdditionalEventParams = data.inferQueryID
435+
? { inferQueryID: true }
436+
: {};
437+
chunks.forEach((chunk) => aa(methodName, chunk, additionalParams));
427438
data.gtmOnSuccess();
428439
break;
429440
}
@@ -435,8 +446,9 @@ switch (data.method) {
435446
break;
436447
}
437448

438-
const payload: InsightsEvent = {
439-
eventType: 'conversion',
449+
const methodName = getConvertedObjectIDsMethod(data.eventSubtype);
450+
451+
const payload: InsightsSearchConversionObjectIDsEvent = {
440452
eventName: data.eventName,
441453
index: data.index,
442454
objectIDs: formatValueToList(data.objectIDs),
@@ -446,17 +458,17 @@ switch (data.method) {
446458
value: data.value,
447459
currency: data.currency,
448460
};
449-
if (data.eventSubtype) {
450-
payload.eventSubtype = data.eventSubtype;
451-
}
452461
const chunks = chunkPayload(
453462
payload,
454463
['objectIDs', 'objectData'],
455464
MAX_OBJECT_IDS
456465
);
457466

458-
logger('sendEvents', chunks);
459-
aa('sendEvents', chunks);
467+
logger(methodName, chunks);
468+
const additionalParams: InsightsAdditionalEventParams = data.inferQueryID
469+
? { inferQueryID: true }
470+
: {};
471+
chunks.forEach((chunk) => aa(methodName, chunk, additionalParams));
460472
data.gtmOnSuccess();
461473
break;
462474
}
@@ -468,23 +480,17 @@ switch (data.method) {
468480
break;
469481
}
470482

471-
const payload: InsightsEvent = {
472-
eventType: 'conversion',
483+
const payload: InsightsSearchConversionFiltersEvent = {
473484
eventName: data.eventName,
474485
filters: formatValueToList(data.filters),
475486
index: data.index,
476487
userToken: data.userToken,
477488
authenticatedUserToken: data.authenticatedUserToken,
478-
value: data.value,
479-
currency: data.currency,
480489
};
481-
if (data.eventSubtype) {
482-
payload.eventSubtype = data.eventSubtype;
483-
}
484490
const chunks = chunkPayload(payload, ['filters'], MAX_FILTERS);
485491

486-
logger('sendEvents', chunks);
487-
aa('sendEvents', chunks);
492+
logger('convertedFilters', chunks);
493+
chunks.forEach((chunk) => aa('convertedFilters', chunk));
488494
data.gtmOnSuccess();
489495
break;
490496
}
@@ -496,8 +502,7 @@ switch (data.method) {
496502
break;
497503
}
498504

499-
const payload: InsightsEvent = {
500-
eventType: 'view',
505+
const payload: InsightsSearchViewFiltersEvent = {
501506
eventName: data.eventName,
502507
filters: formatValueToList(data.filters),
503508
index: data.index,
@@ -506,8 +511,8 @@ switch (data.method) {
506511
};
507512
const chunks = chunkPayload(payload, ['filters'], MAX_FILTERS);
508513

509-
logger('sendEvents', chunks);
510-
aa('sendEvents', chunks);
514+
logger('viewedFilters', chunks);
515+
chunks.forEach((chunk) => aa('viewedFilters', chunk));
511516
data.gtmOnSuccess();
512517
break;
513518
}

0 commit comments

Comments
 (0)