@drttix/drt-sdk 1.3.5 → 1.4.1

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 (312) hide show
  1. package/README.md +29 -4
  2. package/azure-pipelines.yml +2 -0
  3. package/dist/cjs/index.d.ts +1 -0
  4. package/dist/cjs/src/definitions/shopper.d.ts +2 -0
  5. package/dist/cjs/src/definitions/shopper.js +2 -0
  6. package/dist/cjs/src/functions/sdkConfig.d.ts +47 -16
  7. package/dist/cjs/src/functions/sdkConfig.js +63 -43
  8. package/dist/cjs/src/generated/portal/core/OpenAPI.js +1 -1
  9. package/dist/cjs/src/generated/portal/core/request.js +41 -7
  10. package/dist/cjs/src/generated/scanner/core/OpenAPI.js +1 -1
  11. package/dist/cjs/src/generated/scanner/core/request.js +41 -7
  12. package/dist/cjs/src/generated/scanner/index.d.ts +1 -0
  13. package/dist/cjs/src/generated/scanner/models/OrderScan.d.ts +9 -0
  14. package/dist/cjs/src/generated/scanner/models/OrderScan.js +2 -0
  15. package/dist/cjs/src/generated/scanner/models/TicketScan.d.ts +1 -0
  16. package/dist/cjs/src/generated/scanner/services/ScanningService.d.ts +16 -0
  17. package/dist/cjs/src/generated/scanner/services/ScanningService.js +28 -0
  18. package/dist/cjs/src/generated/scanner/types.d.ts +1 -0
  19. package/dist/cjs/src/generated/shopper/core/OpenAPI.js +1 -1
  20. package/dist/cjs/src/generated/shopper/core/request.js +41 -7
  21. package/dist/cjs/src/generated/shopper/index.d.ts +33 -1
  22. package/dist/cjs/src/generated/shopper/index.js +3 -1
  23. package/dist/cjs/src/generated/shopper/models/AnswerInput.d.ts +6 -0
  24. package/dist/cjs/src/generated/shopper/models/AnswerInput.js +2 -0
  25. package/dist/cjs/src/generated/shopper/models/CartAmounts.d.ts +38 -0
  26. package/dist/cjs/src/generated/shopper/models/CartAmounts.js +2 -0
  27. package/dist/cjs/src/generated/shopper/models/CartClearResult.d.ts +14 -0
  28. package/dist/cjs/src/generated/shopper/models/CartClearResult.js +2 -0
  29. package/dist/cjs/src/generated/shopper/models/CartCountsLite.d.ts +14 -0
  30. package/dist/cjs/src/generated/shopper/models/CartCountsLite.js +2 -0
  31. package/dist/cjs/src/generated/shopper/models/CartTotals.d.ts +22 -0
  32. package/dist/cjs/src/generated/shopper/models/CartTotals.js +2 -0
  33. package/dist/cjs/src/generated/shopper/models/CheckoutStep.d.ts +10 -0
  34. package/dist/cjs/src/generated/shopper/models/CheckoutStep.js +2 -0
  35. package/dist/cjs/src/generated/shopper/models/CheckoutStepsResponse.d.ts +7 -0
  36. package/dist/cjs/src/generated/shopper/models/CheckoutStepsResponse.js +2 -0
  37. package/dist/cjs/src/generated/shopper/models/CheckoutSubmitBody.d.ts +3 -13
  38. package/dist/cjs/src/generated/shopper/models/CompletePaymentBody.d.ts +30 -0
  39. package/dist/cjs/src/generated/shopper/models/CompletePaymentBody.js +2 -0
  40. package/dist/cjs/src/generated/shopper/models/ConnectedAccountResponse.d.ts +18 -0
  41. package/dist/cjs/src/generated/shopper/models/ConnectedAccountResponse.js +2 -0
  42. package/dist/cjs/src/generated/shopper/models/CorrelatedCode.d.ts +14 -0
  43. package/dist/cjs/src/generated/shopper/models/CorrelatedCode.js +2 -0
  44. package/dist/cjs/src/generated/shopper/models/CreatePaymentIntentBody.d.ts +22 -0
  45. package/dist/cjs/src/generated/shopper/models/CreatePaymentIntentBody.js +2 -0
  46. package/dist/cjs/src/generated/shopper/models/CreatePaymentIntentResponse.d.ts +47 -0
  47. package/dist/cjs/src/generated/shopper/models/CreatePaymentIntentResponse.js +2 -0
  48. package/dist/cjs/src/generated/shopper/models/EventLegend.d.ts +12 -0
  49. package/dist/cjs/src/generated/shopper/models/EventLegend.js +2 -0
  50. package/dist/cjs/src/generated/shopper/models/EventLegendItem.d.ts +9 -0
  51. package/dist/cjs/src/generated/shopper/models/EventLegendItem.js +2 -0
  52. package/dist/cjs/src/generated/shopper/models/ExchangeAnswersBody.d.ts +4 -0
  53. package/dist/cjs/src/generated/shopper/models/ExchangeAnswersBody.js +2 -0
  54. package/dist/cjs/src/generated/shopper/models/ExchangeCancelSeatResponse.d.ts +7 -0
  55. package/dist/cjs/src/generated/shopper/models/ExchangeCancelSeatResponse.js +2 -0
  56. package/dist/cjs/src/generated/shopper/models/ExchangeShow.d.ts +12 -0
  57. package/dist/cjs/src/generated/shopper/models/ExchangeShow.js +2 -0
  58. package/dist/cjs/src/generated/shopper/models/ExchangeShowsResponse.d.ts +8 -0
  59. package/dist/cjs/src/generated/shopper/models/ExchangeShowsResponse.js +2 -0
  60. package/dist/cjs/src/generated/shopper/models/ExtendTimerDto.d.ts +6 -0
  61. package/dist/cjs/src/generated/shopper/models/ExtendTimerDto.js +2 -0
  62. package/dist/cjs/src/generated/shopper/models/ExtendTimerResponseDto.d.ts +10 -0
  63. package/dist/cjs/src/generated/shopper/models/ExtendTimerResponseDto.js +2 -0
  64. package/dist/cjs/src/generated/shopper/models/FullEventDetails.d.ts +2 -0
  65. package/dist/cjs/src/generated/shopper/models/GaSelection.d.ts +24 -0
  66. package/dist/cjs/src/generated/shopper/models/GaSelection.js +2 -0
  67. package/dist/cjs/src/generated/shopper/models/GaTier.d.ts +27 -0
  68. package/dist/cjs/src/generated/shopper/models/GaTier.js +2 -0
  69. package/dist/cjs/src/generated/shopper/models/LandingPageResponse.d.ts +10 -0
  70. package/dist/cjs/src/generated/shopper/models/LandingProduct.d.ts +11 -0
  71. package/dist/cjs/src/generated/shopper/models/LandingProduct.js +2 -0
  72. package/dist/cjs/src/generated/shopper/models/LandingShow.d.ts +16 -0
  73. package/dist/cjs/src/generated/shopper/models/LandingShow.js +2 -0
  74. package/dist/cjs/src/generated/shopper/models/LandingVenue.d.ts +10 -0
  75. package/dist/cjs/src/generated/shopper/models/LandingVenue.js +2 -0
  76. package/dist/cjs/src/generated/shopper/models/NextStepResponse.d.ts +7 -0
  77. package/dist/cjs/src/generated/shopper/models/NextStepResponse.js +2 -0
  78. package/dist/cjs/src/generated/shopper/models/OrderBalance.d.ts +26 -0
  79. package/dist/cjs/src/generated/shopper/models/OrderBalance.js +2 -0
  80. package/dist/cjs/src/generated/shopper/models/OrderPaymentStatus.d.ts +14 -0
  81. package/dist/cjs/src/generated/shopper/models/OrderPaymentStatus.js +2 -0
  82. package/dist/cjs/src/generated/shopper/models/PosDefaultInfoResponse.d.ts +7 -0
  83. package/dist/cjs/src/generated/shopper/models/PosDefaultInfoResponse.js +2 -0
  84. package/dist/cjs/src/generated/shopper/models/ProductAddResponse.d.ts +4 -0
  85. package/dist/cjs/src/generated/shopper/models/SeatInCart.d.ts +8 -0
  86. package/dist/cjs/src/generated/shopper/models/SetLanguageDto.d.ts +6 -0
  87. package/dist/cjs/src/generated/shopper/models/SetLanguageDto.js +2 -0
  88. package/dist/cjs/src/generated/shopper/models/ShowExtras.d.ts +14 -0
  89. package/dist/cjs/src/generated/shopper/models/ShowExtras.js +2 -0
  90. package/dist/cjs/src/generated/shopper/models/StreamDetails.d.ts +25 -0
  91. package/dist/cjs/src/generated/shopper/models/StreamDetails.js +2 -0
  92. package/dist/cjs/src/generated/shopper/models/StreamDownloadLink.d.ts +4 -0
  93. package/dist/cjs/src/generated/shopper/models/StreamDownloadLink.js +2 -0
  94. package/dist/cjs/src/generated/shopper/services/AccountService.d.ts +20 -4
  95. package/dist/cjs/src/generated/shopper/services/AccountService.js +13 -4
  96. package/dist/cjs/src/generated/shopper/services/CartService.d.ts +76 -7
  97. package/dist/cjs/src/generated/shopper/services/CartService.js +98 -7
  98. package/dist/cjs/src/generated/shopper/services/CheckoutService.d.ts +47 -14
  99. package/dist/cjs/src/generated/shopper/services/CheckoutService.js +50 -19
  100. package/dist/cjs/src/generated/shopper/services/CodeService.d.ts +38 -5
  101. package/dist/cjs/src/generated/shopper/services/CodeService.js +39 -5
  102. package/dist/cjs/src/generated/shopper/services/DonationService.d.ts +23 -2
  103. package/dist/cjs/src/generated/shopper/services/DonationService.js +29 -2
  104. package/dist/cjs/src/generated/shopper/services/EventService.d.ts +46 -4
  105. package/dist/cjs/src/generated/shopper/services/EventService.js +59 -4
  106. package/dist/cjs/src/generated/shopper/services/GiftCardService.d.ts +25 -5
  107. package/dist/cjs/src/generated/shopper/services/GiftCardService.js +16 -5
  108. package/dist/cjs/src/generated/shopper/services/OrderService.d.ts +209 -16
  109. package/dist/cjs/src/generated/shopper/services/OrderService.js +276 -16
  110. package/dist/cjs/src/generated/shopper/services/PaymentService.d.ts +15 -3
  111. package/dist/cjs/src/generated/shopper/services/PaymentService.js +10 -3
  112. package/dist/cjs/src/generated/shopper/services/ProductService.d.ts +15 -3
  113. package/dist/cjs/src/generated/shopper/services/ProductService.js +10 -3
  114. package/dist/cjs/src/generated/shopper/services/SeatService.d.ts +30 -6
  115. package/dist/cjs/src/generated/shopper/services/SeatService.js +19 -6
  116. package/dist/cjs/src/generated/shopper/services/SessionService.d.ts +37 -2
  117. package/dist/cjs/src/generated/shopper/services/SessionService.js +51 -2
  118. package/dist/cjs/src/generated/shopper/services/StripeService.d.ts +28 -0
  119. package/dist/cjs/src/generated/shopper/services/StripeService.js +54 -0
  120. package/dist/cjs/src/generated/shopper/types.d.ts +32 -1
  121. package/dist/cjs/src/scripts/build-all.js +160 -19
  122. package/dist/cjs/src/staging/index.d.ts +1 -0
  123. package/dist/esm/index.d.ts +1 -0
  124. package/dist/esm/src/definitions/shopper.d.ts +2 -0
  125. package/dist/esm/src/definitions/shopper.js +2 -0
  126. package/dist/esm/src/functions/sdkConfig.d.ts +47 -16
  127. package/dist/esm/src/functions/sdkConfig.js +61 -41
  128. package/dist/esm/src/generated/portal/core/OpenAPI.js +1 -1
  129. package/dist/esm/src/generated/portal/core/request.js +41 -7
  130. package/dist/esm/src/generated/scanner/core/OpenAPI.js +1 -1
  131. package/dist/esm/src/generated/scanner/core/request.js +41 -7
  132. package/dist/esm/src/generated/scanner/index.d.ts +1 -0
  133. package/dist/esm/src/generated/scanner/models/OrderScan.d.ts +9 -0
  134. package/dist/esm/src/generated/scanner/models/OrderScan.js +1 -0
  135. package/dist/esm/src/generated/scanner/models/TicketScan.d.ts +1 -0
  136. package/dist/esm/src/generated/scanner/services/ScanningService.d.ts +16 -0
  137. package/dist/esm/src/generated/scanner/services/ScanningService.js +28 -0
  138. package/dist/esm/src/generated/scanner/types.d.ts +1 -0
  139. package/dist/esm/src/generated/shopper/core/OpenAPI.js +1 -1
  140. package/dist/esm/src/generated/shopper/core/request.js +41 -7
  141. package/dist/esm/src/generated/shopper/index.d.ts +33 -1
  142. package/dist/esm/src/generated/shopper/index.js +1 -0
  143. package/dist/esm/src/generated/shopper/models/AnswerInput.d.ts +6 -0
  144. package/dist/esm/src/generated/shopper/models/AnswerInput.js +1 -0
  145. package/dist/esm/src/generated/shopper/models/CartAmounts.d.ts +38 -0
  146. package/dist/esm/src/generated/shopper/models/CartAmounts.js +1 -0
  147. package/dist/esm/src/generated/shopper/models/CartClearResult.d.ts +14 -0
  148. package/dist/esm/src/generated/shopper/models/CartClearResult.js +1 -0
  149. package/dist/esm/src/generated/shopper/models/CartCountsLite.d.ts +14 -0
  150. package/dist/esm/src/generated/shopper/models/CartCountsLite.js +1 -0
  151. package/dist/esm/src/generated/shopper/models/CartTotals.d.ts +22 -0
  152. package/dist/esm/src/generated/shopper/models/CartTotals.js +1 -0
  153. package/dist/esm/src/generated/shopper/models/CheckoutStep.d.ts +10 -0
  154. package/dist/esm/src/generated/shopper/models/CheckoutStep.js +1 -0
  155. package/dist/esm/src/generated/shopper/models/CheckoutStepsResponse.d.ts +7 -0
  156. package/dist/esm/src/generated/shopper/models/CheckoutStepsResponse.js +1 -0
  157. package/dist/esm/src/generated/shopper/models/CheckoutSubmitBody.d.ts +3 -13
  158. package/dist/esm/src/generated/shopper/models/CompletePaymentBody.d.ts +30 -0
  159. package/dist/esm/src/generated/shopper/models/CompletePaymentBody.js +1 -0
  160. package/dist/esm/src/generated/shopper/models/ConnectedAccountResponse.d.ts +18 -0
  161. package/dist/esm/src/generated/shopper/models/ConnectedAccountResponse.js +1 -0
  162. package/dist/esm/src/generated/shopper/models/CorrelatedCode.d.ts +14 -0
  163. package/dist/esm/src/generated/shopper/models/CorrelatedCode.js +1 -0
  164. package/dist/esm/src/generated/shopper/models/CreatePaymentIntentBody.d.ts +22 -0
  165. package/dist/esm/src/generated/shopper/models/CreatePaymentIntentBody.js +1 -0
  166. package/dist/esm/src/generated/shopper/models/CreatePaymentIntentResponse.d.ts +47 -0
  167. package/dist/esm/src/generated/shopper/models/CreatePaymentIntentResponse.js +1 -0
  168. package/dist/esm/src/generated/shopper/models/EventLegend.d.ts +12 -0
  169. package/dist/esm/src/generated/shopper/models/EventLegend.js +1 -0
  170. package/dist/esm/src/generated/shopper/models/EventLegendItem.d.ts +9 -0
  171. package/dist/esm/src/generated/shopper/models/EventLegendItem.js +1 -0
  172. package/dist/esm/src/generated/shopper/models/ExchangeAnswersBody.d.ts +4 -0
  173. package/dist/esm/src/generated/shopper/models/ExchangeAnswersBody.js +1 -0
  174. package/dist/esm/src/generated/shopper/models/ExchangeCancelSeatResponse.d.ts +7 -0
  175. package/dist/esm/src/generated/shopper/models/ExchangeCancelSeatResponse.js +1 -0
  176. package/dist/esm/src/generated/shopper/models/ExchangeShow.d.ts +12 -0
  177. package/dist/esm/src/generated/shopper/models/ExchangeShow.js +1 -0
  178. package/dist/esm/src/generated/shopper/models/ExchangeShowsResponse.d.ts +8 -0
  179. package/dist/esm/src/generated/shopper/models/ExchangeShowsResponse.js +1 -0
  180. package/dist/esm/src/generated/shopper/models/ExtendTimerDto.d.ts +6 -0
  181. package/dist/esm/src/generated/shopper/models/ExtendTimerDto.js +1 -0
  182. package/dist/esm/src/generated/shopper/models/ExtendTimerResponseDto.d.ts +10 -0
  183. package/dist/esm/src/generated/shopper/models/ExtendTimerResponseDto.js +1 -0
  184. package/dist/esm/src/generated/shopper/models/FullEventDetails.d.ts +2 -0
  185. package/dist/esm/src/generated/shopper/models/GaSelection.d.ts +24 -0
  186. package/dist/esm/src/generated/shopper/models/GaSelection.js +1 -0
  187. package/dist/esm/src/generated/shopper/models/GaTier.d.ts +27 -0
  188. package/dist/esm/src/generated/shopper/models/GaTier.js +1 -0
  189. package/dist/esm/src/generated/shopper/models/LandingPageResponse.d.ts +10 -0
  190. package/dist/esm/src/generated/shopper/models/LandingProduct.d.ts +11 -0
  191. package/dist/esm/src/generated/shopper/models/LandingProduct.js +1 -0
  192. package/dist/esm/src/generated/shopper/models/LandingShow.d.ts +16 -0
  193. package/dist/esm/src/generated/shopper/models/LandingShow.js +1 -0
  194. package/dist/esm/src/generated/shopper/models/LandingVenue.d.ts +10 -0
  195. package/dist/esm/src/generated/shopper/models/LandingVenue.js +1 -0
  196. package/dist/esm/src/generated/shopper/models/NextStepResponse.d.ts +7 -0
  197. package/dist/esm/src/generated/shopper/models/NextStepResponse.js +1 -0
  198. package/dist/esm/src/generated/shopper/models/OrderBalance.d.ts +26 -0
  199. package/dist/esm/src/generated/shopper/models/OrderBalance.js +1 -0
  200. package/dist/esm/src/generated/shopper/models/OrderPaymentStatus.d.ts +14 -0
  201. package/dist/esm/src/generated/shopper/models/OrderPaymentStatus.js +1 -0
  202. package/dist/esm/src/generated/shopper/models/PosDefaultInfoResponse.d.ts +7 -0
  203. package/dist/esm/src/generated/shopper/models/PosDefaultInfoResponse.js +1 -0
  204. package/dist/esm/src/generated/shopper/models/ProductAddResponse.d.ts +4 -0
  205. package/dist/esm/src/generated/shopper/models/SeatInCart.d.ts +8 -0
  206. package/dist/esm/src/generated/shopper/models/SetLanguageDto.d.ts +6 -0
  207. package/dist/esm/src/generated/shopper/models/SetLanguageDto.js +1 -0
  208. package/dist/esm/src/generated/shopper/models/ShowExtras.d.ts +14 -0
  209. package/dist/esm/src/generated/shopper/models/ShowExtras.js +1 -0
  210. package/dist/esm/src/generated/shopper/models/StreamDetails.d.ts +25 -0
  211. package/dist/esm/src/generated/shopper/models/StreamDetails.js +1 -0
  212. package/dist/esm/src/generated/shopper/models/StreamDownloadLink.d.ts +4 -0
  213. package/dist/esm/src/generated/shopper/models/StreamDownloadLink.js +1 -0
  214. package/dist/esm/src/generated/shopper/services/AccountService.d.ts +20 -4
  215. package/dist/esm/src/generated/shopper/services/AccountService.js +13 -4
  216. package/dist/esm/src/generated/shopper/services/CartService.d.ts +76 -7
  217. package/dist/esm/src/generated/shopper/services/CartService.js +98 -7
  218. package/dist/esm/src/generated/shopper/services/CheckoutService.d.ts +47 -14
  219. package/dist/esm/src/generated/shopper/services/CheckoutService.js +50 -19
  220. package/dist/esm/src/generated/shopper/services/CodeService.d.ts +38 -5
  221. package/dist/esm/src/generated/shopper/services/CodeService.js +39 -5
  222. package/dist/esm/src/generated/shopper/services/DonationService.d.ts +23 -2
  223. package/dist/esm/src/generated/shopper/services/DonationService.js +29 -2
  224. package/dist/esm/src/generated/shopper/services/EventService.d.ts +46 -4
  225. package/dist/esm/src/generated/shopper/services/EventService.js +59 -4
  226. package/dist/esm/src/generated/shopper/services/GiftCardService.d.ts +25 -5
  227. package/dist/esm/src/generated/shopper/services/GiftCardService.js +16 -5
  228. package/dist/esm/src/generated/shopper/services/OrderService.d.ts +209 -16
  229. package/dist/esm/src/generated/shopper/services/OrderService.js +276 -16
  230. package/dist/esm/src/generated/shopper/services/PaymentService.d.ts +15 -3
  231. package/dist/esm/src/generated/shopper/services/PaymentService.js +10 -3
  232. package/dist/esm/src/generated/shopper/services/ProductService.d.ts +15 -3
  233. package/dist/esm/src/generated/shopper/services/ProductService.js +10 -3
  234. package/dist/esm/src/generated/shopper/services/SeatService.d.ts +30 -6
  235. package/dist/esm/src/generated/shopper/services/SeatService.js +19 -6
  236. package/dist/esm/src/generated/shopper/services/SessionService.d.ts +37 -2
  237. package/dist/esm/src/generated/shopper/services/SessionService.js +51 -2
  238. package/dist/esm/src/generated/shopper/services/StripeService.d.ts +28 -0
  239. package/dist/esm/src/generated/shopper/services/StripeService.js +50 -0
  240. package/dist/esm/src/generated/shopper/types.d.ts +32 -1
  241. package/dist/esm/src/scripts/build-all.js +160 -19
  242. package/dist/esm/src/staging/index.d.ts +1 -0
  243. package/package.json +3 -2
  244. package/pnpm-workspace.yaml +2 -0
  245. package/src/custom/custom-request.txt +43 -9
  246. package/src/definitions/shopper.ts +2 -0
  247. package/src/functions/sdkConfig.ts +91 -54
  248. package/src/generated/portal/core/OpenAPI.ts +1 -1
  249. package/src/generated/portal/core/request.ts +43 -9
  250. package/src/generated/scanner/core/OpenAPI.ts +1 -1
  251. package/src/generated/scanner/core/request.ts +43 -9
  252. package/src/generated/scanner/index.ts +1 -0
  253. package/src/generated/scanner/models/OrderScan.ts +14 -0
  254. package/src/generated/scanner/models/TicketScan.ts +1 -0
  255. package/src/generated/scanner/services/ScanningService.ts +38 -0
  256. package/src/generated/scanner/types.ts +1 -0
  257. package/src/generated/shopper/core/OpenAPI.ts +1 -1
  258. package/src/generated/shopper/core/request.ts +43 -9
  259. package/src/generated/shopper/index.ts +33 -1
  260. package/src/generated/shopper/models/AnswerInput.ts +11 -0
  261. package/src/generated/shopper/models/CartAmounts.ts +43 -0
  262. package/src/generated/shopper/models/CartClearResult.ts +19 -0
  263. package/src/generated/shopper/models/CartCountsLite.ts +19 -0
  264. package/src/generated/shopper/models/CartTotals.ts +27 -0
  265. package/src/generated/shopper/models/CheckoutStep.ts +15 -0
  266. package/src/generated/shopper/models/CheckoutStepsResponse.ts +12 -0
  267. package/src/generated/shopper/models/CheckoutSubmitBody.ts +3 -13
  268. package/src/generated/shopper/models/ConnectedAccountResponse.ts +23 -0
  269. package/src/generated/shopper/models/CorrelatedCode.ts +19 -0
  270. package/src/generated/shopper/models/CreatePaymentIntentBody.ts +27 -0
  271. package/src/generated/shopper/models/CreatePaymentIntentResponse.ts +52 -0
  272. package/src/generated/shopper/models/EventLegend.ts +17 -0
  273. package/src/generated/shopper/models/EventLegendItem.ts +14 -0
  274. package/src/generated/shopper/models/ExchangeAnswersBody.ts +9 -0
  275. package/src/generated/shopper/models/ExchangeCancelSeatResponse.ts +12 -0
  276. package/src/generated/shopper/models/ExchangeShow.ts +17 -0
  277. package/src/generated/shopper/models/ExchangeShowsResponse.ts +13 -0
  278. package/src/generated/shopper/models/ExtendTimerDto.ts +11 -0
  279. package/src/generated/shopper/models/ExtendTimerResponseDto.ts +15 -0
  280. package/src/generated/shopper/models/FullEventDetails.ts +2 -0
  281. package/src/generated/shopper/models/GaSelection.ts +29 -0
  282. package/src/generated/shopper/models/GaTier.ts +32 -0
  283. package/src/generated/shopper/models/LandingPageResponse.ts +10 -0
  284. package/src/generated/shopper/models/LandingProduct.ts +16 -0
  285. package/src/generated/shopper/models/LandingShow.ts +21 -0
  286. package/src/generated/shopper/models/LandingVenue.ts +15 -0
  287. package/src/generated/shopper/models/NextStepResponse.ts +12 -0
  288. package/src/generated/shopper/models/OrderBalance.ts +31 -0
  289. package/src/generated/shopper/models/OrderPaymentStatus.ts +19 -0
  290. package/src/generated/shopper/models/PosDefaultInfoResponse.ts +12 -0
  291. package/src/generated/shopper/models/ProductAddResponse.ts +4 -0
  292. package/src/generated/shopper/models/SeatInCart.ts +8 -0
  293. package/src/generated/shopper/models/SetLanguageDto.ts +11 -0
  294. package/src/generated/shopper/models/ShowExtras.ts +19 -0
  295. package/src/generated/shopper/models/StreamDetails.ts +30 -0
  296. package/src/generated/shopper/models/StreamDownloadLink.ts +9 -0
  297. package/src/generated/shopper/services/AccountService.ts +22 -9
  298. package/src/generated/shopper/services/CartService.ts +123 -14
  299. package/src/generated/shopper/services/CheckoutService.ts +69 -29
  300. package/src/generated/shopper/services/CodeService.ts +58 -15
  301. package/src/generated/shopper/services/DonationService.ts +38 -5
  302. package/src/generated/shopper/services/EventService.ts +77 -10
  303. package/src/generated/shopper/services/GiftCardService.ts +28 -12
  304. package/src/generated/shopper/services/OrderService.ts +356 -41
  305. package/src/generated/shopper/services/PaymentService.ts +19 -9
  306. package/src/generated/shopper/services/ProductService.ts +19 -9
  307. package/src/generated/shopper/services/SeatService.ts +38 -19
  308. package/src/generated/shopper/services/SessionService.ts +65 -5
  309. package/src/generated/shopper/services/StripeService.ts +64 -0
  310. package/src/generated/shopper/types.ts +32 -1
  311. package/src/scripts/build-all.ts +211 -26
  312. package/src/generated/shopper/models/SaveNonceBody.ts +0 -15
