@unidy.io/sdk 1.1.4 → 1.2.0-alpha2

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 (398) hide show
  1. package/dist/cjs/app-globals-DSKjcXX_.js.map +1 -1
  2. package/dist/cjs/{auth-store-BaxuIp4z.js → auth-store-DC9EVec8.js} +2 -3
  3. package/dist/cjs/auth-store-DC9EVec8.js.map +1 -0
  4. package/dist/cjs/{i18n-BoDZ8kd2.js → i18n-BAZB-eHh.js} +2 -8
  5. package/dist/cjs/{i18n-BoDZ8kd2.js.map → i18n-BAZB-eHh.js.map} +1 -1
  6. package/dist/cjs/{index-R2MKLaem.js → index-CvFbf5-D.js} +1477 -1105
  7. package/dist/cjs/index-CvFbf5-D.js.map +1 -0
  8. package/dist/cjs/index.cjs.js +6 -5
  9. package/dist/cjs/index.cjs.js.map +1 -1
  10. package/dist/cjs/{newsletter-helpers-DR0vsegt.js → newsletter-helpers-Dj0yYHZf.js} +61 -74
  11. package/dist/cjs/newsletter-helpers-Dj0yYHZf.js.map +1 -0
  12. package/dist/cjs/{profile-helpers-B2h2III_.js → profile-helpers-D66Ycaft.js} +3 -3
  13. package/dist/cjs/{profile-helpers-B2h2III_.js.map → profile-helpers-D66Ycaft.js.map} +1 -1
  14. package/dist/cjs/u-conditional-render.cjs.entry.js +5 -6
  15. package/dist/cjs/u-conditional-render.entry.cjs.js.map +1 -1
  16. package/dist/cjs/u-config.cjs.entry.js +5 -6
  17. package/dist/cjs/u-config.entry.cjs.js.map +1 -1
  18. package/dist/cjs/u-email-field.cjs.entry.js +2 -2
  19. package/dist/cjs/u-error-message.cjs.entry.js +3 -3
  20. package/dist/cjs/u-error-message.entry.cjs.js.map +1 -1
  21. package/dist/cjs/u-field.u-raw-field.entry.cjs.js.map +1 -1
  22. package/dist/cjs/u-field_2.cjs.entry.js +2 -2
  23. package/dist/cjs/u-full-profile.cjs.entry.js +1 -1
  24. package/dist/cjs/u-logout-button.cjs.entry.js +6 -7
  25. package/dist/cjs/u-logout-button.entry.cjs.js.map +1 -1
  26. package/dist/cjs/u-magic-code-field.cjs.entry.js +5 -6
  27. package/dist/cjs/u-magic-code-field.entry.cjs.js.map +1 -1
  28. package/dist/cjs/u-missing-field.cjs.entry.js +1 -1
  29. package/dist/cjs/u-missing-fields-submit-button.cjs.entry.js +9 -5
  30. package/dist/cjs/u-missing-fields-submit-button.entry.cjs.js.map +1 -1
  31. package/dist/cjs/u-newsletter-checkbox.cjs.entry.js +5 -6
  32. package/dist/cjs/u-newsletter-checkbox.entry.cjs.js.map +1 -1
  33. package/dist/cjs/u-newsletter-logout-button.cjs.entry.js +6 -7
  34. package/dist/cjs/u-newsletter-logout-button.entry.cjs.js.map +1 -1
  35. package/dist/cjs/u-newsletter-preference-checkbox.cjs.entry.js +5 -6
  36. package/dist/cjs/u-newsletter-preference-checkbox.entry.cjs.js.map +1 -1
  37. package/dist/cjs/u-newsletter-resend-doi-button.cjs.entry.js +4 -5
  38. package/dist/cjs/u-newsletter-resend-doi-button.entry.cjs.js.map +1 -1
  39. package/dist/cjs/u-newsletter-root.cjs.entry.js +5 -6
  40. package/dist/cjs/u-newsletter-root.entry.cjs.js.map +1 -1
  41. package/dist/cjs/u-newsletter-toggle-subscription-button.cjs.entry.js +4 -5
  42. package/dist/cjs/u-newsletter-toggle-subscription-button.entry.cjs.js.map +1 -1
  43. package/dist/cjs/u-passkey.cjs.entry.js +5 -6
  44. package/dist/cjs/u-passkey.entry.cjs.js.map +1 -1
  45. package/dist/cjs/u-password-field.cjs.entry.js +2 -2
  46. package/dist/cjs/u-profile.u-submit-button.entry.cjs.js.map +1 -1
  47. package/dist/cjs/u-profile_2.cjs.entry.js +35 -55
  48. package/dist/cjs/u-registration-button.cjs.entry.js +2 -2
  49. package/dist/cjs/u-reset-password-button.cjs.entry.js +4 -5
  50. package/dist/cjs/u-reset-password-button.entry.cjs.js.map +1 -1
  51. package/dist/cjs/u-send-magic-code-button.cjs.entry.js +5 -6
  52. package/dist/cjs/u-send-magic-code-button.entry.cjs.js.map +1 -1
  53. package/dist/cjs/u-signed-in.cjs.entry.js +1 -1
  54. package/dist/cjs/u-signin-root.cjs.entry.js +1 -1
  55. package/dist/cjs/u-signin-step.cjs.entry.js +5 -6
  56. package/dist/cjs/u-signin-step.entry.cjs.js.map +1 -1
  57. package/dist/cjs/u-signin-strategy.cjs.entry.js +1 -1
  58. package/dist/cjs/u-social-login-button.cjs.entry.js +2 -2
  59. package/dist/cjs/u-spinner.cjs.entry.js +1 -1
  60. package/dist/cjs/u-spinner.entry.cjs.js.map +1 -1
  61. package/dist/cjs/u-ticketable-list.cjs.entry.js +39 -29
  62. package/dist/cjs/u-ticketable-list.entry.cjs.js.map +1 -1
  63. package/dist/collection/api/base-client.js +129 -0
  64. package/dist/collection/api/base-client.js.map +1 -0
  65. package/dist/collection/api/base-service.js +72 -0
  66. package/dist/collection/api/base-service.js.map +1 -0
  67. package/dist/collection/api/client.js +18 -139
  68. package/dist/collection/api/client.js.map +1 -1
  69. package/dist/collection/api/index.js +25 -5
  70. package/dist/collection/api/index.js.map +1 -1
  71. package/dist/collection/api/shared.js +11 -2
  72. package/dist/collection/api/shared.js.map +1 -1
  73. package/dist/collection/api/standalone.js +88 -0
  74. package/dist/collection/api/standalone.js.map +1 -0
  75. package/dist/collection/auth/api/auth.js +66 -124
  76. package/dist/collection/auth/api/auth.js.map +1 -1
  77. package/dist/collection/auth/api/schemas.js +78 -0
  78. package/dist/collection/auth/api/schemas.js.map +1 -0
  79. package/dist/collection/auth/auth-helpers.js +47 -36
  80. package/dist/collection/auth/auth-helpers.js.map +1 -1
  81. package/dist/collection/auth/components/missing-fields-submit-button/missing-fields-submit-button.js +4 -1
  82. package/dist/collection/auth/components/missing-fields-submit-button/missing-fields-submit-button.js.map +1 -1
  83. package/dist/collection/auth/components/password-field/password-field.js +1 -1
  84. package/dist/collection/auth/passkey-auth.js +8 -6
  85. package/dist/collection/auth/passkey-auth.js.map +1 -1
  86. package/dist/collection/auth/store/auth-store.js +0 -1
  87. package/dist/collection/auth/store/auth-store.js.map +1 -1
  88. package/dist/collection/locales/de.json +0 -1
  89. package/dist/collection/locales/en.json +0 -1
  90. package/dist/collection/locales/fr.json +0 -1
  91. package/dist/collection/locales/it.json +0 -1
  92. package/dist/collection/locales/nl_be.json +0 -1
  93. package/dist/collection/locales/ro.json +0 -1
  94. package/dist/collection/newsletter/api/newsletters.js +192 -167
  95. package/dist/collection/newsletter/api/newsletters.js.map +1 -1
  96. package/dist/collection/newsletter/api/schemas.js +112 -0
  97. package/dist/collection/newsletter/api/schemas.js.map +1 -0
  98. package/dist/collection/newsletter/newsletter-helpers.js +57 -70
  99. package/dist/collection/newsletter/newsletter-helpers.js.map +1 -1
  100. package/dist/collection/profile/api/profile.js +56 -155
  101. package/dist/collection/profile/api/profile.js.map +1 -1
  102. package/dist/collection/profile/api/schemas.js +120 -0
  103. package/dist/collection/profile/api/schemas.js.map +1 -0
  104. package/dist/collection/profile/components/field/field.css +1 -1
  105. package/dist/collection/profile/components/profile/profile.js +35 -101
  106. package/dist/collection/profile/components/profile/profile.js.map +1 -1
  107. package/dist/collection/shared/components/config/config.js +2 -2
  108. package/dist/collection/shared/components/error-message/error-message.js +3 -3
  109. package/dist/collection/shared/components/error-message/error-message.js.map +1 -1
  110. package/dist/collection/shared/components/spinner/spinner.css +1 -1
  111. package/dist/collection/shared/components/submit-button/submit-button.css +1 -1
  112. package/dist/collection/ticketable/api/schemas.js +58 -9
  113. package/dist/collection/ticketable/api/schemas.js.map +1 -1
  114. package/dist/collection/ticketable/api/subscriptions.js +13 -44
  115. package/dist/collection/ticketable/api/subscriptions.js.map +1 -1
  116. package/dist/collection/ticketable/api/ticketable-service.js +74 -0
  117. package/dist/collection/ticketable/api/ticketable-service.js.map +1 -0
  118. package/dist/collection/ticketable/api/tickets.js +13 -45
  119. package/dist/collection/ticketable/api/tickets.js.map +1 -1
  120. package/dist/collection/ticketable/components/ticketable-list/ticketable-list.js +37 -77
  121. package/dist/collection/ticketable/components/ticketable-list/ticketable-list.js.map +1 -1
  122. package/dist/components/auth-store.js +0 -1
  123. package/dist/components/auth-store.js.map +1 -1
  124. package/dist/components/field.js +1 -1
  125. package/dist/components/field.js.map +1 -1
  126. package/dist/components/i18n.js +0 -6
  127. package/dist/components/i18n.js.map +1 -1
  128. package/dist/components/index.js +1 -2
  129. package/dist/components/index.js.map +1 -1
  130. package/dist/components/index2.js +1475 -1106
  131. package/dist/components/index2.js.map +1 -1
  132. package/dist/components/newsletter-helpers.js +57 -70
  133. package/dist/components/newsletter-helpers.js.map +1 -1
  134. package/dist/components/profile.js +34 -54
  135. package/dist/components/profile.js.map +1 -1
  136. package/dist/components/spinner.js +1 -1
  137. package/dist/components/spinner.js.map +1 -1
  138. package/dist/components/submit-button.js +1 -1
  139. package/dist/components/submit-button.js.map +1 -1
  140. package/dist/components/u-config.js +1 -2
  141. package/dist/components/u-config.js.map +1 -1
  142. package/dist/components/u-error-message.js +2 -2
  143. package/dist/components/u-error-message.js.map +1 -1
  144. package/dist/components/u-logout-button.js +1 -1
  145. package/dist/components/u-magic-code-field.js +1 -1
  146. package/dist/components/u-missing-fields-submit-button.js +4 -1
  147. package/dist/components/u-missing-fields-submit-button.js.map +1 -1
  148. package/dist/components/u-newsletter-root.js +1 -1
  149. package/dist/components/u-passkey.js +1 -1
  150. package/dist/components/u-reset-password-button.js +1 -1
  151. package/dist/components/u-send-magic-code-button.js +1 -1
  152. package/dist/components/u-signin-step.js +1 -1
  153. package/dist/components/u-ticketable-list.js +36 -29
  154. package/dist/components/u-ticketable-list.js.map +1 -1
  155. package/dist/esm/app-globals-CPU9ZcqZ.js.map +1 -1
  156. package/dist/esm/{auth-store-CVvBlKGv.js → auth-store-BMqUdTpC.js} +2 -3
  157. package/dist/esm/auth-store-BMqUdTpC.js.map +1 -0
  158. package/dist/esm/{i18n-CLdWzy5J.js → i18n-BANodpxG.js} +2 -8
  159. package/dist/esm/{i18n-CLdWzy5J.js.map → i18n-BANodpxG.js.map} +1 -1
  160. package/dist/esm/{index-DSDkaHWI.js → index-2p1QEJrx.js} +1477 -1108
  161. package/dist/esm/index-2p1QEJrx.js.map +1 -0
  162. package/dist/esm/index.js +3 -4
  163. package/dist/esm/index.js.map +1 -1
  164. package/dist/esm/{newsletter-helpers-Dc_24im3.js → newsletter-helpers-D64LTcSM.js} +61 -74
  165. package/dist/esm/newsletter-helpers-D64LTcSM.js.map +1 -0
  166. package/dist/esm/{profile-helpers-CglNd6Nw.js → profile-helpers-DAvXZ9Uj.js} +3 -3
  167. package/dist/esm/{profile-helpers-CglNd6Nw.js.map → profile-helpers-DAvXZ9Uj.js.map} +1 -1
  168. package/dist/esm/u-conditional-render.entry.js +5 -6
  169. package/dist/esm/u-conditional-render.entry.js.map +1 -1
  170. package/dist/esm/u-config.entry.js +4 -5
  171. package/dist/esm/u-config.entry.js.map +1 -1
  172. package/dist/esm/u-email-field.entry.js +2 -2
  173. package/dist/esm/u-error-message.entry.js +3 -3
  174. package/dist/esm/u-error-message.entry.js.map +1 -1
  175. package/dist/esm/u-field.u-raw-field.entry.js.map +1 -1
  176. package/dist/esm/u-field_2.entry.js +2 -2
  177. package/dist/esm/u-full-profile.entry.js +1 -1
  178. package/dist/esm/u-logout-button.entry.js +5 -6
  179. package/dist/esm/u-logout-button.entry.js.map +1 -1
  180. package/dist/esm/u-magic-code-field.entry.js +4 -5
  181. package/dist/esm/u-magic-code-field.entry.js.map +1 -1
  182. package/dist/esm/u-missing-field.entry.js +1 -1
  183. package/dist/esm/u-missing-fields-submit-button.entry.js +9 -5
  184. package/dist/esm/u-missing-fields-submit-button.entry.js.map +1 -1
  185. package/dist/esm/u-newsletter-checkbox.entry.js +5 -6
  186. package/dist/esm/u-newsletter-checkbox.entry.js.map +1 -1
  187. package/dist/esm/u-newsletter-logout-button.entry.js +6 -7
  188. package/dist/esm/u-newsletter-logout-button.entry.js.map +1 -1
  189. package/dist/esm/u-newsletter-preference-checkbox.entry.js +5 -6
  190. package/dist/esm/u-newsletter-preference-checkbox.entry.js.map +1 -1
  191. package/dist/esm/u-newsletter-resend-doi-button.entry.js +4 -5
  192. package/dist/esm/u-newsletter-resend-doi-button.entry.js.map +1 -1
  193. package/dist/esm/u-newsletter-root.entry.js +4 -5
  194. package/dist/esm/u-newsletter-root.entry.js.map +1 -1
  195. package/dist/esm/u-newsletter-toggle-subscription-button.entry.js +4 -5
  196. package/dist/esm/u-newsletter-toggle-subscription-button.entry.js.map +1 -1
  197. package/dist/esm/u-passkey.entry.js +4 -5
  198. package/dist/esm/u-passkey.entry.js.map +1 -1
  199. package/dist/esm/u-password-field.entry.js +2 -2
  200. package/dist/esm/u-profile.u-submit-button.entry.js.map +1 -1
  201. package/dist/esm/u-profile_2.entry.js +36 -56
  202. package/dist/esm/u-registration-button.entry.js +2 -2
  203. package/dist/esm/u-reset-password-button.entry.js +3 -4
  204. package/dist/esm/u-reset-password-button.entry.js.map +1 -1
  205. package/dist/esm/u-send-magic-code-button.entry.js +4 -5
  206. package/dist/esm/u-send-magic-code-button.entry.js.map +1 -1
  207. package/dist/esm/u-signed-in.entry.js +1 -1
  208. package/dist/esm/u-signin-root.entry.js +1 -1
  209. package/dist/esm/u-signin-step.entry.js +4 -5
  210. package/dist/esm/u-signin-step.entry.js.map +1 -1
  211. package/dist/esm/u-signin-strategy.entry.js +1 -1
  212. package/dist/esm/u-social-login-button.entry.js +2 -2
  213. package/dist/esm/u-spinner.entry.js +1 -1
  214. package/dist/esm/u-spinner.entry.js.map +1 -1
  215. package/dist/esm/u-ticketable-list.entry.js +40 -30
  216. package/dist/esm/u-ticketable-list.entry.js.map +1 -1
  217. package/dist/sdk/index.esm.js +1 -1
  218. package/dist/sdk/index.esm.js.map +1 -1
  219. package/dist/sdk/locales/de.json +0 -1
  220. package/dist/sdk/locales/en.json +0 -1
  221. package/dist/sdk/locales/fr.json +0 -1
  222. package/dist/sdk/locales/it.json +0 -1
  223. package/dist/sdk/locales/nl_be.json +0 -1
  224. package/dist/sdk/locales/ro.json +0 -1
  225. package/dist/sdk/{p-5babee6b.entry.js → p-098eef67.entry.js} +2 -2
  226. package/dist/sdk/p-0e74de96.entry.js +2 -0
  227. package/dist/sdk/p-0e74de96.entry.js.map +1 -0
  228. package/dist/sdk/p-0ed36cbb.entry.js +2 -0
  229. package/dist/sdk/p-0ed36cbb.entry.js.map +1 -0
  230. package/dist/sdk/p-1149e044.entry.js +2 -0
  231. package/dist/sdk/p-1149e044.entry.js.map +1 -0
  232. package/dist/sdk/p-16d763fd.entry.js +2 -0
  233. package/dist/sdk/p-16d763fd.entry.js.map +1 -0
  234. package/dist/sdk/p-1d404c36.entry.js +2 -0
  235. package/dist/sdk/p-1d404c36.entry.js.map +1 -0
  236. package/dist/sdk/p-32da9922.entry.js +2 -0
  237. package/dist/sdk/p-32da9922.entry.js.map +1 -0
  238. package/dist/sdk/p-3d3a9c90.entry.js +2 -0
  239. package/dist/sdk/p-3d3a9c90.entry.js.map +1 -0
  240. package/dist/sdk/p-43024bd6.entry.js +2 -0
  241. package/dist/sdk/p-43024bd6.entry.js.map +1 -0
  242. package/dist/sdk/{p-e2e7061b.entry.js → p-5da49d00.entry.js} +2 -2
  243. package/dist/sdk/{p-f961fbea.entry.js → p-67af762e.entry.js} +2 -2
  244. package/dist/sdk/{p-f961fbea.entry.js.map → p-67af762e.entry.js.map} +1 -1
  245. package/dist/sdk/p-7099bd56.entry.js +2 -0
  246. package/dist/sdk/p-7099bd56.entry.js.map +1 -0
  247. package/dist/sdk/p-745742f1.entry.js +2 -0
  248. package/dist/sdk/{p-9e71a36c.entry.js → p-74e6523f.entry.js} +2 -2
  249. package/dist/sdk/p-86d16818.entry.js +2 -0
  250. package/dist/sdk/{p-effaf86b.entry.js.map → p-86d16818.entry.js.map} +1 -1
  251. package/dist/sdk/{p-DA84OuuU.js → p-BasehRhW.js} +2 -2
  252. package/dist/sdk/{p-DA84OuuU.js.map → p-BasehRhW.js.map} +1 -1
  253. package/dist/sdk/p-C4aHo4nN.js +2 -0
  254. package/dist/sdk/p-C4aHo4nN.js.map +1 -0
  255. package/dist/sdk/p-CFiZLMAA.js.map +1 -1
  256. package/dist/sdk/p-DGDhaqCd.js +2 -0
  257. package/dist/sdk/p-DGDhaqCd.js.map +1 -0
  258. package/dist/sdk/{p-CbRhHGU5.js → p-DSq94RWc.js} +2 -2
  259. package/dist/sdk/{p-CbRhHGU5.js.map → p-DSq94RWc.js.map} +1 -1
  260. package/dist/sdk/p-DSwwVdp1.js +2 -0
  261. package/dist/sdk/p-DSwwVdp1.js.map +1 -0
  262. package/dist/sdk/p-a037bbe3.entry.js +2 -0
  263. package/dist/sdk/p-a037bbe3.entry.js.map +1 -0
  264. package/dist/sdk/p-adcb7911.entry.js +2 -0
  265. package/dist/sdk/p-adcb7911.entry.js.map +1 -0
  266. package/dist/sdk/{p-39b61f33.entry.js → p-bbbec3d4.entry.js} +2 -2
  267. package/dist/sdk/{p-f232929b.entry.js → p-c2fba7c8.entry.js} +2 -2
  268. package/dist/sdk/p-c4618822.entry.js +2 -0
  269. package/dist/sdk/p-c4618822.entry.js.map +1 -0
  270. package/dist/sdk/p-ca4e57f2.entry.js +2 -0
  271. package/dist/sdk/p-ca4e57f2.entry.js.map +1 -0
  272. package/dist/sdk/p-ce4ab77c.entry.js +2 -0
  273. package/dist/sdk/p-ce4ab77c.entry.js.map +1 -0
  274. package/dist/sdk/p-d143e097.entry.js +2 -0
  275. package/dist/sdk/p-d143e097.entry.js.map +1 -0
  276. package/dist/sdk/{p-a69b83ec.entry.js → p-e0d2397c.entry.js} +2 -2
  277. package/dist/sdk/{p-80034205.entry.js → p-e6beb9d7.entry.js} +2 -2
  278. package/dist/sdk/p-ecc7fcff.entry.js +2 -0
  279. package/dist/sdk/p-ecc7fcff.entry.js.map +1 -0
  280. package/dist/sdk/{p-2cb6a2d0.entry.js → p-f1788e52.entry.js} +2 -2
  281. package/dist/sdk/p-fb665a5c.entry.js +2 -0
  282. package/dist/sdk/p-fb665a5c.entry.js.map +1 -0
  283. package/dist/sdk/p-fc67cf07.entry.js +2 -0
  284. package/dist/sdk/p-fc67cf07.entry.js.map +1 -0
  285. package/dist/sdk/sdk.esm.js +1 -1
  286. package/dist/sdk/u-conditional-render.entry.esm.js.map +1 -1
  287. package/dist/sdk/u-config.entry.esm.js.map +1 -1
  288. package/dist/sdk/u-error-message.entry.esm.js.map +1 -1
  289. package/dist/sdk/u-field.u-raw-field.entry.esm.js.map +1 -1
  290. package/dist/sdk/u-logout-button.entry.esm.js.map +1 -1
  291. package/dist/sdk/u-magic-code-field.entry.esm.js.map +1 -1
  292. package/dist/sdk/u-missing-fields-submit-button.entry.esm.js.map +1 -1
  293. package/dist/sdk/u-newsletter-checkbox.entry.esm.js.map +1 -1
  294. package/dist/sdk/u-newsletter-logout-button.entry.esm.js.map +1 -1
  295. package/dist/sdk/u-newsletter-preference-checkbox.entry.esm.js.map +1 -1
  296. package/dist/sdk/u-newsletter-resend-doi-button.entry.esm.js.map +1 -1
  297. package/dist/sdk/u-newsletter-root.entry.esm.js.map +1 -1
  298. package/dist/sdk/u-newsletter-toggle-subscription-button.entry.esm.js.map +1 -1
  299. package/dist/sdk/u-passkey.entry.esm.js.map +1 -1
  300. package/dist/sdk/u-profile.u-submit-button.entry.esm.js.map +1 -1
  301. package/dist/sdk/u-reset-password-button.entry.esm.js.map +1 -1
  302. package/dist/sdk/u-send-magic-code-button.entry.esm.js.map +1 -1
  303. package/dist/sdk/u-signin-step.entry.esm.js.map +1 -1
  304. package/dist/sdk/u-spinner.entry.esm.js.map +1 -1
  305. package/dist/sdk/u-ticketable-list.entry.esm.js.map +1 -1
  306. package/dist/types/api/base-client.d.ts +54 -0
  307. package/dist/types/api/base-service.d.ts +62 -0
  308. package/dist/types/api/client.d.ts +9 -31
  309. package/dist/types/api/index.d.ts +1 -0
  310. package/dist/types/api/shared.d.ts +11 -0
  311. package/dist/types/api/standalone.d.ts +105 -0
  312. package/dist/types/auth/api/auth.d.ts +71 -287
  313. package/dist/types/auth/api/schemas.d.ts +572 -0
  314. package/dist/types/auth/auth-helpers.d.ts +65 -66
  315. package/dist/types/auth/store/auth-store.d.ts +3 -3
  316. package/dist/types/components.d.ts +0 -72
  317. package/dist/types/newsletter/api/newsletters.d.ts +73 -196
  318. package/dist/types/newsletter/api/schemas.d.ts +192 -0
  319. package/dist/types/profile/api/profile.d.ts +12 -237
  320. package/dist/types/profile/api/schemas.d.ts +336 -0
  321. package/dist/types/profile/components/profile/profile.d.ts +1 -17
  322. package/dist/types/shared/components/error-message/error-message.d.ts +1 -1
  323. package/dist/types/ticketable/api/schemas.d.ts +108 -15
  324. package/dist/types/ticketable/api/subscriptions.d.ts +16 -83
  325. package/dist/types/ticketable/api/ticketable-service.d.ts +39 -0
  326. package/dist/types/ticketable/api/tickets.d.ts +16 -85
  327. package/dist/types/ticketable/components/ticketable-list/ticketable-list.d.ts +2 -12
  328. package/package.json +5 -1
  329. package/dist/cjs/auth-NU3DBc-6.js +0 -581
  330. package/dist/cjs/auth-NU3DBc-6.js.map +0 -1
  331. package/dist/cjs/auth-store-BaxuIp4z.js.map +0 -1
  332. package/dist/cjs/index-R2MKLaem.js.map +0 -1
  333. package/dist/cjs/newsletter-helpers-DR0vsegt.js.map +0 -1
  334. package/dist/collection/ticketable/api/get-with-schema.js +0 -35
  335. package/dist/collection/ticketable/api/get-with-schema.js.map +0 -1
  336. package/dist/components/auth.js +0 -580
  337. package/dist/components/auth.js.map +0 -1
  338. package/dist/esm/auth-nsjRdpvS.js +0 -579
  339. package/dist/esm/auth-nsjRdpvS.js.map +0 -1
  340. package/dist/esm/auth-store-CVvBlKGv.js.map +0 -1
  341. package/dist/esm/index-DSDkaHWI.js.map +0 -1
  342. package/dist/esm/newsletter-helpers-Dc_24im3.js.map +0 -1
  343. package/dist/sdk/p-0ab98e7a.entry.js +0 -2
  344. package/dist/sdk/p-0ab98e7a.entry.js.map +0 -1
  345. package/dist/sdk/p-0d324822.entry.js +0 -2
  346. package/dist/sdk/p-0d324822.entry.js.map +0 -1
  347. package/dist/sdk/p-0fb37ee9.entry.js +0 -2
  348. package/dist/sdk/p-0fb37ee9.entry.js.map +0 -1
  349. package/dist/sdk/p-3049e73f.entry.js +0 -2
  350. package/dist/sdk/p-3049e73f.entry.js.map +0 -1
  351. package/dist/sdk/p-312b919e.entry.js +0 -2
  352. package/dist/sdk/p-312b919e.entry.js.map +0 -1
  353. package/dist/sdk/p-319c5d3b.entry.js +0 -2
  354. package/dist/sdk/p-319c5d3b.entry.js.map +0 -1
  355. package/dist/sdk/p-34b98f55.entry.js +0 -2
  356. package/dist/sdk/p-34b98f55.entry.js.map +0 -1
  357. package/dist/sdk/p-4ec3302d.entry.js +0 -2
  358. package/dist/sdk/p-4ec3302d.entry.js.map +0 -1
  359. package/dist/sdk/p-568eabbc.entry.js +0 -2
  360. package/dist/sdk/p-568eabbc.entry.js.map +0 -1
  361. package/dist/sdk/p-5b40a68b.entry.js +0 -2
  362. package/dist/sdk/p-5b40a68b.entry.js.map +0 -1
  363. package/dist/sdk/p-66587fdd.entry.js +0 -2
  364. package/dist/sdk/p-66587fdd.entry.js.map +0 -1
  365. package/dist/sdk/p-88d93d64.entry.js +0 -2
  366. package/dist/sdk/p-90e2253e.entry.js +0 -2
  367. package/dist/sdk/p-90e2253e.entry.js.map +0 -1
  368. package/dist/sdk/p-BiILQPdb.js +0 -2
  369. package/dist/sdk/p-BiILQPdb.js.map +0 -1
  370. package/dist/sdk/p-DdUvQelg.js +0 -2
  371. package/dist/sdk/p-DdUvQelg.js.map +0 -1
  372. package/dist/sdk/p-PKvQIsOt.js +0 -2
  373. package/dist/sdk/p-PKvQIsOt.js.map +0 -1
  374. package/dist/sdk/p-a4f5940f.entry.js +0 -2
  375. package/dist/sdk/p-a4f5940f.entry.js.map +0 -1
  376. package/dist/sdk/p-aMrLKr2m.js +0 -2
  377. package/dist/sdk/p-aMrLKr2m.js.map +0 -1
  378. package/dist/sdk/p-bfb04b17.entry.js +0 -2
  379. package/dist/sdk/p-bfb04b17.entry.js.map +0 -1
  380. package/dist/sdk/p-c6816542.entry.js +0 -2
  381. package/dist/sdk/p-c6816542.entry.js.map +0 -1
  382. package/dist/sdk/p-da363474.entry.js +0 -2
  383. package/dist/sdk/p-da363474.entry.js.map +0 -1
  384. package/dist/sdk/p-e54d5d38.entry.js +0 -2
  385. package/dist/sdk/p-e54d5d38.entry.js.map +0 -1
  386. package/dist/sdk/p-e81bbd62.entry.js +0 -2
  387. package/dist/sdk/p-e81bbd62.entry.js.map +0 -1
  388. package/dist/sdk/p-effaf86b.entry.js +0 -2
  389. package/dist/types/ticketable/api/get-with-schema.d.ts +0 -3
  390. /package/dist/sdk/{p-5babee6b.entry.js.map → p-098eef67.entry.js.map} +0 -0
  391. /package/dist/sdk/{p-e2e7061b.entry.js.map → p-5da49d00.entry.js.map} +0 -0
  392. /package/dist/sdk/{p-88d93d64.entry.js.map → p-745742f1.entry.js.map} +0 -0
  393. /package/dist/sdk/{p-9e71a36c.entry.js.map → p-74e6523f.entry.js.map} +0 -0
  394. /package/dist/sdk/{p-39b61f33.entry.js.map → p-bbbec3d4.entry.js.map} +0 -0
  395. /package/dist/sdk/{p-f232929b.entry.js.map → p-c2fba7c8.entry.js.map} +0 -0
  396. /package/dist/sdk/{p-a69b83ec.entry.js.map → p-e0d2397c.entry.js.map} +0 -0
  397. /package/dist/sdk/{p-80034205.entry.js.map → p-e6beb9d7.entry.js.map} +0 -0
  398. /package/dist/sdk/{p-2cb6a2d0.entry.js.map → p-f1788e52.entry.js.map} +0 -0
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Base API client with shared functionality for both browser and standalone environments.
3
+ */
4
+ /**
5
+ * Abstract base class for API clients.
6
+ * Provides shared functionality for making HTTP requests.
7
+ */
8
+ export class BaseApiClient {
9
+ /**
10
+ * Error messages that indicate a connection failure rather than a server error.
11
+ * Grouped by source/environment.
12
+ */
13
+ static CONNECTION_ERROR_MESSAGES = [
14
+ // Browser fetch API errors
15
+ "Failed to fetch", // Generic browser fetch failure (Chrome)
16
+ "NetworkError", // Firefox network error
17
+ "Load failed", // Safari network error
18
+ "The network connection was lost", // Safari connection lost
19
+ // Chromium/V8 error codes (used by Node.js and Chrome)
20
+ "ERR_CONNECTION_REFUSED", // Server not accepting connections
21
+ "ERR_NETWORK", // General network error
22
+ "ERR_INTERNET_DISCONNECTED", // No internet connection
23
+ // Node.js system error codes
24
+ "ECONNREFUSED", // Connection refused by server
25
+ "ENOTFOUND", // DNS lookup failed
26
+ "EAI_AGAIN", // Temporary DNS failure
27
+ ];
28
+ onConnectionChange;
29
+ baseUrl;
30
+ api_key;
31
+ constructor(config) {
32
+ this.baseUrl = config.baseUrl;
33
+ this.api_key = config.apiKey;
34
+ this.onConnectionChange = config.onConnectionChange;
35
+ }
36
+ isConnectionError(error) {
37
+ if (error instanceof Error) {
38
+ return BaseApiClient.CONNECTION_ERROR_MESSAGES.some((msg) => error.message.includes(msg));
39
+ }
40
+ return false;
41
+ }
42
+ setConnectionStatus(isConnected) {
43
+ this.onConnectionChange?.(isConnected);
44
+ }
45
+ baseHeaders() {
46
+ const h = new Headers();
47
+ h.set("Content-Type", "application/json");
48
+ h.set("Accept", "application/json");
49
+ h.set("Authorization", `Bearer ${this.api_key}`);
50
+ return h;
51
+ }
52
+ mergeHeaders(base, extra) {
53
+ const out = new Headers(base);
54
+ if (extra) {
55
+ new Headers(extra).forEach((v, k) => {
56
+ out.set(k, v);
57
+ });
58
+ }
59
+ return out;
60
+ }
61
+ /**
62
+ * Builds a query string from params, filtering out undefined/null values.
63
+ */
64
+ buildQueryString(params) {
65
+ if (!params)
66
+ return "";
67
+ const filtered = Object.entries(params)
68
+ .filter(([_, v]) => v !== undefined && v !== null)
69
+ .map(([k, v]) => [k, String(v)]);
70
+ if (filtered.length === 0)
71
+ return "";
72
+ return `?${new URLSearchParams(Object.fromEntries(filtered)).toString()}`;
73
+ }
74
+ async request(method, endpoint, body, headers) {
75
+ let res = null;
76
+ try {
77
+ res = await fetch(`${this.baseUrl}${endpoint}`, {
78
+ method,
79
+ ...this.getRequestOptions(),
80
+ headers: this.mergeHeaders(this.baseHeaders(), headers),
81
+ body: body ? JSON.stringify(body) : undefined,
82
+ });
83
+ let data;
84
+ try {
85
+ data = await res.json();
86
+ }
87
+ catch {
88
+ data = undefined;
89
+ }
90
+ this.setConnectionStatus(true);
91
+ return {
92
+ data,
93
+ status: res.status,
94
+ headers: res.headers,
95
+ success: res.ok,
96
+ connectionError: false,
97
+ };
98
+ }
99
+ catch (error) {
100
+ const connectionFailed = this.isConnectionError(error);
101
+ if (connectionFailed) {
102
+ this.setConnectionStatus(false);
103
+ this.handleConnectionError(error, endpoint, method);
104
+ }
105
+ return {
106
+ status: res?.status ?? (connectionFailed ? 0 : 500),
107
+ error: error instanceof Error ? error.message : String(error),
108
+ headers: res?.headers ?? new Headers(),
109
+ success: false,
110
+ data: undefined,
111
+ connectionError: connectionFailed,
112
+ };
113
+ }
114
+ }
115
+ async get(endpoint, headers, params) {
116
+ const queryString = this.buildQueryString(params);
117
+ return this.request("GET", `${endpoint}${queryString}`, undefined, headers);
118
+ }
119
+ async post(endpoint, body, headers) {
120
+ return this.request("POST", endpoint, body, headers);
121
+ }
122
+ async patch(endpoint, body, headers) {
123
+ return this.request("PATCH", endpoint, body, headers);
124
+ }
125
+ async delete(endpoint, headers) {
126
+ return this.request("DELETE", endpoint, undefined, headers);
127
+ }
128
+ }
129
+ //# sourceMappingURL=base-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-client.js","sourceRoot":"","sources":["../../src/api/base-client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Base API client with shared functionality for both browser and standalone environments.\n */\n\nexport interface ApiResponse<T> {\n data?: T;\n success: boolean;\n status: number;\n headers: Headers;\n error?: Error | string;\n connectionError?: boolean;\n}\n\nexport interface ApiClientConfig {\n baseUrl: string;\n apiKey: string;\n onConnectionChange?: (isConnected: boolean) => void;\n}\n\n/** Query parameters that can be passed to GET requests */\nexport type QueryParams = Record<string, string | number | boolean | undefined | null>;\n\n/**\n * Abstract base class for API clients.\n * Provides shared functionality for making HTTP requests.\n */\nexport abstract class BaseApiClient {\n /**\n * Error messages that indicate a connection failure rather than a server error.\n * Grouped by source/environment.\n */\n protected static readonly CONNECTION_ERROR_MESSAGES = [\n // Browser fetch API errors\n \"Failed to fetch\", // Generic browser fetch failure (Chrome)\n \"NetworkError\", // Firefox network error\n \"Load failed\", // Safari network error\n \"The network connection was lost\", // Safari connection lost\n\n // Chromium/V8 error codes (used by Node.js and Chrome)\n \"ERR_CONNECTION_REFUSED\", // Server not accepting connections\n \"ERR_NETWORK\", // General network error\n \"ERR_INTERNET_DISCONNECTED\", // No internet connection\n\n // Node.js system error codes\n \"ECONNREFUSED\", // Connection refused by server\n \"ENOTFOUND\", // DNS lookup failed\n \"EAI_AGAIN\", // Temporary DNS failure\n ];\n\n protected onConnectionChange?: (isConnected: boolean) => void;\n\n public baseUrl: string;\n public api_key: string;\n\n constructor(config: ApiClientConfig) {\n this.baseUrl = config.baseUrl;\n this.api_key = config.apiKey;\n this.onConnectionChange = config.onConnectionChange;\n }\n\n protected isConnectionError(error: unknown): boolean {\n if (error instanceof Error) {\n return BaseApiClient.CONNECTION_ERROR_MESSAGES.some((msg) => error.message.includes(msg));\n }\n return false;\n }\n\n protected setConnectionStatus(isConnected: boolean): void {\n this.onConnectionChange?.(isConnected);\n }\n\n protected baseHeaders(): Headers {\n const h = new Headers();\n h.set(\"Content-Type\", \"application/json\");\n h.set(\"Accept\", \"application/json\");\n h.set(\"Authorization\", `Bearer ${this.api_key}`);\n return h;\n }\n\n protected mergeHeaders(base: Headers, extra?: HeadersInit): Headers {\n const out = new Headers(base);\n if (extra) {\n new Headers(extra).forEach((v, k) => {\n out.set(k, v);\n });\n }\n return out;\n }\n\n /**\n * Builds a query string from params, filtering out undefined/null values.\n */\n protected buildQueryString(params?: QueryParams): string {\n if (!params) return \"\";\n\n const filtered = Object.entries(params)\n .filter(([_, v]) => v !== undefined && v !== null)\n .map(([k, v]) => [k, String(v)]);\n\n if (filtered.length === 0) return \"\";\n\n return `?${new URLSearchParams(Object.fromEntries(filtered)).toString()}`;\n }\n\n /**\n * Override this in subclasses to add environment-specific request options.\n */\n protected abstract getRequestOptions(): RequestInit;\n\n /**\n * Override this in subclasses to handle connection errors (e.g., Sentry reporting).\n */\n protected abstract handleConnectionError(error: unknown, endpoint: string, method: string): void;\n\n protected async request<T>(method: string, endpoint: string, body?: object, headers?: HeadersInit): Promise<ApiResponse<T>> {\n let res: Response | null = null;\n try {\n res = await fetch(`${this.baseUrl}${endpoint}`, {\n method,\n ...this.getRequestOptions(),\n headers: this.mergeHeaders(this.baseHeaders(), headers),\n body: body ? JSON.stringify(body) : undefined,\n });\n\n let data: T | undefined;\n try {\n data = await res.json();\n } catch {\n data = undefined;\n }\n\n this.setConnectionStatus(true);\n\n return {\n data,\n status: res.status,\n headers: res.headers,\n success: res.ok,\n connectionError: false,\n };\n } catch (error) {\n const connectionFailed = this.isConnectionError(error);\n\n if (connectionFailed) {\n this.setConnectionStatus(false);\n this.handleConnectionError(error, endpoint, method);\n }\n\n return {\n status: res?.status ?? (connectionFailed ? 0 : 500),\n error: error instanceof Error ? error.message : String(error),\n headers: res?.headers ?? new Headers(),\n success: false,\n data: undefined,\n connectionError: connectionFailed,\n };\n }\n }\n\n async get<T>(endpoint: string, headers?: HeadersInit, params?: QueryParams): Promise<ApiResponse<T>> {\n const queryString = this.buildQueryString(params);\n return this.request<T>(\"GET\", `${endpoint}${queryString}`, undefined, headers);\n }\n\n async post<T>(endpoint: string, body: object, headers?: HeadersInit): Promise<ApiResponse<T>> {\n return this.request<T>(\"POST\", endpoint, body, headers);\n }\n\n async patch<T>(endpoint: string, body: object, headers?: HeadersInit): Promise<ApiResponse<T>> {\n return this.request<T>(\"PATCH\", endpoint, body, headers);\n }\n\n async delete<T>(endpoint: string, headers?: HeadersInit): Promise<ApiResponse<T>> {\n return this.request<T>(\"DELETE\", endpoint, undefined, headers);\n }\n}\n"]}
@@ -0,0 +1,72 @@
1
+ import { SchemaValidationErrorSchema } from "./shared";
2
+ /** Default no-op error reporter */
3
+ const noopErrorReporter = {
4
+ captureException: () => { },
5
+ };
6
+ /**
7
+ * Default console logger for services.
8
+ *
9
+ * Note: This intentionally doesn't use the logger.ts module because:
10
+ * 1. Services need to work in non-browser environments (standalone/Node.js)
11
+ * 2. logger.ts is designed for Stencil components with browser-specific features
12
+ * (localStorage-based log levels, UnidyComponent mixin)
13
+ * 3. Services allow dependency injection of custom loggers for flexibility
14
+ */
15
+ const consoleLogger = {
16
+ error: console.error.bind(console),
17
+ warn: console.warn.bind(console),
18
+ info: console.info.bind(console),
19
+ debug: console.debug.bind(console),
20
+ };
21
+ export class BaseService {
22
+ client;
23
+ logger;
24
+ errorReporter;
25
+ getIdToken;
26
+ getLocale;
27
+ constructor(client, serviceName, deps) {
28
+ this.client = client;
29
+ // Use injected dependencies or defaults
30
+ this.logger = deps?.logger ?? consoleLogger;
31
+ this.errorReporter = deps?.errorReporter ?? noopErrorReporter;
32
+ this.getIdToken = deps?.getIdToken ?? (async () => null);
33
+ this.getLocale = deps?.getLocale ?? (() => "en");
34
+ // Prefix logger if using console
35
+ if (!deps?.logger) {
36
+ this.logger = {
37
+ error: (...args) => console.error(`[${serviceName}]`, ...args),
38
+ warn: (...args) => console.warn(`[${serviceName}]`, ...args),
39
+ info: (...args) => console.info(`[${serviceName}]`, ...args),
40
+ debug: (...args) => console.debug(`[${serviceName}]`, ...args),
41
+ };
42
+ }
43
+ }
44
+ handleResponse(response, handler) {
45
+ if (response.connectionError) {
46
+ return ["connection_failed", null];
47
+ }
48
+ try {
49
+ return handler();
50
+ }
51
+ catch (error) {
52
+ this.logger.error("Schema validation error", error);
53
+ this.errorReporter.captureException(error);
54
+ // Use safeParse to avoid throwing if response.data doesn't match the schema
55
+ const parsed = SchemaValidationErrorSchema.safeParse(response.data);
56
+ const schemaError = parsed.success
57
+ ? parsed.data
58
+ : { error_identifier: "schema_validation_error", errors: [String(error)] };
59
+ return ["schema_validation_error", schemaError];
60
+ }
61
+ }
62
+ buildAuthHeaders(headers) {
63
+ const filtered = Object.entries(headers).reduce((acc, [key, value]) => {
64
+ if (value !== undefined) {
65
+ acc[key] = value;
66
+ }
67
+ return acc;
68
+ }, {});
69
+ return Object.keys(filtered).length > 0 ? filtered : undefined;
70
+ }
71
+ }
72
+ //# sourceMappingURL=base-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-service.js","sourceRoot":"","sources":["../../src/api/base-service.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ApiResponse, QueryParams } from \"./base-client\";\nimport { SchemaValidationErrorSchema, type SchemaValidationError } from \"./shared\";\n\n/**\n * Minimal logger interface that services depend on\n */\nexport interface Logger {\n // biome-ignore lint/suspicious/noExplicitAny: Logger accepts any args\n error: (...args: any[]) => void;\n // biome-ignore lint/suspicious/noExplicitAny: Logger accepts any args\n warn: (...args: any[]) => void;\n // biome-ignore lint/suspicious/noExplicitAny: Logger accepts any args\n info: (...args: any[]) => void;\n // biome-ignore lint/suspicious/noExplicitAny: Logger accepts any args\n debug: (...args: any[]) => void;\n}\n\n/**\n * Error reporter interface for capturing exceptions\n */\nexport interface ErrorReporter {\n captureException: (error: unknown, context?: Record<string, unknown>) => void;\n}\n\n/**\n * Dependencies that can be injected into services\n */\nexport interface ServiceDependencies {\n /** Logger instance - defaults to console */\n logger?: Logger;\n /** Error reporter (e.g., Sentry) - defaults to no-op */\n errorReporter?: ErrorReporter;\n /** Get the current ID token for authenticated requests */\n getIdToken?: () => Promise<string | null>;\n /** Get the current locale for i18n */\n getLocale?: () => string;\n}\n\n// Helper types for unified method interfaces\nexport type Payload<T> = { payload: T };\nexport type Options<T> = { options?: Partial<T> };\n\n/**\n * API Client interface that services depend on\n */\nexport interface ApiClientInterface {\n baseUrl: string;\n api_key: string;\n get<T>(endpoint: string, headers?: HeadersInit, params?: QueryParams): Promise<ApiResponse<T>>;\n post<T>(endpoint: string, body: object, headers?: HeadersInit): Promise<ApiResponse<T>>;\n patch<T>(endpoint: string, body: object, headers?: HeadersInit): Promise<ApiResponse<T>>;\n delete<T>(endpoint: string, headers?: HeadersInit): Promise<ApiResponse<T>>;\n}\n\nexport type CommonErrors = [\"connection_failed\", null] | [\"schema_validation_error\", SchemaValidationError];\n\nexport type ServiceResult<TSuccess, TError extends string = never> =\n | CommonErrors\n | (TError extends never ? never : [TError, { error_identifier: string; [key: string]: unknown }])\n | [null, TSuccess];\n\n/** Default no-op error reporter */\nconst noopErrorReporter: ErrorReporter = {\n captureException: () => {},\n};\n\n/**\n * Default console logger for services.\n *\n * Note: This intentionally doesn't use the logger.ts module because:\n * 1. Services need to work in non-browser environments (standalone/Node.js)\n * 2. logger.ts is designed for Stencil components with browser-specific features\n * (localStorage-based log levels, UnidyComponent mixin)\n * 3. Services allow dependency injection of custom loggers for flexibility\n */\nconst consoleLogger: Logger = {\n error: console.error.bind(console),\n warn: console.warn.bind(console),\n info: console.info.bind(console),\n debug: console.debug.bind(console),\n};\n\nexport abstract class BaseService {\n protected logger: Logger;\n protected errorReporter: ErrorReporter;\n protected getIdToken: () => Promise<string | null>;\n protected getLocale: () => string;\n\n constructor(\n protected client: ApiClientInterface,\n serviceName: string,\n deps?: ServiceDependencies,\n ) {\n // Use injected dependencies or defaults\n this.logger = deps?.logger ?? consoleLogger;\n this.errorReporter = deps?.errorReporter ?? noopErrorReporter;\n this.getIdToken = deps?.getIdToken ?? (async () => null);\n this.getLocale = deps?.getLocale ?? (() => \"en\");\n\n // Prefix logger if using console\n if (!deps?.logger) {\n this.logger = {\n error: (...args) => console.error(`[${serviceName}]`, ...args),\n warn: (...args) => console.warn(`[${serviceName}]`, ...args),\n info: (...args) => console.info(`[${serviceName}]`, ...args),\n debug: (...args) => console.debug(`[${serviceName}]`, ...args),\n };\n }\n }\n\n protected handleResponse<T>(\n response: ApiResponse<unknown>,\n handler: () => T,\n ): T | [\"connection_failed\", null] | [\"schema_validation_error\", SchemaValidationError] {\n if (response.connectionError) {\n return [\"connection_failed\", null];\n }\n\n try {\n return handler();\n } catch (error) {\n this.logger.error(\"Schema validation error\", error);\n this.errorReporter.captureException(error);\n // Use safeParse to avoid throwing if response.data doesn't match the schema\n const parsed = SchemaValidationErrorSchema.safeParse(response.data);\n const schemaError: SchemaValidationError = parsed.success\n ? parsed.data\n : { error_identifier: \"schema_validation_error\", errors: [String(error)] };\n return [\"schema_validation_error\", schemaError];\n }\n }\n\n protected buildAuthHeaders(headers: Record<string, string | undefined>): HeadersInit | undefined {\n const filtered = Object.entries(headers).reduce(\n (acc, [key, value]) => {\n if (value !== undefined) {\n acc[key] = value;\n }\n return acc;\n },\n {} as Record<string, string>,\n );\n\n return Object.keys(filtered).length > 0 ? filtered : undefined;\n }\n}\n"]}
@@ -1,144 +1,23 @@
1
1
  import * as Sentry from "@sentry/browser";
