@envive-ai/react-hooks 0.1.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 (385) hide show
  1. package/LICENSE +2 -0
  2. package/README.md +2 -0
  3. package/dist/GridInsertionService-CEYo9pGj.js +22 -0
  4. package/dist/GridInsertionService-CS_bnPh0.cjs +28 -0
  5. package/dist/bandolier-Ble8jEa8.js +1221 -0
  6. package/dist/bandolier-Bm2xAt_j.cjs +1221 -0
  7. package/dist/carpe-Da7b-LCW.cjs +599 -0
  8. package/dist/carpe-W13mhRRP.js +597 -0
  9. package/dist/cdnService-CZ-aXcY6.cjs +23 -0
  10. package/dist/cdnService-zQfKk3Eb.js +18 -0
  11. package/dist/chatElementDisplayLocation-CX8fuNao.d.cts +239 -0
  12. package/dist/chatElementDisplayLocation-CwptS9tx.d.ts +239 -0
  13. package/dist/chunk-CUT6urMc.cjs +30 -0
  14. package/dist/contexts/index.cjs +13 -0
  15. package/dist/contexts/index.d.cts +65 -0
  16. package/dist/contexts/index.d.ts +66 -0
  17. package/dist/contexts/index.js +7 -0
  18. package/dist/contexts-BRjfVq_k.js +5064 -0
  19. package/dist/contexts-BYArqZtK.cjs +5164 -0
  20. package/dist/coterie-3y0D9ko4.cjs +229 -0
  21. package/dist/coterie-DOWcJAYv.js +229 -0
  22. package/dist/custservice-types-CFIFwZ-r.js +10 -0
  23. package/dist/custservice-types-CkfxZiHY.cjs +16 -0
  24. package/dist/default-C2fEZKXk.js +175 -0
  25. package/dist/default-CBUq6Q6G.cjs +4 -0
  26. package/dist/default-CGIFZK6m.js +4 -0
  27. package/dist/default-D_KPZdPJ.cjs +198 -0
  28. package/dist/divIds-Bss-btao.js +49 -0
  29. package/dist/divIds-DnZNd7rA.cjs +223 -0
  30. package/dist/dreamlandBaby-DCIsuU9R.cjs +338 -0
  31. package/dist/dreamlandBaby-DvSaZGrz.js +338 -0
  32. package/dist/entrypoints-D_JUvkgy.cjs +18 -0
  33. package/dist/entrypoints-YLQsbBRD.js +6 -0
  34. package/dist/enviveConfigContext-CUGLpPGU.js +34 -0
  35. package/dist/enviveConfigContext-Dfr2VH6u.cjs +48 -0
  36. package/dist/fiveCbd-B1SESMCO.js +605 -0
  37. package/dist/fiveCbd-CkOlVby_.cjs +605 -0
  38. package/dist/forLoveAndLemons-CfYPMnKS.cjs +660 -0
  39. package/dist/forLoveAndLemons-DmwYZIk0.js +658 -0
  40. package/dist/greenpan-Bsl3ir59.cjs +389 -0
  41. package/dist/greenpan-BtOi45lf.js +389 -0
  42. package/dist/grooveLife-6_dtYsRk.js +334 -0
  43. package/dist/grooveLife-Cmm1PSCL.cjs +334 -0
  44. package/dist/homegrownCannabis-C-kw-74X.js +400 -0
  45. package/dist/homegrownCannabis-CO0uY_mp.cjs +400 -0
  46. package/dist/hooks/index.cjs +16 -0
  47. package/dist/hooks/index.d.cts +357 -0
  48. package/dist/hooks/index.d.ts +357 -0
  49. package/dist/hooks/index.js +7 -0
  50. package/dist/jackArcher-CLVmwwpI.js +719 -0
  51. package/dist/jackArcher-DdYTIzAV.cjs +719 -0
  52. package/dist/jordanCraig-Am-Oor-O.js +1778 -0
  53. package/dist/jordanCraig-_u3-w4Hp.cjs +1778 -0
  54. package/dist/kindredBravely-CWovIDSc.cjs +482 -0
  55. package/dist/kindredBravely-eWp-ud_E.js +482 -0
  56. package/dist/kutFromTheKloth-BMV4BuGQ.js +361 -0
  57. package/dist/kutFromTheKloth-Q589bAOC.cjs +361 -0
  58. package/dist/larryAndSerges-BMUlTgI-.js +252 -0
  59. package/dist/larryAndSerges-CEau764j.cjs +252 -0
  60. package/dist/leapsAndRebounds-DGMzPO7T.js +352 -0
  61. package/dist/leapsAndRebounds-DHAtRTJD.cjs +352 -0
  62. package/dist/logger-Dln20ans.cjs +25 -0
  63. package/dist/logger-pdEEY8T2.js +19 -0
  64. package/dist/longevityrx-CZW8Hxzi.cjs +312 -0
  65. package/dist/longevityrx-jH2JLhNH.js +312 -0
  66. package/dist/lookOptic-BGXP5P_V.js +274 -0
  67. package/dist/lookOptic-CA6RwLbG.cjs +274 -0
  68. package/dist/mantraBrand-Cm9_PBCT.js +742 -0
  69. package/dist/mantraBrand-DByNqpnL.cjs +742 -0
  70. package/dist/medterra-B0wxj_PV.js +575 -0
  71. package/dist/medterra-DnPN2ksU.cjs +575 -0
  72. package/dist/modells-Bmz8Ag5M.js +476 -0
  73. package/dist/modells-CoYgkLSp.cjs +476 -0
  74. package/dist/models-DHdb7QWn.js +51 -0
  75. package/dist/models-ixxUsGL_.cjs +69 -0
  76. package/dist/pressedFloral-DSKs_oVG.js +653 -0
  77. package/dist/pressedFloral-DjBiSoUl.cjs +653 -0
  78. package/dist/skinPerfection-B_3xzVNS.cjs +326 -0
  79. package/dist/skinPerfection-IDrBuAPt.js +326 -0
  80. package/dist/snapSupplements-BJk5T5ba.js +277 -0
  81. package/dist/snapSupplements-BStTsdOZ.cjs +277 -0
  82. package/dist/socialProofClasses-Bhv2Vulz.js +9 -0
  83. package/dist/socialProofClasses-CrQBWdSA.cjs +39 -0
  84. package/dist/spanx-BYg0LE7R.js +653 -0
  85. package/dist/spanx-LwU1zSzq.cjs +655 -0
  86. package/dist/spanxStaging-CfSmuKYB.js +837 -0
  87. package/dist/spanxStaging-OZLV9qix.cjs +840 -0
  88. package/dist/suggestionBarV2-types-BllzwsBD.js +34 -0
  89. package/dist/suggestionBarV2-types-CaovchMP.cjs +46 -0
  90. package/dist/supergoop-BqPXDnKk.cjs +327 -0
  91. package/dist/supergoop-CIlrHND_.js +325 -0
  92. package/dist/types-C4T5UOIW.cjs +230 -0
  93. package/dist/types-CYNvLeSA.js +176 -0
  94. package/dist/uniqueVintage-B30mOqbH.cjs +1205 -0
  95. package/dist/uniqueVintage-CFueJOhO.js +1203 -0
  96. package/dist/venaCbd-DHGZy49P.cjs +357 -0
  97. package/dist/venaCbd-T0CqVD4k.js +357 -0
  98. package/dist/westonJonBoucher-BdMzs_Yg.cjs +414 -0
  99. package/dist/westonJonBoucher-b4TCQ4ev.js +414 -0
  100. package/dist/wineEnthusiast-BLGlOjgr.cjs +932 -0
  101. package/dist/wineEnthusiast-BqR0i_54.js +932 -0
  102. package/dist/wolfMattress-CyyO-LoC.js +362 -0
  103. package/dist/wolfMattress-DNGZOivg.cjs +362 -0
  104. package/dist/wolfTactical-3Mm2fvVF.js +341 -0
  105. package/dist/wolfTactical-BmXYlFjr.cjs +341 -0
  106. package/package.json +66 -0
  107. package/src/adapters/amplitude/amplitudeAdapter.ts +454 -0
  108. package/src/adapters/amplitude/index.ts +2 -0
  109. package/src/adapters/amplitude/stubAmplitudeAdapter.ts +34 -0
  110. package/src/adapters/spiffy/commerce/api.ts +596 -0
  111. package/src/adapters/spiffy/commerce/exceptions/sessionExceptions.ts +6 -0
  112. package/src/adapters/spiffy/commerce/exceptions/unsupportedProductExceptions.ts +6 -0
  113. package/src/adapters/spiffy/commerce/graphql.ts +184 -0
  114. package/src/application/config/generalStaticConfig.ts +37 -0
  115. package/src/application/logging/logger.ts +29 -0
  116. package/src/application/models/api/context.ts +4 -0
  117. package/src/application/models/api/generationParams.ts +4 -0
  118. package/src/application/models/api/nextMessageRequest.ts +11 -0
  119. package/src/application/models/api/orgAnalyticsConfig.ts +19 -0
  120. package/src/application/models/api/orgConfigResults.ts +40 -0
  121. package/src/application/models/api/organizationConfig.ts +12 -0
  122. package/src/application/models/api/response.ts +132 -0
  123. package/src/application/models/api/responseGenerics.ts +67 -0
  124. package/src/application/models/api/search.ts +26 -0
  125. package/src/application/models/api/suggestion.ts +4 -0
  126. package/src/application/models/api/supportedEventRequest.ts +8 -0
  127. package/src/application/models/api/userEvent.ts +101 -0
  128. package/src/application/models/cachedValue.ts +8 -0
  129. package/src/application/models/chatElementDisplayLocation.ts +22 -0
  130. package/src/application/models/clientDetails.ts +18 -0
  131. package/src/application/models/colorsConfig.ts +28 -0
  132. package/src/application/models/conversationalSearchIds.ts +5 -0
  133. package/src/application/models/dataLayer.ts +45 -0
  134. package/src/application/models/domMutationContinuation.ts +7 -0
  135. package/src/application/models/domObservationStrategy.ts +9 -0
  136. package/src/application/models/events.ts +5 -0
  137. package/src/application/models/featureGates.ts +23 -0
  138. package/src/application/models/frontendConfig.ts +14 -0
  139. package/src/application/models/googleAnalyticsEvents.ts +8 -0
  140. package/src/application/models/graphql/index.ts +2 -0
  141. package/src/application/models/graphql/queries/getMerchantColorsQuery.ts +37 -0
  142. package/src/application/models/graphql/queries/getMerchantFrontendConfigQuery.ts +103 -0
  143. package/src/application/models/graphql/queries/getMerchantOrgIdQuery.ts +11 -0
  144. package/src/application/models/guards/api/index.ts +12 -0
  145. package/src/application/models/guards/api/isApiFormResponse.ts +90 -0
  146. package/src/application/models/guards/api/isApiFormSubmittedResponseAttributes.ts +37 -0
  147. package/src/application/models/guards/api/isApiOrderResponseAttributes.ts +155 -0
  148. package/src/application/models/guards/api/isApiOrgConfigResults.ts +277 -0
  149. package/src/application/models/guards/api/isApiOrganizationConfig.ts +207 -0
  150. package/src/application/models/guards/api/isApiPDPEventAttributes.ts +21 -0
  151. package/src/application/models/guards/api/isApiPLPEventAttributes.ts +41 -0
  152. package/src/application/models/guards/api/isApiPageResponseAttributes.ts +21 -0
  153. package/src/application/models/guards/api/isApiProductResponseAttributes.ts +85 -0
  154. package/src/application/models/guards/api/isApiProductSearchAttributes.ts +23 -0
  155. package/src/application/models/guards/api/isApiProductSearchFilterAttributes.ts +15 -0
  156. package/src/application/models/guards/api/isApiQueryTypedEventAttributes.ts +4 -0
  157. package/src/application/models/guards/api/isApiResponse.ts +39 -0
  158. package/src/application/models/guards/api/isApiReviewResponseAttributes.ts +30 -0
  159. package/src/application/models/guards/api/isApiReviewRichInformation.ts +37 -0
  160. package/src/application/models/guards/api/isApiSearchEventAttributes.ts +28 -0
  161. package/src/application/models/guards/api/isApiSuggestion.ts +36 -0
  162. package/src/application/models/guards/api/isApiSuggestionClickedEventAttributes.ts +9 -0
  163. package/src/application/models/guards/api/isApiTextResponseAttributes.ts +9 -0
  164. package/src/application/models/guards/api/isApiUserEvent.ts +25 -0
  165. package/src/application/models/guards/graphQL/isGraphQLColorsConfig.ts +50 -0
  166. package/src/application/models/guards/isBaseEcommerceEvent.ts +17 -0
  167. package/src/application/models/guards/isGA4EcommerceEvent.ts +17 -0
  168. package/src/application/models/guards/isLegacyUAEcommerceEvent.ts +17 -0
  169. package/src/application/models/guards/isMobilePLPChatPlacementParameter.ts +11 -0
  170. package/src/application/models/guards/isSpanxTakeAQuizCtaParameter.ts +4 -0
  171. package/src/application/models/guards/isVariantInfo.ts +37 -0
  172. package/src/application/models/guards/utils.ts +43 -0
  173. package/src/application/models/index.ts +20 -0
  174. package/src/application/models/localStorageEventListener.ts +4 -0
  175. package/src/application/models/message.ts +146 -0
  176. package/src/application/models/mobilePLPChatPlacementParameter.ts +3 -0
  177. package/src/application/models/orgsEnum.ts +36 -0
  178. package/src/application/models/productExperiment.ts +5 -0
  179. package/src/application/models/spanxTakeAQuizCtaParameter.ts +4 -0
  180. package/src/application/models/spiffyWidgets.ts +16 -0
  181. package/src/application/models/supportedOrgs.ts +137 -0
  182. package/src/application/models/utilityTypes/camelCase.ts +87 -0
  183. package/src/application/models/utilityTypes/camelCasedPropertiesDeep.ts +80 -0
  184. package/src/application/models/utilityTypes/delimiterCase.ts +121 -0
  185. package/src/application/models/utilityTypes/delimiterCasedPropertiesDeep.ts +98 -0
  186. package/src/application/models/utilityTypes/index.ts +1 -0
  187. package/src/application/models/utilityTypes/internal.ts +93 -0
  188. package/src/application/models/utilityTypes/primitive.ts +8 -0
  189. package/src/application/models/utilityTypes/snakeCasedPropertiesDeep.ts +49 -0
  190. package/src/application/models/utilityTypes/splitWords.ts +76 -0
  191. package/src/application/models/utilityTypes/trim.ts +28 -0
  192. package/src/application/models/utilityTypes/unknownArray.ts +25 -0
  193. package/src/application/models/utils/snakeToCamelTransformer.ts +90 -0
  194. package/src/application/models/utils/stringToFulfillmentDisplayStatusEnumValue.ts +68 -0
  195. package/src/application/models/validators/validateGraphQLColorsConfig.ts +29 -0
  196. package/src/application/models/validators/validateGraphQLFrontendConfig.ts +594 -0
  197. package/src/application/models/validators/validateGraphQLOrgId.ts +7 -0
  198. package/src/application/models/validators/validateMobilePLPChatPlacementParameter.ts +14 -0
  199. package/src/application/models/validators/validateOrgConfigResults.ts +47 -0
  200. package/src/application/models/validators/validateOrganizationConfig.ts +37 -0
  201. package/src/application/models/validators/validateResponse.ts +187 -0
  202. package/src/application/models/validators/validateSuggestion.ts +16 -0
  203. package/src/application/models/validators/validateUserEvent.ts +110 -0
  204. package/src/application/models/variantInfo/index.ts +1 -0
  205. package/src/application/models/variantInfo/pageVisitInfo.ts +6 -0
  206. package/src/application/models/variantInfo/plpInfo.ts +3 -0
  207. package/src/application/models/variantInfo/productInfo.ts +5 -0
  208. package/src/application/models/variantInfo/variantInfo.ts +23 -0
  209. package/src/application/service/cachingService.ts +84 -0
  210. package/src/application/service/cdnService.ts +18 -0
  211. package/src/application/service/customerService/index.ts +8 -0
  212. package/src/application/service/customerService/providers/UnsupportedCustomerService.ts +15 -0
  213. package/src/application/service/customerService/types.ts +31 -0
  214. package/src/application/service/domMutationObserver.ts +320 -0
  215. package/src/application/service/domMutations/GridInsertionService.ts +123 -0
  216. package/src/application/service/domMutations/dataLayer/dataLayerEventsListener.ts +99 -0
  217. package/src/application/service/domMutations/domInsertionService.ts +90 -0
  218. package/src/application/service/domMutations/domMutationListener.ts +15 -0
  219. package/src/application/service/domMutations/domMutationListenerState.ts +52 -0
  220. package/src/application/service/domMutations/floatingChat/embeddedChatsPlacementsListener.ts +41 -0
  221. package/src/application/service/domMutations/gladly/gladlyListener.ts +61 -0
  222. package/src/application/service/domMutations/spiffy/orgs/common/kustomerVisibilityListener.ts +41 -0
  223. package/src/application/service/domMutations/spiffy/orgs/common/orgsCommonDataLayerListener.ts +119 -0
  224. package/src/application/service/environmentService.ts +51 -0
  225. package/src/application/service/featureFlagService.ts +130 -0
  226. package/src/application/service/kustomerIntegrationService.ts +111 -0
  227. package/src/application/service/localStorageService.ts +77 -0
  228. package/src/application/service/pageVariantService.ts +779 -0
  229. package/src/application/service/searchService.ts +140 -0
  230. package/src/application/service/sessionStorageService.ts +27 -0
  231. package/src/application/service/shopifyUrlService.ts +63 -0
  232. package/src/application/service/userIdentityService.ts +114 -0
  233. package/src/application/service/windowChatToggleService.ts +71 -0
  234. package/src/application/service/windowDataLayerService.ts +181 -0
  235. package/src/application/service/windowFrontendConfigService.ts +104 -0
  236. package/src/application/utils/__tests__/divideArrays.test.ts +14 -0
  237. package/src/application/utils/analyticsUtils.ts +110 -0
  238. package/src/application/utils/coreContextToApiContext.ts +11 -0
  239. package/src/application/utils/coreUserEventToApiUserEvent.ts +106 -0
  240. package/src/application/utils/divideArray.ts +7 -0
  241. package/src/application/utils/domObserver.ts +96 -0
  242. package/src/application/utils/elementObserver.ts +246 -0
  243. package/src/application/utils/imageFilter.ts +12 -0
  244. package/src/application/utils/index.ts +3 -0
  245. package/src/application/utils/merchantUtils.ts +16 -0
  246. package/src/application/utils/messageFromFormSubmittedEvent.ts +31 -0
  247. package/src/application/utils/messageFromQueryEvent.ts +38 -0
  248. package/src/application/utils/messageFromResponse.ts +133 -0
  249. package/src/application/utils/messageFromSuggestionEvent.ts +32 -0
  250. package/src/application/utils/mouseEventTypes.ts +1 -0
  251. package/src/application/utils/mutationHelper.ts +51 -0
  252. package/src/application/utils/nextMessageRequestToApiRequest.ts +31 -0
  253. package/src/application/utils/nodeSelector.ts +133 -0
  254. package/src/application/utils/overrides.ts +196 -0
  255. package/src/application/utils/stringUtils.ts +55 -0
  256. package/src/application/utils/supportedEventRequestToApiRequest.ts +12 -0
  257. package/src/application/utils/urlsParser.ts +53 -0
  258. package/src/application/utils/validation.ts +5 -0
  259. package/src/atoms/app/index.ts +57 -0
  260. package/src/atoms/app/variant.ts +261 -0
  261. package/src/atoms/atomStore.ts +34 -0
  262. package/src/atoms/chat/chatState.ts +44 -0
  263. package/src/atoms/chat/form.ts +19 -0
  264. package/src/atoms/chat/index.ts +38 -0
  265. package/src/atoms/chat/lastMessage.ts +11 -0
  266. package/src/atoms/chat/messageQueue.ts +65 -0
  267. package/src/atoms/chat/performanceMetrics.ts +84 -0
  268. package/src/atoms/chat/renderedWidgetRefs.ts +28 -0
  269. package/src/atoms/chat/replies.ts +51 -0
  270. package/src/atoms/chat/suggestions.ts +36 -0
  271. package/src/atoms/globalSearch.ts +12 -0
  272. package/src/atoms/index.ts +5 -0
  273. package/src/atoms/org/customerService.ts +13 -0
  274. package/src/atoms/org/graphqlConfig.ts +27 -0
  275. package/src/atoms/org/index.ts +7 -0
  276. package/src/atoms/org/merchantCss.ts +44 -0
  277. package/src/atoms/org/org.ts +256 -0
  278. package/src/atoms/org/orgAnalyticsConfig.ts +28 -0
  279. package/src/atoms/org/orgPageConfig.ts +38 -0
  280. package/src/atoms/org/orgUIConfig.ts +122 -0
  281. package/src/atoms/search/chatSearch.ts +293 -0
  282. package/src/atoms/search/index.ts +2 -0
  283. package/src/atoms/search/productFilters.ts +207 -0
  284. package/src/atoms/search/productSorter.ts +23 -0
  285. package/src/atoms/search/searchAPI.ts +194 -0
  286. package/src/atoms/search/types.ts +55 -0
  287. package/src/atoms/search/utils.ts +18 -0
  288. package/src/config/divIds.ts +27 -0
  289. package/src/config/locators/components/chat/entrypoints.ts +13 -0
  290. package/src/config/locators/components/chat/index.ts +23 -0
  291. package/src/config/locators/components/chat/preview.ts +13 -0
  292. package/src/config/locators/components/chat/variants/index.ts +16 -0
  293. package/src/config/locators/components/common/buttons.ts +6 -0
  294. package/src/config/locators/components/common/cards.ts +18 -0
  295. package/src/config/locators/components/common/links.ts +1 -0
  296. package/src/config/locators/components/common/tables.ts +2 -0
  297. package/src/config/locators/components/floating-button.ts +2 -0
  298. package/src/config/locators/components/index.ts +3 -0
  299. package/src/config/locators/components/report-issue.ts +21 -0
  300. package/src/config/locators/components/search/index.ts +5 -0
  301. package/src/config/locators/components/shadow-dom.ts +1 -0
  302. package/src/config/locators/embedded.ts +21 -0
  303. package/src/config/locators/index.ts +3 -0
  304. package/src/config/socialProofClasses.ts +17 -0
  305. package/src/contexts/chatContext.tsx +451 -0
  306. package/src/contexts/enviveConfigContext.tsx +70 -0
  307. package/src/contexts/index.ts +4 -0
  308. package/src/contexts/systemSettingsContext.tsx +61 -0
  309. package/src/contexts/types.ts +1059 -0
  310. package/src/enabled-features.ts +83 -0
  311. package/src/events/event-types.ts +11 -0
  312. package/src/events/index.ts +52 -0
  313. package/src/events/registerAnalyticsListeners.ts +49 -0
  314. package/src/extension.ts +63 -0
  315. package/src/hooks/index.ts +22 -0
  316. package/src/hooks/useBlockBackButton.ts +29 -0
  317. package/src/hooks/useChatToggle.ts +66 -0
  318. package/src/hooks/useCustomerSupportHandoff.ts +39 -0
  319. package/src/hooks/useDebounce.ts +17 -0
  320. package/src/hooks/useDynamicVariants.ts +210 -0
  321. package/src/hooks/useElementObserver.ts +245 -0
  322. package/src/hooks/useFileUpload.ts +61 -0
  323. package/src/hooks/useGrabAndScroll.ts +133 -0
  324. package/src/hooks/useHideElements.ts +82 -0
  325. package/src/hooks/useHorizontalScrollAnimation.ts +115 -0
  326. package/src/hooks/useImageResolver.ts +51 -0
  327. package/src/hooks/useIntersection.ts +28 -0
  328. package/src/hooks/useIsSmallScreen.ts +23 -0
  329. package/src/hooks/useMessageFilter.ts +49 -0
  330. package/src/hooks/useMessageScrollObserver.ts +47 -0
  331. package/src/hooks/useReducedMotionWithOverride.ts +15 -0
  332. package/src/hooks/useSearch.tsx +433 -0
  333. package/src/hooks/useSnapCalculator.ts +38 -0
  334. package/src/hooks/useSnapControl.ts +155 -0
  335. package/src/hooks/useSystemSettingsContext.ts +12 -0
  336. package/src/hooks/useTrackComponentVisibleEvent.ts +52 -0
  337. package/src/hooks/useUpdateAnalyticsProps.ts +56 -0
  338. package/src/hooks/utils.ts +153 -0
  339. package/src/index.ts +31 -0
  340. package/src/initialize.ts +163 -0
  341. package/src/interceptors/types.ts +6 -0
  342. package/src/interceptors/useFormEscalation.ts +40 -0
  343. package/src/interceptors/useMessageInterceptor.ts +32 -0
  344. package/src/main.ts +85 -0
  345. package/src/main.tsx +123 -0
  346. package/src/merchants/bandolier/bandolier.ts +1389 -0
  347. package/src/merchants/carpe/carpe.ts +656 -0
  348. package/src/merchants/coterie/coterie.ts +280 -0
  349. package/src/merchants/default.ts +193 -0
  350. package/src/merchants/dreamlandBaby/dreamlandBaby.ts +375 -0
  351. package/src/merchants/fiveCbd/fiveCbd.ts +697 -0
  352. package/src/merchants/forLoveAndLemons/forLoveAndLemons.ts +721 -0
  353. package/src/merchants/greenpan/greenpan.ts +440 -0
  354. package/src/merchants/grooveLife/grooveLife.ts +386 -0
  355. package/src/merchants/homegrownCannabis/homegrownCannabis.ts +468 -0
  356. package/src/merchants/init-merchant.sh +53 -0
  357. package/src/merchants/jackArcher/jackArcher.ts +974 -0
  358. package/src/merchants/jordanCraig/jordanCraig.ts +1927 -0
  359. package/src/merchants/kindredBravely/kindredBravely.ts +529 -0
  360. package/src/merchants/kutFromTheKloth/kutFromTheKloth.ts +418 -0
  361. package/src/merchants/larryAndSerges/larryAndSerges.ts +314 -0
  362. package/src/merchants/leapsAndRebounds/leapsAndRebounds.ts +424 -0
  363. package/src/merchants/longevityrx/longevityrx.ts +368 -0
  364. package/src/merchants/lookOptic/lookOptic.ts +323 -0
  365. package/src/merchants/mantraBrand/mantraBrand.ts +838 -0
  366. package/src/merchants/medterra/medterra.ts +670 -0
  367. package/src/merchants/modells/modells.ts +546 -0
  368. package/src/merchants/pressedFloral/pressedFloral.ts +734 -0
  369. package/src/merchants/skinPerfection/skinPerfection.ts +379 -0
  370. package/src/merchants/snapSupplements/snapSupplements.ts +325 -0
  371. package/src/merchants/spanx/spanx.ts +810 -0
  372. package/src/merchants/spanx/spanxStaging.ts +942 -0
  373. package/src/merchants/supergoop/supergoop.ts +376 -0
  374. package/src/merchants/uniqueVintage/uniqueVintage.ts +1314 -0
  375. package/src/merchants/uniqueVintage/views/useUniqueVintageChatSearch.ts +147 -0
  376. package/src/merchants/venaCbd/venaCbd.ts +410 -0
  377. package/src/merchants/westonJonBoucher/westonJonBoucher.ts +473 -0
  378. package/src/merchants/wineEnthusiast/wineEnthusiast.ts +990 -0
  379. package/src/merchants/wolfMattress/wolfMattress.ts +411 -0
  380. package/src/merchants/wolfTactical/wolfTactical.ts +389 -0
  381. package/src/types/custservice-types.ts +28 -0
  382. package/src/types/search-filter-types.ts +111 -0
  383. package/src/types/suggestionBarV2-types.ts +4 -0
  384. package/src/types/test-types.ts +3 -0
  385. package/src/types.ts +66 -0
