@adtrackify/at-service-common 5.0.0 → 5.0.3

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 (837) hide show
  1. package/dist/cjs/__tests__/clients/acuity-client.spec.d.ts +1 -1
  2. package/dist/cjs/__tests__/clients/acuity-client.spec.js +43 -43
  3. package/dist/cjs/__tests__/clients/cross-platform-compression.spec.d.ts +1 -1
  4. package/dist/cjs/__tests__/clients/cross-platform-compression.spec.js +354 -354
  5. package/dist/cjs/__tests__/clients/dynamodb-client.spec.d.ts +1 -1
  6. package/dist/cjs/__tests__/clients/dynamodb-client.spec.js +194 -194
  7. package/dist/cjs/__tests__/clients/event-collector-client.spec.d.ts +1 -1
  8. package/dist/cjs/__tests__/clients/event-collector-client.spec.js +227 -227
  9. package/dist/cjs/__tests__/clients/open-exchange-rates-client.spec.d.ts +1 -1
  10. package/dist/cjs/__tests__/clients/open-exchange-rates-client.spec.js +55 -55
  11. package/dist/cjs/__tests__/clients/sqs-bundled-client.spec.d.ts +1 -1
  12. package/dist/cjs/__tests__/clients/sqs-bundled-client.spec.js +931 -931
  13. package/dist/cjs/__tests__/clients/sqs-bundling-contracts.spec.d.ts +1 -1
  14. package/dist/cjs/__tests__/clients/sqs-bundling-contracts.spec.js +563 -563
  15. package/dist/cjs/__tests__/clients/sqs-client.spec.d.ts +1 -1
  16. package/dist/cjs/__tests__/clients/sqs-client.spec.js +191 -191
  17. package/dist/cjs/__tests__/clients/sqs-unbundle.spec.d.ts +1 -1
  18. package/dist/cjs/__tests__/clients/sqs-unbundle.spec.js +1357 -1357
  19. package/dist/cjs/__tests__/db/contact-enrichments-db-service.spec.d.ts +1 -1
  20. package/dist/cjs/__tests__/db/contact-enrichments-db-service.spec.js +68 -68
  21. package/dist/cjs/__tests__/db/destinations-db-service.spec.d.ts +1 -1
  22. package/dist/cjs/__tests__/db/destinations-db-service.spec.js +125 -125
  23. package/dist/cjs/__tests__/db/products-db-service.spec.d.ts +1 -1
  24. package/dist/cjs/__tests__/db/products-db-service.spec.js +89 -89
  25. package/dist/cjs/__tests__/db/shared-read-db-services.spec.d.ts +1 -1
  26. package/dist/cjs/__tests__/db/shared-read-db-services.spec.js +89 -89
  27. package/dist/cjs/__tests__/db/shopify-app-installs-db-service.spec.d.ts +1 -1
  28. package/dist/cjs/__tests__/db/shopify-app-installs-db-service.spec.js +104 -104
  29. package/dist/cjs/__tests__/db/subscriptions-db-service.spec.d.ts +1 -1
  30. package/dist/cjs/__tests__/db/subscriptions-db-service.spec.js +95 -95
  31. package/dist/cjs/__tests__/db/user-accounts-db-service.spec.d.ts +1 -1
  32. package/dist/cjs/__tests__/db/user-accounts-db-service.spec.js +76 -76
  33. package/dist/cjs/__tests__/helpers/account-users-helper.spec.d.ts +1 -1
  34. package/dist/cjs/__tests__/helpers/account-users-helper.spec.js +220 -220
  35. package/dist/cjs/__tests__/helpers/acuity-helper.spec.d.ts +1 -1
  36. package/dist/cjs/__tests__/helpers/acuity-helper.spec.js +69 -69
  37. package/dist/cjs/__tests__/helpers/api-key-auth-helper.spec.d.ts +1 -1
  38. package/dist/cjs/__tests__/helpers/api-key-auth-helper.spec.js +82 -82
  39. package/dist/cjs/__tests__/helpers/cognito-auth-helper.spec.d.ts +1 -1
  40. package/dist/cjs/__tests__/helpers/cognito-auth-helper.spec.js +46 -46
  41. package/dist/cjs/__tests__/helpers/order-calculation-helper.spec.d.ts +1 -1
  42. package/dist/cjs/__tests__/helpers/order-calculation-helper.spec.js +152 -152
  43. package/dist/cjs/__tests__/helpers/public-api-response-helper.spec.d.ts +1 -1
  44. package/dist/cjs/__tests__/helpers/public-api-response-helper.spec.js +60 -60
  45. package/dist/cjs/__tests__/identity-cache/helpers.spec.d.ts +1 -1
  46. package/dist/cjs/__tests__/identity-cache/helpers.spec.js +592 -592
  47. package/dist/cjs/__tests__/identity-cache/identity-cache-db-service.spec.d.ts +1 -1
  48. package/dist/cjs/__tests__/identity-cache/identity-cache-db-service.spec.js +676 -676
  49. package/dist/cjs/__tests__/identity-cache/identity-cache-dynamodb-db-service.spec.d.ts +1 -1
  50. package/dist/cjs/__tests__/identity-cache/identity-cache-dynamodb-db-service.spec.js +727 -555
  51. package/dist/cjs/__tests__/identity-cache/identity-cache-dynamodb-db-service.spec.js.map +1 -1
  52. package/dist/cjs/__tests__/identity-cache/identity-cache-tier-routing.spec.d.ts +1 -1
  53. package/dist/cjs/__tests__/identity-cache/identity-cache-tier-routing.spec.js +631 -631
  54. package/dist/cjs/__tests__/identity-cache/identity-client.spec.d.ts +1 -1
  55. package/dist/cjs/__tests__/identity-cache/identity-client.spec.js +359 -359
  56. package/dist/cjs/__tests__/identity-cache/identity-gateway-cache-hit.spec.d.ts +1 -1
  57. package/dist/cjs/__tests__/identity-cache/identity-gateway-cache-hit.spec.js +137 -137
  58. package/dist/cjs/__tests__/identity-cache/identity-gateway-cache-miss.spec.d.ts +1 -1
  59. package/dist/cjs/__tests__/identity-cache/identity-gateway-cache-miss.spec.js +152 -152
  60. package/dist/cjs/__tests__/identity-cache/identity-gateway-constructor.spec.d.ts +1 -1
  61. package/dist/cjs/__tests__/identity-cache/identity-gateway-constructor.spec.js +71 -71
  62. package/dist/cjs/__tests__/identity-cache/identity-gateway-edge-cases.spec.d.ts +1 -1
  63. package/dist/cjs/__tests__/identity-cache/identity-gateway-edge-cases.spec.js +88 -88
  64. package/dist/cjs/__tests__/identity-cache/identity-gateway-enqueue-async.spec.d.ts +1 -1
  65. package/dist/cjs/__tests__/identity-cache/identity-gateway-enqueue-async.spec.js +135 -135
  66. package/dist/cjs/__tests__/identity-cache/identity-gateway-stale-cache.spec.d.ts +1 -1
  67. package/dist/cjs/__tests__/identity-cache/identity-gateway-stale-cache.spec.js +223 -223
  68. package/dist/cjs/__tests__/identity-cache/identity-gateway-test-setup.d.ts +28 -28
  69. package/dist/cjs/__tests__/identity-cache/identity-gateway-test-setup.js +89 -89
  70. package/dist/cjs/__tests__/identity-cache/trait-merging-and-staleness.spec.d.ts +1 -1
  71. package/dist/cjs/__tests__/identity-cache/trait-merging-and-staleness.spec.js +1770 -1770
  72. package/dist/cjs/__tests__/identity-cache/volatile-traits-optimization.spec.d.ts +1 -1
  73. package/dist/cjs/__tests__/identity-cache/volatile-traits-optimization.spec.js +818 -818
  74. package/dist/cjs/__tests__/integration/sqs-bundling-roundtrip.spec.d.ts +1 -1
  75. package/dist/cjs/__tests__/integration/sqs-bundling-roundtrip.spec.js +584 -584
  76. package/dist/cjs/__tests__/libs/compress-decompress.spec.d.ts +1 -1
  77. package/dist/cjs/__tests__/libs/compress-decompress.spec.js +16 -16
  78. package/dist/cjs/__tests__/libs/contacts.spec.d.ts +1 -1
  79. package/dist/cjs/__tests__/libs/contacts.spec.js +294 -294
  80. package/dist/cjs/__tests__/libs/currency.spec.d.ts +1 -1
  81. package/dist/cjs/__tests__/libs/currency.spec.js +220 -220
  82. package/dist/cjs/__tests__/libs/dates.spec.d.ts +1 -1
  83. package/dist/cjs/__tests__/libs/dates.spec.js +130 -130
  84. package/dist/cjs/__tests__/libs/domain.spec.d.ts +1 -1
  85. package/dist/cjs/__tests__/libs/domain.spec.js +107 -107
  86. package/dist/cjs/__tests__/libs/numbers.spec.d.ts +1 -1
  87. package/dist/cjs/__tests__/libs/numbers.spec.js +261 -261
  88. package/dist/cjs/__tests__/s3-client/s3-client.spec.d.ts +1 -1
  89. package/dist/cjs/__tests__/s3-client/s3-client.spec.js +33 -33
  90. package/dist/cjs/__tests__/services/acuity-api-service.spec.d.ts +1 -1
  91. package/dist/cjs/__tests__/services/acuity-api-service.spec.js +71 -71
  92. package/dist/cjs/__tests__/services/cost/cost-calculation-types.spec.d.ts +1 -1
  93. package/dist/cjs/__tests__/services/cost/cost-calculation-types.spec.js +23 -23
  94. package/dist/cjs/__tests__/services/cost/cost-calculator-service.spec.d.ts +1 -1
  95. package/dist/cjs/__tests__/services/cost/cost-calculator-service.spec.js +3361 -3361
  96. package/dist/cjs/__tests__/services/cost/cost-currency-service.spec.d.ts +1 -1
  97. package/dist/cjs/__tests__/services/cost/cost-currency-service.spec.js +114 -114
  98. package/dist/cjs/__tests__/services/cost/cost-filter-service.spec.d.ts +1 -1
  99. package/dist/cjs/__tests__/services/cost/cost-filter-service.spec.js +468 -468
  100. package/dist/cjs/__tests__/services/cost/order-cost/order-cost-resolution-service.spec.d.ts +1 -1
  101. package/dist/cjs/__tests__/services/cost/order-cost/order-cost-resolution-service.spec.js +360 -360
  102. package/dist/cjs/__tests__/services/currency-exchange-rate-lookup-service.spec.d.ts +1 -1
  103. package/dist/cjs/__tests__/services/currency-exchange-rate-lookup-service.spec.js +34 -34
  104. package/dist/cjs/__tests__/services/email-verification/contact-email-verification-service.spec.d.ts +1 -1
  105. package/dist/cjs/__tests__/services/email-verification/contact-email-verification-service.spec.js +93 -93
  106. package/dist/cjs/__tests__/services/email-verification/email-verification-service.spec.d.ts +1 -1
  107. package/dist/cjs/__tests__/services/email-verification/email-verification-service.spec.js +57 -57
  108. package/dist/cjs/__tests__/services/events/collect-queue-tracking-service.spec.d.ts +1 -1
  109. package/dist/cjs/__tests__/services/events/collect-queue-tracking-service.spec.js +229 -229
  110. package/dist/cjs/__tests__/services/events/tracking-event-sqs-service.spec.d.ts +1 -1
  111. package/dist/cjs/__tests__/services/events/tracking-event-sqs-service.spec.js +191 -191
  112. package/dist/cjs/__tests__/shopify/shopify-graphql-transformer.spec.d.ts +1 -1
  113. package/dist/cjs/__tests__/shopify/shopify-graphql-transformer.spec.js +35 -35
  114. package/dist/cjs/__tests__/unit/libs/api-router/public-api-router.spec.d.ts +1 -1
  115. package/dist/cjs/__tests__/unit/libs/api-router/public-api-router.spec.js +181 -181
  116. package/dist/cjs/__tests__/unit/libs/api-router/route-matcher.spec.d.ts +1 -1
  117. package/dist/cjs/__tests__/unit/libs/api-router/route-matcher.spec.js +69 -69
  118. package/dist/cjs/__tests__/utils/custom-measure-formula-utils.spec.d.ts +1 -1
  119. package/dist/cjs/__tests__/utils/custom-measure-formula-utils.spec.js +146 -146
  120. package/dist/cjs/clients/generic/cognito-client.d.ts +23 -23
  121. package/dist/cjs/clients/generic/cognito-client.js +209 -209
  122. package/dist/cjs/clients/generic/dynamodb-client.d.ts +20 -20
  123. package/dist/cjs/clients/generic/dynamodb-client.js +235 -235
  124. package/dist/cjs/clients/generic/eventbridge-client.d.ts +14 -14
  125. package/dist/cjs/clients/generic/eventbridge-client.js +51 -51
  126. package/dist/cjs/clients/generic/http-client.d.ts +14 -14
  127. package/dist/cjs/clients/generic/http-client.js +61 -61
  128. package/dist/cjs/clients/generic/index.d.ts +13 -13
  129. package/dist/cjs/clients/generic/index.js +29 -29
  130. package/dist/cjs/clients/generic/lambda-invoke-client.d.ts +10 -10
  131. package/dist/cjs/clients/generic/lambda-invoke-client.js +39 -39
  132. package/dist/cjs/clients/generic/location-client.d.ts +8 -8
  133. package/dist/cjs/clients/generic/location-client.js +31 -31
  134. package/dist/cjs/clients/generic/redis-client.d.ts +33 -33
  135. package/dist/cjs/clients/generic/redis-client.js +191 -191
  136. package/dist/cjs/clients/generic/s3-client.d.ts +23 -23
  137. package/dist/cjs/clients/generic/s3-client.js +216 -216
  138. package/dist/cjs/clients/generic/singlestore-db-client.d.ts +21 -14
  139. package/dist/cjs/clients/generic/singlestore-db-client.js +92 -67
  140. package/dist/cjs/clients/generic/singlestore-db-client.js.map +1 -1
  141. package/dist/cjs/clients/generic/sqs-bundled-client.d.ts +15 -15
  142. package/dist/cjs/clients/generic/sqs-bundled-client.js +311 -311
  143. package/dist/cjs/clients/generic/sqs-bundled-client.types.d.ts +53 -53
  144. package/dist/cjs/clients/generic/sqs-bundled-client.types.js +17 -17
  145. package/dist/cjs/clients/generic/sqs-client.d.ts +53 -53
  146. package/dist/cjs/clients/generic/sqs-client.js +285 -285
  147. package/dist/cjs/clients/generic/sqs-unbundle.d.ts +32 -32
  148. package/dist/cjs/clients/generic/sqs-unbundle.js +144 -144
  149. package/dist/cjs/clients/index.d.ts +3 -3
  150. package/dist/cjs/clients/index.js +19 -19
  151. package/dist/cjs/clients/internal-api/accounts-client.d.ts +91 -91
  152. package/dist/cjs/clients/internal-api/accounts-client.js +129 -129
  153. package/dist/cjs/clients/internal-api/cache-lambda-client.d.ts +26 -26
  154. package/dist/cjs/clients/internal-api/cache-lambda-client.js +89 -89
  155. package/dist/cjs/clients/internal-api/db-management-client.d.ts +18 -18
  156. package/dist/cjs/clients/internal-api/db-management-client.js +36 -36
  157. package/dist/cjs/clients/internal-api/destinations-client.d.ts +34 -34
  158. package/dist/cjs/clients/internal-api/destinations-client.js +79 -79
  159. package/dist/cjs/clients/internal-api/event-collector-client.d.ts +122 -122
  160. package/dist/cjs/clients/internal-api/event-collector-client.js +78 -78
  161. package/dist/cjs/clients/internal-api/identity-client.d.ts +41 -41
  162. package/dist/cjs/clients/internal-api/identity-client.js +137 -137
  163. package/dist/cjs/clients/internal-api/index.d.ts +9 -9
  164. package/dist/cjs/clients/internal-api/index.js +25 -25
  165. package/dist/cjs/clients/internal-api/shopify-app-install-client.d.ts +37 -37
  166. package/dist/cjs/clients/internal-api/shopify-app-install-client.js +81 -81
  167. package/dist/cjs/clients/internal-api/subscriptions-client.d.ts +26 -26
  168. package/dist/cjs/clients/internal-api/subscriptions-client.js +77 -77
  169. package/dist/cjs/clients/internal-api/users-auth-client.d.ts +35 -35
  170. package/dist/cjs/clients/internal-api/users-auth-client.js +110 -110
  171. package/dist/cjs/clients/third-party/acuity-client.d.ts +10 -10
  172. package/dist/cjs/clients/third-party/acuity-client.js +40 -40
  173. package/dist/cjs/clients/third-party/emailable-client.d.ts +7 -7
  174. package/dist/cjs/clients/third-party/emailable-client.js +25 -25
  175. package/dist/cjs/clients/third-party/exchange-rate-api-client.d.ts +17 -17
  176. package/dist/cjs/clients/third-party/exchange-rate-api-client.js +19 -19
  177. package/dist/cjs/clients/third-party/index.d.ts +6 -6
  178. package/dist/cjs/clients/third-party/index.js +22 -22
  179. package/dist/cjs/clients/third-party/loops-client.d.ts +10 -10
  180. package/dist/cjs/clients/third-party/loops-client.js +30 -30
  181. package/dist/cjs/clients/third-party/open-exchange-rates-client.d.ts +8 -8
  182. package/dist/cjs/clients/third-party/open-exchange-rates-client.js +27 -27
  183. package/dist/cjs/clients/third-party/shopify/graphql-analytics-queries.d.ts +18 -18
  184. package/dist/cjs/clients/third-party/shopify/graphql-analytics-queries.js +22 -22
  185. package/dist/cjs/clients/third-party/shopify/graphql-order-queries.d.ts +25 -25
  186. package/dist/cjs/clients/third-party/shopify/graphql-order-queries.js +4 -4
  187. package/dist/cjs/clients/third-party/shopify/graphql-product-queries.d.ts +2 -2
  188. package/dist/cjs/clients/third-party/shopify/graphql-product-queries.js +5 -5
  189. package/dist/cjs/clients/third-party/shopify/shopify-graphql-client.d.ts +42 -42
  190. package/dist/cjs/clients/third-party/shopify/shopify-graphql-client.js +352 -352
  191. package/dist/cjs/clients/third-party/shopify-client.d.ts +29 -29
  192. package/dist/cjs/clients/third-party/shopify-client.js +146 -146
  193. package/dist/cjs/constants/index.d.ts +1 -1
  194. package/dist/cjs/constants/index.js +17 -17
  195. package/dist/cjs/constants/sqs.d.ts +20 -20
  196. package/dist/cjs/constants/sqs.js +26 -26
  197. package/dist/cjs/helpers/account-users-helper.d.ts +2 -2
  198. package/dist/cjs/helpers/account-users-helper.js +22 -22
  199. package/dist/cjs/helpers/acuity-helper.d.ts +4 -4
  200. package/dist/cjs/helpers/acuity-helper.js +56 -56
  201. package/dist/cjs/helpers/api-key-auth-helper.d.ts +9 -9
  202. package/dist/cjs/helpers/api-key-auth-helper.js +40 -40
  203. package/dist/cjs/helpers/api-key-authorizer-helper.d.ts +36 -36
  204. package/dist/cjs/helpers/api-key-authorizer-helper.js +87 -87
  205. package/dist/cjs/helpers/cognito-auth-helper.d.ts +5 -5
  206. package/dist/cjs/helpers/cognito-auth-helper.js +14 -14
  207. package/dist/cjs/helpers/index.d.ts +12 -12
  208. package/dist/cjs/helpers/index.js +28 -28
  209. package/dist/cjs/helpers/input-validation-helper.d.ts +3 -3
  210. package/dist/cjs/helpers/input-validation-helper.js +22 -22
  211. package/dist/cjs/helpers/logging-helper.d.ts +16 -16
  212. package/dist/cjs/helpers/logging-helper.js +84 -84
  213. package/dist/cjs/helpers/order-calculation-helper.d.ts +13 -13
  214. package/dist/cjs/helpers/order-calculation-helper.js +117 -117
  215. package/dist/cjs/helpers/public-api-response-helper.d.ts +21 -21
  216. package/dist/cjs/helpers/public-api-response-helper.js +45 -45
  217. package/dist/cjs/helpers/response-helper.d.ts +18 -18
  218. package/dist/cjs/helpers/response-helper.js +43 -43
  219. package/dist/cjs/helpers/shopify-helper.d.ts +9 -9
  220. package/dist/cjs/helpers/shopify-helper.js +26 -26
  221. package/dist/cjs/helpers/sqs-utils.d.ts +6 -6
  222. package/dist/cjs/helpers/sqs-utils.js +14 -14
  223. package/dist/cjs/index.d.ts +7 -7
  224. package/dist/cjs/index.js +23 -23
  225. package/dist/cjs/libs/api-router/index.d.ts +2 -2
  226. package/dist/cjs/libs/api-router/index.js +18 -18
  227. package/dist/cjs/libs/api-router/public-api-router.d.ts +3 -3
  228. package/dist/cjs/libs/api-router/public-api-router.js +36 -36
  229. package/dist/cjs/libs/api-router/route-matcher.d.ts +21 -21
  230. package/dist/cjs/libs/api-router/route-matcher.js +36 -36
  231. package/dist/cjs/libs/click-id-parser.d.ts +23 -23
  232. package/dist/cjs/libs/click-id-parser.js +49 -49
  233. package/dist/cjs/libs/compression.d.ts +2 -2
  234. package/dist/cjs/libs/compression.js +33 -33
  235. package/dist/cjs/libs/contacts.d.ts +7 -7
  236. package/dist/cjs/libs/contacts.js +152 -152
  237. package/dist/cjs/libs/cookie.d.ts +17 -17
  238. package/dist/cjs/libs/cookie.js +76 -76
  239. package/dist/cjs/libs/crypto.d.ts +4 -4
  240. package/dist/cjs/libs/crypto.js +25 -25
  241. package/dist/cjs/libs/csv.d.ts +2 -2
  242. package/dist/cjs/libs/csv.js +35 -35
  243. package/dist/cjs/libs/currency.d.ts +1 -1
  244. package/dist/cjs/libs/currency.js +29 -29
  245. package/dist/cjs/libs/dates.d.ts +12 -12
  246. package/dist/cjs/libs/dates.js +96 -96
  247. package/dist/cjs/libs/domain.d.ts +2 -2
  248. package/dist/cjs/libs/domain.js +38 -38
  249. package/dist/cjs/libs/emails.d.ts +8 -8
  250. package/dist/cjs/libs/emails.js +154 -154
  251. package/dist/cjs/libs/http-error.d.ts +21 -21
  252. package/dist/cjs/libs/http-error.js +63 -63
  253. package/dist/cjs/libs/http-status-codes.d.ts +58 -58
  254. package/dist/cjs/libs/http-status-codes.js +62 -62
  255. package/dist/cjs/libs/index.d.ts +19 -19
  256. package/dist/cjs/libs/index.js +35 -35
  257. package/dist/cjs/libs/numbers.d.ts +1 -1
  258. package/dist/cjs/libs/numbers.js +15 -15
  259. package/dist/cjs/libs/referrer-parser/index.d.ts +2 -2
  260. package/dist/cjs/libs/referrer-parser/index.js +18 -18
  261. package/dist/cjs/libs/referrer-parser/referrer-data.d.ts +9 -9
  262. package/dist/cjs/libs/referrer-parser/referrer-data.js +3307 -3307
  263. package/dist/cjs/libs/referrer-parser/referrer-parser-util.d.ts +20 -20
  264. package/dist/cjs/libs/referrer-parser/referrer-parser-util.js +131 -131
  265. package/dist/cjs/libs/strings.d.ts +3 -3
  266. package/dist/cjs/libs/strings.js +46 -46
  267. package/dist/cjs/libs/traits.d.ts +6 -6
  268. package/dist/cjs/libs/traits.js +65 -65
  269. package/dist/cjs/libs/url.d.ts +1 -1
  270. package/dist/cjs/libs/url.js +13 -13
  271. package/dist/cjs/services/acuity-api-service.d.ts +9 -9
  272. package/dist/cjs/services/acuity-api-service.js +73 -73
  273. package/dist/cjs/services/cache/generic-cached-object.d.ts +5 -5
  274. package/dist/cjs/services/cache/generic-cached-object.js +2 -2
  275. package/dist/cjs/services/cache/index.d.ts +1 -1
  276. package/dist/cjs/services/cache/index.js +17 -17
  277. package/dist/cjs/services/cache/product-cache-service.d.ts +21 -21
  278. package/dist/cjs/services/cache/product-cache-service.js +76 -76
  279. package/dist/cjs/services/cost/cost-calculation-types.d.ts +69 -69
  280. package/dist/cjs/services/cost/cost-calculation-types.js +19 -19
  281. package/dist/cjs/services/cost/cost-calculator-service.d.ts +24 -24
  282. package/dist/cjs/services/cost/cost-calculator-service.js +462 -462
  283. package/dist/cjs/services/cost/cost-currency-service.d.ts +6 -6
  284. package/dist/cjs/services/cost/cost-currency-service.js +87 -87
  285. package/dist/cjs/services/cost/cost-filter-service.d.ts +10 -10
  286. package/dist/cjs/services/cost/cost-filter-service.js +121 -121
  287. package/dist/cjs/services/cost/index.d.ts +5 -5
  288. package/dist/cjs/services/cost/index.js +21 -21
  289. package/dist/cjs/services/cost/order-cost/index.d.ts +2 -2
  290. package/dist/cjs/services/cost/order-cost/index.js +18 -18
  291. package/dist/cjs/services/cost/order-cost/order-cost-resolution-service.d.ts +23 -23
  292. package/dist/cjs/services/cost/order-cost/order-cost-resolution-service.js +293 -293
  293. package/dist/cjs/services/cost/order-cost/order-cost-resolution-types.d.ts +31 -31
  294. package/dist/cjs/services/cost/order-cost/order-cost-resolution-types.js +2 -2
  295. package/dist/cjs/services/currency-exchange-rate-lookup-service.d.ts +12 -12
  296. package/dist/cjs/services/currency-exchange-rate-lookup-service.js +94 -94
  297. package/dist/cjs/services/db/accounts-db-service.d.ts +9 -9
  298. package/dist/cjs/services/db/accounts-db-service.js +33 -33
  299. package/dist/cjs/services/db/api-keys-db-service.d.ts +10 -10
  300. package/dist/cjs/services/db/api-keys-db-service.js +36 -36
  301. package/dist/cjs/services/db/contact-enrichments-db-service.d.ts +15 -15
  302. package/dist/cjs/services/db/contact-enrichments-db-service.js +94 -94
  303. package/dist/cjs/services/db/currency-exchange-rates-db-service.d.ts +21 -21
  304. package/dist/cjs/services/db/currency-exchange-rates-db-service.js +39 -39
  305. package/dist/cjs/services/db/custom-measures-db-service.d.ts +14 -14
  306. package/dist/cjs/services/db/custom-measures-db-service.js +48 -48
  307. package/dist/cjs/services/db/destinations-db-service.d.ts +13 -13
  308. package/dist/cjs/services/db/destinations-db-service.js +74 -74
  309. package/dist/cjs/services/db/identity-cache-db-service.d.ts +28 -28
  310. package/dist/cjs/services/db/identity-cache-db-service.js +320 -320
  311. package/dist/cjs/services/db/identity-cache-dynamodb-service/constants.d.ts +3 -3
  312. package/dist/cjs/services/db/identity-cache-dynamodb-service/constants.js +6 -6
  313. package/dist/cjs/services/db/identity-cache-dynamodb-service/identity-cache-dynamodb-db-service.d.ts +25 -20
  314. package/dist/cjs/services/db/identity-cache-dynamodb-service/identity-cache-dynamodb-db-service.js +507 -362
  315. package/dist/cjs/services/db/identity-cache-dynamodb-service/identity-cache-dynamodb-db-service.js.map +1 -1
  316. package/dist/cjs/services/db/identity-cache-dynamodb-service/identity-gateway-service.d.ts +23 -23
  317. package/dist/cjs/services/db/identity-cache-dynamodb-service/identity-gateway-service.js +222 -222
  318. package/dist/cjs/services/db/identity-cache-dynamodb-service/index.d.ts +4 -4
  319. package/dist/cjs/services/db/identity-cache-dynamodb-service/index.js +20 -20
  320. package/dist/cjs/services/db/identity-cache-dynamodb-service/key-builders.d.ts +12 -12
  321. package/dist/cjs/services/db/identity-cache-dynamodb-service/key-builders.js +31 -31
  322. package/dist/cjs/services/db/identity-cache-dynamodb-service/types.d.ts +82 -71
  323. package/dist/cjs/services/db/identity-cache-dynamodb-service/types.js +28 -28
  324. package/dist/cjs/services/db/identity-cache-dynamodb-service/types.js.map +1 -1
  325. package/dist/cjs/services/db/index.d.ts +22 -22
  326. package/dist/cjs/services/db/index.js +38 -38
  327. package/dist/cjs/services/db/log-events-db-service.d.ts +11 -11
  328. package/dist/cjs/services/db/log-events-db-service.js +181 -181
  329. package/dist/cjs/services/db/pixels-db-service.d.ts +8 -8
  330. package/dist/cjs/services/db/pixels-db-service.js +35 -35
  331. package/dist/cjs/services/db/products-db-service-types.d.ts +10 -10
  332. package/dist/cjs/services/db/products-db-service-types.js +2 -2
  333. package/dist/cjs/services/db/products-db-service.d.ts +19 -19
  334. package/dist/cjs/services/db/products-db-service.js +281 -281
  335. package/dist/cjs/services/db/purchasable-contacts-db-service.d.ts +9 -9
  336. package/dist/cjs/services/db/purchasable-contacts-db-service.js +43 -43
  337. package/dist/cjs/services/db/purchased-contacts/index.d.ts +2 -2
  338. package/dist/cjs/services/db/purchased-contacts/index.js +18 -18
  339. package/dist/cjs/services/db/purchased-contacts/purchased-contacts-db-service.d.ts +18 -18
  340. package/dist/cjs/services/db/purchased-contacts/purchased-contacts-db-service.js +152 -152
  341. package/dist/cjs/services/db/purchased-contacts/types.d.ts +11 -11
  342. package/dist/cjs/services/db/purchased-contacts/types.js +2 -2
  343. package/dist/cjs/services/db/shopify-app-installs-db-service.d.ts +10 -10
  344. package/dist/cjs/services/db/shopify-app-installs-db-service.js +52 -52
  345. package/dist/cjs/services/db/shopify-products-cache-db-service.d.ts +16 -16
  346. package/dist/cjs/services/db/shopify-products-cache-db-service.js +73 -73
  347. package/dist/cjs/services/db/subscriptions-db-service.d.ts +11 -11
  348. package/dist/cjs/services/db/subscriptions-db-service.js +38 -38
  349. package/dist/cjs/services/db/tracking-events-db-service.d.ts +21 -21
  350. package/dist/cjs/services/db/tracking-events-db-service.js +188 -188
  351. package/dist/cjs/services/db/user-accounts-db-service.d.ts +7 -7
  352. package/dist/cjs/services/db/user-accounts-db-service.js +17 -17
  353. package/dist/cjs/services/email-verification/contact-email-verification-service.d.ts +7 -7
  354. package/dist/cjs/services/email-verification/contact-email-verification-service.js +101 -101
  355. package/dist/cjs/services/email-verification/email-verification-service.d.ts +19 -19
  356. package/dist/cjs/services/email-verification/email-verification-service.js +131 -131
  357. package/dist/cjs/services/email-verification/index.d.ts +2 -2
  358. package/dist/cjs/services/email-verification/index.js +18 -18
  359. package/dist/cjs/services/eventbridge-integration-service.d.ts +9 -9
  360. package/dist/cjs/services/eventbridge-integration-service.js +28 -28
  361. package/dist/cjs/services/events/build-collect-queue-tracking-event.d.ts +11 -11
  362. package/dist/cjs/services/events/build-collect-queue-tracking-event.js +23 -23
  363. package/dist/cjs/services/events/collect-queue-tracking-service.d.ts +12 -12
  364. package/dist/cjs/services/events/collect-queue-tracking-service.js +22 -22
  365. package/dist/cjs/services/events/index.d.ts +5 -5
  366. package/dist/cjs/services/events/index.js +21 -21
  367. package/dist/cjs/services/events/log-event-service.d.ts +19 -19
  368. package/dist/cjs/services/events/log-event-service.js +77 -77
  369. package/dist/cjs/services/events/metric-event-service.d.ts +9 -9
  370. package/dist/cjs/services/events/metric-event-service.js +49 -49
  371. package/dist/cjs/services/events/tracking-event-sqs-service.d.ts +8 -8
  372. package/dist/cjs/services/events/tracking-event-sqs-service.js +36 -36
  373. package/dist/cjs/services/generic-cache-service.d.ts +7 -7
  374. package/dist/cjs/services/generic-cache-service.js +33 -33
  375. package/dist/cjs/services/index.d.ts +11 -11
  376. package/dist/cjs/services/index.js +27 -27
  377. package/dist/cjs/services/ipdata-lookup-service.d.ts +20 -20
  378. package/dist/cjs/services/ipdata-lookup-service.js +112 -112
  379. package/dist/cjs/services/shopify/index.d.ts +2 -2
  380. package/dist/cjs/services/shopify/index.js +18 -18
  381. package/dist/cjs/services/shopify/products/index.d.ts +1 -1
  382. package/dist/cjs/services/shopify/products/index.js +17 -17
  383. package/dist/cjs/services/shopify/products/shopify-products-serviceV2.d.ts +17 -17
  384. package/dist/cjs/services/shopify/products/shopify-products-serviceV2.js +112 -112
  385. package/dist/cjs/services/shopify/shopify-graphql-transformer.d.ts +8 -8
  386. package/dist/cjs/services/shopify/shopify-graphql-transformer.js +141 -141
  387. package/dist/cjs/types/acuity-types.d.ts +74 -74
  388. package/dist/cjs/types/acuity-types.js +2 -2
  389. package/dist/cjs/types/api-response.d.ts +6 -6
  390. package/dist/cjs/types/api-response.js +2 -2
  391. package/dist/cjs/types/index.d.ts +6 -6
  392. package/dist/cjs/types/index.js +35 -35
  393. package/dist/cjs/types/internal-events/event-detail-types.d.ts +20 -20
  394. package/dist/cjs/types/internal-events/event-detail-types.js +27 -27
  395. package/dist/cjs/types/internal-events/index.d.ts +1 -1
  396. package/dist/cjs/types/internal-events/index.js +17 -17
  397. package/dist/cjs/types/open-exchange-rates-types.d.ts +10 -10
  398. package/dist/cjs/types/open-exchange-rates-types.js +2 -2
  399. package/dist/cjs/types/public-api-types.d.ts +24 -24
  400. package/dist/cjs/types/public-api-types.js +13 -13
  401. package/dist/cjs/types/shopify-graphql-types/admin.generated.d.ts +123 -123
  402. package/dist/cjs/types/shopify-graphql-types/admin.generated.js +2 -2
  403. package/dist/cjs/types/shopify-graphql-types/admin.types.d.ts +26289 -26289
  404. package/dist/cjs/types/shopify-graphql-types/admin.types.js +5311 -5311
  405. package/dist/cjs/types/shopify-graphql-types/index.d.ts +2 -2
  406. package/dist/cjs/types/shopify-graphql-types/index.js +18 -18
  407. package/dist/cjs/types/shopify-rest-types.d.ts +767 -767
  408. package/dist/cjs/types/shopify-rest-types.js +2 -2
  409. package/dist/cjs/utils/compression.d.ts +36 -36
  410. package/dist/cjs/utils/compression.js +198 -198
  411. package/dist/cjs/utils/custom-measure-formula-utils.d.ts +6 -6
  412. package/dist/cjs/utils/custom-measure-formula-utils.js +209 -209
  413. package/dist/cjs/utils/index.d.ts +4 -4
  414. package/dist/cjs/utils/index.js +20 -20
  415. package/dist/cjs/utils/retry-envelope.d.ts +12 -12
  416. package/dist/cjs/utils/retry-envelope.js +28 -28
  417. package/dist/cjs/utils/size.d.ts +2 -2
  418. package/dist/cjs/utils/size.js +49 -49
  419. package/dist/esm/__tests__/clients/acuity-client.spec.d.ts +1 -1
  420. package/dist/esm/__tests__/clients/acuity-client.spec.js +41 -41
  421. package/dist/esm/__tests__/clients/cross-platform-compression.spec.d.ts +1 -1
  422. package/dist/esm/__tests__/clients/cross-platform-compression.spec.js +329 -329
  423. package/dist/esm/__tests__/clients/dynamodb-client.spec.d.ts +1 -1
  424. package/dist/esm/__tests__/clients/dynamodb-client.spec.js +192 -192
  425. package/dist/esm/__tests__/clients/event-collector-client.spec.d.ts +1 -1
  426. package/dist/esm/__tests__/clients/event-collector-client.spec.js +225 -225
  427. package/dist/esm/__tests__/clients/open-exchange-rates-client.spec.d.ts +1 -1
  428. package/dist/esm/__tests__/clients/open-exchange-rates-client.spec.js +53 -53
  429. package/dist/esm/__tests__/clients/sqs-bundled-client.spec.d.ts +1 -1
  430. package/dist/esm/__tests__/clients/sqs-bundled-client.spec.js +906 -906
  431. package/dist/esm/__tests__/clients/sqs-bundling-contracts.spec.d.ts +1 -1
  432. package/dist/esm/__tests__/clients/sqs-bundling-contracts.spec.js +538 -538
  433. package/dist/esm/__tests__/clients/sqs-client.spec.d.ts +1 -1
  434. package/dist/esm/__tests__/clients/sqs-client.spec.js +189 -189
  435. package/dist/esm/__tests__/clients/sqs-unbundle.spec.d.ts +1 -1
  436. package/dist/esm/__tests__/clients/sqs-unbundle.spec.js +1355 -1355
  437. package/dist/esm/__tests__/db/contact-enrichments-db-service.spec.d.ts +1 -1
  438. package/dist/esm/__tests__/db/contact-enrichments-db-service.spec.js +66 -66
  439. package/dist/esm/__tests__/db/destinations-db-service.spec.d.ts +1 -1
  440. package/dist/esm/__tests__/db/destinations-db-service.spec.js +123 -123
  441. package/dist/esm/__tests__/db/products-db-service.spec.d.ts +1 -1
  442. package/dist/esm/__tests__/db/products-db-service.spec.js +87 -87
  443. package/dist/esm/__tests__/db/shared-read-db-services.spec.d.ts +1 -1
  444. package/dist/esm/__tests__/db/shared-read-db-services.spec.js +87 -87
  445. package/dist/esm/__tests__/db/shopify-app-installs-db-service.spec.d.ts +1 -1
  446. package/dist/esm/__tests__/db/shopify-app-installs-db-service.spec.js +102 -102
  447. package/dist/esm/__tests__/db/subscriptions-db-service.spec.d.ts +1 -1
  448. package/dist/esm/__tests__/db/subscriptions-db-service.spec.js +93 -93
  449. package/dist/esm/__tests__/db/user-accounts-db-service.spec.d.ts +1 -1
  450. package/dist/esm/__tests__/db/user-accounts-db-service.spec.js +74 -74
  451. package/dist/esm/__tests__/helpers/account-users-helper.spec.d.ts +1 -1
  452. package/dist/esm/__tests__/helpers/account-users-helper.spec.js +218 -218
  453. package/dist/esm/__tests__/helpers/acuity-helper.spec.d.ts +1 -1
  454. package/dist/esm/__tests__/helpers/acuity-helper.spec.js +67 -67
  455. package/dist/esm/__tests__/helpers/api-key-auth-helper.spec.d.ts +1 -1
  456. package/dist/esm/__tests__/helpers/api-key-auth-helper.spec.js +80 -80
  457. package/dist/esm/__tests__/helpers/cognito-auth-helper.spec.d.ts +1 -1
  458. package/dist/esm/__tests__/helpers/cognito-auth-helper.spec.js +44 -44
  459. package/dist/esm/__tests__/helpers/order-calculation-helper.spec.d.ts +1 -1
  460. package/dist/esm/__tests__/helpers/order-calculation-helper.spec.js +150 -150
  461. package/dist/esm/__tests__/helpers/public-api-response-helper.spec.d.ts +1 -1
  462. package/dist/esm/__tests__/helpers/public-api-response-helper.spec.js +55 -55
  463. package/dist/esm/__tests__/identity-cache/helpers.spec.d.ts +1 -1
  464. package/dist/esm/__tests__/identity-cache/helpers.spec.js +590 -590
  465. package/dist/esm/__tests__/identity-cache/identity-cache-db-service.spec.d.ts +1 -1
  466. package/dist/esm/__tests__/identity-cache/identity-cache-db-service.spec.js +674 -674
  467. package/dist/esm/__tests__/identity-cache/identity-cache-dynamodb-db-service.spec.d.ts +1 -1
  468. package/dist/esm/__tests__/identity-cache/identity-cache-dynamodb-db-service.spec.js +725 -553
  469. package/dist/esm/__tests__/identity-cache/identity-cache-dynamodb-db-service.spec.js.map +1 -1
  470. package/dist/esm/__tests__/identity-cache/identity-cache-tier-routing.spec.d.ts +1 -1
  471. package/dist/esm/__tests__/identity-cache/identity-cache-tier-routing.spec.js +629 -629
  472. package/dist/esm/__tests__/identity-cache/identity-client.spec.d.ts +1 -1
  473. package/dist/esm/__tests__/identity-cache/identity-client.spec.js +357 -357
  474. package/dist/esm/__tests__/identity-cache/identity-gateway-cache-hit.spec.d.ts +1 -1
  475. package/dist/esm/__tests__/identity-cache/identity-gateway-cache-hit.spec.js +135 -135
  476. package/dist/esm/__tests__/identity-cache/identity-gateway-cache-miss.spec.d.ts +1 -1
  477. package/dist/esm/__tests__/identity-cache/identity-gateway-cache-miss.spec.js +150 -150
  478. package/dist/esm/__tests__/identity-cache/identity-gateway-constructor.spec.d.ts +1 -1
  479. package/dist/esm/__tests__/identity-cache/identity-gateway-constructor.spec.js +69 -69
  480. package/dist/esm/__tests__/identity-cache/identity-gateway-edge-cases.spec.d.ts +1 -1
  481. package/dist/esm/__tests__/identity-cache/identity-gateway-edge-cases.spec.js +86 -86
  482. package/dist/esm/__tests__/identity-cache/identity-gateway-enqueue-async.spec.d.ts +1 -1
  483. package/dist/esm/__tests__/identity-cache/identity-gateway-enqueue-async.spec.js +133 -133
  484. package/dist/esm/__tests__/identity-cache/identity-gateway-stale-cache.spec.d.ts +1 -1
  485. package/dist/esm/__tests__/identity-cache/identity-gateway-stale-cache.spec.js +221 -221
  486. package/dist/esm/__tests__/identity-cache/identity-gateway-test-setup.d.ts +28 -28
  487. package/dist/esm/__tests__/identity-cache/identity-gateway-test-setup.js +82 -82
  488. package/dist/esm/__tests__/identity-cache/trait-merging-and-staleness.spec.d.ts +1 -1
  489. package/dist/esm/__tests__/identity-cache/trait-merging-and-staleness.spec.js +1768 -1768
  490. package/dist/esm/__tests__/identity-cache/volatile-traits-optimization.spec.d.ts +1 -1
  491. package/dist/esm/__tests__/identity-cache/volatile-traits-optimization.spec.js +816 -816
  492. package/dist/esm/__tests__/integration/sqs-bundling-roundtrip.spec.d.ts +1 -1
  493. package/dist/esm/__tests__/integration/sqs-bundling-roundtrip.spec.js +582 -582
  494. package/dist/esm/__tests__/libs/compress-decompress.spec.d.ts +1 -1
  495. package/dist/esm/__tests__/libs/compress-decompress.spec.js +14 -14
  496. package/dist/esm/__tests__/libs/contacts.spec.d.ts +1 -1
  497. package/dist/esm/__tests__/libs/contacts.spec.js +292 -292
  498. package/dist/esm/__tests__/libs/currency.spec.d.ts +1 -1
  499. package/dist/esm/__tests__/libs/currency.spec.js +218 -218
  500. package/dist/esm/__tests__/libs/dates.spec.d.ts +1 -1
  501. package/dist/esm/__tests__/libs/dates.spec.js +128 -128
  502. package/dist/esm/__tests__/libs/domain.spec.d.ts +1 -1
  503. package/dist/esm/__tests__/libs/domain.spec.js +105 -105
  504. package/dist/esm/__tests__/libs/numbers.spec.d.ts +1 -1
  505. package/dist/esm/__tests__/libs/numbers.spec.js +259 -259
  506. package/dist/esm/__tests__/s3-client/s3-client.spec.d.ts +1 -1
  507. package/dist/esm/__tests__/s3-client/s3-client.spec.js +31 -31
  508. package/dist/esm/__tests__/services/acuity-api-service.spec.d.ts +1 -1
  509. package/dist/esm/__tests__/services/acuity-api-service.spec.js +69 -69
  510. package/dist/esm/__tests__/services/cost/cost-calculation-types.spec.d.ts +1 -1
  511. package/dist/esm/__tests__/services/cost/cost-calculation-types.spec.js +21 -21
  512. package/dist/esm/__tests__/services/cost/cost-calculator-service.spec.d.ts +1 -1
  513. package/dist/esm/__tests__/services/cost/cost-calculator-service.spec.js +3359 -3359
  514. package/dist/esm/__tests__/services/cost/cost-currency-service.spec.d.ts +1 -1
  515. package/dist/esm/__tests__/services/cost/cost-currency-service.spec.js +112 -112
  516. package/dist/esm/__tests__/services/cost/cost-filter-service.spec.d.ts +1 -1
  517. package/dist/esm/__tests__/services/cost/cost-filter-service.spec.js +466 -466
  518. package/dist/esm/__tests__/services/cost/order-cost/order-cost-resolution-service.spec.d.ts +1 -1
  519. package/dist/esm/__tests__/services/cost/order-cost/order-cost-resolution-service.spec.js +358 -358
  520. package/dist/esm/__tests__/services/currency-exchange-rate-lookup-service.spec.d.ts +1 -1
  521. package/dist/esm/__tests__/services/currency-exchange-rate-lookup-service.spec.js +32 -32
  522. package/dist/esm/__tests__/services/email-verification/contact-email-verification-service.spec.d.ts +1 -1
  523. package/dist/esm/__tests__/services/email-verification/contact-email-verification-service.spec.js +91 -91
  524. package/dist/esm/__tests__/services/email-verification/email-verification-service.spec.d.ts +1 -1
  525. package/dist/esm/__tests__/services/email-verification/email-verification-service.spec.js +55 -55
  526. package/dist/esm/__tests__/services/events/collect-queue-tracking-service.spec.d.ts +1 -1
  527. package/dist/esm/__tests__/services/events/collect-queue-tracking-service.spec.js +227 -227
  528. package/dist/esm/__tests__/services/events/tracking-event-sqs-service.spec.d.ts +1 -1
  529. package/dist/esm/__tests__/services/events/tracking-event-sqs-service.spec.js +189 -189
  530. package/dist/esm/__tests__/shopify/shopify-graphql-transformer.spec.d.ts +1 -1
  531. package/dist/esm/__tests__/shopify/shopify-graphql-transformer.spec.js +33 -33
  532. package/dist/esm/__tests__/unit/libs/api-router/public-api-router.spec.d.ts +1 -1
  533. package/dist/esm/__tests__/unit/libs/api-router/public-api-router.spec.js +156 -156
  534. package/dist/esm/__tests__/unit/libs/api-router/route-matcher.spec.d.ts +1 -1
  535. package/dist/esm/__tests__/unit/libs/api-router/route-matcher.spec.js +67 -67
  536. package/dist/esm/__tests__/utils/custom-measure-formula-utils.spec.d.ts +1 -1
  537. package/dist/esm/__tests__/utils/custom-measure-formula-utils.spec.js +144 -144
  538. package/dist/esm/clients/generic/cognito-client.d.ts +23 -23
  539. package/dist/esm/clients/generic/cognito-client.js +204 -204
  540. package/dist/esm/clients/generic/dynamodb-client.d.ts +20 -20
  541. package/dist/esm/clients/generic/dynamodb-client.js +231 -231
  542. package/dist/esm/clients/generic/eventbridge-client.d.ts +14 -14
  543. package/dist/esm/clients/generic/eventbridge-client.js +47 -47
  544. package/dist/esm/clients/generic/http-client.d.ts +14 -14
  545. package/dist/esm/clients/generic/http-client.js +53 -53
  546. package/dist/esm/clients/generic/index.d.ts +13 -13
  547. package/dist/esm/clients/generic/index.js +13 -13
  548. package/dist/esm/clients/generic/lambda-invoke-client.d.ts +10 -10
  549. package/dist/esm/clients/generic/lambda-invoke-client.js +35 -35
  550. package/dist/esm/clients/generic/location-client.d.ts +8 -8
  551. package/dist/esm/clients/generic/location-client.js +27 -27
  552. package/dist/esm/clients/generic/redis-client.d.ts +33 -33
  553. package/dist/esm/clients/generic/redis-client.js +184 -184
  554. package/dist/esm/clients/generic/s3-client.d.ts +23 -23
  555. package/dist/esm/clients/generic/s3-client.js +209 -209
  556. package/dist/esm/clients/generic/singlestore-db-client.d.ts +21 -14
  557. package/dist/esm/clients/generic/singlestore-db-client.js +65 -40
  558. package/dist/esm/clients/generic/singlestore-db-client.js.map +1 -1
  559. package/dist/esm/clients/generic/sqs-bundled-client.d.ts +15 -15
  560. package/dist/esm/clients/generic/sqs-bundled-client.js +307 -307
  561. package/dist/esm/clients/generic/sqs-bundled-client.types.d.ts +53 -53
  562. package/dist/esm/clients/generic/sqs-bundled-client.types.js +14 -14
  563. package/dist/esm/clients/generic/sqs-client.d.ts +53 -53
  564. package/dist/esm/clients/generic/sqs-client.js +281 -281
  565. package/dist/esm/clients/generic/sqs-unbundle.d.ts +32 -32
  566. package/dist/esm/clients/generic/sqs-unbundle.js +137 -137
  567. package/dist/esm/clients/index.d.ts +3 -3
  568. package/dist/esm/clients/index.js +3 -3
  569. package/dist/esm/clients/internal-api/accounts-client.d.ts +91 -91
  570. package/dist/esm/clients/internal-api/accounts-client.js +125 -125
  571. package/dist/esm/clients/internal-api/cache-lambda-client.d.ts +26 -26
  572. package/dist/esm/clients/internal-api/cache-lambda-client.js +85 -85
  573. package/dist/esm/clients/internal-api/db-management-client.d.ts +18 -18
  574. package/dist/esm/clients/internal-api/db-management-client.js +32 -32
  575. package/dist/esm/clients/internal-api/destinations-client.d.ts +34 -34
  576. package/dist/esm/clients/internal-api/destinations-client.js +75 -75
  577. package/dist/esm/clients/internal-api/event-collector-client.d.ts +122 -122
  578. package/dist/esm/clients/internal-api/event-collector-client.js +74 -74
  579. package/dist/esm/clients/internal-api/identity-client.d.ts +41 -41
  580. package/dist/esm/clients/internal-api/identity-client.js +133 -133
  581. package/dist/esm/clients/internal-api/index.d.ts +9 -9
  582. package/dist/esm/clients/internal-api/index.js +9 -9
  583. package/dist/esm/clients/internal-api/shopify-app-install-client.d.ts +37 -37
  584. package/dist/esm/clients/internal-api/shopify-app-install-client.js +77 -77
  585. package/dist/esm/clients/internal-api/subscriptions-client.d.ts +26 -26
  586. package/dist/esm/clients/internal-api/subscriptions-client.js +73 -73
  587. package/dist/esm/clients/internal-api/users-auth-client.d.ts +35 -35
  588. package/dist/esm/clients/internal-api/users-auth-client.js +106 -106
  589. package/dist/esm/clients/third-party/acuity-client.d.ts +10 -10
  590. package/dist/esm/clients/third-party/acuity-client.js +36 -36
  591. package/dist/esm/clients/third-party/emailable-client.d.ts +7 -7
  592. package/dist/esm/clients/third-party/emailable-client.js +21 -21
  593. package/dist/esm/clients/third-party/exchange-rate-api-client.d.ts +17 -17
  594. package/dist/esm/clients/third-party/exchange-rate-api-client.js +15 -15
  595. package/dist/esm/clients/third-party/index.d.ts +6 -6
  596. package/dist/esm/clients/third-party/index.js +6 -6
  597. package/dist/esm/clients/third-party/loops-client.d.ts +10 -10
  598. package/dist/esm/clients/third-party/loops-client.js +26 -26
  599. package/dist/esm/clients/third-party/open-exchange-rates-client.d.ts +8 -8
  600. package/dist/esm/clients/third-party/open-exchange-rates-client.js +23 -23
  601. package/dist/esm/clients/third-party/shopify/graphql-analytics-queries.d.ts +18 -18
  602. package/dist/esm/clients/third-party/shopify/graphql-analytics-queries.js +19 -19
  603. package/dist/esm/clients/third-party/shopify/graphql-order-queries.d.ts +25 -25
  604. package/dist/esm/clients/third-party/shopify/graphql-order-queries.js +1 -1
  605. package/dist/esm/clients/third-party/shopify/graphql-product-queries.d.ts +2 -2
  606. package/dist/esm/clients/third-party/shopify/graphql-product-queries.js +2 -2
  607. package/dist/esm/clients/third-party/shopify/shopify-graphql-client.d.ts +42 -42
  608. package/dist/esm/clients/third-party/shopify/shopify-graphql-client.js +348 -348
  609. package/dist/esm/clients/third-party/shopify-client.d.ts +29 -29
  610. package/dist/esm/clients/third-party/shopify-client.js +142 -142
  611. package/dist/esm/constants/index.d.ts +1 -1
  612. package/dist/esm/constants/index.js +1 -1
  613. package/dist/esm/constants/sqs.d.ts +20 -20
  614. package/dist/esm/constants/sqs.js +22 -22
  615. package/dist/esm/helpers/account-users-helper.d.ts +2 -2
  616. package/dist/esm/helpers/account-users-helper.js +18 -18
  617. package/dist/esm/helpers/acuity-helper.d.ts +4 -4
  618. package/dist/esm/helpers/acuity-helper.js +51 -51
  619. package/dist/esm/helpers/api-key-auth-helper.d.ts +9 -9
  620. package/dist/esm/helpers/api-key-auth-helper.js +35 -35
  621. package/dist/esm/helpers/api-key-authorizer-helper.d.ts +36 -36
  622. package/dist/esm/helpers/api-key-authorizer-helper.js +83 -83
  623. package/dist/esm/helpers/cognito-auth-helper.d.ts +5 -5
  624. package/dist/esm/helpers/cognito-auth-helper.js +10 -10
  625. package/dist/esm/helpers/index.d.ts +12 -12
  626. package/dist/esm/helpers/index.js +12 -12
  627. package/dist/esm/helpers/input-validation-helper.d.ts +3 -3
  628. package/dist/esm/helpers/input-validation-helper.js +18 -18
  629. package/dist/esm/helpers/logging-helper.d.ts +16 -16
  630. package/dist/esm/helpers/logging-helper.js +56 -56
  631. package/dist/esm/helpers/order-calculation-helper.d.ts +13 -13
  632. package/dist/esm/helpers/order-calculation-helper.js +111 -111
  633. package/dist/esm/helpers/public-api-response-helper.d.ts +21 -21
  634. package/dist/esm/helpers/public-api-response-helper.js +38 -38
  635. package/dist/esm/helpers/response-helper.d.ts +18 -18
  636. package/dist/esm/helpers/response-helper.js +37 -37
  637. package/dist/esm/helpers/shopify-helper.d.ts +9 -9
  638. package/dist/esm/helpers/shopify-helper.js +21 -21
  639. package/dist/esm/helpers/sqs-utils.d.ts +6 -6
  640. package/dist/esm/helpers/sqs-utils.js +9 -9
  641. package/dist/esm/index.d.ts +7 -7
  642. package/dist/esm/index.js +7 -7
  643. package/dist/esm/libs/api-router/index.d.ts +2 -2
  644. package/dist/esm/libs/api-router/index.js +2 -2
  645. package/dist/esm/libs/api-router/public-api-router.d.ts +3 -3
  646. package/dist/esm/libs/api-router/public-api-router.js +32 -32
  647. package/dist/esm/libs/api-router/route-matcher.d.ts +21 -21
  648. package/dist/esm/libs/api-router/route-matcher.js +30 -30
  649. package/dist/esm/libs/click-id-parser.d.ts +23 -23
  650. package/dist/esm/libs/click-id-parser.js +45 -45
  651. package/dist/esm/libs/compression.d.ts +2 -2
  652. package/dist/esm/libs/compression.js +25 -25
  653. package/dist/esm/libs/contacts.d.ts +7 -7
  654. package/dist/esm/libs/contacts.js +143 -143
  655. package/dist/esm/libs/cookie.d.ts +17 -17
  656. package/dist/esm/libs/cookie.js +70 -70
  657. package/dist/esm/libs/crypto.d.ts +4 -4
  658. package/dist/esm/libs/crypto.js +15 -15
  659. package/dist/esm/libs/csv.d.ts +2 -2
  660. package/dist/esm/libs/csv.js +30 -30
  661. package/dist/esm/libs/currency.d.ts +1 -1
  662. package/dist/esm/libs/currency.js +22 -22
  663. package/dist/esm/libs/dates.d.ts +12 -12
  664. package/dist/esm/libs/dates.js +83 -83
  665. package/dist/esm/libs/domain.d.ts +2 -2
  666. package/dist/esm/libs/domain.js +33 -33
  667. package/dist/esm/libs/emails.d.ts +8 -8
  668. package/dist/esm/libs/emails.js +146 -146
  669. package/dist/esm/libs/http-error.d.ts +21 -21
  670. package/dist/esm/libs/http-error.js +59 -59
  671. package/dist/esm/libs/http-status-codes.d.ts +58 -58
  672. package/dist/esm/libs/http-status-codes.js +59 -59
  673. package/dist/esm/libs/index.d.ts +19 -19
  674. package/dist/esm/libs/index.js +19 -19
  675. package/dist/esm/libs/numbers.d.ts +1 -1
  676. package/dist/esm/libs/numbers.js +11 -11
  677. package/dist/esm/libs/referrer-parser/index.d.ts +2 -2
  678. package/dist/esm/libs/referrer-parser/index.js +2 -2
  679. package/dist/esm/libs/referrer-parser/referrer-data.d.ts +9 -9
  680. package/dist/esm/libs/referrer-parser/referrer-data.js +3304 -3304
  681. package/dist/esm/libs/referrer-parser/referrer-parser-util.d.ts +20 -20
  682. package/dist/esm/libs/referrer-parser/referrer-parser-util.js +124 -124
  683. package/dist/esm/libs/strings.d.ts +3 -3
  684. package/dist/esm/libs/strings.js +40 -40
  685. package/dist/esm/libs/traits.d.ts +6 -6
  686. package/dist/esm/libs/traits.js +54 -54
  687. package/dist/esm/libs/url.d.ts +1 -1
  688. package/dist/esm/libs/url.js +9 -9
  689. package/dist/esm/services/acuity-api-service.d.ts +9 -9
  690. package/dist/esm/services/acuity-api-service.js +69 -69
  691. package/dist/esm/services/cache/generic-cached-object.d.ts +5 -5
  692. package/dist/esm/services/cache/generic-cached-object.js +1 -1
  693. package/dist/esm/services/cache/index.d.ts +1 -1
  694. package/dist/esm/services/cache/index.js +1 -1
  695. package/dist/esm/services/cache/product-cache-service.d.ts +21 -21
  696. package/dist/esm/services/cache/product-cache-service.js +68 -68
  697. package/dist/esm/services/cost/cost-calculation-types.d.ts +69 -69
  698. package/dist/esm/services/cost/cost-calculation-types.js +15 -15
  699. package/dist/esm/services/cost/cost-calculator-service.d.ts +24 -24
  700. package/dist/esm/services/cost/cost-calculator-service.js +456 -456
  701. package/dist/esm/services/cost/cost-currency-service.d.ts +6 -6
  702. package/dist/esm/services/cost/cost-currency-service.js +84 -84
  703. package/dist/esm/services/cost/cost-filter-service.d.ts +10 -10
  704. package/dist/esm/services/cost/cost-filter-service.js +118 -118
  705. package/dist/esm/services/cost/index.d.ts +5 -5
  706. package/dist/esm/services/cost/index.js +5 -5
  707. package/dist/esm/services/cost/order-cost/index.d.ts +2 -2
  708. package/dist/esm/services/cost/order-cost/index.js +2 -2
  709. package/dist/esm/services/cost/order-cost/order-cost-resolution-service.d.ts +23 -23
  710. package/dist/esm/services/cost/order-cost/order-cost-resolution-service.js +287 -287
  711. package/dist/esm/services/cost/order-cost/order-cost-resolution-types.d.ts +31 -31
  712. package/dist/esm/services/cost/order-cost/order-cost-resolution-types.js +1 -1
  713. package/dist/esm/services/currency-exchange-rate-lookup-service.d.ts +12 -12
  714. package/dist/esm/services/currency-exchange-rate-lookup-service.js +90 -90
  715. package/dist/esm/services/db/accounts-db-service.d.ts +9 -9
  716. package/dist/esm/services/db/accounts-db-service.js +29 -29
  717. package/dist/esm/services/db/api-keys-db-service.d.ts +10 -10
  718. package/dist/esm/services/db/api-keys-db-service.js +32 -32
  719. package/dist/esm/services/db/contact-enrichments-db-service.d.ts +15 -15
  720. package/dist/esm/services/db/contact-enrichments-db-service.js +90 -90
  721. package/dist/esm/services/db/currency-exchange-rates-db-service.d.ts +21 -21
  722. package/dist/esm/services/db/currency-exchange-rates-db-service.js +35 -35
  723. package/dist/esm/services/db/custom-measures-db-service.d.ts +14 -14
  724. package/dist/esm/services/db/custom-measures-db-service.js +44 -44
  725. package/dist/esm/services/db/destinations-db-service.d.ts +13 -13
  726. package/dist/esm/services/db/destinations-db-service.js +70 -70
  727. package/dist/esm/services/db/identity-cache-db-service.d.ts +28 -28
  728. package/dist/esm/services/db/identity-cache-db-service.js +313 -313
  729. package/dist/esm/services/db/identity-cache-dynamodb-service/constants.d.ts +3 -3
  730. package/dist/esm/services/db/identity-cache-dynamodb-service/constants.js +3 -3
  731. package/dist/esm/services/db/identity-cache-dynamodb-service/identity-cache-dynamodb-db-service.d.ts +25 -20
  732. package/dist/esm/services/db/identity-cache-dynamodb-service/identity-cache-dynamodb-db-service.js +503 -358
  733. package/dist/esm/services/db/identity-cache-dynamodb-service/identity-cache-dynamodb-db-service.js.map +1 -1
  734. package/dist/esm/services/db/identity-cache-dynamodb-service/identity-gateway-service.d.ts +23 -23
  735. package/dist/esm/services/db/identity-cache-dynamodb-service/identity-gateway-service.js +218 -218
  736. package/dist/esm/services/db/identity-cache-dynamodb-service/index.d.ts +4 -4
  737. package/dist/esm/services/db/identity-cache-dynamodb-service/index.js +4 -4
  738. package/dist/esm/services/db/identity-cache-dynamodb-service/key-builders.d.ts +12 -12
  739. package/dist/esm/services/db/identity-cache-dynamodb-service/key-builders.js +23 -23
  740. package/dist/esm/services/db/identity-cache-dynamodb-service/types.d.ts +82 -71
  741. package/dist/esm/services/db/identity-cache-dynamodb-service/types.js +25 -25
  742. package/dist/esm/services/db/identity-cache-dynamodb-service/types.js.map +1 -1
  743. package/dist/esm/services/db/index.d.ts +22 -22
  744. package/dist/esm/services/db/index.js +22 -22
  745. package/dist/esm/services/db/log-events-db-service.d.ts +11 -11
  746. package/dist/esm/services/db/log-events-db-service.js +177 -177
  747. package/dist/esm/services/db/pixels-db-service.d.ts +8 -8
  748. package/dist/esm/services/db/pixels-db-service.js +31 -31
  749. package/dist/esm/services/db/products-db-service-types.d.ts +10 -10
  750. package/dist/esm/services/db/products-db-service-types.js +1 -1
  751. package/dist/esm/services/db/products-db-service.d.ts +19 -19
  752. package/dist/esm/services/db/products-db-service.js +277 -277
  753. package/dist/esm/services/db/purchasable-contacts-db-service.d.ts +9 -9
  754. package/dist/esm/services/db/purchasable-contacts-db-service.js +39 -39
  755. package/dist/esm/services/db/purchased-contacts/index.d.ts +2 -2
  756. package/dist/esm/services/db/purchased-contacts/index.js +2 -2
  757. package/dist/esm/services/db/purchased-contacts/purchased-contacts-db-service.d.ts +18 -18
  758. package/dist/esm/services/db/purchased-contacts/purchased-contacts-db-service.js +148 -148
  759. package/dist/esm/services/db/purchased-contacts/types.d.ts +11 -11
  760. package/dist/esm/services/db/purchased-contacts/types.js +1 -1
  761. package/dist/esm/services/db/shopify-app-installs-db-service.d.ts +10 -10
  762. package/dist/esm/services/db/shopify-app-installs-db-service.js +48 -48
  763. package/dist/esm/services/db/shopify-products-cache-db-service.d.ts +16 -16
  764. package/dist/esm/services/db/shopify-products-cache-db-service.js +66 -66
  765. package/dist/esm/services/db/subscriptions-db-service.d.ts +11 -11
  766. package/dist/esm/services/db/subscriptions-db-service.js +34 -34
  767. package/dist/esm/services/db/tracking-events-db-service.d.ts +21 -21
  768. package/dist/esm/services/db/tracking-events-db-service.js +184 -184
  769. package/dist/esm/services/db/user-accounts-db-service.d.ts +7 -7
  770. package/dist/esm/services/db/user-accounts-db-service.js +13 -13
  771. package/dist/esm/services/email-verification/contact-email-verification-service.d.ts +7 -7
  772. package/dist/esm/services/email-verification/contact-email-verification-service.js +97 -97
  773. package/dist/esm/services/email-verification/email-verification-service.d.ts +19 -19
  774. package/dist/esm/services/email-verification/email-verification-service.js +127 -127
  775. package/dist/esm/services/email-verification/index.d.ts +2 -2
  776. package/dist/esm/services/email-verification/index.js +2 -2
  777. package/dist/esm/services/eventbridge-integration-service.d.ts +9 -9
  778. package/dist/esm/services/eventbridge-integration-service.js +24 -24
  779. package/dist/esm/services/events/build-collect-queue-tracking-event.d.ts +11 -11
  780. package/dist/esm/services/events/build-collect-queue-tracking-event.js +19 -19
  781. package/dist/esm/services/events/collect-queue-tracking-service.d.ts +12 -12
  782. package/dist/esm/services/events/collect-queue-tracking-service.js +18 -18
  783. package/dist/esm/services/events/index.d.ts +5 -5
  784. package/dist/esm/services/events/index.js +5 -5
  785. package/dist/esm/services/events/log-event-service.d.ts +19 -19
  786. package/dist/esm/services/events/log-event-service.js +73 -73
  787. package/dist/esm/services/events/metric-event-service.d.ts +9 -9
  788. package/dist/esm/services/events/metric-event-service.js +45 -45
  789. package/dist/esm/services/events/tracking-event-sqs-service.d.ts +8 -8
  790. package/dist/esm/services/events/tracking-event-sqs-service.js +32 -32
  791. package/dist/esm/services/generic-cache-service.d.ts +7 -7
  792. package/dist/esm/services/generic-cache-service.js +29 -29
  793. package/dist/esm/services/index.d.ts +11 -11
  794. package/dist/esm/services/index.js +11 -11
  795. package/dist/esm/services/ipdata-lookup-service.d.ts +20 -20
  796. package/dist/esm/services/ipdata-lookup-service.js +108 -108
  797. package/dist/esm/services/shopify/index.d.ts +2 -2
  798. package/dist/esm/services/shopify/index.js +2 -2
  799. package/dist/esm/services/shopify/products/index.d.ts +1 -1
  800. package/dist/esm/services/shopify/products/index.js +1 -1
  801. package/dist/esm/services/shopify/products/shopify-products-serviceV2.d.ts +17 -17
  802. package/dist/esm/services/shopify/products/shopify-products-serviceV2.js +108 -108
  803. package/dist/esm/services/shopify/shopify-graphql-transformer.d.ts +8 -8
  804. package/dist/esm/services/shopify/shopify-graphql-transformer.js +138 -138
  805. package/dist/esm/types/acuity-types.d.ts +74 -74
  806. package/dist/esm/types/acuity-types.js +1 -1
  807. package/dist/esm/types/api-response.d.ts +6 -6
  808. package/dist/esm/types/api-response.js +1 -1
  809. package/dist/esm/types/index.d.ts +6 -6
  810. package/dist/esm/types/index.js +6 -6
  811. package/dist/esm/types/internal-events/event-detail-types.d.ts +20 -20
  812. package/dist/esm/types/internal-events/event-detail-types.js +24 -24
  813. package/dist/esm/types/internal-events/index.d.ts +1 -1
  814. package/dist/esm/types/internal-events/index.js +1 -1
  815. package/dist/esm/types/open-exchange-rates-types.d.ts +10 -10
  816. package/dist/esm/types/open-exchange-rates-types.js +1 -1
  817. package/dist/esm/types/public-api-types.d.ts +24 -24
  818. package/dist/esm/types/public-api-types.js +10 -10
  819. package/dist/esm/types/shopify-graphql-types/admin.generated.d.ts +123 -123
  820. package/dist/esm/types/shopify-graphql-types/admin.generated.js +1 -1
  821. package/dist/esm/types/shopify-graphql-types/admin.types.d.ts +26289 -26289
  822. package/dist/esm/types/shopify-graphql-types/admin.types.js +5299 -5299
  823. package/dist/esm/types/shopify-graphql-types/index.d.ts +2 -2
  824. package/dist/esm/types/shopify-graphql-types/index.js +2 -2
  825. package/dist/esm/types/shopify-rest-types.d.ts +767 -767
  826. package/dist/esm/types/shopify-rest-types.js +1 -1
  827. package/dist/esm/utils/compression.d.ts +36 -36
  828. package/dist/esm/utils/compression.js +187 -187
  829. package/dist/esm/utils/custom-measure-formula-utils.d.ts +6 -6
  830. package/dist/esm/utils/custom-measure-formula-utils.js +201 -201
  831. package/dist/esm/utils/index.d.ts +4 -4
  832. package/dist/esm/utils/index.js +4 -4
  833. package/dist/esm/utils/retry-envelope.d.ts +12 -12
  834. package/dist/esm/utils/retry-envelope.js +22 -22
  835. package/dist/esm/utils/size.d.ts +2 -2
  836. package/dist/esm/utils/size.js +44 -44
  837. package/package.json +136 -136
