@cedros/login-react 0.0.14 → 0.0.16
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/{AuthenticationSettings-vowmQPXz.js → AuthenticationSettings-BipaLyGg.js} +20 -20
- package/dist/{AuthenticationSettings-vowmQPXz.js.map → AuthenticationSettings-BipaLyGg.js.map} +1 -1
- package/dist/{AuthenticationSettings-D739nNul.cjs → AuthenticationSettings-Cb80XWPm.cjs} +1 -1
- package/dist/{AuthenticationSettings-D739nNul.cjs.map → AuthenticationSettings-Cb80XWPm.cjs.map} +1 -1
- package/dist/{AuthenticationSettings-Dx3JCI3m.js → AuthenticationSettings-Cfn0No6U.js} +1 -1
- package/dist/{AuthenticationSettings-Dx3JCI3m.js.map → AuthenticationSettings-Cfn0No6U.js.map} +1 -1
- package/dist/{AuthenticationSettings-DtLoxQ2z.cjs → AuthenticationSettings-Cu0S0Z7s.cjs} +1 -1
- package/dist/{AuthenticationSettings-DtLoxQ2z.cjs.map → AuthenticationSettings-Cu0S0Z7s.cjs.map} +1 -1
- package/dist/{AutosaveStatus-Ciyt350A.js → AutosaveStatus-BKc7T2Tw.js} +323 -248
- package/dist/AutosaveStatus-BKc7T2Tw.js.map +1 -0
- package/dist/AutosaveStatus-BjLMt52a.cjs +1 -0
- package/dist/AutosaveStatus-BjLMt52a.cjs.map +1 -0
- package/dist/{CreditSystemSettings-BQ3h4CyM.js → CreditSystemSettings-CvcacgMM.js} +1 -1
- package/dist/{CreditSystemSettings-BQ3h4CyM.js.map → CreditSystemSettings-CvcacgMM.js.map} +1 -1
- package/dist/{CreditSystemSettings-bVuNLsqp.js → CreditSystemSettings-D13lZbIw.js} +1 -1
- package/dist/{CreditSystemSettings-bVuNLsqp.js.map → CreditSystemSettings-D13lZbIw.js.map} +1 -1
- package/dist/{CreditSystemSettings-CBot8EPW.cjs → CreditSystemSettings-DO-dUcxN.cjs} +1 -1
- package/dist/{CreditSystemSettings-CBot8EPW.cjs.map → CreditSystemSettings-DO-dUcxN.cjs.map} +1 -1
- package/dist/{CreditSystemSettings-C6dUsu72.cjs → CreditSystemSettings-DV0VkPIe.cjs} +1 -1
- package/dist/{CreditSystemSettings-C6dUsu72.cjs.map → CreditSystemSettings-DV0VkPIe.cjs.map} +1 -1
- package/dist/{EmailRegisterForm-Pvm3I8GP.cjs → EmailRegisterForm-DcpT5LU6.cjs} +1 -1
- package/dist/{EmailRegisterForm-Pvm3I8GP.cjs.map → EmailRegisterForm-DcpT5LU6.cjs.map} +1 -1
- package/dist/{EmailRegisterForm-nI0BOIxR.js → EmailRegisterForm-HMcnD3KA.js} +1 -1
- package/dist/{EmailRegisterForm-nI0BOIxR.js.map → EmailRegisterForm-HMcnD3KA.js.map} +1 -1
- package/dist/{EmailSettings-B9qwPSiM.cjs → EmailSettings-BkR7vlWL.cjs} +1 -1
- package/dist/{EmailSettings-B9qwPSiM.cjs.map → EmailSettings-BkR7vlWL.cjs.map} +1 -1
- package/dist/EmailSettings-CLMdw3rB.js +78 -0
- package/dist/EmailSettings-CLMdw3rB.js.map +1 -0
- package/dist/EmailSettings-Dq3mfUr2.cjs +1 -0
- package/dist/EmailSettings-Dq3mfUr2.cjs.map +1 -0
- package/dist/{EmailSettings-mxlKNcPl.js → EmailSettings-ulEHtH2y.js} +1 -1
- package/dist/{EmailSettings-mxlKNcPl.js.map → EmailSettings-ulEHtH2y.js.map} +1 -1
- package/dist/{EmbeddedWalletSettings-BInZvFZf.js → EmbeddedWalletSettings-BTTV8Nqi.js} +46 -31
- package/dist/EmbeddedWalletSettings-BTTV8Nqi.js.map +1 -0
- package/dist/EmbeddedWalletSettings-C7H0E8Uz.cjs +1 -0
- package/dist/EmbeddedWalletSettings-C7H0E8Uz.cjs.map +1 -0
- package/dist/{EmbeddedWalletSettings-CXlZFFDw.js → EmbeddedWalletSettings-CLWh2TbV.js} +1 -1
- package/dist/{EmbeddedWalletSettings-CXlZFFDw.js.map → EmbeddedWalletSettings-CLWh2TbV.js.map} +1 -1
- package/dist/{EmbeddedWalletSettings-D5JXae1L.cjs → EmbeddedWalletSettings-DGmCVyex.cjs} +1 -1
- package/dist/{EmbeddedWalletSettings-D5JXae1L.cjs.map → EmbeddedWalletSettings-DGmCVyex.cjs.map} +1 -1
- package/dist/PermissionsSection-BPbE-hNx.cjs.map +1 -1
- package/dist/PermissionsSection-CighC1p6.js.map +1 -1
- package/dist/{ServerSettings-CYTlQ2xy.cjs → ServerSettings-CPAoiDtn.cjs} +1 -1
- package/dist/{ServerSettings-CYTlQ2xy.cjs.map → ServerSettings-CPAoiDtn.cjs.map} +1 -1
- package/dist/ServerSettings-Ch8MCmAY.js +91 -0
- package/dist/ServerSettings-Ch8MCmAY.js.map +1 -0
- package/dist/ServerSettings-CqDd59iM.cjs +1 -0
- package/dist/ServerSettings-CqDd59iM.cjs.map +1 -0
- package/dist/{ServerSettings-pSmWDC1d.js → ServerSettings-DooVeOet.js} +1 -1
- package/dist/{ServerSettings-pSmWDC1d.js.map → ServerSettings-DooVeOet.js.map} +1 -1
- package/dist/{WebhookSettings-Bb70MbFj.js → WebhookSettings-B6mjH90_.js} +1 -1
- package/dist/{WebhookSettings-Bb70MbFj.js.map → WebhookSettings-B6mjH90_.js.map} +1 -1
- package/dist/WebhookSettings-BG77iqJC.js +63 -0
- package/dist/WebhookSettings-BG77iqJC.js.map +1 -0
- package/dist/{WebhookSettings-CGyDKjrm.cjs → WebhookSettings-BeiUAcKs.cjs} +1 -1
- package/dist/{WebhookSettings-CGyDKjrm.cjs.map → WebhookSettings-BeiUAcKs.cjs.map} +1 -1
- package/dist/WebhookSettings-WMJ5zPjY.cjs +1 -0
- package/dist/WebhookSettings-WMJ5zPjY.cjs.map +1 -0
- package/dist/admin-only.cjs +1 -1
- package/dist/admin-only.d.ts +109 -14
- package/dist/admin-only.js +4 -3
- package/dist/email-only.cjs +1 -1
- package/dist/email-only.d.ts +56 -6
- package/dist/email-only.js +2 -2
- package/dist/google-only.cjs +1 -1
- package/dist/google-only.d.ts +56 -6
- package/dist/google-only.js +1 -1
- package/dist/index.cjs +13 -13
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +330 -34
- package/dist/index.js +2505 -3559
- package/dist/index.js.map +1 -1
- package/dist/login-react.css +1 -1
- package/dist/mobileWalletAdapter-Dp4yFxCm.cjs +1 -0
- package/dist/mobileWalletAdapter-Dp4yFxCm.cjs.map +1 -0
- package/dist/mobileWalletAdapter-coZRD4Yx.js +291 -0
- package/dist/mobileWalletAdapter-coZRD4Yx.js.map +1 -0
- package/dist/{plugin-8_dpq7tC.cjs → plugin-BgMAc6DA.cjs} +1 -1
- package/dist/{plugin-8_dpq7tC.cjs.map → plugin-BgMAc6DA.cjs.map} +1 -1
- package/dist/{plugin-D1NdppqC.js → plugin-Bhf9zaly.js} +82 -70
- package/dist/{plugin-D1NdppqC.js.map → plugin-Bhf9zaly.js.map} +1 -1
- package/dist/{shamir-L-s-Tp1Z.js → shamir-CDbZS8I1.js} +1 -1
- package/dist/{shamir-L-s-Tp1Z.js.map → shamir-CDbZS8I1.js.map} +1 -1
- package/dist/{shamir-4DyQMJCk.cjs → shamir-DAa54dMh.cjs} +1 -1
- package/dist/{shamir-4DyQMJCk.cjs.map → shamir-DAa54dMh.cjs.map} +1 -1
- package/dist/{silentWalletEnroll-DWt6Pr3B.js → silentWalletEnroll-CRHzr4Zy.js} +2 -2
- package/dist/{silentWalletEnroll-DWt6Pr3B.js.map → silentWalletEnroll-CRHzr4Zy.js.map} +1 -1
- package/dist/{silentWalletEnroll-BgTb4H5I.cjs → silentWalletEnroll-Dl_oFapH.cjs} +1 -1
- package/dist/{silentWalletEnroll-BgTb4H5I.cjs.map → silentWalletEnroll-Dl_oFapH.cjs.map} +1 -1
- package/dist/solana-only.cjs +1 -1
- package/dist/solana-only.d.ts +112 -6
- package/dist/solana-only.js +6 -5
- package/dist/{useAuth-C3dpk0po.js → useAuth-D1NSN6yY.js} +822 -777
- package/dist/useAuth-D1NSN6yY.js.map +1 -0
- package/dist/{useAuth-D3Pk_H3z.cjs → useAuth-dS_6wAMp.cjs} +1 -1
- package/dist/useAuth-dS_6wAMp.cjs.map +1 -0
- package/package.json +4 -1
- package/dist/AutosaveStatus-CCrZszKA.cjs +0 -1
- package/dist/AutosaveStatus-CCrZszKA.cjs.map +0 -1
- package/dist/AutosaveStatus-Ciyt350A.js.map +0 -1
- package/dist/EmailSettings-CCA8dNCi.js +0 -17
- package/dist/EmailSettings-CCA8dNCi.js.map +0 -1
- package/dist/EmailSettings-RbgAq9FB.cjs +0 -1
- package/dist/EmailSettings-RbgAq9FB.cjs.map +0 -1
- package/dist/EmbeddedWalletSettings-B4h-8rxB.cjs +0 -1
- package/dist/EmbeddedWalletSettings-B4h-8rxB.cjs.map +0 -1
- package/dist/EmbeddedWalletSettings-BInZvFZf.js.map +0 -1
- package/dist/ServerSettings-BE8fsE5k.js +0 -84
- package/dist/ServerSettings-BE8fsE5k.js.map +0 -1
- package/dist/ServerSettings-DFs9jQ3f.cjs +0 -1
- package/dist/ServerSettings-DFs9jQ3f.cjs.map +0 -1
- package/dist/SettingsPageLayout--GZ_iHLc.js +0 -50
- package/dist/SettingsPageLayout--GZ_iHLc.js.map +0 -1
- package/dist/SettingsPageLayout-j5lMjEID.cjs +0 -1
- package/dist/SettingsPageLayout-j5lMjEID.cjs.map +0 -1
- package/dist/SolanaLoginButton-BjOxpE1C.cjs +0 -1
- package/dist/SolanaLoginButton-BjOxpE1C.cjs.map +0 -1
- package/dist/SolanaLoginButton-P22QjBaO.js +0 -262
- package/dist/SolanaLoginButton-P22QjBaO.js.map +0 -1
- package/dist/WebhookSettings-C-gvNAW1.cjs +0 -1
- package/dist/WebhookSettings-C-gvNAW1.cjs.map +0 -1
- package/dist/WebhookSettings-kIstSjZi.js +0 -17
- package/dist/WebhookSettings-kIstSjZi.js.map +0 -1
- package/dist/useAuth-C3dpk0po.js.map +0 -1
- package/dist/useAuth-D3Pk_H3z.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServerSettings-Ch8MCmAY.js","sources":["../src/components/admin/settings/ServerSettings.tsx"],"sourcesContent":["/**\n * Server settings page - infrastructure configuration with tabs\n *\n * Tab visibility:\n * - Integrations: only shown when `feature_cedros_pay` is enabled.\n * This tab contains the Cedros Pay API Key, which is only needed when\n * cedros-pay runs as a separate microservice. In co-located deployments\n * (e.g., cedros-login and cedros-pay in the same Rust binary), inter-service\n * auth uses JWT/JWKS and no API key is needed.\n * - Logging, Metrics, Security: always visible.\n */\nimport { useState, useEffect, useMemo } from 'react';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport { useSettingsAutosave } from '../../../hooks/useSettingsAutosave';\nimport { SettingsSection } from './settingsInputs';\nimport { AutosaveStatus } from './AutosaveStatus';\n\ntype ServerTab = 'integrations' | 'logging' | 'metrics' | 'security';\n\ninterface TabConfig {\n id: ServerTab;\n label: string;\n /** Categories to pull settings from (defaults to ['server']) */\n categories?: string[];\n keys: string[];\n /** When set, tab is only visible if this setting is 'true' */\n requiredSetting?: string;\n}\n\nconst TABS: TabConfig[] = [\n {\n id: 'integrations',\n label: 'Integrations',\n keys: ['server_cedros_pay_api_key'],\n requiredSetting: 'feature_cedros_pay',\n },\n {\n id: 'logging',\n label: 'Logging',\n keys: ['server_log_level'],\n },\n {\n id: 'metrics',\n label: 'Metrics',\n keys: ['server_metrics_api_key'],\n },\n {\n id: 'security',\n label: 'Security',\n categories: ['security', 'features'],\n keys: ['feature_mfa', 'security_cors_origins', 'security_session_timeout'],\n },\n];\n\nexport interface ServerSettingsProps {\n className?: string;\n}\n\nexport function ServerSettings({ className }: ServerSettingsProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n getEffectiveValue,\n } = useSettingsAutosave();\n\n // Filter tabs based on feature flags\n const visibleTabs = useMemo(\n () =>\n TABS.filter((tab) => {\n if (!tab.requiredSetting) return true;\n return getEffectiveValue(tab.requiredSetting) === 'true';\n }),\n [getEffectiveValue]\n );\n\n // Default to first visible tab\n const [activeTab, setActiveTab] = useState<ServerTab | null>(null);\n\n // Set initial tab when tabs become available\n useEffect(() => {\n if (activeTab === null && visibleTabs.length > 0) {\n setActiveTab(visibleTabs[0].id);\n } else if (activeTab && !visibleTabs.some((t) => t.id === activeTab)) {\n // Active tab was hidden (feature toggled off) — fall back\n setActiveTab(visibleTabs[0]?.id ?? null);\n }\n }, [visibleTabs, activeTab]);\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n // Get current tab config\n const currentTab = visibleTabs.find((t) => t.id === activeTab);\n\n // Collect settings from all categories for the current tab\n const currentSettings = useMemo(() => {\n if (!currentTab) return [];\n const categories = currentTab.categories ?? ['server'];\n const allSettings: (typeof settings)[string] = [];\n for (const category of categories) {\n const categorySettings = settings[category] ?? [];\n allSettings.push(...categorySettings);\n }\n // Filter by keys and sort by keys order\n return allSettings\n .filter((s) => currentTab.keys.includes(s.key))\n .sort((a, b) => currentTab.keys.indexOf(a.key) - currentTab.keys.indexOf(b.key));\n }, [settings, currentTab]);\n\n if (isLoading && Object.keys(settings).length === 0) {\n return (\n <div className={`cedros-system-settings cedros-system-settings-loading ${className ?? ''}`}>\n <LoadingSpinner />\n <span>Loading settings...</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <ErrorMessage error={error.message} />\n </div>\n );\n }\n\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <div className=\"cedros-settings-page-header\">\n <div className=\"cedros-settings-page-header-content\">\n <h2 className=\"cedros-settings-page-title\">Auth Server</h2>\n <p className=\"cedros-settings-page-description\">\n Server infrastructure settings. Some may be overridden by environment variables.\n </p>\n </div>\n <AutosaveStatus status={autosaveStatus} error={autosaveError} />\n </div>\n\n {/* Tabs */}\n <div className=\"cedros-admin-tabs cedros-admin-tabs--line\">\n {visibleTabs.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n className={`cedros-admin-tab ${activeTab === tab.id ? 'cedros-admin-tab-active' : ''}`}\n onClick={() => setActiveTab(tab.id)}\n aria-selected={activeTab === tab.id}\n role=\"tab\"\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Tab content */}\n <div className=\"cedros-admin-tab-content\" role=\"tabpanel\">\n {currentSettings.length === 0 ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No settings found for {currentTab?.label ?? 'this section'}.</p>\n </div>\n ) : (\n <SettingsSection settings={currentSettings} edits={edits} onChange={handleChange} />\n )}\n </div>\n </div>\n );\n}\n"],"names":["TABS","ServerSettings","className","settings","edits","isLoading","autosaveStatus","autosaveError","error","fetchSettings","handleChange","getEffectiveValue","useSettingsAutosave","visibleTabs","useMemo","tab","activeTab","setActiveTab","useState","useEffect","t","currentTab","currentSettings","categories","allSettings","category","categorySettings","s","a","b","jsx","LoadingSpinner","ErrorMessage","jsxs","AutosaveStatus","SettingsSection"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const e=require("react/jsx-runtime"),a=require("react"),p=require("./LoadingSpinner-d6sSxgQN.cjs"),_=require("./ErrorMessage-CHbYbVi2.cjs"),g=require("./AutosaveStatus-BjLMt52a.cjs"),k=[{id:"integrations",label:"Integrations",keys:["server_cedros_pay_api_key"],requiredSetting:"feature_cedros_pay"},{id:"logging",label:"Logging",keys:["server_log_level"]},{id:"metrics",label:"Metrics",keys:["server_metrics_api_key"]},{id:"security",label:"Security",categories:["security","features"],keys:["feature_mfa","security_cors_origins","security_session_timeout"]}];function N({className:c}){const{settings:o,edits:h,isLoading:S,autosaveStatus:x,autosaveError:b,error:u,fetchSettings:m,handleChange:j,getEffectiveValue:y}=g.useSettingsAutosave(),t=a.useMemo(()=>k.filter(s=>s.requiredSetting?y(s.requiredSetting)==="true":!0),[y]),[r,d]=a.useState(null);a.useEffect(()=>{r===null&&t.length>0?d(t[0].id):r&&!t.some(s=>s.id===r)&&d(t[0]?.id??null)},[t,r]),a.useEffect(()=>{m()},[m]);const i=t.find(s=>s.id===r),v=a.useMemo(()=>{if(!i)return[];const s=i.categories??["server"],f=[];for(const n of s){const l=o[n]??[];f.push(...l)}return f.filter(n=>i.keys.includes(n.key)).sort((n,l)=>i.keys.indexOf(n.key)-i.keys.indexOf(l.key))},[o,i]);return S&&Object.keys(o).length===0?e.jsxs("div",{className:`cedros-system-settings cedros-system-settings-loading ${c??""}`,children:[e.jsx(p.LoadingSpinner,{}),e.jsx("span",{children:"Loading settings..."})]}):u?e.jsx("div",{className:`cedros-system-settings ${c??""}`,children:e.jsx(_.ErrorMessage,{error:u.message})}):e.jsxs("div",{className:`cedros-system-settings ${c??""}`,children:[e.jsxs("div",{className:"cedros-settings-page-header",children:[e.jsxs("div",{className:"cedros-settings-page-header-content",children:[e.jsx("h2",{className:"cedros-settings-page-title",children:"Auth Server"}),e.jsx("p",{className:"cedros-settings-page-description",children:"Server infrastructure settings. Some may be overridden by environment variables."})]}),e.jsx(g.AutosaveStatus,{status:x,error:b})]}),e.jsx("div",{className:"cedros-admin-tabs cedros-admin-tabs--line",children:t.map(s=>e.jsx("button",{type:"button",className:`cedros-admin-tab ${r===s.id?"cedros-admin-tab-active":""}`,onClick:()=>d(s.id),"aria-selected":r===s.id,role:"tab",children:s.label},s.id))}),e.jsx("div",{className:"cedros-admin-tab-content",role:"tabpanel",children:v.length===0?e.jsx("div",{className:"cedros-system-settings-empty",children:e.jsxs("p",{children:["No settings found for ",i?.label??"this section","."]})}):e.jsx(g.SettingsSection,{settings:v,edits:h,onChange:j})})]})}exports.ServerSettings=N;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ServerSettings-CqDd59iM.cjs","sources":["../src/components/admin/settings/ServerSettings.tsx"],"sourcesContent":["/**\n * Server settings page - infrastructure configuration with tabs\n *\n * Tab visibility:\n * - Integrations: only shown when `feature_cedros_pay` is enabled.\n * This tab contains the Cedros Pay API Key, which is only needed when\n * cedros-pay runs as a separate microservice. In co-located deployments\n * (e.g., cedros-login and cedros-pay in the same Rust binary), inter-service\n * auth uses JWT/JWKS and no API key is needed.\n * - Logging, Metrics, Security: always visible.\n */\nimport { useState, useEffect, useMemo } from 'react';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport { useSettingsAutosave } from '../../../hooks/useSettingsAutosave';\nimport { SettingsSection } from './settingsInputs';\nimport { AutosaveStatus } from './AutosaveStatus';\n\ntype ServerTab = 'integrations' | 'logging' | 'metrics' | 'security';\n\ninterface TabConfig {\n id: ServerTab;\n label: string;\n /** Categories to pull settings from (defaults to ['server']) */\n categories?: string[];\n keys: string[];\n /** When set, tab is only visible if this setting is 'true' */\n requiredSetting?: string;\n}\n\nconst TABS: TabConfig[] = [\n {\n id: 'integrations',\n label: 'Integrations',\n keys: ['server_cedros_pay_api_key'],\n requiredSetting: 'feature_cedros_pay',\n },\n {\n id: 'logging',\n label: 'Logging',\n keys: ['server_log_level'],\n },\n {\n id: 'metrics',\n label: 'Metrics',\n keys: ['server_metrics_api_key'],\n },\n {\n id: 'security',\n label: 'Security',\n categories: ['security', 'features'],\n keys: ['feature_mfa', 'security_cors_origins', 'security_session_timeout'],\n },\n];\n\nexport interface ServerSettingsProps {\n className?: string;\n}\n\nexport function ServerSettings({ className }: ServerSettingsProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n getEffectiveValue,\n } = useSettingsAutosave();\n\n // Filter tabs based on feature flags\n const visibleTabs = useMemo(\n () =>\n TABS.filter((tab) => {\n if (!tab.requiredSetting) return true;\n return getEffectiveValue(tab.requiredSetting) === 'true';\n }),\n [getEffectiveValue]\n );\n\n // Default to first visible tab\n const [activeTab, setActiveTab] = useState<ServerTab | null>(null);\n\n // Set initial tab when tabs become available\n useEffect(() => {\n if (activeTab === null && visibleTabs.length > 0) {\n setActiveTab(visibleTabs[0].id);\n } else if (activeTab && !visibleTabs.some((t) => t.id === activeTab)) {\n // Active tab was hidden (feature toggled off) — fall back\n setActiveTab(visibleTabs[0]?.id ?? null);\n }\n }, [visibleTabs, activeTab]);\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n // Get current tab config\n const currentTab = visibleTabs.find((t) => t.id === activeTab);\n\n // Collect settings from all categories for the current tab\n const currentSettings = useMemo(() => {\n if (!currentTab) return [];\n const categories = currentTab.categories ?? ['server'];\n const allSettings: (typeof settings)[string] = [];\n for (const category of categories) {\n const categorySettings = settings[category] ?? [];\n allSettings.push(...categorySettings);\n }\n // Filter by keys and sort by keys order\n return allSettings\n .filter((s) => currentTab.keys.includes(s.key))\n .sort((a, b) => currentTab.keys.indexOf(a.key) - currentTab.keys.indexOf(b.key));\n }, [settings, currentTab]);\n\n if (isLoading && Object.keys(settings).length === 0) {\n return (\n <div className={`cedros-system-settings cedros-system-settings-loading ${className ?? ''}`}>\n <LoadingSpinner />\n <span>Loading settings...</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <ErrorMessage error={error.message} />\n </div>\n );\n }\n\n return (\n <div className={`cedros-system-settings ${className ?? ''}`}>\n <div className=\"cedros-settings-page-header\">\n <div className=\"cedros-settings-page-header-content\">\n <h2 className=\"cedros-settings-page-title\">Auth Server</h2>\n <p className=\"cedros-settings-page-description\">\n Server infrastructure settings. Some may be overridden by environment variables.\n </p>\n </div>\n <AutosaveStatus status={autosaveStatus} error={autosaveError} />\n </div>\n\n {/* Tabs */}\n <div className=\"cedros-admin-tabs cedros-admin-tabs--line\">\n {visibleTabs.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n className={`cedros-admin-tab ${activeTab === tab.id ? 'cedros-admin-tab-active' : ''}`}\n onClick={() => setActiveTab(tab.id)}\n aria-selected={activeTab === tab.id}\n role=\"tab\"\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Tab content */}\n <div className=\"cedros-admin-tab-content\" role=\"tabpanel\">\n {currentSettings.length === 0 ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No settings found for {currentTab?.label ?? 'this section'}.</p>\n </div>\n ) : (\n <SettingsSection settings={currentSettings} edits={edits} onChange={handleChange} />\n )}\n </div>\n </div>\n );\n}\n"],"names":["TABS","ServerSettings","className","settings","edits","isLoading","autosaveStatus","autosaveError","error","fetchSettings","handleChange","getEffectiveValue","useSettingsAutosave","visibleTabs","useMemo","tab","activeTab","setActiveTab","useState","useEffect","t","currentTab","currentSettings","categories","allSettings","category","categorySettings","s","a","b","jsx","LoadingSpinner","ErrorMessage","jsxs","AutosaveStatus","SettingsSection"],"mappings":"oMA8BMA,EAAoB,CACxB,CACE,GAAI,eACJ,MAAO,eACP,KAAM,CAAC,2BAA2B,EAClC,gBAAiB,oBAAA,EAEnB,CACE,GAAI,UACJ,MAAO,UACP,KAAM,CAAC,kBAAkB,CAAA,EAE3B,CACE,GAAI,UACJ,MAAO,UACP,KAAM,CAAC,wBAAwB,CAAA,EAEjC,CACE,GAAI,WACJ,MAAO,WACP,WAAY,CAAC,WAAY,UAAU,EACnC,KAAM,CAAC,cAAe,wBAAyB,0BAA0B,CAAA,CAE7E,EAMO,SAASC,EAAe,CAAE,UAAAC,GAAkC,CACjE,KAAM,CACJ,SAAAC,EACA,MAAAC,EACA,UAAAC,EACA,eAAAC,EACA,cAAAC,EACA,MAAAC,EACA,cAAAC,EACA,aAAAC,EACA,kBAAAC,CAAA,EACEC,sBAAA,EAGEC,EAAcC,EAAAA,QAClB,IACEd,EAAK,OAAQe,GACNA,EAAI,gBACFJ,EAAkBI,EAAI,eAAe,IAAM,OADjB,EAElC,EACH,CAACJ,CAAiB,CAAA,EAId,CAACK,EAAWC,CAAY,EAAIC,EAAAA,SAA2B,IAAI,EAGjEC,EAAAA,UAAU,IAAM,CACVH,IAAc,MAAQH,EAAY,OAAS,EAC7CI,EAAaJ,EAAY,CAAC,EAAE,EAAE,EACrBG,GAAa,CAACH,EAAY,KAAMO,GAAMA,EAAE,KAAOJ,CAAS,GAEjEC,EAAaJ,EAAY,CAAC,GAAG,IAAM,IAAI,CAE3C,EAAG,CAACA,EAAaG,CAAS,CAAC,EAE3BG,EAAAA,UAAU,IAAM,CACdV,EAAA,CACF,EAAG,CAACA,CAAa,CAAC,EAGlB,MAAMY,EAAaR,EAAY,KAAMO,GAAMA,EAAE,KAAOJ,CAAS,EAGvDM,EAAkBR,EAAAA,QAAQ,IAAM,CACpC,GAAI,CAACO,EAAY,MAAO,CAAA,EACxB,MAAME,EAAaF,EAAW,YAAc,CAAC,QAAQ,EAC/CG,EAAyC,CAAA,EAC/C,UAAWC,KAAYF,EAAY,CACjC,MAAMG,EAAmBvB,EAASsB,CAAQ,GAAK,CAAA,EAC/CD,EAAY,KAAK,GAAGE,CAAgB,CACtC,CAEA,OAAOF,EACJ,OAAQG,GAAMN,EAAW,KAAK,SAASM,EAAE,GAAG,CAAC,EAC7C,KAAK,CAACC,EAAGC,IAAMR,EAAW,KAAK,QAAQO,EAAE,GAAG,EAAIP,EAAW,KAAK,QAAQQ,EAAE,GAAG,CAAC,CACnF,EAAG,CAAC1B,EAAUkB,CAAU,CAAC,EAEzB,OAAIhB,GAAa,OAAO,KAAKF,CAAQ,EAAE,SAAW,SAE7C,MAAA,CAAI,UAAW,yDAAyDD,GAAa,EAAE,GACtF,SAAA,CAAA4B,EAAAA,IAACC,EAAAA,eAAA,EAAe,EAChBD,EAAAA,IAAC,QAAK,SAAA,qBAAA,CAAmB,CAAA,EAC3B,EAIAtB,EAEAsB,EAAAA,IAAC,MAAA,CAAI,UAAW,0BAA0B5B,GAAa,EAAE,GACvD,SAAA4B,EAAAA,IAACE,EAAAA,aAAA,CAAa,MAAOxB,EAAM,OAAA,CAAS,EACtC,SAKD,MAAA,CAAI,UAAW,0BAA0BN,GAAa,EAAE,GACvD,SAAA,CAAA+B,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,sCACb,SAAA,CAAAH,EAAAA,IAAC,KAAA,CAAG,UAAU,6BAA6B,SAAA,cAAW,EACtDA,EAAAA,IAAC,IAAA,CAAE,UAAU,mCAAmC,SAAA,kFAAA,CAEhD,CAAA,EACF,EACAA,EAAAA,IAACI,EAAAA,eAAA,CAAe,OAAQ5B,EAAgB,MAAOC,CAAA,CAAe,CAAA,EAChE,QAGC,MAAA,CAAI,UAAU,4CACZ,SAAAM,EAAY,IAAKE,GAChBe,EAAAA,IAAC,SAAA,CAEC,KAAK,SACL,UAAW,oBAAoBd,IAAcD,EAAI,GAAK,0BAA4B,EAAE,GACpF,QAAS,IAAME,EAAaF,EAAI,EAAE,EAClC,gBAAeC,IAAcD,EAAI,GACjC,KAAK,MAEJ,SAAAA,EAAI,KAAA,EAPAA,EAAI,EAAA,CASZ,EACH,EAGAe,MAAC,MAAA,CAAI,UAAU,2BAA2B,KAAK,WAC5C,SAAAR,EAAgB,SAAW,EAC1BQ,MAAC,MAAA,CAAI,UAAU,+BACb,gBAAC,IAAA,CAAE,SAAA,CAAA,yBAAuBT,GAAY,OAAS,eAAe,GAAA,CAAA,CAAC,CAAA,CACjE,EAEAS,EAAAA,IAACK,kBAAA,CAAgB,SAAUb,EAAiB,MAAAlB,EAAc,SAAUM,CAAA,CAAc,CAAA,CAEtF,CAAA,EACF,CAEJ"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as r } from "react/jsx-runtime";
|
|
2
2
|
import "react";
|
|
3
|
-
import { S as e } from "./ServerSettings-
|
|
3
|
+
import { S as e } from "./ServerSettings-Ch8MCmAY.js";
|
|
4
4
|
function i() {
|
|
5
5
|
return /* @__PURE__ */ r("div", { className: "cedros-dashboard__section", children: /* @__PURE__ */ r(e, {}) });
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ServerSettings-
|
|
1
|
+
{"version":3,"file":"ServerSettings-DooVeOet.js","sources":["../src/admin/sections/ServerSettings.tsx"],"sourcesContent":["/**\n * Server Settings Section - Plugin wrapper\n */\n\nimport React from 'react';\nimport { ServerSettings as Settings } from '../../components/admin/settings';\n\nexport default function ServerSettings(): React.JSX.Element {\n return (\n <div className=\"cedros-dashboard__section\">\n <Settings />\n </div>\n );\n}\n"],"names":["ServerSettings","jsx","Settings"],"mappings":";;;AAOA,SAAwBA,IAAoC;AAC1D,2BACG,OAAA,EAAI,WAAU,6BACb,UAAA,gBAAAC,EAACC,KAAS,GACZ;AAEJ;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as o } from "react/jsx-runtime";
|
|
2
2
|
import "react";
|
|
3
|
-
import { W as t } from "./WebhookSettings-
|
|
3
|
+
import { W as t } from "./WebhookSettings-BG77iqJC.js";
|
|
4
4
|
function i() {
|
|
5
5
|
return /* @__PURE__ */ o("div", { className: "cedros-dashboard__section", children: /* @__PURE__ */ o(t, {}) });
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebhookSettings-
|
|
1
|
+
{"version":3,"file":"WebhookSettings-B6mjH90_.js","sources":["../src/admin/sections/WebhookSettings.tsx"],"sourcesContent":["/**\n * Webhook Settings Section - Plugin wrapper\n */\n\nimport React from 'react';\nimport { WebhookSettings as Settings } from '../../components/admin/settings';\n\nexport default function WebhookSettings(): React.JSX.Element {\n return (\n <div className=\"cedros-dashboard__section\">\n <Settings />\n </div>\n );\n}\n"],"names":["WebhookSettings","jsx","Settings"],"mappings":";;;AAOA,SAAwBA,IAAqC;AAC3D,2BACG,OAAA,EAAI,WAAU,6BACb,UAAA,gBAAAC,EAACC,KAAS,GACZ;AAEJ;"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { jsxs as t, jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import { useEffect as p } from "react";
|
|
3
|
+
import { L as v } from "./LoadingSpinner-6vml-zwr.js";
|
|
4
|
+
import { E as S } from "./ErrorMessage-CcEK0pYO.js";
|
|
5
|
+
import { u as y, A as N, S as E } from "./AutosaveStatus-BKc7T2Tw.js";
|
|
6
|
+
function b({
|
|
7
|
+
title: i,
|
|
8
|
+
description: d,
|
|
9
|
+
categories: g,
|
|
10
|
+
className: n = ""
|
|
11
|
+
}) {
|
|
12
|
+
const {
|
|
13
|
+
settings: r,
|
|
14
|
+
edits: h,
|
|
15
|
+
isLoading: l,
|
|
16
|
+
autosaveStatus: m,
|
|
17
|
+
autosaveError: u,
|
|
18
|
+
error: o,
|
|
19
|
+
fetchSettings: a,
|
|
20
|
+
handleChange: f
|
|
21
|
+
} = y();
|
|
22
|
+
p(() => {
|
|
23
|
+
a();
|
|
24
|
+
}, [a]);
|
|
25
|
+
const c = g.filter((s) => r[s]?.length > 0);
|
|
26
|
+
return l && Object.keys(r).length === 0 ? /* @__PURE__ */ t("div", { className: `cedros-system-settings cedros-system-settings-loading ${n}`, children: [
|
|
27
|
+
/* @__PURE__ */ e(v, {}),
|
|
28
|
+
/* @__PURE__ */ e("span", { children: "Loading settings..." })
|
|
29
|
+
] }) : o ? /* @__PURE__ */ e("div", { className: `cedros-system-settings ${n}`, children: /* @__PURE__ */ e(S, { error: o.message }) }) : /* @__PURE__ */ t("div", { className: `cedros-system-settings ${n}`, children: [
|
|
30
|
+
/* @__PURE__ */ t("div", { className: "cedros-settings-page-header", children: [
|
|
31
|
+
/* @__PURE__ */ t("div", { className: "cedros-settings-page-header-content", children: [
|
|
32
|
+
/* @__PURE__ */ e("h2", { className: "cedros-settings-page-title", children: i }),
|
|
33
|
+
/* @__PURE__ */ e("p", { className: "cedros-settings-page-description", children: d })
|
|
34
|
+
] }),
|
|
35
|
+
/* @__PURE__ */ e(N, { status: m, error: u })
|
|
36
|
+
] }),
|
|
37
|
+
c.length === 0 ? /* @__PURE__ */ e("div", { className: "cedros-system-settings-empty", children: /* @__PURE__ */ e("p", { children: "No settings found for this section." }) }) : c.map((s) => /* @__PURE__ */ e(
|
|
38
|
+
E,
|
|
39
|
+
{
|
|
40
|
+
settings: r[s],
|
|
41
|
+
edits: h,
|
|
42
|
+
onChange: f
|
|
43
|
+
},
|
|
44
|
+
s
|
|
45
|
+
))
|
|
46
|
+
] });
|
|
47
|
+
}
|
|
48
|
+
const k = ["webhook"];
|
|
49
|
+
function T({ className: i }) {
|
|
50
|
+
return /* @__PURE__ */ e(
|
|
51
|
+
b,
|
|
52
|
+
{
|
|
53
|
+
title: "Webhooks",
|
|
54
|
+
description: "Configure HTTP webhook notifications for authentication events.",
|
|
55
|
+
categories: k,
|
|
56
|
+
className: i
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
export {
|
|
61
|
+
b as S,
|
|
62
|
+
T as W
|
|
63
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebhookSettings-BG77iqJC.js","sources":["../src/components/admin/settings/SettingsPageLayout.tsx","../src/components/admin/settings/WebhookSettings.tsx"],"sourcesContent":["/**\n * Shared layout for settings pages with autosave\n */\nimport { useEffect } from 'react';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport { useSettingsAutosave } from '../../../hooks/useSettingsAutosave';\nimport { SettingsSection } from './settingsInputs';\nimport { AutosaveStatus } from './AutosaveStatus';\n\nexport interface SettingsPageLayoutProps {\n /** Page title */\n title: string;\n /** Page description */\n description: string;\n /** Categories to display on this page */\n categories: string[];\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * Shared layout component for settings pages.\n * Handles loading and displaying settings for specified categories.\n * Changes are automatically saved after a brief debounce.\n */\nexport function SettingsPageLayout({\n title,\n description,\n categories,\n className = '',\n}: SettingsPageLayoutProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n } = useSettingsAutosave();\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n // Filter settings to only show relevant categories\n const relevantCategories = categories.filter((cat) => settings[cat]?.length > 0);\n\n if (isLoading && Object.keys(settings).length === 0) {\n return (\n <div className={`cedros-system-settings cedros-system-settings-loading ${className}`}>\n <LoadingSpinner />\n <span>Loading settings...</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`cedros-system-settings ${className}`}>\n <ErrorMessage error={error.message} />\n </div>\n );\n }\n\n return (\n <div className={`cedros-system-settings ${className}`}>\n <div className=\"cedros-settings-page-header\">\n <div className=\"cedros-settings-page-header-content\">\n <h2 className=\"cedros-settings-page-title\">{title}</h2>\n <p className=\"cedros-settings-page-description\">{description}</p>\n </div>\n <AutosaveStatus status={autosaveStatus} error={autosaveError} />\n </div>\n\n {relevantCategories.length === 0 ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No settings found for this section.</p>\n </div>\n ) : (\n relevantCategories.map((category) => (\n <SettingsSection\n key={category}\n settings={settings[category]}\n edits={edits}\n onChange={handleChange}\n />\n ))\n )}\n </div>\n );\n}\n","/**\n * Webhook settings page - HTTP webhook configuration\n */\nimport { SettingsPageLayout } from './SettingsPageLayout';\n\nconst CATEGORIES = ['webhook'];\n\nexport interface WebhookSettingsProps {\n className?: string;\n}\n\nexport function WebhookSettings({ className }: WebhookSettingsProps) {\n return (\n <SettingsPageLayout\n title=\"Webhooks\"\n description=\"Configure HTTP webhook notifications for authentication events.\"\n categories={CATEGORIES}\n className={className}\n />\n );\n}\n"],"names":["SettingsPageLayout","title","description","categories","className","settings","edits","isLoading","autosaveStatus","autosaveError","error","fetchSettings","handleChange","useSettingsAutosave","useEffect","relevantCategories","cat","jsxs","jsx","LoadingSpinner","ErrorMessage","AutosaveStatus","category","SettingsSection","CATEGORIES","WebhookSettings"],"mappings":";;;;;AA0BO,SAASA,EAAmB;AAAA,EACjC,OAAAC;AAAA,EACA,aAAAC;AAAA,EACA,YAAAC;AAAA,EACA,WAAAC,IAAY;AACd,GAA4B;AAC1B,QAAM;AAAA,IACJ,UAAAC;AAAA,IACA,OAAAC;AAAA,IACA,WAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,eAAAC;AAAA,IACA,OAAAC;AAAA,IACA,eAAAC;AAAA,IACA,cAAAC;AAAA,EAAA,IACEC,EAAA;AAEJ,EAAAC,EAAU,MAAM;AACd,IAAAH,EAAA;AAAA,EACF,GAAG,CAACA,CAAa,CAAC;AAGlB,QAAMI,IAAqBZ,EAAW,OAAO,CAACa,MAAQX,EAASW,CAAG,GAAG,SAAS,CAAC;AAE/E,SAAIT,KAAa,OAAO,KAAKF,CAAQ,EAAE,WAAW,IAE9C,gBAAAY,EAAC,OAAA,EAAI,WAAW,yDAAyDb,CAAS,IAChF,UAAA;AAAA,IAAA,gBAAAc,EAACC,GAAA,EAAe;AAAA,IAChB,gBAAAD,EAAC,UAAK,UAAA,sBAAA,CAAmB;AAAA,EAAA,GAC3B,IAIAR,IAEA,gBAAAQ,EAAC,OAAA,EAAI,WAAW,0BAA0Bd,CAAS,IACjD,UAAA,gBAAAc,EAACE,GAAA,EAAa,OAAOV,EAAM,QAAA,CAAS,GACtC,IAKF,gBAAAO,EAAC,OAAA,EAAI,WAAW,0BAA0Bb,CAAS,IACjD,UAAA;AAAA,IAAA,gBAAAa,EAAC,OAAA,EAAI,WAAU,+BACb,UAAA;AAAA,MAAA,gBAAAA,EAAC,OAAA,EAAI,WAAU,uCACb,UAAA;AAAA,QAAA,gBAAAC,EAAC,MAAA,EAAG,WAAU,8BAA8B,UAAAjB,GAAM;AAAA,QAClD,gBAAAiB,EAAC,KAAA,EAAE,WAAU,oCAAoC,UAAAhB,EAAA,CAAY;AAAA,MAAA,GAC/D;AAAA,MACA,gBAAAgB,EAACG,GAAA,EAAe,QAAQb,GAAgB,OAAOC,EAAA,CAAe;AAAA,IAAA,GAChE;AAAA,IAECM,EAAmB,WAAW,IAC7B,gBAAAG,EAAC,SAAI,WAAU,gCACb,UAAA,gBAAAA,EAAC,KAAA,EAAE,iDAAmC,EAAA,CACxC,IAEAH,EAAmB,IAAI,CAACO,MACtB,gBAAAJ;AAAA,MAACK;AAAA,MAAA;AAAA,QAEC,UAAUlB,EAASiB,CAAQ;AAAA,QAC3B,OAAAhB;AAAA,QACA,UAAUM;AAAA,MAAA;AAAA,MAHLU;AAAA,IAAA,CAKR;AAAA,EAAA,GAEL;AAEJ;ACxFA,MAAME,IAAa,CAAC,SAAS;AAMtB,SAASC,EAAgB,EAAE,WAAArB,KAAmC;AACnE,SACE,gBAAAc;AAAA,IAAClB;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,aAAY;AAAA,MACZ,YAAYwB;AAAA,MACZ,WAAApB;AAAA,IAAA;AAAA,EAAA;AAGN;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime");require("react");const t=require("./WebhookSettings-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime");require("react");const t=require("./WebhookSettings-WMJ5zPjY.cjs");function o(){return e.jsx("div",{className:"cedros-dashboard__section",children:e.jsx(t.WebhookSettings,{})})}exports.default=o;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"WebhookSettings-
|
|
1
|
+
{"version":3,"file":"WebhookSettings-BeiUAcKs.cjs","sources":["../src/admin/sections/WebhookSettings.tsx"],"sourcesContent":["/**\n * Webhook Settings Section - Plugin wrapper\n */\n\nimport React from 'react';\nimport { WebhookSettings as Settings } from '../../components/admin/settings';\n\nexport default function WebhookSettings(): React.JSX.Element {\n return (\n <div className=\"cedros-dashboard__section\">\n <Settings />\n </div>\n );\n}\n"],"names":["WebhookSettings","jsx","Settings"],"mappings":"wLAOA,SAAwBA,GAAqC,CAC3D,aACG,MAAA,CAAI,UAAU,4BACb,SAAAC,MAACC,EAAAA,kBAAS,EACZ,CAEJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const e=require("react/jsx-runtime"),S=require("react"),f=require("./LoadingSpinner-d6sSxgQN.cjs"),p=require("./ErrorMessage-CHbYbVi2.cjs"),r=require("./AutosaveStatus-BjLMt52a.cjs");function g({title:t,description:d,categories:u,className:n=""}){const{settings:i,edits:h,isLoading:l,autosaveStatus:j,autosaveError:x,error:o,fetchSettings:a,handleChange:m}=r.useSettingsAutosave();S.useEffect(()=>{a()},[a]);const c=u.filter(s=>i[s]?.length>0);return l&&Object.keys(i).length===0?e.jsxs("div",{className:`cedros-system-settings cedros-system-settings-loading ${n}`,children:[e.jsx(f.LoadingSpinner,{}),e.jsx("span",{children:"Loading settings..."})]}):o?e.jsx("div",{className:`cedros-system-settings ${n}`,children:e.jsx(p.ErrorMessage,{error:o.message})}):e.jsxs("div",{className:`cedros-system-settings ${n}`,children:[e.jsxs("div",{className:"cedros-settings-page-header",children:[e.jsxs("div",{className:"cedros-settings-page-header-content",children:[e.jsx("h2",{className:"cedros-settings-page-title",children:t}),e.jsx("p",{className:"cedros-settings-page-description",children:d})]}),e.jsx(r.AutosaveStatus,{status:j,error:x})]}),c.length===0?e.jsx("div",{className:"cedros-system-settings-empty",children:e.jsx("p",{children:"No settings found for this section."})}):c.map(s=>e.jsx(r.SettingsSection,{settings:i[s],edits:h,onChange:m},s))]})}const v=["webhook"];function y({className:t}){return e.jsx(g,{title:"Webhooks",description:"Configure HTTP webhook notifications for authentication events.",categories:v,className:t})}exports.SettingsPageLayout=g;exports.WebhookSettings=y;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WebhookSettings-WMJ5zPjY.cjs","sources":["../src/components/admin/settings/SettingsPageLayout.tsx","../src/components/admin/settings/WebhookSettings.tsx"],"sourcesContent":["/**\n * Shared layout for settings pages with autosave\n */\nimport { useEffect } from 'react';\nimport { LoadingSpinner } from '../../shared/LoadingSpinner';\nimport { ErrorMessage } from '../../shared/ErrorMessage';\nimport { useSettingsAutosave } from '../../../hooks/useSettingsAutosave';\nimport { SettingsSection } from './settingsInputs';\nimport { AutosaveStatus } from './AutosaveStatus';\n\nexport interface SettingsPageLayoutProps {\n /** Page title */\n title: string;\n /** Page description */\n description: string;\n /** Categories to display on this page */\n categories: string[];\n /** Additional CSS class */\n className?: string;\n}\n\n/**\n * Shared layout component for settings pages.\n * Handles loading and displaying settings for specified categories.\n * Changes are automatically saved after a brief debounce.\n */\nexport function SettingsPageLayout({\n title,\n description,\n categories,\n className = '',\n}: SettingsPageLayoutProps) {\n const {\n settings,\n edits,\n isLoading,\n autosaveStatus,\n autosaveError,\n error,\n fetchSettings,\n handleChange,\n } = useSettingsAutosave();\n\n useEffect(() => {\n fetchSettings();\n }, [fetchSettings]);\n\n // Filter settings to only show relevant categories\n const relevantCategories = categories.filter((cat) => settings[cat]?.length > 0);\n\n if (isLoading && Object.keys(settings).length === 0) {\n return (\n <div className={`cedros-system-settings cedros-system-settings-loading ${className}`}>\n <LoadingSpinner />\n <span>Loading settings...</span>\n </div>\n );\n }\n\n if (error) {\n return (\n <div className={`cedros-system-settings ${className}`}>\n <ErrorMessage error={error.message} />\n </div>\n );\n }\n\n return (\n <div className={`cedros-system-settings ${className}`}>\n <div className=\"cedros-settings-page-header\">\n <div className=\"cedros-settings-page-header-content\">\n <h2 className=\"cedros-settings-page-title\">{title}</h2>\n <p className=\"cedros-settings-page-description\">{description}</p>\n </div>\n <AutosaveStatus status={autosaveStatus} error={autosaveError} />\n </div>\n\n {relevantCategories.length === 0 ? (\n <div className=\"cedros-system-settings-empty\">\n <p>No settings found for this section.</p>\n </div>\n ) : (\n relevantCategories.map((category) => (\n <SettingsSection\n key={category}\n settings={settings[category]}\n edits={edits}\n onChange={handleChange}\n />\n ))\n )}\n </div>\n );\n}\n","/**\n * Webhook settings page - HTTP webhook configuration\n */\nimport { SettingsPageLayout } from './SettingsPageLayout';\n\nconst CATEGORIES = ['webhook'];\n\nexport interface WebhookSettingsProps {\n className?: string;\n}\n\nexport function WebhookSettings({ className }: WebhookSettingsProps) {\n return (\n <SettingsPageLayout\n title=\"Webhooks\"\n description=\"Configure HTTP webhook notifications for authentication events.\"\n categories={CATEGORIES}\n className={className}\n />\n );\n}\n"],"names":["SettingsPageLayout","title","description","categories","className","settings","edits","isLoading","autosaveStatus","autosaveError","error","fetchSettings","handleChange","useSettingsAutosave","useEffect","relevantCategories","cat","jsxs","jsx","LoadingSpinner","ErrorMessage","AutosaveStatus","category","SettingsSection","CATEGORIES","WebhookSettings"],"mappings":"oMA0BO,SAASA,EAAmB,CACjC,MAAAC,EACA,YAAAC,EACA,WAAAC,EACA,UAAAC,EAAY,EACd,EAA4B,CAC1B,KAAM,CACJ,SAAAC,EACA,MAAAC,EACA,UAAAC,EACA,eAAAC,EACA,cAAAC,EACA,MAAAC,EACA,cAAAC,EACA,aAAAC,CAAA,EACEC,sBAAA,EAEJC,EAAAA,UAAU,IAAM,CACdH,EAAA,CACF,EAAG,CAACA,CAAa,CAAC,EAGlB,MAAMI,EAAqBZ,EAAW,OAAQa,GAAQX,EAASW,CAAG,GAAG,OAAS,CAAC,EAE/E,OAAIT,GAAa,OAAO,KAAKF,CAAQ,EAAE,SAAW,EAE9CY,EAAAA,KAAC,MAAA,CAAI,UAAW,yDAAyDb,CAAS,GAChF,SAAA,CAAAc,EAAAA,IAACC,EAAAA,eAAA,EAAe,EAChBD,EAAAA,IAAC,QAAK,SAAA,qBAAA,CAAmB,CAAA,EAC3B,EAIAR,EAEAQ,EAAAA,IAAC,MAAA,CAAI,UAAW,0BAA0Bd,CAAS,GACjD,SAAAc,EAAAA,IAACE,EAAAA,aAAA,CAAa,MAAOV,EAAM,OAAA,CAAS,EACtC,EAKFO,EAAAA,KAAC,MAAA,CAAI,UAAW,0BAA0Bb,CAAS,GACjD,SAAA,CAAAa,EAAAA,KAAC,MAAA,CAAI,UAAU,8BACb,SAAA,CAAAA,EAAAA,KAAC,MAAA,CAAI,UAAU,sCACb,SAAA,CAAAC,EAAAA,IAAC,KAAA,CAAG,UAAU,6BAA8B,SAAAjB,EAAM,EAClDiB,EAAAA,IAAC,IAAA,CAAE,UAAU,mCAAoC,SAAAhB,CAAA,CAAY,CAAA,EAC/D,EACAgB,EAAAA,IAACG,EAAAA,eAAA,CAAe,OAAQb,EAAgB,MAAOC,CAAA,CAAe,CAAA,EAChE,EAECM,EAAmB,SAAW,EAC7BG,EAAAA,IAAC,OAAI,UAAU,+BACb,SAAAA,EAAAA,IAAC,IAAA,CAAE,+CAAmC,CAAA,CACxC,EAEAH,EAAmB,IAAKO,GACtBJ,EAAAA,IAACK,EAAAA,gBAAA,CAEC,SAAUlB,EAASiB,CAAQ,EAC3B,MAAAhB,EACA,SAAUM,CAAA,EAHLU,CAAA,CAKR,CAAA,EAEL,CAEJ,CCxFA,MAAME,EAAa,CAAC,SAAS,EAMtB,SAASC,EAAgB,CAAE,UAAArB,GAAmC,CACnE,OACEc,EAAAA,IAAClB,EAAA,CACC,MAAM,WACN,YAAY,kEACZ,WAAYwB,EACZ,UAAApB,CAAA,CAAA,CAGN"}
|
package/dist/admin-only.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./plugin-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./plugin-BgMAc6DA.cjs");exports.AdminShell=e.AdminShell;exports.CEDROS_LOGIN_SECTION_IDS=e.CEDROS_LOGIN_SECTION_IDS;exports.Icons=e.Icons;exports.cedrosLoginPlugin=e.cedrosLoginPlugin;exports.loginPlugin=e.cedrosLoginPlugin;exports.useAdminShell=e.useAdminShell;
|
package/dist/admin-only.d.ts
CHANGED
|
@@ -4,13 +4,22 @@ import { ReactNode } from 'react';
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* Group configuration for sidebar organization.
|
|
7
|
+
*
|
|
8
|
+
* **Ordering rules:**
|
|
9
|
+
* - Groups are keyed by `label` (not `id`) when merging across plugins.
|
|
10
|
+
* - The first plugin to declare a given label wins the `order` number.
|
|
11
|
+
* - Later plugins adding sections with `group: 'Same Label'` merge into
|
|
12
|
+
* the existing group without overriding the order.
|
|
13
|
+
* - Groups without an explicit config default to `order: 99` (sink to bottom).
|
|
14
|
+
* - cedros-login declares `Users` at order 0 and `Configuration` at order 2,
|
|
15
|
+
* leaving order 1 available for other plugins to insert between them.
|
|
7
16
|
*/
|
|
8
17
|
export declare interface AdminGroupConfig {
|
|
9
18
|
/** Group identifier */
|
|
10
19
|
id: string;
|
|
11
|
-
/** Display label */
|
|
20
|
+
/** Display label — used as the merge key across plugins */
|
|
12
21
|
label: string;
|
|
13
|
-
/** Sort order (lower = higher in sidebar) */
|
|
22
|
+
/** Sort order (lower = higher in sidebar). First plugin to declare a label wins. */
|
|
14
23
|
order: number;
|
|
15
24
|
/** Icon for the group header */
|
|
16
25
|
icon?: ReactNode;
|
|
@@ -19,7 +28,23 @@ export declare interface AdminGroupConfig {
|
|
|
19
28
|
}
|
|
20
29
|
|
|
21
30
|
/**
|
|
22
|
-
* Plugin definition
|
|
31
|
+
* Plugin definition — the main export from each admin module.
|
|
32
|
+
*
|
|
33
|
+
* **Plugin merge order:** Plugins are iterated in registration order (insertion
|
|
34
|
+
* order of the registry `Map`). Sections from later plugins are appended after
|
|
35
|
+
* sections from earlier plugins. There is no cross-plugin section dedup — each
|
|
36
|
+
* plugin's section IDs are namespaced via `qualifiedId` (`pluginId:sectionId`).
|
|
37
|
+
*
|
|
38
|
+
* **Section visibility:** Each section passes two filters:
|
|
39
|
+
* 1. `checkPermission(section.requiredPermission, hostContext)` — role-based.
|
|
40
|
+
* 2. `hostContext.dashboardPermissions?.canAccess(section.id)` — owner RBAC.
|
|
41
|
+
*
|
|
42
|
+
* Register at the composition root:
|
|
43
|
+
* ```tsx
|
|
44
|
+
* <AdminShell plugins={[cedrosLoginPlugin, cedrosPayPlugin]} hostContext={ctx}>
|
|
45
|
+
* {children}
|
|
46
|
+
* </AdminShell>
|
|
47
|
+
* ```
|
|
23
48
|
*/
|
|
24
49
|
export declare interface AdminPlugin {
|
|
25
50
|
/** Unique plugin identifier */
|
|
@@ -52,6 +77,10 @@ export declare interface AdminPlugin {
|
|
|
52
77
|
|
|
53
78
|
/**
|
|
54
79
|
* Section configuration for sidebar navigation.
|
|
80
|
+
*
|
|
81
|
+
* **Ordering:** Sections within a group are sorted by `order` (ascending).
|
|
82
|
+
* Sections with the same order are shown in plugin registration order.
|
|
83
|
+
* Sections without a `group` fall into the implicit `'Menu'` group.
|
|
55
84
|
*/
|
|
56
85
|
export declare interface AdminSectionConfig {
|
|
57
86
|
/** Section ID unique within the plugin */
|
|
@@ -60,9 +89,9 @@ export declare interface AdminSectionConfig {
|
|
|
60
89
|
label: string;
|
|
61
90
|
/** React node for the icon (SVG or component) */
|
|
62
91
|
icon: ReactNode;
|
|
63
|
-
/** Sidebar group name
|
|
92
|
+
/** Sidebar group name — must match an {@link AdminGroupConfig.label} to merge into that group */
|
|
64
93
|
group?: string;
|
|
65
|
-
/** Sort order within group (lower = higher) */
|
|
94
|
+
/** Sort order within group (lower = higher). Default: 0 */
|
|
66
95
|
order?: number;
|
|
67
96
|
/** Permission required to see this section */
|
|
68
97
|
requiredPermission?: PluginPermission;
|
|
@@ -119,47 +148,113 @@ export declare interface AdminShellProps {
|
|
|
119
148
|
className?: string;
|
|
120
149
|
}
|
|
121
150
|
|
|
151
|
+
/**
|
|
152
|
+
* All section IDs registered by the cedros-login plugin.
|
|
153
|
+
*
|
|
154
|
+
* Use these to reference specific sections when configuring
|
|
155
|
+
* `dashboardPermissions.canAccess()` or navigating programmatically.
|
|
156
|
+
*
|
|
157
|
+
* Qualified IDs (for multi-plugin use) are prefixed: `cedros-login:{id}`.
|
|
158
|
+
*/
|
|
159
|
+
export declare const CEDROS_LOGIN_SECTION_IDS: {
|
|
160
|
+
readonly users: "users";
|
|
161
|
+
readonly team: "team";
|
|
162
|
+
readonly deposits: "deposits";
|
|
163
|
+
readonly withdrawals: "withdrawals";
|
|
164
|
+
readonly settingsAuth: "settings-auth";
|
|
165
|
+
readonly settingsEmail: "settings-email";
|
|
166
|
+
readonly settingsWebhooks: "settings-webhooks";
|
|
167
|
+
readonly settingsWallet: "settings-wallet";
|
|
168
|
+
readonly settingsCredits: "settings-credits";
|
|
169
|
+
readonly settingsServer: "settings-server";
|
|
170
|
+
};
|
|
171
|
+
|
|
122
172
|
declare const cedrosLoginPlugin: AdminPlugin;
|
|
123
173
|
export { cedrosLoginPlugin }
|
|
124
174
|
export { cedrosLoginPlugin as loginPlugin }
|
|
125
175
|
|
|
126
176
|
/**
|
|
127
|
-
* Host context provided by
|
|
128
|
-
*
|
|
177
|
+
* Host context provided by the application to `<AdminShell>`.
|
|
178
|
+
*
|
|
179
|
+
* Each field is optional — omit fields your app doesn't use.
|
|
180
|
+
* Plugins read the fields they need and degrade gracefully when absent.
|
|
181
|
+
*
|
|
182
|
+
* **Which plugin reads what:**
|
|
183
|
+
* - `cedros-login` plugin: requires `cedrosLogin` (throws if missing).
|
|
184
|
+
* Uses `user`, `getAccessToken`, `serverUrl` for all API calls.
|
|
185
|
+
* Reads `org` for role-based section filtering.
|
|
186
|
+
* - `cedros-pay` plugin: requires `cedrosPay`. Uses `walletAddress`,
|
|
187
|
+
* `jwtToken`, `serverUrl`.
|
|
188
|
+
* - Both plugins: respect `dashboardPermissions` for section-level RBAC.
|
|
189
|
+
*
|
|
190
|
+
* **Missing field behavior:**
|
|
191
|
+
* - `cedrosLogin` missing → cedros-login plugin throws at `createPluginContext()`.
|
|
192
|
+
* - `cedrosPay` missing → cedros-pay plugin throws at `createPluginContext()`.
|
|
193
|
+
* - `org` missing → all authenticated users are treated as global admins
|
|
194
|
+
* (all permission checks pass).
|
|
195
|
+
* - `dashboardPermissions` missing → all sections visible (no owner-level filtering).
|
|
196
|
+
* - `custom` → pass-through bag, not read by built-in plugins.
|
|
129
197
|
*/
|
|
130
198
|
export declare interface HostContext {
|
|
131
|
-
/**
|
|
199
|
+
/**
|
|
200
|
+
* Cedros Login auth context.
|
|
201
|
+
*
|
|
202
|
+
* **Required by:** `cedros-login` plugin.
|
|
203
|
+
* **Missing behavior:** plugin throws `'cedros-login plugin requires cedrosLogin in hostContext'`.
|
|
204
|
+
*/
|
|
132
205
|
cedrosLogin?: {
|
|
206
|
+
/** Authenticated user, or null if not signed in */
|
|
133
207
|
user: {
|
|
134
208
|
id: string;
|
|
135
209
|
email?: string;
|
|
136
210
|
name?: string;
|
|
137
211
|
picture?: string;
|
|
138
212
|
} | null;
|
|
213
|
+
/** Returns current JWT access token, or null */
|
|
139
214
|
getAccessToken: () => string | null;
|
|
215
|
+
/** Base URL of the cedros-login server (e.g., `https://api.example.com`) */
|
|
140
216
|
serverUrl: string;
|
|
141
217
|
};
|
|
142
|
-
/**
|
|
218
|
+
/**
|
|
219
|
+
* Cedros Pay context.
|
|
220
|
+
*
|
|
221
|
+
* **Required by:** `cedros-pay` plugin.
|
|
222
|
+
* **Missing behavior:** pay plugin throws at context creation.
|
|
223
|
+
*/
|
|
143
224
|
cedrosPay?: {
|
|
225
|
+
/** Connected wallet public key */
|
|
144
226
|
walletAddress?: string;
|
|
227
|
+
/** JWT for cedros-pay API */
|
|
145
228
|
jwtToken?: string;
|
|
229
|
+
/** Base URL of the cedros-pay server */
|
|
146
230
|
serverUrl: string;
|
|
147
231
|
};
|
|
148
|
-
/**
|
|
232
|
+
/**
|
|
233
|
+
* Organization context for multi-tenant role-based access.
|
|
234
|
+
*
|
|
235
|
+
* **Missing behavior:** all permission checks pass (global admin assumed).
|
|
236
|
+
*/
|
|
149
237
|
org?: {
|
|
238
|
+
/** Current organization ID */
|
|
150
239
|
orgId: string;
|
|
240
|
+
/** User's role in this org (e.g., 'owner', 'admin', 'member') */
|
|
151
241
|
role: string;
|
|
242
|
+
/** Granular permission strings (e.g., 'member:read', 'invite:create') */
|
|
152
243
|
permissions: string[];
|
|
153
244
|
};
|
|
154
245
|
/**
|
|
155
|
-
*
|
|
156
|
-
*
|
|
246
|
+
* Owner-configured section-level access control.
|
|
247
|
+
*
|
|
248
|
+
* Applied *after* plugin permission checks — a section must pass both
|
|
249
|
+
* `plugin.checkPermission()` and `canAccess()` to be visible.
|
|
250
|
+
*
|
|
251
|
+
* **Missing behavior:** all sections visible (no owner-level filtering).
|
|
157
252
|
*/
|
|
158
253
|
dashboardPermissions?: {
|
|
159
|
-
/** Check if current user can access a section by
|
|
254
|
+
/** Check if current user can access a section by its `SectionId` */
|
|
160
255
|
canAccess: (sectionId: string) => boolean;
|
|
161
256
|
};
|
|
162
|
-
/** Generic extension point */
|
|
257
|
+
/** Generic extension point for custom plugins. Not read by built-in plugins. */
|
|
163
258
|
custom?: Record<string, unknown>;
|
|
164
259
|
}
|
|
165
260
|
|
package/dist/admin-only.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { A as n, I as i, c as o, c as
|
|
1
|
+
import { A as n, C as a, I as i, c as o, c as e, u as I } from "./plugin-Bhf9zaly.js";
|
|
2
2
|
export {
|
|
3
3
|
n as AdminShell,
|
|
4
|
+
a as CEDROS_LOGIN_SECTION_IDS,
|
|
4
5
|
i as Icons,
|
|
5
6
|
o as cedrosLoginPlugin,
|
|
6
|
-
|
|
7
|
-
|
|
7
|
+
e as loginPlugin,
|
|
8
|
+
I as useAdminShell
|
|
8
9
|
};
|
package/dist/email-only.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./useAuth-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const r=require("./useAuth-dS_6wAMp.cjs"),o=require("./useCedrosLogin-C9MrcZvh.cjs"),e=require("./EmailRegisterForm-DcpT5LU6.cjs"),i=require("./LoadingSpinner-d6sSxgQN.cjs"),s=require("./ErrorMessage-CHbYbVi2.cjs"),n=require("./validation-BuGQrA-K.cjs");exports.CedrosLoginProvider=r.CedrosLoginProvider;exports.useAuth=r.useAuth;exports.useCedrosLogin=o.useCedrosLogin;exports.EmailLoginForm=e.EmailLoginForm;exports.EmailRegisterForm=e.EmailRegisterForm;exports.PasswordInput=e.PasswordInput;exports.useEmailAuth=e.useEmailAuth;exports.LoadingSpinner=i.LoadingSpinner;exports.ErrorMessage=s.ErrorMessage;exports.validatePassword=n.validatePassword;
|
package/dist/email-only.d.ts
CHANGED
|
@@ -99,16 +99,44 @@ export declare interface AuthUser {
|
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
/**
|
|
102
|
-
* Full configuration for
|
|
102
|
+
* Full configuration for the authentication system.
|
|
103
|
+
*
|
|
104
|
+
* **Note:** When passing config to `<CedrosLoginProvider>`, use
|
|
105
|
+
* {@link CedrosLoginProviderConfig} instead — it extends this type
|
|
106
|
+
* with `features: 'auto'` support. This base type is used internally
|
|
107
|
+
* after the provider resolves auto-discovery.
|
|
108
|
+
*
|
|
109
|
+
* ```
|
|
110
|
+
* CedrosLoginProviderConfig (public prop type — accepts features: 'auto')
|
|
111
|
+
* └── CedrosLoginConfig (internal type — features is always FeatureFlags)
|
|
112
|
+
* ```
|
|
103
113
|
*/
|
|
104
114
|
export declare interface CedrosLoginConfig {
|
|
105
115
|
/** Auth server base URL */
|
|
106
116
|
serverUrl: string;
|
|
107
117
|
/** App name for Solana message: "Login to {appName}". Default: window.location.hostname */
|
|
108
118
|
appName?: string;
|
|
109
|
-
/**
|
|
119
|
+
/**
|
|
120
|
+
* Google OAuth client ID. Required if Google auth enabled.
|
|
121
|
+
*
|
|
122
|
+
* **CSP requirements** (when using Google One Tap / credential popup):
|
|
123
|
+
* ```
|
|
124
|
+
* script-src https://accounts.google.com;
|
|
125
|
+
* connect-src https://accounts.google.com;
|
|
126
|
+
* frame-src https://accounts.google.com;
|
|
127
|
+
* ```
|
|
128
|
+
*/
|
|
110
129
|
googleClientId?: string;
|
|
111
|
-
/**
|
|
130
|
+
/**
|
|
131
|
+
* Apple Sign In client ID (Services ID). Required if Apple auth enabled.
|
|
132
|
+
*
|
|
133
|
+
* **CSP requirements** (when using Apple Sign In popup):
|
|
134
|
+
* ```
|
|
135
|
+
* script-src https://appleid.cdn-apple.com;
|
|
136
|
+
* connect-src https://appleid.apple.com;
|
|
137
|
+
* frame-src https://appleid.apple.com;
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
112
140
|
appleClientId?: string;
|
|
113
141
|
/** Solana configuration options */
|
|
114
142
|
solana?: SolanaConfig;
|
|
@@ -161,9 +189,31 @@ declare interface CedrosLoginInternalAPI {
|
|
|
161
189
|
export declare function CedrosLoginProvider({ config, children }: CedrosLoginProviderProps): JSX.Element | null;
|
|
162
190
|
|
|
163
191
|
/**
|
|
164
|
-
* Config
|
|
165
|
-
*
|
|
166
|
-
*
|
|
192
|
+
* Config prop type for `<CedrosLoginProvider>`.
|
|
193
|
+
*
|
|
194
|
+
* Extends {@link CedrosLoginConfig} with one additional feature:
|
|
195
|
+
* the `features` field also accepts `'auto'` to fetch enabled
|
|
196
|
+
* auth methods from the server at startup.
|
|
197
|
+
*
|
|
198
|
+
* **`features: 'auto'` discovery contract:**
|
|
199
|
+
* - Calls `GET {serverUrl}/features` (no auth required, credentials omitted).
|
|
200
|
+
* - Response shape: `{ email, google, apple, solana, webauthn, instantLink }` (all booleans).
|
|
201
|
+
* - Timeout: `requestTimeout` or 5 000 ms. 1 retry on failure.
|
|
202
|
+
* - Fallback: all methods enabled (so the login page is never blank).
|
|
203
|
+
* - Children are not rendered until discovery completes.
|
|
204
|
+
* - `walletEnrollment` flag is client-only and is not part of the server response.
|
|
205
|
+
*
|
|
206
|
+
* When `features` is omitted or set to a `FeatureFlags` object, no server
|
|
207
|
+
* call is made and the flags are used as-is.
|
|
208
|
+
*
|
|
209
|
+
* @example
|
|
210
|
+
* ```tsx
|
|
211
|
+
* // Auto-discover enabled methods from the server:
|
|
212
|
+
* <CedrosLoginProvider config={{ serverUrl: '...', features: 'auto' }}>
|
|
213
|
+
*
|
|
214
|
+
* // Or specify explicitly:
|
|
215
|
+
* <CedrosLoginProvider config={{ serverUrl: '...', features: { email: true, google: true } }}>
|
|
216
|
+
* ```
|
|
167
217
|
*/
|
|
168
218
|
declare type CedrosLoginProviderConfig = Omit<CedrosLoginConfig, 'features'> & {
|
|
169
219
|
features?: FeatureFlags | 'auto';
|
package/dist/email-only.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { C as s, u as a } from "./useAuth-
|
|
1
|
+
import { C as s, u as a } from "./useAuth-D1NSN6yY.js";
|
|
2
2
|
import { u as i } from "./useCedrosLogin-_94MmGGq.js";
|
|
3
|
-
import { E as t, a as u, P as p, u as d } from "./EmailRegisterForm-
|
|
3
|
+
import { E as t, a as u, P as p, u as d } from "./EmailRegisterForm-HMcnD3KA.js";
|
|
4
4
|
import { L as f } from "./LoadingSpinner-6vml-zwr.js";
|
|
5
5
|
import { E as x } from "./ErrorMessage-CcEK0pYO.js";
|
|
6
6
|
import { v as L } from "./validation-B8kMV3BL.js";
|
package/dist/google-only.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./useAuth-
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./useAuth-dS_6wAMp.cjs"),r=require("./useCedrosLogin-C9MrcZvh.cjs"),o=require("./GoogleLoginButton-zS_69-KV.cjs"),n=require("./LoadingSpinner-d6sSxgQN.cjs"),s=require("./ErrorMessage-CHbYbVi2.cjs");exports.CedrosLoginProvider=e.CedrosLoginProvider;exports.useAuth=e.useAuth;exports.useCedrosLogin=r.useCedrosLogin;exports.GoogleLoginButton=o.GoogleLoginButton;exports.useGoogleAuth=o.useGoogleAuth;exports.LoadingSpinner=n.LoadingSpinner;exports.ErrorMessage=s.ErrorMessage;
|
package/dist/google-only.d.ts
CHANGED
|
@@ -98,16 +98,44 @@ export declare interface AuthUser {
|
|
|
98
98
|
}
|
|
99
99
|
|
|
100
100
|
/**
|
|
101
|
-
* Full configuration for
|
|
101
|
+
* Full configuration for the authentication system.
|
|
102
|
+
*
|
|
103
|
+
* **Note:** When passing config to `<CedrosLoginProvider>`, use
|
|
104
|
+
* {@link CedrosLoginProviderConfig} instead — it extends this type
|
|
105
|
+
* with `features: 'auto'` support. This base type is used internally
|
|
106
|
+
* after the provider resolves auto-discovery.
|
|
107
|
+
*
|
|
108
|
+
* ```
|
|
109
|
+
* CedrosLoginProviderConfig (public prop type — accepts features: 'auto')
|
|
110
|
+
* └── CedrosLoginConfig (internal type — features is always FeatureFlags)
|
|
111
|
+
* ```
|
|
102
112
|
*/
|
|
103
113
|
export declare interface CedrosLoginConfig {
|
|
104
114
|
/** Auth server base URL */
|
|
105
115
|
serverUrl: string;
|
|
106
116
|
/** App name for Solana message: "Login to {appName}". Default: window.location.hostname */
|
|
107
117
|
appName?: string;
|
|
108
|
-
/**
|
|
118
|
+
/**
|
|
119
|
+
* Google OAuth client ID. Required if Google auth enabled.
|
|
120
|
+
*
|
|
121
|
+
* **CSP requirements** (when using Google One Tap / credential popup):
|
|
122
|
+
* ```
|
|
123
|
+
* script-src https://accounts.google.com;
|
|
124
|
+
* connect-src https://accounts.google.com;
|
|
125
|
+
* frame-src https://accounts.google.com;
|
|
126
|
+
* ```
|
|
127
|
+
*/
|
|
109
128
|
googleClientId?: string;
|
|
110
|
-
/**
|
|
129
|
+
/**
|
|
130
|
+
* Apple Sign In client ID (Services ID). Required if Apple auth enabled.
|
|
131
|
+
*
|
|
132
|
+
* **CSP requirements** (when using Apple Sign In popup):
|
|
133
|
+
* ```
|
|
134
|
+
* script-src https://appleid.cdn-apple.com;
|
|
135
|
+
* connect-src https://appleid.apple.com;
|
|
136
|
+
* frame-src https://appleid.apple.com;
|
|
137
|
+
* ```
|
|
138
|
+
*/
|
|
111
139
|
appleClientId?: string;
|
|
112
140
|
/** Solana configuration options */
|
|
113
141
|
solana?: SolanaConfig;
|
|
@@ -160,9 +188,31 @@ declare interface CedrosLoginInternalAPI {
|
|
|
160
188
|
export declare function CedrosLoginProvider({ config, children }: CedrosLoginProviderProps): JSX.Element | null;
|
|
161
189
|
|
|
162
190
|
/**
|
|
163
|
-
* Config
|
|
164
|
-
*
|
|
165
|
-
*
|
|
191
|
+
* Config prop type for `<CedrosLoginProvider>`.
|
|
192
|
+
*
|
|
193
|
+
* Extends {@link CedrosLoginConfig} with one additional feature:
|
|
194
|
+
* the `features` field also accepts `'auto'` to fetch enabled
|
|
195
|
+
* auth methods from the server at startup.
|
|
196
|
+
*
|
|
197
|
+
* **`features: 'auto'` discovery contract:**
|
|
198
|
+
* - Calls `GET {serverUrl}/features` (no auth required, credentials omitted).
|
|
199
|
+
* - Response shape: `{ email, google, apple, solana, webauthn, instantLink }` (all booleans).
|
|
200
|
+
* - Timeout: `requestTimeout` or 5 000 ms. 1 retry on failure.
|
|
201
|
+
* - Fallback: all methods enabled (so the login page is never blank).
|
|
202
|
+
* - Children are not rendered until discovery completes.
|
|
203
|
+
* - `walletEnrollment` flag is client-only and is not part of the server response.
|
|
204
|
+
*
|
|
205
|
+
* When `features` is omitted or set to a `FeatureFlags` object, no server
|
|
206
|
+
* call is made and the flags are used as-is.
|
|
207
|
+
*
|
|
208
|
+
* @example
|
|
209
|
+
* ```tsx
|
|
210
|
+
* // Auto-discover enabled methods from the server:
|
|
211
|
+
* <CedrosLoginProvider config={{ serverUrl: '...', features: 'auto' }}>
|
|
212
|
+
*
|
|
213
|
+
* // Or specify explicitly:
|
|
214
|
+
* <CedrosLoginProvider config={{ serverUrl: '...', features: { email: true, google: true } }}>
|
|
215
|
+
* ```
|
|
166
216
|
*/
|
|
167
217
|
declare type CedrosLoginProviderConfig = Omit<CedrosLoginConfig, 'features'> & {
|
|
168
218
|
features?: FeatureFlags | 'auto';
|
package/dist/google-only.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { C as e, u as s } from "./useAuth-
|
|
1
|
+
import { C as e, u as s } from "./useAuth-D1NSN6yY.js";
|
|
2
2
|
import { u as t } from "./useCedrosLogin-_94MmGGq.js";
|
|
3
3
|
import { G as g, u as n } from "./GoogleLoginButton-CXwp4LsQ.js";
|
|
4
4
|
import { L as p } from "./LoadingSpinner-6vml-zwr.js";
|