2
- import { t } from "../i18n";
3
- import { createLogger } from "../logger";
4
- export class ApiClient {
5
- baseUrl;
6
- api_key;
7
- static CONNECTION_ERROR_MESSAGES = [
8
- "Failed to fetch",
9
- "NetworkError",
10
- "ERR_CONNECTION_REFUSED",
11
- "ERR_NETWORK",
12
- "ERR_INTERNET_DISCONNECTED",
13
- ];
14
- onConnectionChange;
15
- logger = createLogger("ApiClient");
16
- constructor(baseUrl, api_key, onConnectionChange) {
17
- this.baseUrl = baseUrl;
18
- this.api_key = api_key;
19
- this.api_key = api_key;
20
- this.onConnectionChange = onConnectionChange;
21
- }
22
- isConnectionError(error) {
23
- if (error instanceof Error) {
24
- return ApiClient.CONNECTION_ERROR_MESSAGES.some((msg) => error.message.includes(msg));
25
- }
26
- return false;
27
- }
28
- setConnectionStatus(isConnected) {
29
- if (this.onConnectionChange) {
30
- this.onConnectionChange(isConnected);
31
- }
32
- }
33
- baseHeaders() {
34
- const h = new Headers();
35
- h.set("Content-Type", "application/json");
36
- h.set("Accept", "application/json");
37
- h.set("Authorization", `Bearer ${this.api_key}`);
38
- return h;
39
- }
40
- mergeHeaders(base, extra) {
41
- const out = new Headers(base);
42
- if (extra) {
43
- new Headers(extra).forEach((v, k) => {
44
- out.set(k, v);
45
- });
46
- }
47
- return out;
48
- }
49
- async request(method, endpoint, body, headers) {
50
- let res = null;
51
- try {
52
- res = await fetch(`${this.baseUrl}${endpoint}`, {
53
- method,
54
- mode: "cors",
55
- credentials: "include",
56
- headers: this.mergeHeaders(this.baseHeaders(), headers),
57
- body: JSON.stringify(body) || undefined,
58
- });
59
- let data;
60
- try {
61
- data = await res.json();
62
- }
63
- catch {
64
- data = undefined;
65
- }
66
- this.setConnectionStatus(true);
67
- const response = {
68
- data,
69
- status: res.status,
70
- headers: res.headers,
71
- success: res.ok,
72
- connectionError: false,
73
- };
74
- return response;
75
- }
76
- catch (error) {
77
- const connectionFailed = this.isConnectionError(error);
78
- if (connectionFailed) {
79
- this.setConnectionStatus(false);
80
- Sentry.captureException(error, {
81
- tags: { error_type: "connection_error" },
82
- extra: { endpoint, method },
83
- });
84
- }
85
- const response = {
86
- status: res ? res.status : connectionFailed ? 0 : 500,
87
- error: error instanceof Error ? error.message : String(error),
88
- headers: res ? res.headers : new Headers(),
89
- success: false,
90
- data: undefined,
91
- connectionError: connectionFailed,
92
- };
93
- return response;
94
- }
95
- }
96
- async get(endpoint, headers) {
97
- return this.request("GET", endpoint, undefined, headers);
98
- }
99
- async post(endpoint, body, headers) {
100
- return this.request("POST", endpoint, body, headers);
101
- }
102
- async patch(endpoint, body, headers) {
103
- return this.request("PATCH", endpoint, body, headers);
104
- }
105
- async delete(endpoint, headers) {
106
- return this.request("DELETE", endpoint, undefined, headers);
107
- }
108
- getWithSchema(returnSchema, urlBuilder, paramSchema) {
109
- const fn = async (args, params) => {
110
- // Build URL
111
- const baseUrl = urlBuilder(args);
112
- // Validate and parse params with Zod if provided
113
- let queryString = "";
114
- if (paramSchema && params) {
115
- const validatedParams = paramSchema.parse(params);
116
- queryString = `?${new URLSearchParams(validatedParams).toString()}`;
117
- }
118
- const fullUrl = `${baseUrl}${queryString}`;
119
- const response = await this.get(fullUrl);
120
- if (!response.success || !response.data) {
121
- return response;
122
- }
123
- const parsed = returnSchema.safeParse(response.data);
124
- if (!parsed.success) {
125
- this.logger.error("Invalid response format", parsed.error);
126
- return {
127
- ...response,
128
- success: false,
129
- error: t("errors.invalid_response_format", {
130
- defaultValue: "Invalid response format",
131
- }),
132
- data: undefined,
133
- };
134
- }
135
- return {
136
- ...response,
137
- data: parsed.data,
138
- };
2
+ import { BaseApiClient } from "./base-client";
3
+ /**
4
+ * Browser-specific API client with CORS mode and Sentry error reporting.
5
+ */
6
+ export class ApiClient extends BaseApiClient {
7
+ constructor(baseUrl, apiKey, onConnectionChange) {
8
+ super({ baseUrl, apiKey, onConnectionChange });
9
+ }
10
+ getRequestOptions() {
11
+ return {
12
+ mode: "cors",
13
+ credentials: "include",
139
14
  };
140
- // biome-ignore lint/suspicious/noExplicitAny: fn can literally be any function
141
- return fn;
15
+ }
16
+ handleConnectionError(error, endpoint, method) {
17
+ Sentry.captureException(error, {
18
+ tags: { error_type: "connection_error" },
19
+ extra: { endpoint, method },
20
+ });
142
21
  }
143
22
  }
144
23
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Sentry from \"@sentry/browser\";\nimport { t } from \"../i18n\";\nimport type * as z from \"zod\";\nimport { createLogger } from \"../logger\";\n\nexport interface ApiResponse<T> {\n data?: T;\n success: boolean;\n status: number;\n headers: Headers;\n error?: Error | string;\n connectionError?: boolean; // when backend is unreachable (network error, connection refused, etc.)\n}\n\nexport type ApiConfig = {\n baseUrl: string;\n apiKey: string;\n onConnectionChange?: (isConnected: boolean) => void;\n};\n\nexport class ApiClient {\n private static readonly CONNECTION_ERROR_MESSAGES = [\n \"Failed to fetch\",\n \"NetworkError\",\n \"ERR_CONNECTION_REFUSED\",\n \"ERR_NETWORK\",\n \"ERR_INTERNET_DISCONNECTED\",\n ];\n\n private onConnectionChange?: (isConnected: boolean) => void;\n private logger = createLogger(\"ApiClient\");\n\n constructor(\n public baseUrl: string,\n public api_key: string,\n onConnectionChange?: (isConnected: boolean) => void,\n ) {\n this.api_key = api_key;\n this.onConnectionChange = onConnectionChange;\n }\n\n private isConnectionError(error: unknown): boolean {\n if (error instanceof Error) {\n return ApiClient.CONNECTION_ERROR_MESSAGES.some((msg) => error.message.includes(msg));\n }\n\n return false;\n }\n\n private setConnectionStatus(isConnected: boolean) {\n if (this.onConnectionChange) {\n this.onConnectionChange(isConnected);\n }\n }\n\n private baseHeaders(): Headers {\n const h = new Headers();\n h.set(\"Content-Type\", \"application/json\");\n h.set(\"Accept\", \"application/json\");\n h.set(\"Authorization\", `Bearer ${this.api_key}`);\n return h;\n }\n\n private mergeHeaders(base: Headers, extra?: HeadersInit): Headers {\n const out = new Headers(base);\n if (extra) {\n new Headers(extra).forEach((v, k) => {\n out.set(k, v);\n });\n }\n return out;\n }\n\n private async request<T>(method: string, endpoint: string, body?: object, headers?: HeadersInit): Promise<ApiResponse<T>> {\n let res: Response | null = null;\n try {\n res = await fetch(`${this.baseUrl}${endpoint}`, {\n method,\n mode: \"cors\",\n credentials: \"include\",\n headers: this.mergeHeaders(this.baseHeaders(), headers),\n body: JSON.stringify(body) || undefined,\n });\n\n let data: T | undefined;\n try {\n data = await res.json();\n } catch {\n data = undefined;\n }\n\n this.setConnectionStatus(true);\n\n const response: ApiResponse<T> = {\n data,\n status: res.status,\n headers: res.headers,\n success: res.ok,\n connectionError: false,\n };\n\n return response;\n } catch (error) {\n const connectionFailed = this.isConnectionError(error);\n\n if (connectionFailed) {\n this.setConnectionStatus(false);\n\n Sentry.captureException(error, {\n tags: { error_type: \"connection_error\" },\n extra: { endpoint, method },\n });\n }\n\n const response: ApiResponse<T> = {\n status: res ? res.status : connectionFailed ? 0 : 500,\n error: error instanceof Error ? error.message : String(error),\n headers: res ? res.headers : new Headers(),\n success: false,\n data: undefined,\n connectionError: connectionFailed,\n };\n\n return response;\n }\n }\n\n async get<T>(endpoint: string, headers?: HeadersInit): Promise<ApiResponse<T>> {\n return this.request<T>(\"GET\", endpoint, undefined, headers);\n }\n\n async post<T>(endpoint: string, body: object, headers?: HeadersInit): Promise<ApiResponse<T>> {\n return this.request<T>(\"POST\", endpoint, body, headers);\n }\n\n async patch<T>(endpoint: string, body: object, headers?: HeadersInit): Promise<ApiResponse<T>> {\n return this.request<T>(\"PATCH\", endpoint, body, headers);\n }\n\n async delete<T>(endpoint: string, headers?: HeadersInit): Promise<ApiResponse<T>> {\n return this.request<T>(\"DELETE\", endpoint, undefined, headers);\n }\n\n getWithSchema<TReturn, TArgs extends object, TParams = undefined>(\n returnSchema: z.ZodSchema<TReturn>,\n urlBuilder: (args: TArgs) => string,\n paramSchema?: z.ZodSchema<TParams>,\n ): TParams extends undefined\n ? (args: TArgs) => Promise<ApiResponse<TReturn>>\n : (args: TArgs, params?: TParams) => Promise<ApiResponse<TReturn>> {\n const fn = async (args: TArgs, params?: TParams) => {\n // Build URL\n const baseUrl = urlBuilder(args);\n\n // Validate and parse params with Zod if provided\n let queryString = \"\";\n if (paramSchema && params) {\n const validatedParams = paramSchema.parse(params);\n queryString = `?${new URLSearchParams(validatedParams as Record<string, string>).toString()}`;\n }\n\n const fullUrl = `${baseUrl}${queryString}`;\n const response = await this.get<unknown>(fullUrl);\n\n if (!response.success || !response.data) {\n return response as ApiResponse<TReturn>;\n }\n\n const parsed = returnSchema.safeParse(response.data);\n\n if (!parsed.success) {\n this.logger.error(\"Invalid response format\", parsed.error);\n return {\n ...response,\n success: false,\n error: t(\"errors.invalid_response_format\", {\n defaultValue: \"Invalid response format\",\n }),\n data: undefined,\n };\n }\n\n return {\n ...response,\n data: parsed.data,\n };\n };\n // biome-ignore lint/suspicious/noExplicitAny: fn can literally be any function\n return fn as any;\n }\n}\n"]}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAK9C;;GAEG;AACH,MAAM,OAAO,SAAU,SAAQ,aAAa;IAC1C,YAAY,OAAe,EAAE,MAAc,EAAE,kBAAmD;QAC9F,KAAK,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC,CAAC;IACjD,CAAC;IAES,iBAAiB;QACzB,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,WAAW,EAAE,SAAS;SACvB,CAAC;IACJ,CAAC;IAES,qBAAqB,CAAC,KAAc,EAAE,QAAgB,EAAE,MAAc;QAC9E,MAAM,CAAC,gBAAgB,CAAC,KAAK,EAAE;YAC7B,IAAI,EAAE,EAAE,UAAU,EAAE,kBAAkB,EAAE;YACxC,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;SAC5B,CAAC,CAAC;IACL,CAAC;CACF","sourcesContent":["import * as Sentry from \"@sentry/browser\";\nimport { BaseApiClient } from \"./base-client\";\n\n// Re-export types from base-client for backwards compatibility\nexport type { ApiResponse, ApiClientConfig, QueryParams } from \"./base-client\";\n\n/**\n * Browser-specific API client with CORS mode and Sentry error reporting.\n */\nexport class ApiClient extends BaseApiClient {\n constructor(baseUrl: string, apiKey: string, onConnectionChange?: (isConnected: boolean) => void) {\n super({ baseUrl, apiKey, onConnectionChange });\n }\n\n protected getRequestOptions(): RequestInit {\n return {\n mode: \"cors\",\n credentials: \"include\",\n };\n }\n\n protected handleConnectionError(error: unknown, endpoint: string, method: string): void {\n Sentry.captureException(error, {\n tags: { error_type: \"connection_error\" },\n extra: { endpoint, method },\n });\n }\n}\n"]}
@@ -1,15 +1,34 @@
1
+ import * as Sentry from "@sentry/browser";
1
2
  import { ApiClient } from "./client";
