@burdenoff/microfe-auth 2026.520.2 → 2026.521.2
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/auth/AuthRoot.d.ts.map +1 -1
- package/dist/auth/AuthRoot.js +9 -8
- package/dist/auth/AuthRoot.js.map +1 -1
- package/dist/auth/AuthRoutes.d.ts +2 -1
- package/dist/auth/AuthRoutes.d.ts.map +1 -1
- package/dist/auth/AuthRoutes.js +11 -11
- package/dist/auth/AuthRoutes.js.map +1 -1
- package/dist/auth/pages/AuditLogPage.d.ts.map +1 -1
- package/dist/auth/pages/AuditLogPage.js +49 -48
- package/dist/auth/pages/AuditLogPage.js.map +1 -1
- package/dist/auth/pages/SessionsPage.d.ts.map +1 -1
- package/dist/auth/pages/SessionsPage.js +133 -185
- package/dist/auth/pages/SessionsPage.js.map +1 -1
- package/dist/auth/pages/SsoConfigPage.d.ts +10 -3
- package/dist/auth/pages/SsoConfigPage.d.ts.map +1 -1
- package/dist/auth/pages/SsoConfigPage.js +440 -396
- package/dist/auth/pages/SsoConfigPage.js.map +1 -1
- package/dist/auth/pages/UserProfilePage.d.ts.map +1 -1
- package/dist/auth/pages/UserProfilePage.js +148 -145
- package/dist/auth/pages/UserProfilePage.js.map +1 -1
- package/dist/auth/types/index.d.ts +7 -0
- package/dist/auth/types/index.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthRoot.d.ts","sourceRoot":"","sources":["../../src/auth/AuthRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAQhC,OAAO,KAAK,EAAW,aAAa,EAAE,MAAM,SAAS,CAAC;AAGtD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,QAAQ,EAAE,EAAE,CAAC,aAAa,
|
|
1
|
+
{"version":3,"file":"AuthRoot.d.ts","sourceRoot":"","sources":["../../src/auth/AuthRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAQhC,OAAO,KAAK,EAAW,aAAa,EAAE,MAAM,SAAS,CAAC;AAGtD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,QAAQ,EAAE,EAAE,CAAC,aAAa,CAgJtC,CAAC"}
|
package/dist/auth/AuthRoot.js
CHANGED
|
@@ -9,13 +9,13 @@ import { jsx as d } from "react/jsx-runtime";
|
|
|
9
9
|
import { FeatureFlagProvider as f } from "@burdenoff/fe-libs/shared/feature-flags";
|
|
10
10
|
//#region src/auth/AuthRoot.tsx
|
|
11
11
|
var p = (p) => {
|
|
12
|
-
let { registerNavItems: m, registerFooterItems: h, basePath: g = "/", enableAdminRoutes: _ = !0 } = p,
|
|
12
|
+
let { registerNavItems: m, registerFooterItems: h, basePath: g = "/", enableAdminRoutes: _ = !0, bypassEnterprisePlanGate: v = !1 } = p, y = o(), b = i(() => g && g !== "/" ? g.endsWith("/") ? g.slice(0, -1) : g : "", [g]), x = (e, t) => (e.endsWith("/") ? e.slice(0, -1) : e) + (t.startsWith("/") ? t : `/${t}`);
|
|
13
13
|
return r(() => {
|
|
14
14
|
if (m) return m([
|
|
15
15
|
{
|
|
16
16
|
id: "auth-security",
|
|
17
17
|
label: "Security Settings",
|
|
18
|
-
path:
|
|
18
|
+
path: x(g, "security"),
|
|
19
19
|
icon: /* @__PURE__ */ d(u, { size: 20 }),
|
|
20
20
|
order: 10,
|
|
21
21
|
group: "auth"
|
|
@@ -23,7 +23,7 @@ var p = (p) => {
|
|
|
23
23
|
{
|
|
24
24
|
id: "auth-sessions",
|
|
25
25
|
label: "Active Sessions",
|
|
26
|
-
path:
|
|
26
|
+
path: x(g, "sessions"),
|
|
27
27
|
icon: /* @__PURE__ */ d(l, { size: 20 }),
|
|
28
28
|
order: 20,
|
|
29
29
|
group: "auth"
|
|
@@ -31,7 +31,7 @@ var p = (p) => {
|
|
|
31
31
|
{
|
|
32
32
|
id: "auth-mfa",
|
|
33
33
|
label: "Multi-Factor Auth",
|
|
34
|
-
path:
|
|
34
|
+
path: x(g, "mfa"),
|
|
35
35
|
icon: /* @__PURE__ */ d(c, { size: 20 }),
|
|
36
36
|
order: 30,
|
|
37
37
|
group: "auth"
|
|
@@ -39,7 +39,7 @@ var p = (p) => {
|
|
|
39
39
|
..._ ? [{
|
|
40
40
|
id: "auth-sso",
|
|
41
41
|
label: "SSO Configuration",
|
|
42
|
-
path:
|
|
42
|
+
path: x(g, "sso"),
|
|
43
43
|
icon: /* @__PURE__ */ d(s, { size: 20 }),
|
|
44
44
|
order: 50,
|
|
45
45
|
group: "auth"
|
|
@@ -57,7 +57,7 @@ var p = (p) => {
|
|
|
57
57
|
order: 10,
|
|
58
58
|
section: "left"
|
|
59
59
|
}]);
|
|
60
|
-
}, [h]), i(() =>
|
|
60
|
+
}, [h]), i(() => b ? y.pathname === b || y.pathname.startsWith(b + "/") : !0, [b, y.pathname]) ? /* @__PURE__ */ d(a, {
|
|
61
61
|
fallback: /* @__PURE__ */ d("div", {
|
|
62
62
|
className: "p-6 text-center text-text-secondary",
|
|
63
63
|
children: "Something went wrong loading this module. Please refresh the page."
|
|
@@ -69,8 +69,9 @@ var p = (p) => {
|
|
|
69
69
|
children: /* @__PURE__ */ d(e, {
|
|
70
70
|
...p,
|
|
71
71
|
children: /* @__PURE__ */ d(t, { children: /* @__PURE__ */ d(n, {
|
|
72
|
-
basePath:
|
|
73
|
-
enableAdminRoutes: _
|
|
72
|
+
basePath: b,
|
|
73
|
+
enableAdminRoutes: _,
|
|
74
|
+
bypassEnterprisePlanGate: v
|
|
74
75
|
}) })
|
|
75
76
|
})
|
|
76
77
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthRoot.js","names":[],"sources":["../../src/auth/AuthRoot.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useEffect, useMemo } from \"react\";\nimport { ErrorBoundary } from \"@burdenoff/fe-libs/shared/components\";\nimport { useLocation } from \"react-router-dom\";\nimport { ShieldCheck, Laptop, Key, /* Code, */ Building } from \"lucide-react\";\nimport { AuthProvider } from \"./providers/AuthProvider\";\nimport { FeatureFlagProvider } from \"@burdenoff/fe-libs/shared/feature-flags\";\nimport { CaptchaProvider } from \"./providers/CaptchaProvider\";\nimport type { NavItem, AuthRootProps } from \"./types\";\nimport { AuthRoutes } from \"./AuthRoutes\";\n\n/**\n * Root component for the Auth microfrontend.\n *\n * This is the main entry point that host applications import and render.\n * It sets up the necessary providers and renders the internal routing.\n * Automatically registers navigation items with the shell if registration functions are provided.\n *\n * @example\n * ```tsx\n * import { AuthRoot, type AuthRootProps } from '@burdenoff/microfe-auth';\n *\n * function App() {\n * const props: AuthRootProps = {\n * basePath: '/auth',\n * navigate: (path) => router.push(path),\n * apiGatewayUrl: 'http://localhost:4002',\n * authToken: 'token',\n * onAuthSuccess: (user) => shellLogin(user),\n * onLogout: () => shellLogout(),\n * };\n *\n * return <AuthRoot {...props} />;\n * }\n * ```\n */\nexport const AuthRoot: FC<AuthRootProps> = (props) => {\n const {\n registerNavItems,\n registerFooterItems,\n basePath = \"/\",\n enableAdminRoutes = true,\n } = props;\n const location = useLocation();\n\n // Normalize basePath (remove trailing slash)\n const normalizedBasePath = useMemo(\n () =>\n basePath && basePath !== \"/\"\n ? basePath.endsWith(\"/\")\n ? basePath.slice(0, -1)\n : basePath\n : \"\",\n [basePath],\n );\n\n // Helper to join paths correctly, avoiding double slashes\n const joinPath = (base: string, path: string): string => {\n const cleanBase = base.endsWith(\"/\") ? base.slice(0, -1) : base;\n const cleanPath = path.startsWith(\"/\") ? path : `/${path}`;\n return cleanBase + cleanPath;\n };\n\n // Register navigation items with the shell\n useEffect(() => {\n if (!registerNavItems) return;\n\n const navItems: NavItem[] = [\n {\n id: \"auth-security\",\n label: \"Security Settings\",\n path: joinPath(basePath, \"security\"),\n icon: <ShieldCheck size={20} />,\n order: 10,\n group: \"auth\",\n },\n {\n id: \"auth-sessions\",\n label: \"Active Sessions\",\n path: joinPath(basePath, \"sessions\"),\n icon: <Laptop size={20} />,\n order: 20,\n group: \"auth\",\n },\n {\n id: \"auth-mfa\",\n label: \"Multi-Factor Auth\",\n path: joinPath(basePath, \"mfa\"),\n icon: <Key size={20} />,\n order: 30,\n group: \"auth\",\n },\n // Hidden — moved to Developer Portal\n // {\n // id: \"auth-api-keys\",\n // label: \"API Keys\",\n // path: joinPath(basePath, \"api-keys\"),\n // icon: <Code size={20} />,\n // order: 40,\n // group: \"auth\",\n // },\n ...(enableAdminRoutes\n ? [\n {\n id: \"auth-sso\",\n label: \"SSO Configuration\",\n path: joinPath(basePath, \"sso\"),\n icon: <Building size={20} />,\n order: 50,\n group: \"auth\",\n },\n ]\n : []),\n ];\n\n // Register and get cleanup function\n const cleanup = registerNavItems(navItems);\n\n // Return cleanup function to unregister on unmount\n return cleanup;\n }, [registerNavItems, basePath, enableAdminRoutes]);\n\n // Register footer items (example: auth status indicator)\n useEffect(() => {\n if (!registerFooterItems) return;\n\n const footerItems = [\n {\n id: \"auth-status\",\n label: \"Auth Ready\",\n type: \"status\" as const,\n order: 10,\n section: \"left\" as const,\n },\n ];\n\n const cleanup = registerFooterItems(footerItems);\n return cleanup;\n }, [registerFooterItems]);\n\n // Check if path matches - must be after all hooks\n const pathMatches = useMemo(() => {\n if (!normalizedBasePath) return true;\n return (\n location.pathname === normalizedBasePath ||\n location.pathname.startsWith(normalizedBasePath + \"/\")\n );\n }, [normalizedBasePath, location.pathname]);\n\n // Early return after all hooks are called\n if (!pathMatches) {\n return null;\n }\n\n return (\n <ErrorBoundary\n fallback={\n <div className=\"p-6 text-center text-text-secondary\">\n Something went wrong loading this module. Please refresh the page.\n </div>\n }\n >\n <FeatureFlagProvider\n workspaceId={null}\n gateway=\"global\"\n defaultEnabled={true}\n >\n <AuthProvider {...props}>\n <CaptchaProvider>\n <AuthRoutes\n basePath={normalizedBasePath}\n enableAdminRoutes={enableAdminRoutes}\n />\n </CaptchaProvider>\n </AuthProvider>\n </FeatureFlagProvider>\n </ErrorBoundary>\n );\n};\n"],"mappings":";;;;;;;;;;AAoCA,IAAa,KAA+B,MAAU;CACpD,IAAM,EACJ,qBACA,wBACA,cAAW,KACX,uBAAoB,
|
|
1
|
+
{"version":3,"file":"AuthRoot.js","names":[],"sources":["../../src/auth/AuthRoot.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { useEffect, useMemo } from \"react\";\nimport { ErrorBoundary } from \"@burdenoff/fe-libs/shared/components\";\nimport { useLocation } from \"react-router-dom\";\nimport { ShieldCheck, Laptop, Key, /* Code, */ Building } from \"lucide-react\";\nimport { AuthProvider } from \"./providers/AuthProvider\";\nimport { FeatureFlagProvider } from \"@burdenoff/fe-libs/shared/feature-flags\";\nimport { CaptchaProvider } from \"./providers/CaptchaProvider\";\nimport type { NavItem, AuthRootProps } from \"./types\";\nimport { AuthRoutes } from \"./AuthRoutes\";\n\n/**\n * Root component for the Auth microfrontend.\n *\n * This is the main entry point that host applications import and render.\n * It sets up the necessary providers and renders the internal routing.\n * Automatically registers navigation items with the shell if registration functions are provided.\n *\n * @example\n * ```tsx\n * import { AuthRoot, type AuthRootProps } from '@burdenoff/microfe-auth';\n *\n * function App() {\n * const props: AuthRootProps = {\n * basePath: '/auth',\n * navigate: (path) => router.push(path),\n * apiGatewayUrl: 'http://localhost:4002',\n * authToken: 'token',\n * onAuthSuccess: (user) => shellLogin(user),\n * onLogout: () => shellLogout(),\n * };\n *\n * return <AuthRoot {...props} />;\n * }\n * ```\n */\nexport const AuthRoot: FC<AuthRootProps> = (props) => {\n const {\n registerNavItems,\n registerFooterItems,\n basePath = \"/\",\n enableAdminRoutes = true,\n bypassEnterprisePlanGate = false,\n } = props;\n const location = useLocation();\n\n // Normalize basePath (remove trailing slash)\n const normalizedBasePath = useMemo(\n () =>\n basePath && basePath !== \"/\"\n ? basePath.endsWith(\"/\")\n ? basePath.slice(0, -1)\n : basePath\n : \"\",\n [basePath],\n );\n\n // Helper to join paths correctly, avoiding double slashes\n const joinPath = (base: string, path: string): string => {\n const cleanBase = base.endsWith(\"/\") ? base.slice(0, -1) : base;\n const cleanPath = path.startsWith(\"/\") ? path : `/${path}`;\n return cleanBase + cleanPath;\n };\n\n // Register navigation items with the shell\n useEffect(() => {\n if (!registerNavItems) return;\n\n const navItems: NavItem[] = [\n {\n id: \"auth-security\",\n label: \"Security Settings\",\n path: joinPath(basePath, \"security\"),\n icon: <ShieldCheck size={20} />,\n order: 10,\n group: \"auth\",\n },\n {\n id: \"auth-sessions\",\n label: \"Active Sessions\",\n path: joinPath(basePath, \"sessions\"),\n icon: <Laptop size={20} />,\n order: 20,\n group: \"auth\",\n },\n {\n id: \"auth-mfa\",\n label: \"Multi-Factor Auth\",\n path: joinPath(basePath, \"mfa\"),\n icon: <Key size={20} />,\n order: 30,\n group: \"auth\",\n },\n // Hidden — moved to Developer Portal\n // {\n // id: \"auth-api-keys\",\n // label: \"API Keys\",\n // path: joinPath(basePath, \"api-keys\"),\n // icon: <Code size={20} />,\n // order: 40,\n // group: \"auth\",\n // },\n ...(enableAdminRoutes\n ? [\n {\n id: \"auth-sso\",\n label: \"SSO Configuration\",\n path: joinPath(basePath, \"sso\"),\n icon: <Building size={20} />,\n order: 50,\n group: \"auth\",\n },\n ]\n : []),\n ];\n\n // Register and get cleanup function\n const cleanup = registerNavItems(navItems);\n\n // Return cleanup function to unregister on unmount\n return cleanup;\n }, [registerNavItems, basePath, enableAdminRoutes]);\n\n // Register footer items (example: auth status indicator)\n useEffect(() => {\n if (!registerFooterItems) return;\n\n const footerItems = [\n {\n id: \"auth-status\",\n label: \"Auth Ready\",\n type: \"status\" as const,\n order: 10,\n section: \"left\" as const,\n },\n ];\n\n const cleanup = registerFooterItems(footerItems);\n return cleanup;\n }, [registerFooterItems]);\n\n // Check if path matches - must be after all hooks\n const pathMatches = useMemo(() => {\n if (!normalizedBasePath) return true;\n return (\n location.pathname === normalizedBasePath ||\n location.pathname.startsWith(normalizedBasePath + \"/\")\n );\n }, [normalizedBasePath, location.pathname]);\n\n // Early return after all hooks are called\n if (!pathMatches) {\n return null;\n }\n\n return (\n <ErrorBoundary\n fallback={\n <div className=\"p-6 text-center text-text-secondary\">\n Something went wrong loading this module. Please refresh the page.\n </div>\n }\n >\n <FeatureFlagProvider\n workspaceId={null}\n gateway=\"global\"\n defaultEnabled={true}\n >\n <AuthProvider {...props}>\n <CaptchaProvider>\n <AuthRoutes\n basePath={normalizedBasePath}\n enableAdminRoutes={enableAdminRoutes}\n bypassEnterprisePlanGate={bypassEnterprisePlanGate}\n />\n </CaptchaProvider>\n </AuthProvider>\n </FeatureFlagProvider>\n </ErrorBoundary>\n );\n};\n"],"mappings":";;;;;;;;;;AAoCA,IAAa,KAA+B,MAAU;CACpD,IAAM,EACJ,qBACA,wBACA,cAAW,KACX,uBAAoB,IACpB,8BAA2B,OACzB,GACE,IAAW,GAAa,EAGxB,IAAqB,QAEvB,KAAY,MAAa,MACrB,EAAS,SAAS,IAAI,GACpB,EAAS,MAAM,GAAG,GAAG,GACrB,IACF,IACN,CAAC,EAAS,CACX,EAGK,KAAY,GAAc,OACZ,EAAK,SAAS,IAAI,GAAG,EAAK,MAAM,GAAG,GAAG,GAAG,MACzC,EAAK,WAAW,IAAI,GAAG,IAAO,IAAI;AA+FtD,QA1FA,QAAgB;AACT,QAsDL,QAHgB,EAjDY;GAC1B;IACE,IAAI;IACJ,OAAO;IACP,MAAM,EAAS,GAAU,WAAW;IACpC,MAAM,kBAAC,GAAD,EAAa,MAAM,IAAM,CAAA;IAC/B,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO;IACP,MAAM,EAAS,GAAU,WAAW;IACpC,MAAM,kBAAC,GAAD,EAAQ,MAAM,IAAM,CAAA;IAC1B,OAAO;IACP,OAAO;IACR;GACD;IACE,IAAI;IACJ,OAAO;IACP,MAAM,EAAS,GAAU,MAAM;IAC/B,MAAM,kBAAC,GAAD,EAAK,MAAM,IAAM,CAAA;IACvB,OAAO;IACP,OAAO;IACR;GAUD,GAAI,IACA,CACE;IACE,IAAI;IACJ,OAAO;IACP,MAAM,EAAS,GAAU,MAAM;IAC/B,MAAM,kBAAC,GAAD,EAAU,MAAM,IAAM,CAAA;IAC5B,OAAO;IACP,OAAO;IACR,CACF,GACD,EAAE;GACP,CAGyC;IAIzC;EAAC;EAAkB;EAAU;EAAkB,CAAC,EAGnD,QAAgB;AACT,QAaL,QADgB,EAVI,CAClB;GACE,IAAI;GACJ,OAAO;GACP,MAAM;GACN,OAAO;GACP,SAAS;GACV,CACF,CAE+C;IAE/C,CAAC,EAAoB,CAAC,EAGL,QACb,IAEH,EAAS,aAAa,KACtB,EAAS,SAAS,WAAW,IAAqB,IAAI,GAHxB,IAK/B,CAAC,GAAoB,EAAS,SAAS,CAAC,GAQzC,kBAAC,GAAD;EACE,UACE,kBAAC,OAAD;GAAK,WAAU;aAAsC;GAE/C,CAAA;YAGR,kBAAC,GAAD;GACE,aAAa;GACb,SAAQ;GACR,gBAAgB;aAEhB,kBAAC,GAAD;IAAc,GAAI;cAChB,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;KACE,UAAU;KACS;KACO;KAC1B,CAAA,EACc,CAAA;IACL,CAAA;GACK,CAAA;EACR,CAAA,GA1BT"}
|
|
@@ -22,8 +22,9 @@
|
|
|
22
22
|
* - audit-log → Security audit log (protected, accessible at /auth/audit-log)
|
|
23
23
|
* - sso → SSO configuration (protected, admin only, accessible at /auth/sso)
|
|
24
24
|
*/
|
|
25
|
-
export declare function AuthRoutes({ basePath: _basePath, enableAdminRoutes, }: {
|
|
25
|
+
export declare function AuthRoutes({ basePath: _basePath, enableAdminRoutes, bypassEnterprisePlanGate, }: {
|
|
26
26
|
basePath?: string;
|
|
27
27
|
enableAdminRoutes?: boolean;
|
|
28
|
+
bypassEnterprisePlanGate?: boolean;
|
|
28
29
|
}): import("react/jsx-runtime").JSX.Element;
|
|
29
30
|
//# sourceMappingURL=AuthRoutes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthRoutes.d.ts","sourceRoot":"","sources":["../../src/auth/AuthRoutes.tsx"],"names":[],"mappings":"AAmMA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EAAE,SAAc,EACxB,iBAAwB,
|
|
1
|
+
{"version":3,"file":"AuthRoutes.d.ts","sourceRoot":"","sources":["../../src/auth/AuthRoutes.tsx"],"names":[],"mappings":"AAmMA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,UAAU,CAAC,EACzB,QAAQ,EAAE,SAAc,EACxB,iBAAwB,EACxB,wBAAgC,GACjC,EAAE;IACD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC,2CAkQA"}
|
package/dist/auth/AuthRoutes.js
CHANGED
|
@@ -83,8 +83,8 @@ function z({ children: t }) {
|
|
|
83
83
|
replace: !0
|
|
84
84
|
});
|
|
85
85
|
}
|
|
86
|
-
function B({ basePath: e = "", enableAdminRoutes: c = !0 }) {
|
|
87
|
-
let
|
|
86
|
+
function B({ basePath: e = "", enableAdminRoutes: c = !0, bypassEnterprisePlanGate: l = !1 }) {
|
|
87
|
+
let u = v("auth.audit-log")?.value === !0;
|
|
88
88
|
return /* @__PURE__ */ g(p, { children: [
|
|
89
89
|
/* @__PURE__ */ h(f, {
|
|
90
90
|
path: "login",
|
|
@@ -177,7 +177,7 @@ function B({ basePath: e = "", enableAdminRoutes: c = !0 }) {
|
|
|
177
177
|
path: "security",
|
|
178
178
|
element: /* @__PURE__ */ h(z, { children: /* @__PURE__ */ h(_, {
|
|
179
179
|
flag: "auth.security",
|
|
180
|
-
defaultValue: !
|
|
180
|
+
defaultValue: !0,
|
|
181
181
|
children: /* @__PURE__ */ h(s, {
|
|
182
182
|
fallback: /* @__PURE__ */ h(I, {}),
|
|
183
183
|
children: /* @__PURE__ */ h(T, {})
|
|
@@ -188,7 +188,7 @@ function B({ basePath: e = "", enableAdminRoutes: c = !0 }) {
|
|
|
188
188
|
path: "sessions",
|
|
189
189
|
element: /* @__PURE__ */ h(z, { children: /* @__PURE__ */ h(_, {
|
|
190
190
|
flag: "auth.sessions",
|
|
191
|
-
defaultValue: !
|
|
191
|
+
defaultValue: !0,
|
|
192
192
|
children: /* @__PURE__ */ h(s, {
|
|
193
193
|
fallback: /* @__PURE__ */ h(I, {}),
|
|
194
194
|
children: /* @__PURE__ */ h(E, {})
|
|
@@ -199,7 +199,7 @@ function B({ basePath: e = "", enableAdminRoutes: c = !0 }) {
|
|
|
199
199
|
path: "mfa",
|
|
200
200
|
element: /* @__PURE__ */ h(z, { children: /* @__PURE__ */ h(_, {
|
|
201
201
|
flag: "auth.mfa",
|
|
202
|
-
defaultValue: !
|
|
202
|
+
defaultValue: !0,
|
|
203
203
|
children: /* @__PURE__ */ h(s, {
|
|
204
204
|
fallback: /* @__PURE__ */ h(I, {}),
|
|
205
205
|
children: /* @__PURE__ */ h(D, {})
|
|
@@ -213,7 +213,7 @@ function B({ basePath: e = "", enableAdminRoutes: c = !0 }) {
|
|
|
213
213
|
replace: !0
|
|
214
214
|
}) })
|
|
215
215
|
}),
|
|
216
|
-
c &&
|
|
216
|
+
c && u && /* @__PURE__ */ h(f, {
|
|
217
217
|
path: "audit-log",
|
|
218
218
|
element: /* @__PURE__ */ h(z, { children: /* @__PURE__ */ h(_, {
|
|
219
219
|
flag: "auth.audit-log",
|
|
@@ -235,10 +235,10 @@ function B({ basePath: e = "", enableAdminRoutes: c = !0 }) {
|
|
|
235
235
|
path: "sso",
|
|
236
236
|
element: c ? /* @__PURE__ */ h(z, { children: /* @__PURE__ */ h(_, {
|
|
237
237
|
flag: "auth.sso",
|
|
238
|
-
defaultValue: !
|
|
238
|
+
defaultValue: !0,
|
|
239
239
|
children: /* @__PURE__ */ h(s, {
|
|
240
240
|
fallback: /* @__PURE__ */ h(I, {}),
|
|
241
|
-
children: /* @__PURE__ */ h(k, {})
|
|
241
|
+
children: /* @__PURE__ */ h(k, { bypassEnterprisePlanGate: l })
|
|
242
242
|
})
|
|
243
243
|
}) }) : /* @__PURE__ */ h(d, {
|
|
244
244
|
to: "/auth/login",
|
|
@@ -260,7 +260,7 @@ function B({ basePath: e = "", enableAdminRoutes: c = !0 }) {
|
|
|
260
260
|
path: "users",
|
|
261
261
|
element: c ? /* @__PURE__ */ h(z, { children: /* @__PURE__ */ h(_, {
|
|
262
262
|
flag: "auth.users",
|
|
263
|
-
defaultValue: !
|
|
263
|
+
defaultValue: !0,
|
|
264
264
|
children: /* @__PURE__ */ h(s, {
|
|
265
265
|
fallback: /* @__PURE__ */ h(I, {}),
|
|
266
266
|
children: /* @__PURE__ */ h(N, {})
|
|
@@ -274,7 +274,7 @@ function B({ basePath: e = "", enableAdminRoutes: c = !0 }) {
|
|
|
274
274
|
path: "users/:id",
|
|
275
275
|
element: c ? /* @__PURE__ */ h(z, { children: /* @__PURE__ */ h(_, {
|
|
276
276
|
flag: "auth.users",
|
|
277
|
-
defaultValue: !
|
|
277
|
+
defaultValue: !0,
|
|
278
278
|
children: /* @__PURE__ */ h(s, {
|
|
279
279
|
fallback: /* @__PURE__ */ h(I, {}),
|
|
280
280
|
children: /* @__PURE__ */ h(P, {})
|
|
@@ -288,7 +288,7 @@ function B({ basePath: e = "", enableAdminRoutes: c = !0 }) {
|
|
|
288
288
|
path: "profile",
|
|
289
289
|
element: /* @__PURE__ */ h(z, { children: /* @__PURE__ */ h(_, {
|
|
290
290
|
flag: "auth.profile",
|
|
291
|
-
defaultValue: !
|
|
291
|
+
defaultValue: !0,
|
|
292
292
|
children: /* @__PURE__ */ h(s, {
|
|
293
293
|
fallback: /* @__PURE__ */ h(I, {}),
|
|
294
294
|
children: /* @__PURE__ */ h(F, {})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthRoutes.js","names":[],"sources":["../../src/auth/AuthRoutes.tsx"],"sourcesContent":["import { lazy, Suspense, useEffect, useState } from \"react\";\nimport {\n useFeatureFlagDetails,\n FeatureGate,\n} from \"@burdenoff/fe-libs/shared/feature-flags\";\nimport { Navigate, Route, Routes } from \"react-router-dom\";\nimport { useAuthStore } from \"./store/authStore\";\n\n// Eager imports - these are the most commonly accessed routes\nimport { LoginPage } from \"./pages/LoginPage\";\nimport { SessionBridgePage } from \"./pages/SessionBridgePage\";\nimport { SSORelayPage } from \"./pages/SSORelayPage\";\nimport { SSORelayCallbackPage } from \"./pages/SSORelayCallbackPage\";\nimport { SSODepositPage } from \"./pages/SSODepositPage\";\nimport { SSOClearPage } from \"./pages/SSOClearPage\";\n\n// Lazy-loaded pages - loaded on demand when their routes are accessed\nconst RegisterPage = lazy(() =>\n import(\"./pages/RegisterPage\").then((m) => ({ default: m.RegisterPage })),\n);\nconst PasswordResetPage = lazy(() =>\n import(\"./pages/PasswordResetPage\").then((m) => ({\n default: m.PasswordResetPage,\n })),\n);\nconst EmailVerifyPage = lazy(() =>\n import(\"./pages/EmailVerifyPage\").then((m) => ({\n default: m.EmailVerifyPage,\n })),\n);\nconst MfaVerifyPage = lazy(() =>\n import(\"./pages/MfaVerifyPage\").then((m) => ({ default: m.MfaVerifyPage })),\n);\nconst MagicLinkPage = lazy(() =>\n import(\"./pages/MagicLinkPage\").then((m) => ({ default: m.MagicLinkPage })),\n);\nconst ReactivatePage = lazy(() =>\n import(\"./pages/ReactivatePage\").then((m) => ({ default: m.ReactivatePage })),\n);\nconst SecurityPage = lazy(() =>\n import(\"./pages/SecurityPage\").then((m) => ({ default: m.SecurityPage })),\n);\nconst SessionsPage = lazy(() =>\n import(\"./pages/SessionsPage\").then((m) => ({ default: m.SessionsPage })),\n);\nconst MfaSetupPage = lazy(() =>\n import(\"./pages/MfaSetupPage\").then((m) => ({ default: m.MfaSetupPage })),\n);\nconst AuditLogPage = lazy(() =>\n import(\"./pages/AuditLogPage\").then((m) => ({ default: m.AuditLogPage })),\n);\nconst SsoConfigPage = lazy(() =>\n import(\"./pages/SsoConfigPage\").then((m) => ({ default: m.SsoConfigPage })),\n);\nconst SsoLoginPage = lazy(() =>\n import(\"./pages/SsoLoginPage\").then((m) => ({ default: m.SsoLoginPage })),\n);\nconst SsoCallbackPage = lazy(() =>\n import(\"./pages/SsoCallbackPage\").then((m) => ({\n default: m.SsoCallbackPage,\n })),\n);\nconst OAuthCallbackPage = lazy(() =>\n import(\"./pages/OAuthCallbackPage\").then((m) => ({\n default: m.OAuthCallbackPage,\n })),\n);\nconst UsersPage = lazy(() =>\n import(\"./pages/UsersPage\").then((m) => ({ default: m.UsersPage })),\n);\nconst UserDetailsPage = lazy(() =>\n import(\"./pages/UserDetailsPage\").then((m) => ({\n default: m.UserDetailsPage,\n })),\n);\nconst UserProfilePage = lazy(() =>\n import(\"./pages/UserProfilePage\").then((m) => ({\n default: m.UserProfilePage,\n })),\n);\n/**\n * Simple loading fallback for lazy-loaded pages\n */\nfunction PageLoader() {\n return (\n <div className=\"flex min-h-[400px] items-center justify-center\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-4 border-primary border-t-transparent\" />\n </div>\n );\n}\n\nfunction decodeJwtExpiry(token: string): number | null {\n try {\n const payload = JSON.parse(\n atob(token.split(\".\")[1].replace(/-/g, \"+\").replace(/_/g, \"/\")),\n ) as { exp?: number };\n\n return typeof payload.exp === \"number\" ? payload.exp * 1000 : null;\n } catch {\n return null;\n }\n}\n\nfunction getStoredSessionSnapshot(): {\n hasValidSession: boolean;\n expiresAt: number | null;\n} {\n try {\n const activeProfileId = sessionStorage.getItem(\"bf-active-profile\");\n if (!activeProfileId) {\n return { hasValidSession: false, expiresAt: null };\n }\n\n const tokensRaw = localStorage.getItem(`bf-p-${activeProfileId}-tokens`);\n if (!tokensRaw) {\n return { hasValidSession: false, expiresAt: null };\n }\n\n const tokens = JSON.parse(tokensRaw) as {\n accessToken?: string;\n expiresAt?: number;\n };\n\n if (!tokens.accessToken) {\n return { hasValidSession: false, expiresAt: null };\n }\n\n const expiresAt =\n typeof tokens.expiresAt === \"number\"\n ? tokens.expiresAt\n : decodeJwtExpiry(tokens.accessToken);\n\n if (!expiresAt) {\n return { hasValidSession: false, expiresAt: null };\n }\n\n return {\n hasValidSession: expiresAt > Date.now(),\n expiresAt,\n };\n } catch {\n return { hasValidSession: false, expiresAt: null };\n }\n}\n\n/**\n * Protected route wrapper\n */\nfunction ProtectedRoute({ children }: { children: React.ReactNode }) {\n const isAuthenticated = useAuthStore((state) => state.isAuthenticated);\n const clearAuth = useAuthStore((state) => state.clearAuth);\n const [sessionCheckVersion, setSessionCheckVersion] = useState(0);\n const sessionSnapshot = getStoredSessionSnapshot();\n\n useEffect(() => {\n const handleSessionUpdate = () => {\n setSessionCheckVersion((value) => value + 1);\n };\n\n window.addEventListener(\"bf-profile-storage-change\", handleSessionUpdate);\n window.addEventListener(\"storage\", handleSessionUpdate);\n\n return () => {\n window.removeEventListener(\n \"bf-profile-storage-change\",\n handleSessionUpdate,\n );\n window.removeEventListener(\"storage\", handleSessionUpdate);\n };\n }, []);\n\n useEffect(() => {\n if (!sessionSnapshot.expiresAt) return;\n\n const timeoutMs = Math.max(sessionSnapshot.expiresAt - Date.now(), 0) + 50;\n const timer = window.setTimeout(() => {\n setSessionCheckVersion((value) => value + 1);\n }, timeoutMs);\n\n return () => window.clearTimeout(timer);\n }, [sessionSnapshot.expiresAt, sessionCheckVersion]);\n\n useEffect(() => {\n if (isAuthenticated && !sessionSnapshot.hasValidSession) {\n clearAuth();\n }\n }, [clearAuth, isAuthenticated, sessionSnapshot.hasValidSession]);\n\n if (!sessionSnapshot.hasValidSession) {\n return <Navigate to=\"/auth/login\" replace />;\n }\n\n return <>{children}</>;\n}\n\n/**\n * Internal router for the Auth microfrontend.\n * This component handles routing within the microfrontend using React Router v7.\n *\n * When used within a parent route (e.g., <Route path=\"/auth/*\">), all paths are relative:\n * - login → Login page (accessible at /auth/login)\n * - register → Registration page (accessible at /auth/register)\n * - reset-password → Password reset page (accessible at /auth/reset-password)\n * - verify-email → Email verification page (accessible at /auth/verify-email)\n * - mfa-verify → MFA verification page (accessible at /auth/mfa-verify)\n * - magic-link → Magic link authentication page (accessible at /auth/magic-link)\n * - sso/login → SSO login page (accessible at /auth/sso/login)\n * - sso/callback → SSO callback handler (accessible at /auth/sso/callback)\n * - oauth/callback → OAuth callback handler (accessible at /auth/oauth/callback)\n * - security → Security settings (protected, accessible at /auth/security)\n * - sessions → Active sessions (protected, accessible at /auth/sessions)\n * - mfa → MFA setup (protected, accessible at /auth/mfa)\n * - api-keys → API keys management (protected, accessible at /auth/api-keys)\n * - apps → Legacy redirect to Developer Portal app creation\n * - users → Users management (protected, admin only, accessible at /auth/users)\n * - profile → User profile page (protected, accessible at /auth/profile)\n * - audit-log → Security audit log (protected, accessible at /auth/audit-log)\n * - sso → SSO configuration (protected, admin only, accessible at /auth/sso)\n */\nexport function AuthRoutes({\n basePath: _basePath = \"\",\n enableAdminRoutes = true,\n}: {\n basePath?: string;\n enableAdminRoutes?: boolean;\n}) {\n // Note: basePath is kept for backwards compatibility but not used in route paths\n // since React Router v7 uses relative paths when nested inside a parent <Route>\n const auditLogFlag = useFeatureFlagDetails(\"auth.audit-log\");\n const showAuditLog = auditLogFlag?.value === true;\n return (\n <Routes>\n {/* Public routes (no auth required) */}\n {/* LoginPage is eager-loaded as it's the most common entry point */}\n <Route path=\"login\" element={<LoginPage />} />\n <Route\n path=\"register\"\n element={\n <Suspense fallback={<PageLoader />}>\n <RegisterPage />\n </Suspense>\n }\n />\n <Route\n path=\"reset-password\"\n element={\n <Suspense fallback={<PageLoader />}>\n <PasswordResetPage />\n </Suspense>\n }\n />\n <Route\n path=\"verify-email\"\n element={\n <Suspense fallback={<PageLoader />}>\n <EmailVerifyPage />\n </Suspense>\n }\n />\n <Route\n path=\"mfa-verify\"\n element={\n <Suspense fallback={<PageLoader />}>\n <MfaVerifyPage />\n </Suspense>\n }\n />\n <Route\n path=\"magic-link\"\n element={\n <Suspense fallback={<PageLoader />}>\n <MagicLinkPage />\n </Suspense>\n }\n />\n\n {/* SSO routes (public) */}\n <Route\n path=\"sso/login\"\n element={\n <Suspense fallback={<PageLoader />}>\n <SsoLoginPage />\n </Suspense>\n }\n />\n <Route\n path=\"sso/callback\"\n element={\n <Suspense fallback={<PageLoader />}>\n <SsoCallbackPage />\n </Suspense>\n }\n />\n\n {/* OAuth callback route (public) */}\n <Route\n path=\"oauth/callback\"\n element={\n <Suspense fallback={<PageLoader />}>\n <OAuthCallbackPage />\n </Suspense>\n }\n />\n\n {/* Account reactivation (public) */}\n <Route\n path=\"reactivate\"\n element={\n <Suspense fallback={<PageLoader />}>\n <ReactivatePage />\n </Suspense>\n }\n />\n\n {/* Session bridge (public - embedded as hidden iframe by other app shells) */}\n <Route path=\"session-bridge\" element={<SessionBridgePage />} />\n\n {/* Cross-domain SSO relay (reads local tokens, redirects with them to target) */}\n <Route path=\"sso-relay\" element={<SSORelayPage />} />\n\n {/* Cross-domain SSO callback (receives tokens from relay, stores locally) */}\n <Route path=\"sso-callback\" element={<SSORelayCallbackPage />} />\n\n {/* Cross-domain SSO deposit (bridge host receives tokens on top-level\n redirect right after login on a product origin, writes first-party\n localStorage on the bridge origin so other products can discover\n the session). */}\n <Route path=\"sso-deposit\" element={<SSODepositPage />} />\n\n {/* Cross-domain SLO clear (bridge host clears its central session on\n top-level redirect from a product origin's logout). */}\n <Route path=\"sso-clear\" element={<SSOClearPage />} />\n\n {/* Protected routes (auth required) */}\n <Route\n path=\"security\"\n element={\n <ProtectedRoute>\n <FeatureGate flag=\"auth.security\" defaultValue={false}>\n <Suspense fallback={<PageLoader />}>\n <SecurityPage />\n </Suspense>\n </FeatureGate>\n </ProtectedRoute>\n }\n />\n <Route\n path=\"sessions\"\n element={\n <ProtectedRoute>\n <FeatureGate flag=\"auth.sessions\" defaultValue={false}>\n <Suspense fallback={<PageLoader />}>\n <SessionsPage />\n </Suspense>\n </FeatureGate>\n </ProtectedRoute>\n }\n />\n <Route\n path=\"mfa\"\n element={\n <ProtectedRoute>\n <FeatureGate flag=\"auth.mfa\" defaultValue={false}>\n <Suspense fallback={<PageLoader />}>\n <MfaSetupPage />\n </Suspense>\n </FeatureGate>\n </ProtectedRoute>\n }\n />\n <Route\n path=\"api-keys\"\n element={\n <ProtectedRoute>\n <Navigate to=\"/devportal/api-keys\" replace />\n </ProtectedRoute>\n }\n />\n {enableAdminRoutes && showAuditLog && (\n <Route\n path=\"audit-log\"\n element={\n <ProtectedRoute>\n <FeatureGate flag=\"auth.audit-log\" defaultValue={false}>\n <Suspense fallback={<PageLoader />}>\n <AuditLogPage />\n </Suspense>\n </FeatureGate>\n </ProtectedRoute>\n }\n />\n )}\n {!enableAdminRoutes && (\n <Route\n path=\"audit-log\"\n element={<Navigate to=\"/auth/login\" replace />}\n />\n )}\n <Route\n path=\"sso\"\n element={\n enableAdminRoutes ? (\n <ProtectedRoute>\n <FeatureGate flag=\"auth.sso\" defaultValue={false}>\n <Suspense fallback={<PageLoader />}>\n <SsoConfigPage />\n </Suspense>\n </FeatureGate>\n </ProtectedRoute>\n ) : (\n <Navigate to=\"/auth/login\" replace />\n )\n }\n />\n <Route\n path=\"apps\"\n element={\n <ProtectedRoute>\n <FeatureGate flag=\"auth.apps\" defaultValue={false}>\n <Navigate to=\"/devportal/apps\" replace />\n </FeatureGate>\n </ProtectedRoute>\n }\n />\n <Route\n path=\"users\"\n element={\n enableAdminRoutes ? (\n <ProtectedRoute>\n <FeatureGate flag=\"auth.users\" defaultValue={false}>\n <Suspense fallback={<PageLoader />}>\n <UsersPage />\n </Suspense>\n </FeatureGate>\n </ProtectedRoute>\n ) : (\n <Navigate to=\"/auth/login\" replace />\n )\n }\n />\n <Route\n path=\"users/:id\"\n element={\n enableAdminRoutes ? (\n <ProtectedRoute>\n <FeatureGate flag=\"auth.users\" defaultValue={false}>\n <Suspense fallback={<PageLoader />}>\n <UserDetailsPage />\n </Suspense>\n </FeatureGate>\n </ProtectedRoute>\n ) : (\n <Navigate to=\"/auth/login\" replace />\n )\n }\n />\n <Route\n path=\"profile\"\n element={\n <ProtectedRoute>\n <FeatureGate flag=\"auth.profile\" defaultValue={false}>\n <Suspense fallback={<PageLoader />}>\n <UserProfilePage />\n </Suspense>\n </FeatureGate>\n </ProtectedRoute>\n }\n />\n <Route\n path=\"delegations\"\n element={\n <ProtectedRoute>\n <Navigate to=\"/devportal/delegations\" replace />\n </ProtectedRoute>\n }\n />\n\n {/* Default redirect - when visiting /auth or /auth/ with no subpath */}\n <Route index element={<Navigate to=\"login\" replace />} />\n </Routes>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AuthRoutes.js","names":[],"sources":["../../src/auth/AuthRoutes.tsx"],"sourcesContent":["import { lazy, Suspense, useEffect, useState } from \"react\";\nimport {\n useFeatureFlagDetails,\n FeatureGate,\n} from \"@burdenoff/fe-libs/shared/feature-flags\";\nimport { Navigate, Route, Routes } from \"react-router-dom\";\nimport { useAuthStore } from \"./store/authStore\";\n\n// Eager imports - these are the most commonly accessed routes\nimport { LoginPage } from \"./pages/LoginPage\";\nimport { SessionBridgePage } from \"./pages/SessionBridgePage\";\nimport { SSORelayPage } from \"./pages/SSORelayPage\";\nimport { SSORelayCallbackPage } from \"./pages/SSORelayCallbackPage\";\nimport { SSODepositPage } from \"./pages/SSODepositPage\";\nimport { SSOClearPage } from \"./pages/SSOClearPage\";\n\n// Lazy-loaded pages - loaded on demand when their routes are accessed\nconst RegisterPage = lazy(() =>\n import(\"./pages/RegisterPage\").then((m) => ({ default: m.RegisterPage })),\n);\nconst PasswordResetPage = lazy(() =>\n import(\"./pages/PasswordResetPage\").then((m) => ({\n default: m.PasswordResetPage,\n })),\n);\nconst EmailVerifyPage = lazy(() =>\n import(\"./pages/EmailVerifyPage\").then((m) => ({\n default: m.EmailVerifyPage,\n })),\n);\nconst MfaVerifyPage = lazy(() =>\n import(\"./pages/MfaVerifyPage\").then((m) => ({ default: m.MfaVerifyPage })),\n);\nconst MagicLinkPage = lazy(() =>\n import(\"./pages/MagicLinkPage\").then((m) => ({ default: m.MagicLinkPage })),\n);\nconst ReactivatePage = lazy(() =>\n import(\"./pages/ReactivatePage\").then((m) => ({ default: m.ReactivatePage })),\n);\nconst SecurityPage = lazy(() =>\n import(\"./pages/SecurityPage\").then((m) => ({ default: m.SecurityPage })),\n);\nconst SessionsPage = lazy(() =>\n import(\"./pages/SessionsPage\").then((m) => ({ default: m.SessionsPage })),\n);\nconst MfaSetupPage = lazy(() =>\n import(\"./pages/MfaSetupPage\").then((m) => ({ default: m.MfaSetupPage })),\n);\nconst AuditLogPage = lazy(() =>\n import(\"./pages/AuditLogPage\").then((m) => ({ default: m.AuditLogPage })),\n);\nconst SsoConfigPage = lazy(() =>\n import(\"./pages/SsoConfigPage\").then((m) => ({ default: m.SsoConfigPage })),\n);\nconst SsoLoginPage = lazy(() =>\n import(\"./pages/SsoLoginPage\").then((m) => ({ default: m.SsoLoginPage })),\n);\nconst SsoCallbackPage = lazy(() =>\n import(\"./pages/SsoCallbackPage\").then((m) => ({\n default: m.SsoCallbackPage,\n })),\n);\nconst OAuthCallbackPage = lazy(() =>\n import(\"./pages/OAuthCallbackPage\").then((m) => ({\n default: m.OAuthCallbackPage,\n })),\n);\nconst UsersPage = lazy(() =>\n import(\"./pages/UsersPage\").then((m) => ({ default: m.UsersPage })),\n);\nconst UserDetailsPage = lazy(() =>\n import(\"./pages/UserDetailsPage\").then((m) => ({\n default: m.UserDetailsPage,\n })),\n);\nconst UserProfilePage = lazy(() =>\n import(\"./pages/UserProfilePage\").then((m) => ({\n default: m.UserProfilePage,\n })),\n);\n/**\n * Simple loading fallback for lazy-loaded pages\n */\nfunction PageLoader() {\n return (\n <div className=\"flex min-h-[400px] items-center justify-center\">\n <div className=\"h-8 w-8 animate-spin rounded-full border-4 border-primary border-t-transparent\" />\n </div>\n );\n}\n\nfunction decodeJwtExpiry(token: string): number | null {\n try {\n const payload = JSON.parse(\n atob(token.split(\".\")[1].replace(/-/g, \"+\").replace(/_/g, \"/\")),\n ) as { exp?: number };\n\n return typeof payload.exp === \"number\" ? payload.exp * 1000 : null;\n } catch {\n return null;\n }\n}\n\nfunction getStoredSessionSnapshot(): {\n hasValidSession: boolean;\n expiresAt: number | null;\n} {\n try {\n const activeProfileId = sessionStorage.getItem(\"bf-active-profile\");\n if (!activeProfileId) {\n return { hasValidSession: false, expiresAt: null };\n }\n\n const tokensRaw = localStorage.getItem(`bf-p-${activeProfileId}-tokens`);\n if (!tokensRaw) {\n return { hasValidSession: false, expiresAt: null };\n }\n\n const tokens = JSON.parse(tokensRaw) as {\n accessToken?: string;\n expiresAt?: number;\n };\n\n if (!tokens.accessToken) {\n return { hasValidSession: false, expiresAt: null };\n }\n\n const expiresAt =\n typeof tokens.expiresAt === \"number\"\n ? tokens.expiresAt\n : decodeJwtExpiry(tokens.accessToken);\n\n if (!expiresAt) {\n return { hasValidSession: false, expiresAt: null };\n }\n\n return {\n hasValidSession: expiresAt > Date.now(),\n expiresAt,\n };\n } catch {\n return { hasValidSession: false, expiresAt: null };\n }\n}\n\n/**\n * Protected route wrapper\n */\nfunction ProtectedRoute({ children }: { children: React.ReactNode }) {\n const isAuthenticated = useAuthStore((state) => state.isAuthenticated);\n const clearAuth = useAuthStore((state) => state.clearAuth);\n const [sessionCheckVersion, setSessionCheckVersion] = useState(0);\n const sessionSnapshot = getStoredSessionSnapshot();\n\n useEffect(() => {\n const handleSessionUpdate = () => {\n setSessionCheckVersion((value) => value + 1);\n };\n\n window.addEventListener(\"bf-profile-storage-change\", handleSessionUpdate);\n window.addEventListener(\"storage\", handleSessionUpdate);\n\n return () => {\n window.removeEventListener(\n \"bf-profile-storage-change\",\n handleSessionUpdate,\n );\n window.removeEventListener(\"storage\", handleSessionUpdate);\n };\n }, []);\n\n useEffect(() => {\n if (!sessionSnapshot.expiresAt) return;\n\n const timeoutMs = Math.max(sessionSnapshot.expiresAt - Date.now(), 0) + 50;\n const timer = window.setTimeout(() => {\n setSessionCheckVersion((value) => value + 1);\n }, timeoutMs);\n\n return () => window.clearTimeout(timer);\n }, [sessionSnapshot.expiresAt, sessionCheckVersion]);\n\n useEffect(() => {\n if (isAuthenticated && !sessionSnapshot.hasValidSession) {\n clearAuth();\n }\n }, [clearAuth, isAuthenticated, sessionSnapshot.hasValidSession]);\n\n if (!sessionSnapshot.hasValidSession) {\n return <Navigate to=\"/auth/login\" replace />;\n }\n\n return <>{children}</>;\n}\n\n/**\n * Internal router for the Auth microfrontend.\n * This component handles routing within the microfrontend using React Router v7.\n *\n * When used within a parent route (e.g., <Route path=\"/auth/*\">), all paths are relative:\n * - login → Login page (accessible at /auth/login)\n * - register → Registration page (accessible at /auth/register)\n * - reset-password → Password reset page (accessible at /auth/reset-password)\n * - verify-email → Email verification page (accessible at /auth/verify-email)\n * - mfa-verify → MFA verification page (accessible at /auth/mfa-verify)\n * - magic-link → Magic link authentication page (accessible at /auth/magic-link)\n * - sso/login → SSO login page (accessible at /auth/sso/login)\n * - sso/callback → SSO callback handler (accessible at /auth/sso/callback)\n * - oauth/callback → OAuth callback handler (accessible at /auth/oauth/callback)\n * - security → Security settings (protected, accessible at /auth/security)\n * - sessions → Active sessions (protected, accessible at /auth/sessions)\n * - mfa → MFA setup (protected, accessible at /auth/mfa)\n * - api-keys → API keys management (protected, accessible at /auth/api-keys)\n * - apps → Legacy redirect to Developer Portal app creation\n * - users → Users management (protected, admin only, accessible at /auth/users)\n * - profile → User profile page (protected, accessible at /auth/profile)\n * - audit-log → Security audit log (protected, accessible at /auth/audit-log)\n * - sso → SSO configuration (protected, admin only, accessible at /auth/sso)\n */\nexport function AuthRoutes({\n basePath: _basePath = \"\",\n enableAdminRoutes = true,\n bypassEnterprisePlanGate = false,\n}: {\n basePath?: string;\n enableAdminRoutes?: boolean;\n bypassEnterprisePlanGate?: boolean;\n}) {\n // Note: basePath is kept for backwards compatibility but not used in route paths\n // since React Router v7 uses relative paths when nested inside a parent <Route>\n const auditLogFlag = useFeatureFlagDetails(\"auth.audit-log\");\n const showAuditLog = auditLogFlag?.value === true;\n return (\n <Routes>\n {/* Public routes (no auth required) */}\n {/* LoginPage is eager-loaded as it's the most common entry point */}\n <Route path=\"login\" element={<LoginPage />} />\n <Route\n path=\"register\"\n element={\n <Suspense fallback={<PageLoader />}>\n <RegisterPage />\n </Suspense>\n }\n />\n <Route\n path=\"reset-password\"\n element={\n <Suspense fallback={<PageLoader />}>\n <PasswordResetPage />\n </Suspense>\n }\n />\n <Route\n path=\"verify-email\"\n element={\n <Suspense fallback={<PageLoader />}>\n <EmailVerifyPage />\n </Suspense>\n }\n />\n <Route\n path=\"mfa-verify\"\n element={\n <Suspense fallback={<PageLoader />}>\n <MfaVerifyPage />\n </Suspense>\n }\n />\n <Route\n path=\"magic-link\"\n element={\n <Suspense fallback={<PageLoader />}>\n <MagicLinkPage />\n </Suspense>\n }\n />\n\n {/* SSO routes (public) */}\n <Route\n path=\"sso/login\"\n element={\n <Suspense fallback={<PageLoader />}>\n <SsoLoginPage />\n </Suspense>\n }\n />\n <Route\n path=\"sso/callback\"\n element={\n <Suspense fallback={<PageLoader />}>\n <SsoCallbackPage />\n </Suspense>\n }\n />\n\n {/* OAuth callback route (public) */}\n <Route\n path=\"oauth/callback\"\n element={\n <Suspense fallback={<PageLoader />}>\n <OAuthCallbackPage />\n </Suspense>\n }\n />\n\n {/* Account reactivation (public) */}\n <Route\n path=\"reactivate\"\n element={\n <Suspense fallback={<PageLoader />}>\n <ReactivatePage />\n </Suspense>\n }\n />\n\n {/* Session bridge (public - embedded as hidden iframe by other app shells) */}\n <Route path=\"session-bridge\" element={<SessionBridgePage />} />\n\n {/* Cross-domain SSO relay (reads local tokens, redirects with them to target) */}\n <Route path=\"sso-relay\" element={<SSORelayPage />} />\n\n {/* Cross-domain SSO callback (receives tokens from relay, stores locally) */}\n <Route path=\"sso-callback\" element={<SSORelayCallbackPage />} />\n\n {/* Cross-domain SSO deposit (bridge host receives tokens on top-level\n redirect right after login on a product origin, writes first-party\n localStorage on the bridge origin so other products can discover\n the session). */}\n <Route path=\"sso-deposit\" element={<SSODepositPage />} />\n\n {/* Cross-domain SLO clear (bridge host clears its central session on\n top-level redirect from a product origin's logout). */}\n <Route path=\"sso-clear\" element={<SSOClearPage />} />\n\n {/* Protected routes (auth required) */}\n <Route\n path=\"security\"\n element={\n <ProtectedRoute>\n <FeatureGate flag=\"auth.security\" defaultValue={true}>\n <Suspense fallback={<PageLoader />}>\n <SecurityPage />\n </Suspense>\n </FeatureGate>\n </ProtectedRoute>\n }\n />\n <Route\n path=\"sessions\"\n element={\n <ProtectedRoute>\n <FeatureGate flag=\"auth.sessions\" defaultValue={true}>\n <Suspense fallback={<PageLoader />}>\n <SessionsPage />\n </Suspense>\n </FeatureGate>\n </ProtectedRoute>\n }\n />\n <Route\n path=\"mfa\"\n element={\n <ProtectedRoute>\n <FeatureGate flag=\"auth.mfa\" defaultValue={true}>\n <Suspense fallback={<PageLoader />}>\n <MfaSetupPage />\n </Suspense>\n </FeatureGate>\n </ProtectedRoute>\n }\n />\n <Route\n path=\"api-keys\"\n element={\n <ProtectedRoute>\n <Navigate to=\"/devportal/api-keys\" replace />\n </ProtectedRoute>\n }\n />\n {enableAdminRoutes && showAuditLog && (\n <Route\n path=\"audit-log\"\n element={\n <ProtectedRoute>\n <FeatureGate flag=\"auth.audit-log\" defaultValue={false}>\n <Suspense fallback={<PageLoader />}>\n <AuditLogPage />\n </Suspense>\n </FeatureGate>\n </ProtectedRoute>\n }\n />\n )}\n {!enableAdminRoutes && (\n <Route\n path=\"audit-log\"\n element={<Navigate to=\"/auth/login\" replace />}\n />\n )}\n <Route\n path=\"sso\"\n element={\n enableAdminRoutes ? (\n <ProtectedRoute>\n <FeatureGate flag=\"auth.sso\" defaultValue={true}>\n <Suspense fallback={<PageLoader />}>\n <SsoConfigPage\n bypassEnterprisePlanGate={bypassEnterprisePlanGate}\n />\n </Suspense>\n </FeatureGate>\n </ProtectedRoute>\n ) : (\n <Navigate to=\"/auth/login\" replace />\n )\n }\n />\n <Route\n path=\"apps\"\n element={\n <ProtectedRoute>\n <FeatureGate flag=\"auth.apps\" defaultValue={false}>\n <Navigate to=\"/devportal/apps\" replace />\n </FeatureGate>\n </ProtectedRoute>\n }\n />\n <Route\n path=\"users\"\n element={\n enableAdminRoutes ? (\n <ProtectedRoute>\n <FeatureGate flag=\"auth.users\" defaultValue={true}>\n <Suspense fallback={<PageLoader />}>\n <UsersPage />\n </Suspense>\n </FeatureGate>\n </ProtectedRoute>\n ) : (\n <Navigate to=\"/auth/login\" replace />\n )\n }\n />\n <Route\n path=\"users/:id\"\n element={\n enableAdminRoutes ? (\n <ProtectedRoute>\n <FeatureGate flag=\"auth.users\" defaultValue={true}>\n <Suspense fallback={<PageLoader />}>\n <UserDetailsPage />\n </Suspense>\n </FeatureGate>\n </ProtectedRoute>\n ) : (\n <Navigate to=\"/auth/login\" replace />\n )\n }\n />\n <Route\n path=\"profile\"\n element={\n <ProtectedRoute>\n <FeatureGate flag=\"auth.profile\" defaultValue={true}>\n <Suspense fallback={<PageLoader />}>\n <UserProfilePage />\n </Suspense>\n </FeatureGate>\n </ProtectedRoute>\n }\n />\n <Route\n path=\"delegations\"\n element={\n <ProtectedRoute>\n <Navigate to=\"/devportal/delegations\" replace />\n </ProtectedRoute>\n }\n />\n\n {/* Default redirect - when visiting /auth or /auth/ with no subpath */}\n <Route index element={<Navigate to=\"login\" replace />} />\n </Routes>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuditLogPage.d.ts","sourceRoot":"","sources":["../../../src/auth/pages/AuditLogPage.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AuditLogPage.d.ts","sourceRoot":"","sources":["../../../src/auth/pages/AuditLogPage.tsx"],"names":[],"mappings":"AAcA;;;;;;;;;GASG;AACH,wBAAgB,YAAY,4CA4Q3B"}
|
|
@@ -6,23 +6,24 @@ import { useState as a } from "react";
|
|
|
6
6
|
import { useI18n as o } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
7
7
|
import { Fragment as s, jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
8
8
|
import { useFeatureFlagDetails as u } from "@burdenoff/fe-libs/shared/feature-flags";
|
|
9
|
+
import { useGatewayClient as d } from "@burdenoff/fe-libs/shared/graphql";
|
|
9
10
|
//#region src/auth/pages/AuditLogPage.tsx
|
|
10
|
-
var
|
|
11
|
-
function
|
|
12
|
-
let { t:
|
|
13
|
-
let n =
|
|
11
|
+
var f = 20;
|
|
12
|
+
function p() {
|
|
13
|
+
let { t: p } = o(), m = (e, t) => {
|
|
14
|
+
let n = p(e);
|
|
14
15
|
return n === e ? t : n;
|
|
15
|
-
}, [
|
|
16
|
-
skip: !
|
|
16
|
+
}, [h, g] = a(1), _ = (h - 1) * f, v = u("auth.audit-log")?.value === !0, { data: y, loading: b, error: x } = e({
|
|
17
|
+
skip: !v,
|
|
17
18
|
fetchPolicy: "cache-and-network",
|
|
18
19
|
variables: { pagination: {
|
|
19
|
-
limit:
|
|
20
|
-
offset:
|
|
20
|
+
limit: f,
|
|
21
|
+
offset: _
|
|
21
22
|
} }
|
|
22
|
-
}),
|
|
23
|
-
|
|
23
|
+
}), S = y?.authAuditLogs ?? [], C = S.length === f, [w, { loading: T }] = i({ client: d("workspace") }), [E, D] = a(null), O = async () => {
|
|
24
|
+
D(null);
|
|
24
25
|
try {
|
|
25
|
-
await
|
|
26
|
+
await w({ variables: { input: {
|
|
26
27
|
name: "Audit Log Export",
|
|
27
28
|
entityTypes: ["permission_audit_logs"],
|
|
28
29
|
format: "CSV",
|
|
@@ -30,9 +31,9 @@ function f() {
|
|
|
30
31
|
includeMetadata: !0
|
|
31
32
|
} } });
|
|
32
33
|
} catch (e) {
|
|
33
|
-
|
|
34
|
+
D(e instanceof Error ? e.message : "Failed to start export");
|
|
34
35
|
}
|
|
35
|
-
},
|
|
36
|
+
}, k = (e) => {
|
|
36
37
|
switch (e) {
|
|
37
38
|
case "LOGIN_SUCCESS": return "OK";
|
|
38
39
|
case "LOGIN_FAILURE": return "ER";
|
|
@@ -44,24 +45,24 @@ function f() {
|
|
|
44
45
|
default: return "AU";
|
|
45
46
|
}
|
|
46
47
|
};
|
|
47
|
-
return
|
|
48
|
+
return v ? /* @__PURE__ */ l("div", {
|
|
48
49
|
className: "max-w-4xl mx-auto p-6",
|
|
49
50
|
children: [
|
|
50
51
|
/* @__PURE__ */ l("div", {
|
|
51
52
|
className: "flex items-center justify-between mb-8",
|
|
52
53
|
children: [/* @__PURE__ */ c("h1", {
|
|
53
54
|
className: "text-3xl font-semibold text-text-primary",
|
|
54
|
-
children:
|
|
55
|
+
children: m("auth.auditLog.title", "Security Audit Log")
|
|
55
56
|
}), /* @__PURE__ */ c("button", {
|
|
56
57
|
type: "button",
|
|
57
|
-
onClick: () => void
|
|
58
|
-
disabled:
|
|
59
|
-
"aria-label":
|
|
58
|
+
onClick: () => void O(),
|
|
59
|
+
disabled: T,
|
|
60
|
+
"aria-label": m("auth.auditLog.exportAriaLabel", "Export audit log"),
|
|
60
61
|
className: "flex items-center gap-2 px-4 py-2.5 rounded-xl border border-border-default text-text-primary bg-bg-surface hover:bg-bg-sunken disabled:opacity-50 disabled:cursor-not-allowed transition-colors font-medium",
|
|
61
|
-
children:
|
|
62
|
+
children: T ? /* @__PURE__ */ l(s, { children: [/* @__PURE__ */ c(n, {
|
|
62
63
|
className: "w-4 h-4 animate-spin",
|
|
63
64
|
"aria-hidden": "true"
|
|
64
|
-
}),
|
|
65
|
+
}), m("auth.auditLog.exporting", "Exporting...")] }) : /* @__PURE__ */ l(s, { children: [/* @__PURE__ */ c("svg", {
|
|
65
66
|
className: "w-4 h-4",
|
|
66
67
|
fill: "none",
|
|
67
68
|
viewBox: "0 0 24 24",
|
|
@@ -73,10 +74,10 @@ function f() {
|
|
|
73
74
|
strokeWidth: 2,
|
|
74
75
|
d: "M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-4l-4 4m0 0l-4-4m4 4V4"
|
|
75
76
|
})
|
|
76
|
-
}),
|
|
77
|
+
}), m("auth.auditLog.export", "Export")] })
|
|
77
78
|
})]
|
|
78
79
|
}),
|
|
79
|
-
|
|
80
|
+
E && /* @__PURE__ */ l("div", {
|
|
80
81
|
role: "alert",
|
|
81
82
|
className: "mb-6 flex items-start gap-3 p-4 rounded-xl bg-status-error-bg-subtle border border-status-error-border",
|
|
82
83
|
children: [/* @__PURE__ */ c(t, {
|
|
@@ -84,10 +85,10 @@ function f() {
|
|
|
84
85
|
"aria-hidden": "true"
|
|
85
86
|
}), /* @__PURE__ */ c("p", {
|
|
86
87
|
className: "text-sm text-status-error-text",
|
|
87
|
-
children:
|
|
88
|
+
children: E
|
|
88
89
|
})]
|
|
89
90
|
}),
|
|
90
|
-
|
|
91
|
+
b ? /* @__PURE__ */ l("div", {
|
|
91
92
|
"aria-live": "polite",
|
|
92
93
|
"aria-busy": "true",
|
|
93
94
|
className: "text-center py-12",
|
|
@@ -96,27 +97,27 @@ function f() {
|
|
|
96
97
|
"aria-hidden": "true"
|
|
97
98
|
}), /* @__PURE__ */ c("p", {
|
|
98
99
|
className: "mt-3 text-text-secondary",
|
|
99
|
-
children:
|
|
100
|
+
children: m("auth.auditLog.loading", "Loading audit events...")
|
|
100
101
|
})]
|
|
101
|
-
}) :
|
|
102
|
+
}) : x ? /* @__PURE__ */ c("div", {
|
|
102
103
|
role: "alert",
|
|
103
104
|
className: "text-center py-12 border border-status-error-border rounded-xl bg-status-error-bg-subtle",
|
|
104
105
|
children: /* @__PURE__ */ c("p", {
|
|
105
106
|
className: "text-status-error-text",
|
|
106
|
-
children:
|
|
107
|
+
children: m("auth.auditLog.error", "Unable to load audit events")
|
|
107
108
|
})
|
|
108
|
-
}) :
|
|
109
|
+
}) : S.length === 0 ? /* @__PURE__ */ c("div", {
|
|
109
110
|
className: "text-center py-12",
|
|
110
111
|
role: "status",
|
|
111
112
|
children: /* @__PURE__ */ c("p", {
|
|
112
113
|
className: "text-text-secondary",
|
|
113
|
-
children:
|
|
114
|
+
children: m("auth.auditLog.noEvents", "No security events recorded")
|
|
114
115
|
})
|
|
115
116
|
}) : /* @__PURE__ */ l(s, { children: [/* @__PURE__ */ c("div", {
|
|
116
117
|
className: "space-y-4",
|
|
117
118
|
"aria-live": "polite",
|
|
118
|
-
"aria-busy":
|
|
119
|
-
children:
|
|
119
|
+
"aria-busy": b,
|
|
120
|
+
children: S.map((e) => /* @__PURE__ */ c("div", {
|
|
120
121
|
className: "p-6 rounded-xl border border-border-subtle bg-bg-surface shadow-sm",
|
|
121
122
|
children: /* @__PURE__ */ l("div", {
|
|
122
123
|
className: "flex items-start gap-4",
|
|
@@ -124,7 +125,7 @@ function f() {
|
|
|
124
125
|
/* @__PURE__ */ c("div", {
|
|
125
126
|
className: "flex h-10 w-10 shrink-0 items-center justify-center rounded-full bg-bg-muted text-xs font-semibold text-text-secondary",
|
|
126
127
|
"aria-hidden": "true",
|
|
127
|
-
children:
|
|
128
|
+
children: k(e.action)
|
|
128
129
|
}),
|
|
129
130
|
/* @__PURE__ */ l("div", {
|
|
130
131
|
className: "flex-1",
|
|
@@ -142,44 +143,44 @@ function f() {
|
|
|
142
143
|
}),
|
|
143
144
|
/* @__PURE__ */ l("p", {
|
|
144
145
|
className: "text-sm text-text-secondary",
|
|
145
|
-
children: [e.description ??
|
|
146
|
+
children: [e.description ?? m("auth.auditLog.defaultDescription", "Authentication event"), e.ipAddress && ` • ${e.ipAddress}`]
|
|
146
147
|
})
|
|
147
148
|
]
|
|
148
149
|
}),
|
|
149
150
|
e.action.includes("FAILURE") && /* @__PURE__ */ c("span", {
|
|
150
151
|
role: "status",
|
|
151
152
|
className: "px-3 py-1 rounded-full bg-status-error-bg-subtle text-status-error-text text-sm font-medium",
|
|
152
|
-
children:
|
|
153
|
+
children: m("auth.auditLog.failed", "Failed")
|
|
153
154
|
})
|
|
154
155
|
]
|
|
155
156
|
})
|
|
156
157
|
}, e.id))
|
|
157
158
|
}), /* @__PURE__ */ l("nav", {
|
|
158
|
-
"aria-label":
|
|
159
|
+
"aria-label": m("auth.auditLog.paginationAriaLabel", "Audit log pagination"),
|
|
159
160
|
className: "mt-6 flex items-center justify-between",
|
|
160
161
|
children: [/* @__PURE__ */ l("p", {
|
|
161
162
|
className: "text-sm text-text-secondary",
|
|
162
163
|
children: [
|
|
163
|
-
|
|
164
|
+
m("auth.auditLog.page", "Page"),
|
|
164
165
|
" ",
|
|
165
|
-
|
|
166
|
+
h
|
|
166
167
|
]
|
|
167
168
|
}), /* @__PURE__ */ l("div", {
|
|
168
169
|
className: "flex gap-2",
|
|
169
170
|
children: [/* @__PURE__ */ c("button", {
|
|
170
171
|
type: "button",
|
|
171
|
-
onClick: () =>
|
|
172
|
-
disabled:
|
|
173
|
-
"aria-label":
|
|
172
|
+
onClick: () => g((e) => Math.max(1, e - 1)),
|
|
173
|
+
disabled: h === 1,
|
|
174
|
+
"aria-label": m("auth.auditLog.previousPageAriaLabel", "Go to previous page"),
|
|
174
175
|
className: "px-4 py-2 rounded-lg border border-border-default text-text-primary bg-bg-surface disabled:opacity-50 disabled:cursor-not-allowed hover:bg-bg-sunken transition-colors",
|
|
175
|
-
children:
|
|
176
|
+
children: m("auth.auditLog.previous", "Previous")
|
|
176
177
|
}), /* @__PURE__ */ c("button", {
|
|
177
178
|
type: "button",
|
|
178
|
-
onClick: () =>
|
|
179
|
-
disabled: !
|
|
180
|
-
"aria-label":
|
|
179
|
+
onClick: () => g((e) => e + 1),
|
|
180
|
+
disabled: !C,
|
|
181
|
+
"aria-label": m("auth.auditLog.nextPageAriaLabel", "Go to next page"),
|
|
181
182
|
className: "px-4 py-2 rounded-lg border border-border-default text-text-primary bg-bg-surface disabled:opacity-50 disabled:cursor-not-allowed hover:bg-bg-sunken transition-colors",
|
|
182
|
-
children:
|
|
183
|
+
children: m("auth.auditLog.next", "Next")
|
|
183
184
|
})]
|
|
184
185
|
})]
|
|
185
186
|
})] })
|
|
@@ -198,17 +199,17 @@ function f() {
|
|
|
198
199
|
}),
|
|
199
200
|
/* @__PURE__ */ c("h2", {
|
|
200
201
|
className: "text-xl font-semibold text-text-primary mb-2",
|
|
201
|
-
children:
|
|
202
|
+
children: m("auth.auditLog.notAvailable", "Page Not Available")
|
|
202
203
|
}),
|
|
203
204
|
/* @__PURE__ */ c("p", {
|
|
204
205
|
className: "text-text-secondary",
|
|
205
|
-
children:
|
|
206
|
+
children: m("auth.auditLog.notEnabled", "The Security Audit Log is not enabled for your account.")
|
|
206
207
|
})
|
|
207
208
|
]
|
|
208
209
|
})
|
|
209
210
|
});
|
|
210
211
|
}
|
|
211
212
|
//#endregion
|
|
212
|
-
export {
|
|
213
|
+
export { p as AuditLogPage };
|
|
213
214
|
|
|
214
215
|
//# sourceMappingURL=AuditLogPage.js.map
|