@@ -1,556 +1,728 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- jest.mock('../../clients/index.js', () => ({
4
- DynamoDbClient: {
5
- safeGet: jest.fn(),
6
- safePut: jest.fn(),
7
- safeDelete: jest.fn(),
8
- safeBatchGet: jest.fn(),
9
- safeBatchWrite: jest.fn(),
10
- safeQueryByGSI: jest.fn(),
11
- batchWrite: jest.fn(),
12
- },
13
- }));
14
- jest.mock('../../helpers/index.js', () => ({
15
- Logger: {
16
- debug: jest.fn(),
17
- info: jest.fn(),
18
- warn: jest.fn(),
19
- error: jest.fn(),
20
- },
21
- }));
22
- const identity_cache_dynamodb_db_service_js_1 = require("../../services/db/identity-cache-dynamodb-service/identity-cache-dynamodb-db-service.js");
23
- const index_js_1 = require("../../clients/index.js");
24
- const index_js_2 = require("../../helpers/index.js");
25
- const mockedDynamoDbClient = index_js_1.DynamoDbClient;
26
- const mockedLogger = index_js_2.Logger;
27
- describe('IdentityCacheDynamoDbDbService.getIdentityFromCachePure()', () => {
28
- const pixelId = 'pixel-test-123';
29
- beforeEach(() => {
30
- jest.clearAllMocks();
31
- mockedDynamoDbClient.safeGet.mockReset();
32
- mockedDynamoDbClient.safePut.mockReset();
33
- mockedDynamoDbClient.safeBatchWrite.mockReset();
34
- });
35
- describe('cache hit by identity ID', () => {
36
- it('should return cachedIdentity with lookupPath=identity_id and cacheHit=true', async () => {
37
- const incomingIdentity = {
38
- identityId: 'identity-123',
39
- traits: { emails: ['test@email.com'] },
40
- };
41
- const cachedRecord = {
42
- pk: `identity#${pixelId}#identity-123`,
43
- pixelId,
44
- identityId: 'identity-123',
45
- response: {
46
- identityId: 'identity-123',
47
- traits: {
48
- emails: ['test@email.com', 'cached@email.com'],
49
- phones: ['555-1234'],
50
- },
51
- },
52
- updatedAt: new Date().toISOString(),
53
- };
54
- mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedRecord);
55
- const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
56
- expect(result.cacheHit).toBe(true);
57
- expect(result.lookupPath).toBe('identity_id');
58
- expect(result.cachedIdentity).toEqual(cachedRecord.response);
59
- expect(result.discoveredIdentityId).toBeUndefined();
60
- expect(mockedDynamoDbClient.safeGet).toHaveBeenCalledTimes(1);
61
- expect(mockedDynamoDbClient.safeGet).toHaveBeenCalledWith(expect.any(String), 'pk', `identity#${pixelId}#identity-123`);
62
- });
63
- it('should return cachedIdentity with all traits preserved', async () => {
64
- const incomingIdentity = {
65
- identityId: 'full-traits-id',
66
- traits: { emails: ['new@email.com'] },
67
- };
68
- const fullCachedIdentity = {
69
- identityId: 'full-traits-id',
70
- traits: {
71
- emails: ['existing@email.com', 'another@email.com'],
72
- phones: ['555-1111', '555-2222'],
73
- addresses: [{ city: 'New York', zip: '10001' }],
74
- userIds: ['user-1', 'user-2'],
75
- shopifyYIds: ['shopify-y-1'],
76
- click: { fbp: 'fb.1.123.456' },
77
- ipAddress: '192.168.1.1',
78
- userAgent: 'Mozilla/5.0...',
79
- },
80
- };
81
- const cachedRecord = {
82
- pk: `identity#${pixelId}#full-traits-id`,
83
- pixelId,
84
- identityId: 'full-traits-id',
85
- response: fullCachedIdentity,
86
- updatedAt: new Date().toISOString(),
87
- };
88
- mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedRecord);
89
- const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
90
- expect(result.cacheHit).toBe(true);
91
- expect(result.cachedIdentity).toEqual(fullCachedIdentity);
92
- expect(result.cachedIdentity?.traits?.emails).toHaveLength(2);
93
- expect(result.cachedIdentity?.traits?.phones).toHaveLength(2);
94
- expect(result.cachedIdentity?.traits?.addresses).toHaveLength(1);
95
- });
96
- it('should NOT perform any merge logic', async () => {
97
- const incomingIdentity = {
98
- identityId: 'merge-test-id',
99
- traits: {
100
- emails: ['new-email@test.com'],
101
- phones: ['999-0000'],
102
- },
103
- };
104
- const cachedRecord = {
105
- pk: `identity#${pixelId}#merge-test-id`,
106
- pixelId,
107
- identityId: 'merge-test-id',
108
- response: {
109
- identityId: 'merge-test-id',
110
- traits: {
111
- emails: ['old-email@test.com'],
112
- phones: ['111-2222'],
113
- },
114
- },
115
- updatedAt: new Date().toISOString(),
116
- };
117
- mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedRecord);
118
- const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
119
- expect(result.cachedIdentity?.traits?.emails).toEqual(['old-email@test.com']);
120
- expect(result.cachedIdentity?.traits?.phones).toEqual(['111-2222']);
121
- expect(result.cachedIdentity?.traits?.emails).not.toContain('new-email@test.com');
122
- });
123
- it('should NOT perform staleness computation', async () => {
124
- const incomingIdentity = {
125
- identityId: 'stale-test-id',
126
- traits: {
127
- emails: ['new-email@test.com'],
128
- },
129
- };
130
- const cachedRecord = {
131
- pk: `identity#${pixelId}#stale-test-id`,
132
- pixelId,
133
- identityId: 'stale-test-id',
134
- response: {
135
- identityId: 'stale-test-id',
136
- traits: {
137
- emails: ['old-email@test.com'],
138
- },
139
- },
140
- updatedAt: new Date().toISOString(),
141
- };
142
- mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedRecord);
143
- const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
144
- expect(result).not.toHaveProperty('isCacheStale');
145
- expect(result).not.toHaveProperty('staleTier');
146
- expect(result).not.toHaveProperty('staleTracker');
147
- expect(result).not.toHaveProperty('writeReason');
148
- expect(result).not.toHaveProperty('skipNeptune');
149
- });
150
- });
151
- describe('cache hit by email pointer', () => {
152
- it('should return discoveredIdentityId with lookupPath=email_pointer and cacheHit=true', async () => {
153
- const incomingIdentity = {
154
- traits: { emails: ['lookup@email.com'] },
155
- };
156
- const emailPointerRecord = {
157
- pk: `email#${pixelId}#lookup@email.com`,
158
- pixelId,
159
- identityId: 'discovered-identity-456',
160
- updatedAt: new Date().toISOString(),
161
- };
162
- mockedDynamoDbClient.safeGet.mockResolvedValueOnce(emailPointerRecord);
163
- const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
164
- expect(result.cacheHit).toBe(true);
165
- expect(result.lookupPath).toBe('email_pointer');
166
- expect(result.discoveredIdentityId).toBe('discovered-identity-456');
167
- expect(result.cachedIdentity).toBeUndefined();
168
- });
169
- it('should use first email in emails array for lookup', async () => {
170
- const incomingIdentity = {
171
- traits: { emails: ['first@email.com', 'second@email.com'] },
172
- };
173
- const emailPointerRecord = {
174
- pk: `email#${pixelId}#first@email.com`,
175
- pixelId,
176
- identityId: 'pointer-identity-789',
177
- updatedAt: new Date().toISOString(),
178
- };
179
- mockedDynamoDbClient.safeGet.mockResolvedValueOnce(emailPointerRecord);
180
- const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
181
- expect(result.discoveredIdentityId).toBe('pointer-identity-789');
182
- expect(mockedDynamoDbClient.safeGet).toHaveBeenCalledWith(expect.any(String), 'pk', `email#${pixelId}#first@email.com`);
183
- });
184
- it('should NOT merge traits when returning email pointer discovery', async () => {
185
- const incomingIdentity = {
186
- traits: {
187
- emails: ['discovery@email.com'],
188
- phones: ['incoming-phone'],
189
- },
190
- };
191
- const emailPointerRecord = {
192
- pk: `email#${pixelId}#discovery@email.com`,
193
- pixelId,
194
- identityId: 'discovered-id',
195
- updatedAt: new Date().toISOString(),
196
- };
197
- mockedDynamoDbClient.safeGet.mockResolvedValueOnce(emailPointerRecord);
198
- const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
199
- expect(result.cachedIdentity).toBeUndefined();
200
- expect(result.discoveredIdentityId).toBe('discovered-id');
201
- });
202
- });
203
- describe('cache miss', () => {
204
- it('should return lookupPath=miss and cacheHit=false when identity not found', async () => {
205
- const incomingIdentity = {
206
- identityId: 'nonexistent-identity',
207
- traits: { emails: ['test@email.com'] },
208
- };
209
- mockedDynamoDbClient.safeGet.mockResolvedValueOnce(null);
210
- const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
211
- expect(result.cacheHit).toBe(false);
212
- expect(result.lookupPath).toBe('identity_id');
213
- expect(result.cachedIdentity).toBeUndefined();
214
- expect(result.discoveredIdentityId).toBeUndefined();
215
- });
216
- it('should return lookupPath=miss and cacheHit=false when email pointer not found', async () => {
217
- const incomingIdentity = {
218
- traits: { emails: ['unknown@email.com'] },
219
- };
220
- mockedDynamoDbClient.safeGet.mockResolvedValueOnce(null);
221
- const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
222
- expect(result.cacheHit).toBe(false);
223
- expect(result.lookupPath).toBe('miss');
224
- expect(result.cachedIdentity).toBeUndefined();
225
- expect(result.discoveredIdentityId).toBeUndefined();
226
- });
227
- it('should return lookupPath=miss when cached record has no response field', async () => {
228
- const incomingIdentity = {
229
- identityId: 'no-response-identity',
230
- traits: { emails: ['test@email.com'] },
231
- };
232
- const incompleteRecord = {
233
- pk: `identity#${pixelId}#no-response-identity`,
234
- pixelId,
235
- identityId: 'no-response-identity',
236
- updatedAt: new Date().toISOString(),
237
- };
238
- mockedDynamoDbClient.safeGet.mockResolvedValueOnce(incompleteRecord);
239
- const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
240
- expect(result.cacheHit).toBe(false);
241
- expect(result.lookupPath).toBe('identity_id');
242
- expect(result.cachedIdentity).toBeUndefined();
243
- });
244
- it('should return lookupPath=miss when no email provided for pointer lookup', async () => {
245
- const incomingIdentity = {
246
- traits: { phones: ['555-1234'] },
247
- };
248
- const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
249
- expect(result.cacheHit).toBe(false);
250
- expect(result.lookupPath).toBe('miss');
251
- expect(mockedDynamoDbClient.safeGet).not.toHaveBeenCalled();
252
- });
253
- });
254
- describe('invalid input handling', () => {
255
- it('should return cache miss for undefined pixelId', async () => {
256
- const incomingIdentity = {
257
- identityId: 'test-identity',
258
- traits: { emails: ['test@email.com'] },
259
- };
260
- const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(undefined, incomingIdentity);
261
- expect(result.cacheHit).toBe(false);
262
- expect(result.lookupPath).toBe('miss');
263
- expect(mockedDynamoDbClient.safeGet).not.toHaveBeenCalled();
264
- });
265
- it('should return cache miss for empty pixelId', async () => {
266
- const incomingIdentity = {
267
- identityId: 'test-identity',
268
- traits: { emails: ['test@email.com'] },
269
- };
270
- const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure('', incomingIdentity);
271
- expect(result.cacheHit).toBe(false);
272
- expect(result.lookupPath).toBe('miss');
273
- });
274
- it('should return cache miss for undefined incomingIdentity', async () => {
275
- const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, undefined);
276
- expect(result.cacheHit).toBe(false);
277
- expect(result.lookupPath).toBe('miss');
278
- });
279
- it('should return cache miss for null incomingIdentity', async () => {
280
- const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, null);
281
- expect(result.cacheHit).toBe(false);
282
- expect(result.lookupPath).toBe('miss');
283
- });
284
- });
285
- describe('error handling', () => {
286
- it('should return cache miss when DynamoDB throws an error', async () => {
287
- const incomingIdentity = {
288
- identityId: 'error-test-identity',
289
- traits: { emails: ['test@email.com'] },
290
- };
291
- mockedDynamoDbClient.safeGet.mockRejectedValueOnce(new Error('DynamoDB connection failed'));
292
- const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
293
- expect(result.cacheHit).toBe(false);
294
- expect(result.lookupPath).toBe('identity_id');
295
- expect(result.cachedIdentity).toBeUndefined();
296
- expect(mockedLogger.error).toHaveBeenCalledWith('IdentityCache - getItemByPk failed', expect.objectContaining({
297
- error: expect.any(Error),
298
- errorMessage: 'DynamoDB connection failed',
299
- }));
300
- });
301
- it('should handle non-Error thrown values', async () => {
302
- const incomingIdentity = {
303
- identityId: 'string-error-identity',
304
- traits: { emails: ['test@email.com'] },
305
- };
306
- mockedDynamoDbClient.safeGet.mockRejectedValueOnce('String error message');
307
- const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
308
- expect(result.cacheHit).toBe(false);
309
- expect(result.lookupPath).toBe('identity_id');
310
- expect(mockedLogger.error).toHaveBeenCalledWith('IdentityCache - getItemByPk failed', expect.objectContaining({
311
- errorMessage: 'String error message',
312
- }));
313
- });
314
- });
315
- describe('verification: no merge or staleness logic', () => {
316
- it('should not call mergeIdentityTraits', async () => {
317
- const incomingIdentity = {
318
- identityId: 'verify-no-merge',
319
- traits: { emails: ['incoming@email.com'] },
320
- };
321
- const cachedRecord = {
322
- pk: `identity#${pixelId}#verify-no-merge`,
323
- pixelId,
324
- identityId: 'verify-no-merge',
325
- response: {
326
- identityId: 'verify-no-merge',
327
- traits: { emails: ['cached@email.com'] },
328
- },
329
- updatedAt: new Date().toISOString(),
330
- };
331
- mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedRecord);
332
- const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
333
- expect(result.cachedIdentity).toBe(cachedRecord.response);
334
- expect(result.cachedIdentity?.traits?.emails).toEqual(['cached@email.com']);
335
- });
336
- it('should not call isIdentityCacheStale', async () => {
337
- const incomingIdentity = {
338
- identityId: 'verify-no-staleness',
339
- traits: {
340
- emails: ['new-email@test.com'],
341
- },
342
- };
343
- const cachedRecord = {
344
- pk: `identity#${pixelId}#verify-no-staleness`,
345
- pixelId,
346
- identityId: 'verify-no-staleness',
347
- response: {
348
- identityId: 'verify-no-staleness',
349
- traits: { emails: ['old-email@test.com'] },
350
- },
351
- updatedAt: new Date().toISOString(),
352
- };
353
- mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedRecord);
354
- const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
355
- expect(Object.keys(result)).toEqual(['cachedIdentity', 'lookupPath', 'cacheHit']);
356
- });
357
- it('result should only contain pure lookup properties', async () => {
358
- const incomingIdentity = {
359
- identityId: 'result-shape-test',
360
- traits: { emails: ['test@email.com'] },
361
- };
362
- const cachedRecord = {
363
- pk: `identity#${pixelId}#result-shape-test`,
364
- pixelId,
365
- identityId: 'result-shape-test',
366
- response: {
367
- identityId: 'result-shape-test',
368
- traits: { emails: ['test@email.com'] },
369
- },
370
- updatedAt: new Date().toISOString(),
371
- };
372
- mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedRecord);
373
- const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
374
- expect(result).toEqual({
375
- cachedIdentity: cachedRecord.response,
376
- lookupPath: 'identity_id',
377
- cacheHit: true,
378
- });
379
- expect(result).not.toHaveProperty('resolvedIdentity');
380
- expect(result).not.toHaveProperty('isCacheStale');
381
- expect(result).not.toHaveProperty('staleTracker');
382
- expect(result).not.toHaveProperty('staleTier');
383
- expect(result).not.toHaveProperty('writeReason');
384
- expect(result).not.toHaveProperty('skipNeptune');
385
- expect(result).not.toHaveProperty('mergedIdentity');
386
- });
387
- });
388
- describe('logging', () => {
389
- it('should log debug on cache hit by identity ID', async () => {
390
- const incomingIdentity = {
391
- identityId: 'log-test-id',
392
- traits: { emails: ['test@email.com'] },
393
- };
394
- const cachedRecord = {
395
- pk: `identity#${pixelId}#log-test-id`,
396
- pixelId,
397
- identityId: 'log-test-id',
398
- response: {
399
- identityId: 'log-test-id',
400
- traits: { emails: ['test@email.com'] },
401
- },
402
- updatedAt: new Date().toISOString(),
403
- };
404
- mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedRecord);
405
- await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
406
- expect(mockedLogger.debug).toHaveBeenCalledWith('IdentityCache - pure lookup hit', expect.objectContaining({
407
- pixelId,
408
- identityId: 'log-test-id',
409
- }));
410
- });
411
- it('should log debug on cache miss', async () => {
412
- const incomingIdentity = {
413
- identityId: 'miss-log-test',
414
- traits: { emails: ['test@email.com'] },
415
- };
416
- mockedDynamoDbClient.safeGet.mockResolvedValueOnce(null);
417
- await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
418
- expect(mockedLogger.debug).toHaveBeenCalledWith('IdentityCache - pure lookup miss', expect.objectContaining({
419
- pixelId,
420
- identityId: 'miss-log-test',
421
- }));
422
- });
423
- it('should log debug on email pointer discovery', async () => {
424
- const incomingIdentity = {
425
- traits: { emails: ['email-pointer@test.com'] },
426
- };
427
- const emailPointerRecord = {
428
- pk: `email#${pixelId}#email-pointer@test.com`,
429
- pixelId,
430
- identityId: 'discovered-from-pointer',
431
- updatedAt: new Date().toISOString(),
432
- };
433
- mockedDynamoDbClient.safeGet.mockResolvedValueOnce(emailPointerRecord);
434
- await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
435
- expect(mockedLogger.debug).toHaveBeenCalledWith('IdentityCache - pure email pointer discovery', expect.objectContaining({
436
- pixelId,
437
- discoveredIdentityId: 'discovered-from-pointer',
438
- }));
439
- });
440
- });
441
- });
442
- describe('mergeAndComputeIdentityStaleness (pure function)', () => {
443
- const { mergeAndComputeIdentityStaleness, IDENTITY_CACHE_STALENESS_TIER } = jest.requireActual('@adtrackify/at-shared-utils');
444
- describe('merge behavior', () => {
445
- it('should merge incoming traits with cached traits', () => {
446
- const incomingIdentity = {
447
- identityId: 'merge-test',
448
- traits: {
449
- emails: ['new@email.com'],
450
- },
451
- };
452
- const cachedIdentity = {
453
- identityId: 'merge-test',
454
- traits: {
455
- emails: ['cached@email.com'],
456
- phones: ['555-1234'],
457
- },
458
- };
459
- const result = mergeAndComputeIdentityStaleness(incomingIdentity, cachedIdentity);
460
- expect(result.mergedIdentity.traits?.emails).toContain('new@email.com');
461
- expect(result.mergedIdentity.traits?.emails).toContain('cached@email.com');
462
- expect(result.mergedIdentity.traits?.phones).toContain('555-1234');
463
- });
464
- });
465
- describe('staleness tier computation', () => {
466
- it('should return NONE tier when no traits are stale', () => {
467
- const incomingIdentity = {
468
- identityId: 'same-test',
469
- traits: { emails: ['same@email.com'] },
470
- };
471
- const cachedIdentity = {
472
- identityId: 'same-test',
473
- traits: { emails: ['same@email.com'] },
474
- };
475
- const result = mergeAndComputeIdentityStaleness(incomingIdentity, cachedIdentity);
476
- expect(result.staleTier).toBe(IDENTITY_CACHE_STALENESS_TIER.NONE);
477
- expect(result.isCacheStale).toBe(false);
478
- });
479
- it('should return VOLATILE_ONLY tier when incoming has new IP address (cached has none)', () => {
480
- const incomingIdentity = {
481
- identityId: 'volatile-test',
482
- traits: {
483
- emails: ['same@email.com'],
484
- ipAddress: '192.168.1.100',
485
- },
486
- };
487
- const cachedIdentity = {
488
- identityId: 'volatile-test',
489
- traits: {
490
- emails: ['same@email.com'],
491
- },
492
- };
493
- const result = mergeAndComputeIdentityStaleness(incomingIdentity, cachedIdentity);
494
- expect(result.staleTier).toBe(IDENTITY_CACHE_STALENESS_TIER.VOLATILE_ONLY);
495
- expect(result.isCacheStale).toBe(false);
496
- });
497
- it('should return ADDRESS_UPDATE tier when non-IP address is new', () => {
498
- const incomingIdentity = {
499
- identityId: 'address-test',
500
- traits: {
501
- emails: ['same@email.com'],
502
- addresses: [{ firstName: 'John', city: 'New York' }],
503
- },
504
- };
505
- const cachedIdentity = {
506
- identityId: 'address-test',
507
- traits: {
508
- emails: ['same@email.com'],
509
- addresses: [],
510
- },
511
- };
512
- const result = mergeAndComputeIdentityStaleness(incomingIdentity, cachedIdentity);
513
- expect(result.staleTier).toBe(IDENTITY_CACHE_STALENESS_TIER.ADDRESS_UPDATE);
514
- expect(result.isCacheStale).toBe(true);
515
- });
516
- it('should return IDENTITY_STALE tier when email changes', () => {
517
- const incomingIdentity = {
518
- identityId: 'stale-test',
519
- traits: {
520
- emails: ['new@email.com'],
521
- },
522
- };
523
- const cachedIdentity = {
524
- identityId: 'stale-test',
525
- traits: {
526
- emails: ['old@email.com'],
527
- },
528
- };
529
- const result = mergeAndComputeIdentityStaleness(incomingIdentity, cachedIdentity);
530
- expect(result.staleTier).toBe(IDENTITY_CACHE_STALENESS_TIER.IDENTITY_STALE);
531
- expect(result.isCacheStale).toBe(true);
532
- });
533
- });
534
- describe('staleTraits extraction', () => {
535
- it('should include changed trait names in staleTraits array', () => {
536
- const incomingIdentity = {
537
- identityId: 'traits-test',
538
- traits: {
539
- emails: ['new@email.com'],
540
- phones: ['999-0000'],
541
- },
542
- };
543
- const cachedIdentity = {
544
- identityId: 'traits-test',
545
- traits: {
546
- emails: ['old@email.com'],
547
- phones: ['111-2222'],
548
- },
549
- };
550
- const result = mergeAndComputeIdentityStaleness(incomingIdentity, cachedIdentity);
551
- expect(result.staleTraits).toContain('emails');
552
- expect(result.staleTraits).toContain('phones');
553
- });
554
- });
555
- });
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ jest.mock('../../clients/index.js', () => ({
4
+ DynamoDbClient: {
5
+ safeGet: jest.fn(),
6
+ safePut: jest.fn(),
7
+ safeDelete: jest.fn(),
8
+ safeBatchGet: jest.fn(),
9
+ safeBatchWrite: jest.fn(),
10
+ safeQueryByGSI: jest.fn(),
11
+ batchGet: jest.fn(),
12
+ batchWrite: jest.fn(),
13
+ },
14
+ }));
15
+ jest.mock('../../helpers/index.js', () => ({
16
+ Logger: {
17
+ debug: jest.fn(),
18
+ info: jest.fn(),
19
+ warn: jest.fn(),
20
+ error: jest.fn(),
21
+ },
22
+ }));
23
+ const identity_cache_dynamodb_db_service_js_1 = require("../../services/db/identity-cache-dynamodb-service/identity-cache-dynamodb-db-service.js");
24
+ const index_js_1 = require("../../clients/index.js");
25
+ const index_js_2 = require("../../helpers/index.js");
26
+ const constants_js_1 = require("../../services/db/identity-cache-dynamodb-service/constants.js");
27
+ const mockedDynamoDbClient = index_js_1.DynamoDbClient;
28
+ const mockedLogger = index_js_2.Logger;
29
+ describe('IdentityCacheDynamoDbDbService.getIdentityFromCachePure()', () => {
30
+ const pixelId = 'pixel-test-123';
31
+ beforeEach(() => {
32
+ jest.clearAllMocks();
33
+ mockedDynamoDbClient.safeGet.mockReset();
34
+ mockedDynamoDbClient.safePut.mockReset();
35
+ mockedDynamoDbClient.safeBatchWrite.mockReset();
36
+ mockedDynamoDbClient.batchGet.mockReset();
37
+ mockedDynamoDbClient.batchWrite.mockReset();
38
+ });
39
+ describe('cache hit by identity ID', () => {
40
+ it('should return cachedIdentity with lookupPath=identity_id and cacheHit=true', async () => {
41
+ const incomingIdentity = {
42
+ identityId: 'identity-123',
43
+ traits: { emails: ['test@email.com'] },
44
+ };
45
+ const cachedRecord = {
46
+ pk: `identity#${pixelId}#identity-123`,
47
+ pixelId,
48
+ identityId: 'identity-123',
49
+ response: {
50
+ identityId: 'identity-123',
51
+ traits: {
52
+ emails: ['test@email.com', 'cached@email.com'],
53
+ phones: ['555-1234'],
54
+ },
55
+ },
56
+ updatedAt: new Date().toISOString(),
57
+ };
58
+ mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedRecord);
59
+ const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
60
+ expect(result.cacheHit).toBe(true);
61
+ expect(result.lookupPath).toBe('identity_id');
62
+ expect(result.cachedIdentity).toEqual(cachedRecord.response);
63
+ expect(result.discoveredIdentityId).toBeUndefined();
64
+ expect(mockedDynamoDbClient.safeGet).toHaveBeenCalledTimes(1);
65
+ expect(mockedDynamoDbClient.safeGet).toHaveBeenCalledWith(expect.any(String), 'pk', `identity#${pixelId}#identity-123`);
66
+ });
67
+ it('should return cachedIdentity with all traits preserved', async () => {
68
+ const incomingIdentity = {
69
+ identityId: 'full-traits-id',
70
+ traits: { emails: ['new@email.com'] },
71
+ };
72
+ const fullCachedIdentity = {
73
+ identityId: 'full-traits-id',
74
+ traits: {
75
+ emails: ['existing@email.com', 'another@email.com'],
76
+ phones: ['555-1111', '555-2222'],
77
+ addresses: [{ city: 'New York', zip: '10001' }],
78
+ userIds: ['user-1', 'user-2'],
79
+ shopifyYIds: ['shopify-y-1'],
80
+ click: { fbp: 'fb.1.123.456' },
81
+ ipAddress: '192.168.1.1',
82
+ userAgent: 'Mozilla/5.0...',
83
+ },
84
+ };
85
+ const cachedRecord = {
86
+ pk: `identity#${pixelId}#full-traits-id`,
87
+ pixelId,
88
+ identityId: 'full-traits-id',
89
+ response: fullCachedIdentity,
90
+ updatedAt: new Date().toISOString(),
91
+ };
92
+ mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedRecord);
93
+ const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
94
+ expect(result.cacheHit).toBe(true);
95
+ expect(result.cachedIdentity).toEqual(fullCachedIdentity);
96
+ expect(result.cachedIdentity?.traits?.emails).toHaveLength(2);
97
+ expect(result.cachedIdentity?.traits?.phones).toHaveLength(2);
98
+ expect(result.cachedIdentity?.traits?.addresses).toHaveLength(1);
99
+ });
100
+ it('should NOT perform any merge logic', async () => {
101
+ const incomingIdentity = {
102
+ identityId: 'merge-test-id',
103
+ traits: {
104
+ emails: ['new-email@test.com'],
105
+ phones: ['999-0000'],
106
+ },
107
+ };
108
+ const cachedRecord = {
109
+ pk: `identity#${pixelId}#merge-test-id`,
110
+ pixelId,
111
+ identityId: 'merge-test-id',
112
+ response: {
113
+ identityId: 'merge-test-id',
114
+ traits: {
115
+ emails: ['old-email@test.com'],
116
+ phones: ['111-2222'],
117
+ },
118
+ },
119
+ updatedAt: new Date().toISOString(),
120
+ };
121
+ mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedRecord);
122
+ const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
123
+ expect(result.cachedIdentity?.traits?.emails).toEqual(['old-email@test.com']);
124
+ expect(result.cachedIdentity?.traits?.phones).toEqual(['111-2222']);
125
+ expect(result.cachedIdentity?.traits?.emails).not.toContain('new-email@test.com');
126
+ });
127
+ it('should NOT perform staleness computation', async () => {
128
+ const incomingIdentity = {
129
+ identityId: 'stale-test-id',
130
+ traits: {
131
+ emails: ['new-email@test.com'],
132
+ },
133
+ };
134
+ const cachedRecord = {
135
+ pk: `identity#${pixelId}#stale-test-id`,
136
+ pixelId,
137
+ identityId: 'stale-test-id',
138
+ response: {
139
+ identityId: 'stale-test-id',
140
+ traits: {
141
+ emails: ['old-email@test.com'],
142
+ },
143
+ },
144
+ updatedAt: new Date().toISOString(),
145
+ };
146
+ mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedRecord);
147
+ const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
148
+ expect(result).not.toHaveProperty('isCacheStale');
149
+ expect(result).not.toHaveProperty('staleTier');
150
+ expect(result).not.toHaveProperty('staleTracker');
151
+ expect(result).not.toHaveProperty('writeReason');
152
+ expect(result).not.toHaveProperty('skipNeptune');
153
+ });
154
+ });
155
+ describe('cache hit by email pointer', () => {
156
+ it('should return discoveredIdentityId with lookupPath=email_pointer and cacheHit=true', async () => {
157
+ const incomingIdentity = {
158
+ traits: { emails: ['lookup@email.com'] },
159
+ };
160
+ const emailPointerRecord = {
161
+ pk: `email#${pixelId}#lookup@email.com`,
162
+ pixelId,
163
+ identityId: 'discovered-identity-456',
164
+ updatedAt: new Date().toISOString(),
165
+ };
166
+ mockedDynamoDbClient.safeGet.mockResolvedValueOnce(emailPointerRecord);
167
+ const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
168
+ expect(result.cacheHit).toBe(true);
169
+ expect(result.lookupPath).toBe('email_pointer');
170
+ expect(result.discoveredIdentityId).toBe('discovered-identity-456');
171
+ expect(result.cachedIdentity).toBeUndefined();
172
+ });
173
+ it('should use first email in emails array for lookup', async () => {
174
+ const incomingIdentity = {
175
+ traits: { emails: ['first@email.com', 'second@email.com'] },
176
+ };
177
+ const emailPointerRecord = {
178
+ pk: `email#${pixelId}#first@email.com`,
179
+ pixelId,
180
+ identityId: 'pointer-identity-789',
181
+ updatedAt: new Date().toISOString(),
182
+ };
183
+ mockedDynamoDbClient.safeGet.mockResolvedValueOnce(emailPointerRecord);
184
+ const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
185
+ expect(result.discoveredIdentityId).toBe('pointer-identity-789');
186
+ expect(mockedDynamoDbClient.safeGet).toHaveBeenCalledWith(expect.any(String), 'pk', `email#${pixelId}#first@email.com`);
187
+ });
188
+ it('should NOT merge traits when returning email pointer discovery', async () => {
189
+ const incomingIdentity = {
190
+ traits: {
191
+ emails: ['discovery@email.com'],
192
+ phones: ['incoming-phone'],
193
+ },
194
+ };
195
+ const emailPointerRecord = {
196
+ pk: `email#${pixelId}#discovery@email.com`,
197
+ pixelId,
198
+ identityId: 'discovered-id',
199
+ updatedAt: new Date().toISOString(),
200
+ };
201
+ mockedDynamoDbClient.safeGet.mockResolvedValueOnce(emailPointerRecord);
202
+ const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
203
+ expect(result.cachedIdentity).toBeUndefined();
204
+ expect(result.discoveredIdentityId).toBe('discovered-id');
205
+ });
206
+ });
207
+ describe('cache miss', () => {
208
+ it('should return lookupPath=miss and cacheHit=false when identity not found', async () => {
209
+ const incomingIdentity = {
210
+ identityId: 'nonexistent-identity',
211
+ traits: { emails: ['test@email.com'] },
212
+ };
213
+ mockedDynamoDbClient.safeGet.mockResolvedValueOnce(null);
214
+ const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
215
+ expect(result.cacheHit).toBe(false);
216
+ expect(result.lookupPath).toBe('identity_id');
217
+ expect(result.cachedIdentity).toBeUndefined();
218
+ expect(result.discoveredIdentityId).toBeUndefined();
219
+ });
220
+ it('should return lookupPath=miss and cacheHit=false when email pointer not found', async () => {
221
+ const incomingIdentity = {
222
+ traits: { emails: ['unknown@email.com'] },
223
+ };
224
+ mockedDynamoDbClient.safeGet.mockResolvedValueOnce(null);
225
+ const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
226
+ expect(result.cacheHit).toBe(false);
227
+ expect(result.lookupPath).toBe('miss');
228
+ expect(result.cachedIdentity).toBeUndefined();
229
+ expect(result.discoveredIdentityId).toBeUndefined();
230
+ });
231
+ it('should return lookupPath=miss when cached record has no response field', async () => {
232
+ const incomingIdentity = {
233
+ identityId: 'no-response-identity',
234
+ traits: { emails: ['test@email.com'] },
235
+ };
236
+ const incompleteRecord = {
237
+ pk: `identity#${pixelId}#no-response-identity`,
238
+ pixelId,
239
+ identityId: 'no-response-identity',
240
+ updatedAt: new Date().toISOString(),
241
+ };
242
+ mockedDynamoDbClient.safeGet.mockResolvedValueOnce(incompleteRecord);
243
+ const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
244
+ expect(result.cacheHit).toBe(false);
245
+ expect(result.lookupPath).toBe('identity_id');
246
+ expect(result.cachedIdentity).toBeUndefined();
247
+ });
248
+ it('should return lookupPath=miss when no email provided for pointer lookup', async () => {
249
+ const incomingIdentity = {
250
+ traits: { phones: ['555-1234'] },
251
+ };
252
+ const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
253
+ expect(result.cacheHit).toBe(false);
254
+ expect(result.lookupPath).toBe('miss');
255
+ expect(mockedDynamoDbClient.safeGet).not.toHaveBeenCalled();
256
+ });
257
+ });
258
+ describe('invalid input handling', () => {
259
+ it('should return cache miss for undefined pixelId', async () => {
260
+ const incomingIdentity = {
261
+ identityId: 'test-identity',
262
+ traits: { emails: ['test@email.com'] },
263
+ };
264
+ const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(undefined, incomingIdentity);
265
+ expect(result.cacheHit).toBe(false);
266
+ expect(result.lookupPath).toBe('miss');
267
+ expect(mockedDynamoDbClient.safeGet).not.toHaveBeenCalled();
268
+ });
269
+ it('should return cache miss for empty pixelId', async () => {
270
+ const incomingIdentity = {
271
+ identityId: 'test-identity',
272
+ traits: { emails: ['test@email.com'] },
273
+ };
274
+ const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure('', incomingIdentity);
275
+ expect(result.cacheHit).toBe(false);
276
+ expect(result.lookupPath).toBe('miss');
277
+ });
278
+ it('should return cache miss for undefined incomingIdentity', async () => {
279
+ const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, undefined);
280
+ expect(result.cacheHit).toBe(false);
281
+ expect(result.lookupPath).toBe('miss');
282
+ });
283
+ it('should return cache miss for null incomingIdentity', async () => {
284
+ const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, null);
285
+ expect(result.cacheHit).toBe(false);
286
+ expect(result.lookupPath).toBe('miss');
287
+ });
288
+ });
289
+ describe('error handling', () => {
290
+ it('should return cache miss when DynamoDB throws an error', async () => {
291
+ const incomingIdentity = {
292
+ identityId: 'error-test-identity',
293
+ traits: { emails: ['test@email.com'] },
294
+ };
295
+ mockedDynamoDbClient.safeGet.mockRejectedValueOnce(new Error('DynamoDB connection failed'));
296
+ const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
297
+ expect(result.cacheHit).toBe(false);
298
+ expect(result.lookupPath).toBe('identity_id');
299
+ expect(result.cachedIdentity).toBeUndefined();
300
+ expect(mockedLogger.error).toHaveBeenCalledWith('IdentityCache - getItemByPk failed', expect.objectContaining({
301
+ error: expect.any(Error),
302
+ errorMessage: 'DynamoDB connection failed',
303
+ }));
304
+ });
305
+ it('should handle non-Error thrown values', async () => {
306
+ const incomingIdentity = {
307
+ identityId: 'string-error-identity',
308
+ traits: { emails: ['test@email.com'] },
309
+ };
310
+ mockedDynamoDbClient.safeGet.mockRejectedValueOnce('String error message');
311
+ const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
312
+ expect(result.cacheHit).toBe(false);
313
+ expect(result.lookupPath).toBe('identity_id');
314
+ expect(mockedLogger.error).toHaveBeenCalledWith('IdentityCache - getItemByPk failed', expect.objectContaining({
315
+ errorMessage: 'String error message',
316
+ }));
317
+ });
318
+ });
319
+ describe('verification: no merge or staleness logic', () => {
320
+ it('should not call mergeIdentityTraits', async () => {
321
+ const incomingIdentity = {
322
+ identityId: 'verify-no-merge',
323
+ traits: { emails: ['incoming@email.com'] },
324
+ };
325
+ const cachedRecord = {
326
+ pk: `identity#${pixelId}#verify-no-merge`,
327
+ pixelId,
328
+ identityId: 'verify-no-merge',
329
+ response: {
330
+ identityId: 'verify-no-merge',
331
+ traits: { emails: ['cached@email.com'] },
332
+ },
333
+ updatedAt: new Date().toISOString(),
334
+ };
335
+ mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedRecord);
336
+ const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
337
+ expect(result.cachedIdentity).toBe(cachedRecord.response);
338
+ expect(result.cachedIdentity?.traits?.emails).toEqual(['cached@email.com']);
339
+ });
340
+ it('should not call isIdentityCacheStale', async () => {
341
+ const incomingIdentity = {
342
+ identityId: 'verify-no-staleness',
343
+ traits: {
344
+ emails: ['new-email@test.com'],
345
+ },
346
+ };
347
+ const cachedRecord = {
348
+ pk: `identity#${pixelId}#verify-no-staleness`,
349
+ pixelId,
350
+ identityId: 'verify-no-staleness',
351
+ response: {
352
+ identityId: 'verify-no-staleness',
353
+ traits: { emails: ['old-email@test.com'] },
354
+ },
355
+ updatedAt: new Date().toISOString(),
356
+ };
357
+ mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedRecord);
358
+ const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
359
+ expect(Object.keys(result)).toEqual(['cachedIdentity', 'lookupPath', 'cacheHit']);
360
+ });
361
+ it('result should only contain pure lookup properties', async () => {
362
+ const incomingIdentity = {
363
+ identityId: 'result-shape-test',
364
+ traits: { emails: ['test@email.com'] },
365
+ };
366
+ const cachedRecord = {
367
+ pk: `identity#${pixelId}#result-shape-test`,
368
+ pixelId,
369
+ identityId: 'result-shape-test',
370
+ response: {
371
+ identityId: 'result-shape-test',
372
+ traits: { emails: ['test@email.com'] },
373
+ },
374
+ updatedAt: new Date().toISOString(),
375
+ };
376
+ mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedRecord);
377
+ const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
378
+ expect(result).toEqual({
379
+ cachedIdentity: cachedRecord.response,
380
+ lookupPath: 'identity_id',
381
+ cacheHit: true,
382
+ });
383
+ expect(result).not.toHaveProperty('resolvedIdentity');
384
+ expect(result).not.toHaveProperty('isCacheStale');
385
+ expect(result).not.toHaveProperty('staleTracker');
386
+ expect(result).not.toHaveProperty('staleTier');
387
+ expect(result).not.toHaveProperty('writeReason');
388
+ expect(result).not.toHaveProperty('skipNeptune');
389
+ expect(result).not.toHaveProperty('mergedIdentity');
390
+ });
391
+ });
392
+ describe('logging', () => {
393
+ it('should log debug on cache hit by identity ID', async () => {
394
+ const incomingIdentity = {
395
+ identityId: 'log-test-id',
396
+ traits: { emails: ['test@email.com'] },
397
+ };
398
+ const cachedRecord = {
399
+ pk: `identity#${pixelId}#log-test-id`,
400
+ pixelId,
401
+ identityId: 'log-test-id',
402
+ response: {
403
+ identityId: 'log-test-id',
404
+ traits: { emails: ['test@email.com'] },
405
+ },
406
+ updatedAt: new Date().toISOString(),
407
+ };
408
+ mockedDynamoDbClient.safeGet.mockResolvedValueOnce(cachedRecord);
409
+ await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
410
+ expect(mockedLogger.debug).toHaveBeenCalledWith('IdentityCache - pure lookup hit', expect.objectContaining({
411
+ pixelId,
412
+ identityId: 'log-test-id',
413
+ }));
414
+ });
415
+ it('should log debug on cache miss', async () => {
416
+ const incomingIdentity = {
417
+ identityId: 'miss-log-test',
418
+ traits: { emails: ['test@email.com'] },
419
+ };
420
+ mockedDynamoDbClient.safeGet.mockResolvedValueOnce(null);
421
+ await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
422
+ expect(mockedLogger.debug).toHaveBeenCalledWith('IdentityCache - pure lookup miss', expect.objectContaining({
423
+ pixelId,
424
+ identityId: 'miss-log-test',
425
+ }));
426
+ });
427
+ it('should log debug on email pointer discovery', async () => {
428
+ const incomingIdentity = {
429
+ traits: { emails: ['email-pointer@test.com'] },
430
+ };
431
+ const emailPointerRecord = {
432
+ pk: `email#${pixelId}#email-pointer@test.com`,
433
+ pixelId,
434
+ identityId: 'discovered-from-pointer',
435
+ updatedAt: new Date().toISOString(),
436
+ };
437
+ mockedDynamoDbClient.safeGet.mockResolvedValueOnce(emailPointerRecord);
438
+ await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getIdentityFromCachePure(pixelId, incomingIdentity);
439
+ expect(mockedLogger.debug).toHaveBeenCalledWith('IdentityCache - pure email pointer discovery', expect.objectContaining({
440
+ pixelId,
441
+ discoveredIdentityId: 'discovered-from-pointer',
442
+ }));
443
+ });
444
+ });
445
+ });
446
+ describe('IdentityCacheDynamoDbDbService cluster traits operations', () => {
447
+ const pixelId = 'pixel-cluster';
448
+ const primaryIdentityId = 'identity-primary';
449
+ const secondaryIdentityId = 'identity-secondary';
450
+ beforeEach(() => {
451
+ jest.clearAllMocks();
452
+ });
453
+ it('returns records by requested identity ID when every key is processed', async () => {
454
+ const primaryRecord = {
455
+ pk: `identity#${pixelId}#${primaryIdentityId}`,
456
+ pixelId,
457
+ identityId: primaryIdentityId,
458
+ response: { identityId: primaryIdentityId, traits: { emails: ['primary@test.com'] } },
459
+ updatedAt: '2026-09-04T12:00:00.000Z',
460
+ };
461
+ mockedDynamoDbClient.batchGet.mockResolvedValue({
462
+ Responses: { [constants_js_1.IDENTITY_CACHE_TABLE_NAME]: [primaryRecord] },
463
+ UnprocessedKeys: {},
464
+ $metadata: {},
465
+ });
466
+ const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getClusterIdentityRecords(pixelId, [primaryIdentityId, secondaryIdentityId]);
467
+ expect(result.complete).toBe(true);
468
+ expect(result.failedIdentityIds).toEqual([]);
469
+ expect(result.recordsByIdentityId.get(primaryIdentityId)).toEqual(primaryRecord);
470
+ expect(result.recordsByIdentityId.has(secondaryIdentityId)).toBe(false);
471
+ });
472
+ it('treats an unprocessed key as a failed read', async () => {
473
+ mockedDynamoDbClient.batchGet.mockResolvedValue({
474
+ Responses: { [constants_js_1.IDENTITY_CACHE_TABLE_NAME]: [] },
475
+ UnprocessedKeys: {
476
+ [constants_js_1.IDENTITY_CACHE_TABLE_NAME]: {
477
+ Keys: [{ pk: `identity#${pixelId}#${secondaryIdentityId}` }],
478
+ },
479
+ },
480
+ $metadata: {},
481
+ });
482
+ const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getClusterIdentityRecords(pixelId, [primaryIdentityId, secondaryIdentityId]);
483
+ expect(result.complete).toBe(false);
484
+ expect(result.failedIdentityIds).toEqual([secondaryIdentityId]);
485
+ });
486
+ it('marks every key in a failed chunk as a failed read', async () => {
487
+ mockedDynamoDbClient.batchGet.mockRejectedValue(new Error('read failed'));
488
+ const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getClusterIdentityRecords(pixelId, [primaryIdentityId, secondaryIdentityId]);
489
+ expect(result.complete).toBe(false);
490
+ expect(result.failedIdentityIds).toEqual([primaryIdentityId, secondaryIdentityId]);
491
+ });
492
+ it('writes final primary traits and the migration marker in one item', async () => {
493
+ mockedDynamoDbClient.safePut.mockResolvedValue({ $metadata: { httpStatusCode: 200 } });
494
+ const success = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.putPrimaryIdentityTraits({
495
+ pixelId,
496
+ primaryIdentityId,
497
+ traits: { emails: ['merged@test.com'] },
498
+ traitsInDynamo: true,
499
+ });
500
+ expect(success).toBe(true);
501
+ expect(mockedDynamoDbClient.safePut).toHaveBeenCalledWith(expect.any(String), expect.objectContaining({
502
+ pk: `identity#${pixelId}#${primaryIdentityId}`,
503
+ identityId: primaryIdentityId,
504
+ traitsInDynamo: true,
505
+ response: {
506
+ identityId: primaryIdentityId,
507
+ traits: { emails: ['merged@test.com'] },
508
+ },
509
+ }));
510
+ });
511
+ it('reports a failed primary traits write', async () => {
512
+ mockedDynamoDbClient.safePut.mockResolvedValue(null);
513
+ const success = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.putPrimaryIdentityTraits({
514
+ pixelId,
515
+ primaryIdentityId,
516
+ traits: {},
517
+ traitsInDynamo: true,
518
+ });
519
+ expect(success).toBe(false);
520
+ });
521
+ it('deletes exact identity keys and returns unprocessed identity IDs', async () => {
522
+ mockedDynamoDbClient.batchWrite.mockResolvedValue({
523
+ UnprocessedItems: {
524
+ [constants_js_1.IDENTITY_CACHE_TABLE_NAME]: [{
525
+ DeleteRequest: { Key: { pk: `identity#${pixelId}#${secondaryIdentityId}` } },
526
+ }],
527
+ },
528
+ $metadata: {},
529
+ });
530
+ const failedIdentityIds = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.deleteIdentityRecords(pixelId, [primaryIdentityId, secondaryIdentityId]);
531
+ expect(failedIdentityIds).toEqual([secondaryIdentityId]);
532
+ expect(mockedDynamoDbClient.batchWrite).toHaveBeenCalledWith({
533
+ RequestItems: {
534
+ [constants_js_1.IDENTITY_CACHE_TABLE_NAME]: [
535
+ { DeleteRequest: { Key: { pk: `identity#${pixelId}#${primaryIdentityId}` } } },
536
+ { DeleteRequest: { Key: { pk: `identity#${pixelId}#${secondaryIdentityId}` } } },
537
+ ],
538
+ },
539
+ });
540
+ });
541
+ it('returns every identity ID when an exact delete chunk fails', async () => {
542
+ mockedDynamoDbClient.batchWrite.mockRejectedValue(new Error('delete failed'));
543
+ const failedIdentityIds = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.deleteIdentityRecords(pixelId, [primaryIdentityId, secondaryIdentityId]);
544
+ expect(failedIdentityIds).toEqual([primaryIdentityId, secondaryIdentityId]);
545
+ });
546
+ it('deduplicates requested identity IDs before issuing batchGet', async () => {
547
+ mockedDynamoDbClient.batchGet.mockResolvedValue({
548
+ Responses: { [constants_js_1.IDENTITY_CACHE_TABLE_NAME]: [] },
549
+ UnprocessedKeys: {},
550
+ $metadata: {},
551
+ });
552
+ await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getClusterIdentityRecords(pixelId, [primaryIdentityId, primaryIdentityId, secondaryIdentityId]);
553
+ expect(mockedDynamoDbClient.batchGet).toHaveBeenCalledWith({
554
+ RequestItems: {
555
+ [constants_js_1.IDENTITY_CACHE_TABLE_NAME]: {
556
+ Keys: [
557
+ { pk: `identity#${pixelId}#${primaryIdentityId}` },
558
+ { pk: `identity#${pixelId}#${secondaryIdentityId}` },
559
+ ],
560
+ },
561
+ },
562
+ });
563
+ });
564
+ it('treats a processed key with no returned item as a successful miss', async () => {
565
+ mockedDynamoDbClient.batchGet.mockResolvedValue({
566
+ Responses: { [constants_js_1.IDENTITY_CACHE_TABLE_NAME]: [] },
567
+ UnprocessedKeys: {},
568
+ $metadata: {},
569
+ });
570
+ const result = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getClusterIdentityRecords(pixelId, [primaryIdentityId, secondaryIdentityId]);
571
+ expect(result.complete).toBe(true);
572
+ expect(result.failedIdentityIds).toEqual([]);
573
+ expect(result.recordsByIdentityId.size).toBe(0);
574
+ });
575
+ it('reports a failed primary traits write when safePut throws', async () => {
576
+ mockedDynamoDbClient.safePut.mockRejectedValue(new Error('put failed'));
577
+ const success = await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.putPrimaryIdentityTraits({
578
+ pixelId,
579
+ primaryIdentityId,
580
+ traits: { emails: ['merged@test.com'] },
581
+ traitsInDynamo: true,
582
+ });
583
+ expect(success).toBe(false);
584
+ expect(mockedLogger.error).toHaveBeenCalledWith('IdentityCache [primary traits write]: failed', expect.objectContaining({ pixelId, primaryIdentityId }));
585
+ });
586
+ it('deletes exact identity PKs without querying GSI1', async () => {
587
+ mockedDynamoDbClient.batchWrite.mockResolvedValue({
588
+ UnprocessedItems: {},
589
+ $metadata: {},
590
+ });
591
+ await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.deleteIdentityRecords(pixelId, [secondaryIdentityId]);
592
+ expect(mockedDynamoDbClient.safeQueryByGSI).not.toHaveBeenCalled();
593
+ expect(mockedDynamoDbClient.batchWrite).toHaveBeenCalledWith({
594
+ RequestItems: {
595
+ [constants_js_1.IDENTITY_CACHE_TABLE_NAME]: [
596
+ { DeleteRequest: { Key: { pk: `identity#${pixelId}#${secondaryIdentityId}` } } },
597
+ ],
598
+ },
599
+ });
600
+ });
601
+ it('logs cluster read completion with requested identity IDs', async () => {
602
+ mockedDynamoDbClient.batchGet.mockResolvedValue({
603
+ Responses: { [constants_js_1.IDENTITY_CACHE_TABLE_NAME]: [] },
604
+ UnprocessedKeys: {},
605
+ $metadata: {},
606
+ });
607
+ await identity_cache_dynamodb_db_service_js_1.IdentityCacheDynamoDbDbService.getClusterIdentityRecords(pixelId, [primaryIdentityId]);
608
+ expect(mockedLogger.info).toHaveBeenCalledWith('IdentityCache [cluster traits read]: completed', expect.objectContaining({
609
+ pixelId,
610
+ identityIds: [primaryIdentityId],
611
+ }));
612
+ });
613
+ });
614
+ describe('mergeAndComputeIdentityStaleness (pure function)', () => {
615
+ const { mergeAndComputeIdentityStaleness, IDENTITY_CACHE_STALENESS_TIER } = jest.requireActual('@adtrackify/at-shared-utils');
616
+ describe('merge behavior', () => {
617
+ it('should merge incoming traits with cached traits', () => {
618
+ const incomingIdentity = {
619
+ identityId: 'merge-test',
620
+ traits: {
621
+ emails: ['new@email.com'],
622
+ },
623
+ };
624
+ const cachedIdentity = {
625
+ identityId: 'merge-test',
626
+ traits: {
627
+ emails: ['cached@email.com'],
628
+ phones: ['555-1234'],
629
+ },
630
+ };
631
+ const result = mergeAndComputeIdentityStaleness(incomingIdentity, cachedIdentity);
632
+ expect(result.mergedIdentity.traits?.emails).toContain('new@email.com');
633
+ expect(result.mergedIdentity.traits?.emails).toContain('cached@email.com');
634
+ expect(result.mergedIdentity.traits?.phones).toContain('555-1234');
635
+ });
636
+ });
637
+ describe('staleness tier computation', () => {
638
+ it('should return NONE tier when no traits are stale', () => {
639
+ const incomingIdentity = {
640
+ identityId: 'same-test',
641
+ traits: { emails: ['same@email.com'] },
642
+ };
643
+ const cachedIdentity = {
644
+ identityId: 'same-test',
645
+ traits: { emails: ['same@email.com'] },
646
+ };
647
+ const result = mergeAndComputeIdentityStaleness(incomingIdentity, cachedIdentity);
648
+ expect(result.staleTier).toBe(IDENTITY_CACHE_STALENESS_TIER.NONE);
649
+ expect(result.isCacheStale).toBe(false);
650
+ });
651
+ it('should return VOLATILE_ONLY tier when incoming has new IP address (cached has none)', () => {
652
+ const incomingIdentity = {
653
+ identityId: 'volatile-test',
654
+ traits: {
655
+ emails: ['same@email.com'],
656
+ ipAddress: '192.168.1.100',
657
+ },
658
+ };
659
+ const cachedIdentity = {
660
+ identityId: 'volatile-test',
661
+ traits: {
662
+ emails: ['same@email.com'],
663
+ },
664
+ };
665
+ const result = mergeAndComputeIdentityStaleness(incomingIdentity, cachedIdentity);
666
+ expect(result.staleTier).toBe(IDENTITY_CACHE_STALENESS_TIER.VOLATILE_ONLY);
667
+ expect(result.isCacheStale).toBe(false);
668
+ });
669
+ it('should return ADDRESS_UPDATE tier when non-IP address is new', () => {
670
+ const incomingIdentity = {
671
+ identityId: 'address-test',
672
+ traits: {
673
+ emails: ['same@email.com'],
674
+ addresses: [{ firstName: 'John', city: 'New York' }],
675
+ },
676
+ };
677
+ const cachedIdentity = {
678
+ identityId: 'address-test',
679
+ traits: {
680
+ emails: ['same@email.com'],
681
+ addresses: [],
682
+ },
683
+ };
684
+ const result = mergeAndComputeIdentityStaleness(incomingIdentity, cachedIdentity);
685
+ expect(result.staleTier).toBe(IDENTITY_CACHE_STALENESS_TIER.ADDRESS_UPDATE);
686
+ expect(result.isCacheStale).toBe(true);
687
+ });
688
+ it('should return IDENTITY_STALE tier when email changes', () => {
689
+ const incomingIdentity = {
690
+ identityId: 'stale-test',
691
+ traits: {
692
+ emails: ['new@email.com'],
693
+ },
694
+ };
695
+ const cachedIdentity = {
696
+ identityId: 'stale-test',
697
+ traits: {
698
+ emails: ['old@email.com'],
699
+ },
700
+ };
701
+ const result = mergeAndComputeIdentityStaleness(incomingIdentity, cachedIdentity);
702
+ expect(result.staleTier).toBe(IDENTITY_CACHE_STALENESS_TIER.IDENTITY_STALE);
703
+ expect(result.isCacheStale).toBe(true);
704
+ });
705
+ });
706
+ describe('staleTraits extraction', () => {
707
+ it('should include changed trait names in staleTraits array', () => {
708
+ const incomingIdentity = {
709
+ identityId: 'traits-test',
710
+ traits: {
711
+ emails: ['new@email.com'],
712
+ phones: ['999-0000'],
713
+ },
714
+ };
715
+ const cachedIdentity = {
716
+ identityId: 'traits-test',
717
+ traits: {
718
+ emails: ['old@email.com'],
719
+ phones: ['111-2222'],
720
+ },
721
+ };
722
+ const result = mergeAndComputeIdentityStaleness(incomingIdentity, cachedIdentity);
723
+ expect(result.staleTraits).toContain('emails');
724
+ expect(result.staleTraits).toContain('phones');
725
+ });
726
+ });
727
+ });
556
728
  //# sourceMappingURL=identity-cache-dynamodb-db-service.spec.js.map