@athoscommerce/beacon 1.0.0

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.
Files changed (590) hide show
  1. package/.github/workflows/merge.yml +28 -0
  2. package/.github/workflows/publish.yml +45 -0
  3. package/.github/workflows/tests.yml +22 -0
  4. package/.versionrc +18 -0
  5. package/CHANGELOG.md +249 -0
  6. package/README.md +970 -0
  7. package/beacon.v2.snap.types.oas.yaml +3213 -0
  8. package/dist/cdn/beacon.js +2 -0
  9. package/dist/cdn/beacon.js.LICENSE.txt +1 -0
  10. package/dist/cjs/package.json +78 -0
  11. package/dist/cjs/src/Beacon.d.ts +181 -0
  12. package/dist/cjs/src/Beacon.d.ts.map +1 -0
  13. package/dist/cjs/src/Beacon.js +1153 -0
  14. package/dist/cjs/src/client/apis/AutocompleteApi.d.ts +89 -0
  15. package/dist/cjs/src/client/apis/AutocompleteApi.d.ts.map +1 -0
  16. package/dist/cjs/src/client/apis/AutocompleteApi.js +378 -0
  17. package/dist/cjs/src/client/apis/CartApi.d.ts +47 -0
  18. package/dist/cjs/src/client/apis/CartApi.d.ts.map +1 -0
  19. package/dist/cjs/src/client/apis/CartApi.js +219 -0
  20. package/dist/cjs/src/client/apis/CategoryApi.d.ts +75 -0
  21. package/dist/cjs/src/client/apis/CategoryApi.d.ts.map +1 -0
  22. package/dist/cjs/src/client/apis/CategoryApi.js +325 -0
  23. package/dist/cjs/src/client/apis/ErrorLogsApi.d.ts +61 -0
  24. package/dist/cjs/src/client/apis/ErrorLogsApi.d.ts.map +1 -0
  25. package/dist/cjs/src/client/apis/ErrorLogsApi.js +272 -0
  26. package/dist/cjs/src/client/apis/MessagingRecommendationsApi.d.ts +75 -0
  27. package/dist/cjs/src/client/apis/MessagingRecommendationsApi.d.ts.map +1 -0
  28. package/dist/cjs/src/client/apis/MessagingRecommendationsApi.js +325 -0
  29. package/dist/cjs/src/client/apis/OrderApi.d.ts +33 -0
  30. package/dist/cjs/src/client/apis/OrderApi.d.ts.map +1 -0
  31. package/dist/cjs/src/client/apis/OrderApi.js +166 -0
  32. package/dist/cjs/src/client/apis/ProductApi.d.ts +33 -0
  33. package/dist/cjs/src/client/apis/ProductApi.d.ts.map +1 -0
  34. package/dist/cjs/src/client/apis/ProductApi.js +166 -0
  35. package/dist/cjs/src/client/apis/RecommendationsApi.d.ts +75 -0
  36. package/dist/cjs/src/client/apis/RecommendationsApi.d.ts.map +1 -0
  37. package/dist/cjs/src/client/apis/RecommendationsApi.js +325 -0
  38. package/dist/cjs/src/client/apis/SearchApi.d.ts +89 -0
  39. package/dist/cjs/src/client/apis/SearchApi.d.ts.map +1 -0
  40. package/dist/cjs/src/client/apis/SearchApi.js +378 -0
  41. package/dist/cjs/src/client/apis/ShopperApi.d.ts +33 -0
  42. package/dist/cjs/src/client/apis/ShopperApi.d.ts.map +1 -0
  43. package/dist/cjs/src/client/apis/ShopperApi.js +166 -0
  44. package/dist/cjs/src/client/apis/index.d.ts +11 -0
  45. package/dist/cjs/src/client/apis/index.d.ts.map +1 -0
  46. package/dist/cjs/src/client/apis/index.js +28 -0
  47. package/dist/cjs/src/client/index.d.ts +4 -0
  48. package/dist/cjs/src/client/index.d.ts.map +1 -0
  49. package/dist/cjs/src/client/index.js +21 -0
  50. package/dist/cjs/src/client/models/AddtocartSchema.d.ts +41 -0
  51. package/dist/cjs/src/client/models/AddtocartSchema.d.ts.map +1 -0
  52. package/dist/cjs/src/client/models/AddtocartSchema.js +57 -0
  53. package/dist/cjs/src/client/models/AddtocartSchemaData.d.ts +40 -0
  54. package/dist/cjs/src/client/models/AddtocartSchemaData.d.ts.map +1 -0
  55. package/dist/cjs/src/client/models/AddtocartSchemaData.js +56 -0
  56. package/dist/cjs/src/client/models/AttributionInner.d.ts +39 -0
  57. package/dist/cjs/src/client/models/AttributionInner.d.ts.map +1 -0
  58. package/dist/cjs/src/client/models/AttributionInner.js +55 -0
  59. package/dist/cjs/src/client/models/BannersInner.d.ts +33 -0
  60. package/dist/cjs/src/client/models/BannersInner.d.ts.map +1 -0
  61. package/dist/cjs/src/client/models/BannersInner.js +51 -0
  62. package/dist/cjs/src/client/models/CartSchema.d.ts +41 -0
  63. package/dist/cjs/src/client/models/CartSchema.d.ts.map +1 -0
  64. package/dist/cjs/src/client/models/CartSchema.js +57 -0
  65. package/dist/cjs/src/client/models/CartSchemaData.d.ts +40 -0
  66. package/dist/cjs/src/client/models/CartSchemaData.d.ts.map +1 -0
  67. package/dist/cjs/src/client/models/CartSchemaData.js +56 -0
  68. package/dist/cjs/src/client/models/ClickthroughBannersInner.d.ts +33 -0
  69. package/dist/cjs/src/client/models/ClickthroughBannersInner.d.ts.map +1 -0
  70. package/dist/cjs/src/client/models/ClickthroughBannersInner.js +51 -0
  71. package/dist/cjs/src/client/models/ClickthroughBannersSchema.d.ts +40 -0
  72. package/dist/cjs/src/client/models/ClickthroughBannersSchema.d.ts.map +1 -0
  73. package/dist/cjs/src/client/models/ClickthroughBannersSchema.js +56 -0
  74. package/dist/cjs/src/client/models/ClickthroughBannersSchema1.d.ts +46 -0
  75. package/dist/cjs/src/client/models/ClickthroughBannersSchema1.d.ts.map +1 -0
  76. package/dist/cjs/src/client/models/ClickthroughBannersSchema1.js +60 -0
  77. package/dist/cjs/src/client/models/ClickthroughResultsInner.d.ts +24 -0
  78. package/dist/cjs/src/client/models/ClickthroughResultsInner.d.ts.map +1 -0
  79. package/dist/cjs/src/client/models/ClickthroughResultsInner.js +58 -0
  80. package/dist/cjs/src/client/models/ClickthroughResultsSchema.d.ts +40 -0
  81. package/dist/cjs/src/client/models/ClickthroughResultsSchema.d.ts.map +1 -0
  82. package/dist/cjs/src/client/models/ClickthroughResultsSchema.js +56 -0
  83. package/dist/cjs/src/client/models/ClickthroughResultsSchema1.d.ts +46 -0
  84. package/dist/cjs/src/client/models/ClickthroughResultsSchema1.d.ts.map +1 -0
  85. package/dist/cjs/src/client/models/ClickthroughResultsSchema1.js +60 -0
  86. package/dist/cjs/src/client/models/ClickthroughSchema.d.ts +41 -0
  87. package/dist/cjs/src/client/models/ClickthroughSchema.d.ts.map +1 -0
  88. package/dist/cjs/src/client/models/ClickthroughSchema.js +57 -0
  89. package/dist/cjs/src/client/models/ClickthroughSchemaData.d.ts +24 -0
  90. package/dist/cjs/src/client/models/ClickthroughSchemaData.d.ts.map +1 -0
  91. package/dist/cjs/src/client/models/ClickthroughSchemaData.js +58 -0
  92. package/dist/cjs/src/client/models/Context.d.ts +101 -0
  93. package/dist/cjs/src/client/models/Context.d.ts.map +1 -0
  94. package/dist/cjs/src/client/models/Context.js +85 -0
  95. package/dist/cjs/src/client/models/Currency.d.ts +33 -0
  96. package/dist/cjs/src/client/models/Currency.d.ts.map +1 -0
  97. package/dist/cjs/src/client/models/Currency.js +49 -0
  98. package/dist/cjs/src/client/models/ErrorResponseBody.d.ts +45 -0
  99. package/dist/cjs/src/client/models/ErrorResponseBody.d.ts.map +1 -0
  100. package/dist/cjs/src/client/models/ErrorResponseBody.js +53 -0
  101. package/dist/cjs/src/client/models/ImpressionSchema.d.ts +41 -0
  102. package/dist/cjs/src/client/models/ImpressionSchema.d.ts.map +1 -0
  103. package/dist/cjs/src/client/models/ImpressionSchema.js +57 -0
  104. package/dist/cjs/src/client/models/ImpressionSchemaData.d.ts +47 -0
  105. package/dist/cjs/src/client/models/ImpressionSchemaData.d.ts.map +1 -0
  106. package/dist/cjs/src/client/models/ImpressionSchemaData.js +61 -0
  107. package/dist/cjs/src/client/models/InlineObject.d.ts +33 -0
  108. package/dist/cjs/src/client/models/InlineObject.d.ts.map +1 -0
  109. package/dist/cjs/src/client/models/InlineObject.js +49 -0
  110. package/dist/cjs/src/client/models/InlineObject1.d.ts +51 -0
  111. package/dist/cjs/src/client/models/InlineObject1.d.ts.map +1 -0
  112. package/dist/cjs/src/client/models/InlineObject1.js +55 -0
  113. package/dist/cjs/src/client/models/LogSchema.d.ts +41 -0
  114. package/dist/cjs/src/client/models/LogSchema.d.ts.map +1 -0
  115. package/dist/cjs/src/client/models/LogSchema.js +57 -0
  116. package/dist/cjs/src/client/models/LogSchemaData.d.ts +45 -0
  117. package/dist/cjs/src/client/models/LogSchemaData.d.ts.map +1 -0
  118. package/dist/cjs/src/client/models/LogSchemaData.js +55 -0
  119. package/dist/cjs/src/client/models/MessagingSchema.d.ts +41 -0
  120. package/dist/cjs/src/client/models/MessagingSchema.d.ts.map +1 -0
  121. package/dist/cjs/src/client/models/MessagingSchema.js +57 -0
  122. package/dist/cjs/src/client/models/MessagingSchemaContext.d.ts +45 -0
  123. package/dist/cjs/src/client/models/MessagingSchemaContext.d.ts.map +1 -0
  124. package/dist/cjs/src/client/models/MessagingSchemaContext.js +57 -0
  125. package/dist/cjs/src/client/models/MessagingSchemaData.d.ts +39 -0
  126. package/dist/cjs/src/client/models/MessagingSchemaData.d.ts.map +1 -0
  127. package/dist/cjs/src/client/models/MessagingSchemaData.js +55 -0
  128. package/dist/cjs/src/client/models/OrderTransactionSchema.d.ts +41 -0
  129. package/dist/cjs/src/client/models/OrderTransactionSchema.d.ts.map +1 -0
  130. package/dist/cjs/src/client/models/OrderTransactionSchema.js +57 -0
  131. package/dist/cjs/src/client/models/OrderTransactionSchemaData.d.ts +76 -0
  132. package/dist/cjs/src/client/models/OrderTransactionSchemaData.d.ts.map +1 -0
  133. package/dist/cjs/src/client/models/OrderTransactionSchemaData.js +72 -0
  134. package/dist/cjs/src/client/models/PersonalizationLogContext.d.ts +39 -0
  135. package/dist/cjs/src/client/models/PersonalizationLogContext.d.ts.map +1 -0
  136. package/dist/cjs/src/client/models/PersonalizationLogContext.js +53 -0
  137. package/dist/cjs/src/client/models/PersonalizationLogSchema.d.ts +41 -0
  138. package/dist/cjs/src/client/models/PersonalizationLogSchema.d.ts.map +1 -0
  139. package/dist/cjs/src/client/models/PersonalizationLogSchema.js +57 -0
  140. package/dist/cjs/src/client/models/PersonalizationLogSchemaData.d.ts +45 -0
  141. package/dist/cjs/src/client/models/PersonalizationLogSchemaData.d.ts.map +1 -0
  142. package/dist/cjs/src/client/models/PersonalizationLogSchemaData.js +53 -0
  143. package/dist/cjs/src/client/models/Product.d.ts +57 -0
  144. package/dist/cjs/src/client/models/Product.d.ts.map +1 -0
  145. package/dist/cjs/src/client/models/Product.js +65 -0
  146. package/dist/cjs/src/client/models/ProductPageviewSchema.d.ts +41 -0
  147. package/dist/cjs/src/client/models/ProductPageviewSchema.d.ts.map +1 -0
  148. package/dist/cjs/src/client/models/ProductPageviewSchema.js +57 -0
  149. package/dist/cjs/src/client/models/ProductPageviewSchemaData.d.ts +34 -0
  150. package/dist/cjs/src/client/models/ProductPageviewSchemaData.d.ts.map +1 -0
  151. package/dist/cjs/src/client/models/ProductPageviewSchemaData.js +52 -0
  152. package/dist/cjs/src/client/models/ProductPageviewSchemaDataResult.d.ts +45 -0
  153. package/dist/cjs/src/client/models/ProductPageviewSchemaDataResult.d.ts.map +1 -0
  154. package/dist/cjs/src/client/models/ProductPageviewSchemaDataResult.js +57 -0
  155. package/dist/cjs/src/client/models/RecommendationsAddtocartSchema.d.ts +41 -0
  156. package/dist/cjs/src/client/models/RecommendationsAddtocartSchema.d.ts.map +1 -0
  157. package/dist/cjs/src/client/models/RecommendationsAddtocartSchema.js +57 -0
  158. package/dist/cjs/src/client/models/RecommendationsAddtocartSchemaData.d.ts +46 -0
  159. package/dist/cjs/src/client/models/RecommendationsAddtocartSchemaData.d.ts.map +1 -0
  160. package/dist/cjs/src/client/models/RecommendationsAddtocartSchemaData.js +60 -0
  161. package/dist/cjs/src/client/models/RecommendationsClickthroughSchema.d.ts +41 -0
  162. package/dist/cjs/src/client/models/RecommendationsClickthroughSchema.d.ts.map +1 -0
  163. package/dist/cjs/src/client/models/RecommendationsClickthroughSchema.js +57 -0
  164. package/dist/cjs/src/client/models/RecommendationsClickthroughSchemaData.d.ts +24 -0
  165. package/dist/cjs/src/client/models/RecommendationsClickthroughSchemaData.d.ts.map +1 -0
  166. package/dist/cjs/src/client/models/RecommendationsClickthroughSchemaData.js +58 -0
  167. package/dist/cjs/src/client/models/RecommendationsImpressionSchema.d.ts +41 -0
  168. package/dist/cjs/src/client/models/RecommendationsImpressionSchema.d.ts.map +1 -0
  169. package/dist/cjs/src/client/models/RecommendationsImpressionSchema.js +57 -0
  170. package/dist/cjs/src/client/models/RecommendationsImpressionSchemaData.d.ts +53 -0
  171. package/dist/cjs/src/client/models/RecommendationsImpressionSchemaData.d.ts.map +1 -0
  172. package/dist/cjs/src/client/models/RecommendationsImpressionSchemaData.js +63 -0
  173. package/dist/cjs/src/client/models/RecommendationsRenderSchema.d.ts +41 -0
  174. package/dist/cjs/src/client/models/RecommendationsRenderSchema.d.ts.map +1 -0
  175. package/dist/cjs/src/client/models/RecommendationsRenderSchema.js +57 -0
  176. package/dist/cjs/src/client/models/RecommendationsRenderSchemaData.d.ts +39 -0
  177. package/dist/cjs/src/client/models/RecommendationsRenderSchemaData.d.ts.map +1 -0
  178. package/dist/cjs/src/client/models/RecommendationsRenderSchemaData.js +55 -0
  179. package/dist/cjs/src/client/models/RedirectSchema.d.ts +41 -0
  180. package/dist/cjs/src/client/models/RedirectSchema.d.ts.map +1 -0
  181. package/dist/cjs/src/client/models/RedirectSchema.js +57 -0
  182. package/dist/cjs/src/client/models/RedirectSchemaData.d.ts +39 -0
  183. package/dist/cjs/src/client/models/RedirectSchemaData.d.ts.map +1 -0
  184. package/dist/cjs/src/client/models/RedirectSchemaData.js +55 -0
  185. package/dist/cjs/src/client/models/RenderSchema.d.ts +41 -0
  186. package/dist/cjs/src/client/models/RenderSchema.d.ts.map +1 -0
  187. package/dist/cjs/src/client/models/RenderSchema.js +57 -0
  188. package/dist/cjs/src/client/models/RenderSchemaData.d.ts +33 -0
  189. package/dist/cjs/src/client/models/RenderSchemaData.d.ts.map +1 -0
  190. package/dist/cjs/src/client/models/RenderSchemaData.js +51 -0
  191. package/dist/cjs/src/client/models/ResultProduct.d.ts +52 -0
  192. package/dist/cjs/src/client/models/ResultProduct.d.ts.map +1 -0
  193. package/dist/cjs/src/client/models/ResultProduct.js +62 -0
  194. package/dist/cjs/src/client/models/ResultProductType.d.ts +26 -0
  195. package/dist/cjs/src/client/models/ResultProductType.d.ts.map +1 -0
  196. package/dist/cjs/src/client/models/ResultProductType.js +51 -0
  197. package/dist/cjs/src/client/models/ResultResultBanner.d.ts +40 -0
  198. package/dist/cjs/src/client/models/ResultResultBanner.d.ts.map +1 -0
  199. package/dist/cjs/src/client/models/ResultResultBanner.js +56 -0
  200. package/dist/cjs/src/client/models/ResultsInner.d.ts +24 -0
  201. package/dist/cjs/src/client/models/ResultsInner.d.ts.map +1 -0
  202. package/dist/cjs/src/client/models/ResultsInner.js +58 -0
  203. package/dist/cjs/src/client/models/ShopperContext.d.ts +101 -0
  204. package/dist/cjs/src/client/models/ShopperContext.d.ts.map +1 -0
  205. package/dist/cjs/src/client/models/ShopperContext.js +87 -0
  206. package/dist/cjs/src/client/models/ShopperLoginSchema.d.ts +34 -0
  207. package/dist/cjs/src/client/models/ShopperLoginSchema.d.ts.map +1 -0
  208. package/dist/cjs/src/client/models/ShopperLoginSchema.js +52 -0
  209. package/dist/cjs/src/client/models/ValidationErrorWithDataField.d.ts +51 -0
  210. package/dist/cjs/src/client/models/ValidationErrorWithDataField.d.ts.map +1 -0
  211. package/dist/cjs/src/client/models/ValidationErrorWithDataField.js +55 -0
  212. package/dist/cjs/src/client/models/index.d.ts +55 -0
  213. package/dist/cjs/src/client/models/index.d.ts.map +1 -0
  214. package/dist/cjs/src/client/models/index.js +72 -0
  215. package/dist/cjs/src/client/runtime.d.ts +185 -0
  216. package/dist/cjs/src/client/runtime.d.ts.map +1 -0
  217. package/dist/cjs/src/client/runtime.js +564 -0
  218. package/dist/cjs/src/index.d.ts +4 -0
  219. package/dist/cjs/src/index.d.ts.map +1 -0
  220. package/dist/cjs/src/index.js +21 -0
  221. package/dist/cjs/src/indexCDN.d.ts +2 -0
  222. package/dist/cjs/src/indexCDN.d.ts.map +1 -0
  223. package/dist/cjs/src/indexCDN.js +40 -0
  224. package/dist/cjs/src/utils/featureFlags.d.ts +11 -0
  225. package/dist/cjs/src/utils/featureFlags.d.ts.map +1 -0
  226. package/dist/cjs/src/utils/featureFlags.js +33 -0
  227. package/dist/esm/package.json +78 -0
  228. package/dist/esm/src/Beacon.d.ts +181 -0
  229. package/dist/esm/src/Beacon.d.ts.map +1 -0
  230. package/dist/esm/src/Beacon.js +1074 -0
  231. package/dist/esm/src/client/apis/AutocompleteApi.d.ts +89 -0
  232. package/dist/esm/src/client/apis/AutocompleteApi.d.ts.map +1 -0
  233. package/dist/esm/src/client/apis/AutocompleteApi.js +185 -0
  234. package/dist/esm/src/client/apis/CartApi.d.ts +47 -0
  235. package/dist/esm/src/client/apis/CartApi.d.ts.map +1 -0
  236. package/dist/esm/src/client/apis/CartApi.js +86 -0
  237. package/dist/esm/src/client/apis/CategoryApi.d.ts +75 -0
  238. package/dist/esm/src/client/apis/CategoryApi.d.ts.map +1 -0
  239. package/dist/esm/src/client/apis/CategoryApi.js +152 -0
  240. package/dist/esm/src/client/apis/ErrorLogsApi.d.ts +61 -0
  241. package/dist/esm/src/client/apis/ErrorLogsApi.d.ts.map +1 -0
  242. package/dist/esm/src/client/apis/ErrorLogsApi.js +119 -0
  243. package/dist/esm/src/client/apis/MessagingRecommendationsApi.d.ts +75 -0
  244. package/dist/esm/src/client/apis/MessagingRecommendationsApi.d.ts.map +1 -0
  245. package/dist/esm/src/client/apis/MessagingRecommendationsApi.js +152 -0
  246. package/dist/esm/src/client/apis/OrderApi.d.ts +33 -0
  247. package/dist/esm/src/client/apis/OrderApi.d.ts.map +1 -0
  248. package/dist/esm/src/client/apis/OrderApi.js +53 -0
  249. package/dist/esm/src/client/apis/ProductApi.d.ts +33 -0
  250. package/dist/esm/src/client/apis/ProductApi.d.ts.map +1 -0
  251. package/dist/esm/src/client/apis/ProductApi.js +53 -0
  252. package/dist/esm/src/client/apis/RecommendationsApi.d.ts +75 -0
  253. package/dist/esm/src/client/apis/RecommendationsApi.d.ts.map +1 -0
  254. package/dist/esm/src/client/apis/RecommendationsApi.js +152 -0
  255. package/dist/esm/src/client/apis/SearchApi.d.ts +89 -0
  256. package/dist/esm/src/client/apis/SearchApi.d.ts.map +1 -0
  257. package/dist/esm/src/client/apis/SearchApi.js +185 -0
  258. package/dist/esm/src/client/apis/ShopperApi.d.ts +33 -0
  259. package/dist/esm/src/client/apis/ShopperApi.d.ts.map +1 -0
  260. package/dist/esm/src/client/apis/ShopperApi.js +53 -0
  261. package/dist/esm/src/client/apis/index.d.ts +11 -0
  262. package/dist/esm/src/client/apis/index.d.ts.map +1 -0
  263. package/dist/esm/src/client/apis/index.js +12 -0
  264. package/dist/esm/src/client/index.d.ts +4 -0
  265. package/dist/esm/src/client/index.d.ts.map +1 -0
  266. package/dist/esm/src/client/index.js +5 -0
  267. package/dist/esm/src/client/models/AddtocartSchema.d.ts +41 -0
  268. package/dist/esm/src/client/models/AddtocartSchema.d.ts.map +1 -0
  269. package/dist/esm/src/client/models/AddtocartSchema.js +49 -0
  270. package/dist/esm/src/client/models/AddtocartSchemaData.d.ts +40 -0
  271. package/dist/esm/src/client/models/AddtocartSchemaData.d.ts.map +1 -0
  272. package/dist/esm/src/client/models/AddtocartSchemaData.js +48 -0
  273. package/dist/esm/src/client/models/AttributionInner.d.ts +39 -0
  274. package/dist/esm/src/client/models/AttributionInner.d.ts.map +1 -0
  275. package/dist/esm/src/client/models/AttributionInner.js +47 -0
  276. package/dist/esm/src/client/models/BannersInner.d.ts +33 -0
  277. package/dist/esm/src/client/models/BannersInner.d.ts.map +1 -0
  278. package/dist/esm/src/client/models/BannersInner.js +43 -0
  279. package/dist/esm/src/client/models/CartSchema.d.ts +41 -0
  280. package/dist/esm/src/client/models/CartSchema.d.ts.map +1 -0
  281. package/dist/esm/src/client/models/CartSchema.js +49 -0
  282. package/dist/esm/src/client/models/CartSchemaData.d.ts +40 -0
  283. package/dist/esm/src/client/models/CartSchemaData.d.ts.map +1 -0
  284. package/dist/esm/src/client/models/CartSchemaData.js +48 -0
  285. package/dist/esm/src/client/models/ClickthroughBannersInner.d.ts +33 -0
  286. package/dist/esm/src/client/models/ClickthroughBannersInner.d.ts.map +1 -0
  287. package/dist/esm/src/client/models/ClickthroughBannersInner.js +43 -0
  288. package/dist/esm/src/client/models/ClickthroughBannersSchema.d.ts +40 -0
  289. package/dist/esm/src/client/models/ClickthroughBannersSchema.d.ts.map +1 -0
  290. package/dist/esm/src/client/models/ClickthroughBannersSchema.js +48 -0
  291. package/dist/esm/src/client/models/ClickthroughBannersSchema1.d.ts +46 -0
  292. package/dist/esm/src/client/models/ClickthroughBannersSchema1.d.ts.map +1 -0
  293. package/dist/esm/src/client/models/ClickthroughBannersSchema1.js +52 -0
  294. package/dist/esm/src/client/models/ClickthroughResultsInner.d.ts +24 -0
  295. package/dist/esm/src/client/models/ClickthroughResultsInner.d.ts.map +1 -0
  296. package/dist/esm/src/client/models/ClickthroughResultsInner.js +51 -0
  297. package/dist/esm/src/client/models/ClickthroughResultsSchema.d.ts +40 -0
  298. package/dist/esm/src/client/models/ClickthroughResultsSchema.d.ts.map +1 -0
  299. package/dist/esm/src/client/models/ClickthroughResultsSchema.js +48 -0
  300. package/dist/esm/src/client/models/ClickthroughResultsSchema1.d.ts +46 -0
  301. package/dist/esm/src/client/models/ClickthroughResultsSchema1.d.ts.map +1 -0
  302. package/dist/esm/src/client/models/ClickthroughResultsSchema1.js +52 -0
  303. package/dist/esm/src/client/models/ClickthroughSchema.d.ts +41 -0
  304. package/dist/esm/src/client/models/ClickthroughSchema.d.ts.map +1 -0
  305. package/dist/esm/src/client/models/ClickthroughSchema.js +49 -0
  306. package/dist/esm/src/client/models/ClickthroughSchemaData.d.ts +24 -0
  307. package/dist/esm/src/client/models/ClickthroughSchemaData.d.ts.map +1 -0
  308. package/dist/esm/src/client/models/ClickthroughSchemaData.js +51 -0
  309. package/dist/esm/src/client/models/Context.d.ts +101 -0
  310. package/dist/esm/src/client/models/Context.d.ts.map +1 -0
  311. package/dist/esm/src/client/models/Context.js +77 -0
  312. package/dist/esm/src/client/models/Currency.d.ts +33 -0
  313. package/dist/esm/src/client/models/Currency.d.ts.map +1 -0
  314. package/dist/esm/src/client/models/Currency.js +41 -0
  315. package/dist/esm/src/client/models/ErrorResponseBody.d.ts +45 -0
  316. package/dist/esm/src/client/models/ErrorResponseBody.d.ts.map +1 -0
  317. package/dist/esm/src/client/models/ErrorResponseBody.js +45 -0
  318. package/dist/esm/src/client/models/ImpressionSchema.d.ts +41 -0
  319. package/dist/esm/src/client/models/ImpressionSchema.d.ts.map +1 -0
  320. package/dist/esm/src/client/models/ImpressionSchema.js +49 -0
  321. package/dist/esm/src/client/models/ImpressionSchemaData.d.ts +47 -0
  322. package/dist/esm/src/client/models/ImpressionSchemaData.d.ts.map +1 -0
  323. package/dist/esm/src/client/models/ImpressionSchemaData.js +53 -0
  324. package/dist/esm/src/client/models/InlineObject.d.ts +33 -0
  325. package/dist/esm/src/client/models/InlineObject.d.ts.map +1 -0
  326. package/dist/esm/src/client/models/InlineObject.js +41 -0
  327. package/dist/esm/src/client/models/InlineObject1.d.ts +51 -0
  328. package/dist/esm/src/client/models/InlineObject1.d.ts.map +1 -0
  329. package/dist/esm/src/client/models/InlineObject1.js +47 -0
  330. package/dist/esm/src/client/models/LogSchema.d.ts +41 -0
  331. package/dist/esm/src/client/models/LogSchema.d.ts.map +1 -0
  332. package/dist/esm/src/client/models/LogSchema.js +49 -0
  333. package/dist/esm/src/client/models/LogSchemaData.d.ts +45 -0
  334. package/dist/esm/src/client/models/LogSchemaData.d.ts.map +1 -0
  335. package/dist/esm/src/client/models/LogSchemaData.js +47 -0
  336. package/dist/esm/src/client/models/MessagingSchema.d.ts +41 -0
  337. package/dist/esm/src/client/models/MessagingSchema.d.ts.map +1 -0
  338. package/dist/esm/src/client/models/MessagingSchema.js +49 -0
  339. package/dist/esm/src/client/models/MessagingSchemaContext.d.ts +45 -0
  340. package/dist/esm/src/client/models/MessagingSchemaContext.d.ts.map +1 -0
  341. package/dist/esm/src/client/models/MessagingSchemaContext.js +49 -0
  342. package/dist/esm/src/client/models/MessagingSchemaData.d.ts +39 -0
  343. package/dist/esm/src/client/models/MessagingSchemaData.d.ts.map +1 -0
  344. package/dist/esm/src/client/models/MessagingSchemaData.js +47 -0
  345. package/dist/esm/src/client/models/OrderTransactionSchema.d.ts +41 -0
  346. package/dist/esm/src/client/models/OrderTransactionSchema.d.ts.map +1 -0
  347. package/dist/esm/src/client/models/OrderTransactionSchema.js +49 -0
  348. package/dist/esm/src/client/models/OrderTransactionSchemaData.d.ts +76 -0
  349. package/dist/esm/src/client/models/OrderTransactionSchemaData.d.ts.map +1 -0
  350. package/dist/esm/src/client/models/OrderTransactionSchemaData.js +64 -0
  351. package/dist/esm/src/client/models/PersonalizationLogContext.d.ts +39 -0
  352. package/dist/esm/src/client/models/PersonalizationLogContext.d.ts.map +1 -0
  353. package/dist/esm/src/client/models/PersonalizationLogContext.js +45 -0
  354. package/dist/esm/src/client/models/PersonalizationLogSchema.d.ts +41 -0
  355. package/dist/esm/src/client/models/PersonalizationLogSchema.d.ts.map +1 -0
  356. package/dist/esm/src/client/models/PersonalizationLogSchema.js +49 -0
  357. package/dist/esm/src/client/models/PersonalizationLogSchemaData.d.ts +45 -0
  358. package/dist/esm/src/client/models/PersonalizationLogSchemaData.d.ts.map +1 -0
  359. package/dist/esm/src/client/models/PersonalizationLogSchemaData.js +45 -0
  360. package/dist/esm/src/client/models/Product.d.ts +57 -0
  361. package/dist/esm/src/client/models/Product.d.ts.map +1 -0
  362. package/dist/esm/src/client/models/Product.js +57 -0
  363. package/dist/esm/src/client/models/ProductPageviewSchema.d.ts +41 -0
  364. package/dist/esm/src/client/models/ProductPageviewSchema.d.ts.map +1 -0
  365. package/dist/esm/src/client/models/ProductPageviewSchema.js +49 -0
  366. package/dist/esm/src/client/models/ProductPageviewSchemaData.d.ts +34 -0
  367. package/dist/esm/src/client/models/ProductPageviewSchemaData.d.ts.map +1 -0
  368. package/dist/esm/src/client/models/ProductPageviewSchemaData.js +44 -0
  369. package/dist/esm/src/client/models/ProductPageviewSchemaDataResult.d.ts +45 -0
  370. package/dist/esm/src/client/models/ProductPageviewSchemaDataResult.d.ts.map +1 -0
  371. package/dist/esm/src/client/models/ProductPageviewSchemaDataResult.js +49 -0
  372. package/dist/esm/src/client/models/RecommendationsAddtocartSchema.d.ts +41 -0
  373. package/dist/esm/src/client/models/RecommendationsAddtocartSchema.d.ts.map +1 -0
  374. package/dist/esm/src/client/models/RecommendationsAddtocartSchema.js +49 -0
  375. package/dist/esm/src/client/models/RecommendationsAddtocartSchemaData.d.ts +46 -0
  376. package/dist/esm/src/client/models/RecommendationsAddtocartSchemaData.d.ts.map +1 -0
  377. package/dist/esm/src/client/models/RecommendationsAddtocartSchemaData.js +52 -0
  378. package/dist/esm/src/client/models/RecommendationsClickthroughSchema.d.ts +41 -0
  379. package/dist/esm/src/client/models/RecommendationsClickthroughSchema.d.ts.map +1 -0
  380. package/dist/esm/src/client/models/RecommendationsClickthroughSchema.js +49 -0
  381. package/dist/esm/src/client/models/RecommendationsClickthroughSchemaData.d.ts +24 -0
  382. package/dist/esm/src/client/models/RecommendationsClickthroughSchemaData.d.ts.map +1 -0
  383. package/dist/esm/src/client/models/RecommendationsClickthroughSchemaData.js +51 -0
  384. package/dist/esm/src/client/models/RecommendationsImpressionSchema.d.ts +41 -0
  385. package/dist/esm/src/client/models/RecommendationsImpressionSchema.d.ts.map +1 -0
  386. package/dist/esm/src/client/models/RecommendationsImpressionSchema.js +49 -0
  387. package/dist/esm/src/client/models/RecommendationsImpressionSchemaData.d.ts +53 -0
  388. package/dist/esm/src/client/models/RecommendationsImpressionSchemaData.d.ts.map +1 -0
  389. package/dist/esm/src/client/models/RecommendationsImpressionSchemaData.js +55 -0
  390. package/dist/esm/src/client/models/RecommendationsRenderSchema.d.ts +41 -0
  391. package/dist/esm/src/client/models/RecommendationsRenderSchema.d.ts.map +1 -0
  392. package/dist/esm/src/client/models/RecommendationsRenderSchema.js +49 -0
  393. package/dist/esm/src/client/models/RecommendationsRenderSchemaData.d.ts +39 -0
  394. package/dist/esm/src/client/models/RecommendationsRenderSchemaData.d.ts.map +1 -0
  395. package/dist/esm/src/client/models/RecommendationsRenderSchemaData.js +47 -0
  396. package/dist/esm/src/client/models/RedirectSchema.d.ts +41 -0
  397. package/dist/esm/src/client/models/RedirectSchema.d.ts.map +1 -0
  398. package/dist/esm/src/client/models/RedirectSchema.js +49 -0
  399. package/dist/esm/src/client/models/RedirectSchemaData.d.ts +39 -0
  400. package/dist/esm/src/client/models/RedirectSchemaData.d.ts.map +1 -0
  401. package/dist/esm/src/client/models/RedirectSchemaData.js +47 -0
  402. package/dist/esm/src/client/models/RenderSchema.d.ts +41 -0
  403. package/dist/esm/src/client/models/RenderSchema.d.ts.map +1 -0
  404. package/dist/esm/src/client/models/RenderSchema.js +49 -0
  405. package/dist/esm/src/client/models/RenderSchemaData.d.ts +33 -0
  406. package/dist/esm/src/client/models/RenderSchemaData.d.ts.map +1 -0
  407. package/dist/esm/src/client/models/RenderSchemaData.js +43 -0
  408. package/dist/esm/src/client/models/ResultProduct.d.ts +52 -0
  409. package/dist/esm/src/client/models/ResultProduct.d.ts.map +1 -0
  410. package/dist/esm/src/client/models/ResultProduct.js +54 -0
  411. package/dist/esm/src/client/models/ResultProductType.d.ts +26 -0
  412. package/dist/esm/src/client/models/ResultProductType.d.ts.map +1 -0
  413. package/dist/esm/src/client/models/ResultProductType.js +43 -0
  414. package/dist/esm/src/client/models/ResultResultBanner.d.ts +40 -0
  415. package/dist/esm/src/client/models/ResultResultBanner.d.ts.map +1 -0
  416. package/dist/esm/src/client/models/ResultResultBanner.js +48 -0
  417. package/dist/esm/src/client/models/ResultsInner.d.ts +24 -0
  418. package/dist/esm/src/client/models/ResultsInner.d.ts.map +1 -0
  419. package/dist/esm/src/client/models/ResultsInner.js +51 -0
  420. package/dist/esm/src/client/models/ShopperContext.d.ts +101 -0
  421. package/dist/esm/src/client/models/ShopperContext.d.ts.map +1 -0
  422. package/dist/esm/src/client/models/ShopperContext.js +79 -0
  423. package/dist/esm/src/client/models/ShopperLoginSchema.d.ts +34 -0
  424. package/dist/esm/src/client/models/ShopperLoginSchema.d.ts.map +1 -0
  425. package/dist/esm/src/client/models/ShopperLoginSchema.js +44 -0
  426. package/dist/esm/src/client/models/ValidationErrorWithDataField.d.ts +51 -0
  427. package/dist/esm/src/client/models/ValidationErrorWithDataField.d.ts.map +1 -0
  428. package/dist/esm/src/client/models/ValidationErrorWithDataField.js +47 -0
  429. package/dist/esm/src/client/models/index.d.ts +55 -0
  430. package/dist/esm/src/client/models/index.d.ts.map +1 -0
  431. package/dist/esm/src/client/models/index.js +56 -0
  432. package/dist/esm/src/client/runtime.d.ts +185 -0
  433. package/dist/esm/src/client/runtime.d.ts.map +1 -0
  434. package/dist/esm/src/client/runtime.js +322 -0
  435. package/dist/esm/src/index.d.ts +4 -0
  436. package/dist/esm/src/index.d.ts.map +1 -0
  437. package/dist/esm/src/index.js +3 -0
  438. package/dist/esm/src/indexCDN.d.ts +2 -0
  439. package/dist/esm/src/indexCDN.d.ts.map +1 -0
  440. package/dist/esm/src/indexCDN.js +33 -0
  441. package/dist/esm/src/utils/featureFlags.d.ts +11 -0
  442. package/dist/esm/src/utils/featureFlags.d.ts.map +1 -0
  443. package/dist/esm/src/utils/featureFlags.js +27 -0
  444. package/jest.config.js +14 -0
  445. package/openapitools.json +7 -0
  446. package/package.json +78 -0
  447. package/public/index.html +18 -0
  448. package/src/Beacon.test.ts +1487 -0
  449. package/src/Beacon.ts +1322 -0
  450. package/src/client/.openapi-generator/FILES +133 -0
  451. package/src/client/.openapi-generator/VERSION +1 -0
  452. package/src/client/.openapi-generator-ignore +23 -0
  453. package/src/client/apis/AutocompleteApi.ts +321 -0
  454. package/src/client/apis/CartApi.ts +147 -0
  455. package/src/client/apis/CategoryApi.ts +264 -0
  456. package/src/client/apis/ErrorLogsApi.ts +204 -0
  457. package/src/client/apis/MessagingRecommendationsApi.ts +255 -0
  458. package/src/client/apis/OrderApi.ts +93 -0
  459. package/src/client/apis/ProductApi.ts +93 -0
  460. package/src/client/apis/RecommendationsApi.ts +264 -0
  461. package/src/client/apis/SearchApi.ts +321 -0
  462. package/src/client/apis/ShopperApi.ts +93 -0
  463. package/src/client/apis/index.ts +12 -0
  464. package/src/client/docs/AddtocartSchema.md +36 -0
  465. package/src/client/docs/AddtocartSchemaData.md +37 -0
  466. package/src/client/docs/AttributionInner.md +36 -0
  467. package/src/client/docs/AutocompleteApi.md +393 -0
  468. package/src/client/docs/BannersInner.md +34 -0
  469. package/src/client/docs/CartApi.md +162 -0
  470. package/src/client/docs/CartSchema.md +36 -0
  471. package/src/client/docs/CartSchemaData.md +37 -0
  472. package/src/client/docs/CategoryApi.md +316 -0
  473. package/src/client/docs/ClickthroughBannersInner.md +34 -0
  474. package/src/client/docs/ClickthroughBannersSchema.md +36 -0
  475. package/src/client/docs/ClickthroughBannersSchema1.md +38 -0
  476. package/src/client/docs/ClickthroughResultsInner.md +40 -0
  477. package/src/client/docs/ClickthroughResultsSchema.md +36 -0
  478. package/src/client/docs/ClickthroughResultsSchema1.md +38 -0
  479. package/src/client/docs/ClickthroughSchema.md +36 -0
  480. package/src/client/docs/ClickthroughSchemaData.md +39 -0
  481. package/src/client/docs/Context.md +57 -0
  482. package/src/client/docs/Currency.md +35 -0
  483. package/src/client/docs/ErrorLogsApi.md +239 -0
  484. package/src/client/docs/ErrorResponseBody.md +38 -0
  485. package/src/client/docs/ImpressionSchema.md +36 -0
  486. package/src/client/docs/ImpressionSchemaData.md +39 -0
  487. package/src/client/docs/InlineObject.md +34 -0
  488. package/src/client/docs/InlineObject1.md +40 -0
  489. package/src/client/docs/LogSchema.md +36 -0
  490. package/src/client/docs/LogSchemaData.md +39 -0
  491. package/src/client/docs/MessagingRecommendationsApi.md +316 -0
  492. package/src/client/docs/MessagingSchema.md +36 -0
  493. package/src/client/docs/MessagingSchemaContext.md +39 -0
  494. package/src/client/docs/MessagingSchemaData.md +37 -0
  495. package/src/client/docs/OrderApi.md +85 -0
  496. package/src/client/docs/OrderTransactionSchema.md +36 -0
  497. package/src/client/docs/OrderTransactionSchemaData.md +49 -0
  498. package/src/client/docs/PersonalizationLogContext.md +36 -0
  499. package/src/client/docs/PersonalizationLogSchema.md +36 -0
  500. package/src/client/docs/PersonalizationLogSchemaData.md +39 -0
  501. package/src/client/docs/Product.md +43 -0
  502. package/src/client/docs/ProductApi.md +85 -0
  503. package/src/client/docs/ProductPageviewSchema.md +36 -0
  504. package/src/client/docs/ProductPageviewSchemaData.md +35 -0
  505. package/src/client/docs/ProductPageviewSchemaDataResult.md +39 -0
  506. package/src/client/docs/RecommendationsAddtocartSchema.md +36 -0
  507. package/src/client/docs/RecommendationsAddtocartSchemaData.md +39 -0
  508. package/src/client/docs/RecommendationsApi.md +316 -0
  509. package/src/client/docs/RecommendationsClickthroughSchema.md +36 -0
  510. package/src/client/docs/RecommendationsClickthroughSchemaData.md +41 -0
  511. package/src/client/docs/RecommendationsImpressionSchema.md +36 -0
  512. package/src/client/docs/RecommendationsImpressionSchemaData.md +41 -0
  513. package/src/client/docs/RecommendationsRenderSchema.md +36 -0
  514. package/src/client/docs/RecommendationsRenderSchemaData.md +37 -0
  515. package/src/client/docs/RedirectSchema.md +36 -0
  516. package/src/client/docs/RedirectSchemaData.md +37 -0
  517. package/src/client/docs/RenderSchema.md +36 -0
  518. package/src/client/docs/RenderSchemaData.md +35 -0
  519. package/src/client/docs/ResultProduct.md +41 -0
  520. package/src/client/docs/ResultProductType.md +33 -0
  521. package/src/client/docs/ResultResultBanner.md +37 -0
  522. package/src/client/docs/ResultsInner.md +40 -0
  523. package/src/client/docs/SearchApi.md +393 -0
  524. package/src/client/docs/ShopperApi.md +85 -0
  525. package/src/client/docs/ShopperContext.md +57 -0
  526. package/src/client/docs/ShopperLoginSchema.md +34 -0
  527. package/src/client/docs/ValidationErrorWithDataField.md +40 -0
  528. package/src/client/index.ts +5 -0
  529. package/src/client/models/AddtocartSchema.ts +90 -0
  530. package/src/client/models/AddtocartSchemaData.ts +83 -0
  531. package/src/client/models/AttributionInner.ts +75 -0
  532. package/src/client/models/BannersInner.ts +66 -0
  533. package/src/client/models/CartSchema.ts +90 -0
  534. package/src/client/models/CartSchemaData.ts +83 -0
  535. package/src/client/models/ClickthroughBannersInner.ts +66 -0
  536. package/src/client/models/ClickthroughBannersSchema.ts +83 -0
  537. package/src/client/models/ClickthroughBannersSchema1.ts +92 -0
  538. package/src/client/models/ClickthroughResultsInner.ts +76 -0
  539. package/src/client/models/ClickthroughResultsSchema.ts +83 -0
  540. package/src/client/models/ClickthroughResultsSchema1.ts +92 -0
  541. package/src/client/models/ClickthroughSchema.ts +90 -0
  542. package/src/client/models/ClickthroughSchemaData.ts +76 -0
  543. package/src/client/models/Context.ts +174 -0
  544. package/src/client/models/Currency.ts +65 -0
  545. package/src/client/models/ErrorResponseBody.ts +81 -0
  546. package/src/client/models/ImpressionSchema.ts +90 -0
  547. package/src/client/models/ImpressionSchemaData.ts +99 -0
  548. package/src/client/models/InlineObject.ts +65 -0
  549. package/src/client/models/InlineObject1.ts +104 -0
  550. package/src/client/models/LogSchema.ts +90 -0
  551. package/src/client/models/LogSchemaData.ts +82 -0
  552. package/src/client/models/MessagingSchema.ts +90 -0
  553. package/src/client/models/MessagingSchemaContext.ts +83 -0
  554. package/src/client/models/MessagingSchemaData.ts +75 -0
  555. package/src/client/models/OrderTransactionSchema.ts +90 -0
  556. package/src/client/models/OrderTransactionSchemaData.ts +133 -0
  557. package/src/client/models/PersonalizationLogContext.ts +74 -0
  558. package/src/client/models/PersonalizationLogSchema.ts +90 -0
  559. package/src/client/models/PersonalizationLogSchemaData.ts +81 -0
  560. package/src/client/models/Product.ts +101 -0
  561. package/src/client/models/ProductPageviewSchema.ts +90 -0
  562. package/src/client/models/ProductPageviewSchemaData.ts +74 -0
  563. package/src/client/models/ProductPageviewSchemaDataResult.ts +83 -0
  564. package/src/client/models/RecommendationsAddtocartSchema.ts +90 -0
  565. package/src/client/models/RecommendationsAddtocartSchemaData.ts +92 -0
  566. package/src/client/models/RecommendationsClickthroughSchema.ts +90 -0
  567. package/src/client/models/RecommendationsClickthroughSchemaData.ts +76 -0
  568. package/src/client/models/RecommendationsImpressionSchema.ts +90 -0
  569. package/src/client/models/RecommendationsImpressionSchemaData.ts +107 -0
  570. package/src/client/models/RecommendationsRenderSchema.ts +90 -0
  571. package/src/client/models/RecommendationsRenderSchemaData.ts +75 -0
  572. package/src/client/models/RedirectSchema.ts +90 -0
  573. package/src/client/models/RedirectSchemaData.ts +75 -0
  574. package/src/client/models/RenderSchema.ts +90 -0
  575. package/src/client/models/RenderSchemaData.ts +66 -0
  576. package/src/client/models/ResultProduct.ts +102 -0
  577. package/src/client/models/ResultProductType.ts +53 -0
  578. package/src/client/models/ResultResultBanner.ts +85 -0
  579. package/src/client/models/ResultsInner.ts +76 -0
  580. package/src/client/models/ShopperContext.ts +175 -0
  581. package/src/client/models/ShopperLoginSchema.ts +74 -0
  582. package/src/client/models/ValidationErrorWithDataField.ts +89 -0
  583. package/src/client/models/index.ts +56 -0
  584. package/src/client/runtime.ts +432 -0
  585. package/src/index.ts +3 -0
  586. package/src/indexCDN.ts +34 -0
  587. package/src/utils/featureFlags.ts +35 -0
  588. package/tsconfig.cjs.json +31 -0
  589. package/tsconfig.json +34 -0
  590. package/webpack.prod.js +47 -0
