@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.
- package/dist/cjs/app-globals-DSKjcXX_.js.map +1 -1
- package/dist/cjs/{auth-store-BaxuIp4z.js → auth-store-DC9EVec8.js} +2 -3
- package/dist/cjs/auth-store-DC9EVec8.js.map +1 -0
- package/dist/cjs/{i18n-BoDZ8kd2.js → i18n-BAZB-eHh.js} +2 -8
- package/dist/cjs/{i18n-BoDZ8kd2.js.map → i18n-BAZB-eHh.js.map} +1 -1
- package/dist/cjs/{index-R2MKLaem.js → index-CvFbf5-D.js} +1477 -1105
- package/dist/cjs/index-CvFbf5-D.js.map +1 -0
- package/dist/cjs/index.cjs.js +6 -5
- package/dist/cjs/index.cjs.js.map +1 -1
- package/dist/cjs/{newsletter-helpers-DR0vsegt.js → newsletter-helpers-Dj0yYHZf.js} +61 -74
- package/dist/cjs/newsletter-helpers-Dj0yYHZf.js.map +1 -0
- package/dist/cjs/{profile-helpers-B2h2III_.js → profile-helpers-D66Ycaft.js} +3 -3
- package/dist/cjs/{profile-helpers-B2h2III_.js.map → profile-helpers-D66Ycaft.js.map} +1 -1
- package/dist/cjs/u-conditional-render.cjs.entry.js +5 -6
- package/dist/cjs/u-conditional-render.entry.cjs.js.map +1 -1
- package/dist/cjs/u-config.cjs.entry.js +5 -6
- package/dist/cjs/u-config.entry.cjs.js.map +1 -1
- package/dist/cjs/u-email-field.cjs.entry.js +2 -2
- package/dist/cjs/u-error-message.cjs.entry.js +3 -3
- package/dist/cjs/u-error-message.entry.cjs.js.map +1 -1
- package/dist/cjs/u-field.u-raw-field.entry.cjs.js.map +1 -1
- package/dist/cjs/u-field_2.cjs.entry.js +2 -2
- package/dist/cjs/u-full-profile.cjs.entry.js +1 -1
- package/dist/cjs/u-logout-button.cjs.entry.js +6 -7
- package/dist/cjs/u-logout-button.entry.cjs.js.map +1 -1
- package/dist/cjs/u-magic-code-field.cjs.entry.js +5 -6
- package/dist/cjs/u-magic-code-field.entry.cjs.js.map +1 -1
- package/dist/cjs/u-missing-field.cjs.entry.js +1 -1
- package/dist/cjs/u-missing-fields-submit-button.cjs.entry.js +9 -5
- package/dist/cjs/u-missing-fields-submit-button.entry.cjs.js.map +1 -1
- package/dist/cjs/u-newsletter-checkbox.cjs.entry.js +5 -6
- package/dist/cjs/u-newsletter-checkbox.entry.cjs.js.map +1 -1
- package/dist/cjs/u-newsletter-logout-button.cjs.entry.js +6 -7
- package/dist/cjs/u-newsletter-logout-button.entry.cjs.js.map +1 -1
- package/dist/cjs/u-newsletter-preference-checkbox.cjs.entry.js +5 -6
- package/dist/cjs/u-newsletter-preference-checkbox.entry.cjs.js.map +1 -1
- package/dist/cjs/u-newsletter-resend-doi-button.cjs.entry.js +4 -5
- package/dist/cjs/u-newsletter-resend-doi-button.entry.cjs.js.map +1 -1
- package/dist/cjs/u-newsletter-root.cjs.entry.js +5 -6
- package/dist/cjs/u-newsletter-root.entry.cjs.js.map +1 -1
- package/dist/cjs/u-newsletter-toggle-subscription-button.cjs.entry.js +4 -5
- package/dist/cjs/u-newsletter-toggle-subscription-button.entry.cjs.js.map +1 -1
- package/dist/cjs/u-passkey.cjs.entry.js +5 -6
- package/dist/cjs/u-passkey.entry.cjs.js.map +1 -1
- package/dist/cjs/u-password-field.cjs.entry.js +2 -2
- package/dist/cjs/u-profile.u-submit-button.entry.cjs.js.map +1 -1
- package/dist/cjs/u-profile_2.cjs.entry.js +35 -55
- package/dist/cjs/u-registration-button.cjs.entry.js +2 -2
- package/dist/cjs/u-reset-password-button.cjs.entry.js +4 -5
- package/dist/cjs/u-reset-password-button.entry.cjs.js.map +1 -1
- package/dist/cjs/u-send-magic-code-button.cjs.entry.js +5 -6
- package/dist/cjs/u-send-magic-code-button.entry.cjs.js.map +1 -1
- package/dist/cjs/u-signed-in.cjs.entry.js +1 -1
- package/dist/cjs/u-signin-root.cjs.entry.js +1 -1
- package/dist/cjs/u-signin-step.cjs.entry.js +5 -6
- package/dist/cjs/u-signin-step.entry.cjs.js.map +1 -1
- package/dist/cjs/u-signin-strategy.cjs.entry.js +1 -1
- package/dist/cjs/u-social-login-button.cjs.entry.js +2 -2
- package/dist/cjs/u-spinner.cjs.entry.js +1 -1
- package/dist/cjs/u-spinner.entry.cjs.js.map +1 -1
- package/dist/cjs/u-ticketable-list.cjs.entry.js +39 -29
- package/dist/cjs/u-ticketable-list.entry.cjs.js.map +1 -1
- package/dist/collection/api/base-client.js +129 -0
- package/dist/collection/api/base-client.js.map +1 -0
- package/dist/collection/api/base-service.js +72 -0
- package/dist/collection/api/base-service.js.map +1 -0
- package/dist/collection/api/client.js +18 -139
- package/dist/collection/api/client.js.map +1 -1
- package/dist/collection/api/index.js +25 -5
- package/dist/collection/api/index.js.map +1 -1
- package/dist/collection/api/shared.js +11 -2
- package/dist/collection/api/shared.js.map +1 -1
- package/dist/collection/api/standalone.js +88 -0
- package/dist/collection/api/standalone.js.map +1 -0
- package/dist/collection/auth/api/auth.js +66 -124
- package/dist/collection/auth/api/auth.js.map +1 -1
- package/dist/collection/auth/api/schemas.js +78 -0
- package/dist/collection/auth/api/schemas.js.map +1 -0
- package/dist/collection/auth/auth-helpers.js +47 -36
- package/dist/collection/auth/auth-helpers.js.map +1 -1
- package/dist/collection/auth/components/missing-fields-submit-button/missing-fields-submit-button.js +4 -1
- package/dist/collection/auth/components/missing-fields-submit-button/missing-fields-submit-button.js.map +1 -1
- package/dist/collection/auth/components/password-field/password-field.js +1 -1
- package/dist/collection/auth/passkey-auth.js +8 -6
- package/dist/collection/auth/passkey-auth.js.map +1 -1
- package/dist/collection/auth/store/auth-store.js +0 -1
- package/dist/collection/auth/store/auth-store.js.map +1 -1
- package/dist/collection/locales/de.json +0 -1
- package/dist/collection/locales/en.json +0 -1
- package/dist/collection/locales/fr.json +0 -1
- package/dist/collection/locales/it.json +0 -1
- package/dist/collection/locales/nl_be.json +0 -1
- package/dist/collection/locales/ro.json +0 -1
- package/dist/collection/newsletter/api/newsletters.js +192 -167
- package/dist/collection/newsletter/api/newsletters.js.map +1 -1
- package/dist/collection/newsletter/api/schemas.js +112 -0
- package/dist/collection/newsletter/api/schemas.js.map +1 -0
- package/dist/collection/newsletter/newsletter-helpers.js +57 -70
- package/dist/collection/newsletter/newsletter-helpers.js.map +1 -1
- package/dist/collection/profile/api/profile.js +56 -155
- package/dist/collection/profile/api/profile.js.map +1 -1
- package/dist/collection/profile/api/schemas.js +120 -0
- package/dist/collection/profile/api/schemas.js.map +1 -0
- package/dist/collection/profile/components/field/field.css +1 -1
- package/dist/collection/profile/components/profile/profile.js +35 -101
- package/dist/collection/profile/components/profile/profile.js.map +1 -1
- package/dist/collection/shared/components/config/config.js +2 -2
- package/dist/collection/shared/components/error-message/error-message.js +3 -3
- package/dist/collection/shared/components/error-message/error-message.js.map +1 -1
- package/dist/collection/shared/components/spinner/spinner.css +1 -1
- package/dist/collection/shared/components/submit-button/submit-button.css +1 -1
- package/dist/collection/ticketable/api/schemas.js +58 -9
- package/dist/collection/ticketable/api/schemas.js.map +1 -1
- package/dist/collection/ticketable/api/subscriptions.js +13 -44
- package/dist/collection/ticketable/api/subscriptions.js.map +1 -1
- package/dist/collection/ticketable/api/ticketable-service.js +74 -0
- package/dist/collection/ticketable/api/ticketable-service.js.map +1 -0
- package/dist/collection/ticketable/api/tickets.js +13 -45
- package/dist/collection/ticketable/api/tickets.js.map +1 -1
- package/dist/collection/ticketable/components/ticketable-list/ticketable-list.js +37 -77
- package/dist/collection/ticketable/components/ticketable-list/ticketable-list.js.map +1 -1
- package/dist/components/auth-store.js +0 -1
- package/dist/components/auth-store.js.map +1 -1
- package/dist/components/field.js +1 -1
- package/dist/components/field.js.map +1 -1
- package/dist/components/i18n.js +0 -6
- package/dist/components/i18n.js.map +1 -1
- package/dist/components/index.js +1 -2
- package/dist/components/index.js.map +1 -1
- package/dist/components/index2.js +1475 -1106
- package/dist/components/index2.js.map +1 -1
- package/dist/components/newsletter-helpers.js +57 -70
- package/dist/components/newsletter-helpers.js.map +1 -1
- package/dist/components/profile.js +34 -54
- package/dist/components/profile.js.map +1 -1
- package/dist/components/spinner.js +1 -1
- package/dist/components/spinner.js.map +1 -1
- package/dist/components/submit-button.js +1 -1
- package/dist/components/submit-button.js.map +1 -1
- package/dist/components/u-config.js +1 -2
- package/dist/components/u-config.js.map +1 -1
- package/dist/components/u-error-message.js +2 -2
- package/dist/components/u-error-message.js.map +1 -1
- package/dist/components/u-logout-button.js +1 -1
- package/dist/components/u-magic-code-field.js +1 -1
- package/dist/components/u-missing-fields-submit-button.js +4 -1
- package/dist/components/u-missing-fields-submit-button.js.map +1 -1
- package/dist/components/u-newsletter-root.js +1 -1
- package/dist/components/u-passkey.js +1 -1
- package/dist/components/u-reset-password-button.js +1 -1
- package/dist/components/u-send-magic-code-button.js +1 -1
- package/dist/components/u-signin-step.js +1 -1
- package/dist/components/u-ticketable-list.js +36 -29
- package/dist/components/u-ticketable-list.js.map +1 -1
- package/dist/esm/app-globals-CPU9ZcqZ.js.map +1 -1
- package/dist/esm/{auth-store-CVvBlKGv.js → auth-store-BMqUdTpC.js} +2 -3
- package/dist/esm/auth-store-BMqUdTpC.js.map +1 -0
- package/dist/esm/{i18n-CLdWzy5J.js → i18n-BANodpxG.js} +2 -8
- package/dist/esm/{i18n-CLdWzy5J.js.map → i18n-BANodpxG.js.map} +1 -1
- package/dist/esm/{index-DSDkaHWI.js → index-2p1QEJrx.js} +1477 -1108
- package/dist/esm/index-2p1QEJrx.js.map +1 -0
- package/dist/esm/index.js +3 -4
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/{newsletter-helpers-Dc_24im3.js → newsletter-helpers-D64LTcSM.js} +61 -74
- package/dist/esm/newsletter-helpers-D64LTcSM.js.map +1 -0
- package/dist/esm/{profile-helpers-CglNd6Nw.js → profile-helpers-DAvXZ9Uj.js} +3 -3
- package/dist/esm/{profile-helpers-CglNd6Nw.js.map → profile-helpers-DAvXZ9Uj.js.map} +1 -1
- package/dist/esm/u-conditional-render.entry.js +5 -6
- package/dist/esm/u-conditional-render.entry.js.map +1 -1
- package/dist/esm/u-config.entry.js +4 -5
- package/dist/esm/u-config.entry.js.map +1 -1
- package/dist/esm/u-email-field.entry.js +2 -2
- package/dist/esm/u-error-message.entry.js +3 -3
- package/dist/esm/u-error-message.entry.js.map +1 -1
- package/dist/esm/u-field.u-raw-field.entry.js.map +1 -1
- package/dist/esm/u-field_2.entry.js +2 -2
- package/dist/esm/u-full-profile.entry.js +1 -1
- package/dist/esm/u-logout-button.entry.js +5 -6
- package/dist/esm/u-logout-button.entry.js.map +1 -1
- package/dist/esm/u-magic-code-field.entry.js +4 -5
- package/dist/esm/u-magic-code-field.entry.js.map +1 -1
- package/dist/esm/u-missing-field.entry.js +1 -1
- package/dist/esm/u-missing-fields-submit-button.entry.js +9 -5
- package/dist/esm/u-missing-fields-submit-button.entry.js.map +1 -1
- package/dist/esm/u-newsletter-checkbox.entry.js +5 -6
- package/dist/esm/u-newsletter-checkbox.entry.js.map +1 -1
- package/dist/esm/u-newsletter-logout-button.entry.js +6 -7
- package/dist/esm/u-newsletter-logout-button.entry.js.map +1 -1
- package/dist/esm/u-newsletter-preference-checkbox.entry.js +5 -6
- package/dist/esm/u-newsletter-preference-checkbox.entry.js.map +1 -1
- package/dist/esm/u-newsletter-resend-doi-button.entry.js +4 -5
- package/dist/esm/u-newsletter-resend-doi-button.entry.js.map +1 -1
- package/dist/esm/u-newsletter-root.entry.js +4 -5
- package/dist/esm/u-newsletter-root.entry.js.map +1 -1
- package/dist/esm/u-newsletter-toggle-subscription-button.entry.js +4 -5
- package/dist/esm/u-newsletter-toggle-subscription-button.entry.js.map +1 -1
- package/dist/esm/u-passkey.entry.js +4 -5
- package/dist/esm/u-passkey.entry.js.map +1 -1
- package/dist/esm/u-password-field.entry.js +2 -2
- package/dist/esm/u-profile.u-submit-button.entry.js.map +1 -1
- package/dist/esm/u-profile_2.entry.js +36 -56
- package/dist/esm/u-registration-button.entry.js +2 -2
- package/dist/esm/u-reset-password-button.entry.js +3 -4
- package/dist/esm/u-reset-password-button.entry.js.map +1 -1
- package/dist/esm/u-send-magic-code-button.entry.js +4 -5
- package/dist/esm/u-send-magic-code-button.entry.js.map +1 -1
- package/dist/esm/u-signed-in.entry.js +1 -1
- package/dist/esm/u-signin-root.entry.js +1 -1
- package/dist/esm/u-signin-step.entry.js +4 -5
- package/dist/esm/u-signin-step.entry.js.map +1 -1
- package/dist/esm/u-signin-strategy.entry.js +1 -1
- package/dist/esm/u-social-login-button.entry.js +2 -2
- package/dist/esm/u-spinner.entry.js +1 -1
- package/dist/esm/u-spinner.entry.js.map +1 -1
- package/dist/esm/u-ticketable-list.entry.js +40 -30
- package/dist/esm/u-ticketable-list.entry.js.map +1 -1
- package/dist/sdk/index.esm.js +1 -1
- package/dist/sdk/index.esm.js.map +1 -1
- package/dist/sdk/locales/de.json +0 -1
- package/dist/sdk/locales/en.json +0 -1
- package/dist/sdk/locales/fr.json +0 -1
- package/dist/sdk/locales/it.json +0 -1
- package/dist/sdk/locales/nl_be.json +0 -1
- package/dist/sdk/locales/ro.json +0 -1
- package/dist/sdk/{p-5babee6b.entry.js → p-098eef67.entry.js} +2 -2
- package/dist/sdk/p-0e74de96.entry.js +2 -0
- package/dist/sdk/p-0e74de96.entry.js.map +1 -0
- package/dist/sdk/p-0ed36cbb.entry.js +2 -0
- package/dist/sdk/p-0ed36cbb.entry.js.map +1 -0
- package/dist/sdk/p-1149e044.entry.js +2 -0
- package/dist/sdk/p-1149e044.entry.js.map +1 -0
- package/dist/sdk/p-16d763fd.entry.js +2 -0
- package/dist/sdk/p-16d763fd.entry.js.map +1 -0
- package/dist/sdk/p-1d404c36.entry.js +2 -0
- package/dist/sdk/p-1d404c36.entry.js.map +1 -0
- package/dist/sdk/p-32da9922.entry.js +2 -0
- package/dist/sdk/p-32da9922.entry.js.map +1 -0
- package/dist/sdk/p-3d3a9c90.entry.js +2 -0
- package/dist/sdk/p-3d3a9c90.entry.js.map +1 -0
- package/dist/sdk/p-43024bd6.entry.js +2 -0
- package/dist/sdk/p-43024bd6.entry.js.map +1 -0
- package/dist/sdk/{p-e2e7061b.entry.js → p-5da49d00.entry.js} +2 -2
- package/dist/sdk/{p-f961fbea.entry.js → p-67af762e.entry.js} +2 -2
- package/dist/sdk/{p-f961fbea.entry.js.map → p-67af762e.entry.js.map} +1 -1
- package/dist/sdk/p-7099bd56.entry.js +2 -0
- package/dist/sdk/p-7099bd56.entry.js.map +1 -0
- package/dist/sdk/p-745742f1.entry.js +2 -0
- package/dist/sdk/{p-9e71a36c.entry.js → p-74e6523f.entry.js} +2 -2
- package/dist/sdk/p-86d16818.entry.js +2 -0
- package/dist/sdk/{p-effaf86b.entry.js.map → p-86d16818.entry.js.map} +1 -1
- package/dist/sdk/{p-DA84OuuU.js → p-BasehRhW.js} +2 -2
- package/dist/sdk/{p-DA84OuuU.js.map → p-BasehRhW.js.map} +1 -1
- package/dist/sdk/p-C4aHo4nN.js +2 -0
- package/dist/sdk/p-C4aHo4nN.js.map +1 -0
- package/dist/sdk/p-CFiZLMAA.js.map +1 -1
- package/dist/sdk/p-DGDhaqCd.js +2 -0
- package/dist/sdk/p-DGDhaqCd.js.map +1 -0
- package/dist/sdk/{p-CbRhHGU5.js → p-DSq94RWc.js} +2 -2
- package/dist/sdk/{p-CbRhHGU5.js.map → p-DSq94RWc.js.map} +1 -1
- package/dist/sdk/p-DSwwVdp1.js +2 -0
- package/dist/sdk/p-DSwwVdp1.js.map +1 -0
- package/dist/sdk/p-a037bbe3.entry.js +2 -0
- package/dist/sdk/p-a037bbe3.entry.js.map +1 -0
- package/dist/sdk/p-adcb7911.entry.js +2 -0
- package/dist/sdk/p-adcb7911.entry.js.map +1 -0
- package/dist/sdk/{p-39b61f33.entry.js → p-bbbec3d4.entry.js} +2 -2
- package/dist/sdk/{p-f232929b.entry.js → p-c2fba7c8.entry.js} +2 -2
- package/dist/sdk/p-c4618822.entry.js +2 -0
- package/dist/sdk/p-c4618822.entry.js.map +1 -0
- package/dist/sdk/p-ca4e57f2.entry.js +2 -0
- package/dist/sdk/p-ca4e57f2.entry.js.map +1 -0
- package/dist/sdk/p-ce4ab77c.entry.js +2 -0
- package/dist/sdk/p-ce4ab77c.entry.js.map +1 -0
- package/dist/sdk/p-d143e097.entry.js +2 -0
- package/dist/sdk/p-d143e097.entry.js.map +1 -0
- package/dist/sdk/{p-a69b83ec.entry.js → p-e0d2397c.entry.js} +2 -2
- package/dist/sdk/{p-80034205.entry.js → p-e6beb9d7.entry.js} +2 -2
- package/dist/sdk/p-ecc7fcff.entry.js +2 -0
- package/dist/sdk/p-ecc7fcff.entry.js.map +1 -0
- package/dist/sdk/{p-2cb6a2d0.entry.js → p-f1788e52.entry.js} +2 -2
- package/dist/sdk/p-fb665a5c.entry.js +2 -0
- package/dist/sdk/p-fb665a5c.entry.js.map +1 -0
- package/dist/sdk/p-fc67cf07.entry.js +2 -0
- package/dist/sdk/p-fc67cf07.entry.js.map +1 -0
- package/dist/sdk/sdk.esm.js +1 -1
- package/dist/sdk/u-conditional-render.entry.esm.js.map +1 -1
- package/dist/sdk/u-config.entry.esm.js.map +1 -1
- package/dist/sdk/u-error-message.entry.esm.js.map +1 -1
- package/dist/sdk/u-field.u-raw-field.entry.esm.js.map +1 -1
- package/dist/sdk/u-logout-button.entry.esm.js.map +1 -1
- package/dist/sdk/u-magic-code-field.entry.esm.js.map +1 -1
- package/dist/sdk/u-missing-fields-submit-button.entry.esm.js.map +1 -1
- package/dist/sdk/u-newsletter-checkbox.entry.esm.js.map +1 -1
- package/dist/sdk/u-newsletter-logout-button.entry.esm.js.map +1 -1
- package/dist/sdk/u-newsletter-preference-checkbox.entry.esm.js.map +1 -1
- package/dist/sdk/u-newsletter-resend-doi-button.entry.esm.js.map +1 -1
- package/dist/sdk/u-newsletter-root.entry.esm.js.map +1 -1
- package/dist/sdk/u-newsletter-toggle-subscription-button.entry.esm.js.map +1 -1
- package/dist/sdk/u-passkey.entry.esm.js.map +1 -1
- package/dist/sdk/u-profile.u-submit-button.entry.esm.js.map +1 -1
- package/dist/sdk/u-reset-password-button.entry.esm.js.map +1 -1
- package/dist/sdk/u-send-magic-code-button.entry.esm.js.map +1 -1
- package/dist/sdk/u-signin-step.entry.esm.js.map +1 -1
- package/dist/sdk/u-spinner.entry.esm.js.map +1 -1
- package/dist/sdk/u-ticketable-list.entry.esm.js.map +1 -1
- package/dist/types/api/base-client.d.ts +54 -0
- package/dist/types/api/base-service.d.ts +62 -0
- package/dist/types/api/client.d.ts +9 -31
- package/dist/types/api/index.d.ts +1 -0
- package/dist/types/api/shared.d.ts +11 -0
- package/dist/types/api/standalone.d.ts +105 -0
- package/dist/types/auth/api/auth.d.ts +71 -287
- package/dist/types/auth/api/schemas.d.ts +572 -0
- package/dist/types/auth/auth-helpers.d.ts +65 -66
- package/dist/types/auth/store/auth-store.d.ts +3 -3
- package/dist/types/components.d.ts +0 -72
- package/dist/types/newsletter/api/newsletters.d.ts +73 -196
- package/dist/types/newsletter/api/schemas.d.ts +192 -0
- package/dist/types/profile/api/profile.d.ts +12 -237
- package/dist/types/profile/api/schemas.d.ts +336 -0
- package/dist/types/profile/components/profile/profile.d.ts +1 -17
- package/dist/types/shared/components/error-message/error-message.d.ts +1 -1
- package/dist/types/ticketable/api/schemas.d.ts +108 -15
- package/dist/types/ticketable/api/subscriptions.d.ts +16 -83
- package/dist/types/ticketable/api/ticketable-service.d.ts +39 -0
- package/dist/types/ticketable/api/tickets.d.ts +16 -85
- package/dist/types/ticketable/components/ticketable-list/ticketable-list.d.ts +2 -12
- package/package.json +5 -1
- package/dist/cjs/auth-NU3DBc-6.js +0 -581
- package/dist/cjs/auth-NU3DBc-6.js.map +0 -1
- package/dist/cjs/auth-store-BaxuIp4z.js.map +0 -1
- package/dist/cjs/index-R2MKLaem.js.map +0 -1
- package/dist/cjs/newsletter-helpers-DR0vsegt.js.map +0 -1
- package/dist/collection/ticketable/api/get-with-schema.js +0 -35
- package/dist/collection/ticketable/api/get-with-schema.js.map +0 -1
- package/dist/components/auth.js +0 -580
- package/dist/components/auth.js.map +0 -1
- package/dist/esm/auth-nsjRdpvS.js +0 -579
- package/dist/esm/auth-nsjRdpvS.js.map +0 -1
- package/dist/esm/auth-store-CVvBlKGv.js.map +0 -1
- package/dist/esm/index-DSDkaHWI.js.map +0 -1
- package/dist/esm/newsletter-helpers-Dc_24im3.js.map +0 -1
- package/dist/sdk/p-0ab98e7a.entry.js +0 -2
- package/dist/sdk/p-0ab98e7a.entry.js.map +0 -1
- package/dist/sdk/p-0d324822.entry.js +0 -2
- package/dist/sdk/p-0d324822.entry.js.map +0 -1
- package/dist/sdk/p-0fb37ee9.entry.js +0 -2
- package/dist/sdk/p-0fb37ee9.entry.js.map +0 -1
- package/dist/sdk/p-3049e73f.entry.js +0 -2
- package/dist/sdk/p-3049e73f.entry.js.map +0 -1
- package/dist/sdk/p-312b919e.entry.js +0 -2
- package/dist/sdk/p-312b919e.entry.js.map +0 -1
- package/dist/sdk/p-319c5d3b.entry.js +0 -2
- package/dist/sdk/p-319c5d3b.entry.js.map +0 -1
- package/dist/sdk/p-34b98f55.entry.js +0 -2
- package/dist/sdk/p-34b98f55.entry.js.map +0 -1
- package/dist/sdk/p-4ec3302d.entry.js +0 -2
- package/dist/sdk/p-4ec3302d.entry.js.map +0 -1
- package/dist/sdk/p-568eabbc.entry.js +0 -2
- package/dist/sdk/p-568eabbc.entry.js.map +0 -1
- package/dist/sdk/p-5b40a68b.entry.js +0 -2
- package/dist/sdk/p-5b40a68b.entry.js.map +0 -1
- package/dist/sdk/p-66587fdd.entry.js +0 -2
- package/dist/sdk/p-66587fdd.entry.js.map +0 -1
- package/dist/sdk/p-88d93d64.entry.js +0 -2
- package/dist/sdk/p-90e2253e.entry.js +0 -2
- package/dist/sdk/p-90e2253e.entry.js.map +0 -1
- package/dist/sdk/p-BiILQPdb.js +0 -2
- package/dist/sdk/p-BiILQPdb.js.map +0 -1
- package/dist/sdk/p-DdUvQelg.js +0 -2
- package/dist/sdk/p-DdUvQelg.js.map +0 -1
- package/dist/sdk/p-PKvQIsOt.js +0 -2
- package/dist/sdk/p-PKvQIsOt.js.map +0 -1
- package/dist/sdk/p-a4f5940f.entry.js +0 -2
- package/dist/sdk/p-a4f5940f.entry.js.map +0 -1
- package/dist/sdk/p-aMrLKr2m.js +0 -2
- package/dist/sdk/p-aMrLKr2m.js.map +0 -1
- package/dist/sdk/p-bfb04b17.entry.js +0 -2
- package/dist/sdk/p-bfb04b17.entry.js.map +0 -1
- package/dist/sdk/p-c6816542.entry.js +0 -2
- package/dist/sdk/p-c6816542.entry.js.map +0 -1
- package/dist/sdk/p-da363474.entry.js +0 -2
- package/dist/sdk/p-da363474.entry.js.map +0 -1
- package/dist/sdk/p-e54d5d38.entry.js +0 -2
- package/dist/sdk/p-e54d5d38.entry.js.map +0 -1
- package/dist/sdk/p-e81bbd62.entry.js +0 -2
- package/dist/sdk/p-e81bbd62.entry.js.map +0 -1
- package/dist/sdk/p-effaf86b.entry.js +0 -2
- package/dist/types/ticketable/api/get-with-schema.d.ts +0 -3
- /package/dist/sdk/{p-5babee6b.entry.js.map → p-098eef67.entry.js.map} +0 -0
- /package/dist/sdk/{p-e2e7061b.entry.js.map → p-5da49d00.entry.js.map} +0 -0
- /package/dist/sdk/{p-88d93d64.entry.js.map → p-745742f1.entry.js.map} +0 -0
- /package/dist/sdk/{p-9e71a36c.entry.js.map → p-74e6523f.entry.js.map} +0 -0
- /package/dist/sdk/{p-39b61f33.entry.js.map → p-bbbec3d4.entry.js.map} +0 -0
- /package/dist/sdk/{p-f232929b.entry.js.map → p-c2fba7c8.entry.js.map} +0 -0
- /package/dist/sdk/{p-a69b83ec.entry.js.map → p-e0d2397c.entry.js.map} +0 -0
- /package/dist/sdk/{p-80034205.entry.js.map → p-e6beb9d7.entry.js.map} +0 -0
- /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":"AAAA;;GAEG;AAoBH;;;GAGG;AACH,MAAM,OAAgB,aAAa;IACjC;;;OAGG;IACO,MAAM,CAAU,yBAAyB,GAAG;QACpD,2BAA2B;QAC3B,iBAAiB,EAAE,yCAAyC;QAC5D,cAAc,EAAE,wBAAwB;QACxC,aAAa,EAAE,uBAAuB;QACtC,iCAAiC,EAAE,yBAAyB;QAE5D,uDAAuD;QACvD,wBAAwB,EAAE,mCAAmC;QAC7D,aAAa,EAAE,wBAAwB;QACvC,2BAA2B,EAAE,yBAAyB;QAEtD,6BAA6B;QAC7B,cAAc,EAAE,+BAA+B;QAC/C,WAAW,EAAE,oBAAoB;QACjC,WAAW,EAAE,wBAAwB;KACtC,CAAC;IAEQ,kBAAkB,CAAkC;IAEvD,OAAO,CAAS;IAChB,OAAO,CAAS;IAEvB,YAAY,MAAuB;QACjC,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,IAAI,CAAC,kBAAkB,GAAG,MAAM,CAAC,kBAAkB,CAAC;IACtD,CAAC;IAES,iBAAiB,CAAC,KAAc;QACxC,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,aAAa,CAAC,yBAAyB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QAC5F,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAES,mBAAmB,CAAC,WAAoB;QAChD,IAAI,CAAC,kBAAkB,EAAE,CAAC,WAAW,CAAC,CAAC;IACzC,CAAC;IAES,WAAW;QACnB,MAAM,CAAC,GAAG,IAAI,OAAO,EAAE,CAAC;QACxB,CAAC,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;QAC1C,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;QACpC,CAAC,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACjD,OAAO,CAAC,CAAC;IACX,CAAC;IAES,YAAY,CAAC,IAAa,EAAE,KAAmB;QACvD,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;gBAClC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;QACL,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;OAEG;IACO,gBAAgB,CAAC,MAAoB;QAC7C,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,CAAC;QAEvB,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;aACpC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,IAAI,CAAC;aACjD,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAEnC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAErC,OAAO,IAAI,IAAI,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC;IAC5E,CAAC;IAYS,KAAK,CAAC,OAAO,CAAI,MAAc,EAAE,QAAgB,EAAE,IAAa,EAAE,OAAqB;QAC/F,IAAI,GAAG,GAAoB,IAAI,CAAC;QAChC,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,QAAQ,EAAE,EAAE;gBAC9C,MAAM;gBACN,GAAG,IAAI,CAAC,iBAAiB,EAAE;gBAC3B,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC;gBACvD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;aAC9C,CAAC,CAAC;YAEH,IAAI,IAAmB,CAAC;YACxB,IAAI,CAAC;gBACH,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC1B,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,GAAG,SAAS,CAAC;YACnB,CAAC;YAED,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;YAE/B,OAAO;gBACL,IAAI;gBACJ,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,OAAO,EAAE,GAAG,CAAC,OAAO;gBACpB,OAAO,EAAE,GAAG,CAAC,EAAE;gBACf,eAAe,EAAE,KAAK;aACvB,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;YAEvD,IAAI,gBAAgB,EAAE,CAAC;gBACrB,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC;gBAChC,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;YACtD,CAAC;YAED,OAAO;gBACL,MAAM,EAAE,GAAG,EAAE,MAAM,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;gBACnD,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC7D,OAAO,EAAE,GAAG,EAAE,OAAO,IAAI,IAAI,OAAO,EAAE;gBACtC,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,SAAS;gBACf,eAAe,EAAE,gBAAgB;aAClC,CAAC;QACJ,CAAC;IACH,CAAC;IAED,KAAK,CAAC,GAAG,CAAI,QAAgB,EAAE,OAAqB,EAAE,MAAoB;QACxE,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAClD,OAAO,IAAI,CAAC,OAAO,CAAI,KAAK,EAAE,GAAG,QAAQ,GAAG,WAAW,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACjF,CAAC;IAED,KAAK,CAAC,IAAI,CAAI,QAAgB,EAAE,IAAY,EAAE,OAAqB;QACjE,OAAO,IAAI,CAAC,OAAO,CAAI,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,KAAK,CAAI,QAAgB,EAAE,IAAY,EAAE,OAAqB;QAClE,OAAO,IAAI,CAAC,OAAO,CAAI,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,MAAM,CAAI,QAAgB,EAAE,OAAqB;QACrD,OAAO,IAAI,CAAC,OAAO,CAAI,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACjE,CAAC","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 {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
-
|
|
141
|
-
|
|
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
|
-
|
|
25
|
-
this.
|
|
26
|
-
this.
|
|
27
|
-
this.
|
|
28
|
-
this.
|
|
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;
|
|
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
|
-
|
|
3
|
-
|
|
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,
|
|
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
|