@unidy.io/sdk 1.1.2 → 1.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. package/dist/sdk/auth-B95hXtvh.js +571 -0
  2. package/dist/sdk/auth-B95hXtvh.js.map +1 -0
  3. package/dist/sdk/auth-BiFlsRm-.js +6821 -0
  4. package/dist/sdk/auth-BiFlsRm-.js.map +1 -0
  5. package/dist/sdk/auth-store-BzXDlgNb.js +179 -0
  6. package/dist/sdk/auth-store-BzXDlgNb.js.map +1 -0
  7. package/dist/sdk/auth-store-Mjo3PyJP.js +179 -0
  8. package/dist/sdk/auth-store-Mjo3PyJP.js.map +1 -0
  9. package/dist/sdk/auth-wavto6GW.js +6822 -0
  10. package/dist/sdk/auth-wavto6GW.js.map +1 -0
  11. package/dist/sdk/auth-y_LsX4Zn.js +6822 -0
  12. package/dist/sdk/auth-y_LsX4Zn.js.map +1 -0
  13. package/dist/sdk/flash-store-Cgu7WoSN.js +48 -0
  14. package/dist/sdk/flash-store-Cgu7WoSN.js.map +1 -0
  15. package/dist/sdk/flash-store-DXuduRA_.js +48 -0
  16. package/dist/sdk/flash-store-DXuduRA_.js.map +1 -0
  17. package/dist/sdk/i18n-CRBOSzNq.js +3242 -0
  18. package/dist/sdk/i18n-CRBOSzNq.js.map +1 -0
  19. package/dist/sdk/i18n-CacW7WuC.js +3242 -0
  20. package/dist/sdk/i18n-CacW7WuC.js.map +1 -0
  21. package/dist/sdk/index-BDX4bHnk.js +15349 -0
  22. package/dist/sdk/index-BDX4bHnk.js.map +1 -0
  23. package/dist/sdk/index-C5jZjlU8.js +49640 -0
  24. package/dist/sdk/index-C5jZjlU8.js.map +1 -0
  25. package/dist/sdk/index-CKre5JEG.js +15349 -0
  26. package/dist/sdk/index-CKre5JEG.js.map +1 -0
  27. package/dist/sdk/index-CYip1Wgu.js +43 -0
  28. package/dist/sdk/index-CYip1Wgu.js.map +1 -0
  29. package/dist/sdk/index-CoYUNBeF.js +43 -0
  30. package/dist/sdk/index-CoYUNBeF.js.map +1 -0
  31. package/dist/sdk/index-CvfZ-LfN.js +43 -0
  32. package/dist/sdk/index-CvfZ-LfN.js.map +1 -0
  33. package/dist/sdk/index-DJUE7Ceb.js +6254 -0
  34. package/dist/sdk/index-DJUE7Ceb.js.map +1 -0
  35. package/dist/sdk/index-DOyWRKSD.js +43 -0
  36. package/dist/sdk/index-DOyWRKSD.js.map +1 -0
  37. package/dist/sdk/index-O6h7SI7-.js +212 -0
  38. package/dist/sdk/index-O6h7SI7-.js.map +1 -0
  39. package/dist/sdk/index-XIuHpSzj.js +212 -0
  40. package/dist/sdk/index-XIuHpSzj.js.map +1 -0
  41. package/dist/sdk/index-mfIOXLHL.js +49640 -0
  42. package/dist/sdk/index-mfIOXLHL.js.map +1 -0
  43. package/dist/sdk/index.esm.js +10 -10
  44. package/dist/sdk/newsletter-helpers-C3t2fsCe.js +276 -0
  45. package/dist/sdk/newsletter-helpers-C3t2fsCe.js.map +1 -0
  46. package/dist/sdk/newsletter-helpers-CLSTOCvO.js +276 -0
  47. package/dist/sdk/newsletter-helpers-CLSTOCvO.js.map +1 -0
  48. package/dist/sdk/newsletter-helpers-CnufIbIZ.js +276 -0
  49. package/dist/sdk/newsletter-helpers-CnufIbIZ.js.map +1 -0
  50. package/dist/sdk/newsletter-helpers-MgFueAV9.js +276 -0
  51. package/dist/sdk/newsletter-helpers-MgFueAV9.js.map +1 -0
  52. package/dist/sdk/newsletter-store-CPY2gFnU.js +39 -0
  53. package/dist/sdk/newsletter-store-CPY2gFnU.js.map +1 -0
  54. package/dist/sdk/newsletter-store-CqD-GcDC.js +39 -0
  55. package/dist/sdk/newsletter-store-CqD-GcDC.js.map +1 -0
  56. package/dist/sdk/profile-helpers-Bdz6gmG8.js +36 -0
  57. package/dist/sdk/profile-helpers-Bdz6gmG8.js.map +1 -0
  58. package/dist/sdk/profile-helpers-mfEp18Tq.js +36 -0
  59. package/dist/sdk/profile-helpers-mfEp18Tq.js.map +1 -0
  60. package/dist/sdk/profile-store-BZKApsQm.js +18 -0
  61. package/dist/sdk/profile-store-BZKApsQm.js.map +1 -0
  62. package/dist/sdk/profile-store-Dr1DP9Te.js +18 -0
  63. package/dist/sdk/profile-store-Dr1DP9Te.js.map +1 -0
  64. package/dist/sdk/sdk.esm.js +2 -2
  65. package/dist/sdk/u-conditional-render.entry.js +11 -11
  66. package/dist/sdk/u-config.entry.js +11 -11
  67. package/dist/sdk/u-email-field.entry.js +6 -6
  68. package/dist/sdk/u-error-message.entry.js +6 -6
  69. package/dist/sdk/u-field.entry.js +5 -5
  70. package/dist/sdk/u-flash-message.entry.js +3 -3
  71. package/dist/sdk/u-full-profile.entry.js +5 -5
  72. package/dist/sdk/u-logout-button.entry.js +10 -10
  73. package/dist/sdk/u-magic-code-field.entry.js +9 -9
  74. package/dist/sdk/u-missing-field.entry.js +4 -4
  75. package/dist/sdk/u-missing-fields-submit-button.entry.js +8 -8
  76. package/dist/sdk/u-newsletter-checkbox.entry.js +12 -12
  77. package/dist/sdk/u-newsletter-logout-button.entry.js +11 -11
  78. package/dist/sdk/u-newsletter-preference-checkbox.entry.js +12 -12
  79. package/dist/sdk/u-newsletter-resend-doi-button.entry.js +11 -11
  80. package/dist/sdk/u-newsletter-root.entry.js +12 -12
  81. package/dist/sdk/u-newsletter-toggle-subscription-button.entry.js +12 -12
  82. package/dist/sdk/u-pagination-button.entry.js +1 -1
  83. package/dist/sdk/u-pagination-page.entry.js +1 -1
  84. package/dist/sdk/u-passkey.entry.js +9 -9
  85. package/dist/sdk/u-password-field.entry.js +5 -5
  86. package/dist/sdk/u-profile.entry.esm.js.map +1 -1
  87. package/dist/sdk/u-profile.entry.js +14 -13
  88. package/dist/sdk/u-raw-field.entry.js +3 -3
  89. package/dist/sdk/u-registration-button.entry.js +5 -5
  90. package/dist/sdk/u-reset-password-button.entry.js +9 -9
  91. package/dist/sdk/u-send-magic-code-button.entry.js +9 -9
  92. package/dist/sdk/u-signed-in.entry.js +4 -4
  93. package/dist/sdk/u-signin-root.entry.js +4 -4
  94. package/dist/sdk/u-signin-step.entry.js +10 -10
  95. package/dist/sdk/u-signin-strategy.entry.js +4 -4
  96. package/dist/sdk/u-social-login-button.entry.js +6 -6
  97. package/dist/sdk/u-spinner.entry.js +1 -1
  98. package/dist/sdk/u-submit-button.entry.js +7 -7
  99. package/dist/sdk/u-ticketable-list.entry.js +6 -6
  100. package/dist/sdk/unidy-store-CtifvCkV.js +38 -0
  101. package/dist/sdk/unidy-store-CtifvCkV.js.map +1 -0
  102. package/dist/sdk/unidy-store-DPcuwuXf.js +38 -0
  103. package/dist/sdk/unidy-store-DPcuwuXf.js.map +1 -0
  104. package/dist/types/auth/api/auth.d.ts +27 -27
  105. package/dist/types/auth/auth-helpers.d.ts +59 -59
  106. package/dist/types/profile/api/profile.d.ts +2 -2
  107. package/package.json +1 -1