package/src/Beacon.ts ADDED
@@ -0,0 +1,1322 @@
1
+ import packageJSON from '../package.json';
2
+ export const { version } = packageJSON;
3
+ import { featureFlags } from './utils/featureFlags';
4
+
5
+ import { v4 as uuidv4 } from 'uuid';
6
+ import {
7
+ Context,
8
+ AutocompleteApi,
9
+ AutocompleteClickthroughRequest,
10
+ AutocompleteImpressionRequest,
11
+ CartApi,
12
+ CartSchemaData,
13
+ CategoryApi,
14
+ CategoryClickthroughRequest,
15
+ CategoryImpressionRequest,
16
+ ErrorLogsApi,
17
+ OrderApi,
18
+ OrderTransactionSchemaData,
19
+ Product,
20
+ ProductApi,
21
+ RecommendationsApi,
22
+ RecommendationsClickthroughRequest,
23
+ RecommendationsImpressionRequest,
24
+ SearchApi,
25
+ SearchClickthroughRequest,
26
+ SearchImpressionRequest,
27
+ ShopperApi,
28
+ Configuration,
29
+ InitOverrideFunction,
30
+ FetchAPI,
31
+ RecommendationsImpressionSchema,
32
+ RedirectSchemaData,
33
+ ClickthroughSchemaData,
34
+ AddtocartSchemaData,
35
+ ImpressionSchemaData,
36
+ RecommendationsRenderSchemaData,
37
+ RecommendationsImpressionSchemaData,
38
+ RecommendationsAddtocartSchemaData,
39
+ RecommendationsClickthroughSchemaData,
40
+ RenderSchemaData,
41
+ ProductPageviewSchemaData,
42
+ ProductPageviewSchemaDataResult,
43
+ ImpressionSchema,
44
+ AttributionInner,
45
+ Currency,
46
+ LogSchema,
47
+ LogSchemaData,
48
+ ShopperContext,
49
+ HTTPHeaders,
50
+ RecommendationsAddtocartSchema,
51
+ AddtocartSchema,
52
+ } from './client';
53
+ import type {
54
+ AutocompleteAddtocartRequest,
55
+ AutocompleteRedirectRequest,
56
+ AutocompleteRenderRequest,
57
+ CartAddRequest,
58
+ CartRemoveRequest,
59
+ CategoryAddtocartRequest,
60
+ CategoryRenderRequest,
61
+ LoginRequest,
62
+ OrderTransactionRequest,
63
+ ProductPageviewRequest,
64
+ RecommendationsAddtocartRequest,
65
+ RecommendationsRenderRequest,
66
+ SearchAddtocartRequest,
67
+ SearchRedirectRequest,
68
+ SearchRenderRequest,
69
+ LogShopifypixelRequest,
70
+ LogSnapRequest,
71
+ } from './client/apis';
72
+
73
+ declare global {
74
+ interface Window {
75
+ Beacon?: typeof Beacon;
76
+ searchspring?: any;
77
+ athos?: any;
78
+ }
79
+ }
80
+ type LocalStorageItem = string | number | boolean | object | null;
81
+ type PageLoadData = { href: string; value: string; timestamp: string };
82
+ export type PreflightRequestModel = {
83
+ userId: string;
84
+ siteId: string;
85
+ shopper?: string;
86
+ cart?: string[];
87
+ lastViewed?: string[];
88
+ };
89
+
90
+ export type BeaconConfig = {
91
+ mode?: 'production' | 'development';
92
+ initiator?: string;
93
+ requesters?: {
94
+ personalization?: {
95
+ origin?: string;
96
+ headers?: HTTPHeaders;
97
+ };
98
+ beacon?: {
99
+ origin?: string;
100
+ headers?: HTTPHeaders;
101
+ };
102
+ };
103
+ apis?: {
104
+ fetch?: FetchAPI;
105
+ };
106
+ href?: string;
107
+ userAgent?: string;
108
+ };
109
+ export type BeaconGlobals = {
110
+ siteId: string;
111
+ };
112
+
113
+ interface ApiMethodMap {
114
+ shopper: ShopperApi;
115
+ autocomplete: AutocompleteApi;
116
+ search: SearchApi;
117
+ category: CategoryApi;
118
+ recommendations: RecommendationsApi;
119
+ product: ProductApi;
120
+ cart: CartApi;
121
+ order: OrderApi;
122
+ error: ErrorLogsApi;
123
+ }
124
+ export interface PayloadRequest {
125
+ apiType: keyof ApiMethodMap;
126
+ endpoint: string;
127
+ payload: any;
128
+ }
129
+
130
+ export type Payload<T> = {
131
+ siteId?: string;
132
+ data: T;
133
+ };
134
+
135
+ export const REQUEST_GROUPING_TIMEOUT = 300;
136
+ export const PREFLIGHT_DEBOUNCE_TIMEOUT = 300;
137
+ const USER_ID_KEY = 'ssUserId';
138
+ export const PAGE_LOAD_ID_KEY = 'ssPageLoadId';
139
+ const SESSION_ID_KEY = 'ssSessionId';
140
+ const SHOPPER_ID_KEY = 'ssShopperId';
141
+ export const CART_KEY = 'ssCartProducts';
142
+ const VIEWED_KEY = 'ssViewedProducts';
143
+ export const COOKIE_SAMESITE = 'Lax';
144
+ const ATTRIBUTION_QUERY_PARAM = 'ss_attribution';
145
+ const ATTRIBUTION_KEY = 'ssAttribution';
146
+ const MAX_EXPIRATION = 47304000000; // 18 months
147
+ const THIRTY_MINUTES = 1800000; // 30 minutes
148
+ export const PAGE_LOAD_ID_EXPIRATION = 10000; // 10 seconds
149
+ const MAX_VIEWED_COUNT = 20;
150
+ const EXPIRED_COOKIE = -1;
151
+ export const COOKIE_DOMAIN =
152
+ (typeof window !== 'undefined' && window.location.hostname && '.' + window.location.hostname.replace(/^www\./, '')) || undefined;
153
+
154
+ export class Beacon {
155
+ protected config: BeaconConfig;
156
+ protected globals: BeaconGlobals;
157
+ protected mode: 'production' | 'development' = 'production';
158
+ private pageLoadId: string = '';
159
+ private userId: string = '';
160
+ private sessionId: string = '';
161
+ private shopperId: string = '';
162
+ private attribution: AttributionInner[] | undefined;
163
+ private currency: Currency = {
164
+ code: '',
165
+ };
166
+ private initiator: string = '';
167
+ private batchIntervalTimeout: number | NodeJS.Timeout = 0;
168
+ private preflightTimeout: number | NodeJS.Timeout = 0;
169
+ private apis: ApiMethodMap;
170
+
171
+ private requests: PayloadRequest[] = [];
172
+
173
+ constructor(globals: BeaconGlobals, config?: BeaconConfig) {
174
+ if (typeof globals != 'object' || typeof globals.siteId != 'string') {
175
+ throw new Error(`Invalid config passed to tracker. The "siteId" attribute must be provided.`);
176
+ }
177
+
178
+ this.config = { mode: 'production', ...(config || {}) };
179
+
180
+ if (this.config.mode && ['production', 'development'].includes(this.config.mode)) {
181
+ this.mode = this.config.mode;
182
+ }
183
+
184
+ const fetchApi = this.config.apis?.fetch;
185
+
186
+ const domain = `${globals.siteId}`.trim().toLowerCase().startsWith('at') ? 'athos' : 'searchspring';
187
+ const basePath = domain === 'searchspring' ? "https://analytics.searchspring.net/beacon/v2" : undefined;
188
+ const apiConfig = new Configuration({ fetchApi, basePath: this.config.requesters?.beacon?.origin || basePath, headers: { 'Content-Type': 'text/plain' } });
189
+ this.apis = {
190
+ shopper: new ShopperApi(apiConfig),
191
+ autocomplete: new AutocompleteApi(apiConfig),
192
+ search: new SearchApi(apiConfig),
193
+ category: new CategoryApi(apiConfig),
194
+ recommendations: new RecommendationsApi(apiConfig),
195
+ product: new ProductApi(apiConfig),
196
+ cart: new CartApi(apiConfig),
197
+ order: new OrderApi(apiConfig),
198
+ error: new ErrorLogsApi(apiConfig),
199
+ };
200
+
201
+ this.initiator = this.config.initiator || `${domain}/beaconjs/${version}`;
202
+
203
+ this.globals = globals;
204
+ this.pageLoadId = this.getPageLoadId();
205
+
206
+ if(!this.globals?.siteId) {
207
+ throw new Error('Beacon: No siteId found in globals. Beacon will not initialize.');
208
+ } else {
209
+ this.globals.siteId = `${this.globals.siteId}`.trim().toLowerCase();
210
+ }
211
+ }
212
+
213
+ private getCookie(name: string): string {
214
+ if (typeof window !== 'undefined' && featureFlags.cookies) {
215
+ const cookieName = name + '=';
216
+ const cookiesList = window.document.cookie.split(';');
217
+
218
+ for (let i = 0; i < cookiesList.length; i++) {
219
+ let cookie = cookiesList[i];
220
+
221
+ while (cookie.charAt(0) == ' ') {
222
+ cookie = cookie.substring(1);
223
+ }
224
+
225
+ if (cookie.indexOf(cookieName) == 0) {
226
+ return decodeURIComponent(cookie.substring(cookieName.length, cookie.length));
227
+ }
228
+ }
229
+ return '';
230
+ }
231
+ return '';
232
+ }
233
+
234
+ private setCookie(name: string, value: string, samesite: string, expiration: number, domain?: string): void {
235
+ if (featureFlags.cookies) {
236
+ try {
237
+ const secureString = window.location.protocol == 'https:' ? 'Secure;' : '';
238
+ const sameSiteString = 'SameSite=' + (samesite || 'Lax') + ';';
239
+ let expiresString = '';
240
+ if (expiration) {
241
+ const d = new Date();
242
+ d.setTime(d.getTime() + expiration);
243
+ expiresString = 'expires=' + d['toUTCString']() + ';';
244
+ }
245
+ const valueString = encodeURIComponent(value) + ';';
246
+ if (domain) {
247
+ window.document.cookie = name + "=" + valueString + expiresString + sameSiteString + secureString + "path=/; domain=" + domain;
248
+ } else {
249
+ const host = window?.location?.hostname;
250
+ if (!host || host.split('.').length === 1) {
251
+ window.document.cookie = name + "=" + valueString + expiresString + sameSiteString + secureString + "path=/";
252
+ } else {
253
+ const domainParts = host.split('.');
254
+ domainParts.shift();
255
+ domain = '.' + domainParts.join('.');
256
+
257
+ window.document.cookie = name + "=" + valueString + expiresString + sameSiteString + secureString + "path=/; domain=" + domain;
258
+
259
+ if (this.getCookie(name) == null || this.getCookie(name) != value) {
260
+ domain = '.' + host;
261
+ window.document.cookie = name + "=" + valueString + expiresString + sameSiteString + secureString + "path=/; domain=" + domain;
262
+ }
263
+ }
264
+ }
265
+ } catch (e: any) {
266
+ console.error(`Failed to set '${name}' cookie:`, e);
267
+ }
268
+ }
269
+ }
270
+
271
+ private getLocalStorageItem<T = LocalStorageItem>(name: string): T | undefined {
272
+ if (typeof window !== 'undefined' && featureFlags.storage) {
273
+ const rawData = window.localStorage?.getItem(name) || '';
274
+ try {
275
+ const data = JSON.parse(rawData);
276
+ if (data && data.value) {
277
+ return data.value;
278
+ } else {
279
+ // corrupted - delete entry
280
+ window.localStorage.removeItem(name);
281
+ }
282
+ } catch {
283
+ // noop - failed to parse stored value
284
+ }
285
+ }
286
+ }
287
+
288
+ private setLocalStorageItem(name: string, value: LocalStorageItem): void {
289
+ if (typeof window !== 'undefined' && featureFlags.storage) {
290
+ try {
291
+ window.localStorage.setItem(name, JSON.stringify({ value }));
292
+ } catch (e: any) {
293
+ console.warn(`Something went wrong setting '${name}' to local storage:`, e);
294
+ throw e;
295
+ }
296
+ }
297
+ }
298
+
299
+ storage = {
300
+ cart: {
301
+ get: (): Product[] => {
302
+ // perhaps... always get from storage and return Product[] - storage always has Product[]
303
+ const storedProducts = this.getLocalStorageItem(CART_KEY) as Product[];
304
+ if (storedProducts) {
305
+ try {
306
+ if (Array.isArray(storedProducts)) {
307
+ return storedProducts as Product[];
308
+ }
309
+ } catch {
310
+ // corrupted - delete entry
311
+ window?.localStorage.removeItem(CART_KEY);
312
+
313
+ this.setCookie(CART_KEY, '', COOKIE_SAMESITE, 0, COOKIE_DOMAIN);
314
+ }
315
+ } else {
316
+ const storedSkus = this.getCookie(CART_KEY);
317
+ // split on ',' and remap to Product[], setting qty and price to unknowns (0?)
318
+ return storedSkus
319
+ .split(',')
320
+ .filter((sku) => sku)
321
+ .map((sku) => ({ parentId: sku, uid: sku, sku: sku, qty: 1, price: 0 }));
322
+ }
323
+
324
+ return [];
325
+ },
326
+ set: (products: Product[]): void => {
327
+ // store Product[] into storage + store mapped string[] into cookie (for legacy purposes)
328
+ const currentCartProducts = this.storage.cart.get();
329
+ const stringifiedProducts = JSON.stringify(products);
330
+
331
+ try {
332
+ this.setLocalStorageItem(CART_KEY, products);
333
+ } catch (e: any) {
334
+ sendStorageError(e, this, CART_KEY, stringifiedProducts);
335
+ }
336
+
337
+ // also set cookie with re-mapping - favoring the more specific variant
338
+ const storedProductsCookie = products.map((product) => this.getProductId(product)).join(',');
339
+ this.setCookie(CART_KEY, storedProductsCookie, COOKIE_SAMESITE, 0, COOKIE_DOMAIN);
340
+
341
+ const productsHaveChanged = JSON.stringify(currentCartProducts) !== stringifiedProducts;
342
+ if (productsHaveChanged) {
343
+ this._sendPreflight();
344
+ }
345
+ },
346
+ add: (products: Product[]): void => {
347
+ if (products.length) {
348
+ const existingCartProducts = this.storage.cart.get();
349
+ const cartProducts = [...existingCartProducts];
350
+
351
+ products
352
+ .filter((product) => typeof product === 'object' && product.uid)
353
+ .reverse()
354
+ .forEach((product) => {
355
+ // ensure objects have properties
356
+ const isSkuAlreadyInCart = cartProducts.find((cartProduct) => cartProduct.uid === product.uid);
357
+ if (!isSkuAlreadyInCart) {
358
+ cartProducts.unshift(product);
359
+ } else {
360
+ isSkuAlreadyInCart.qty += product.qty;
361
+ isSkuAlreadyInCart.price = product.price || isSkuAlreadyInCart.price;
362
+ if (product.parentId !== isSkuAlreadyInCart.parentId || product.sku !== isSkuAlreadyInCart.sku) {
363
+ // parentId or sku are set to the same values if fallback (due to localstorage disabled/full) to storing in cookie.
364
+ isSkuAlreadyInCart.parentId = product.parentId;
365
+ isSkuAlreadyInCart.sku = product.sku;
366
+ }
367
+ }
368
+ });
369
+
370
+ this.storage.cart.set(cartProducts);
371
+ }
372
+ },
373
+ remove: (products: Product[]): void => {
374
+ if (products.length) {
375
+ const existingCartProducts = this.storage.cart.get();
376
+ const cartProducts = [...existingCartProducts];
377
+
378
+ products.forEach((product) => {
379
+ const isSkuAlreadyInCart = cartProducts.find(
380
+ (cartProduct) =>
381
+ cartProduct.uid === product.uid
382
+ );
383
+ if (isSkuAlreadyInCart) {
384
+ if (isSkuAlreadyInCart.qty > 0) {
385
+ isSkuAlreadyInCart.qty -= product.qty || 1;
386
+ if (product.parentId !== isSkuAlreadyInCart.parentId || product.sku !== isSkuAlreadyInCart.sku) {
387
+ // parentId or sku are set to the same values if fallback (due to localstorage disabled/full) to storing in cookie.
388
+ isSkuAlreadyInCart.parentId = product.parentId;
389
+ isSkuAlreadyInCart.sku = product.sku;
390
+ }
391
+ }
392
+ }
393
+ });
394
+
395
+ // keep products with qty > 0
396
+ const updatedCartProducts = cartProducts.filter((product) => product.qty > 0);
397
+
398
+ this.storage.cart.set(updatedCartProducts);
399
+ }
400
+ },
401
+ clear: (): void => {
402
+ this.storage.cart.set([]);
403
+ },
404
+ },
405
+ viewed: {
406
+ get: (): ProductPageviewSchemaDataResult[] => {
407
+ const storedItems = this.getLocalStorageItem(VIEWED_KEY) as ProductPageviewSchemaDataResult[];
408
+ if (storedItems) {
409
+ try {
410
+ if (Array.isArray(storedItems)) {
411
+ return storedItems as ProductPageviewSchemaDataResult[];
412
+ }
413
+ } catch {
414
+ // corrupted - delete entry
415
+ window?.localStorage.removeItem(VIEWED_KEY);
416
+
417
+ this.setCookie(VIEWED_KEY, '', COOKIE_SAMESITE, MAX_EXPIRATION, COOKIE_DOMAIN);
418
+ }
419
+ } else {
420
+ const storedSkus = this.getCookie(VIEWED_KEY);
421
+ // split on ',' and remap to Product[], setting qty and price to unknowns (0?)
422
+ return storedSkus
423
+ .split(',')
424
+ .filter((sku) => sku)
425
+ .map((sku) => ({ parentId: sku, uid: sku, sku: sku }));
426
+ }
427
+ return [];
428
+ },
429
+ set: (products: ProductPageviewSchemaDataResult[]): void => {
430
+ const currentViewedItems = this.storage.viewed.get();
431
+ // remove qty and price if product is provided
432
+ const normalizedItems: ProductPageviewSchemaDataResult[] = products
433
+ .map((item) => ({ sku: item.sku, parentId: item.parentId, uid: item.uid }))
434
+ .slice(0, MAX_VIEWED_COUNT);
435
+
436
+ const stringifiedNormalizedItems = JSON.stringify(normalizedItems);
437
+
438
+ try {
439
+ this.setLocalStorageItem(VIEWED_KEY, normalizedItems);
440
+ } catch (e: any) {
441
+ sendStorageError(e, this, VIEWED_KEY, stringifiedNormalizedItems);
442
+ }
443
+
444
+ // also set cookie with re-mapping - favoring the more specific variant
445
+ const storedProductsCookie = normalizedItems.map((item) => this.getProductId(item)).join(',');
446
+ this.setCookie(VIEWED_KEY, storedProductsCookie, COOKIE_SAMESITE, MAX_EXPIRATION, COOKIE_DOMAIN);
447
+
448
+ const productsHaveChanged = JSON.stringify(currentViewedItems) !== stringifiedNormalizedItems;
449
+ if (productsHaveChanged) {
450
+ this._sendPreflight();
451
+ }
452
+ },
453
+ add: (products: ProductPageviewSchemaDataResult[]): void => {
454
+ // the order of the stored items matters - most recently viewed should be in front of array?
455
+ if (products.length) {
456
+ const viewedProducts = this.storage.viewed.get();
457
+ products.forEach((product) => {
458
+ const item: ProductPageviewSchemaDataResult = {
459
+ sku: product.sku,
460
+ parentId: product.parentId,
461
+ uid: product.uid,
462
+ };
463
+ const isItemAlreadyViewed = viewedProducts.find((viewedProduct) => viewedProduct.uid === item.uid);
464
+ if (isItemAlreadyViewed) {
465
+ // item has been viewed remove it from array
466
+ const index = viewedProducts.indexOf(isItemAlreadyViewed);
467
+ viewedProducts.splice(index, 1);
468
+ }
469
+ // add item to front of array
470
+ viewedProducts.unshift(item);
471
+ });
472
+ this.storage.viewed.set(viewedProducts);
473
+ }
474
+ },
475
+ },
476
+ };
477
+
478
+ events = {
479
+ shopper: {
480
+ login: (event: Payload<{ id: string }>) => {
481
+ const context = this.getContext() as ShopperContext;
482
+ context.shopperId = event.data?.id;
483
+ if(event.data?.id) {
484
+ const payload: LoginRequest = {
485
+ siteId: event?.siteId || this.globals.siteId,
486
+ shopperLoginSchema: {
487
+ context,
488
+ },
489
+ };
490
+ const request = this.createRequest('shopper', 'login', payload);
491
+ this.sendRequests([request]);
492
+ }
493
+ },
494
+ },
495
+ autocomplete: {
496
+ render: (event: Payload<RenderSchemaData>) => {
497
+ const payload: AutocompleteRenderRequest = {
498
+ siteId: event?.siteId || this.globals.siteId,
499
+ renderSchema: {
500
+ context: this.getContext(),
501
+ data: event.data,
502
+ },
503
+ };
504
+
505
+ const request = this.createRequest('autocomplete', 'autocompleteRender', payload);
506
+ this.queueRequest(request);
507
+ },
508
+ impression: (event: Payload<ImpressionSchemaData>) => {
509
+ const payload: AutocompleteImpressionRequest = {
510
+ siteId: event?.siteId || this.globals.siteId,
511
+ impressionSchema: {
512
+ context: this.getContext(),
513
+ data: event.data,
514
+ },
515
+ };
516
+
517
+ const request = this.createRequest('autocomplete', 'autocompleteImpression', payload);
518
+ this.queueRequest(request);
519
+ },
520
+ addToCart: (event: Payload<AddtocartSchemaData>) => {
521
+ if (event.data.results) {
522
+ this.storage.cart.add(event.data.results);
523
+ }
524
+
525
+ const payload: AutocompleteAddtocartRequest = {
526
+ siteId: event?.siteId || this.globals.siteId,
527
+ addtocartSchema: {
528
+ context: this.getContext(),
529
+ data: event.data,
530
+ },
531
+ };
532
+
533
+ const request = this.createRequest('autocomplete', 'autocompleteAddtocart', payload);
534
+ this.queueRequest(request);
535
+ },
536
+ clickThrough: (event: Payload<ClickthroughSchemaData>) => {
537
+ const payload: AutocompleteClickthroughRequest = {
538
+ siteId: event?.siteId || this.globals.siteId,
539
+ clickthroughSchema: {
540
+ context: this.getContext(),
541
+ data: event.data,
542
+ },
543
+ };
544
+
545
+ const request = this.createRequest('autocomplete', 'autocompleteClickthrough', payload);
546
+ this.sendRequests([request]);
547
+ },
548
+ redirect: (event: Payload<RedirectSchemaData>) => {
549
+ const payload: AutocompleteRedirectRequest = {
550
+ siteId: event?.siteId || this.globals.siteId,
551
+ redirectSchema: {
552
+ context: this.getContext(),
553
+ data: event.data,
554
+ },
555
+ };
556
+
557
+ const request = this.createRequest('autocomplete', 'autocompleteRedirect', payload);
558
+ this.sendRequests([request]);
559
+ },
560
+ },
561
+ search: {
562
+ render: (event: Payload<RenderSchemaData>) => {
563
+ const payload: SearchRenderRequest = {
564
+ siteId: event?.siteId || this.globals.siteId,
565
+ renderSchema: {
566
+ context: this.getContext(),
567
+ data: event.data,
568
+ },
569
+ };
570
+
571
+ const request = this.createRequest('search', 'searchRender', payload);
572
+ this.queueRequest(request);
573
+ },
574
+ impression: (event: Payload<ImpressionSchemaData>) => {
575
+ const payload: SearchImpressionRequest = {
576
+ siteId: event?.siteId || this.globals.siteId,
577
+ impressionSchema: {
578
+ context: this.getContext(),
579
+ data: event.data,
580
+ },
581
+ };
582
+
583
+ const request = this.createRequest('search', 'searchImpression', payload);
584
+ this.queueRequest(request);
585
+ },
586
+ addToCart: (event: Payload<AddtocartSchemaData>) => {
587
+ if (event.data.results) {
588
+ this.storage.cart.add(event.data.results);
589
+ }
590
+
591
+ const payload: SearchAddtocartRequest = {
592
+ siteId: event?.siteId || this.globals.siteId,
593
+ addtocartSchema: {
594
+ context: this.getContext(),
595
+ data: event.data,
596
+ },
597
+ };
598
+
599
+ const request = this.createRequest('search', 'searchAddtocart', payload);
600
+ this.queueRequest(request);
601
+ },
602
+ clickThrough: (event: Payload<ClickthroughSchemaData>) => {
603
+ const payload: SearchClickthroughRequest = {
604
+ siteId: event?.siteId || this.globals.siteId,
605
+ clickthroughSchema: {
606
+ context: this.getContext(),
607
+ data: event.data,
608
+ },
609
+ };
610
+
611
+ const request = this.createRequest('search', 'searchClickthrough', payload);
612
+ this.sendRequests([request]);
613
+ },
614
+ redirect: (event: Payload<RedirectSchemaData>) => {
615
+ const payload: SearchRedirectRequest = {
616
+ siteId: event?.siteId || this.globals.siteId,
617
+ redirectSchema: {
618
+ context: this.getContext(),
619
+ data: event.data,
620
+ },
621
+ };
622
+
623
+ const request = this.createRequest('search', 'searchRedirect', payload);
624
+ this.sendRequests([request]);
625
+ },
626
+ },
627
+ category: {
628
+ render: (event: Payload<RenderSchemaData>) => {
629
+ const payload: CategoryRenderRequest = {
630
+ siteId: event?.siteId || this.globals.siteId,
631
+ renderSchema: {
632
+ context: this.getContext(),
633
+ data: event.data,
634
+ },
635
+ };
636
+
637
+ const request = this.createRequest('category', 'categoryRender', payload);
638
+ this.queueRequest(request);
639
+ },
640
+ impression: (event: Payload<ImpressionSchemaData>) => {
641
+ const payload: CategoryImpressionRequest = {
642
+ siteId: event?.siteId || this.globals.siteId,
643
+ impressionSchema: {
644
+ context: this.getContext(),
645
+ data: event.data,
646
+ },
647
+ };
648
+
649
+ const request = this.createRequest('category', 'categoryImpression', payload);
650
+ this.queueRequest(request);
651
+ },
652
+ addToCart: (event: Payload<AddtocartSchemaData>) => {
653
+ if (event.data.results) {
654
+ this.storage.cart.add(event.data.results);
655
+ }
656
+
657
+ const payload: CategoryAddtocartRequest = {
658
+ siteId: event?.siteId || this.globals.siteId,
659
+ addtocartSchema: {
660
+ context: this.getContext(),
661
+ data: event.data,
662
+ },
663
+ };
664
+
665
+ const request = this.createRequest('category', 'categoryAddtocart', payload);
666
+ this.queueRequest(request);
667
+ },
668
+ clickThrough: (event: Payload<ClickthroughSchemaData>) => {
669
+ const payload: CategoryClickthroughRequest = {
670
+ siteId: event?.siteId || this.globals.siteId,
671
+ clickthroughSchema: {
672
+ context: this.getContext(),
673
+ data: event.data,
674
+ },
675
+ };
676
+
677
+ const request = this.createRequest('category', 'categoryClickthrough', payload);
678
+ this.sendRequests([request]);
679
+ },
680
+ },
681
+ recommendations: {
682
+ render: (event: Payload<RecommendationsRenderSchemaData>) => {
683
+ const payload: RecommendationsRenderRequest = {
684
+ siteId: event?.siteId || this.globals.siteId,
685
+ recommendationsRenderSchema: {
686
+ context: this.getContext(),
687
+ data: event.data,
688
+ },
689
+ };
690
+
691
+ const request = this.createRequest('recommendations', 'recommendationsRender', payload);
692
+ this.queueRequest(request);
693
+ },
694
+ impression: (event: Payload<RecommendationsImpressionSchemaData>) => {
695
+ const payload: RecommendationsImpressionRequest = {
696
+ siteId: event?.siteId || this.globals.siteId,
697
+ recommendationsImpressionSchema: {
698
+ context: this.getContext(),
699
+ data: event.data,
700
+ },
701
+ };
702
+
703
+ const request = this.createRequest('recommendations', 'recommendationsImpression', payload);
704
+ this.queueRequest(request);
705
+ },
706
+ addToCart: (event: Payload<RecommendationsAddtocartSchemaData>) => {
707
+ if (event.data.results) {
708
+ this.storage.cart.add(event.data.results);
709
+ }
710
+
711
+ const payload: RecommendationsAddtocartRequest = {
712
+ siteId: event?.siteId || this.globals.siteId,
713
+ recommendationsAddtocartSchema: {
714
+ context: this.getContext(),
715
+ data: event.data,
716
+ },
717
+ };
718
+
719
+ const request = this.createRequest('recommendations', 'recommendationsAddtocart', payload);
720
+ this.queueRequest(request);
721
+ },
722
+ clickThrough: (event: Payload<RecommendationsClickthroughSchemaData>) => {
723
+ const payload: RecommendationsClickthroughRequest = {
724
+ siteId: event?.siteId || this.globals.siteId,
725
+ recommendationsClickthroughSchema: {
726
+ context: this.getContext(),
727
+ data: event.data,
728
+ },
729
+ };
730
+
731
+ const request = this.createRequest('recommendations', 'recommendationsClickthrough', payload);
732
+ this.sendRequests([request]);
733
+ },
734
+ },
735
+ product: {
736
+ pageView: (event: Payload<ProductPageviewSchemaData>) => {
737
+ const payload: ProductPageviewRequest = {
738
+ siteId: event?.siteId || this.globals.siteId,
739
+ productPageviewSchema: {
740
+ context: this.getContext(),
741
+ data: event.data,
742
+ },
743
+ };
744
+
745
+ const request = this.createRequest('product', 'productPageview', payload);
746
+ this.sendRequests([request]);
747
+
748
+ const item = event.data.result;
749
+ this.storage.viewed.add([item]);
750
+ },
751
+ },
752
+ cart: {
753
+ add: (event: Payload<CartSchemaData>) => {
754
+ const data = {
755
+ ...event.data,
756
+ };
757
+
758
+ if (!data.cart) {
759
+ if (data.results) {
760
+ this.storage.cart.add(data.results);
761
+ }
762
+ data.cart = this.storage.cart.get();
763
+ } else {
764
+ this.storage.cart.set(data.cart);
765
+ }
766
+
767
+ const payload: CartAddRequest = {
768
+ siteId: event?.siteId || this.globals.siteId,
769
+ cartSchema: {
770
+ context: this.getContext(),
771
+ data,
772
+ },
773
+ };
774
+ const request = this.createRequest('cart', 'cartAdd', payload);
775
+ this.sendRequests([request]);
776
+ },
777
+ remove: (event: Payload<CartSchemaData>) => {
778
+ const data = {
779
+ ...event.data,
780
+ };
781
+ if (!data.cart) {
782
+ if (data.results) {
783
+ this.storage.cart.remove(data.results);
784
+ }
785
+ data.cart = this.storage.cart.get();
786
+ } else {
787
+ this.storage.cart.set(data.cart);
788
+ }
789
+
790
+ const payload: CartRemoveRequest = {
791
+ siteId: event?.siteId || this.globals.siteId,
792
+ cartSchema: {
793
+ context: this.getContext(),
794
+ data,
795
+ },
796
+ };
797
+
798
+ const request = this.createRequest('cart', 'cartRemove', payload);
799
+ this.sendRequests([request]);
800
+ },
801
+ },
802
+ order: {
803
+ transaction: (event: Payload<OrderTransactionSchemaData>) => {
804
+ const payload: OrderTransactionRequest = {
805
+ siteId: event?.siteId || this.globals.siteId,
806
+ orderTransactionSchema: {
807
+ context: this.getContext(),
808
+ data: event.data,
809
+ },
810
+ };
811
+
812
+ const request = this.createRequest('order', 'orderTransaction', payload);
813
+ this.sendRequests([request]);
814
+ this.storage.cart.clear();
815
+ },
816
+ },
817
+ error: {
818
+ shopifypixel: (event: Payload<LogSchemaData>) => {
819
+ const payload: LogShopifypixelRequest = {
820
+ siteId: event?.siteId || this.globals.siteId,
821
+ logSchema: {
822
+ context: this.getContext(),
823
+ data: event.data,
824
+ },
825
+ };
826
+
827
+ const request = this.createRequest('error', 'logShopifypixel', payload);
828
+ this.sendRequests([request]);
829
+ },
830
+ snap: (event: Payload<LogSchemaData>) => {
831
+ const payload: LogSnapRequest = {
832
+ siteId: event?.siteId || this.globals.siteId,
833
+ logSchema: {
834
+ context: this.getContext(),
835
+ data: event.data,
836
+ },
837
+ };
838
+
839
+ const request = this.createRequest('error', 'logSnap', payload);
840
+ this.sendRequests([request]);
841
+ },
842
+ },
843
+ };
844
+
845
+ queueRequest(request: PayloadRequest): void {
846
+ this.requests.push(request);
847
+
848
+ clearTimeout(this.batchIntervalTimeout);
849
+ this.batchIntervalTimeout = setTimeout(() => {
850
+ this.processRequests();
851
+ }, REQUEST_GROUPING_TIMEOUT);
852
+ }
853
+
854
+ updateContext(key: keyof Context, value: any): void {
855
+ if (value === undefined) {
856
+ return;
857
+ }
858
+ switch (key) {
859
+ case 'userId':
860
+ case 'sessionId':
861
+ case 'shopperId':
862
+ case 'pageLoadId':
863
+ case 'attribution':
864
+ this[key] = value;
865
+ break;
866
+ case 'pageUrl':
867
+ this.config.href = value;
868
+ break;
869
+ case 'userAgent':
870
+ this.config.userAgent = value;
871
+ break;
872
+ case 'dev':
873
+ if (['production', 'development'].includes(value)) this.mode = value;
874
+ break;
875
+ default:
876
+ break;
877
+ }
878
+ }
879
+
880
+ getContext(): Context {
881
+ const context: Context = {
882
+ userAgent: this.config.userAgent,
883
+ timestamp: this.getTimestamp(),
884
+ pageUrl: this.config.href || (typeof window !== 'undefined' && window.location.href) || '',
885
+ userId: this.userId || this.getUserId(),
886
+ sessionId: this.sessionId || this.getSessionId(),
887
+ pageLoadId: this.pageLoadId,
888
+ shopperId: this.shopperId || this.getShopperId(),
889
+ initiator: this.initiator,
890
+ dev: this.mode === 'development' ? true : undefined,
891
+ attribution: this.attribution || this.getAttribution(),
892
+ };
893
+ if (this.currency.code) {
894
+ context.currency = { ...this.currency };
895
+ }
896
+ return context;
897
+ }
898
+
899
+ private getStoredId(key: 'userId' | 'sessionId', storageKey: string, expiration: number): string {
900
+ const keys = ['userId', 'sessionId'];
901
+ let uuid: string = '';
902
+ let storedCookieValue: string = '';
903
+
904
+ try {
905
+ // try to get the value from the cookie
906
+ storedCookieValue = this.getCookie(storageKey);
907
+
908
+ // try to get the value from the local storage
909
+ const data = this.getLocalStorageItem(storageKey) as { timestamp: string; value: string };
910
+ if (data.timestamp && new Date(data.timestamp).getTime() < Date.now() - expiration) {
911
+ uuid = this.generateId();
912
+ /**
913
+ * TODO: move this expiration to setLocalStorageItem at value level instead of data.value level and
914
+ * then create a new return type getLocalStorageItem with Product[], Item[],
915
+ * AttributionInner[], and { timestamp: string; value: string }
916
+ */
917
+ this.attribution = undefined;
918
+ } else {
919
+ uuid = data.value;
920
+ }
921
+ } catch {
922
+ // noop - Either no value or failed to parse stored, create new id
923
+ } finally {
924
+ const data = {
925
+ value: storedCookieValue || uuid || this.generateId(),
926
+ timestamp: this.getTimestamp(),
927
+ };
928
+
929
+ if (keys.includes(key)) {
930
+ this[key] = data.value;
931
+ }
932
+
933
+ // set cookie
934
+ this.setCookie(storageKey, data.value, COOKIE_SAMESITE, EXPIRED_COOKIE, COOKIE_DOMAIN); // clear old subdomain cookie
935
+ this.setCookie(storageKey, data.value, COOKIE_SAMESITE, expiration); // attempt to store in cookie
936
+
937
+ // set local storage
938
+ try {
939
+ this.setLocalStorageItem(storageKey, data);
940
+ } catch (e: any) {
941
+ // failed to save value - storage may be disabled
942
+ sendStorageError(e, this, storageKey, data.value);
943
+ }
944
+
945
+ return data.value;
946
+ }
947
+ }
948
+
949
+ public getPageLoadId(): string {
950
+ if (this.pageLoadId) {
951
+ return this.pageLoadId;
952
+ }
953
+
954
+ let pageLoadId = this.generateId();
955
+ const pageLoadData = this.getLocalStorageItem<PageLoadData>(PAGE_LOAD_ID_KEY);
956
+ const currentHref = this.config.href || (typeof window !== 'undefined' && window.location.href) || '';
957
+ if (pageLoadData) {
958
+ const { href, value, timestamp } = pageLoadData;
959
+ if (href === currentHref && value && timestamp && new Date(timestamp).getTime() > Date.now() - PAGE_LOAD_ID_EXPIRATION) {
960
+ pageLoadId = value;
961
+ }
962
+ }
963
+
964
+ this.pageLoadId = pageLoadId;
965
+
966
+ try {
967
+ this.setLocalStorageItem(PAGE_LOAD_ID_KEY, { href: currentHref, value: pageLoadId, timestamp: this.getTimestamp() });
968
+ } catch (e: any) {
969
+ // failed to save value - storage may be disabled
970
+ sendStorageError(e, this, PAGE_LOAD_ID_KEY, pageLoadId);
971
+ }
972
+
973
+ return pageLoadId;
974
+ }
975
+
976
+ public getUserId(): string {
977
+ return this.userId || this.getStoredId('userId', USER_ID_KEY, MAX_EXPIRATION);
978
+ }
979
+
980
+ public getSessionId(): string {
981
+ return this.sessionId || this.getStoredId('sessionId', SESSION_ID_KEY, THIRTY_MINUTES);
982
+ }
983
+
984
+ public getShopperId(): string {
985
+ try {
986
+ // cookie value is always a string, but localstorage could be a number
987
+ const cookieValue = this.getCookie(SHOPPER_ID_KEY);
988
+ const storageValue = this.getLocalStorageItem(SHOPPER_ID_KEY) as string;
989
+
990
+ // set the shopperId to the cookie value if it exists, otherwise use the local storage value and then convert to string if they exist
991
+ const shopperId = cookieValue || (storageValue ? '' + storageValue : undefined);
992
+ if (shopperId) {
993
+ this.shopperId = shopperId;
994
+ }
995
+ } catch {
996
+ // noop
997
+ }
998
+
999
+ return this.shopperId || '';
1000
+ }
1001
+
1002
+ public setShopperId(shopperId: string): void {
1003
+ if (!shopperId) {
1004
+ return;
1005
+ }
1006
+ const existingShopperId = this.getShopperId();
1007
+ if (existingShopperId !== shopperId) {
1008
+ this.shopperId = '' + shopperId; // ensure string
1009
+ this.setCookie(SHOPPER_ID_KEY, this.shopperId, COOKIE_SAMESITE, MAX_EXPIRATION, COOKIE_DOMAIN);
1010
+ try {
1011
+ this.setLocalStorageItem(SHOPPER_ID_KEY, this.shopperId);
1012
+ } catch (e: any) {
1013
+ sendStorageError(e, this, SHOPPER_ID_KEY, this.shopperId);
1014
+ }
1015
+ this.events.shopper.login({ data: { id: this.shopperId }});
1016
+ this._sendPreflight();
1017
+ }
1018
+ }
1019
+
1020
+ private getAttribution(): AttributionInner[] | undefined {
1021
+ let attribution: AttributionInner[] = [];
1022
+
1023
+ let urlAttribution: string | null = null;
1024
+ try {
1025
+ const url = new URL(this.config.href || (typeof window !== 'undefined' && window.location.href) || '');
1026
+ urlAttribution = url.searchParams.get(ATTRIBUTION_QUERY_PARAM);
1027
+ } catch (e) {
1028
+ // noop - URL failed to parse empty url
1029
+ }
1030
+
1031
+ const storedAttribution = this.getCookie(ATTRIBUTION_KEY) || (this.getLocalStorageItem(ATTRIBUTION_KEY) as AttributionInner[]);
1032
+ if (storedAttribution) {
1033
+ try {
1034
+ if (typeof storedAttribution === 'string') {
1035
+ // from cookie
1036
+ attribution = JSON.parse(storedAttribution) as AttributionInner[];
1037
+ } else if (Array.isArray(storedAttribution)) {
1038
+ attribution = storedAttribution;
1039
+ }
1040
+ } catch (e) {
1041
+ // noop - failed to parse stored attribution
1042
+ }
1043
+ }
1044
+
1045
+ if (urlAttribution) {
1046
+ try {
1047
+ const [type, id] = decodeURIComponent(urlAttribution).split(':');
1048
+ if (type && id && !attribution.find((attr) => attr.type === type && attr.id === id)) {
1049
+ attribution.unshift({ type, id });
1050
+ }
1051
+ } catch {
1052
+ // noop - failed to decode url attribution
1053
+ }
1054
+ }
1055
+
1056
+ if (attribution.length) {
1057
+ const stringifiedAttribution = JSON.stringify(attribution);
1058
+ this.setCookie(ATTRIBUTION_KEY, stringifiedAttribution, COOKIE_SAMESITE, THIRTY_MINUTES, COOKIE_DOMAIN);
1059
+ try {
1060
+ this.setLocalStorageItem(ATTRIBUTION_KEY, attribution);
1061
+ } catch (e: any) {
1062
+ sendStorageError(e, this, ATTRIBUTION_KEY, stringifiedAttribution);
1063
+ }
1064
+ this.attribution = attribution;
1065
+ return [...attribution];
1066
+ }
1067
+ }
1068
+
1069
+ generateId(): string {
1070
+ return uuidv4();
1071
+ }
1072
+
1073
+ getTimestamp(): string {
1074
+ return new Date().toISOString();
1075
+ }
1076
+
1077
+ setCurrency(currency: Currency): void {
1078
+ if (currency && currency.code && this.currency?.code !== currency.code) {
1079
+ this.currency = currency;
1080
+ }
1081
+ }
1082
+
1083
+ pageLoad(): string {
1084
+ this.pageLoadId = this.generateId();
1085
+ return this.pageLoadId;
1086
+ }
1087
+
1088
+ // TODO: add resetSession method - clear cookies, local storage
1089
+
1090
+ private createRequest(apiType: PayloadRequest['apiType'], endpoint: string, payload: any): PayloadRequest {
1091
+ const request: PayloadRequest = {
1092
+ apiType,
1093
+ endpoint,
1094
+ payload,
1095
+ };
1096
+ return request;
1097
+ }
1098
+
1099
+ private getApiClient(apiType: PayloadRequest['apiType']): ApiMethodMap[typeof apiType] {
1100
+ return this.apis[apiType];
1101
+ }
1102
+
1103
+ private sendRequests(requests: PayloadRequest[]): void {
1104
+ for (const request of requests) {
1105
+ const api = this.getApiClient(request.apiType);
1106
+ const apiMethod = request.endpoint;
1107
+ const initOverrides: InitOverrideFunction = async ({ init }) => {
1108
+ const headers = { ...init.headers, ...this.config.requesters?.beacon?.headers || {} };
1109
+ const isJSON = headers && 'Content-Type' in headers && headers['Content-Type'] === 'application/json';
1110
+ return {
1111
+ // Cypress intecepts does not support keepalive
1112
+ keepalive: this.mode === 'production' ? true : undefined,
1113
+ body: isJSON ? init.body : JSON.stringify(init.body),
1114
+ headers,
1115
+ };
1116
+ };
1117
+
1118
+ // typing is difficult due to dynamic API and method call
1119
+ (api as any)[apiMethod as keyof typeof api](request.payload, initOverrides).catch((e: any) => {
1120
+ // noop - do not throw errors
1121
+ if (this.mode === 'development') {
1122
+ console.debug(e)
1123
+ }
1124
+ });
1125
+ }
1126
+ }
1127
+
1128
+ private processRequests(): void {
1129
+ const data = this.requests.reduce<{
1130
+ nonBatched: PayloadRequest[];
1131
+ batches: Record<string, PayloadRequest>;
1132
+ }>(
1133
+ (acc, request) => {
1134
+ let key = `${request.payload.siteId}||${request.endpoint}`;
1135
+
1136
+ switch (request.endpoint) {
1137
+ case 'recommendationsAddtocart':
1138
+ const recommendationsAddtocart = (request.payload as RecommendationsAddtocartRequest).recommendationsAddtocartSchema;
1139
+ key += additionalRequestKeys(key, 'recommendation', recommendationsAddtocart);
1140
+ appendResults(acc, key, 'recommendationsAddtocartSchema', request);
1141
+ break;
1142
+ case 'recommendationsImpression':
1143
+ const recommendationsImpression = (request.payload as RecommendationsImpressionRequest).recommendationsImpressionSchema;
1144
+ key += additionalRequestKeys(key, 'recommendation', recommendationsImpression);
1145
+ appendResults(acc, key, 'recommendationsImpressionSchema', request);
1146
+ break;
1147
+ case 'searchAddtocart':
1148
+ const searchAddtocart = (request.payload as SearchAddtocartRequest).addtocartSchema;
1149
+ key += additionalRequestKeys(key, 'search', searchAddtocart);
1150
+ appendResults(acc, key, 'addtocartSchema', request);
1151
+ break;
1152
+ case 'searchImpression':
1153
+ const searchImpression = (request.payload as SearchImpressionRequest).impressionSchema;
1154
+ key += additionalRequestKeys(key, 'search', searchImpression);
1155
+ appendResults(acc, key, 'impressionSchema', request);
1156
+ break;
1157
+ case 'autocompleteAddtocart':
1158
+ const autocompleteAddtocart = (request.payload as AutocompleteAddtocartRequest).addtocartSchema;
1159
+ key += additionalRequestKeys(key, 'autocomplete', autocompleteAddtocart);
1160
+ appendResults(acc, key, 'addtocartSchema', request);
1161
+ break;
1162
+ case 'autocompleteImpression':
1163
+ const autocompleteImpression = (request.payload as AutocompleteImpressionRequest).impressionSchema;
1164
+ key += additionalRequestKeys(key, 'autocomplete', autocompleteImpression);
1165
+ appendResults(acc, key, 'impressionSchema', request);
1166
+ break;
1167
+ case 'categoryAddtocart':
1168
+ const categoryAddtocart = (request.payload as CategoryAddtocartRequest).addtocartSchema;
1169
+ key += additionalRequestKeys(key, 'category', categoryAddtocart);
1170
+ appendResults(acc, key, 'addtocartSchema', request);
1171
+ break;
1172
+ case 'categoryImpression':
1173
+ const categoryImpression = (request.payload as CategoryImpressionRequest).impressionSchema;
1174
+ key += additionalRequestKeys(key, 'category', categoryImpression);
1175
+ appendResults(acc, key, 'impressionSchema', request);
1176
+ break;
1177
+ default:
1178
+ // non-batched requests
1179
+ acc.nonBatched.push(request);
1180
+ break;
1181
+ }
1182
+
1183
+ return acc;
1184
+ },
1185
+ {
1186
+ nonBatched: [],
1187
+ batches: {},
1188
+ }
1189
+ );
1190
+
1191
+ this.requests = [];
1192
+
1193
+ // combine batches and non-batched requests
1194
+ const requestsToSend = Object.values(data.batches).reduce<PayloadRequest[]>((acc, batch) => {
1195
+ acc.push(batch);
1196
+ return acc;
1197
+ }, data.nonBatched);
1198
+
1199
+ this.sendRequests(requestsToSend);
1200
+ }
1201
+
1202
+ private _sendPreflight(): void {
1203
+ clearTimeout(this.preflightTimeout);
1204
+ this.preflightTimeout = setTimeout(() => {
1205
+ this.sendPreflight();
1206
+ }, PREFLIGHT_DEBOUNCE_TIMEOUT);
1207
+ }
1208
+
1209
+ public sendPreflight(overrides?: { userId: string; siteId: string; shopper: string; cart: Product[]; lastViewed: ProductPageviewSchemaDataResult[] }): void {
1210
+ const userId = overrides?.userId || this.getUserId();
1211
+ const siteId = overrides?.siteId || this.globals.siteId;
1212
+ const shopper = overrides?.shopper || this.getShopperId();
1213
+ const cart = overrides?.cart || this.storage.cart.get();
1214
+ const lastViewed = overrides?.lastViewed || this.storage.viewed.get();
1215
+
1216
+ if (userId && typeof userId == 'string' && siteId) {
1217
+ const preflightParams: PreflightRequestModel = {
1218
+ userId,
1219
+ siteId,
1220
+ };
1221
+
1222
+ if (shopper) {
1223
+ preflightParams.shopper = shopper;
1224
+ }
1225
+ if (cart.length) {
1226
+ preflightParams.cart = cart.map((item) => this.getProductId(item));
1227
+ }
1228
+ if (lastViewed.length) {
1229
+ preflightParams.lastViewed = lastViewed.map((item) => this.getProductId(item));
1230
+ }
1231
+
1232
+ const domain = `${siteId}`.toLowerCase().startsWith('at') ? 'athoscommerce.io' : 'searchspring.io';
1233
+ const origin = this.config.requesters?.personalization?.origin || `https://${siteId}.a.${domain}`;
1234
+ const endpoint = `${origin}/api/personalization/preflightCache`;
1235
+
1236
+ if (this.config.apis?.fetch || typeof fetch !== 'undefined') {
1237
+ (this.config.apis?.fetch || fetch)(endpoint, {
1238
+ method: 'POST',
1239
+ headers: {
1240
+ 'Content-Type': 'text/plain',
1241
+ ...this.config.requesters?.personalization?.headers || {},
1242
+ },
1243
+ body: JSON.stringify(preflightParams),
1244
+ keepalive: true,
1245
+ });
1246
+ }
1247
+ }
1248
+ }
1249
+
1250
+ protected getProductId(product: Product | ProductPageviewSchemaDataResult): string {
1251
+ return `${product.sku || product.uid || ''}`.trim();
1252
+ }
1253
+ }
1254
+
1255
+ export function appendResults(
1256
+ acc: {
1257
+ nonBatched: PayloadRequest[];
1258
+ batches: Record<string, PayloadRequest>;
1259
+ },
1260
+ key: string,
1261
+ schemaName: string,
1262
+ request: PayloadRequest
1263
+ ) {
1264
+ if (!acc.batches[key]) {
1265
+ // first request for this batch will contain context data
1266
+ acc.batches[key] = JSON.parse(JSON.stringify(request));
1267
+ } else {
1268
+ // append results
1269
+ const batchPayload = acc.batches[key].payload;
1270
+ const requestPayload = request.payload;
1271
+ const batchSchema = batchPayload[schemaName];
1272
+ const requestSchema = requestPayload[schemaName];
1273
+
1274
+ if (requestSchema?.data?.results) {
1275
+ const results = batchSchema.data.results || [];
1276
+ const resultsToAdd = requestSchema.data.results;
1277
+ const newResults = [...results, ...resultsToAdd];
1278
+ batchSchema.data.results = newResults;
1279
+ }
1280
+ // also do this for banners
1281
+ if (requestSchema?.data?.banners) {
1282
+ const banners = batchSchema?.data?.banners || [];
1283
+ const bannersToAdd = requestSchema.data.banners;
1284
+ const newBanners = [...banners, ...bannersToAdd];
1285
+ batchSchema.data.banners = newBanners;
1286
+ }
1287
+ }
1288
+ }
1289
+
1290
+ export function additionalRequestKeys(
1291
+ key: string,
1292
+ type: 'search' | 'autocomplete' | 'category' | 'recommendation',
1293
+ schema: ImpressionSchema | RecommendationsImpressionSchema | RecommendationsAddtocartSchema | AddtocartSchema
1294
+ ): string {
1295
+ let value = key;
1296
+ value += `||${schema.context.pageLoadId}`;
1297
+ value += `||${schema.context.sessionId}`;
1298
+
1299
+ if (schema.data.responseId) {
1300
+ value += `||responseId=${schema.data.responseId}`;
1301
+ }
1302
+
1303
+ if (type === 'recommendation') {
1304
+ value += `||tag=${(schema as RecommendationsImpressionSchema).data.tag}`;
1305
+ }
1306
+
1307
+ return value;
1308
+ }
1309
+
1310
+ function sendStorageError(e: Error, beacon: Beacon, storageKey: string, value: string) {
1311
+ if (e.name === 'QuotaExceededError') {
1312
+ beacon.events.error.snap({
1313
+ data: {
1314
+ message: 'QuotaExceededError',
1315
+ details: {
1316
+ key: storageKey,
1317
+ value,
1318
+ },
1319
+ },
1320
+ });
1321
+ }
1322
+ }