2
3
  import { AuthService } from "../auth/api/auth";
3
4
  import { NewsletterService } from "../newsletter";
4
5
  import { ProfileService } from "../profile";
5
6
  import { unidyState } from "../shared/store/unidy-store";
6
7
  import { SubscriptionsService, TicketsService } from "../ticketable";
8
+ import { createLogger } from "../logger";
9
+ import { Auth } from "../auth/auth";
7
10
  export * from "../auth/api/auth";
8
11
  export * from "../newsletter/api/newsletters";
9
12
  export * from "../profile/api/profile";
10
13
  export * from "./shared";
14
+ export * from "./base-service";
11
15
  export * from "../ticketable/api/subscriptions";
12
16
  export * from "../ticketable/api/tickets";
17
+ /** Default browser dependencies using Sentry and the SDK logger */
18
+ function createBrowserDeps(serviceName) {
19
+ return {
20
+ logger: createLogger(serviceName),
21
+ errorReporter: {
22
+ captureException: (error, context) => Sentry.captureException(error, { extra: context }),
23
+ },
24
+ getIdToken: async () => {
25
+ const auth = await Auth.getInstance();
26
+ const token = await auth.getToken();
27
+ return typeof token === "string" ? token : null;
28
+ },
29
+ getLocale: () => unidyState.locale,
30
+ };
31
+ }
13
32
  export class UnidyClient {
14
33
  apiClient;
15
34
  newsletters;
@@ -21,11 +40,12 @@ export class UnidyClient {
21
40
  this.apiClient = new ApiClient(baseUrl, apiKey, (isConnected) => {
22
41
  unidyState.backendConnected = isConnected;
23
42
  });
24
- this.newsletters = new NewsletterService(this.apiClient);
25
- this.profile = new ProfileService(this.apiClient);
26
- this.auth = new AuthService(this.apiClient);
27
- this.tickets = new TicketsService(this.apiClient);
28
- this.subscriptions = new SubscriptionsService(this.apiClient);
43
+ // Initialize services with browser-specific dependencies
44
+ this.newsletters = new NewsletterService(this.apiClient, createBrowserDeps("NewsletterService"));
45
+ this.profile = new ProfileService(this.apiClient, createBrowserDeps("ProfileService"));
46
+ this.auth = new AuthService(this.apiClient, createBrowserDeps("AuthService"));
47
+ this.tickets = new TicketsService(this.apiClient, createBrowserDeps("TicketsService"));
48
+ this.subscriptions = new SubscriptionsService(this.apiClient, createBrowserDeps("SubscriptionsService"));
29
49
  }
30
50
  }