@@ -68,9 +68,80 @@ fs.writeFileSync(portalRequestPath, customRequestContent);
68
68
  console.log('✅ Replaced portal/core/request.ts with custom-request.txt');
69
69
  fs.writeFileSync(scannerRequestPath, customRequestContent);
70
70
  console.log('✅ Replaced scanner/core/request.ts with custom-request.txt');
71
- // Strip credential params (shopperguid/accountid/apikey) from all generated service methods.
72
- // DRT.init() injects these globally via OpenAPI.HEADERS, so callers never need to pass them.
73
- console.log('⚙️ Stripping credential params from generated services...');
71
+ // Strip/rework credential params (shopperguid/accountid/apikey) from all generated service methods.
72
+ //
73
+ // Portal and scanner: DRT.init() injects these globally via OpenAPI.HEADERS,
74
+ // so callers never need to pass them — params are removed entirely.
75
+ //
76
+ // Shopper: the three params collapse into a single optional trailing
77
+ // `context?: { shopperGuid?: string; accountId?: string }` argument, resolved
78
+ // per-call via resolveShopperHeaders(). This is what lets DRT.init({
79
+ // shopperScope: 'per-request' }) serve many shoppers/accounts from one SDK
80
+ // instance — see src/functions/sdkConfig.ts.
81
+ console.log('⚙️ Stripping/reworking credential params in generated services...');
82
+ // Finds each `public static <name>(<params>): <returnType> { <body> }` method
83
+ // by tracking paren/brace nesting (a single regex can't express "matching
84
+ // close paren/brace" when the body itself contains nested {}/() such as
85
+ // `headers: {...}` or `path: {...}`). For any method whose body calls
86
+ // resolveShopperHeaders(context) but whose parameter list doesn't already
87
+ // declare a `context` param, appends `context?: { shopperGuid?: string;
88
+ // accountId?: string }` as the last parameter.
89
+ function patchMissingContextParam(src) {
90
+ const methodStart = /public static \w+\(/g;
91
+ let result = '';
92
+ let cursor = 0;
93
+ let match;
94
+ while ((match = methodStart.exec(src))) {
95
+ const parenOpen = match.index + match[0].length - 1;
96
+ // Walk from the opening '(' to its matching ')'.
97
+ let depth = 0;
98
+ let i = parenOpen;
99
+ for (; i < src.length; i++) {
100
+ if (src[i] === '(')
101
+ depth++;
102
+ else if (src[i] === ')') {
103
+ depth--;
104
+ if (depth === 0)
105
+ break;
106
+ }
107
+ }
108
+ const parenClose = i;
109
+ // Walk forward to the method's opening '{', then to its matching '}'.
110
+ const braceOpen = src.indexOf('{', parenClose);
111
+ depth = 0;
112
+ let j = braceOpen;
113
+ for (; j < src.length; j++) {
114
+ if (src[j] === '{')
115
+ depth++;
116
+ else if (src[j] === '}') {
117
+ depth--;
118
+ if (depth === 0)
119
+ break;
120
+ }
121
+ }
122
+ const braceClose = j;
123
+ const params = src.slice(parenOpen + 1, parenClose);
124
+ const body = src.slice(braceOpen + 1, braceClose);
125
+ if (/resolveShopperHeaders\(context\)/.test(body) && !/context\?:/.test(params)) {
126
+ // Indentation of an existing parameter line (the new param
127
+ // matches it); indentation of the ')' line (preserved as-is).
128
+ const paramIndentMatch = /\r?\n([^\S\r\n]+)\S/.exec(params);
129
+ const paramIndent = paramIndentMatch ? paramIndentMatch[1] : ' ';
130
+ const closeIndentMatch = /\r?\n([^\S\r\n]*)$/.exec(params);
131
+ const closeIndent = closeIndentMatch ? closeIndentMatch[1] : ' ';
132
+ const trimmedParams = params.replace(/[,\s]*$/, '');
133
+ const sep = trimmedParams.trim() ? ',\r\n' : '\r\n';
134
+ const newParams = trimmedParams +
135
+ sep +
136
+ `${paramIndent}context?: { shopperGuid?: string; accountId?: string },\r\n${closeIndent}`;
137
+ result += src.slice(cursor, parenOpen + 1) + newParams;
138
+ cursor = parenClose;
139
+ }
140
+ methodStart.lastIndex = braceClose;
141
+ }
142
+ result += src.slice(cursor);
143
+ return result;
144
+ }
74
145
  function walkServices(dir) {
75
146
  const results = [];
76
147
  for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
@@ -85,28 +156,98 @@ function walkServices(dir) {
85
156
  return results;
86
157
  }
87
158
  const serviceFiles = walkServices(GENERATED_BASE);
159
+ const shopperServicesDir = path.join(GENERATED_BASE, 'shopper', 'services');
88
160
  for (const file of serviceFiles) {
161
+ const isShopperService = file.startsWith(shopperServicesDir);
89
162
  let src = fs.readFileSync(file, 'utf-8');
90
- let patched = src
91
- // Remove param lines from function signatures
92
- .replace(/\n\s*shopperguid: string(?:\s*\|\s*undefined)?\s*(?:=\s*undefined)?,/g, '')
93
- .replace(/\n\s*accountid: string(?:\s*\|\s*undefined)?\s*(?:=\s*undefined)?,/g, '')
94
- .replace(/\n\s*apikey: string(?:\s*\|\s*undefined)?\s*(?:=\s*undefined)?,/g, '')
95
- // Remove @param jsdoc lines
96
- .replace(/\n\s*\* @param shopperguid[^\n]*/g, '')
97
- .replace(/\n\s*\* @param accountid[^\n]*/g, '')
98
- .replace(/\n\s*\* @param apikey[^\n]*/g, '')
99
- // Remove header entries inside __request
100
- .replace(/\n\s*'shopperguid': shopperguid,/g, '')
101
- .replace(/\n\s*'accountid': accountid,/g, '')
102
- .replace(/\n\s*'apikey': apikey,/g, '')
103
- // Remove empty headers: {} blocks left behind
104
- .replace(/\n\s*headers: \{\s*\},/g, '');
163
+ let patched;
164
+ if (isShopperService) {
165
+ patched = src
166
+ // Fold the shopperguid param into an optional context param
167
+ .replace(/\n(\s*)shopperguid: string(?:\s*\|\s*undefined)?\s*(?:=\s*undefined)?,/g, '\n$1context?: { shopperGuid?: string; accountId?: string },')
168
+ // accountid/apikey are resolved from context/DRT.init() instead
169
+ .replace(/\n\s*accountid: string(?:\s*\|\s*undefined)?\s*(?:=\s*undefined)?,/g, '')
170
+ .replace(/\n\s*apikey: string(?:\s*\|\s*undefined)?\s*(?:=\s*undefined)?,/g, '')
171
+ // Rework @param jsdoc lines
172
+ .replace(/\n(\s*)\* @param shopperguid[^\n]*/g, '\n$1* @param context Optional per-call { shopperGuid, accountId } override. Falls back to the values passed to DRT.init().')
173
+ .replace(/\n\s*\* @param accountid[^\n]*/g, '')
174
+ .replace(/\n\s*\* @param apikey[^\n]*/g, '')
175
+ // Replace the credential header block with a resolver call. A few
176
+ // endpoints (e.g. DonationService.postDonation's ipAddress header)
177
+ // have an additional non-credential header — merge into those
178
+ // instead of emitting a second "headers:" key.
179
+ .replace(/\n\s*'shopperguid': shopperguid,/g, '')
180
+ .replace(/\n\s*'accountid': accountid,/g, '')
181
+ .replace(/\n\s*'apikey': apikey,/g, '')
182
+ .replace(/headers: \{\s*\},/g, 'headers: resolveShopperHeaders(context),')
183
+ .replace(/headers: \{\n(\s*)/g, 'headers: {\n$1...resolveShopperHeaders(context),\n$1')
184
+ // TS1016: a required parameter cannot follow an optional one.
185
+ // When context? was injected in place of shopperguid (which appeared
186
+ // before requestBody in the original spec), it ends up before a
187
+ // required requestBody param. Move context? to after requestBody.
188
+ // Note: blank "lines" between params may be orphaned \r chars (CRLF
189
+ // files lose the \n when accountid/apikey lines are stripped) — use
190
+ // [\r\n]+ to match any combination of CR/LF between the two params.
191
+ .replace(/\n([^\S\n]+)context\?:\s*\{\s*shopperGuid\?:\s*string;\s*accountId\?:\s*string\s*\},[\r\n]+[^\S\n]+(requestBody:\s+[^?,\r\n][^,\r\n]*),/g, (_, indent, rbPart) => `\n${indent}${rbPart},\n${indent}context?: { shopperGuid?: string; accountId?: string },`);
192
+ // Some endpoints (e.g. Stripe's integrator-only calls) declare no
193
+ // shopperguid param, so the replace above never injects a `context`
194
+ // parameter into their signature — yet they still call
195
+ // resolveShopperHeaders(context) via the headers: {} replacement,
196
+ // leaving a dangling reference to an undeclared `context`. Add the
197
+ // param to any method signature whose body calls
198
+ // resolveShopperHeaders(context) but doesn't already declare one.
199
+ // Brace/paren nesting inside method bodies (headers: {...}, path:
200
+ // {...}, etc.) makes this unsafe to express as a single regex, so
201
+ // methods are located by tracking paren depth from `public static`
202
+ // through the matching close-paren of the parameter list, then brace
203
+ // depth from the following `{` through the matching method-closing
204
+ // `}`.
205
+ patched = patchMissingContextParam(patched);
206
+ if (patched !== src) {
207
+ patched = patched.replace("import { request as __request } from '../core/request.js';", "import { request as __request } from '../core/request.js';\nimport { resolveShopperHeaders } from '../../../functions/sdkConfig.js';");
208
+ }
209
+ }
210
+ else {
211
+ patched = src
212
+ // Remove param lines from function signatures
213
+ .replace(/\n\s*shopperguid: string(?:\s*\|\s*undefined)?\s*(?:=\s*undefined)?,/g, '')
214
+ .replace(/\n\s*accountid: string(?:\s*\|\s*undefined)?\s*(?:=\s*undefined)?,/g, '')
215
+ .replace(/\n\s*apikey: string(?:\s*\|\s*undefined)?\s*(?:=\s*undefined)?,/g, '')
216
+ // Remove @param jsdoc lines
217
+ .replace(/\n\s*\* @param shopperguid[^\n]*/g, '')
218
+ .replace(/\n\s*\* @param accountid[^\n]*/g, '')
219
+ .replace(/\n\s*\* @param apikey[^\n]*/g, '')
220
+ // Remove header entries inside __request
221
+ .replace(/\n\s*'shopperguid': shopperguid,/g, '')
222
+ .replace(/\n\s*'accountid': accountid,/g, '')
223
+ .replace(/\n\s*'apikey': apikey,/g, '')
224
+ // Remove empty headers: {} blocks left behind
225
+ .replace(/\n\s*headers: \{\s*\},/g, '');
226
+ }
105
227
  if (patched !== src) {
106
228
  fs.writeFileSync(file, patched);
107
229
  }
108
230
  }
109
- console.log(`✅ Stripped credentials from ${serviceFiles.length} service files`);
231
+ console.log(`✅ Stripped/reworked credentials in ${serviceFiles.length} service files`);
232
+ // --- Patch portal ClientToolsTicketingLinkService to return Blob for generateFlyer
233
+ // The AdminPortal Swagger declares this as binary/pdf but openapi-typescript-codegen
234
+ // may still emit a non-Blob return type depending on the spec version. Patch as a safeguard.
235
+ const flyerServicePath = path.resolve('src/generated/portal/services/ClientToolsTicketingLinkService.ts');
236
+ if (fs.existsSync(flyerServicePath)) {
237
+ let flyerSrc = fs.readFileSync(flyerServicePath, 'utf-8');
238
+ // Remove the SuccessResponse import if present (no longer needed for this file if it was only used here)
239
+ const patchedFlyerSrc = flyerSrc
240
+ .replace(/import type \{ SuccessResponse \} from '\.\.\/models\/SuccessResponse';\n/g, '')
241
+ .replace(/\* @returns SuccessResponse [^\n]*\n(\s*\* @throws)/, '* @returns binary Returns the generated PDF Flyer as a blob\n$1')
242
+ .replace(/\): CancelablePromise<SuccessResponse> \{(\s*return __request\(OpenAPI, \{[\s\S]*?url: '\/client-tools\/ticketing-link\/flyer')/, '): CancelablePromise<Blob> {$1');
243
+ if (patchedFlyerSrc !== flyerSrc) {
244
+ fs.writeFileSync(flyerServicePath, patchedFlyerSrc);
245
+ console.log('✅ Patched generateFlyer return type to Blob');
246
+ }
247
+ else {
248
+ console.log('✅ generateFlyer already returns Blob (no patch needed)');
249
+ }
250
+ }
110
251
  // --- Generate index.ts
111
252
  console.log(`🧩 Generating DRT index...`);
112
253
  const lines = [];
@@ -31,6 +31,7 @@ export declare const DRT: {
31
31
  product: typeof import("../generated/shopper").ProductService;
32
32
  seat: typeof import("../generated/shopper").SeatService;
33
33
  session: typeof import("../generated/shopper").SessionService;
34
+ stripe: typeof import("../generated/shopper").StripeService;
34
35
  };
35
36
  scanner: {
36
37
  database: typeof import("../generated/scanner").DatabaseService;
package/package.json CHANGED
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "name": "@drttix/drt-sdk",
3
3
  "description": "DRT SDK",
4
- "version": "1.3.5",
4
+ "version": "1.4.1",
5
+
5
6
  "main": "dist/cjs/index.js",
6
7
  "module": "dist/esm/index.js",
7
8
  "types": "dist/esm/index.d.ts",
@@ -25,7 +26,7 @@
25
26
  },
26
27
  "scripts": {
27
28
  "build": "npx tsc --project tsconfig.esm.json && npx tsc --project tsconfig.cjs.json && node scripts/fix-import-extensions.mjs",
28
- "build:bundle": "npm run build && npx esbuild dist/esm/index.js --bundle --format=esm --outfile=dist/bundle/drt-sdk.js --minify",
29
+ "build:bundle": "npm run build && npx esbuild dist/esm/index.js --bundle --format=esm --outfile=dist/bundle/drt-sdk.js --minify && npx esbuild dist/esm/staging.js --bundle --format=esm --outfile=dist/bundle/staging.js --minify",
29
30
  "generate": "npx tsx src/scripts/build-all.ts && npx tsx src/scripts/build-all.ts --staging",
30
31
  "prepublishOnly": "npx tsx src/scripts/check-version-not-published.ts && npm run build"
31
32
  },
@@ -0,0 +1,2 @@
1
+ allowBuilds:
2
+ esbuild: true
@@ -260,14 +260,16 @@ export const getResponseBody = async (response: Response): Promise<any> => {
260
260
  const contentType = response.headers.get("Content-Type");
261
261
  if (contentType) {
262
262
  const jsonTypes = ["application/json", "application/problem+json"];
263
- const isJSON = jsonTypes.some((type) =>
264
- contentType.toLowerCase().startsWith(type)
265
- );
263
+ const lc = contentType.toLowerCase();
264
+ const isJSON = jsonTypes.some((type) => lc.startsWith(type));
266
265
  if (isJSON) {
267
266
  return await response.json();
268
- } else {
269
- return await response.text();
270
267
  }
268
+ // Return Blob for PDF / binary responses
269
+ if (lc.startsWith('application/pdf') || lc.startsWith('application/octet-stream')) {
270
+ return await response.blob();
271
+ }
272
+ return await response.text();
271
273
  }
272
274
  } catch (error) {
273
275
  console.error(error);
@@ -315,7 +317,37 @@ export const catchErrorCodes = (
315
317
  }
316
318
  };
317
319
 
318
- let globalCookieHeader: string | undefined;
320
+ // Cookies are cached per request "identity" rather than in one shared slot.
321
+ // Shopper calls carry shopperguid/accountid in options.headers (resolved
322
+ // per-call by resolveShopperHeaders()), so each shopper gets its own cookie
323
+ // jar instead of one shopper's session leaking into another's requests when
324
+ // a single SDK instance serves many shoppers concurrently (shopperScope:
325
+ // 'per-request'). Portal/scanner calls carry no such header and fall back to
326
+ // the single default slot, matching prior behavior.
327
+ const DEFAULT_COOKIE_KEY = "__default__";
328
+ const MAX_COOKIE_ENTRIES = 10_000;
329
+ const cookiesByKey = new Map<string, string>();
330
+
331
+ const getCookieKey = (options: ApiRequestOptions): string => {
332
+ const shopperguid = options.headers?.["shopperguid"];
333
+ const accountid = options.headers?.["accountid"];
334
+ if (isStringWithValue(shopperguid)) {
335
+ return `${shopperguid}:${isStringWithValue(accountid) ? accountid : ""}`;
336
+ }
337
+ return DEFAULT_COOKIE_KEY;
338
+ };
339
+
340
+ const storeCookie = (key: string, value: string): void => {
341
+ if (!cookiesByKey.has(key) && cookiesByKey.size >= MAX_COOKIE_ENTRIES) {
342
+ // Evict the oldest entry (Map preserves insertion order) to bound memory
343
+ // on a long-running, many-shopper backend process.
344
+ const oldestKey = cookiesByKey.keys().next().value;
345
+ if (oldestKey !== undefined) {
346
+ cookiesByKey.delete(oldestKey);
347
+ }
348
+ }
349
+ cookiesByKey.set(key, value);
350
+ };
319
351
 
320
352
  /**
321
353
  * Wraps sendRequest to capture cookies on login
@@ -330,6 +362,7 @@ export const request = <T>(
330
362
  const url = getUrl(config, options);
331
363
  const formData = getFormData(options);
332
364
  const body = getRequestBody(options);
365
+ const cookieKey = getCookieKey(options);
333
366
 
334
367
  // Before making headers, possibly attach cookie if we have it
335
368
  const baseHeaders = await getHeaders(config, options);
@@ -338,9 +371,10 @@ export const request = <T>(
338
371
  baseHeaders.forEach((value, key) => {
339
372
  headerObj[key] = value;
340
373
  });
341
- if (globalCookieHeader) {
374
+ const storedCookie = cookiesByKey.get(cookieKey);
375
+ if (storedCookie) {
342
376
  // Attach stored cookie
343
- headerObj["Cookie"] = globalCookieHeader;
377
+ headerObj["Cookie"] = storedCookie;
344
378
  }
345
379
  const headers = new Headers(headerObj);
346
380
 
@@ -359,7 +393,7 @@ export const request = <T>(
359
393
  const setCookie = response.headers.get("set-cookie");
360
394
  if (setCookie) {
361
395
  // Overwrite or append as needed
362
- globalCookieHeader = setCookie;
396
+ storeCookie(cookieKey, setCookie);
363
397
  }
364
398
 
365
399
  const responseBody = await getResponseBody(response);
@@ -12,6 +12,7 @@ import { PaymentService } from "../generated/shopper";
12
12
  import { ProductService } from "../generated/shopper";
13
13
  import { SeatService } from "../generated/shopper";
14
14
  import { SessionService } from "../generated/shopper";
15
+ import { StripeService } from "../generated/shopper";
15
16
 
16
17
  export const shopper = {
17
18
  account: AccountService,
@@ -26,6 +27,7 @@ export const shopper = {
26
27
  product: ProductService,
27
28
  seat: SeatService,
28
29
  session: SessionService,
30
+ stripe: StripeService,
29
31
  };
30
32
 
31
33
  // Re-export all types as a namespace
@@ -3,14 +3,34 @@ import { OpenAPI as ShopperAPI } from '../generated/shopper/core/OpenAPI';
3
3
  import { OpenAPI as ScannerAPI } from '../generated/scanner/core/OpenAPI';
4
4
  import { OpenAPI as PortalAPI } from '../generated/portal/core/OpenAPI';
5
5
 
6
+ export type ShopperScope = 'singleton' | 'per-request';
7
+
6
8
  export interface SDKConfig {
7
- shopperGuid: string;
8
- accountId: string;
9
9
  apiKey: string;
10
+ /**
11
+ * Required when shopperScope is 'singleton' (the default). Optional when
12
+ * shopperScope is 'per-request' — in that mode these act only as a fallback
13
+ * default, and every shopper call may override them via a trailing
14
+ * `{ shopperGuid, accountId }` context argument.
15
+ */
16
+ shopperGuid?: string;
17
+ accountId?: string;
18
+ /**
19
+ * 'singleton' (default): shopperGuid/accountId are fixed for the lifetime of
20
+ * the process, exactly like today.
21
+ *
22
+ * 'per-request': shopperGuid/accountId become optional at init() time, and
23
+ * every shopper service method accepts an optional trailing context argument
24
+ * ({ shopperGuid, accountId }) so a single SDK instance can serve requests
25
+ * for many shoppers/accounts concurrently — the intended shape for a backend
26
+ * that proxies calls on behalf of arbitrary shoppers.
27
+ */
28
+ shopperScope?: ShopperScope;
10
29
  }
11
30
 
12
31
  let isInitialized = false;
13
32
  let currentConfig: SDKConfig | null = null;
33
+ let currentShopperScope: ShopperScope = 'singleton';
14
34
 
15
35
  /**
16
36
  * Initialize the DRT SDK with credentials.
@@ -23,7 +43,7 @@ let currentConfig: SDKConfig | null = null;
23
43
  * ```javascript
24
44
  * import { DRT } from '@drttix/drt-sdk';
25
45
  *
26
- * // Initialize once
46
+ * // Initialize once (default: singleton shopper scope)
27
47
  * DRT.init({
28
48
  * shopperGuid: 'your-shopper-guid',
29
49
  * accountId: 'your-account-id',
@@ -33,26 +53,50 @@ let currentConfig: SDKConfig | null = null;
33
53
  * // Now make calls without passing credentials
34
54
  * const theme = await DRT.shopper.account.getTheme();
35
55
  * ```
56
+ *
57
+ * @example
58
+ * ```javascript
59
+ * // Backend serving many shoppers/accounts from a single SDK instance
60
+ * DRT.init({ apiKey: 'your-api-key', shopperScope: 'per-request' });
61
+ *
62
+ * // Pass shopperGuid/accountId per call instead
63
+ * await DRT.shopper.product.addProduct(body, {
64
+ * shopperGuid: req.shopperGuid,
65
+ * accountId: req.accountId,
66
+ * });
67
+ * ```
36
68
  */
37
69
  export function init(config: SDKConfig): void {
38
- if (!config.shopperGuid || !config.accountId || !config.apiKey) {
70
+ if (!config.apiKey) {
71
+ throw new Error('DRT SDK init requires apiKey');
72
+ }
73
+
74
+ const shopperScope = config.shopperScope ?? 'singleton';
75
+
76
+ if (shopperScope === 'singleton' && (!config.shopperGuid || !config.accountId)) {
39
77
  throw new Error(
40
- 'DRT SDK init requires shopperGuid, accountId, and apiKey',
78
+ 'DRT SDK init requires shopperGuid and accountId (or pass shopperScope: "per-request" to supply them per shopper call instead)',
41
79
  );
42
80
  }
43
81
 
44
82
  currentConfig = config;
83
+ currentShopperScope = shopperScope;
45
84
 
46
- const headers = {
47
- shopperguid: config.shopperGuid,
48
- accountid: config.accountId,
49
- apikey: config.apiKey,
50
- };
85
+ // Portal and scanner are always singleton-scoped: one fixed set of
86
+ // credentials for every call, applied globally via OpenAPI.HEADERS.
87
+ const sharedHeaders: Record<string, string> = { apikey: config.apiKey };
88
+ if (config.shopperGuid && config.accountId) {
89
+ sharedHeaders.shopperguid = config.shopperGuid;
90
+ sharedHeaders.accountid = config.accountId;
91
+ }
92
+ ScannerAPI.HEADERS = sharedHeaders;
93
+ PortalAPI.HEADERS = sharedHeaders;
51
94
 
52
- // Set headers on all API clients
53
- ShopperAPI.HEADERS = headers;
54
- ScannerAPI.HEADERS = headers;
55
- PortalAPI.HEADERS = headers;
95
+ // Shopper credentials are resolved per-call by resolveShopperHeaders()
96
+ // (see generated shopper services), so no global header is set here —
97
+ // that's what lets shopperScope: 'per-request' override per call without
98
+ // a global value silently taking precedence.
99
+ ShopperAPI.HEADERS = undefined;
56
100
 
57
101
  isInitialized = true;
58
102
  }
@@ -71,11 +115,19 @@ export function getConfig(): SDKConfig | null {
71
115
  return currentConfig;
72
116
  }
73
117
 
118
+ /**
119
+ * Get the shopperScope the SDK was initialized with ('singleton' if not yet initialized).
120
+ */
121
+ export function getShopperScope(): ShopperScope {
122
+ return currentShopperScope;
123
+ }
124
+
74
125
  /**
75
126
  * Reset the SDK configuration.
76
127
  */
77
128
  export function reset(): void {
78
129
  currentConfig = null;
130
+ currentShopperScope = 'singleton';
79
131
  isInitialized = false;
80
132
  ShopperAPI.HEADERS = undefined;
81
133
  ScannerAPI.HEADERS = undefined;
@@ -83,50 +135,35 @@ export function reset(): void {
83
135
  }
84
136
 
85
137
  /**
86
- * Get credentials from config, throwing if not initialized.
87
- * Used internally by wrapped services.
138
+ * Resolves the shopperguid/accountid/apikey headers for a single shopper API call.
139
+ *
140
+ * Used internally by every generated shopper service method. `context`, when
141
+ * provided, overrides the shopperGuid/accountId set at DRT.init() — this is
142
+ * what makes shopperScope: 'per-request' work. apiKey always comes from
143
+ * DRT.init(), since it identifies the calling backend, not the shopper.
88
144
  */
89
- export function getCredentials(): {
90
- shopperGuid: string;
91
- accountId: string;
92
- apiKey: string;
93
- } {
145
+ export function resolveShopperHeaders(context?: {
146
+ shopperGuid?: string;
147
+ accountId?: string;
148
+ }): Record<string, string> {
94
149
  if (!currentConfig) {
95
150
  throw new Error('DRT SDK not initialized. Call DRT.init() first.');
96
151
  }
152
+
153
+ const shopperGuid = context?.shopperGuid ?? currentConfig.shopperGuid;
154
+ const accountId = context?.accountId ?? currentConfig.accountId;
155
+
156
+ if (!shopperGuid || !accountId) {
157
+ throw new Error(
158
+ currentShopperScope === 'per-request'
159
+ ? 'No shopperGuid/accountId available for this call. DRT SDK was initialized with shopperScope: "per-request" without defaults — pass { shopperGuid, accountId } as the last argument to this call.'
160
+ : 'DRT SDK not initialized with shopperGuid/accountId. Call DRT.init() first.',
161
+ );
162
+ }
163
+
97
164
  return {
98
- shopperGuid: currentConfig.shopperGuid,
99
- accountId: currentConfig.accountId,
100
- apiKey: currentConfig.apiKey,
165
+ shopperguid: shopperGuid,
166
+ accountid: accountId,
167
+ apikey: currentConfig.apiKey,
101
168
  };
102
169
  }
103
-
104
- /**
105
- * Creates a proxy that auto-injects credentials for service methods.
106
- * Methods that take (shopperguid, accountid, apikey, ...rest) as first 3 params
107
- * will have those auto-filled from the SDK config.
108
- */
109
- export function createAutoCredentialsProxy<T extends object>(service: T): T {
110
- return new Proxy(service, {
111
- get(target, prop) {
112
- const value = (target as any)[prop];
113
- if (typeof value === 'function') {
114
- return (...args: any[]) => {
115
- // If SDK is initialized, prepend credentials
116
- if (isInitialized && currentConfig) {
117
- return value.call(
118
- target,
119
- currentConfig.shopperGuid,
120
- currentConfig.accountId,
121
- currentConfig.apiKey,
122
- ...args,
123
- );
124
- }
125
- // Otherwise call with original args
126
- return value.apply(target, args);
127
- };
128
- }
129
- return value;
130
- },
131
- });
132
- }
@@ -21,7 +21,7 @@ export type OpenAPIConfig = {
21
21
 
22
22
  export const OpenAPI: OpenAPIConfig = {
23
23
  BASE: '',
24
- VERSION: '20260623.1',
24
+ VERSION: '20260629.2',
25
25
  WITH_CREDENTIALS: false,
26
26
  CREDENTIALS: 'include',
27
27
  TOKEN: undefined,
@@ -260,14 +260,16 @@ export const getResponseBody = async (response: Response): Promise<any> => {
260
260
  const contentType = response.headers.get("Content-Type");
261
261
  if (contentType) {
262
262
  const jsonTypes = ["application/json", "application/problem+json"];
263
- const isJSON = jsonTypes.some((type) =>
264
- contentType.toLowerCase().startsWith(type)
265
- );
263
+ const lc = contentType.toLowerCase();
264
+ const isJSON = jsonTypes.some((type) => lc.startsWith(type));
266
265
  if (isJSON) {
267
266
  return await response.json();
268
- } else {
269
- return await response.text();
270
267
  }
268
+ // Return Blob for PDF / binary responses
269
+ if (lc.startsWith('application/pdf') || lc.startsWith('application/octet-stream')) {
270
+ return await response.blob();
271
+ }
272
+ return await response.text();
271
273
  }
272
274
  } catch (error) {
273
275
  console.error(error);
@@ -315,7 +317,37 @@ export const catchErrorCodes = (
315
317
  }
316
318
  };
317
319
 
318
- let globalCookieHeader: string | undefined;
320
+ // Cookies are cached per request "identity" rather than in one shared slot.
321
+ // Shopper calls carry shopperguid/accountid in options.headers (resolved
322
+ // per-call by resolveShopperHeaders()), so each shopper gets its own cookie
323
+ // jar instead of one shopper's session leaking into another's requests when
324
+ // a single SDK instance serves many shoppers concurrently (shopperScope:
325
+ // 'per-request'). Portal/scanner calls carry no such header and fall back to
326
+ // the single default slot, matching prior behavior.
327
+ const DEFAULT_COOKIE_KEY = "__default__";
328
+ const MAX_COOKIE_ENTRIES = 10_000;
329
+ const cookiesByKey = new Map<string, string>();
330
+
331
+ const getCookieKey = (options: ApiRequestOptions): string => {
332
+ const shopperguid = options.headers?.["shopperguid"];
333
+ const accountid = options.headers?.["accountid"];
334
+ if (isStringWithValue(shopperguid)) {
335
+ return `${shopperguid}:${isStringWithValue(accountid) ? accountid : ""}`;
336
+ }
337
+ return DEFAULT_COOKIE_KEY;
338
+ };
339
+
340
+ const storeCookie = (key: string, value: string): void => {
341
+ if (!cookiesByKey.has(key) && cookiesByKey.size >= MAX_COOKIE_ENTRIES) {
342
+ // Evict the oldest entry (Map preserves insertion order) to bound memory
343
+ // on a long-running, many-shopper backend process.
344
+ const oldestKey = cookiesByKey.keys().next().value;
345
+ if (oldestKey !== undefined) {
346
+ cookiesByKey.delete(oldestKey);
347
+ }
348
+ }
349
+ cookiesByKey.set(key, value);
350
+ };
319
351
 
320
352
  /**
321
353
  * Wraps sendRequest to capture cookies on login
@@ -330,6 +362,7 @@ export const request = <T>(
330
362
  const url = getUrl(config, options);
331
363
  const formData = getFormData(options);
332
364
  const body = getRequestBody(options);
365
+ const cookieKey = getCookieKey(options);
333
366
 
334
367
  // Before making headers, possibly attach cookie if we have it
335
368
  const baseHeaders = await getHeaders(config, options);
@@ -338,9 +371,10 @@ export const request = <T>(
338
371
  baseHeaders.forEach((value, key) => {
339
372
  headerObj[key] = value;
340
373
  });
341
- if (globalCookieHeader) {
374
+ const storedCookie = cookiesByKey.get(cookieKey);
375
+ if (storedCookie) {
342
376
  // Attach stored cookie
343
- headerObj["Cookie"] = globalCookieHeader;
377
+ headerObj["Cookie"] = storedCookie;
344
378
  }
345
379
  const headers = new Headers(headerObj);
346
380
 
@@ -359,7 +393,7 @@ export const request = <T>(
359
393
  const setCookie = response.headers.get("set-cookie");
360
394
  if (setCookie) {
361
395
  // Overwrite or append as needed
362
- globalCookieHeader = setCookie;
396
+ storeCookie(cookieKey, setCookie);
363
397
  }
364
398
 
365
399
  const responseBody = await getResponseBody(response);
@@ -21,7 +21,7 @@ export type OpenAPIConfig = {
21
21
 
22
22
  export const OpenAPI: OpenAPIConfig = {
23
23
  BASE: 'https://api.drttix.com/scanner-v3',
24
- VERSION: '20260307.1',
24
+ VERSION: '20260713.1',
25
25
  WITH_CREDENTIALS: false,
26
26
  CREDENTIALS: 'include',
27
27
  TOKEN: undefined,