@nocios/crudify-ui 5.0.2 → 5.0.4

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/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
- import{a as _,b as B,c as H,d as q,e as W,f as J,g as $,h as Ae,i as Ce,j as Re,k as Ie,l as Pe,m as he,n as Se,o as Te,p as Me,q as ze}from"./chunk-NSA6YDHY.mjs";import{a as we,b as Le,c as be,d as Oe}from"./chunk-QPTL5FLE.mjs";import{a as Y,b as f,c as ee,d as ie,e as ne,f as w,g as se,h as ae,i as pe,j as m,k as ce,l as xe,m as ve,n as ke,o as P,p as Ee}from"./chunk-PARX2RMU.mjs";import{a as Ue,b as Fe}from"./chunk-OGAGYHG4.mjs";import{a as de,b as le,c as ue,d as fe,e as me,f as ge,g as ye}from"./chunk-JAPL7EZJ.mjs";import{a as p,b as T,c as z,k as Z,l as Q,m as X,n as j,q as re,r as oe,s as te}from"./chunk-6BQGRZYB.mjs";import{default as Qr}from"@nocios/crudify-browser";export*from"@nocios/crudify-browser";import{useMemo as Ne}from"react";import{ThemeProvider as De,createTheme as Ge,CssBaseline as Ke}from"@mui/material";import{jsx as Be,jsxs as He}from"react/jsx-runtime";var Ve=(e={})=>{try{let r=T("theme");if(r){let o=JSON.parse(decodeURIComponent(r));return{...e,...o}}}catch(r){p.warn("Error parsing theme from cookie",r instanceof Error?{errorMessage:r.message}:{message:String(r)})}return e};function _e({children:e,defaultTheme:r={},disableCssBaseline:o=!1}){let t=Ne(()=>{let s=Ve(r);return Ge(s)},[r]);return He(De,{theme:t,children:[!o&&Be(Ke,{}),e]})}import{Navigate as Ze,useLocation as Qe}from"react-router-dom";import{Fragment as Je,jsx as h,jsxs as L}from"react/jsx-runtime";var qe={border:"5px solid rgba(0, 0, 0, 0.1)",borderTopColor:"#3B82F6",borderRadius:"50%",width:"50px",height:"50px",animation:"spin 1s linear infinite"},We=()=>h("style",{children:`
1
+ import{a as _,b as B,c as H,d as q,e as W,f as J,g as $,h as Ae,i as Ce,j as Pe,k as Re,l as Ie,m as he,n as Se,o as Te,p as Me,q as ze}from"./chunk-NSA6YDHY.mjs";import{a as we,b as Le,c as be,d as Oe}from"./chunk-QPTL5FLE.mjs";import{a as Y,b as f,c as ee,d as ie,e as ne,f as w,g as se,h as ae,i as pe,j as m,k as ce,l as xe,m as ve,n as ke,o as I,p as Ee}from"./chunk-PARX2RMU.mjs";import{a as Ue,b as Fe}from"./chunk-OGAGYHG4.mjs";import{a as le,b as ue,c as de,d as fe,e as me,f as ge,g as ye}from"./chunk-JAPL7EZJ.mjs";import{a as p,b as T,c as z,k as Z,l as Q,m as X,n as j,q as re,r as oe,s as te}from"./chunk-6BQGRZYB.mjs";import{default as Qr}from"@nocios/crudify-browser";export*from"@nocios/crudify-browser";import{useMemo as Ne}from"react";import{ThemeProvider as De,createTheme as Ge,CssBaseline as Ke}from"@mui/material";import{jsx as Be,jsxs as He}from"react/jsx-runtime";var Ve=(e={})=>{try{let r=T("theme");if(r){let o=JSON.parse(decodeURIComponent(r));return{...e,...o}}}catch(r){p.warn("Error parsing theme from cookie",r instanceof Error?{errorMessage:r.message}:{message:String(r)})}return e};function _e({children:e,defaultTheme:r={},disableCssBaseline:o=!1}){let t=Ne(()=>{let s=Ve(r);return Ge(s)},[r]);return He(De,{theme:t,children:[!o&&Be(Ke,{}),e]})}import{Navigate as Ze,useLocation as Qe}from"react-router-dom";import{Fragment as Je,jsx as h,jsxs as L}from"react/jsx-runtime";var qe={border:"5px solid rgba(0, 0, 0, 0.1)",borderTopColor:"#3B82F6",borderRadius:"50%",width:"50px",height:"50px",animation:"spin 1s linear infinite"},We=()=>h("style",{children:`
2
2
  @keyframes spin {
3
3
  0% { transform: rotate(0deg); }
4
4
  100% { transform: rotate(360deg); }
5
5
  }
6
- `});function k({stage:e="loading",message:r}){let t=r||{initializing:"Initializing application...","validating-session":"Validating session...",loading:"Loading..."}[e];return L(Je,{children:[h(We,{}),L("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",height:"100vh",width:"100vw",backgroundColor:"#f0f2f5",fontFamily:'"Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',color:"#333",textAlign:"center",boxSizing:"border-box",padding:"20px",background:"#fff"},children:[h("div",{style:qe}),h("p",{style:{fontSize:"1.25em",fontWeight:"500",marginTop:"24px",color:"#1f2937"},children:t})]})]})}var $e=/^[a-zA-Z0-9\-_./\?=&%#]+$/,Ye=[/^https?:\/\//i,/^ftp:\/\//i,/^\/\//,/javascript:/i,/data:/i,/vbscript:/i,/about:/i,/\.\.\//,/\.\.\\/,/%2e%2e%2f/i,/%2e%2e%5c/i,/%2f%2f/i,/%5c%5c/i,/[\x00-\x1f\x7f-\x9f]/,/\\/],S=(e,r="/")=>{if(!e||typeof e!="string")return r;let o=e.trim();if(!o)return r;if(!o.startsWith("/"))return p.warn("Open redirect blocked (relative path)",{path:e}),r;if(!$e.test(o))return p.warn("Open redirect blocked (invalid characters)",{path:e}),r;let t=o.toLowerCase();for(let a of Ye)if(a.test(t))return p.warn("Open redirect blocked (dangerous pattern)",{path:e}),r;let s=o.split("?")[0].split("/").filter(Boolean);if(s.length===0)return o;for(let a of s)if(a===".."||a.includes(":")||a.length>100)return p.warn("Open redirect blocked (suspicious path part)",{part:a}),r;return o},E=(e,r="/")=>{try{let t=(typeof e=="string"?new URLSearchParams(e):e).get("redirect");if(!t)return r;let s=decodeURIComponent(t);return S(s,r)}catch(o){return p.warn("Error parsing redirect parameter",o instanceof Error?{errorMessage:o.message}:{message:String(o)}),r}};import{Fragment as b,jsx as v}from"react/jsx-runtime";function U({children:e,loadingComponent:r,loginPath:o="/login"}){let{isAuthenticated:t,isLoading:s,isInitialized:a,tokens:c,error:A}=m(),l=Qe();if(!a||s)return v(b,{children:r||v(k,{stage:"validating-session"})});let u=t&&c?.accessToken&&c.accessToken.length>0;if(A||!t||!u){c&&(!c.accessToken||c.accessToken.length===0)&&localStorage.removeItem("crudify_tokens");let x=l.pathname+l.search,C=S(x),R=encodeURIComponent(C);return v(Ze,{to:`${o}?redirect=${R}`,replace:!0})}return v(b,{children:e})}import{Navigate as Xe,useLocation as je}from"react-router-dom";import{Fragment as er,jsx as F}from"react/jsx-runtime";function O({children:e,redirectTo:r="/"}){let{isAuthenticated:o}=m(),t=je();if(o){let s=new URLSearchParams(t.search),a=E(s,r);return F(Xe,{to:a,replace:!0})}return F(er,{children:e})}import{createContext as rr,useContext as or,useEffect as tr,useRef as N,useState as M}from"react";import{Fragment as sr,jsx as D}from"react/jsx-runtime";var G=rr(void 0),ir=({config:e,children:r,fallback:o=null,onInitialized:t,onError:s})=>{let[a,c]=M(!1),[A,l]=M(!1),[u,x]=M(null),C=N(!1),R=N(!1);tr(()=>{C.current||(P.registerHighPriorityInitializer(),C.current=!0),R.current||(R.current=!0,(async()=>{l(!0),x(null);try{let d=z({publicApiKey:e?.publicApiKey,env:e?.env,enableDebug:e?.enableLogging});if(!d.publicApiKey)throw new Error("Crudify configuration missing. Please provide publicApiKey via props or ensure cookies are set by Lambda.");let I=d.env||"prod";p.setEnvironment(I),await P.initialize({priority:"HIGH",publicApiKey:d.publicApiKey,env:d.env||"prod",enableLogging:e?.enableLogging,requestedBy:"CrudifyInitializer"}),c(!0),l(!1),t&&t()}catch(d){let I=d instanceof Error?d:new Error(String(d));x(I),l(!1),s&&s(I)}})())},[e?.publicApiKey,e?.env,e?.enableLogging,t,s]);let V={isInitialized:a,isInitializing:A,error:u};return A&&o?D(sr,{children:o}):(u&&p.error("[CrudifyInitializer] Initialization failed",u),D(G.Provider,{value:V,children:r}))},nr=()=>{let e=or(G);if(!e)throw new Error("useCrudifyInitializer must be used within CrudifyInitializer");return e};import i from"@nocios/crudify-admin";var K=!1,g=null,y=null;async function ar(){let r=await f.getInstance().getTokenInfo(),o=r?.apiEndpointAdmin,t=r?.apiKeyEndpointAdmin;return o&&t?{apiUrl:o,apiKey:t}:w.waitForCredentials()}async function pr(){if(!K)return g||(g=(async()=>{try{let e=f.getInstance(),{apiUrl:r,apiKey:o}=await ar();y=(await e.getTokenInfo())?.crudifyTokens?.accessToken||null,i.init({url:r,apiKey:o,getAdditionalHeaders:()=>y?{Authorization:`Bearer ${y}`}:{}}),K=!0}catch(e){throw g=null,p.error("[crudifyAdminWrapper] Initialization failed",e instanceof Error?e:{message:String(e)}),e}})(),g)}async function n(e){try{await pr();let r=f.getInstance();y=(await r.getTokenInfo())?.crudifyTokens?.accessToken||null;let t=await e(),s=t.errors&&(typeof t.errors=="string"&&t.errors.includes("401")||Array.isArray(t.errors)&&t.errors.some(a=>typeof a=="string"&&a.includes("401")));return!t.success&&s?await r.refreshTokens()?(y=(await r.getTokenInfo())?.crudifyTokens?.accessToken||null,await e()):(p.error("[crudifyAdmin] Token refresh failed"),typeof window<"u"&&(window.location.href="/login"),t):t}catch(r){return p.error("[crudifyAdmin] Operation error",r instanceof Error?r:{message:String(r)}),{success:!1,errors:r instanceof Error?r.message:"Unknown error"}}}var cr={listModules:()=>n(()=>i.listModules()),getModule:e=>n(()=>i.getModule(e)),createModule:e=>n(()=>i.createModule(e)),editModule:(e,r)=>n(()=>i.editModule(e,r)),deleteModule:e=>n(()=>i.deleteModule(e)),activateModule:e=>n(()=>i.activateModule(e)),deactivateModule:e=>n(()=>i.deactivateModule(e)),getModuleVersions:e=>n(()=>i.getModuleVersions(e)),listActions:e=>n(()=>i.listActions(e)),getAction:e=>n(()=>i.getAction(e)),createAction:e=>n(()=>i.createAction(e)),editAction:(e,r)=>n(()=>i.editAction(e,r)),deleteAction:e=>n(()=>i.deleteAction(e)),activateAction:e=>n(()=>i.activateAction(e)),deactivateAction:e=>n(()=>i.deactivateAction(e)),getActionVersions:e=>n(()=>i.getActionVersions(e)),getActionsByProfile:e=>n(()=>i.getActionsByProfile(e)),updateActionsProfiles:e=>n(()=>i.updateActionsProfiles(e))};export{O as AuthRoute,_ as CRITICAL_TRANSLATIONS,Te as CrudiaAutoGenerate,Me as CrudiaFileField,ze as CrudiaMarkdownField,ke as CrudifyInitializationManager,ir as CrudifyInitializer,Ae as CrudifyLogin,se as CrudifyProvider,_e as CrudifyThemeProvider,de as ERROR_CODES,le as ERROR_SEVERITY_MAP,ie as GlobalNotificationProvider,he as LoginComponent,Re as POLICY_ACTIONS,Ie as PREFERRED_POLICY_ORDER,Pe as Policies,U as ProtectedRoute,ce as SessionDebugInfo,k as SessionLoadingScreen,f as SessionManager,pe as SessionProvider,Se as SessionStatus,Y as TokenStorage,q as TranslationService,J as TranslationsProvider,Ce as UserProfileDisplay,j as createErrorTranslator,Qr as crudify,cr as crudifyAdmin,P as crudifyInitManager,re as decodeJwtSafely,E as extractSafeRedirectFromUrl,T as getCookie,B as getCriticalLanguages,H as getCriticalTranslations,oe as getCurrentUserEmail,me as getErrorMessage,ye as handleCrudifyError,te as isTokenExpired,p as logger,ue as parseApiError,ge as parseJavaScriptError,fe as parseTransactionError,Fe as secureLocalStorage,Ue as secureSessionStorage,X as translateError,Z as translateErrorCode,Q as translateErrorCodes,W as translationService,Le as useAuth,ve as useAutoGenerate,ae as useCrudify,nr as useCrudifyInitializer,Oe as useCrudifyWithNotifications,be as useData,Ee as useFileUpload,ne as useGlobalNotification,ee as useSession,m as useSessionContext,$ as useTranslations,we as useUserData,xe as useUserProfile,S as validateInternalRedirect};
6
+ `});function k({stage:e="loading",message:r}){let t=r||{initializing:"Initializing application...","validating-session":"Validating session...",loading:"Loading..."}[e];return L(Je,{children:[h(We,{}),L("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",height:"100vh",width:"100vw",backgroundColor:"#f0f2f5",fontFamily:'"Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',color:"#333",textAlign:"center",boxSizing:"border-box",padding:"20px",background:"#fff"},children:[h("div",{style:qe}),h("p",{style:{fontSize:"1.25em",fontWeight:"500",marginTop:"24px",color:"#1f2937"},children:t})]})]})}var $e=/^[a-zA-Z0-9\-_./\?=&%#]+$/,Ye=[/^https?:\/\//i,/^ftp:\/\//i,/^\/\//,/javascript:/i,/data:/i,/vbscript:/i,/about:/i,/\.\.\//,/\.\.\\/,/%2e%2e%2f/i,/%2e%2e%5c/i,/%2f%2f/i,/%5c%5c/i,/[\x00-\x1f\x7f-\x9f]/,/\\/],S=(e,r="/")=>{if(!e||typeof e!="string")return r;let o=e.trim();if(!o)return r;if(!o.startsWith("/"))return p.warn("Open redirect blocked (relative path)",{path:e}),r;if(!$e.test(o))return p.warn("Open redirect blocked (invalid characters)",{path:e}),r;let t=o.toLowerCase();for(let a of Ye)if(a.test(t))return p.warn("Open redirect blocked (dangerous pattern)",{path:e}),r;let s=o.split("?")[0].split("/").filter(Boolean);if(s.length===0)return o;for(let a of s)if(a===".."||a.includes(":")||a.length>100)return p.warn("Open redirect blocked (suspicious path part)",{part:a}),r;return o},E=(e,r="/")=>{try{let t=(typeof e=="string"?new URLSearchParams(e):e).get("redirect");if(!t)return r;let s=decodeURIComponent(t);return S(s,r)}catch(o){return p.warn("Error parsing redirect parameter",o instanceof Error?{errorMessage:o.message}:{message:String(o)}),r}};import{Fragment as b,jsx as v}from"react/jsx-runtime";function U({children:e,loadingComponent:r,loginPath:o="/login"}){let{isAuthenticated:t,isLoading:s,isInitialized:a,tokens:c,error:A}=m(),u=Qe();if(!a||s)return v(b,{children:r||v(k,{stage:"validating-session"})});let d=t&&c?.accessToken&&c.accessToken.length>0;if(A||!t||!d){c&&(!c.accessToken||c.accessToken.length===0)&&localStorage.removeItem("crudify_tokens");let x=u.pathname+u.search,C=S(x),P=encodeURIComponent(C);return v(Ze,{to:`${o}?redirect=${P}`,replace:!0})}return v(b,{children:e})}import{Navigate as Xe,useLocation as je}from"react-router-dom";import{Fragment as er,jsx as F}from"react/jsx-runtime";function O({children:e,redirectTo:r="/"}){let{isAuthenticated:o}=m(),t=je();if(o){let s=new URLSearchParams(t.search),a=E(s,r);return F(Xe,{to:a,replace:!0})}return F(er,{children:e})}import{createContext as rr,useContext as or,useEffect as tr,useRef as N,useState as M}from"react";import{Fragment as sr,jsx as D}from"react/jsx-runtime";var G=rr(void 0),ir=({config:e,children:r,fallback:o=null,onInitialized:t,onError:s})=>{let[a,c]=M(!1),[A,u]=M(!1),[d,x]=M(null),C=N(!1),P=N(!1);tr(()=>{C.current||(I.registerHighPriorityInitializer(),C.current=!0),P.current||(P.current=!0,(async()=>{u(!0),x(null);try{let l=z({publicApiKey:e?.publicApiKey,env:e?.env,enableDebug:e?.enableLogging});if(!l.publicApiKey)throw new Error("Crudify configuration missing. Please provide publicApiKey via props or ensure cookies are set by Lambda.");let R=l.env||"prod";p.setEnvironment(R),await I.initialize({priority:"HIGH",publicApiKey:l.publicApiKey,env:l.env||"prod",enableLogging:e?.enableLogging,requestedBy:"CrudifyInitializer"}),c(!0),u(!1),t&&t()}catch(l){let R=l instanceof Error?l:new Error(String(l));x(R),u(!1),s&&s(R)}})())},[e?.publicApiKey,e?.env,e?.enableLogging,t,s]);let V={isInitialized:a,isInitializing:A,error:d};return A&&o?D(sr,{children:o}):(d&&p.error("[CrudifyInitializer] Initialization failed",d),D(G.Provider,{value:V,children:r}))},nr=()=>{let e=or(G);if(!e)throw new Error("useCrudifyInitializer must be used within CrudifyInitializer");return e};import i from"@nocios/crudify-admin";var K=!1,g=null,y=null;async function ar(){let r=await f.getInstance().getTokenInfo(),o=r?.apiEndpointAdmin,t=r?.apiKeyEndpointAdmin;return o&&t?{apiUrl:o,apiKey:t}:w.waitForCredentials()}async function pr(){if(!K)return g||(g=(async()=>{try{let e=f.getInstance(),{apiUrl:r,apiKey:o}=await ar();y=(await e.getTokenInfo())?.crudifyTokens?.accessToken||null,i.init({url:r,apiKey:o,getAdditionalHeaders:()=>y?{Authorization:`Bearer ${y}`}:{}}),K=!0}catch(e){throw g=null,p.error("[crudifyAdminWrapper] Initialization failed",e instanceof Error?e:{message:String(e)}),e}})(),g)}async function n(e){try{await pr();let r=f.getInstance();y=(await r.getTokenInfo())?.crudifyTokens?.accessToken||null;let t=await e(),s=t.errors&&(typeof t.errors=="string"&&t.errors.includes("401")||Array.isArray(t.errors)&&t.errors.some(a=>typeof a=="string"&&a.includes("401")));return!t.success&&s?await r.refreshTokens()?(y=(await r.getTokenInfo())?.crudifyTokens?.accessToken||null,await e()):(p.error("[crudifyAdmin] Token refresh failed"),typeof window<"u"&&(window.location.href="/login"),t):t}catch(r){return p.error("[crudifyAdmin] Operation error",r instanceof Error?r:{message:String(r)}),{success:!1,errors:r instanceof Error?r.message:"Unknown error"}}}var cr={listModules:()=>n(()=>i.listModules()),getModule:e=>n(()=>i.getModule(e)),createModule:e=>n(()=>i.createModule(e)),editModule:(e,r)=>n(()=>i.editModule(e,r)),deleteModule:e=>n(()=>i.deleteModule(e)),activateModule:e=>n(()=>i.activateModule(e)),deactivateModule:e=>n(()=>i.deactivateModule(e)),getModuleVersions:e=>n(()=>i.getModuleVersions(e)),listActions:e=>n(()=>i.listActions(e)),getAction:e=>n(()=>i.getAction(e)),createAction:e=>n(()=>i.createAction(e)),editAction:(e,r)=>n(()=>i.editAction(e,r)),deleteAction:e=>n(()=>i.deleteAction(e)),activateAction:e=>n(()=>i.activateAction(e)),deactivateAction:e=>n(()=>i.deactivateAction(e)),getActionVersions:e=>n(()=>i.getActionVersions(e)),getActionsByProfile:e=>n(()=>i.getActionsByProfile(e)),updateActionsProfiles:e=>n(()=>i.updateActionsProfiles(e)),calculatePermissions:e=>n(()=>i.calculatePermissions(e))};export{O as AuthRoute,_ as CRITICAL_TRANSLATIONS,Te as CrudiaAutoGenerate,Me as CrudiaFileField,ze as CrudiaMarkdownField,ke as CrudifyInitializationManager,ir as CrudifyInitializer,Ae as CrudifyLogin,se as CrudifyProvider,_e as CrudifyThemeProvider,le as ERROR_CODES,ue as ERROR_SEVERITY_MAP,ie as GlobalNotificationProvider,he as LoginComponent,Pe as POLICY_ACTIONS,Re as PREFERRED_POLICY_ORDER,Ie as Policies,U as ProtectedRoute,ce as SessionDebugInfo,k as SessionLoadingScreen,f as SessionManager,pe as SessionProvider,Se as SessionStatus,Y as TokenStorage,q as TranslationService,J as TranslationsProvider,Ce as UserProfileDisplay,j as createErrorTranslator,Qr as crudify,cr as crudifyAdmin,I as crudifyInitManager,re as decodeJwtSafely,E as extractSafeRedirectFromUrl,T as getCookie,B as getCriticalLanguages,H as getCriticalTranslations,oe as getCurrentUserEmail,me as getErrorMessage,ye as handleCrudifyError,te as isTokenExpired,p as logger,de as parseApiError,ge as parseJavaScriptError,fe as parseTransactionError,Fe as secureLocalStorage,Ue as secureSessionStorage,X as translateError,Z as translateErrorCode,Q as translateErrorCodes,W as translationService,Le as useAuth,ve as useAutoGenerate,ae as useCrudify,nr as useCrudifyInitializer,Oe as useCrudifyWithNotifications,be as useData,Ee as useFileUpload,ne as useGlobalNotification,ee as useSession,m as useSessionContext,$ as useTranslations,we as useUserData,xe as useUserProfile,S as validateInternalRedirect};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nocios/crudify-ui",
3
- "version": "5.0.2",
3
+ "version": "5.0.4",
4
4
  "engines": {
5
5
  "node": ">=24.12.0"
6
6
  },
@@ -42,7 +42,7 @@
42
42
  },
43
43
  "dependencies": {
44
44
  "@mdxeditor/editor": "^3.52.0",
45
- "@nocios/crudify-admin": "^5.0.0",
45
+ "@nocios/crudify-admin": "^5.0.2",
46
46
  "@nocios/crudify-browser": "^5.0.0",
47
47
  "dompurify": "^3.2.7",
48
48
  "uuid": "^13.0.0"
package/vitest.config.ts CHANGED
@@ -17,14 +17,7 @@ export default defineConfig({
17
17
  coverage: {
18
18
  provider: "v8",
19
19
  reporter: ["text", "json", "html"],
20
- exclude: [
21
- "node_modules/",
22
- "src/__tests__/",
23
- "dist/",
24
- "**/*.d.ts",
25
- "**/*.config.*",
26
- "**/mockData.ts",
27
- ],
20
+ exclude: ["node_modules/", "src/__tests__/", "dist/", "**/*.d.ts", "**/*.config.*", "**/mockData.ts"],
28
21
  },
29
22
  },
30
23
  resolve: {