31
51
  let instance = null;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAe,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAErE,cAAc,kBAAkB,CAAC;AACjC,cAAc,+BAA+B,CAAC;AAC9C,cAAc,wBAAwB,CAAC;AACvC,cAAc,UAAU,CAAC;AACzB,cAAc,iCAAiC,CAAC;AAChD,cAAc,2BAA2B,CAAC;AAE1C,MAAM,OAAO,WAAW;IACd,SAAS,CAAY;IAE7B,WAAW,CAAoB;IAC/B,OAAO,CAAiB;IACxB,IAAI,CAAc;IAClB,OAAO,CAAiB;IACxB,aAAa,CAAuB;IAEpC,YAAY,OAAe,EAAE,MAAc;QACzC,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE;YAC9D,UAAU,CAAC,gBAAgB,GAAG,WAAW,CAAC;QAC5C,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,WAAW,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACzD,IAAI,CAAC,OAAO,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,GAAG,IAAI,WAAW,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,IAAI,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClD,IAAI,CAAC,aAAa,GAAG,IAAI,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAChE,CAAC;CACF;AAED,IAAI,QAAQ,GAAuB,IAAI,CAAC;AAExC,SAAS,cAAc;IACrB,IAAI,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CACb,kIAAkI,CACnI,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,QAAQ,GAAG,IAAI,WAAW,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,OAAO,EAAE,cAAc,EAAE,SAAS,EAAe,CAAC","sourcesContent":["import { ApiClient, ApiResponse } from \"./client\";\nimport { AuthService } from \"../auth/api/auth\";\nimport { NewsletterService } from \"../newsletter\";\nimport { ProfileService } from \"../profile\";\nimport { unidyState } from \"../shared/store/unidy-store\";\nimport { SubscriptionsService, TicketsService } from \"../ticketable\";\n\nexport * from \"../auth/api/auth\";\nexport * from \"../newsletter/api/newsletters\";\nexport * from \"../profile/api/profile\";\nexport * from \"./shared\";\nexport * from \"../ticketable/api/subscriptions\";\nexport * from \"../ticketable/api/tickets\";\n\nexport class UnidyClient {\n private apiClient: ApiClient;\n\n newsletters: NewsletterService;\n profile: ProfileService;\n auth: AuthService;\n tickets: TicketsService;\n subscriptions: SubscriptionsService;\n\n constructor(baseUrl: string, apiKey: string) {\n this.apiClient = new ApiClient(baseUrl, apiKey, (isConnected) => {\n unidyState.backendConnected = isConnected;\n });\n\n this.newsletters = new NewsletterService(this.apiClient);\n this.profile = new ProfileService(this.apiClient);\n this.auth = new AuthService(this.apiClient);\n this.tickets = new TicketsService(this.apiClient);\n this.subscriptions = new SubscriptionsService(this.apiClient);\n }\n}\n\nlet instance: UnidyClient | null = null;\n\nfunction getUnidyClient(): UnidyClient {\n if (!unidyState.isConfigured) {\n throw new Error(\n \"Config not initialized. Ensure <u-config> is loaded before making API calls by using waitForConfig() to wait for initialization.\",\n );\n }\n\n if (!instance) {\n instance = new UnidyClient(unidyState.baseUrl, unidyState.apiKey);\n }\n\n return instance;\n}\n\nexport { getUnidyClient, ApiClient, ApiResponse };\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"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","sourcesContent":["import * as Sentry from \"@sentry/browser\";\nimport { ApiClient, ApiResponse } from \"./client\";\nimport { AuthService } from \"../auth/api/auth\";\nimport { NewsletterService } from \"../newsletter\";\nimport { ProfileService } from \"../profile\";\nimport { unidyState } from \"../shared/store/unidy-store\";\nimport { SubscriptionsService, TicketsService } from \"../ticketable\";\nimport { createLogger } from \"../logger\";\nimport type { ServiceDependencies } from \"./base-service\";\nimport { Auth } from \"../auth/auth\";\n\nexport * from \"../auth/api/auth\";\nexport * from \"../newsletter/api/newsletters\";\nexport * from \"../profile/api/profile\";\nexport * from \"./shared\";\nexport * from \"./base-service\";\nexport * from \"../ticketable/api/subscriptions\";\nexport * from \"../ticketable/api/tickets\";\n\n/** Default browser dependencies using Sentry and the SDK logger */\nfunction createBrowserDeps(serviceName: string): ServiceDependencies {\n return {\n logger: createLogger(serviceName),\n errorReporter: {\n captureException: (error, context) => Sentry.captureException(error, { extra: context }),\n },\n getIdToken: async () => {\n const auth = await Auth.getInstance();\n const token = await auth.getToken();\n return typeof token === \"string\" ? token : null;\n },\n getLocale: () => unidyState.locale,\n };\n}\n\nexport class UnidyClient {\n private apiClient: ApiClient;\n\n newsletters: NewsletterService;\n profile: ProfileService;\n auth: AuthService;\n tickets: TicketsService;\n subscriptions: SubscriptionsService;\n\n constructor(baseUrl: string, apiKey: string) {\n this.apiClient = new ApiClient(baseUrl, apiKey, (isConnected) => {\n unidyState.backendConnected = isConnected;\n });\n\n // Initialize services with browser-specific dependencies\n this.newsletters = new NewsletterService(this.apiClient, createBrowserDeps(\"NewsletterService\"));\n this.profile = new ProfileService(this.apiClient, createBrowserDeps(\"ProfileService\"));\n this.auth = new AuthService(this.apiClient, createBrowserDeps(\"AuthService\"));\n this.tickets = new TicketsService(this.apiClient, createBrowserDeps(\"TicketsService\"));\n this.subscriptions = new SubscriptionsService(this.apiClient, createBrowserDeps(\"SubscriptionsService\"));\n }\n}\n\nlet instance: UnidyClient | null = null;\n\nfunction getUnidyClient(): UnidyClient {\n if (!unidyState.isConfigured) {\n throw new Error(\n \"Config not initialized. Ensure <u-config> is loaded before making API calls by using waitForConfig() to wait for initialization.\",\n );\n }\n\n if (!instance) {\n instance = new UnidyClient(unidyState.baseUrl, unidyState.apiKey);\n }\n\n return instance;\n}\n\nexport { getUnidyClient, ApiClient, ApiResponse };\n"]}