@@ -0,0 +1,277 @@
1
+ import Logger from 'src/application/logging/logger';
2
+ import {
3
+ StatsigExperiment as ApiOrgConfigExperiment,
4
+ StatsigFeatureGate as ApiOrgConfigFeatureGate,
5
+ OrganizationSettings as ApiOrgConfigOrganizationSettings,
6
+ Organization as ApiOrganization,
7
+ OrganizationStatusEnum,
8
+ } from '@spiffy-ai/commerce-api-client';
9
+ import { ApiOrganizationConfig, isApiOrganizationConfig } from './isApiOrganizationConfig';
10
+
11
+ interface ApiOrgConfigResults {
12
+ configs: ApiOrganizationConfig[];
13
+ experiments: ApiOrgConfigExperiment[];
14
+ gates: ApiOrgConfigFeatureGate[];
15
+ org: ApiOrgConfigOrganizationSettings;
16
+ }
17
+
18
+ const isApiOrgConfigExperiment = (data: unknown): data is ApiOrgConfigExperiment => {
19
+ if (data == null || typeof data !== 'object') {
20
+ Logger.logDebug('[spiffy-ai] isApiOrgConfigExperiment: data is not an object', undefined, {
21
+ data,
22
+ });
23
+ return false;
24
+ }
25
+
26
+ if ('group' in data && typeof data.group !== 'string' && data.group !== undefined) {
27
+ Logger.logDebug(
28
+ '[spiffy-ai] isApiOrgConfigExperiment: group is not a string or undefined',
29
+ undefined,
30
+ {
31
+ data,
32
+ },
33
+ );
34
+ return false;
35
+ }
36
+
37
+ if (
38
+ 'group_name' in data &&
39
+ typeof data.group_name !== 'string' &&
40
+ data.group_name !== undefined
41
+ ) {
42
+ Logger.logDebug('[spiffy-ai] isApiOrgConfigExperiment: group_name is not a string', undefined, {
43
+ data,
44
+ });
45
+ return false;
46
+ }
47
+
48
+ if ('name' in data && typeof data.name !== 'string' && data.name !== undefined) {
49
+ Logger.logDebug('[spiffy-ai] isApiOrgConfigExperiment: name is not a string', undefined, {
50
+ data,
51
+ });
52
+ return false;
53
+ }
54
+
55
+ if ('rule_id' in data && typeof data.rule_id !== 'string' && data.rule_id !== undefined) {
56
+ Logger.logDebug('[spiffy-ai] isApiOrgConfigExperiment: rule_id is not a string', undefined, {
57
+ data,
58
+ });
59
+ return false;
60
+ }
61
+
62
+ if ('value' in data && typeof data.value !== 'object' && data.value !== undefined) {
63
+ Logger.logDebug('[spiffy-ai] isApiOrgConfigExperiment: value is not an object', undefined, {
64
+ data,
65
+ });
66
+ return false;
67
+ }
68
+
69
+ return true;
70
+ };
71
+
72
+ const isApiOrgConfigFeatureGate = (data: unknown): data is ApiOrgConfigFeatureGate => {
73
+ if (data == null || typeof data !== 'object') {
74
+ Logger.logDebug('[spiffy-ai] isApiOrgConfigFeatureGate: data is not an object', undefined, {
75
+ data,
76
+ });
77
+ return false;
78
+ }
79
+
80
+ if ('name' in data && typeof data.name !== 'string' && data.name !== undefined) {
81
+ Logger.logDebug('[spiffy-ai] isApiOrgConfigFeatureGate: name is not a string', undefined, {
82
+ data,
83
+ });
84
+ return false;
85
+ }
86
+
87
+ if ('rule_id' in data && typeof data.rule_id !== 'string' && data.rule_id !== undefined) {
88
+ Logger.logDebug('[spiffy-ai] isApiOrgConfigFeatureGate: rule_id is not a string', undefined, {
89
+ data,
90
+ });
91
+ return false;
92
+ }
93
+
94
+ if ('value' in data && typeof data.value !== 'boolean' && data.value !== undefined) {
95
+ Logger.logDebug('[spiffy-ai] isApiOrgConfigFeatureGate: value is not a boolean', undefined, {
96
+ data,
97
+ });
98
+ return false;
99
+ }
100
+
101
+ return true;
102
+ };
103
+
104
+ const isApiOrganization = (data: unknown): data is ApiOrganization => {
105
+ if (data == null || typeof data !== 'object') {
106
+ Logger.logDebug('[spiffy-ai] isApiOrganization: data is not an object', undefined, {
107
+ data,
108
+ });
109
+ return false;
110
+ }
111
+
112
+ if (!('id' in data) || typeof data.id !== 'string') {
113
+ Logger.logDebug('[spiffy-ai] isApiOrganization: id is not a string', undefined, {
114
+ data,
115
+ });
116
+ return false;
117
+ }
118
+
119
+ if (!('display_name' in data) || typeof data.display_name !== 'string') {
120
+ Logger.logDebug('[spiffy-ai] isApiOrganization: display_name is not a string', undefined, {
121
+ data,
122
+ });
123
+ return false;
124
+ }
125
+
126
+ if (!('domain' in data) || typeof data.domain !== 'string') {
127
+ Logger.logDebug('[spiffy-ai] isApiOrganization: domain is not a string', undefined, {
128
+ data,
129
+ });
130
+ return false;
131
+ }
132
+
133
+ if (!('short_name' in data) || typeof data.short_name !== 'string') {
134
+ Logger.logDebug('[spiffy-ai] isApiOrganization: short_name is not a string', undefined, {
135
+ data,
136
+ });
137
+ return false;
138
+ }
139
+
140
+ if (
141
+ !('status' in data) ||
142
+ !Object.values(OrganizationStatusEnum).includes(data.status as OrganizationStatusEnum)
143
+ ) {
144
+ Logger.logDebug(
145
+ '[spiffy-ai] isApiOrganization: status is not a valid OrganizationStatusEnum value',
146
+ undefined,
147
+ {
148
+ data,
149
+ },
150
+ );
151
+ return false;
152
+ }
153
+
154
+ if (
155
+ 'created_at' in data &&
156
+ !(data.created_at instanceof Date) &&
157
+ typeof data.created_at !== 'string' &&
158
+ data.created_at !== undefined
159
+ ) {
160
+ Logger.logDebug('[spiffy-ai] isApiOrganization: created_at is not a Date', undefined, {
161
+ data,
162
+ });
163
+ return false;
164
+ }
165
+
166
+ if (
167
+ 'updated_at' in data &&
168
+ !(data.updated_at instanceof Date) &&
169
+ typeof data.updated_at !== 'string' &&
170
+ data.updated_at !== undefined
171
+ ) {
172
+ Logger.logDebug('[spiffy-ai] isApiOrganization: updated_at is not a Date', undefined, {
173
+ data,
174
+ });
175
+ return false;
176
+ }
177
+
178
+ return true;
179
+ };
180
+
181
+ const isApiOrgConfigOrganizationSettings = (
182
+ data: unknown,
183
+ ): data is ApiOrgConfigOrganizationSettings => {
184
+ if (data == null || typeof data !== 'object') {
185
+ Logger.logDebug(
186
+ '[spiffy-ai] isApiOrgConfigOrganizationSettings: data is not an object',
187
+ undefined,
188
+ {
189
+ data,
190
+ },
191
+ );
192
+ return false;
193
+ }
194
+
195
+ if (!('org' in data) || !isApiOrganization(data.org)) {
196
+ Logger.logDebug(
197
+ '[spiffy-ai] isApiOrgConfigOrganizationSettings: org is not an object',
198
+ undefined,
199
+ {
200
+ data,
201
+ },
202
+ );
203
+ return false;
204
+ }
205
+
206
+ // skip validation for 'settings' for now
207
+
208
+ return true;
209
+ };
210
+
211
+ /**
212
+ *
213
+ * @param data
214
+ * @returns
215
+ */
216
+ export const isApiOrgConfigResults = (data: unknown): data is Required<ApiOrgConfigResults> => {
217
+ if (data == null || typeof data !== 'object') {
218
+ Logger.logDebug('[spiffy-ai] isApiOrgConfigResults: data is not an object', undefined, {
219
+ data,
220
+ });
221
+ return false;
222
+ }
223
+
224
+ if (
225
+ !('configs' in data) ||
226
+ !Array.isArray(data.configs) ||
227
+ !data.configs.every((config) => isApiOrganizationConfig(config))
228
+ ) {
229
+ Logger.logDebug('[spiffy-ai] isApiOrgConfigResults: configs is not an array', undefined, {
230
+ data,
231
+ });
232
+ return false;
233
+ }
234
+
235
+ if (
236
+ 'experiments' in data &&
237
+ data.experiments !== undefined &&
238
+ (!Array.isArray(data.experiments) ||
239
+ !data.experiments.every((exp) => isApiOrgConfigExperiment(exp)))
240
+ ) {
241
+ Logger.logDebug(
242
+ '[spiffy-ai] isApiOrgConfigResults: experiments is not an array or contains invalid items',
243
+ undefined,
244
+ {
245
+ data,
246
+ },
247
+ );
248
+ return false;
249
+ }
250
+
251
+ if (
252
+ !('gates' in data) ||
253
+ !Array.isArray(data.gates) ||
254
+ !data.gates.every((gate) => isApiOrgConfigFeatureGate(gate))
255
+ ) {
256
+ Logger.logDebug(
257
+ '[spiffy-ai] isApiOrgConfigResults: gates is not an array or contains invalid items',
258
+ undefined,
259
+ {
260
+ data,
261
+ },
262
+ );
263
+ return false;
264
+ }
265
+
266
+ if (!('org' in data) || !isApiOrgConfigOrganizationSettings(data.org)) {
267
+ Logger.logDebug(
268
+ '[spiffy-ai] isApiOrgConfigResults: org is not an object or has invalid fields',
269
+ undefined,
270
+ { data },
271
+ );
272
+
273
+ return false;
274
+ }
275
+
276
+ return true;
277
+ };
@@ -0,0 +1,207 @@
1
+ import Logger from 'src/application/logging/logger';
2
+ import { OrganizationConfig } from '@spiffy-ai/commerce-api-client';
3
+
4
+ // the "config" property is a generic object in the commerce api spec, these interfaces
5
+ // are used to validate the structure of that object and to transform the api response
6
+ // into a typed object for the frontend. Do not use these interfaces for anything else.
7
+ interface ApiOrgAnalyticsConfigAmplitude {
8
+ session_replay_enabled: boolean;
9
+ session_replay_sample_rate: number;
10
+ tracking_enabled: boolean;
11
+ }
12
+
13
+ interface ApiOrgAnalyticsConfigCustomerService {
14
+ provider: string;
15
+ }
16
+
17
+ interface ApiOrgAnalyticsConfigGoogleAnalytics {
18
+ measurement_id: string;
19
+ }
20
+
21
+ interface ApiOrgAnalyticsConfig {
22
+ amplitude?: ApiOrgAnalyticsConfigAmplitude;
23
+ customer_service?: ApiOrgAnalyticsConfigCustomerService;
24
+ google_analytics?: ApiOrgAnalyticsConfigGoogleAnalytics;
25
+ }
26
+
27
+ export interface ApiOrganizationConfig extends OrganizationConfig {
28
+ config: ApiOrgAnalyticsConfig;
29
+ }
30
+
31
+ const isApiOrgAnalyticsConfigAmplitude = (
32
+ data: unknown,
33
+ ): data is ApiOrgAnalyticsConfigAmplitude => {
34
+ if (data == null || typeof data !== 'object') {
35
+ Logger.logDebug('[spiffy-ai] isApiOrgAnalyticsConfigAmplitude: data is not an object', data);
36
+ return false;
37
+ }
38
+
39
+ if (!('session_replay_enabled' in data) || typeof data.session_replay_enabled !== 'boolean') {
40
+ Logger.logDebug(
41
+ '[spiffy-ai] isApiOrgAnalyticsConfigAmplitude: session_replay_enabled is not a boolean',
42
+ data,
43
+ );
44
+ return false;
45
+ }
46
+
47
+ if (
48
+ !('session_replay_sample_rate' in data) ||
49
+ typeof data.session_replay_sample_rate !== 'number'
50
+ ) {
51
+ Logger.logDebug(
52
+ '[spiffy-ai] isApiOrgAnalyticsConfigAmplitude: session_replay_sample_rate is not a number',
53
+ data,
54
+ );
55
+ return false;
56
+ }
57
+
58
+ if (!('tracking_enabled' in data) || typeof data.tracking_enabled !== 'boolean') {
59
+ Logger.logDebug(
60
+ '[spiffy-ai] isApiOrgAnalyticsConfigAmplitude: tracking_enabled is not a boolean',
61
+ data,
62
+ );
63
+ return false;
64
+ }
65
+
66
+ return true;
67
+ };
68
+
69
+ const isApiOrgAnalyticsConfigCustomerService = (
70
+ data: unknown,
71
+ ): data is ApiOrgAnalyticsConfigCustomerService => {
72
+ if (data == null || typeof data !== 'object') {
73
+ Logger.logDebug(
74
+ '[spiffy-ai] isApiOrgAnalyticsConfigCustomerService: data is not an object',
75
+ data,
76
+ );
77
+ return false;
78
+ }
79
+
80
+ if (!('provider' in data) || typeof data.provider !== 'string') {
81
+ Logger.logDebug(
82
+ '[spiffy-ai] isApiOrgAnalyticsConfigCustomerService: provider is not a string',
83
+ data,
84
+ );
85
+ return false;
86
+ }
87
+
88
+ return true;
89
+ };
90
+
91
+ const isApiOrgAnalyticsConfigGoogleAnalytics = (
92
+ data: unknown,
93
+ ): data is ApiOrgAnalyticsConfigGoogleAnalytics => {
94
+ if (data == null || typeof data !== 'object') {
95
+ Logger.logDebug(
96
+ '[spiffy-ai] isApiOrgAnalyticsConfigGoogleAnalytics: data is not an object',
97
+ data,
98
+ );
99
+ return false;
100
+ }
101
+
102
+ if (!('measurement_id' in data) || typeof data.measurement_id !== 'string') {
103
+ Logger.logDebug(
104
+ '[spiffy-ai] isApiOrgAnalyticsConfigGoogleAnalytics: measurement_id is not a string',
105
+ data,
106
+ );
107
+ return false;
108
+ }
109
+
110
+ return true;
111
+ };
112
+
113
+ /**
114
+ *
115
+ * @param data
116
+ * @returns
117
+ */
118
+ const isApiOrgAnalyticsConfig = (data: unknown): data is ApiOrgAnalyticsConfig => {
119
+ if (data == null || typeof data !== 'object') {
120
+ Logger.logDebug('[spiffy-ai] isOrgAnalyticsConfig: data is not an object', data);
121
+ return false;
122
+ }
123
+
124
+ if (
125
+ 'amplitude' in data &&
126
+ !isApiOrgAnalyticsConfigAmplitude(data.amplitude)
127
+ ) {
128
+ Logger.logDebug('[spiffy-ai] isOrgAnalyticsConfig: amplitude is not an object', data);
129
+ return false;
130
+ }
131
+
132
+ if (
133
+ 'customer_service' in data &&
134
+ !isApiOrgAnalyticsConfigCustomerService(data.customer_service)
135
+ ) {
136
+ Logger.logDebug('[spiffy-ai] isOrgAnalyticsConfig: customer_service is not an object', data);
137
+ return false;
138
+ }
139
+
140
+ if (
141
+ 'google_analytics' in data &&
142
+ !isApiOrgAnalyticsConfigGoogleAnalytics(data.google_analytics)
143
+ ) {
144
+ Logger.logDebug('[spiffy-ai] isOrgAnalyticsConfig: google_analytics is not an object', data);
145
+ return false;
146
+ }
147
+
148
+ return true;
149
+ };
150
+
151
+ /**
152
+ *
153
+ * @param data
154
+ * @returns
155
+ */
156
+ export const isApiOrganizationConfig = (data: unknown): data is ApiOrganizationConfig => {
157
+ if (data == null || typeof data !== 'object') {
158
+ Logger.logDebug('[spiffy-ai] isOrgConfig: data is not an object', data);
159
+ return false;
160
+ }
161
+
162
+ if (!('created_at' in data)) {
163
+ Logger.logDebug('[spiffy-ai] isOrgConfig: created_at is not defined', data);
164
+ return false;
165
+ }
166
+
167
+ if (!('namespace' in data) || typeof data.namespace !== 'string') {
168
+ Logger.logDebug('[spiffy-ai] isOrgConfig: namespace is not a string', data);
169
+ return false;
170
+ }
171
+
172
+ if (!('is_latest' in data) || typeof data.is_latest !== 'boolean') {
173
+ Logger.logDebug('[spiffy-ai] isOrgConfig: is_latest is not a boolean', data);
174
+ return false;
175
+ }
176
+
177
+ if (!('version' in data) || typeof data.version !== 'string') {
178
+ Logger.logDebug('[spiffy-ai] isOrgConfig: version is not a string', data);
179
+ return false;
180
+ }
181
+
182
+ if (!('updated_at' in data)) {
183
+ Logger.logDebug('[spiffy-ai] isOrgConfig: updated_at is not defined', data);
184
+ return false;
185
+ }
186
+
187
+ if (
188
+ !('config' in data) ||
189
+ typeof data.config !== 'object' ||
190
+ !isApiOrgAnalyticsConfig(data.config)
191
+ ) {
192
+ Logger.logDebug('[spiffy-ai] isOrgConfig: config is not an object', data);
193
+ return false;
194
+ }
195
+
196
+ if ('organization_id' in data && typeof data.organization_id !== 'string') {
197
+ Logger.logDebug('[spiffy-ai] isOrgConfig: organization_id is not a string', data);
198
+ return false;
199
+ }
200
+
201
+ if ('id' in data && typeof data.id !== 'string') {
202
+ Logger.logDebug('[spiffy-ai] isOrgConfig: id is not a string', data);
203
+ return false;
204
+ }
205
+
206
+ return true;
207
+ };
@@ -0,0 +1,21 @@
1
+ import { PDPAttributes } from '@spiffy-ai/commerce-api-client';
2
+
3
+ export const isApiPDPAttributes = (data: unknown): data is PDPAttributes => {
4
+ if (data == null || typeof data !== 'object') {
5
+ return false;
6
+ }
7
+
8
+ if (!('product_id' in data) || typeof data.product_id !== 'string') {
9
+ return false;
10
+ }
11
+
12
+ if ('parent_product_id' in data && typeof data.parent_product_id !== 'string') {
13
+ return false;
14
+ }
15
+
16
+ if ('url' in data && data.url != null && typeof data.url !== 'string') {
17
+ return false;
18
+ }
19
+
20
+ return true;
21
+ };
@@ -0,0 +1,41 @@
1
+ import {
2
+ PLPAttributeCategory,
3
+ PLPAttributes,
4
+ PLPIdAttributes,
5
+ } from '@spiffy-ai/commerce-api-client';
6
+
7
+ export const isApiPLPIdAttribute = (data: unknown): data is PLPIdAttributes => {
8
+ if (data == null || typeof data !== 'object') {
9
+ return false;
10
+ }
11
+
12
+ if (!('id' in data) || typeof data.id !== 'string') {
13
+ return false;
14
+ }
15
+
16
+ return true;
17
+ };
18
+
19
+ export const isApiPLPEventAttributes = (data: unknown): data is PLPAttributes => {
20
+ if (data == null || typeof data !== 'object') {
21
+ return false;
22
+ }
23
+
24
+ if (
25
+ !('category' in data) ||
26
+ typeof data.category !== 'string' ||
27
+ !Object.values(PLPAttributeCategory).includes(data.category as PLPAttributeCategory)
28
+ ) {
29
+ return false;
30
+ }
31
+
32
+ if (
33
+ !('attributes' in data) ||
34
+ typeof data.attributes !== 'object' ||
35
+ !isApiPLPIdAttribute(data.attributes)
36
+ ) {
37
+ return false;
38
+ }
39
+
40
+ return true;
41
+ };
@@ -0,0 +1,21 @@
1
+ import { ApiPageResponseAttributes } from 'src/application/models/api/responseGenerics';
2
+
3
+ export const isApiPageResponseAttributes = (obj: unknown): obj is ApiPageResponseAttributes => {
4
+ if (obj == null || typeof obj !== 'object') {
5
+ return false;
6
+ }
7
+
8
+ if ('title' in obj && obj.title != null && typeof obj.title !== 'string') {
9
+ return false;
10
+ }
11
+
12
+ if ('description' in obj && typeof obj.description !== 'string') {
13
+ return false;
14
+ }
15
+
16
+ if ('url' in obj && typeof obj.url !== 'string') {
17
+ return false;
18
+ }
19
+
20
+ return true;
21
+ };
@@ -0,0 +1,85 @@
1
+ import Logger from 'src/application/logging/logger';
2
+ import { ResponseProductAttributes } from '@spiffy-ai/commerce-api-client';
3
+ import { hasPropertyOfType } from '../utils';
4
+
5
+ export const isApiProductResponseAttributes = (
6
+ attributes: unknown,
7
+ ): attributes is ResponseProductAttributes => {
8
+ if (attributes == null || typeof attributes !== 'object') {
9
+ Logger.logError(
10
+ 'isApiProductResponseAttributes: attributes is null or not an object',
11
+ undefined,
12
+ {
13
+ attributes,
14
+ },
15
+ );
16
+ return false;
17
+ }
18
+
19
+ if (!hasPropertyOfType(attributes, 'description', 'string', true)) {
20
+ Logger.logError('isApiProductResponseAttributes: description is not a string', undefined, {
21
+ attributes,
22
+ });
23
+ return false;
24
+ }
25
+
26
+ if (
27
+ !hasPropertyOfType(attributes, 'image_url', 'string', true)
28
+ ) {
29
+ Logger.logError('isApiProductResponseAttributes: image_url is not a string', undefined, {
30
+ attributes,
31
+ });
32
+ return false;
33
+ }
34
+
35
+ if (!hasPropertyOfType(attributes, 'title', 'string')) {
36
+ Logger.logError('isApiProductResponseAttributes: title is not a string', undefined, {
37
+ attributes,
38
+ });
39
+ return false;
40
+ }
41
+
42
+ if (!hasPropertyOfType(attributes, 'url', 'string')) {
43
+ Logger.logError('isApiProductResponseAttributes: url is not a string', undefined, {
44
+ attributes,
45
+ });
46
+ return false;
47
+ }
48
+
49
+ if (!hasPropertyOfType(attributes, 'original_price', 'number', true)) {
50
+ Logger.logError('isApiProductResponseAttributes: original_price is not a number', undefined, {
51
+ attributes,
52
+ });
53
+ return false;
54
+ }
55
+
56
+ if (!hasPropertyOfType(attributes, 'sale_price', 'number', true)) {
57
+ Logger.logError('isApiProductResponseAttributes: sale_price is not a number', undefined, {
58
+ attributes,
59
+ });
60
+ return false;
61
+ }
62
+
63
+ if (!hasPropertyOfType(attributes, 'average_rating', 'number', true)) {
64
+ Logger.logError('isApiProductResponseAttributes: average_rating is not a number', undefined, {
65
+ attributes,
66
+ });
67
+ return false;
68
+ }
69
+
70
+ if (!hasPropertyOfType(attributes, 'number_reviews', 'number', true)) {
71
+ Logger.logError('isApiProductResponseAttributes: number_reviews is not a number', undefined, {
72
+ attributes,
73
+ });
74
+ return false;
75
+ }
76
+
77
+ if (!hasPropertyOfType(attributes, 'metadata', 'array', true)) {
78
+ Logger.logError('isApiProductResponseAttributes: metadata is not an array', undefined, {
79
+ attributes,
80
+ });
81
+ return false;
82
+ }
83
+
84
+ return true;
85
+ };
@@ -0,0 +1,23 @@
1
+ import { ProductSearchResponseAttributes } from '@spiffy-ai/commerce-api-client';
2
+
3
+ export const isApiProductSearchResponseAttributes = (
4
+ attributes: unknown,
5
+ ): attributes is ProductSearchResponseAttributes => {
6
+ if (attributes == null || typeof attributes !== 'object') {
7
+ return false;
8
+ }
9
+
10
+ if ('generated_query' in attributes && typeof attributes.generated_query !== 'string') {
11
+ return false;
12
+ }
13
+
14
+ if (
15
+ 'product_count' in attributes &&
16
+ attributes.product_count != null &&
17
+ typeof attributes.product_count !== 'number'
18
+ ) {
19
+ return false;
20
+ }
21
+
22
+ return true;
23
+ };
@@ -0,0 +1,15 @@
1
+ import { ProductSearchFilterResponseAttributes } from '@spiffy-ai/commerce-api-client';
2
+
3
+ export const isApiProductSearchFilterResponseAttributes = (
4
+ attributes: unknown,
5
+ ): attributes is ProductSearchFilterResponseAttributes => {
6
+ if (attributes == null || typeof attributes !== 'object') {
7
+ return false;
8
+ }
9
+
10
+ if ('filter_name' in attributes && typeof attributes.filter_name !== 'string') {
11
+ return false;
12
+ }
13
+
14
+ return true;
15
+ };
@@ -0,0 +1,4 @@
1
+ import { QueryTypedAttributes } from '@spiffy-ai/commerce-api-client';
2
+
3
+ export const isApiQueryTypedAttributes = (data: unknown): data is QueryTypedAttributes =>
4
+ data != null && typeof data === 'object' && 'query' in data && typeof data.query === 'string';