@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,819 +1,819 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const at_tracking_event_types_1 = require("@adtrackify/at-tracking-event-types");
4
- const at_shared_utils_1 = require("@adtrackify/at-shared-utils");
5
- describe('Volatile Traits Optimization - Tier Classification', () => {
6
- afterEach(() => {
7
- jest.resetModules();
8
- });
9
- describe('TIER: NONE — Cache is fresh', () => {
10
- it('should return NONE when cached and incoming are identical', () => {
11
- const identity = {
12
- identityId: 'test-id',
13
- traits: {
14
- emails: ['test@email.com'],
15
- phones: ['+1234567890'],
16
- ipAddress: '192.168.1.1',
17
- userAgent: 'Mozilla/5.0',
18
- addresses: [{ city: 'New York', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT }],
19
- },
20
- };
21
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(identity, identity);
22
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.NONE);
23
- expect(result.isCacheStale).toBe(false);
24
- expect(result.isIpAddressStale).toBe(false);
25
- expect(result.isUserAgentStale).toBe(false);
26
- expect(result.isEmailsStale).toBe(false);
27
- expect(result.isAddressesStale).toBe(false);
28
- });
29
- it('should return NONE when incoming is subset of cached', () => {
30
- const cachedIdentity = {
31
- identityId: 'test-id',
32
- traits: {
33
- emails: ['a@email.com', 'b@email.com'],
34
- phones: ['+1234567890', '+9876543210'],
35
- userIds: ['user1', 'user2'],
36
- },
37
- };
38
- const incomingIdentity = {
39
- identityId: 'test-id',
40
- traits: {
41
- emails: ['a@email.com'],
42
- phones: ['+1234567890'],
43
- },
44
- };
45
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
46
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.NONE);
47
- expect(result.isCacheStale).toBe(false);
48
- });
49
- });
50
- describe('TIER: VOLATILE_ONLY — Only session traits changed', () => {
51
- it('should return VOLATILE_ONLY when only ipAddress is stale', () => {
52
- const cachedIdentity = {
53
- identityId: 'test-id',
54
- traits: {
55
- emails: ['test@email.com'],
56
- ipAddress: '192.168.1.1',
57
- },
58
- };
59
- const incomingIdentity = {
60
- identityId: 'test-id',
61
- traits: {
62
- emails: ['test@email.com'],
63
- ipAddress: '10.0.0.1',
64
- },
65
- };
66
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
67
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.VOLATILE_ONLY);
68
- expect(result.isCacheStale).toBe(false);
69
- expect(result.isIpAddressStale).toBe(true);
70
- expect(result.isUserAgentStale).toBe(false);
71
- });
72
- it('should return VOLATILE_ONLY when only userAgent is stale', () => {
73
- const cachedIdentity = {
74
- identityId: 'test-id',
75
- traits: {
76
- emails: ['test@email.com'],
77
- userAgent: 'Mozilla/5.0 (Windows NT 10.0)',
78
- },
79
- };
80
- const incomingIdentity = {
81
- identityId: 'test-id',
82
- traits: {
83
- emails: ['test@email.com'],
84
- userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X)',
85
- },
86
- };
87
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
88
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.VOLATILE_ONLY);
89
- expect(result.isCacheStale).toBe(false);
90
- expect(result.isUserAgentStale).toBe(true);
91
- expect(result.isIpAddressStale).toBe(false);
92
- });
93
- it('should return VOLATILE_ONLY when only IP-sourced addresses are stale', () => {
94
- const cachedIdentity = {
95
- identityId: 'test-id',
96
- traits: {
97
- emails: ['test@email.com'],
98
- addresses: [{ city: 'New York', country: 'USA', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS }],
99
- },
100
- };
101
- const incomingIdentity = {
102
- identityId: 'test-id',
103
- traits: {
104
- emails: ['test@email.com'],
105
- addresses: [{ city: 'Los Angeles', country: 'USA', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS }],
106
- },
107
- };
108
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
109
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.VOLATILE_ONLY);
110
- expect(result.isCacheStale).toBe(false);
111
- expect(result.isIpAddressesStale).toBe(true);
112
- expect(result.isNonIpAddressesStale).toBe(false);
113
- });
114
- it('should return VOLATILE_ONLY when ipAddress AND userAgent are both stale', () => {
115
- const cachedIdentity = {
116
- identityId: 'test-id',
117
- traits: {
118
- emails: ['test@email.com'],
119
- ipAddress: '192.168.1.1',
120
- userAgent: 'Mozilla/5.0 (Windows)',
121
- },
122
- };
123
- const incomingIdentity = {
124
- identityId: 'test-id',
125
- traits: {
126
- emails: ['test@email.com'],
127
- ipAddress: '10.0.0.1',
128
- userAgent: 'Mozilla/5.0 (Mac)',
129
- },
130
- };
131
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
132
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.VOLATILE_ONLY);
133
- expect(result.isCacheStale).toBe(false);
134
- expect(result.isIpAddressStale).toBe(true);
135
- expect(result.isUserAgentStale).toBe(true);
136
- });
137
- it('should return VOLATILE_ONLY when ipAddress AND IP-sourced address are both stale', () => {
138
- const cachedIdentity = {
139
- identityId: 'test-id',
140
- traits: {
141
- emails: ['test@email.com'],
142
- ipAddress: '192.168.1.1',
143
- addresses: [{ city: 'Chicago', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS }],
144
- },
145
- };
146
- const incomingIdentity = {
147
- identityId: 'test-id',
148
- traits: {
149
- emails: ['test@email.com'],
150
- ipAddress: '10.0.0.1',
151
- addresses: [{ city: 'Denver', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS }],
152
- },
153
- };
154
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
155
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.VOLATILE_ONLY);
156
- expect(result.isCacheStale).toBe(false);
157
- expect(result.isIpAddressStale).toBe(true);
158
- expect(result.isIpAddressesStale).toBe(true);
159
- });
160
- it('should return VOLATILE_ONLY when all volatile traits are stale but no identity traits', () => {
161
- const cachedIdentity = {
162
- identityId: 'test-id',
163
- traits: {
164
- emails: ['test@email.com'],
165
- ipAddress: '192.168.1.1',
166
- userAgent: 'Mozilla/5.0 (Windows)',
167
- addresses: [{ city: 'Seattle', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS }],
168
- },
169
- };
170
- const incomingIdentity = {
171
- identityId: 'test-id',
172
- traits: {
173
- emails: ['test@email.com'],
174
- ipAddress: '172.16.0.1',
175
- userAgent: 'Chrome/120.0',
176
- addresses: [{ city: 'Portland', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS }],
177
- },
178
- };
179
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
180
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.VOLATILE_ONLY);
181
- expect(result.isCacheStale).toBe(false);
182
- expect(result.isIpAddressStale).toBe(true);
183
- expect(result.isUserAgentStale).toBe(true);
184
- expect(result.isIpAddressesStale).toBe(true);
185
- });
186
- });
187
- describe('TIER: ADDRESS_UPDATE — Non-IP address changed', () => {
188
- it('should return ADDRESS_UPDATE when only non-IP address is new', () => {
189
- const cachedIdentity = {
190
- identityId: 'test-id',
191
- traits: {
192
- emails: ['test@email.com'],
193
- addresses: [],
194
- },
195
- };
196
- const incomingIdentity = {
197
- identityId: 'test-id',
198
- traits: {
199
- emails: ['test@email.com'],
200
- addresses: [{ city: 'Boston', province: 'MA', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT }],
201
- },
202
- };
203
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
204
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.ADDRESS_UPDATE);
205
- expect(result.isCacheStale).toBe(true);
206
- expect(result.isNonIpAddressesStale).toBe(true);
207
- expect(result.isIpAddressesStale).toBe(false);
208
- });
209
- it('should return ADDRESS_UPDATE when non-IP address AND volatile traits are both stale', () => {
210
- const cachedIdentity = {
211
- identityId: 'test-id',
212
- traits: {
213
- emails: ['test@email.com'],
214
- ipAddress: '192.168.1.1',
215
- userAgent: 'Mozilla/5.0',
216
- addresses: [],
217
- },
218
- };
219
- const incomingIdentity = {
220
- identityId: 'test-id',
221
- traits: {
222
- emails: ['test@email.com'],
223
- ipAddress: '10.0.0.1',
224
- userAgent: 'Chrome/120.0',
225
- addresses: [{ city: 'Austin', firstName: 'John', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT }],
226
- },
227
- };
228
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
229
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.ADDRESS_UPDATE);
230
- expect(result.isCacheStale).toBe(true);
231
- expect(result.isNonIpAddressesStale).toBe(true);
232
- expect(result.isIpAddressStale).toBe(true);
233
- expect(result.isUserAgentStale).toBe(true);
234
- });
235
- it('should return ADDRESS_UPDATE when new input address added to existing addresses', () => {
236
- const cachedIdentity = {
237
- identityId: 'test-id',
238
- traits: {
239
- emails: ['test@email.com'],
240
- addresses: [{ city: 'Miami', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT }],
241
- },
242
- };
243
- const incomingIdentity = {
244
- identityId: 'test-id',
245
- traits: {
246
- emails: ['test@email.com'],
247
- addresses: [
248
- { city: 'Miami', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
249
- { city: 'Tampa', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
250
- ],
251
- },
252
- };
253
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
254
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.ADDRESS_UPDATE);
255
- expect(result.isCacheStale).toBe(true);
256
- expect(result.isNonIpAddressesStale).toBe(true);
257
- });
258
- it('should return ADDRESS_UPDATE when address with PII (no source field) is added', () => {
259
- const cachedIdentity = {
260
- identityId: 'test-id',
261
- traits: {
262
- emails: ['test@email.com'],
263
- addresses: [],
264
- },
265
- };
266
- const incomingIdentity = {
267
- identityId: 'test-id',
268
- traits: {
269
- emails: ['test@email.com'],
270
- addresses: [{ city: 'Dallas', firstName: 'Jane', lastName: 'Doe' }],
271
- },
272
- };
273
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
274
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.ADDRESS_UPDATE);
275
- expect(result.isCacheStale).toBe(true);
276
- expect(result.isNonIpAddressesStale).toBe(true);
277
- });
278
- });
279
- describe('TIER: IDENTITY_STALE — Identity-defining traits changed', () => {
280
- it('should return IDENTITY_STALE when emails are stale', () => {
281
- const cachedIdentity = {
282
- identityId: 'test-id',
283
- traits: { emails: ['old@email.com'] },
284
- };
285
- const incomingIdentity = {
286
- identityId: 'test-id',
287
- traits: { emails: ['old@email.com', 'new@email.com'] },
288
- };
289
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
290
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.IDENTITY_STALE);
291
- expect(result.isCacheStale).toBe(true);
292
- expect(result.isEmailsStale).toBe(true);
293
- });
294
- it('should return IDENTITY_STALE when phones are stale', () => {
295
- const cachedIdentity = {
296
- identityId: 'test-id',
297
- traits: { phones: ['+1234567890'] },
298
- };
299
- const incomingIdentity = {
300
- identityId: 'test-id',
301
- traits: { phones: ['+1234567890', '+9876543210'] },
302
- };
303
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
304
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.IDENTITY_STALE);
305
- expect(result.isCacheStale).toBe(true);
306
- expect(result.isPhonesStale).toBe(true);
307
- });
308
- it('should return IDENTITY_STALE when userIds are stale', () => {
309
- const cachedIdentity = {
310
- identityId: 'test-id',
311
- traits: { userIds: ['user1'] },
312
- };
313
- const incomingIdentity = {
314
- identityId: 'test-id',
315
- traits: { userIds: ['user1', 'user2'] },
316
- };
317
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
318
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.IDENTITY_STALE);
319
- expect(result.isCacheStale).toBe(true);
320
- expect(result.isUserIdsStale).toBe(true);
321
- });
322
- it('should return IDENTITY_STALE when clickInfos are stale', () => {
323
- const cachedIdentity = {
324
- identityId: 'test-id',
325
- traits: { click: { gclid: 'old_gclid' } },
326
- };
327
- const incomingIdentity = {
328
- identityId: 'test-id',
329
- traits: { click: { gclid: 'new_gclid' } },
330
- };
331
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
332
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.IDENTITY_STALE);
333
- expect(result.isCacheStale).toBe(true);
334
- expect(result.isClickInfosStale).toBe(true);
335
- });
336
- it('should return IDENTITY_STALE when identityId is stale', () => {
337
- const cachedIdentity = {
338
- identityId: 'old-id',
339
- traits: { emails: ['test@email.com'] },
340
- };
341
- const incomingIdentity = {
342
- identityId: 'new-id',
343
- traits: { emails: ['test@email.com'] },
344
- };
345
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
346
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.IDENTITY_STALE);
347
- expect(result.isCacheStale).toBe(true);
348
- expect(result.isIdentityIdStale).toBe(true);
349
- });
350
- it('should return IDENTITY_STALE when emails stale AND volatile traits stale (highest tier wins)', () => {
351
- const cachedIdentity = {
352
- identityId: 'test-id',
353
- traits: {
354
- emails: ['old@email.com'],
355
- ipAddress: '192.168.1.1',
356
- userAgent: 'Mozilla/5.0',
357
- },
358
- };
359
- const incomingIdentity = {
360
- identityId: 'test-id',
361
- traits: {
362
- emails: ['old@email.com', 'new@email.com'],
363
- ipAddress: '10.0.0.1',
364
- userAgent: 'Chrome/120.0',
365
- },
366
- };
367
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
368
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.IDENTITY_STALE);
369
- expect(result.isCacheStale).toBe(true);
370
- expect(result.isEmailsStale).toBe(true);
371
- expect(result.isIpAddressStale).toBe(true);
372
- expect(result.isUserAgentStale).toBe(true);
373
- });
374
- it('should return IDENTITY_STALE when emails stale AND non-IP address stale (highest tier wins)', () => {
375
- const cachedIdentity = {
376
- identityId: 'test-id',
377
- traits: {
378
- emails: ['old@email.com'],
379
- addresses: [],
380
- },
381
- };
382
- const incomingIdentity = {
383
- identityId: 'test-id',
384
- traits: {
385
- emails: ['old@email.com', 'new@email.com'],
386
- addresses: [{ city: 'Phoenix', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT }],
387
- },
388
- };
389
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
390
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.IDENTITY_STALE);
391
- expect(result.isCacheStale).toBe(true);
392
- expect(result.isEmailsStale).toBe(true);
393
- expect(result.isNonIpAddressesStale).toBe(true);
394
- });
395
- });
396
- });
397
- describe('Volatile Traits Optimization - Address Source Filtering', () => {
398
- afterEach(() => {
399
- jest.resetModules();
400
- });
401
- describe('isAddressIpSourced inference', () => {
402
- it('should treat address with s: IP_ADDRESS as IP-sourced', () => {
403
- const cachedIdentity = {
404
- identityId: 'test-id',
405
- traits: { addresses: [] },
406
- };
407
- const incomingIdentity = {
408
- identityId: 'test-id',
409
- traits: {
410
- addresses: [{ city: 'Atlanta', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS }],
411
- },
412
- };
413
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
414
- expect(result.isIpAddressesStale).toBe(true);
415
- expect(result.isNonIpAddressesStale).toBe(false);
416
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.VOLATILE_ONLY);
417
- });
418
- it('should treat address with s: INPUT as non-IP-sourced', () => {
419
- const cachedIdentity = {
420
- identityId: 'test-id',
421
- traits: { addresses: [] },
422
- };
423
- const incomingIdentity = {
424
- identityId: 'test-id',
425
- traits: {
426
- addresses: [{ city: 'Houston', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT }],
427
- },
428
- };
429
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
430
- expect(result.isNonIpAddressesStale).toBe(true);
431
- expect(result.isIpAddressesStale).toBe(false);
432
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.ADDRESS_UPDATE);
433
- });
434
- it('should treat address without s but with firstName/lastName as non-IP (inferred input)', () => {
435
- const cachedIdentity = {
436
- identityId: 'test-id',
437
- traits: { addresses: [] },
438
- };
439
- const incomingIdentity = {
440
- identityId: 'test-id',
441
- traits: {
442
- addresses: [{ city: 'San Diego', firstName: 'Alice', lastName: 'Smith' }],
443
- },
444
- };
445
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
446
- expect(result.isNonIpAddressesStale).toBe(true);
447
- expect(result.isIpAddressesStale).toBe(false);
448
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.ADDRESS_UPDATE);
449
- });
450
- it('should treat address without s but with email as non-IP (inferred input)', () => {
451
- const cachedIdentity = {
452
- identityId: 'test-id',
453
- traits: { addresses: [] },
454
- };
455
- const incomingIdentity = {
456
- identityId: 'test-id',
457
- traits: {
458
- addresses: [{ city: 'Sacramento', email: 'addr@email.com' }],
459
- },
460
- };
461
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
462
- expect(result.isNonIpAddressesStale).toBe(true);
463
- expect(result.isIpAddressesStale).toBe(false);
464
- });
465
- it('should treat address without s but with phone as non-IP (inferred input)', () => {
466
- const cachedIdentity = {
467
- identityId: 'test-id',
468
- traits: { addresses: [] },
469
- };
470
- const incomingIdentity = {
471
- identityId: 'test-id',
472
- traits: {
473
- addresses: [{ city: 'San Jose', phone: '+15551234567' }],
474
- },
475
- };
476
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
477
- expect(result.isNonIpAddressesStale).toBe(true);
478
- expect(result.isIpAddressesStale).toBe(false);
479
- });
480
- it('should treat address without s and without PII as IP-sourced (inferred IP)', () => {
481
- const cachedIdentity = {
482
- identityId: 'test-id',
483
- traits: { addresses: [] },
484
- };
485
- const incomingIdentity = {
486
- identityId: 'test-id',
487
- traits: {
488
- addresses: [{ city: 'Oakland', country: 'USA', countryCode: 'US' }],
489
- },
490
- };
491
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
492
- expect(result.isIpAddressesStale).toBe(true);
493
- expect(result.isNonIpAddressesStale).toBe(false);
494
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.VOLATILE_ONLY);
495
- });
496
- });
497
- describe('filterAddressesBySource behavior', () => {
498
- it('should correctly separate IP and non-IP addresses when mixed', () => {
499
- const cachedIdentity = {
500
- identityId: 'test-id',
501
- traits: {
502
- addresses: [
503
- { city: 'IP City 1', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS },
504
- { city: 'Input City 1', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
505
- ],
506
- },
507
- };
508
- const incomingIdentity = {
509
- identityId: 'test-id',
510
- traits: {
511
- addresses: [
512
- { city: 'New IP City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS },
513
- { city: 'Input City 1', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
514
- { city: 'New Input City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
515
- ],
516
- },
517
- };
518
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
519
- expect(result.isIpAddressesStale).toBe(true);
520
- expect(result.isNonIpAddressesStale).toBe(true);
521
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.ADDRESS_UPDATE);
522
- });
523
- });
524
- describe('hasNewNonIpAddress detection', () => {
525
- it('should detect new input address as stale', () => {
526
- const cachedIdentity = {
527
- identityId: 'test-id',
528
- traits: {
529
- addresses: [{ city: 'Old City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT }],
530
- },
531
- };
532
- const incomingIdentity = {
533
- identityId: 'test-id',
534
- traits: {
535
- addresses: [
536
- { city: 'Old City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
537
- { city: 'New City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
538
- ],
539
- },
540
- };
541
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
542
- expect(result.isNonIpAddressesStale).toBe(true);
543
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.ADDRESS_UPDATE);
544
- });
545
- it('should NOT mark non-IP stale when only IP address is new', () => {
546
- const cachedIdentity = {
547
- identityId: 'test-id',
548
- traits: {
549
- addresses: [
550
- { city: 'IP City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS },
551
- { city: 'Input City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
552
- ],
553
- },
554
- };
555
- const incomingIdentity = {
556
- identityId: 'test-id',
557
- traits: {
558
- addresses: [
559
- { city: 'New IP City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS },
560
- { city: 'Input City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
561
- ],
562
- },
563
- };
564
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
565
- expect(result.isIpAddressesStale).toBe(true);
566
- expect(result.isNonIpAddressesStale).toBe(false);
567
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.VOLATILE_ONLY);
568
- });
569
- });
570
- describe('hasNewIpAddress detection', () => {
571
- it('should detect new IP address for tracking purposes', () => {
572
- const cachedIdentity = {
573
- identityId: 'test-id',
574
- traits: {
575
- addresses: [{ city: 'Old IP City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS }],
576
- },
577
- };
578
- const incomingIdentity = {
579
- identityId: 'test-id',
580
- traits: {
581
- addresses: [{ city: 'New IP City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS }],
582
- },
583
- };
584
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
585
- expect(result.isIpAddressesStale).toBe(true);
586
- expect(result.isAddressesStale).toBe(true);
587
- });
588
- });
589
- describe('Empty addresses edge cases', () => {
590
- it('should return ADDRESS_UPDATE when cached empty and incoming has non-IP address', () => {
591
- const cachedIdentity = {
592
- identityId: 'test-id',
593
- traits: { addresses: [] },
594
- };
595
- const incomingIdentity = {
596
- identityId: 'test-id',
597
- traits: {
598
- addresses: [{ city: 'Memphis', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT }],
599
- },
600
- };
601
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
602
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.ADDRESS_UPDATE);
603
- expect(result.isCacheStale).toBe(true);
604
- expect(result.isNonIpAddressesStale).toBe(true);
605
- });
606
- it('should return VOLATILE_ONLY when cached empty and incoming has only IP address', () => {
607
- const cachedIdentity = {
608
- identityId: 'test-id',
609
- traits: { addresses: [] },
610
- };
611
- const incomingIdentity = {
612
- identityId: 'test-id',
613
- traits: {
614
- addresses: [{ city: 'Detroit', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS }],
615
- },
616
- };
617
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
618
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.VOLATILE_ONLY);
619
- expect(result.isCacheStale).toBe(false);
620
- expect(result.isIpAddressesStale).toBe(true);
621
- expect(result.isNonIpAddressesStale).toBe(false);
622
- });
623
- it('should return NONE when both cached and incoming have empty addresses', () => {
624
- const cachedIdentity = {
625
- identityId: 'test-id',
626
- traits: { addresses: [] },
627
- };
628
- const incomingIdentity = {
629
- identityId: 'test-id',
630
- traits: { addresses: [] },
631
- };
632
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
633
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.NONE);
634
- expect(result.isAddressesStale).toBe(false);
635
- });
636
- });
637
- describe('All addresses have s field explicitly set', () => {
638
- it('should correctly identify source when all addresses have explicit s field', () => {
639
- const cachedIdentity = {
640
- identityId: 'test-id',
641
- traits: {
642
- addresses: [
643
- { city: 'IP1', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS },
644
- { city: 'IN1', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
645
- ],
646
- },
647
- };
648
- const incomingIdentity = {
649
- identityId: 'test-id',
650
- traits: {
651
- addresses: [
652
- { city: 'IP1', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS },
653
- { city: 'IN1', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
654
- { city: 'IP2', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS },
655
- { city: 'IN2', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
656
- ],
657
- },
658
- };
659
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
660
- expect(result.isIpAddressesStale).toBe(true);
661
- expect(result.isNonIpAddressesStale).toBe(true);
662
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.ADDRESS_UPDATE);
663
- });
664
- });
665
- describe('Mixed addresses: some IP, some input — only input changes', () => {
666
- it('should return ADDRESS_UPDATE when only input address changes', () => {
667
- const cachedIdentity = {
668
- identityId: 'test-id',
669
- traits: {
670
- addresses: [
671
- { city: 'IP City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS },
672
- { city: 'Input City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
673
- ],
674
- },
675
- };
676
- const incomingIdentity = {
677
- identityId: 'test-id',
678
- traits: {
679
- addresses: [
680
- { city: 'IP City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS },
681
- { city: 'Input City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
682
- { city: 'New Input City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
683
- ],
684
- },
685
- };
686
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
687
- expect(result.isIpAddressesStale).toBe(false);
688
- expect(result.isNonIpAddressesStale).toBe(true);
689
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.ADDRESS_UPDATE);
690
- });
691
- });
692
- });
693
- describe('Volatile Traits Optimization - checkScalarTraitChanged behavior', () => {
694
- afterEach(() => {
695
- jest.resetModules();
696
- });
697
- it('should NOT mark stale when incoming is empty/undefined but cached has value', () => {
698
- const cachedIdentity = {
699
- identityId: 'test-id',
700
- traits: {
701
- ipAddress: '192.168.1.1',
702
- userAgent: 'Mozilla/5.0',
703
- },
704
- };
705
- const incomingIdentity = {
706
- identityId: 'test-id',
707
- traits: {},
708
- };
709
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
710
- expect(result.isIpAddressStale).toBe(false);
711
- expect(result.isUserAgentStale).toBe(false);
712
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.NONE);
713
- });
714
- it('should mark stale when cached is undefined but incoming has value', () => {
715
- const cachedIdentity = {
716
- identityId: 'test-id',
717
- traits: {},
718
- };
719
- const incomingIdentity = {
720
- identityId: 'test-id',
721
- traits: {
722
- ipAddress: '192.168.1.1',
723
- userAgent: 'Mozilla/5.0',
724
- },
725
- };
726
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
727
- expect(result.isIpAddressStale).toBe(true);
728
- expect(result.isUserAgentStale).toBe(true);
729
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.VOLATILE_ONLY);
730
- });
731
- it('should mark stale when both have values but they differ', () => {
732
- const cachedIdentity = {
733
- identityId: 'test-id',
734
- traits: { ipAddress: '192.168.1.1' },
735
- };
736
- const incomingIdentity = {
737
- identityId: 'test-id',
738
- traits: { ipAddress: '10.0.0.1' },
739
- };
740
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
741
- expect(result.isIpAddressStale).toBe(true);
742
- });
743
- });
744
- describe('Volatile Traits Optimization - Error Handling', () => {
745
- afterEach(() => {
746
- jest.resetModules();
747
- });
748
- it('should return NONE when both identities have same identityId but malformed traits', () => {
749
- const result = (0, at_shared_utils_1.isIdentityCacheStale)({ identityId: 'test', traits: 'not-an-object' }, { identityId: 'test', traits: 123 });
750
- expect(result.isCacheStale).toBe(false);
751
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.NONE);
752
- });
753
- it('should return IDENTITY_STALE when cached identity is null but incoming has identityId', () => {
754
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(null, { identityId: 'test', traits: {} });
755
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.IDENTITY_STALE);
756
- expect(result.isCacheStale).toBe(true);
757
- expect(result.isIdentityIdStale).toBe(true);
758
- });
759
- it('should return IDENTITY_STALE when cached identity is undefined but incoming has identityId', () => {
760
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(undefined, { identityId: 'test', traits: {} });
761
- expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.IDENTITY_STALE);
762
- expect(result.isCacheStale).toBe(true);
763
- expect(result.isIdentityIdStale).toBe(true);
764
- });
765
- });
766
- describe('Volatile Traits Optimization - Backward Compatibility', () => {
767
- afterEach(() => {
768
- jest.resetModules();
769
- });
770
- it('should maintain isAddressesStale=true when either IP or non-IP addresses are stale', () => {
771
- const cachedIdentity = {
772
- identityId: 'test-id',
773
- traits: {
774
- addresses: [{ city: 'OldCity', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS }],
775
- },
776
- };
777
- const incomingIdentity = {
778
- identityId: 'test-id',
779
- traits: {
780
- addresses: [{ city: 'NewCity', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS }],
781
- },
782
- };
783
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
784
- expect(result.isAddressesStale).toBe(true);
785
- expect(result.isIpAddressesStale).toBe(true);
786
- expect(result.isNonIpAddressesStale).toBe(false);
787
- });
788
- it('should include all stale trait tracker fields', () => {
789
- const cachedIdentity = {
790
- identityId: 'test-id',
791
- traits: {},
792
- };
793
- const incomingIdentity = {
794
- identityId: 'test-id',
795
- traits: {},
796
- };
797
- const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
798
- expect(result).toHaveProperty('cachedTraits');
799
- expect(result).toHaveProperty('incomingTraits');
800
- expect(result).toHaveProperty('isIdentityIdStale');
801
- expect(result).toHaveProperty('isUserIdsStale');
802
- expect(result).toHaveProperty('isIdsStale');
803
- expect(result).toHaveProperty('isEmailsStale');
804
- expect(result).toHaveProperty('isPhonesStale');
805
- expect(result).toHaveProperty('isShopifyYIdsStale');
806
- expect(result).toHaveProperty('isGendersStale');
807
- expect(result).toHaveProperty('isDobsStale');
808
- expect(result).toHaveProperty('isAddressesStale');
809
- expect(result).toHaveProperty('isIpAddressesStale');
810
- expect(result).toHaveProperty('isNonIpAddressesStale');
811
- expect(result).toHaveProperty('isClickInfosStale');
812
- expect(result).toHaveProperty('isIpAddressStale');
813
- expect(result).toHaveProperty('isUserAgentStale');
814
- expect(result).toHaveProperty('isThirdPartyContactsStale');
815
- expect(result).toHaveProperty('isCacheStale');
816
- expect(result).toHaveProperty('staleTier');
817
- });
818
- });
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const at_tracking_event_types_1 = require("@adtrackify/at-tracking-event-types");
4
+ const at_shared_utils_1 = require("@adtrackify/at-shared-utils");
5
+ describe('Volatile Traits Optimization - Tier Classification', () => {
6
+ afterEach(() => {
7
+ jest.resetModules();
8
+ });
9
+ describe('TIER: NONE — Cache is fresh', () => {
10
+ it('should return NONE when cached and incoming are identical', () => {
11
+ const identity = {
12
+ identityId: 'test-id',
13
+ traits: {
14
+ emails: ['test@email.com'],
15
+ phones: ['+1234567890'],
16
+ ipAddress: '192.168.1.1',
17
+ userAgent: 'Mozilla/5.0',
18
+ addresses: [{ city: 'New York', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT }],
19
+ },
20
+ };
21
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(identity, identity);
22
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.NONE);
23
+ expect(result.isCacheStale).toBe(false);
24
+ expect(result.isIpAddressStale).toBe(false);
25
+ expect(result.isUserAgentStale).toBe(false);
26
+ expect(result.isEmailsStale).toBe(false);
27
+ expect(result.isAddressesStale).toBe(false);
28
+ });
29
+ it('should return NONE when incoming is subset of cached', () => {
30
+ const cachedIdentity = {
31
+ identityId: 'test-id',
32
+ traits: {
33
+ emails: ['a@email.com', 'b@email.com'],
34
+ phones: ['+1234567890', '+9876543210'],
35
+ userIds: ['user1', 'user2'],
36
+ },
37
+ };
38
+ const incomingIdentity = {
39
+ identityId: 'test-id',
40
+ traits: {
41
+ emails: ['a@email.com'],
42
+ phones: ['+1234567890'],
43
+ },
44
+ };
45
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
46
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.NONE);
47
+ expect(result.isCacheStale).toBe(false);
48
+ });
49
+ });
50
+ describe('TIER: VOLATILE_ONLY — Only session traits changed', () => {
51
+ it('should return VOLATILE_ONLY when only ipAddress is stale', () => {
52
+ const cachedIdentity = {
53
+ identityId: 'test-id',
54
+ traits: {
55
+ emails: ['test@email.com'],
56
+ ipAddress: '192.168.1.1',
57
+ },
58
+ };
59
+ const incomingIdentity = {
60
+ identityId: 'test-id',
61
+ traits: {
62
+ emails: ['test@email.com'],
63
+ ipAddress: '10.0.0.1',
64
+ },
65
+ };
66
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
67
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.VOLATILE_ONLY);
68
+ expect(result.isCacheStale).toBe(false);
69
+ expect(result.isIpAddressStale).toBe(true);
70
+ expect(result.isUserAgentStale).toBe(false);
71
+ });
72
+ it('should return VOLATILE_ONLY when only userAgent is stale', () => {
73
+ const cachedIdentity = {
74
+ identityId: 'test-id',
75
+ traits: {
76
+ emails: ['test@email.com'],
77
+ userAgent: 'Mozilla/5.0 (Windows NT 10.0)',
78
+ },
79
+ };
80
+ const incomingIdentity = {
81
+ identityId: 'test-id',
82
+ traits: {
83
+ emails: ['test@email.com'],
84
+ userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X)',
85
+ },
86
+ };
87
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
88
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.VOLATILE_ONLY);
89
+ expect(result.isCacheStale).toBe(false);
90
+ expect(result.isUserAgentStale).toBe(true);
91
+ expect(result.isIpAddressStale).toBe(false);
92
+ });
93
+ it('should return VOLATILE_ONLY when only IP-sourced addresses are stale', () => {
94
+ const cachedIdentity = {
95
+ identityId: 'test-id',
96
+ traits: {
97
+ emails: ['test@email.com'],
98
+ addresses: [{ city: 'New York', country: 'USA', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS }],
99
+ },
100
+ };
101
+ const incomingIdentity = {
102
+ identityId: 'test-id',
103
+ traits: {
104
+ emails: ['test@email.com'],
105
+ addresses: [{ city: 'Los Angeles', country: 'USA', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS }],
106
+ },
107
+ };
108
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
109
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.VOLATILE_ONLY);
110
+ expect(result.isCacheStale).toBe(false);
111
+ expect(result.isIpAddressesStale).toBe(true);
112
+ expect(result.isNonIpAddressesStale).toBe(false);
113
+ });
114
+ it('should return VOLATILE_ONLY when ipAddress AND userAgent are both stale', () => {
115
+ const cachedIdentity = {
116
+ identityId: 'test-id',
117
+ traits: {
118
+ emails: ['test@email.com'],
119
+ ipAddress: '192.168.1.1',
120
+ userAgent: 'Mozilla/5.0 (Windows)',
121
+ },
122
+ };
123
+ const incomingIdentity = {
124
+ identityId: 'test-id',
125
+ traits: {
126
+ emails: ['test@email.com'],
127
+ ipAddress: '10.0.0.1',
128
+ userAgent: 'Mozilla/5.0 (Mac)',
129
+ },
130
+ };
131
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
132
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.VOLATILE_ONLY);
133
+ expect(result.isCacheStale).toBe(false);
134
+ expect(result.isIpAddressStale).toBe(true);
135
+ expect(result.isUserAgentStale).toBe(true);
136
+ });
137
+ it('should return VOLATILE_ONLY when ipAddress AND IP-sourced address are both stale', () => {
138
+ const cachedIdentity = {
139
+ identityId: 'test-id',
140
+ traits: {
141
+ emails: ['test@email.com'],
142
+ ipAddress: '192.168.1.1',
143
+ addresses: [{ city: 'Chicago', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS }],
144
+ },
145
+ };
146
+ const incomingIdentity = {
147
+ identityId: 'test-id',
148
+ traits: {
149
+ emails: ['test@email.com'],
150
+ ipAddress: '10.0.0.1',
151
+ addresses: [{ city: 'Denver', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS }],
152
+ },
153
+ };
154
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
155
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.VOLATILE_ONLY);
156
+ expect(result.isCacheStale).toBe(false);
157
+ expect(result.isIpAddressStale).toBe(true);
158
+ expect(result.isIpAddressesStale).toBe(true);
159
+ });
160
+ it('should return VOLATILE_ONLY when all volatile traits are stale but no identity traits', () => {
161
+ const cachedIdentity = {
162
+ identityId: 'test-id',
163
+ traits: {
164
+ emails: ['test@email.com'],
165
+ ipAddress: '192.168.1.1',
166
+ userAgent: 'Mozilla/5.0 (Windows)',
167
+ addresses: [{ city: 'Seattle', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS }],
168
+ },
169
+ };
170
+ const incomingIdentity = {
171
+ identityId: 'test-id',
172
+ traits: {
173
+ emails: ['test@email.com'],
174
+ ipAddress: '172.16.0.1',
175
+ userAgent: 'Chrome/120.0',
176
+ addresses: [{ city: 'Portland', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS }],
177
+ },
178
+ };
179
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
180
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.VOLATILE_ONLY);
181
+ expect(result.isCacheStale).toBe(false);
182
+ expect(result.isIpAddressStale).toBe(true);
183
+ expect(result.isUserAgentStale).toBe(true);
184
+ expect(result.isIpAddressesStale).toBe(true);
185
+ });
186
+ });
187
+ describe('TIER: ADDRESS_UPDATE — Non-IP address changed', () => {
188
+ it('should return ADDRESS_UPDATE when only non-IP address is new', () => {
189
+ const cachedIdentity = {
190
+ identityId: 'test-id',
191
+ traits: {
192
+ emails: ['test@email.com'],
193
+ addresses: [],
194
+ },
195
+ };
196
+ const incomingIdentity = {
197
+ identityId: 'test-id',
198
+ traits: {
199
+ emails: ['test@email.com'],
200
+ addresses: [{ city: 'Boston', province: 'MA', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT }],
201
+ },
202
+ };
203
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
204
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.ADDRESS_UPDATE);
205
+ expect(result.isCacheStale).toBe(true);
206
+ expect(result.isNonIpAddressesStale).toBe(true);
207
+ expect(result.isIpAddressesStale).toBe(false);
208
+ });
209
+ it('should return ADDRESS_UPDATE when non-IP address AND volatile traits are both stale', () => {
210
+ const cachedIdentity = {
211
+ identityId: 'test-id',
212
+ traits: {
213
+ emails: ['test@email.com'],
214
+ ipAddress: '192.168.1.1',
215
+ userAgent: 'Mozilla/5.0',
216
+ addresses: [],
217
+ },
218
+ };
219
+ const incomingIdentity = {
220
+ identityId: 'test-id',
221
+ traits: {
222
+ emails: ['test@email.com'],
223
+ ipAddress: '10.0.0.1',
224
+ userAgent: 'Chrome/120.0',
225
+ addresses: [{ city: 'Austin', firstName: 'John', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT }],
226
+ },
227
+ };
228
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
229
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.ADDRESS_UPDATE);
230
+ expect(result.isCacheStale).toBe(true);
231
+ expect(result.isNonIpAddressesStale).toBe(true);
232
+ expect(result.isIpAddressStale).toBe(true);
233
+ expect(result.isUserAgentStale).toBe(true);
234
+ });
235
+ it('should return ADDRESS_UPDATE when new input address added to existing addresses', () => {
236
+ const cachedIdentity = {
237
+ identityId: 'test-id',
238
+ traits: {
239
+ emails: ['test@email.com'],
240
+ addresses: [{ city: 'Miami', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT }],
241
+ },
242
+ };
243
+ const incomingIdentity = {
244
+ identityId: 'test-id',
245
+ traits: {
246
+ emails: ['test@email.com'],
247
+ addresses: [
248
+ { city: 'Miami', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
249
+ { city: 'Tampa', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
250
+ ],
251
+ },
252
+ };
253
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
254
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.ADDRESS_UPDATE);
255
+ expect(result.isCacheStale).toBe(true);
256
+ expect(result.isNonIpAddressesStale).toBe(true);
257
+ });
258
+ it('should return ADDRESS_UPDATE when address with PII (no source field) is added', () => {
259
+ const cachedIdentity = {
260
+ identityId: 'test-id',
261
+ traits: {
262
+ emails: ['test@email.com'],
263
+ addresses: [],
264
+ },
265
+ };
266
+ const incomingIdentity = {
267
+ identityId: 'test-id',
268
+ traits: {
269
+ emails: ['test@email.com'],
270
+ addresses: [{ city: 'Dallas', firstName: 'Jane', lastName: 'Doe' }],
271
+ },
272
+ };
273
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
274
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.ADDRESS_UPDATE);
275
+ expect(result.isCacheStale).toBe(true);
276
+ expect(result.isNonIpAddressesStale).toBe(true);
277
+ });
278
+ });
279
+ describe('TIER: IDENTITY_STALE — Identity-defining traits changed', () => {
280
+ it('should return IDENTITY_STALE when emails are stale', () => {
281
+ const cachedIdentity = {
282
+ identityId: 'test-id',
283
+ traits: { emails: ['old@email.com'] },
284
+ };
285
+ const incomingIdentity = {
286
+ identityId: 'test-id',
287
+ traits: { emails: ['old@email.com', 'new@email.com'] },
288
+ };
289
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
290
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.IDENTITY_STALE);
291
+ expect(result.isCacheStale).toBe(true);
292
+ expect(result.isEmailsStale).toBe(true);
293
+ });
294
+ it('should return IDENTITY_STALE when phones are stale', () => {
295
+ const cachedIdentity = {
296
+ identityId: 'test-id',
297
+ traits: { phones: ['+1234567890'] },
298
+ };
299
+ const incomingIdentity = {
300
+ identityId: 'test-id',
301
+ traits: { phones: ['+1234567890', '+9876543210'] },
302
+ };
303
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
304
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.IDENTITY_STALE);
305
+ expect(result.isCacheStale).toBe(true);
306
+ expect(result.isPhonesStale).toBe(true);
307
+ });
308
+ it('should return IDENTITY_STALE when userIds are stale', () => {
309
+ const cachedIdentity = {
310
+ identityId: 'test-id',
311
+ traits: { userIds: ['user1'] },
312
+ };
313
+ const incomingIdentity = {
314
+ identityId: 'test-id',
315
+ traits: { userIds: ['user1', 'user2'] },
316
+ };
317
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
318
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.IDENTITY_STALE);
319
+ expect(result.isCacheStale).toBe(true);
320
+ expect(result.isUserIdsStale).toBe(true);
321
+ });
322
+ it('should return IDENTITY_STALE when clickInfos are stale', () => {
323
+ const cachedIdentity = {
324
+ identityId: 'test-id',
325
+ traits: { click: { gclid: 'old_gclid' } },
326
+ };
327
+ const incomingIdentity = {
328
+ identityId: 'test-id',
329
+ traits: { click: { gclid: 'new_gclid' } },
330
+ };
331
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
332
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.IDENTITY_STALE);
333
+ expect(result.isCacheStale).toBe(true);
334
+ expect(result.isClickInfosStale).toBe(true);
335
+ });
336
+ it('should return IDENTITY_STALE when identityId is stale', () => {
337
+ const cachedIdentity = {
338
+ identityId: 'old-id',
339
+ traits: { emails: ['test@email.com'] },
340
+ };
341
+ const incomingIdentity = {
342
+ identityId: 'new-id',
343
+ traits: { emails: ['test@email.com'] },
344
+ };
345
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
346
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.IDENTITY_STALE);
347
+ expect(result.isCacheStale).toBe(true);
348
+ expect(result.isIdentityIdStale).toBe(true);
349
+ });
350
+ it('should return IDENTITY_STALE when emails stale AND volatile traits stale (highest tier wins)', () => {
351
+ const cachedIdentity = {
352
+ identityId: 'test-id',
353
+ traits: {
354
+ emails: ['old@email.com'],
355
+ ipAddress: '192.168.1.1',
356
+ userAgent: 'Mozilla/5.0',
357
+ },
358
+ };
359
+ const incomingIdentity = {
360
+ identityId: 'test-id',
361
+ traits: {
362
+ emails: ['old@email.com', 'new@email.com'],
363
+ ipAddress: '10.0.0.1',
364
+ userAgent: 'Chrome/120.0',
365
+ },
366
+ };
367
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
368
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.IDENTITY_STALE);
369
+ expect(result.isCacheStale).toBe(true);
370
+ expect(result.isEmailsStale).toBe(true);
371
+ expect(result.isIpAddressStale).toBe(true);
372
+ expect(result.isUserAgentStale).toBe(true);
373
+ });
374
+ it('should return IDENTITY_STALE when emails stale AND non-IP address stale (highest tier wins)', () => {
375
+ const cachedIdentity = {
376
+ identityId: 'test-id',
377
+ traits: {
378
+ emails: ['old@email.com'],
379
+ addresses: [],
380
+ },
381
+ };
382
+ const incomingIdentity = {
383
+ identityId: 'test-id',
384
+ traits: {
385
+ emails: ['old@email.com', 'new@email.com'],
386
+ addresses: [{ city: 'Phoenix', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT }],
387
+ },
388
+ };
389
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
390
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.IDENTITY_STALE);
391
+ expect(result.isCacheStale).toBe(true);
392
+ expect(result.isEmailsStale).toBe(true);
393
+ expect(result.isNonIpAddressesStale).toBe(true);
394
+ });
395
+ });
396
+ });
397
+ describe('Volatile Traits Optimization - Address Source Filtering', () => {
398
+ afterEach(() => {
399
+ jest.resetModules();
400
+ });
401
+ describe('isAddressIpSourced inference', () => {
402
+ it('should treat address with s: IP_ADDRESS as IP-sourced', () => {
403
+ const cachedIdentity = {
404
+ identityId: 'test-id',
405
+ traits: { addresses: [] },
406
+ };
407
+ const incomingIdentity = {
408
+ identityId: 'test-id',
409
+ traits: {
410
+ addresses: [{ city: 'Atlanta', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS }],
411
+ },
412
+ };
413
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
414
+ expect(result.isIpAddressesStale).toBe(true);
415
+ expect(result.isNonIpAddressesStale).toBe(false);
416
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.VOLATILE_ONLY);
417
+ });
418
+ it('should treat address with s: INPUT as non-IP-sourced', () => {
419
+ const cachedIdentity = {
420
+ identityId: 'test-id',
421
+ traits: { addresses: [] },
422
+ };
423
+ const incomingIdentity = {
424
+ identityId: 'test-id',
425
+ traits: {
426
+ addresses: [{ city: 'Houston', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT }],
427
+ },
428
+ };
429
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
430
+ expect(result.isNonIpAddressesStale).toBe(true);
431
+ expect(result.isIpAddressesStale).toBe(false);
432
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.ADDRESS_UPDATE);
433
+ });
434
+ it('should treat address without s but with firstName/lastName as non-IP (inferred input)', () => {
435
+ const cachedIdentity = {
436
+ identityId: 'test-id',
437
+ traits: { addresses: [] },
438
+ };
439
+ const incomingIdentity = {
440
+ identityId: 'test-id',
441
+ traits: {
442
+ addresses: [{ city: 'San Diego', firstName: 'Alice', lastName: 'Smith' }],
443
+ },
444
+ };
445
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
446
+ expect(result.isNonIpAddressesStale).toBe(true);
447
+ expect(result.isIpAddressesStale).toBe(false);
448
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.ADDRESS_UPDATE);
449
+ });
450
+ it('should treat address without s but with email as non-IP (inferred input)', () => {
451
+ const cachedIdentity = {
452
+ identityId: 'test-id',
453
+ traits: { addresses: [] },
454
+ };
455
+ const incomingIdentity = {
456
+ identityId: 'test-id',
457
+ traits: {
458
+ addresses: [{ city: 'Sacramento', email: 'addr@email.com' }],
459
+ },
460
+ };
461
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
462
+ expect(result.isNonIpAddressesStale).toBe(true);
463
+ expect(result.isIpAddressesStale).toBe(false);
464
+ });
465
+ it('should treat address without s but with phone as non-IP (inferred input)', () => {
466
+ const cachedIdentity = {
467
+ identityId: 'test-id',
468
+ traits: { addresses: [] },
469
+ };
470
+ const incomingIdentity = {
471
+ identityId: 'test-id',
472
+ traits: {
473
+ addresses: [{ city: 'San Jose', phone: '+15551234567' }],
474
+ },
475
+ };
476
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
477
+ expect(result.isNonIpAddressesStale).toBe(true);
478
+ expect(result.isIpAddressesStale).toBe(false);
479
+ });
480
+ it('should treat address without s and without PII as IP-sourced (inferred IP)', () => {
481
+ const cachedIdentity = {
482
+ identityId: 'test-id',
483
+ traits: { addresses: [] },
484
+ };
485
+ const incomingIdentity = {
486
+ identityId: 'test-id',
487
+ traits: {
488
+ addresses: [{ city: 'Oakland', country: 'USA', countryCode: 'US' }],
489
+ },
490
+ };
491
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
492
+ expect(result.isIpAddressesStale).toBe(true);
493
+ expect(result.isNonIpAddressesStale).toBe(false);
494
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.VOLATILE_ONLY);
495
+ });
496
+ });
497
+ describe('filterAddressesBySource behavior', () => {
498
+ it('should correctly separate IP and non-IP addresses when mixed', () => {
499
+ const cachedIdentity = {
500
+ identityId: 'test-id',
501
+ traits: {
502
+ addresses: [
503
+ { city: 'IP City 1', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS },
504
+ { city: 'Input City 1', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
505
+ ],
506
+ },
507
+ };
508
+ const incomingIdentity = {
509
+ identityId: 'test-id',
510
+ traits: {
511
+ addresses: [
512
+ { city: 'New IP City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS },
513
+ { city: 'Input City 1', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
514
+ { city: 'New Input City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
515
+ ],
516
+ },
517
+ };
518
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
519
+ expect(result.isIpAddressesStale).toBe(true);
520
+ expect(result.isNonIpAddressesStale).toBe(true);
521
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.ADDRESS_UPDATE);
522
+ });
523
+ });
524
+ describe('hasNewNonIpAddress detection', () => {
525
+ it('should detect new input address as stale', () => {
526
+ const cachedIdentity = {
527
+ identityId: 'test-id',
528
+ traits: {
529
+ addresses: [{ city: 'Old City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT }],
530
+ },
531
+ };
532
+ const incomingIdentity = {
533
+ identityId: 'test-id',
534
+ traits: {
535
+ addresses: [
536
+ { city: 'Old City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
537
+ { city: 'New City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
538
+ ],
539
+ },
540
+ };
541
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
542
+ expect(result.isNonIpAddressesStale).toBe(true);
543
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.ADDRESS_UPDATE);
544
+ });
545
+ it('should NOT mark non-IP stale when only IP address is new', () => {
546
+ const cachedIdentity = {
547
+ identityId: 'test-id',
548
+ traits: {
549
+ addresses: [
550
+ { city: 'IP City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS },
551
+ { city: 'Input City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
552
+ ],
553
+ },
554
+ };
555
+ const incomingIdentity = {
556
+ identityId: 'test-id',
557
+ traits: {
558
+ addresses: [
559
+ { city: 'New IP City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS },
560
+ { city: 'Input City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
561
+ ],
562
+ },
563
+ };
564
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
565
+ expect(result.isIpAddressesStale).toBe(true);
566
+ expect(result.isNonIpAddressesStale).toBe(false);
567
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.VOLATILE_ONLY);
568
+ });
569
+ });
570
+ describe('hasNewIpAddress detection', () => {
571
+ it('should detect new IP address for tracking purposes', () => {
572
+ const cachedIdentity = {
573
+ identityId: 'test-id',
574
+ traits: {
575
+ addresses: [{ city: 'Old IP City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS }],
576
+ },
577
+ };
578
+ const incomingIdentity = {
579
+ identityId: 'test-id',
580
+ traits: {
581
+ addresses: [{ city: 'New IP City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS }],
582
+ },
583
+ };
584
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
585
+ expect(result.isIpAddressesStale).toBe(true);
586
+ expect(result.isAddressesStale).toBe(true);
587
+ });
588
+ });
589
+ describe('Empty addresses edge cases', () => {
590
+ it('should return ADDRESS_UPDATE when cached empty and incoming has non-IP address', () => {
591
+ const cachedIdentity = {
592
+ identityId: 'test-id',
593
+ traits: { addresses: [] },
594
+ };
595
+ const incomingIdentity = {
596
+ identityId: 'test-id',
597
+ traits: {
598
+ addresses: [{ city: 'Memphis', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT }],
599
+ },
600
+ };
601
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
602
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.ADDRESS_UPDATE);
603
+ expect(result.isCacheStale).toBe(true);
604
+ expect(result.isNonIpAddressesStale).toBe(true);
605
+ });
606
+ it('should return VOLATILE_ONLY when cached empty and incoming has only IP address', () => {
607
+ const cachedIdentity = {
608
+ identityId: 'test-id',
609
+ traits: { addresses: [] },
610
+ };
611
+ const incomingIdentity = {
612
+ identityId: 'test-id',
613
+ traits: {
614
+ addresses: [{ city: 'Detroit', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS }],
615
+ },
616
+ };
617
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
618
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.VOLATILE_ONLY);
619
+ expect(result.isCacheStale).toBe(false);
620
+ expect(result.isIpAddressesStale).toBe(true);
621
+ expect(result.isNonIpAddressesStale).toBe(false);
622
+ });
623
+ it('should return NONE when both cached and incoming have empty addresses', () => {
624
+ const cachedIdentity = {
625
+ identityId: 'test-id',
626
+ traits: { addresses: [] },
627
+ };
628
+ const incomingIdentity = {
629
+ identityId: 'test-id',
630
+ traits: { addresses: [] },
631
+ };
632
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
633
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.NONE);
634
+ expect(result.isAddressesStale).toBe(false);
635
+ });
636
+ });
637
+ describe('All addresses have s field explicitly set', () => {
638
+ it('should correctly identify source when all addresses have explicit s field', () => {
639
+ const cachedIdentity = {
640
+ identityId: 'test-id',
641
+ traits: {
642
+ addresses: [
643
+ { city: 'IP1', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS },
644
+ { city: 'IN1', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
645
+ ],
646
+ },
647
+ };
648
+ const incomingIdentity = {
649
+ identityId: 'test-id',
650
+ traits: {
651
+ addresses: [
652
+ { city: 'IP1', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS },
653
+ { city: 'IN1', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
654
+ { city: 'IP2', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS },
655
+ { city: 'IN2', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
656
+ ],
657
+ },
658
+ };
659
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
660
+ expect(result.isIpAddressesStale).toBe(true);
661
+ expect(result.isNonIpAddressesStale).toBe(true);
662
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.ADDRESS_UPDATE);
663
+ });
664
+ });
665
+ describe('Mixed addresses: some IP, some input — only input changes', () => {
666
+ it('should return ADDRESS_UPDATE when only input address changes', () => {
667
+ const cachedIdentity = {
668
+ identityId: 'test-id',
669
+ traits: {
670
+ addresses: [
671
+ { city: 'IP City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS },
672
+ { city: 'Input City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
673
+ ],
674
+ },
675
+ };
676
+ const incomingIdentity = {
677
+ identityId: 'test-id',
678
+ traits: {
679
+ addresses: [
680
+ { city: 'IP City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS },
681
+ { city: 'Input City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
682
+ { city: 'New Input City', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.INPUT },
683
+ ],
684
+ },
685
+ };
686
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
687
+ expect(result.isIpAddressesStale).toBe(false);
688
+ expect(result.isNonIpAddressesStale).toBe(true);
689
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.ADDRESS_UPDATE);
690
+ });
691
+ });
692
+ });
693
+ describe('Volatile Traits Optimization - checkScalarTraitChanged behavior', () => {
694
+ afterEach(() => {
695
+ jest.resetModules();
696
+ });
697
+ it('should NOT mark stale when incoming is empty/undefined but cached has value', () => {
698
+ const cachedIdentity = {
699
+ identityId: 'test-id',
700
+ traits: {
701
+ ipAddress: '192.168.1.1',
702
+ userAgent: 'Mozilla/5.0',
703
+ },
704
+ };
705
+ const incomingIdentity = {
706
+ identityId: 'test-id',
707
+ traits: {},
708
+ };
709
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
710
+ expect(result.isIpAddressStale).toBe(false);
711
+ expect(result.isUserAgentStale).toBe(false);
712
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.NONE);
713
+ });
714
+ it('should mark stale when cached is undefined but incoming has value', () => {
715
+ const cachedIdentity = {
716
+ identityId: 'test-id',
717
+ traits: {},
718
+ };
719
+ const incomingIdentity = {
720
+ identityId: 'test-id',
721
+ traits: {
722
+ ipAddress: '192.168.1.1',
723
+ userAgent: 'Mozilla/5.0',
724
+ },
725
+ };
726
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
727
+ expect(result.isIpAddressStale).toBe(true);
728
+ expect(result.isUserAgentStale).toBe(true);
729
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.VOLATILE_ONLY);
730
+ });
731
+ it('should mark stale when both have values but they differ', () => {
732
+ const cachedIdentity = {
733
+ identityId: 'test-id',
734
+ traits: { ipAddress: '192.168.1.1' },
735
+ };
736
+ const incomingIdentity = {
737
+ identityId: 'test-id',
738
+ traits: { ipAddress: '10.0.0.1' },
739
+ };
740
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
741
+ expect(result.isIpAddressStale).toBe(true);
742
+ });
743
+ });
744
+ describe('Volatile Traits Optimization - Error Handling', () => {
745
+ afterEach(() => {
746
+ jest.resetModules();
747
+ });
748
+ it('should return NONE when both identities have same identityId but malformed traits', () => {
749
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)({ identityId: 'test', traits: 'not-an-object' }, { identityId: 'test', traits: 123 });
750
+ expect(result.isCacheStale).toBe(false);
751
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.NONE);
752
+ });
753
+ it('should return IDENTITY_STALE when cached identity is null but incoming has identityId', () => {
754
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(null, { identityId: 'test', traits: {} });
755
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.IDENTITY_STALE);
756
+ expect(result.isCacheStale).toBe(true);
757
+ expect(result.isIdentityIdStale).toBe(true);
758
+ });
759
+ it('should return IDENTITY_STALE when cached identity is undefined but incoming has identityId', () => {
760
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(undefined, { identityId: 'test', traits: {} });
761
+ expect(result.staleTier).toBe(at_shared_utils_1.IDENTITY_CACHE_STALENESS_TIER.IDENTITY_STALE);
762
+ expect(result.isCacheStale).toBe(true);
763
+ expect(result.isIdentityIdStale).toBe(true);
764
+ });
765
+ });
766
+ describe('Volatile Traits Optimization - Backward Compatibility', () => {
767
+ afterEach(() => {
768
+ jest.resetModules();
769
+ });
770
+ it('should maintain isAddressesStale=true when either IP or non-IP addresses are stale', () => {
771
+ const cachedIdentity = {
772
+ identityId: 'test-id',
773
+ traits: {
774
+ addresses: [{ city: 'OldCity', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS }],
775
+ },
776
+ };
777
+ const incomingIdentity = {
778
+ identityId: 'test-id',
779
+ traits: {
780
+ addresses: [{ city: 'NewCity', s: at_tracking_event_types_1.ADDRESS_INFO_SOURCE.IP_ADDRESS }],
781
+ },
782
+ };
783
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
784
+ expect(result.isAddressesStale).toBe(true);
785
+ expect(result.isIpAddressesStale).toBe(true);
786
+ expect(result.isNonIpAddressesStale).toBe(false);
787
+ });
788
+ it('should include all stale trait tracker fields', () => {
789
+ const cachedIdentity = {
790
+ identityId: 'test-id',
791
+ traits: {},
792
+ };
793
+ const incomingIdentity = {
794
+ identityId: 'test-id',
795
+ traits: {},
796
+ };
797
+ const result = (0, at_shared_utils_1.isIdentityCacheStale)(cachedIdentity, incomingIdentity);
798
+ expect(result).toHaveProperty('cachedTraits');
799
+ expect(result).toHaveProperty('incomingTraits');
800
+ expect(result).toHaveProperty('isIdentityIdStale');
801
+ expect(result).toHaveProperty('isUserIdsStale');
802
+ expect(result).toHaveProperty('isIdsStale');
803
+ expect(result).toHaveProperty('isEmailsStale');
804
+ expect(result).toHaveProperty('isPhonesStale');
805
+ expect(result).toHaveProperty('isShopifyYIdsStale');
806
+ expect(result).toHaveProperty('isGendersStale');
807
+ expect(result).toHaveProperty('isDobsStale');
808
+ expect(result).toHaveProperty('isAddressesStale');
809
+ expect(result).toHaveProperty('isIpAddressesStale');
810
+ expect(result).toHaveProperty('isNonIpAddressesStale');
811
+ expect(result).toHaveProperty('isClickInfosStale');
812
+ expect(result).toHaveProperty('isIpAddressStale');
813
+ expect(result).toHaveProperty('isUserAgentStale');
814
+ expect(result).toHaveProperty('isThirdPartyContactsStale');
815
+ expect(result).toHaveProperty('isCacheStale');
816
+ expect(result).toHaveProperty('staleTier');
817
+ });
818
+ });
819
819
  //# sourceMappingURL=volatile-traits-optimization.spec.js.map