@@ -1,6 +1,15 @@
1
1
  import * as z from "zod";
2
- export const SchemaValidationErrorSchema = z.object({
3
- error_identifier: z.string(), // unprocessable entity etc. TODO we can define enum later
2
+ /**
3
+ * Base error schema that all API errors extend from.
4
+ * Contains the common error_identifier field.
5
+ */
6
+ export const BaseErrorSchema = z.object({
7
+ error_identifier: z.string(),
8
+ });
9
+ /**
10
+ * Schema validation error extends base error with an array of error messages.
11
+ */
12
+ export const SchemaValidationErrorSchema = BaseErrorSchema.extend({
4
13
  errors: z.array(z.string()),
5
14
  });
6
15
  export const PaginationMetaSchema = z.object({
@@ -1 +1 @@
1
- {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/api/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,0DAA0D;IACxF,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CAC5B,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC5B,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;CACxC,CAAC,CAAC","sourcesContent":["import * as z from \"zod\";\n\nexport const SchemaValidationErrorSchema = z.object({\n error_identifier: z.string(), // unprocessable entity etc. TODO we can define enum later\n errors: z.array(z.string()),\n});\n\nexport type SchemaValidationError = z.infer<typeof SchemaValidationErrorSchema>;\n\nexport const PaginationMetaSchema = z.object({\n count: z.number(),\n page: z.number(),\n limit: z.number(),\n last: z.number(),\n prev: z.number().nullable(),\n next: z.number().nullable(),\n});\n\nexport type PaginationMeta = z.infer<typeof PaginationMetaSchema>;\n\nexport const PaginationParamsSchema = z.object({\n page: z.number().int().min(1),\n limit: z.number().int().min(0).max(250),\n});\n\nexport type PaginationParams = z.infer<typeof PaginationParamsSchema>;\n"]}
1
+ {"version":3,"file":"shared.js","sourceRoot":"","sources":["../../src/api/shared.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,gBAAgB,EAAE,CAAC,CAAC,MAAM,EAAE;CAC7B,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,eAAe,CAAC,MAAM,CAAC;IAChE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;CAC5B,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;IAChB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC5B,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC;CACxC,CAAC,CAAC","sourcesContent":["import * as z from \"zod\";\n\n/**\n * Base error schema that all API errors extend from.\n * Contains the common error_identifier field.\n */\nexport const BaseErrorSchema = z.object({\n error_identifier: z.string(),\n});\n\nexport type BaseError = z.infer<typeof BaseErrorSchema>;\n\n/**\n * Schema validation error extends base error with an array of error messages.\n */\nexport const SchemaValidationErrorSchema = BaseErrorSchema.extend({\n errors: z.array(z.string()),\n});\n\nexport type SchemaValidationError = z.infer<typeof SchemaValidationErrorSchema>;\n\nexport const PaginationMetaSchema = z.object({\n count: z.number(),\n page: z.number(),\n limit: z.number(),\n last: z.number(),\n prev: z.number().nullable(),\n next: z.number().nullable(),\n});\n\nexport type PaginationMeta = z.infer<typeof PaginationMetaSchema>;\n\nexport const PaginationParamsSchema = z.object({\n page: z.number().int().min(1),\n limit: z.number().int().min(0).max(250),\n});\n\nexport type PaginationParams = z.infer<typeof PaginationParamsSchema>;\n"]}
@@ -0,0 +1,88 @@
1
+ import { AuthService } from "../auth/api/auth";
2
+ import { NewsletterService } from "../newsletter/api/newsletters";
3
+ import { ProfileService } from "../profile/api/profile";
4
+ import { TicketsService } from "../ticketable/api/tickets";
5
+ import { SubscriptionsService } from "../ticketable/api/subscriptions";
6
+ import { BaseApiClient } from "./base-client";
7
+ /**
8
+ * Standalone API client and services for use outside of Stencil components.
9
+ * This module can be used in Node.js or any other JavaScript environment.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * import {
14
+ * StandaloneApiClient,
15
+ * AuthService,
16
+ * NewsletterService,
17
+ * } from '@unidy.io/sdk/standalone';
18
+ *
19
+ * // Create the API client
20
+ * const client = new StandaloneApiClient({
21
+ * baseUrl: 'https://api.unidy.io',
22
+ * apiKey: 'your-api-key',
23
+ * });
24
+ *
25
+ * // Create services with optional custom logger/error reporter
26
+ * const auth = new AuthService(client, {
27
+ * logger: console,
28
+ * errorReporter: { captureException: (e) => myErrorTracker.capture(e) },
29
+ * });
30
+ *
31
+ * // Use the services
32
+ * const result = await auth.createSignIn({ payload: { email: 'user@example.com' } });
33
+ * ```
34
+ */
35
+ // Re-export service classes
36
+ export { AuthService } from "../auth/api/auth";
37
+ export { NewsletterService } from "../newsletter/api/newsletters";
38
+ export { ProfileService } from "../profile/api/profile";
39
+ export { TicketsService } from "../ticketable/api/tickets";
40
+ export { SubscriptionsService } from "../ticketable/api/subscriptions";
41
+ /**
42
+ * Standalone API client without browser-specific dependencies.
43
+ *
44
+ * This client provides the same interface as the browser ApiClient but without
45
+ * dependencies on Sentry, i18n, localStorage, or other browser APIs.
46
+ *
47
+ * @example
48
+ * ```typescript
49
+ * import { StandaloneApiClient, AuthService } from '@unidy.io/sdk/standalone';
50
+ *
51
+ * const client = new StandaloneApiClient({
52
+ * baseUrl: 'https://api.unidy.io',
53
+ * apiKey: 'your-api-key',
54
+ * });
55
+ *
56
+ * const auth = new AuthService(client);
57
+ * const result = await auth.createSignIn({ payload: { email: 'user@example.com' } });
58
+ * ```
59
+ */
60
+ export class StandaloneApiClient extends BaseApiClient {
61
+ getRequestOptions() {
62
+ // No browser-specific options for standalone client
63
+ return {};
64
+ }
65
+ handleConnectionError(_error, _endpoint, _method) {
66
+ // No-op for standalone client - users can inject their own error reporter via ServiceDependencies
67
+ }
68
+ }
69
+ export class StandaloneUnidyClient {
70
+ auth;
71
+ newsletters;
72
+ profile;
73
+ tickets;
74
+ subscriptions;
75
+ constructor(config) {
76
+ const apiClient = new StandaloneApiClient(config);
77
+ const deps = config.deps;
78
+ this.auth = new AuthService(apiClient, deps);
79
+ this.newsletters = new NewsletterService(apiClient, deps);
80
+ this.profile = new ProfileService(apiClient, deps);
81
+ this.tickets = new TicketsService(apiClient, deps);
82
+ this.subscriptions = new SubscriptionsService(apiClient, deps);
83
+ }
84
+ }
85
+ export function createStandaloneClient(config) {
86
+ return new StandaloneUnidyClient(config);
87
+ }
88
+ //# sourceMappingURL=standalone.js.map