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