@burdenoff/fe-libs 2026.518.5 → 2026.518.7

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.
@@ -20,6 +20,21 @@ export declare function markSSORedirectAttempt(relayOrigin: string, returnTo: st
20
20
  *
21
21
  * Call this from ProtectedRoute or LandingOrDashboardRedirect
22
22
  * before showing login page.
23
+ *
24
+ * Two discovery paths:
25
+ * 1. `bf-sso` cookie on the current origin pointing at a different
26
+ * product origin (set during a previous same-origin login). Used when
27
+ * the cookie can travel cross-subdomain (e.g. *.local.burdenoff.com).
28
+ * Falls through silently otherwise.
29
+ * 2. Central bridge host (alphaapp/app.burdenoff.com) fallback: cross
30
+ * eTLD+1 product hostnames can't share cookies with each other, so we
31
+ * optimistically redirect to the bridge host's `/auth/sso-relay`. The
32
+ * bridge host reads ITS own (first-party, unpartitioned) localStorage
33
+ * — which receives tokens from every product login via the deposit
34
+ * flow — and bounces them back to the original product origin via
35
+ * `/auth/sso-callback#sso=...`. On no central session the bridge
36
+ * bounces back with `?sso_failed=1` and `isAutoSSOSuppressed` keeps
37
+ * the user on the login screen.
23
38
  */
24
39
  export declare function getSSORedirectUrl(returnPath?: string): string | null;
25
40
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"SSORedirectGuard.d.ts","sourceRoot":"","sources":["../../../src/shared/components/SSORedirectGuard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAoGH,wBAAgB,qBAAqB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAGlE;AAED,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAM1F;AAED,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAiBlF;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAyBpE;AAED;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,IAAI,OAAO,CA6BlC;AAED;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAyC9F;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CA6B1C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,4CAMjC"}
1
+ {"version":3,"file":"SSORedirectGuard.d.ts","sourceRoot":"","sources":["../../../src/shared/components/SSORedirectGuard.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAqGH,wBAAgB,qBAAqB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAGlE;AAED,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAM1F;AAED,wBAAgB,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAiBlF;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAqCpE;AAED;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,IAAI,OAAO,CA6BlC;AAED;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAyC9F;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,IAAI,CA6B1C;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,4CAMjC"}
@@ -1,13 +1,14 @@
1
- import { clearActiveContextStorage as e } from "../providers/shell/ActiveContextStorage.js";
2
- import { clearShellSsoCookies as t, isSharedSsoCookieDomain as n, isTrustedSsoOrigin as r, readShellSsoCookie as i } from "../utils/authCookie.js";
3
- import { jsx as a } from "react/jsx-runtime";
1
+ import { resolveAuthBridgeConfig as e } from "../config/authBridgeUrls.js";
2
+ import { clearActiveContextStorage as t } from "../providers/shell/ActiveContextStorage.js";
3
+ import { clearShellSsoCookies as n, isSharedSsoCookieDomain as r, isTrustedSsoOrigin as i, readShellSsoCookie as a } from "../utils/authCookie.js";
4
+ import { jsx as o } from "react/jsx-runtime";
4
5
  //#region src/shared/components/SSORedirectGuard.tsx
5
- var o = "bf-sso-relay-attempt", s = 120 * 1e3, c = [
6
+ var s = "bf-sso-relay-attempt", c = 120 * 1e3, l = [
6
7
  "sso_failed",
7
8
  "sso-failed",
8
9
  "sso-attempted"
9
10
  ];
10
- function l(e) {
11
+ function u(e) {
11
12
  if (typeof window > "u") return null;
12
13
  try {
13
14
  let t = `${window.location.pathname}${window.location.search}${window.location.hash}`, n = new URL(e ?? t, window.location.origin);
@@ -16,87 +17,93 @@ function l(e) {
16
17
  return null;
17
18
  }
18
19
  }
19
- function u(e) {
20
- return e === "/auth" || e.startsWith("/auth/");
21
- }
22
20
  function d(e) {
23
- return c.some((t) => e.searchParams.has(t));
21
+ return e === "/auth" || e.startsWith("/auth/");
24
22
  }
25
23
  function f(e) {
26
- if (d(e)) return t(), !0;
27
- if (u(e.pathname)) return !0;
28
- let n = e.searchParams.get("reason");
29
- return n === "session-expired" || n === "logout";
24
+ return l.some((t) => e.searchParams.has(t));
25
+ }
26
+ function p(e) {
27
+ if (f(e)) return n(), !0;
28
+ if (d(e.pathname)) return !0;
29
+ let t = e.searchParams.get("reason");
30
+ return t === "session-expired" || t === "logout";
30
31
  }
31
- function p() {
32
+ function m() {
32
33
  try {
33
- sessionStorage.removeItem(o);
34
+ sessionStorage.removeItem(s);
34
35
  } catch {}
35
36
  }
36
- function m() {
37
+ function h() {
37
38
  if (typeof window > "u") return null;
38
39
  try {
39
- let e = sessionStorage.getItem(o);
40
+ let e = sessionStorage.getItem(s);
40
41
  if (!e) return null;
41
42
  let t = JSON.parse(e);
42
- return typeof t.relayOrigin != "string" || typeof t.returnTo != "string" || typeof t.startedAt != "number" || Date.now() - t.startedAt > s ? (p(), null) : {
43
+ return typeof t.relayOrigin != "string" || typeof t.returnTo != "string" || typeof t.startedAt != "number" || Date.now() - t.startedAt > c ? (m(), null) : {
43
44
  relayOrigin: t.relayOrigin,
44
45
  returnTo: t.returnTo,
45
46
  startedAt: t.startedAt
46
47
  };
47
48
  } catch {
48
- return p(), null;
49
+ return m(), null;
49
50
  }
50
51
  }
51
- function h(e) {
52
+ function g(e) {
52
53
  try {
53
54
  return new URL(e).origin;
54
55
  } catch {
55
56
  return null;
56
57
  }
57
58
  }
58
- function g(e) {
59
- let t = l(e);
60
- return !t || f(t);
59
+ function _(e) {
60
+ let t = u(e);
61
+ return !t || p(t);
61
62
  }
62
- function _(e, t) {
63
- let n = h(e), r = l(t), i = m();
63
+ function v(e, t) {
64
+ let n = g(e), r = u(t), i = h();
64
65
  return !!(n && r && i?.returnTo === r.href);
65
66
  }
66
- function v(e, t) {
67
+ function y(e, t) {
67
68
  if (typeof window > "u") return;
68
- let n = h(e), r = l(t);
69
+ let n = g(e), r = u(t);
69
70
  if (!(!n || !r)) try {
70
71
  let e = {
71
72
  relayOrigin: n,
72
73
  returnTo: r.href,
73
74
  startedAt: Date.now()
74
75
  };
75
- sessionStorage.setItem(o, JSON.stringify(e));
76
+ sessionStorage.setItem(s, JSON.stringify(e));
76
77
  } catch {}
77
78
  }
78
- function y(e) {
79
+ function b(t) {
79
80
  try {
80
- let t = l(e);
81
- if (!t || f(t)) return null;
82
- let n = i();
83
- if (!n?.origin || !r(n.origin)) return null;
84
- let a = new URL(n.origin).origin;
85
- return !a || a === window.location.origin || _(a, t.href) ? null : (v(a, t.href), `${a}/auth/sso-relay?returnTo=${encodeURIComponent(t.href)}`);
81
+ let n = u(t);
82
+ if (!n || p(n)) return null;
83
+ let r = window.location.origin, o = a();
84
+ if (o?.origin && i(o.origin)) {
85
+ let e = new URL(o.origin).origin;
86
+ if (e && e !== r && !v(e, n.href)) return y(e, n.href), `${e}/auth/sso-relay?returnTo=${encodeURIComponent(n.href)}`;
87
+ }
88
+ try {
89
+ let t = e(), i = new URL(t.url).origin;
90
+ if (i && i !== r && !v(i, n.href)) return y(i, n.href), `${i}/auth/sso-relay?returnTo=${encodeURIComponent(n.href)}`;
91
+ } catch {}
92
+ return null;
86
93
  } catch {
87
94
  return null;
88
95
  }
89
96
  }
90
- function b() {
97
+ function x() {
91
98
  try {
92
- if (i()) return !1;
99
+ if (a()) return !1;
93
100
  let e = sessionStorage.getItem("bf-active-profile");
94
- return !e || !localStorage.getItem(`bf-p-${e}-tokens`) || !n() ? !1 : (S(), !0);
101
+ return !e || !localStorage.getItem(`bf-p-${e}-tokens`) || !r() ? !1 : (C(), !0);
95
102
  } catch {
96
103
  return !1;
97
104
  }
98
105
  }
99
- async function x(e, t) {
106
+ async function S(e, t) {
100
107
  try {
101
108
  let n = await fetch(e, {
102
109
  method: "POST",
@@ -113,22 +120,22 @@ async function x(e, t) {
113
120
  return !1;
114
121
  }
115
122
  }
116
- function S() {
123
+ function C() {
117
124
  try {
118
- let n = localStorage.getItem("bf-profiles");
119
- if (n) {
120
- let e = JSON.parse(n);
121
- for (let t of e) localStorage.removeItem(`bf-p-${t.id}-tokens`), localStorage.removeItem(`bf-p-${t.id}-user`), localStorage.removeItem(`bf-p-${t.id}-workspace-token`), localStorage.removeItem(`bf-p-${t.id}-context`), localStorage.removeItem(`bf-p-${t.id}-auth-storage`), sessionStorage.removeItem(`bf-p-${t.id}-session-workspace-token`);
125
+ let e = localStorage.getItem("bf-profiles");
126
+ if (e) {
127
+ let t = JSON.parse(e);
128
+ for (let e of t) localStorage.removeItem(`bf-p-${e.id}-tokens`), localStorage.removeItem(`bf-p-${e.id}-user`), localStorage.removeItem(`bf-p-${e.id}-workspace-token`), localStorage.removeItem(`bf-p-${e.id}-context`), localStorage.removeItem(`bf-p-${e.id}-auth-storage`), sessionStorage.removeItem(`bf-p-${e.id}-session-workspace-token`);
122
129
  }
123
130
  for (let e of Object.keys(localStorage)) e.startsWith("bf-p-") && e.endsWith("-auth-storage") && localStorage.removeItem(e);
124
- localStorage.removeItem("bf-profiles"), localStorage.removeItem("auth-storage"), sessionStorage.removeItem("bf-active-profile"), e(), t(), window.dispatchEvent(new Event("bf-auth-state-cleared")), window.dispatchEvent(new Event("bf-profile-storage-change"));
131
+ localStorage.removeItem("bf-profiles"), localStorage.removeItem("auth-storage"), sessionStorage.removeItem("bf-active-profile"), t(), n(), window.dispatchEvent(new Event("bf-auth-state-cleared")), window.dispatchEvent(new Event("bf-profile-storage-change"));
125
132
  } catch {}
126
133
  }
127
- function C() {
128
- return /* @__PURE__ */ a("div", {
134
+ function w() {
135
+ return /* @__PURE__ */ o("div", {
129
136
  className: "flex items-center justify-center min-h-screen",
130
- children: /* @__PURE__ */ a("div", { className: "animate-spin rounded-full h-8 w-8 border-2 border-action-primary-bg border-t-transparent" })
137
+ children: /* @__PURE__ */ o("div", { className: "animate-spin rounded-full h-8 w-8 border-2 border-action-primary-bg border-t-transparent" })
131
138
  });
132
139
  }
133
140
  //#endregion
134
- export { C as SSORedirectSpinner, x as checkRemoteSLO, b as checkSLO, S as clearLocalAuthState, y as getSSORedirectUrl, _ as hasRecentSSORedirectAttempt, v as markSSORedirectAttempt, g as shouldSkipSSORedirect };
141
+ export { w as SSORedirectSpinner, S as checkRemoteSLO, x as checkSLO, C as clearLocalAuthState, b as getSSORedirectUrl, v as hasRecentSSORedirectAttempt, y as markSSORedirectAttempt, _ as shouldSkipSSORedirect };
@@ -1 +1 @@
1
- {"version":3,"file":"AuthProvider.d.ts","sourceRoot":"","sources":["../../../../src/shared/providers/shell/AuthProvider.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AuthProvider.d.ts","sourceRoot":"","sources":["../../../../src/shared/providers/shell/AuthProvider.tsx"],"names":[],"mappings":"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"}
@@ -1,13 +1,14 @@
1
1
  import { resolveGatewayUrls as e } from "../../config/gatewayUrls.js";
2
- import { PROFILE_STORAGE_CHANGE_EVENT as t, addProfile as n, getActiveProfileId as r, getProfileTokens as i, getProfileUser as a, getProfileWorkspaceToken as o, getProfiles as s, loginProfile as c, logoutAllProfiles as ee, removeProfile as l, resolveActiveProfileId as u, setActiveProfileId as d, setProfileTokens as f, setProfileUser as te, setProfileWorkspaceToken as ne, setProfiles as p, switchProfile as re } from "./ProfileStorageManager.js";
3
- import { clearShellSsoCookies as m, isSharedSsoCookieDomain as ie, isTrustedSsoOrigin as h, readShellSsoCookie as g, setShellSsoCookies as ae } from "../../utils/authCookie.js";
4
- import { getAuthBridge as _, initAuthBridge as oe, isAuthBridgeInitialized as se } from "./AuthBridgeClient.js";
5
- import { checkRemoteSLO as ce, checkSLO as le, clearLocalAuthState as v, hasRecentSSORedirectAttempt as y, markSSORedirectAttempt as b, shouldSkipSSORedirect as x } from "../../components/SSORedirectGuard.js";
6
- import { createContext as S, useCallback as C, useContext as w, useEffect as T, useMemo as ue, useRef as de, useState as E } from "react";
7
- import { jsx as fe } from "react/jsx-runtime";
2
+ import { resolveAuthBridgeConfig as t } from "../../config/authBridgeUrls.js";
3
+ import { PROFILE_STORAGE_CHANGE_EVENT as n, addProfile as r, getActiveProfileId as i, getProfileTokens as a, getProfileUser as o, getProfileWorkspaceToken as s, getProfiles as c, loginProfile as ee, logoutAllProfiles as te, removeProfile as l, resolveActiveProfileId as u, setActiveProfileId as d, setProfileTokens as f, setProfileUser as p, setProfileWorkspaceToken as m, setProfiles as h, switchProfile as ne } from "./ProfileStorageManager.js";
4
+ import { clearShellSsoCookies as g, isSharedSsoCookieDomain as re, isTrustedSsoOrigin as _, readShellSsoCookie as v, setShellSsoCookies as ie } from "../../utils/authCookie.js";
5
+ import { getAuthBridge as y, initAuthBridge as ae, isAuthBridgeInitialized as oe } from "./AuthBridgeClient.js";
6
+ import { checkRemoteSLO as se, checkSLO as ce, clearLocalAuthState as b, hasRecentSSORedirectAttempt as x, markSSORedirectAttempt as S, shouldSkipSSORedirect as C } from "../../components/SSORedirectGuard.js";
7
+ import { createContext as w, useCallback as T, useContext as E, useEffect as D, useMemo as le, useRef as ue, useState as O } from "react";
8
+ import { jsx as de } from "react/jsx-runtime";
8
9
  //#region src/shared/providers/shell/AuthProvider.tsx
9
- var D = S(null);
10
- function O(e) {
10
+ var k = w(null);
11
+ function A(e) {
11
12
  try {
12
13
  let t = e.split(".");
13
14
  if (t.length !== 3) return null;
@@ -17,10 +18,10 @@ function O(e) {
17
18
  return null;
18
19
  }
19
20
  }
20
- function k(e) {
21
+ function j(e) {
21
22
  return e.trigger;
22
23
  }
23
- function A(e, t, n) {
24
+ function M(e, t, n) {
24
25
  let r = (Array.isArray(e.profiles) ? e.profiles : []).map((e) => {
25
26
  let t = typeof e.id == "string" ? e.id : null, n = typeof e.email == "string" ? e.email : null;
26
27
  return !t || !n ? null : {
@@ -39,14 +40,25 @@ function A(e, t, n) {
39
40
  lastLogin: (/* @__PURE__ */ new Date()).toISOString()
40
41
  }];
41
42
  }
42
- function pe(e) {
43
- let n = k(e);
44
- if (n === "logout" || n === "logout_all") return v(), !0;
43
+ function fe(e) {
44
+ let t = j(e);
45
+ if (t === "logout" || t === "logout_all") return b(), !0;
45
46
  if (!e.activeProfileId || !e.user || !e.tokens) return !1;
46
47
  let r = e.activeProfileId, i = e.user, { workspaceToken: a, ...o } = e.tokens;
47
- return p(A(e, r, i)), te(r, i), f(r, o), ne(r, a ?? null), d(r), window.dispatchEvent(new Event(t)), !0;
48
+ return h(M(e, r, i)), p(r, i), f(r, o), m(r, a ?? null), d(r), window.dispatchEvent(new Event(n)), !0;
48
49
  }
49
- function j(e) {
50
+ function N() {
51
+ if (typeof window > "u") return null;
52
+ try {
53
+ let e = t(), n = new URL(e.url).origin;
54
+ if (n === window.location.origin) return null;
55
+ let r = `${window.location.origin}/auth/login?reason=logout`;
56
+ return `${n}/auth/sso-clear?returnTo=${encodeURIComponent(r)}`;
57
+ } catch {
58
+ return null;
59
+ }
60
+ }
61
+ function P(e) {
50
62
  if (!e) return !1;
51
63
  try {
52
64
  return !!(localStorage.getItem(`bf-p-${e}-tokens`) && localStorage.getItem(`bf-p-${e}-user`));
@@ -54,37 +66,37 @@ function j(e) {
54
66
  return !1;
55
67
  }
56
68
  }
57
- function M(e) {
69
+ function F(e) {
58
70
  try {
59
- if (x()) return null;
60
- let t = g();
61
- if (!t?.origin || !h(t.origin)) return null;
71
+ if (C()) return null;
72
+ let t = v();
73
+ if (!t?.origin || !_(t.origin)) return null;
62
74
  let n = new URL(t.origin).origin, r = new URL(e).origin;
63
- if (n === window.location.origin || n === r || j(t.id)) return null;
75
+ if (n === window.location.origin || n === r || P(t.id)) return null;
64
76
  let i = window.location.href;
65
- return y(n, i) ? null : (b(n, i), `${n}/auth/sso-relay?returnTo=${encodeURIComponent(i)}`);
77
+ return x(n, i) ? null : (S(n, i), `${n}/auth/sso-relay?returnTo=${encodeURIComponent(i)}`);
66
78
  } catch {
67
79
  return null;
68
80
  }
69
81
  }
70
- function N({ children: p, onTokenExpired: h, onSessionExpiringSoon: v, onRefreshToken: S, bridgeUrl: w, bridgeAllowedOrigins: k, bridgeDebug: A, onBridgeReady: j }) {
71
- let N = de(!1), [P, F] = E(() => u()), [I, L] = E(() => P ? a(P) : null), [R, z] = E(() => P ? i(P) : null), [B, V] = E(() => P ? o(P) : null), [H, U] = E(() => {
72
- if (P && a(P)) return !1;
82
+ function I({ children: t, onTokenExpired: h, onSessionExpiringSoon: _, onRefreshToken: b, bridgeUrl: w, bridgeAllowedOrigins: E, bridgeDebug: j, onBridgeReady: M }) {
83
+ let P = ue(!1), [I, L] = O(() => u()), [R, z] = O(() => I ? o(I) : null), [B, V] = O(() => I ? a(I) : null), [H, U] = O(() => I ? s(I) : null), [W, G] = O(() => {
84
+ if (I && o(I)) return !1;
73
85
  if (w) try {
74
- let e = g()?.id ?? null;
86
+ let e = v()?.id ?? null;
75
87
  if (e && localStorage.getItem(`bf-p-${e}-tokens`)) return !1;
76
88
  } catch {}
77
89
  return !!w;
78
- }), [me, W] = E(!1), [G, K] = E(null), [q, J] = E(() => s().map((e) => ({
90
+ }), [pe, K] = O(!1), [me, q] = O(null), [he, J] = O(() => c().map((e) => ({
79
91
  id: e.id,
80
92
  email: e.email,
81
93
  name: e.name,
82
94
  avatar: e.avatar,
83
- isActive: e.id === P,
95
+ isActive: e.id === I,
84
96
  lastLogin: e.lastLogin
85
- }))), Y = C(() => {
86
- let e = r();
87
- J(s().map((t) => ({
97
+ }))), Y = T(() => {
98
+ let e = i();
99
+ J(c().map((t) => ({
88
100
  id: t.id,
89
101
  email: t.email,
90
102
  name: t.name,
@@ -93,85 +105,85 @@ function N({ children: p, onTokenExpired: h, onSessionExpiringSoon: v, onRefresh
93
105
  lastLogin: t.lastLogin
94
106
  })));
95
107
  }, []);
96
- T(() => {
108
+ D(() => {
97
109
  if (!w) return;
98
110
  try {
99
111
  let e = new URL(w).pathname;
100
112
  if (window.location.pathname === e) {
101
- U(!1), j?.();
113
+ G(!1), M?.();
102
114
  return;
103
115
  }
104
116
  } catch {
105
- U(!1), j?.();
117
+ G(!1), M?.();
106
118
  return;
107
119
  }
108
- if (se()) {
109
- U(!1), j?.();
120
+ if (oe()) {
121
+ G(!1), M?.();
110
122
  return;
111
123
  }
112
124
  let e = () => {
113
- U(!1), j?.();
125
+ G(!1), M?.();
114
126
  }, t = (t) => {
115
- N.current = !0;
127
+ P.current = !0;
116
128
  try {
117
129
  if (w) {
118
- let e = M(w);
130
+ let e = F(w);
119
131
  if (e) {
120
132
  window.location.replace(e);
121
133
  return;
122
134
  }
123
135
  }
124
- pe(t);
136
+ fe(t);
125
137
  let e = u();
126
- if (e) F(e), L(a(e)), z(i(e)), V(o(e)), Y();
138
+ if (e) L(e), z(o(e)), V(a(e)), U(s(e)), Y();
127
139
  else {
128
140
  if (w && !t.user && !t.tokens) try {
129
- let e = new URL(w).origin, t = window.location.origin, n = M(w);
141
+ let e = new URL(w).origin, t = window.location.origin, n = F(w);
130
142
  if (n) {
131
143
  window.location.replace(n);
132
144
  return;
133
145
  }
134
- if (e !== t && !x()) {
146
+ if (e !== t && !C()) {
135
147
  let t = window.location.href;
136
- if (y(e, t)) return;
137
- b(e, t), window.location.replace(`${e}/auth/sso-relay?returnTo=${encodeURIComponent(t)}`);
148
+ if (x(e, t)) return;
149
+ S(e, t), window.location.replace(`${e}/auth/sso-relay?returnTo=${encodeURIComponent(t)}`);
138
150
  return;
139
151
  }
140
152
  } catch {}
141
- F(null), L(null), z(null), V(null), J([]);
153
+ L(null), z(null), V(null), U(null), J([]);
142
154
  }
143
155
  } finally {
144
- N.current = !1, e();
156
+ P.current = !1, e();
145
157
  }
146
158
  }, n = setTimeout(() => {
147
159
  e();
148
160
  }, 5e3);
149
- return oe({
161
+ return ae({
150
162
  bridgeUrl: w,
151
- allowedOrigins: k,
163
+ allowedOrigins: E,
152
164
  onStateChanged: t,
153
- debug: A ?? !1
165
+ debug: j ?? !1
154
166
  }), () => {
155
167
  clearTimeout(n);
156
168
  };
157
169
  }, [
158
170
  w,
159
- k,
160
- A,
171
+ E,
161
172
  j,
173
+ M,
162
174
  Y
163
175
  ]);
164
- let he = C((e, t, n) => {
165
- let r = O(t) ?? Date.now() + 3600 * 1e3, i = {
176
+ let ge = T((e, t, n) => {
177
+ let r = A(t) ?? Date.now() + 3600 * 1e3, i = {
166
178
  accessToken: t,
167
179
  refreshToken: n,
168
180
  expiresAt: r
169
- }, a = c(e, i);
170
- F(a), L(e), z(i), V(null), W(!1), K(null), Y();
181
+ }, a = ee(e, i);
182
+ L(a), z(e), V(i), U(null), K(!1), q(null), Y();
171
183
  try {
172
- ae(a, window.location.origin);
184
+ ie(a, window.location.origin);
173
185
  } catch {}
174
- N.current || _()?.notifyLogin({
186
+ P.current || y()?.notifyLogin({
175
187
  user: e,
176
188
  tokens: {
177
189
  accessToken: t,
@@ -180,43 +192,45 @@ function N({ children: p, onTokenExpired: h, onSessionExpiringSoon: v, onRefresh
180
192
  },
181
193
  activeAccountId: a,
182
194
  activeProfileId: a,
183
- profiles: s()
195
+ profiles: c()
184
196
  });
185
- }, [Y]), X = C(() => {
186
- P && l(P);
197
+ }, [Y]), X = T(() => {
198
+ I && l(I);
187
199
  let e = u();
188
- e ? (F(e), L(a(e)), z(i(e)), V(o(e))) : (F(null), L(null), z(null), V(null)), W(!1), K(null), Y();
200
+ e ? (L(e), z(o(e)), V(a(e)), U(s(e))) : (L(null), z(null), V(null), U(null)), K(!1), q(null), Y();
189
201
  try {
190
- m();
202
+ g();
191
203
  } catch {}
192
- N.current || _()?.notifyLogout();
193
- }, [P, Y]), ge = C((e) => {
194
- if (!I || !P) return;
204
+ P.current || y()?.notifyLogout();
205
+ let t = N();
206
+ t && !P.current && window.location.replace(t);
207
+ }, [I, Y]), _e = T((e) => {
208
+ if (!R || !I) return;
195
209
  let t = {
196
- ...I,
210
+ ...R,
197
211
  ...e
198
212
  };
199
- L(t), te(P, t), n({
200
- id: P,
213
+ z(t), p(I, t), r({
214
+ id: I,
201
215
  email: t.email,
202
216
  name: t.name ?? `${t.firstName ?? ""} ${t.lastName ?? ""}`.trim(),
203
217
  avatar: t.avatar,
204
218
  lastLogin: (/* @__PURE__ */ new Date()).toISOString()
205
219
  }), Y();
206
220
  }, [
221
+ R,
207
222
  I,
208
- P,
209
223
  Y
210
- ]), Z = C(async () => {
211
- if (!(!R?.refreshToken || !S || !P)) {
212
- U(!0);
224
+ ]), Z = T(async () => {
225
+ if (!(!B?.refreshToken || !b || !I)) {
226
+ G(!0);
213
227
  try {
214
- let e = await S(R.refreshToken), t = O(e.accessToken), n = e.expiresAt ?? t ?? Date.now() + 3600 * 1e3, r = {
228
+ let e = await b(B.refreshToken), t = A(e.accessToken), n = e.expiresAt ?? t ?? Date.now() + 3600 * 1e3, r = {
215
229
  accessToken: e.accessToken,
216
- refreshToken: e.refreshToken ?? R.refreshToken,
230
+ refreshToken: e.refreshToken ?? B.refreshToken,
217
231
  expiresAt: n
218
232
  };
219
- z(r), f(P, r), N.current || _()?.notifyTokenRefresh({
233
+ V(r), f(I, r), P.current || y()?.notifyTokenRefresh({
220
234
  accessToken: r.accessToken,
221
235
  refreshToken: r.refreshToken,
222
236
  expiresAt: r.expiresAt
@@ -224,168 +238,170 @@ function N({ children: p, onTokenExpired: h, onSessionExpiringSoon: v, onRefresh
224
238
  } catch (e) {
225
239
  console.error("Failed to refresh token:", e), X(), h?.();
226
240
  } finally {
227
- U(!1);
241
+ G(!1);
228
242
  }
229
243
  }
230
244
  }, [
231
- R,
232
- S,
233
- P,
245
+ B,
246
+ b,
247
+ I,
234
248
  X,
235
249
  h
236
- ]), _e = C((e) => I?.permissions ? I.permissions.includes(e) || I.permissions.includes("*") : !1, [I]), Q = C((e) => {
237
- V(e), P && ne(P, e);
238
- }, [P]), ve = C((e, t) => {
239
- W(e), K(t ?? null);
240
- }, []), ye = C((e) => {
241
- if (!re(e)) {
250
+ ]), Q = T((e) => R?.permissions ? R.permissions.includes(e) || R.permissions.includes("*") : !1, [R]), ve = T((e) => {
251
+ U(e), I && m(I, e);
252
+ }, [I]), ye = T((e, t) => {
253
+ K(e), q(t ?? null);
254
+ }, []), be = T((e) => {
255
+ if (!ne(e)) {
242
256
  console.error(`Profile ${e} not found`);
243
257
  return;
244
258
  }
245
- F(e), L(a(e)), z(i(e)), V(o(e)), W(!1), K(null), Y(), N.current || _()?.notifyAccountSwitch(e);
246
- }, [Y]), be = C((e, t, n) => {
247
- c(e, {
259
+ L(e), z(o(e)), V(a(e)), U(s(e)), K(!1), q(null), Y(), P.current || y()?.notifyAccountSwitch(e);
260
+ }, [Y]), xe = T((e, t, n) => {
261
+ ee(e, {
248
262
  accessToken: t,
249
263
  refreshToken: n,
250
- expiresAt: O(t) ?? Date.now() + 3600 * 1e3
251
- }), P && d(P), Y();
252
- }, [P, Y]), xe = C((e) => {
253
- if (e === P) {
264
+ expiresAt: A(t) ?? Date.now() + 3600 * 1e3
265
+ }), I && d(I), Y();
266
+ }, [I, Y]), Se = T((e) => {
267
+ if (e === I) {
254
268
  console.error("Cannot remove active account — logout first");
255
269
  return;
256
270
  }
257
271
  l(e), Y();
258
- }, [P, Y]), Se = C(() => {
259
- ee(), F(null), L(null), z(null), V(null), W(!1), K(null), J([]);
272
+ }, [I, Y]), Ce = T(() => {
273
+ te(), L(null), z(null), V(null), U(null), K(!1), q(null), J([]);
260
274
  try {
261
- m();
275
+ g();
262
276
  } catch {}
263
- N.current || _()?.notifyLogoutAll();
277
+ P.current || y()?.notifyLogoutAll();
278
+ let e = N();
279
+ e && !P.current && window.location.replace(e);
264
280
  }, []);
265
- T(() => {
266
- if (!R?.expiresAt) return;
267
- let e = R.expiresAt - Date.now();
281
+ D(() => {
282
+ if (!B?.expiresAt) return;
283
+ let e = B.expiresAt - Date.now();
268
284
  if (e <= 0) {
269
- S && R?.refreshToken ? Z() : h?.();
285
+ b && B?.refreshToken ? Z() : h?.();
270
286
  return;
271
287
  }
272
288
  let t = [];
273
- if (S && R?.refreshToken) {
289
+ if (b && B?.refreshToken) {
274
290
  let n = Math.max(0, e - 300 * 1e3);
275
291
  t.push(setTimeout(() => {
276
292
  Z();
277
293
  }, n));
278
294
  }
279
- if (v) {
295
+ if (_) {
280
296
  let n = Math.max(0, e - 300 * 1e3);
281
297
  t.push(setTimeout(() => {
282
- v();
298
+ _();
283
299
  }, n));
284
300
  }
285
- return (!S || !R?.refreshToken) && t.push(setTimeout(() => {
301
+ return (!b || !B?.refreshToken) && t.push(setTimeout(() => {
286
302
  h?.();
287
303
  }, e)), () => t.forEach(clearTimeout);
288
304
  }, [
289
- R?.expiresAt,
290
- R?.refreshToken,
305
+ B?.expiresAt,
306
+ B?.refreshToken,
291
307
  Z,
292
- S,
308
+ b,
293
309
  h,
294
- v
310
+ _
295
311
  ]);
296
- let Ce = C(() => {
312
+ let we = T(() => {
297
313
  let e = u();
298
314
  if (!e) {
299
- (I || R) && (L(null), z(null), V(null), F(null), J([]));
315
+ (R || B) && (z(null), V(null), U(null), L(null), J([]));
300
316
  return;
301
317
  }
302
- let t = i(e), n = o(e), r = a(e);
303
- e !== P && F(e), t?.accessToken !== R?.accessToken && z(t), n !== B && V(n), r && r.id !== I?.id && L(r), Y();
318
+ let t = a(e), n = s(e), r = o(e);
319
+ e !== I && L(e), t?.accessToken !== B?.accessToken && V(t), n !== H && U(n), r && r.id !== R?.id && z(r), Y();
304
320
  }, [
321
+ B,
305
322
  R,
323
+ H,
306
324
  I,
307
- B,
308
- P,
309
325
  Y
310
326
  ]);
311
- T(() => {
312
- let e = () => Ce();
313
- window.addEventListener(t, e), window.addEventListener("storage", e);
314
- let n = setInterval(e, 1e4);
327
+ D(() => {
328
+ let e = () => we();
329
+ window.addEventListener(n, e), window.addEventListener("storage", e);
330
+ let t = setInterval(e, 1e4);
315
331
  return () => {
316
- window.removeEventListener(t, e), window.removeEventListener("storage", e), clearInterval(n);
332
+ window.removeEventListener(n, e), window.removeEventListener("storage", e), clearInterval(t);
317
333
  };
318
- }, [Ce]), T(() => {
319
- if (!R?.accessToken || !w) return;
334
+ }, [we]), D(() => {
335
+ if (!B?.accessToken || !w) return;
320
336
  let t = async () => {
321
337
  if (document.visibilityState === "visible") try {
322
- if (le()) {
323
- F(null), L(null), z(null), V(null), J([]);
338
+ if (ce()) {
339
+ L(null), z(null), V(null), U(null), J([]);
324
340
  return;
325
341
  }
326
- if (ie()) return;
327
- await ce(`${e().globalBaseUrl}/global/graphql`, R.accessToken) && X();
342
+ if (re()) return;
343
+ await se(`${e().globalBaseUrl}/global/graphql`, B.accessToken) && X();
328
344
  } catch {}
329
345
  };
330
346
  return document.addEventListener("visibilitychange", t), () => document.removeEventListener("visibilitychange", t);
331
347
  }, [
332
- R?.accessToken,
348
+ B?.accessToken,
333
349
  w,
334
350
  X
335
351
  ]);
336
- let $ = ue(() => !!I && !!R, [I, R]), we = ue(() => ({
337
- user: I,
338
- tokens: R,
352
+ let $ = le(() => !!R && !!B, [R, B]), Te = le(() => ({
353
+ user: R,
354
+ tokens: B,
339
355
  isAuthenticated: $,
340
- isLoading: H,
341
- login: he,
356
+ isLoading: W,
357
+ login: ge,
342
358
  logout: X,
343
- updateUser: ge,
359
+ updateUser: _e,
344
360
  refreshAccessToken: Z,
345
- hasPermission: _e,
346
- setWorkspaceToken: Q,
347
- workspaceToken: B,
348
- mfaRequired: me,
349
- mfaChallengeId: G,
350
- setMfaState: ve,
351
- activeProfileId: P,
352
- accounts: q,
353
- switchAccount: ye,
354
- addAccount: be,
355
- removeAccount: xe,
356
- logoutAll: Se,
357
- currentUser: I
361
+ hasPermission: Q,
362
+ setWorkspaceToken: ve,
363
+ workspaceToken: H,
364
+ mfaRequired: pe,
365
+ mfaChallengeId: me,
366
+ setMfaState: ye,
367
+ activeProfileId: I,
368
+ accounts: he,
369
+ switchAccount: be,
370
+ addAccount: xe,
371
+ removeAccount: Se,
372
+ logoutAll: Ce,
373
+ currentUser: R
358
374
  }), [
359
- I,
360
375
  R,
376
+ B,
361
377
  $,
362
- H,
363
- he,
364
- X,
378
+ W,
365
379
  ge,
366
- Z,
380
+ X,
367
381
  _e,
382
+ Z,
368
383
  Q,
369
- B,
370
- me,
371
- G,
372
384
  ve,
373
- P,
374
- q,
385
+ H,
386
+ pe,
387
+ me,
375
388
  ye,
389
+ I,
390
+ he,
376
391
  be,
377
392
  xe,
378
- Se
393
+ Se,
394
+ Ce
379
395
  ]);
380
- return /* @__PURE__ */ fe(D.Provider, {
381
- value: we,
382
- children: p
396
+ return /* @__PURE__ */ de(k.Provider, {
397
+ value: Te,
398
+ children: t
383
399
  });
384
400
  }
385
- function P() {
386
- let e = w(D);
401
+ function L() {
402
+ let e = E(k);
387
403
  if (!e) throw Error("useAuth must be used within an AuthProvider");
388
404
  return e;
389
405
  }
390
406
  //#endregion
391
- export { N as AuthProvider, P as useAuth };
407
+ export { I as AuthProvider, L as useAuth };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/fe-libs",
3
- "version": "2026.518.5",
3
+ "version": "2026.518.7",
4
4
  "description": "Burdenoff frontend primitives and domain libraries",
5
5
  "type": "module",
6
6
  "imports": {