@@ -0,0 +1,571 @@
1
+ import { i as createLogger, e as captureException } from './index-mfIOXLHL.js';
2
+ import { a as authStore, s as state } from './auth-store-Mjo3PyJP.js';
3
+ import { s as state$1 } from './profile-store-Dr1DP9Te.js';
4
+ import { F as Flash } from './flash-store-DXuduRA_.js';
5
+ import { c as clearUrlParam } from './component-utils-D1lzXl_Z.js';
6
+ import { t } from './i18n-CRBOSzNq.js';
7
+ import { w as waitForConfig } from './unidy-store-DPcuwuXf.js';
8
+ import { g as getUnidyClient } from './index-CKre5JEG.js';
9
+
10
+ class InvalidTokenError extends Error {
11
+ }
12
+ InvalidTokenError.prototype.name = "InvalidTokenError";
13
+ function b64DecodeUnicode(str) {
14
+ return decodeURIComponent(atob(str).replace(/(.)/g, (m, p) => {
15
+ let code = p.charCodeAt(0).toString(16).toUpperCase();
16
+ if (code.length < 2) {
17
+ code = "0" + code;
18
+ }
19
+ return "%" + code;
20
+ }));
21
+ }
22
+ function base64UrlDecode(str) {
23
+ let output = str.replace(/-/g, "+").replace(/_/g, "/");
24
+ switch (output.length % 4) {
25
+ case 0:
26
+ break;
27
+ case 2:
28
+ output += "==";
29
+ break;
30
+ case 3:
31
+ output += "=";
32
+ break;
33
+ default:
34
+ throw new Error("base64 string is not of the correct length");
35
+ }
36
+ try {
37
+ return b64DecodeUnicode(output);
38
+ }
39
+ catch (err) {
40
+ return atob(output);
41
+ }
42
+ }
43
+ function jwtDecode(token, options) {
44
+ if (typeof token !== "string") {
45
+ throw new InvalidTokenError("Invalid token specified: must be a string");
46
+ }
47
+ options || (options = {});
48
+ const pos = options.header === true ? 0 : 1;
49
+ const part = token.split(".")[pos];
50
+ if (typeof part !== "string") {
51
+ throw new InvalidTokenError(`Invalid token specified: missing part #${pos + 1}`);
52
+ }
53
+ let decoded;
54
+ try {
55
+ decoded = base64UrlDecode(part);
56
+ }
57
+ catch (e) {
58
+ throw new InvalidTokenError(`Invalid token specified: invalid base64 for part #${pos + 1} (${e.message})`);
59
+ }
60
+ try {
61
+ return JSON.parse(decoded);
62
+ }
63
+ catch (e) {
64
+ throw new InvalidTokenError(`Invalid token specified: invalid json for part #${pos + 1} (${e.message})`);
65
+ }
66
+ }
67
+
68
+ const logger = createLogger("PasskeyAuth");
69
+ const PASSKEY_ERRORS = {
70
+ NotSupportedError: "passkey_not_supported",
71
+ NotAllowedError: "passkey_cancelled",
72
+ SecurityError: "passkey_security_error",
73
+ InvalidStateError: "passkey_invalid_state",
74
+ };
75
+ function decodeBase64Url(base64url) {
76
+ const base64 = base64url.replace(/-/g, "+").replace(/_/g, "/");
77
+ const padded = base64 + "=".repeat((4 - (base64.length % 4)) % 4);
78
+ return Uint8Array.from(atob(padded), (c) => c.charCodeAt(0));
79
+ }
80
+ function buildPublicKeyOptions(options) {
81
+ return {
82
+ challenge: Uint8Array.from(atob(options.challenge), (c) => c.charCodeAt(0)),
83
+ timeout: options.timeout || 60000,
84
+ rpId: options.rpId,
85
+ userVerification: options.userVerification || "required",
86
+ allowCredentials: options.allowCredentials?.map((cred) => ({
87
+ ...cred,
88
+ id: decodeBase64Url(cred.id),
89
+ })),
90
+ };
91
+ }
92
+ function formatCredentialForServer(credential) {
93
+ const response = credential.response;
94
+ return {
95
+ id: credential.id,
96
+ rawId: btoa(String.fromCharCode(...new Uint8Array(credential.rawId))),
97
+ response: {
98
+ authenticatorData: btoa(String.fromCharCode(...new Uint8Array(response.authenticatorData))),
99
+ clientDataJSON: btoa(String.fromCharCode(...new Uint8Array(response.clientDataJSON))),
100
+ signature: btoa(String.fromCharCode(...new Uint8Array(response.signature))),
101
+ },
102
+ type: credential.type,
103
+ };
104
+ }
105
+ function extractAndSetSignInId(tokenResponse) {
106
+ if (tokenResponse.sid) {
107
+ authStore.setSignInId(tokenResponse.sid);
108
+ return;
109
+ }
110
+ // Fallback: extract sid from JWT token payload
111
+ try {
112
+ const decoded = jwtDecode(tokenResponse.jwt);
113
+ if (decoded.sid) {
114
+ authStore.setSignInId(decoded.sid);
115
+ }
116
+ }
117
+ catch {
118
+ // Failed to decode JWT token to extract sid, continue without it
119
+ }
120
+ }
121
+ function handlePasskeyError(error) {
122
+ logger.error("Passkey error:", error);
123
+ let errorMessage = "passkey_error";
124
+ if (error instanceof DOMException) {
125
+ errorMessage = PASSKEY_ERRORS[error.name] || "passkey_error";
126
+ }
127
+ authStore.setGlobalError("auth", errorMessage);
128
+ authStore.setLoading(false);
129
+ }
130
+ async function authenticateWithPasskey(client, onSuccess) {
131
+ authStore.setLoading(true);
132
+ authStore.clearErrors();
133
+ if (!window.PublicKeyCredential) {
134
+ authStore.setGlobalError("auth", "passkey_not_supported");
135
+ authStore.setLoading(false);
136
+ return;
137
+ }
138
+ try {
139
+ const [optionsError, options] = await client.auth.getPasskeyOptions(state.sid || undefined);
140
+ if (optionsError || !options) {
141
+ authStore.setGlobalError("auth", optionsError || "bad_request");
142
+ authStore.setLoading(false);
143
+ return;
144
+ }
145
+ const publicKeyOptions = buildPublicKeyOptions(options);
146
+ const credential = (await navigator.credentials.get({
147
+ publicKey: publicKeyOptions,
148
+ }));
149
+ if (!credential) {
150
+ authStore.setGlobalError("auth", "passkey_cancelled");
151
+ authStore.setLoading(false);
152
+ return;
153
+ }
154
+ const formattedCredential = formatCredentialForServer(credential);
155
+ const [verifyError, tkResponse] = await client.auth.authenticateWithPasskey(formattedCredential);
156
+ const tokenResponse = tkResponse;
157
+ if (verifyError || !tokenResponse) {
158
+ authStore.setGlobalError("auth", verifyError || "authentication_failed");
159
+ authStore.setLoading(false);
160
+ return;
161
+ }
162
+ authStore.setToken(tokenResponse.jwt);
163
+ extractAndSetSignInId(tokenResponse);
164
+ onSuccess(tokenResponse);
165
+ }
166
+ catch (error) {
167
+ handlePasskeyError(error);
168
+ }
169
+ }
170
+
171
+ class AuthHelpers {
172
+ client;
173
+ logger = createLogger("AuthHelpers");
174
+ constructor(client) {
175
+ this.client = client;
176
+ }
177
+ async createSignIn(email, password, sendMagicCode) {
178
+ if (!email) {
179
+ throw new Error(t("errors.required_field", { field: "Email" }));
180
+ }
181
+ authStore.setLoading(true);
182
+ authStore.clearErrors();
183
+ const [error, response] = await this.client.auth.createSignIn(email, password, sendMagicCode);
184
+ if (error) {
185
+ this.handleAuthError(error, response);
186
+ return;
187
+ }
188
+ if (password) {
189
+ const token = jwtDecode(response.jwt);
190
+ authStore.setSignInId(token.sid);
191
+ authStore.setToken(response.jwt);
192
+ authStore.setLoading(false);
193
+ authStore.getRootComponentRef()?.onAuth(response);
194
+ return;
195
+ }
196
+ if (sendMagicCode) {
197
+ authStore.setSignInId(response.sid);
198
+ authStore.setMagicCodeStep("sent");
199
+ authStore.setStep("magic-code");
200
+ authStore.setLoading(false);
201
+ return [error, response];
202
+ }
203
+ const signInResponse = response;
204
+ authStore.setStep("verification");
205
+ authStore.setEmail(email);
206
+ authStore.setSignInId(signInResponse.sid);
207
+ authStore.setLoginOptions(signInResponse.login_options);
208
+ authStore.setLoading(false);
209
+ }
210
+ async authenticateWithPassword(password) {
211
+ if (!state.sid) {
212
+ throw new Error(t("errors.no_sign_in_id"));
213
+ }
214
+ if (!password) {
215
+ throw new Error(t("errors.required_field", { field: "Password" }));
216
+ }
217
+ authStore.setLoading(true);
218
+ authStore.clearErrors();
219
+ const [error, response] = await this.client.auth.authenticateWithPassword(state.sid, password);
220
+ if (error) {
221
+ this.handleAuthError(error, response);
222
+ }
223
+ else {
224
+ authStore.setLoading(false);
225
+ this.handleAuthSuccess(response);
226
+ return;
227
+ }
228
+ }
229
+ handleAuthError(error, response) {
230
+ if (error === "account_not_found") {
231
+ authStore.setFieldError("email", error);
232
+ authStore.setLoading(false);
233
+ return;
234
+ }
235
+ if (error === "missing_required_fields") {
236
+ authStore.setMissingFields(response.fields);
237
+ state$1.data = response.fields;
238
+ if (response.sid) {
239
+ authStore.setSignInId(response.sid);
240
+ }
241
+ authStore.setStep("missing-fields");
242
+ authStore.setLoading(false);
243
+ return;
244
+ }
245
+ if (error === "account_locked") {
246
+ authStore.setGlobalError("auth", error);
247
+ }
248
+ else {
249
+ authStore.setFieldError("password", error);
250
+ }
251
+ authStore.setLoading(false);
252
+ }
253
+ async logout() {
254
+ const [error, _] = await this.client.auth.signOut(state.sid);
255
+ if (error) {
256
+ authStore.setGlobalError("auth", error);
257
+ }
258
+ return [error, _];
259
+ }
260
+ async refreshToken() {
261
+ if (state.step === "missing-fields") {
262
+ return;
263
+ }
264
+ this.extractSignInIdFromQuery();
265
+ if (!state.sid) {
266
+ this.logger.warn("No sign-in ID in the session");
267
+ return;
268
+ }
269
+ const [error, response] = await this.client.auth.refreshToken(state.sid);
270
+ if (error) {
271
+ authStore.reset();
272
+ authStore.setGlobalError("auth", error);
273
+ }
274
+ else {
275
+ authStore.setToken(response.jwt);
276
+ }
277
+ }
278
+ handleSocialAuthRedirect() {
279
+ // missing required fields flow
280
+ const url = new URL(window.location.href);
281
+ const params = url.searchParams;
282
+ const error = params.get("error");
283
+ if (error !== "missing_required_fields") {
284
+ return;
285
+ }
286
+ const fieldsFromUrl = params.get("fields");
287
+ if (!fieldsFromUrl) {
288
+ return;
289
+ }
290
+ const signInId = params.get("sid");
291
+ if (signInId) {
292
+ authStore.setSignInId(signInId);
293
+ }
294
+ else {
295
+ return;
296
+ }
297
+ try {
298
+ const fields = JSON.parse(fieldsFromUrl);
299
+ authStore.setMissingFields(fields);
300
+ state$1.data = fields;
301
+ authStore.setStep("missing-fields");
302
+ params.delete("error");
303
+ params.delete("fields");
304
+ const cleanUrl = `${url.origin}${url.pathname}${url.hash}`;
305
+ window.history.replaceState(null, "", cleanUrl);
306
+ }
307
+ catch (e) {
308
+ this.logger.error("Failed to parse missing fields payload:", e);
309
+ authStore.setGlobalError("auth", "invalid_required_fields_payload");
310
+ }
311
+ }
312
+ async sendMagicCode() {
313
+ if (!state.sid && state.step !== "single-login") {
314
+ throw new Error(t("errors.no_sign_in_id"));
315
+ }
316
+ authStore.setMagicCodeStep("requested");
317
+ authStore.setLoading(true);
318
+ authStore.clearErrors();
319
+ if (state.step === "single-login") {
320
+ const [error, response] = await this.createSignIn(state.email, undefined, true);
321
+ authStore.setLoading(false);
322
+ return [error, response];
323
+ }
324
+ const [error, response] = await this.client.auth.sendMagicCode(state.sid);
325
+ authStore.setLoading(false);
326
+ authStore.setStep("magic-code");
327
+ if (!error) {
328
+ authStore.setMagicCodeStep("sent");
329
+ return [null, response];
330
+ }
331
+ authStore.setFieldError("magicCode", error);
332
+ if (error === "magic_code_recently_created") {
333
+ authStore.setMagicCodeStep("sent");
334
+ }
335
+ return [error, response];
336
+ }
337
+ async authenticateWithMagicCode(code) {
338
+ if (!state.sid) {
339
+ throw new Error(t("errors.no_sign_in_id"));
340
+ }
341
+ if (!code) {
342
+ throw new Error(t("errors.magic_code_is_missing"));
343
+ }
344
+ authStore.setLoading(true);
345
+ authStore.clearErrors();
346
+ const [error, response] = await this.client.auth.authenticateWithMagicCode(state.sid, code);
347
+ if (!error) {
348
+ this.handleAuthSuccess(response);
349
+ return;
350
+ }
351
+ if (error === "missing_required_fields") {
352
+ this.handleMissingFields(response);
353
+ return;
354
+ }
355
+ authStore.setLoading(false);
356
+ authStore.setFieldError("magicCode", error);
357
+ }
358
+ async sendResetPasswordEmail() {
359
+ if (!state.sid) {
360
+ throw new Error(t("errors.no_sign_in_id"));
361
+ }
362
+ authStore.setLoading(true);
363
+ authStore.setResetPasswordStep("requested");
364
+ const [error, _] = await this.client.auth.sendResetPasswordEmail(state.sid, window.location.href);
365
+ if (error) {
366
+ authStore.setFieldError("resetPassword", error);
367
+ }
368
+ else {
369
+ authStore.setResetPasswordStep("sent");
370
+ authStore.clearErrors();
371
+ }
372
+ authStore.setLoading(false);
373
+ }
374
+ async handleResetPasswordRedirect() {
375
+ const url = new URL(window.location.href);
376
+ const params = url.searchParams;
377
+ const resetToken = params.get("reset_password_token");
378
+ if (!resetToken) {
379
+ return false;
380
+ }
381
+ if (state.sid) {
382
+ authStore.setLoading(true);
383
+ const [error] = await this.client.auth.validateResetPasswordToken(state.sid, resetToken);
384
+ if (error) {
385
+ authStore.setFieldError("resetPassword", error);
386
+ authStore.setStep("reset-password");
387
+ authStore.setLoading(false);
388
+ return false;
389
+ }
390
+ }
391
+ authStore.setResetToken(resetToken);
392
+ authStore.setStep("reset-password");
393
+ authStore.setLoading(false);
394
+ return true;
395
+ }
396
+ async resetPassword() {
397
+ if (!state.resetPassword.token) {
398
+ throw new Error("No reset token available");
399
+ }
400
+ if (!state.resetPassword.newPassword) {
401
+ authStore.setFieldError("resetPassword", "password_required");
402
+ return;
403
+ }
404
+ if (state.resetPassword.passwordConfirmation &&
405
+ state.resetPassword.newPassword !== state.resetPassword.passwordConfirmation) {
406
+ authStore.setFieldError("resetPassword", "passwords_do_not_match");
407
+ return;
408
+ }
409
+ authStore.setLoading(true);
410
+ authStore.clearErrors();
411
+ const [error, response] = await this.client.auth.resetPassword(state.sid, state.resetPassword.token, state.resetPassword.newPassword, state.resetPassword.passwordConfirmation);
412
+ if (error) {
413
+ authStore.setFieldError("resetPassword", error);
414
+ // TODO: add proper password requirements handling --> for now this is fine
415
+ if (error === "invalid_password") {
416
+ authStore.setFieldError("password", response.error_details?.password.map((p) => t(`errors.password_requirements.${p}`)).join("\n"));
417
+ }
418
+ }
419
+ else {
420
+ authStore.setStep("email");
421
+ authStore.updateResetPassword({
422
+ step: "completed",
423
+ token: null,
424
+ newPassword: "",
425
+ passwordConfirmation: "",
426
+ });
427
+ clearUrlParam("reset_password_token");
428
+ Flash.success.addMessage("Password reset successfully");
429
+ }
430
+ authStore.setLoading(false);
431
+ }
432
+ authenticateWithPasskey() {
433
+ return authenticateWithPasskey(this.client, (response) => this.handleAuthSuccess(response));
434
+ }
435
+ extractSignInIdFromQuery() {
436
+ const sid = clearUrlParam("sid");
437
+ if (sid) {
438
+ authStore.setSignInId(sid);
439
+ }
440
+ }
441
+ handleMissingFields(response) {
442
+ authStore.setMissingFields(response.fields);
443
+ state$1.data = response.fields;
444
+ authStore.setStep("missing-fields");
445
+ authStore.setLoading(false);
446
+ }
447
+ handleAuthSuccess(response) {
448
+ authStore.setToken(response.jwt);
449
+ authStore.setLoading(false);
450
+ authStore.getRootComponentRef()?.onAuth(response);
451
+ }
452
+ }
453
+
454
+ class Auth {
455
+ static instance;
456
+ helpers;
457
+ constructor(client) {
458
+ this.helpers = new AuthHelpers(client);
459
+ this.helpers.handleSocialAuthRedirect();
460
+ this.helpers.handleResetPasswordRedirect();
461
+ }
462
+ static Errors = {
463
+ email: {
464
+ NOT_FOUND: "account_not_found",
465
+ },
466
+ magicCode: {
467
+ RECENTLY_CREATED: "magic_code_recently_created",
468
+ NOT_VALID: "magic_code_not_valid",
469
+ EXPIRED: "magic_code_expired",
470
+ USED: "magic_code_used",
471
+ },
472
+ password: {
473
+ INVALID: "invalid_password",
474
+ NOT_SET: "password_not_set",
475
+ RESET_PASSWORD_ALREADY_SENT: "reset_password_already_sent",
476
+ },
477
+ general: {
478
+ ACCOUNT_LOCKED: "account_locked",
479
+ SIGN_IN_EXPIRED: "sign_in_expired",
480
+ },
481
+ };
482
+ static async getInstance() {
483
+ if (!Auth.isInitialized()) {
484
+ await waitForConfig();
485
+ return Auth.initialize(getUnidyClient());
486
+ }
487
+ return Auth.instance;
488
+ }
489
+ static initialize(client) {
490
+ Auth.instance = new Auth(client);
491
+ if (Auth.instance.isTokenValid(state.token)) {
492
+ authStore.setAuthenticated(true);
493
+ }
494
+ return Auth.instance;
495
+ }
496
+ static isInitialized() {
497
+ return !!Auth.instance;
498
+ }
499
+ isTokenValid(token) {
500
+ try {
501
+ let decoded;
502
+ if (typeof token === "string") {
503
+ decoded = jwtDecode(token);
504
+ }
505
+ else {
506
+ decoded = token;
507
+ }
508
+ if (!decoded)
509
+ return false;
510
+ const currentTime = Date.now() / 1000;
511
+ return decoded.exp > currentTime;
512
+ }
513
+ catch (error) {
514
+ captureException(error);
515
+ return false;
516
+ }
517
+ }
518
+ async isAuthenticated() {
519
+ const token = await this.getToken();
520
+ return typeof token === "string";
521
+ }
522
+ async getToken() {
523
+ const currentToken = state.token;
524
+ if (currentToken && this.isTokenValid(currentToken)) {
525
+ return currentToken;
526
+ }
527
+ await this.helpers.refreshToken();
528
+ if (state.globalErrors.auth || !state.token) {
529
+ return this.createAuthError(t("errors.refresh_failed"), "REFRESH_FAILED", true);
530
+ }
531
+ return state.token;
532
+ }
533
+ async userData() {
534
+ const token = await this.getToken();
535
+ if (typeof token !== "string") {
536
+ return null;
537
+ }
538
+ if (!token) {
539
+ return null;
540
+ }
541
+ try {
542
+ return jwtDecode(token);
543
+ }
544
+ catch (error) {
545
+ captureException(error);
546
+ return null;
547
+ }
548
+ }
549
+ async logout() {
550
+ const [error, _] = await this.helpers.logout();
551
+ if (error) {
552
+ return this.createAuthError(t("errors.sign_out_failed", { reason: error }), "SIGN_OUT_FAILED", false);
553
+ }
554
+ authStore.reset();
555
+ return true;
556
+ }
557
+ getEmail() {
558
+ return state.email;
559
+ }
560
+ createAuthError(message, code, requiresReauth = false) {
561
+ const error = new Error(message);
562
+ error.code = code;
563
+ error.requiresReauth = requiresReauth;
564
+ return error;
565
+ }
566
+ }
567
+
568
+ export { Auth as A };
569
+ //# sourceMappingURL=auth-B95hXtvh.js.map
570
+
571
+ //# sourceMappingURL=auth-B95hXtvh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-B95hXtvh.js","sources":["../../node_modules/jwt-decode/build/esm/index.js","src/auth/passkey-auth.ts","src/auth/auth-helpers.ts","src/auth/auth.ts"],"sourcesContent":["export class InvalidTokenError extends Error {\n}\nInvalidTokenError.prototype.name = \"InvalidTokenError\";\nfunction b64DecodeUnicode(str) {\n return decodeURIComponent(atob(str).replace(/(.)/g, (m, p) => {\n let code = p.charCodeAt(0).toString(16).toUpperCase();\n if (code.length < 2) {\n code = \"0\" + code;\n }\n return \"%\" + code;\n }));\n}\nfunction base64UrlDecode(str) {\n let output = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n switch (output.length % 4) {\n case 0:\n break;\n case 2:\n output += \"==\";\n break;\n case 3:\n output += \"=\";\n break;\n default:\n throw new Error(\"base64 string is not of the correct length\");\n }\n try {\n return b64DecodeUnicode(output);\n }\n catch (err) {\n return atob(output);\n }\n}\nexport function jwtDecode(token, options) {\n if (typeof token !== \"string\") {\n throw new InvalidTokenError(\"Invalid token specified: must be a string\");\n }\n options || (options = {});\n const pos = options.header === true ? 0 : 1;\n const part = token.split(\".\")[pos];\n if (typeof part !== \"string\") {\n throw new InvalidTokenError(`Invalid token specified: missing part #${pos + 1}`);\n }\n let decoded;\n try {\n decoded = base64UrlDecode(part);\n }\n catch (e) {\n throw new InvalidTokenError(`Invalid token specified: invalid base64 for part #${pos + 1} (${e.message})`);\n }\n try {\n return JSON.parse(decoded);\n }\n catch (e) {\n throw new InvalidTokenError(`Invalid token specified: invalid json for part #${pos + 1} (${e.message})`);\n }\n}\n","import { jwtDecode } from \"jwt-decode\";\nimport type { PasskeyOptionsResponse, TokenResponse, UnidyClient } from \"../api\";\nimport { createLogger } from \"../logger\";\nimport type { TokenPayload } from \"./auth\";\nimport { authState, authStore } from \"./store/auth-store\";\n\nconst logger = createLogger(\"PasskeyAuth\");\n\nconst PASSKEY_ERRORS: Record<string, string> = {\n NotSupportedError: \"passkey_not_supported\",\n NotAllowedError: \"passkey_cancelled\",\n SecurityError: \"passkey_security_error\",\n InvalidStateError: \"passkey_invalid_state\",\n};\n\nfunction decodeBase64Url(base64url: string): Uint8Array {\n const base64 = base64url.replace(/-/g, \"+\").replace(/_/g, \"/\");\n const padded = base64 + \"=\".repeat((4 - (base64.length % 4)) % 4);\n return Uint8Array.from(atob(padded), (c) => c.charCodeAt(0));\n}\n\nfunction buildPublicKeyOptions(options: PasskeyOptionsResponse): PublicKeyCredentialRequestOptions {\n return {\n challenge: Uint8Array.from(atob(options.challenge), (c) => c.charCodeAt(0)),\n timeout: options.timeout || 60000,\n rpId: options.rpId,\n userVerification: (options.userVerification as UserVerificationRequirement) || \"required\",\n allowCredentials: options.allowCredentials?.map((cred) => ({\n ...cred,\n id: decodeBase64Url(cred.id),\n })),\n };\n}\n\nfunction formatCredentialForServer(credential: PublicKeyCredential) {\n const response = credential.response as AuthenticatorAssertionResponse;\n return {\n id: credential.id,\n rawId: btoa(String.fromCharCode(...new Uint8Array(credential.rawId))),\n response: {\n authenticatorData: btoa(String.fromCharCode(...new Uint8Array(response.authenticatorData))),\n clientDataJSON: btoa(String.fromCharCode(...new Uint8Array(response.clientDataJSON))),\n signature: btoa(String.fromCharCode(...new Uint8Array(response.signature))),\n },\n type: credential.type,\n };\n}\n\nfunction extractAndSetSignInId(tokenResponse: TokenResponse) {\n if (tokenResponse.sid) {\n authStore.setSignInId(tokenResponse.sid);\n return;\n }\n\n // Fallback: extract sid from JWT token payload\n try {\n const decoded = jwtDecode<TokenPayload>(tokenResponse.jwt);\n if (decoded.sid) {\n authStore.setSignInId(decoded.sid);\n }\n } catch {\n // Failed to decode JWT token to extract sid, continue without it\n }\n}\n\nfunction handlePasskeyError(error: unknown) {\n logger.error(\"Passkey error:\", error);\n\n let errorMessage = \"passkey_error\";\n if (error instanceof DOMException) {\n errorMessage = PASSKEY_ERRORS[error.name] || \"passkey_error\";\n }\n\n authStore.setGlobalError(\"auth\", errorMessage);\n authStore.setLoading(false);\n}\n\nexport async function authenticateWithPasskey(client: UnidyClient, onSuccess: (response: TokenResponse) => void) {\n authStore.setLoading(true);\n authStore.clearErrors();\n\n if (!window.PublicKeyCredential) {\n authStore.setGlobalError(\"auth\", \"passkey_not_supported\");\n authStore.setLoading(false);\n return;\n }\n\n try {\n const [optionsError, options] = await client.auth.getPasskeyOptions(authState.sid || undefined);\n\n if (optionsError || !options) {\n authStore.setGlobalError(\"auth\", optionsError || \"bad_request\");\n authStore.setLoading(false);\n return;\n }\n\n const publicKeyOptions = buildPublicKeyOptions(options as PasskeyOptionsResponse);\n\n const credential = (await navigator.credentials.get({\n publicKey: publicKeyOptions,\n })) as PublicKeyCredential | null;\n\n if (!credential) {\n authStore.setGlobalError(\"auth\", \"passkey_cancelled\");\n authStore.setLoading(false);\n return;\n }\n\n const formattedCredential = formatCredentialForServer(credential);\n\n const [verifyError, tkResponse] = await client.auth.authenticateWithPasskey(formattedCredential);\n\n const tokenResponse = tkResponse as TokenResponse;\n if (verifyError || !tokenResponse) {\n authStore.setGlobalError(\"auth\", verifyError || \"authentication_failed\");\n authStore.setLoading(false);\n return;\n }\n\n authStore.setToken(tokenResponse.jwt);\n extractAndSetSignInId(tokenResponse);\n onSuccess(tokenResponse);\n } catch (error) {\n handlePasskeyError(error);\n }\n}\n","import { authStore, authState } from \"../auth/store/auth-store\";\nimport type { CreateSignInResponse, RequiredFieldsResponse, TokenResponse, UnidyClient } from \"../api\";\nimport type { ProfileRaw } from \"../profile\";\nimport { state as profileState } from \"../profile/store/profile-store\";\nimport { Flash } from \"../shared/store/flash-store\";\nimport { clearUrlParam } from \"../shared/component-utils\";\nimport { t } from \"../i18n\";\nimport { authenticateWithPasskey } from \"./passkey-auth\";\nimport { jwtDecode } from \"jwt-decode\";\nimport type { TokenPayload } from \"./auth\";\nimport { createLogger } from \"../logger\";\n\nexport class AuthHelpers {\n private client: UnidyClient;\n private logger = createLogger(\"AuthHelpers\");\n\n constructor(client: UnidyClient) {\n this.client = client;\n }\n\n async createSignIn(email: string, password?: string, sendMagicCode?: boolean) {\n if (!email) {\n throw new Error(t(\"errors.required_field\", { field: \"Email\" }));\n }\n\n authStore.setLoading(true);\n authStore.clearErrors();\n\n const [error, response] = await this.client.auth.createSignIn(email, password, sendMagicCode);\n\n if (error) {\n this.handleAuthError(error, response);\n return;\n }\n\n if (password) {\n const token = jwtDecode<TokenPayload>((response as TokenResponse).jwt);\n authStore.setSignInId(token.sid);\n authStore.setToken((response as TokenResponse).jwt);\n authStore.setLoading(false);\n authStore.getRootComponentRef()?.onAuth(response as TokenResponse);\n return;\n }\n\n if (sendMagicCode) {\n authStore.setSignInId((response as CreateSignInResponse).sid);\n authStore.setMagicCodeStep(\"sent\");\n authStore.setStep(\"magic-code\");\n authStore.setLoading(false);\n return [error, response] as const;\n }\n const signInResponse = response as CreateSignInResponse;\n authStore.setStep(\"verification\");\n authStore.setEmail(email);\n authStore.setSignInId(signInResponse.sid);\n authStore.setLoginOptions(signInResponse.login_options);\n authStore.setLoading(false);\n }\n\n async authenticateWithPassword(password: string) {\n if (!authState.sid) {\n throw new Error(t(\"errors.no_sign_in_id\"));\n }\n\n if (!password) {\n throw new Error(t(\"errors.required_field\", { field: \"Password\" }));\n }\n\n authStore.setLoading(true);\n authStore.clearErrors();\n\n const [error, response] = await this.client.auth.authenticateWithPassword(authState.sid, password);\n\n if (error) {\n this.handleAuthError(error, response);\n } else {\n authStore.setLoading(false);\n this.handleAuthSuccess(response as TokenResponse);\n return;\n }\n }\n\n private handleAuthError(error: string, response: unknown) {\n if (error === \"account_not_found\") {\n authStore.setFieldError(\"email\", error);\n authStore.setLoading(false);\n return;\n }\n if (error === \"missing_required_fields\") {\n authStore.setMissingFields((response as RequiredFieldsResponse).fields);\n profileState.data = (response as RequiredFieldsResponse).fields as ProfileRaw;\n\n if ((response as RequiredFieldsResponse).sid) {\n authStore.setSignInId((response as RequiredFieldsResponse).sid as string);\n }\n\n authStore.setStep(\"missing-fields\");\n authStore.setLoading(false);\n return;\n }\n if (error === \"account_locked\") {\n authStore.setGlobalError(\"auth\", error);\n } else {\n authStore.setFieldError(\"password\", error);\n }\n authStore.setLoading(false);\n }\n\n async logout() {\n const [error, _] = await this.client.auth.signOut(authState.sid as string);\n\n if (error) {\n authStore.setGlobalError(\"auth\", error);\n }\n\n return [error, _] as const;\n }\n\n async refreshToken() {\n if (authState.step === \"missing-fields\") {\n return;\n }\n this.extractSignInIdFromQuery();\n\n if (!authState.sid) {\n this.logger.warn(\"No sign-in ID in the session\");\n return;\n }\n\n const [error, response] = await this.client.auth.refreshToken(authState.sid);\n\n if (error) {\n authStore.reset();\n authStore.setGlobalError(\"auth\", error);\n } else {\n authStore.setToken((response as TokenResponse).jwt);\n }\n }\n\n handleSocialAuthRedirect(): void {\n // missing required fields flow\n const url = new URL(window.location.href);\n const params = url.searchParams;\n const error = params.get(\"error\");\n\n if (error !== \"missing_required_fields\") {\n return;\n }\n\n const fieldsFromUrl = params.get(\"fields\");\n if (!fieldsFromUrl) {\n return;\n }\n\n const signInId = params.get(\"sid\");\n if (signInId) {\n authStore.setSignInId(signInId);\n } else {\n return;\n }\n\n try {\n const fields = JSON.parse(fieldsFromUrl);\n\n authStore.setMissingFields(fields);\n profileState.data = fields as ProfileRaw;\n authStore.setStep(\"missing-fields\");\n\n params.delete(\"error\");\n params.delete(\"fields\");\n const cleanUrl = `${url.origin}${url.pathname}${url.hash}`;\n window.history.replaceState(null, \"\", cleanUrl);\n } catch (e) {\n this.logger.error(\"Failed to parse missing fields payload:\", e);\n authStore.setGlobalError(\"auth\", \"invalid_required_fields_payload\");\n }\n }\n\n async sendMagicCode() {\n if (!authState.sid && authState.step !== \"single-login\") {\n throw new Error(t(\"errors.no_sign_in_id\"));\n }\n\n authStore.setMagicCodeStep(\"requested\");\n authStore.setLoading(true);\n authStore.clearErrors();\n\n if (authState.step === \"single-login\") {\n const [error, response] = await this.createSignIn(authState.email, undefined, true);\n authStore.setLoading(false);\n return [error, response] as const;\n }\n\n const [error, response] = await this.client.auth.sendMagicCode(authState.sid);\n\n authStore.setLoading(false);\n\n authStore.setStep(\"magic-code\");\n\n if (!error) {\n authStore.setMagicCodeStep(\"sent\");\n\n return [null, response] as const;\n }\n\n authStore.setFieldError(\"magicCode\", error);\n\n if (error === \"magic_code_recently_created\") {\n authStore.setMagicCodeStep(\"sent\");\n }\n\n return [error, response] as const;\n }\n\n async authenticateWithMagicCode(code: string) {\n if (!authState.sid) {\n throw new Error(t(\"errors.no_sign_in_id\"));\n }\n\n if (!code) {\n throw new Error(t(\"errors.magic_code_is_missing\"));\n }\n\n authStore.setLoading(true);\n authStore.clearErrors();\n\n const [error, response] = await this.client.auth.authenticateWithMagicCode(authState.sid, code);\n\n if (!error) {\n this.handleAuthSuccess(response as TokenResponse);\n return;\n }\n\n if (error === \"missing_required_fields\") {\n this.handleMissingFields(response as RequiredFieldsResponse);\n return;\n }\n\n authStore.setLoading(false);\n authStore.setFieldError(\"magicCode\", error);\n }\n\n async sendResetPasswordEmail() {\n if (!authState.sid) {\n throw new Error(t(\"errors.no_sign_in_id\"));\n }\n\n authStore.setLoading(true);\n authStore.setResetPasswordStep(\"requested\");\n\n const [error, _] = await this.client.auth.sendResetPasswordEmail(authState.sid, window.location.href);\n\n if (error) {\n authStore.setFieldError(\"resetPassword\", error);\n } else {\n authStore.setResetPasswordStep(\"sent\");\n authStore.clearErrors();\n }\n\n authStore.setLoading(false);\n }\n\n async handleResetPasswordRedirect(): Promise<boolean> {\n const url = new URL(window.location.href);\n const params = url.searchParams;\n const resetToken = params.get(\"reset_password_token\");\n\n if (!resetToken) {\n return false;\n }\n\n if (authState.sid) {\n authStore.setLoading(true);\n\n const [error] = await this.client.auth.validateResetPasswordToken(authState.sid, resetToken);\n\n if (error) {\n authStore.setFieldError(\"resetPassword\", error);\n authStore.setStep(\"reset-password\");\n authStore.setLoading(false);\n return false;\n }\n }\n\n authStore.setResetToken(resetToken);\n authStore.setStep(\"reset-password\");\n authStore.setLoading(false);\n\n return true;\n }\n\n async resetPassword() {\n if (!authState.resetPassword.token) {\n throw new Error(\"No reset token available\");\n }\n\n if (!authState.resetPassword.newPassword) {\n authStore.setFieldError(\"resetPassword\", \"password_required\");\n return;\n }\n\n if (\n authState.resetPassword.passwordConfirmation &&\n authState.resetPassword.newPassword !== authState.resetPassword.passwordConfirmation\n ) {\n authStore.setFieldError(\"resetPassword\", \"passwords_do_not_match\");\n return;\n }\n\n authStore.setLoading(true);\n authStore.clearErrors();\n\n const [error, response] = await this.client.auth.resetPassword(\n authState.sid as string,\n authState.resetPassword.token,\n authState.resetPassword.newPassword,\n authState.resetPassword.passwordConfirmation,\n );\n\n if (error) {\n authStore.setFieldError(\"resetPassword\", error);\n\n // TODO: add proper password requirements handling --> for now this is fine\n if (error === \"invalid_password\") {\n authStore.setFieldError(\"password\", response.error_details?.password.map((p) => t(`errors.password_requirements.${p}`)).join(\"\\n\"));\n }\n } else {\n authStore.setStep(\"email\");\n authStore.updateResetPassword({\n step: \"completed\",\n token: null,\n newPassword: \"\",\n passwordConfirmation: \"\",\n });\n\n clearUrlParam(\"reset_password_token\");\n Flash.success.addMessage(\"Password reset successfully\");\n }\n\n authStore.setLoading(false);\n }\n\n authenticateWithPasskey() {\n return authenticateWithPasskey(this.client, (response) => this.handleAuthSuccess(response));\n }\n\n private extractSignInIdFromQuery() {\n const sid = clearUrlParam(\"sid\");\n\n if (sid) {\n authStore.setSignInId(sid);\n }\n }\n\n private handleMissingFields(response: RequiredFieldsResponse) {\n authStore.setMissingFields(response.fields);\n profileState.data = response.fields as ProfileRaw;\n authStore.setStep(\"missing-fields\");\n authStore.setLoading(false);\n }\n\n private handleAuthSuccess(response: TokenResponse) {\n authStore.setToken(response.jwt);\n authStore.setLoading(false);\n authStore.getRootComponentRef()?.onAuth(response);\n }\n}\n","import * as Sentry from \"@sentry/browser\";\nimport type { UnidyClient } from \"../api\";\nimport { authStore, authState } from \"./store/auth-store\";\nimport { jwtDecode } from \"jwt-decode\";\nimport { AuthHelpers } from \"./auth-helpers\";\nimport { waitForConfig } from \"../shared/store/unidy-store\";\nimport { getUnidyClient } from \"../api\";\nimport { t } from \"../i18n\";\n\nexport interface TokenPayload {\n sub: string; // unidy id\n sid: string; // sign-in id\n exp: number;\n iat: number;\n iss: string;\n aud: string;\n nonce: string;\n auth_time: number;\n email: string;\n email_verified: boolean;\n [key: string]: unknown;\n}\n\nexport type AuthError = Error & {\n code: \"TOKEN_EXPIRED\" | \"REFRESH_FAILED\" | \"NO_TOKEN\" | \"INVALID_TOKEN\" | \"SIGN_IN_NOT_FOUND\" | \"SIGN_OUT_FAILED\";\n requiresReauth: boolean;\n};\n\nexport class Auth {\n private static instance: Auth;\n\n readonly helpers: AuthHelpers;\n\n private constructor(client: UnidyClient) {\n this.helpers = new AuthHelpers(client);\n this.helpers.handleSocialAuthRedirect();\n this.helpers.handleResetPasswordRedirect();\n }\n\n static Errors = {\n email: {\n NOT_FOUND: \"account_not_found\",\n },\n magicCode: {\n RECENTLY_CREATED: \"magic_code_recently_created\",\n NOT_VALID: \"magic_code_not_valid\",\n EXPIRED: \"magic_code_expired\",\n USED: \"magic_code_used\",\n },\n password: {\n INVALID: \"invalid_password\",\n NOT_SET: \"password_not_set\",\n RESET_PASSWORD_ALREADY_SENT: \"reset_password_already_sent\",\n },\n general: {\n ACCOUNT_LOCKED: \"account_locked\",\n SIGN_IN_EXPIRED: \"sign_in_expired\",\n },\n } as const;\n\n static async getInstance(): Promise<Auth> {\n if (!Auth.isInitialized()) {\n await waitForConfig();\n\n return Auth.initialize(getUnidyClient());\n }\n\n return Auth.instance;\n }\n\n static initialize(client: UnidyClient): Auth {\n Auth.instance = new Auth(client);\n\n if (Auth.instance.isTokenValid(authState.token)) {\n authStore.setAuthenticated(true);\n }\n\n return Auth.instance;\n }\n\n static isInitialized(): boolean {\n return !!Auth.instance;\n }\n\n isTokenValid(token: string | TokenPayload | null): boolean {\n try {\n let decoded: TokenPayload | null;\n\n if (typeof token === \"string\") {\n decoded = jwtDecode<TokenPayload>(token);\n } else {\n decoded = token;\n }\n\n if (!decoded) return false;\n\n const currentTime = Date.now() / 1000;\n return decoded.exp > currentTime;\n } catch (error) {\n Sentry.captureException(error);\n return false;\n }\n }\n\n async isAuthenticated(): Promise<boolean> {\n const token = await this.getToken();\n return typeof token === \"string\";\n }\n\n async getToken(): Promise<string | AuthError> {\n const currentToken = authState.token;\n\n if (currentToken && this.isTokenValid(currentToken)) {\n return currentToken;\n }\n\n await this.helpers.refreshToken();\n\n if (authState.globalErrors.auth || !authState.token) {\n return this.createAuthError(t(\"errors.refresh_failed\"), \"REFRESH_FAILED\", true);\n }\n\n return authState.token as string;\n }\n\n async userData(): Promise<TokenPayload | null> {\n const token = await this.getToken();\n\n if (typeof token !== \"string\") {\n return null;\n }\n\n if (!token) {\n return null;\n }\n\n try {\n return jwtDecode<TokenPayload>(token);\n } catch (error) {\n Sentry.captureException(error);\n return null;\n }\n }\n\n async logout(): Promise<boolean | AuthError> {\n const [error, _] = await this.helpers.logout();\n\n if (error) {\n return this.createAuthError(t(\"errors.sign_out_failed\", { reason: error }), \"SIGN_OUT_FAILED\", false);\n }\n\n authStore.reset();\n\n return true;\n }\n\n getEmail(): string | null {\n return authState.email;\n }\n\n private createAuthError(message: string, code: AuthError[\"code\"], requiresReauth = false): AuthError {\n const error = new Error(message) as AuthError;\n error.code = code;\n error.requiresReauth = requiresReauth;\n\n return error;\n }\n}\n"],"names":["authState","profileState","Sentry.captureException"],"mappings":"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","x_google_ignoreList":[0]}