@nocios/crudify-ui 4.3.36 → 4.4.0

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.d.mts CHANGED
@@ -11,8 +11,8 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
11
11
  import { ThemeOptions } from '@mui/material';
12
12
  export { A as AutoGenerateConfig, G as GlobalNotificationProvider, a as GlobalNotificationProviderProps, N as Notification, b as NotificationSeverity, d as UseAutoGenerateOptions, U as UseAutoGenerateReturn, c as useAutoGenerate, u as useGlobalNotification } from './GlobalNotificationProvider-Zq18OkpI.mjs';
13
13
  export { E as ERROR_CODES, j as ERROR_SEVERITY_MAP, n as ErrorCode, o as ErrorSeverity, q as ErrorTranslationConfig, P as ParsedError, m as createErrorTranslator, d as decodeJwtSafely, a as getCookie, g as getCurrentUserEmail, f as getErrorMessage, h as handleCrudifyError, i as isTokenExpired, p as parseApiError, e as parseJavaScriptError, c as parseTransactionError, b as secureLocalStorage, s as secureSessionStorage, l as translateError, t as translateErrorCode, k as translateErrorCodes } from './errorTranslation-DEn4aqs6.mjs';
14
- import { ApiResponse, IModule, ModuleCreateInput, ModuleEditInput } from '@nocios/crudify-admin';
15
- export { ApiResponse, IModule, ModuleCreateInput, ModuleEditInput } from '@nocios/crudify-admin';
14
+ import { ApiResponse, IModule, ModuleCreateInput, ModuleEditInput, ActionListFilters, IAction, ActionCreateInput, ActionEditInput } from '@nocios/crudify-admin';
15
+ export { ActionCreateInput, ActionEditInput, ActionListFilters, ApiResponse, IAction, IModule, ModuleCreateInput, ModuleEditInput } from '@nocios/crudify-admin';
16
16
 
17
17
  interface CrudifyContextValue {
18
18
  crudify: typeof crudify__default | null;
@@ -933,6 +933,14 @@ declare const crudifyAdmin: {
933
933
  activateModule: (moduleKey: string) => Promise<ApiResponse<IModule>>;
934
934
  deactivateModule: (moduleKey: string) => Promise<ApiResponse<IModule>>;
935
935
  getModuleVersions: (moduleKey: string) => Promise<ApiResponse<any[]>>;
936
+ listActions: (filters?: ActionListFilters) => Promise<ApiResponse<IAction[]>>;
937
+ getAction: (actionKey: string) => Promise<ApiResponse<IAction>>;
938
+ createAction: (actionData: ActionCreateInput) => Promise<ApiResponse<IAction>>;
939
+ editAction: (actionKey: string, actionData: ActionEditInput) => Promise<ApiResponse<IAction>>;
940
+ deleteAction: (actionKey: string) => Promise<ApiResponse>;
941
+ activateAction: (actionKey: string) => Promise<ApiResponse<IAction>>;
942
+ deactivateAction: (actionKey: string) => Promise<ApiResponse<IAction>>;
943
+ getActionVersions: (actionKey: string) => Promise<ApiResponse<any[]>>;
936
944
  };
937
945
 
938
946
  export { AuthRoute, type AuthRouteProps, CRITICAL_TRANSLATIONS, type CriticalTranslationKey, CrudifyInitializationManager, CrudifyInitializer, type CrudifyInitializerConfig, type CrudifyInitializerProps, CrudifyLoginConfig, CrudifyProvider, CrudifyThemeProvider, type CrudifyThemeProviderProps, type FetchTranslationsOptions, type InitializationPriority, type InitializationRequest, type InitializationStatus, LoginResult, type NotificationOptions, ProtectedRoute, type ProtectedRouteProps, SessionDebugInfo, SessionLoadingScreen, type SessionLoadingScreenProps, SessionProvider, type SessionProviderProps, type SupportedLanguage, TokenData, type TranslationResponse, TranslationService, type TranslationsContextValue, TranslationsProvider, type TranslationsProviderProps, UseSessionOptions, crudifyAdmin, crudifyInitManager, extractSafeRedirectFromUrl, getCriticalLanguages, getCriticalTranslations, translationService, useCrudify, useCrudifyInitializer, useSessionContext, useTranslations, validateInternalRedirect };
package/dist/index.d.ts CHANGED
@@ -11,8 +11,8 @@ import * as react_jsx_runtime from 'react/jsx-runtime';
11
11
  import { ThemeOptions } from '@mui/material';
12
12
  export { A as AutoGenerateConfig, G as GlobalNotificationProvider, a as GlobalNotificationProviderProps, N as Notification, b as NotificationSeverity, d as UseAutoGenerateOptions, U as UseAutoGenerateReturn, c as useAutoGenerate, u as useGlobalNotification } from './GlobalNotificationProvider-Zq18OkpI.js';
13
13
  export { E as ERROR_CODES, j as ERROR_SEVERITY_MAP, n as ErrorCode, o as ErrorSeverity, q as ErrorTranslationConfig, P as ParsedError, m as createErrorTranslator, d as decodeJwtSafely, a as getCookie, g as getCurrentUserEmail, f as getErrorMessage, h as handleCrudifyError, i as isTokenExpired, p as parseApiError, e as parseJavaScriptError, c as parseTransactionError, b as secureLocalStorage, s as secureSessionStorage, l as translateError, t as translateErrorCode, k as translateErrorCodes } from './errorTranslation-DdqZg8JD.js';
14
- import { ApiResponse, IModule, ModuleCreateInput, ModuleEditInput } from '@nocios/crudify-admin';
15
- export { ApiResponse, IModule, ModuleCreateInput, ModuleEditInput } from '@nocios/crudify-admin';
14
+ import { ApiResponse, IModule, ModuleCreateInput, ModuleEditInput, ActionListFilters, IAction, ActionCreateInput, ActionEditInput } from '@nocios/crudify-admin';
15
+ export { ActionCreateInput, ActionEditInput, ActionListFilters, ApiResponse, IAction, IModule, ModuleCreateInput, ModuleEditInput } from '@nocios/crudify-admin';
16
16
 
17
17
  interface CrudifyContextValue {
18
18
  crudify: typeof crudify__default | null;
@@ -933,6 +933,14 @@ declare const crudifyAdmin: {
933
933
  activateModule: (moduleKey: string) => Promise<ApiResponse<IModule>>;
934
934
  deactivateModule: (moduleKey: string) => Promise<ApiResponse<IModule>>;
935
935
  getModuleVersions: (moduleKey: string) => Promise<ApiResponse<any[]>>;
936
+ listActions: (filters?: ActionListFilters) => Promise<ApiResponse<IAction[]>>;
937
+ getAction: (actionKey: string) => Promise<ApiResponse<IAction>>;
938
+ createAction: (actionData: ActionCreateInput) => Promise<ApiResponse<IAction>>;
939
+ editAction: (actionKey: string, actionData: ActionEditInput) => Promise<ApiResponse<IAction>>;
940
+ deleteAction: (actionKey: string) => Promise<ApiResponse>;
941
+ activateAction: (actionKey: string) => Promise<ApiResponse<IAction>>;
942
+ deactivateAction: (actionKey: string) => Promise<ApiResponse<IAction>>;
943
+ getActionVersions: (actionKey: string) => Promise<ApiResponse<any[]>>;
936
944
  };
937
945
 
938
946
  export { AuthRoute, type AuthRouteProps, CRITICAL_TRANSLATIONS, type CriticalTranslationKey, CrudifyInitializationManager, CrudifyInitializer, type CrudifyInitializerConfig, type CrudifyInitializerProps, CrudifyLoginConfig, CrudifyProvider, CrudifyThemeProvider, type CrudifyThemeProviderProps, type FetchTranslationsOptions, type InitializationPriority, type InitializationRequest, type InitializationStatus, LoginResult, type NotificationOptions, ProtectedRoute, type ProtectedRouteProps, SessionDebugInfo, SessionLoadingScreen, type SessionLoadingScreenProps, SessionProvider, type SessionProviderProps, type SupportedLanguage, TokenData, type TranslationResponse, TranslationService, type TranslationsContextValue, TranslationsProvider, type TranslationsProviderProps, UseSessionOptions, crudifyAdmin, crudifyInitManager, extractSafeRedirectFromUrl, getCriticalLanguages, getCriticalTranslations, translationService, useCrudify, useCrudifyInitializer, useSessionContext, useTranslations, validateInternalRedirect };
package/dist/index.js CHANGED
@@ -3,4 +3,4 @@
3
3
  0% { transform: rotate(0deg); }
4
4
  100% { transform: rotate(360deg); }
5
5
  }
6
- `});function A({stage:e="loading",message:i}){let r=i||{initializing:"Initializing application...","validating-session":"Validating session...",loading:"Loading..."}[e];return _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[_jsxruntime.jsx.call(void 0, Ke,{}),_jsxruntime.jsxs.call(void 0, "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:[_jsxruntime.jsx.call(void 0, "div",{style:Fe}),_jsxruntime.jsx.call(void 0, "p",{style:{fontSize:"1.25em",fontWeight:"500",marginTop:"24px",color:"#1f2937"},children:r})]})]})}var _e=/^[a-zA-Z0-9\-_./\?=&%#]+$/,Be=[/^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]/,/\\/],P= exports.validateInternalRedirect =(e,i="/")=>{if(!e||typeof e!="string")return i;let t=e.trim();if(!t)return i;if(!t.startsWith("/"))return console.warn("\u{1F6A8} Open redirect blocked (relative path):",e),i;if(!_e.test(t))return console.warn("\u{1F6A8} Open redirect blocked (invalid characters):",e),i;let r=t.toLowerCase();for(let o of Be)if(o.test(r))return console.warn("\u{1F6A8} Open redirect blocked (dangerous pattern):",e),i;let n=t.split("?")[0].split("/").filter(Boolean);if(n.length===0)return t;for(let o of n)if(o===".."||o.includes(":")||o.length>100)return console.warn("\u{1F6A8} Open redirect blocked (suspicious path part):",o),i;return t},T= exports.extractSafeRedirectFromUrl =(e,i="/")=>{try{let r=(typeof e=="string"?new URLSearchParams(e):e).get("redirect");if(!r)return i;let n=decodeURIComponent(r);return P(n,i)}catch(t){return console.warn("\u{1F6A8} Error parsing redirect parameter:",t),i}};function N({children:e,loadingComponent:i,loginPath:t="/login"}){let{isAuthenticated:r,isLoading:n,isInitialized:o,tokens:s,error:a}=_chunk5TLJYWXZjs.j.call(void 0, ),c=_reactrouterdom.useLocation.call(void 0, );if(!o||n)return _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:i||_jsxruntime.jsx.call(void 0, A,{stage:"validating-session"})});let p=r&&_optionalChain([s, 'optionalAccess', _2 => _2.accessToken])&&s.accessToken.length>0;if(a||!r||!p){s&&(!s.accessToken||s.accessToken.length===0)&&localStorage.removeItem("crudify_tokens");let g=c.pathname+c.search,m=P(g),I=encodeURIComponent(m);return _jsxruntime.jsx.call(void 0, _reactrouterdom.Navigate,{to:`${t}?redirect=${I}`,replace:!0})}return _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:e})}function O({children:e,redirectTo:i="/"}){let{isAuthenticated:t}=_chunk5TLJYWXZjs.j.call(void 0, ),r=_reactrouterdom.useLocation.call(void 0, );if(t){let n=new URLSearchParams(r.search),o=T(n,i);return _jsxruntime.jsx.call(void 0, _reactrouterdom.Navigate,{to:o,replace:!0})}return _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:e})}var C=class e{constructor(){this.state={status:"UNINITIALIZED",priority:null,publicApiKey:null,env:null,error:null,initializedBy:null};this.initializationPromise=null;this.highPriorityInitializerPresent=!1;this.waitingForHighPriority=new Set;this.HIGH_PRIORITY_WAIT_TIMEOUT=100}static getInstance(){return e.instance||(e.instance=new e),e.instance}registerHighPriorityInitializer(){this.highPriorityInitializerPresent=!0}isHighPriorityInitializerPresent(){return this.highPriorityInitializerPresent}getState(){return{...this.state}}async initialize(i){let{priority:t,publicApiKey:r,env:n,enableLogging:o,requestedBy:s}=i;if(this.state.status==="INITIALIZED"){this.state.publicApiKey!==r&&console.warn(`[CrudifyInitialization] ${s} attempted to initialize with different key. Already initialized with key: ${_optionalChain([this, 'access', _3 => _3.state, 'access', _4 => _4.publicApiKey, 'optionalAccess', _5 => _5.slice, 'call', _6 => _6(0,10)])}... by ${this.state.initializedBy}`);return}if(this.initializationPromise)return o&&console.log(`[CrudifyInitialization] ${s} waiting for ongoing initialization...`),this.initializationPromise;if(t==="LOW"&&this.highPriorityInitializerPresent&&this.state.status==="UNINITIALIZED"){if(o&&console.log(`[CrudifyInitialization] ${s} (LOW priority) waiting for HIGH priority initializer...`),this.waitingForHighPriority.add(s),await this.waitForHighPriorityOrTimeout(o),this.waitingForHighPriority.delete(s),this.getState().status==="INITIALIZED"){o&&console.log(`[CrudifyInitialization] ${s} found initialization completed by HIGH priority`);return}o&&console.warn(`[CrudifyInitialization] ${s} timeout waiting for HIGH priority, initializing with LOW priority`)}t==="HIGH"&&this.state.status==="INITIALIZING"&&this.state.priority==="LOW"&&(console.warn(`[CrudifyInitialization] HIGH priority request from ${s} interrupting LOW priority initialization by ${this.state.initializedBy}`),this.state.status="UNINITIALIZED",this.initializationPromise=null),o&&console.log(`[CrudifyInitialization] ${s} starting initialization (${t} priority)...`),this.state.status="INITIALIZING",this.state.priority=t,this.state.initializedBy=s,this.initializationPromise=this.performInitialization(r,n,o);try{await this.initializationPromise,this.state.status="INITIALIZED",this.state.publicApiKey=r,this.state.env=n,this.state.error=null,o&&console.log(`[CrudifyInitialization] \u2705 Successfully initialized by ${s} (${t} priority)`)}catch(a){throw this.state.status="ERROR",this.state.error=a instanceof Error?a:new Error(String(a)),this.initializationPromise=null,console.error(`[CrudifyInitialization] \u274C Initialization failed for ${s}:`,a),a}}async waitForHighPriorityOrTimeout(i){return new Promise(t=>{let n=0,o=setInterval(()=>{if(n+=10,this.state.status==="INITIALIZED"&&this.state.priority==="HIGH"){clearInterval(o),t();return}if(this.state.status==="INITIALIZING"&&this.state.priority==="HIGH"){n=0;return}n>=this.HIGH_PRIORITY_WAIT_TIMEOUT&&(clearInterval(o),i&&console.log(`[CrudifyInitialization] Timeout waiting for HIGH priority (${this.HIGH_PRIORITY_WAIT_TIMEOUT}ms)`),t())},10)})}async performInitialization(i,t,r){let n=_crudifybrowser2.default.getTokenData();if(n&&n.endpoint){r&&console.log("[CrudifyInitialization] SDK already initialized externally");return}_crudifybrowser2.default.config(t);let o=r?"debug":"none",s=await _crudifybrowser2.default.init(i,o);if(s.success===!1)throw new Error(`Crudify initialization failed: ${JSON.stringify(s.errors||"Unknown error")}`)}reset(){this.state={status:"UNINITIALIZED",priority:null,publicApiKey:null,env:null,error:null,initializedBy:null},this.initializationPromise=null,this.highPriorityInitializerPresent=!1,this.waitingForHighPriority.clear()}isInitialized(){return this.state.status==="INITIALIZED"}getDiagnostics(){return{...this.state,waitingCount:this.waitingForHighPriority.size,waitingComponents:Array.from(this.waitingForHighPriority),hasActivePromise:this.initializationPromise!==null}}},R= exports.crudifyInitManager =C.getInstance();var D=_react.createContext.call(void 0, void 0),je= exports.CrudifyInitializer =({config:e,children:i,fallback:t=null,onInitialized:r,onError:n})=>{let[o,s]=_react.useState.call(void 0, !1),[a,c]=_react.useState.call(void 0, !1),[p,g]=_react.useState.call(void 0, null),m=_react.useRef.call(void 0, !1),I=_react.useRef.call(void 0, !1);_react.useEffect.call(void 0, ()=>{m.current||(R.registerHighPriorityInitializer(),m.current=!0),I.current||(I.current=!0,(async()=>{c(!0),g(null);try{await R.initialize({priority:"HIGH",publicApiKey:e.publicApiKey,env:e.env||"stg",enableLogging:e.enableLogging,requestedBy:"CrudifyInitializer"}),s(!0),c(!1),r&&r()}catch(z){let b=z instanceof Error?z:new Error(String(z));g(b),c(!1),n&&n(b)}})())},[e.publicApiKey,e.env,e.enableLogging,r,n]);let F={isInitialized:o,isInitializing:a,error:p};return a&&t?_jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:t}):(p&&console.error("[CrudifyInitializer] Initialization failed:",p),_jsxruntime.jsx.call(void 0, D.Provider,{value:F,children:i}))},ei= exports.useCrudifyInitializer =()=>{let e=_react.useContext.call(void 0, D);if(!e)throw new Error("useCrudifyInitializer must be used within CrudifyInitializer");return e};var _crudifyadmin = require('@nocios/crudify-admin'); var _crudifyadmin2 = _interopRequireDefault(_crudifyadmin);var G=!1,y=null;async function ti(){let i=_chunk5TLJYWXZjs.e.getInstance().getTokenInfo(),t=_optionalChain([i, 'optionalAccess', _7 => _7.apiEndpointAdmin]),r=_optionalChain([i, 'optionalAccess', _8 => _8.apiKeyEndpointAdmin]);return t&&r?{apiUrl:t,apiKey:r}:_chunk5TLJYWXZjs.a.waitForCredentials()}async function ri(){if(!G)return y||(y=(async()=>{try{let e=_chunk5TLJYWXZjs.e.getInstance(),{apiUrl:i,apiKey:t}=await ti();_crudifyadmin2.default.init({url:i,apiKey:t,getAdditionalHeaders:()=>{let r=e.getTokenInfo();return _optionalChain([r, 'optionalAccess', _9 => _9.crudifyTokens, 'optionalAccess', _10 => _10.accessToken])?{Authorization:`Bearer ${r.crudifyTokens.accessToken}`}:{}}}),G=!0}catch(e){throw y=null,console.error("[crudifyAdminWrapper] Initialization failed:",e),e}})(),y)}async function u(e){try{await ri();let i=await e();return!i.success&&_optionalChain([i, 'access', _11 => _11.errors, 'optionalAccess', _12 => _12.includes, 'call', _13 => _13("401")])?await _chunk5TLJYWXZjs.e.getInstance().refreshTokens()?await e():(console.error("[crudifyAdmin] Token refresh failed"),typeof window<"u"&&(window.location.href="/login"),i):i}catch(i){return console.error("[crudifyAdmin] Operation error:",i),{success:!1,errors:i instanceof Error?i.message:"Unknown error"}}}var oi={listModules:()=>u(()=>_crudifyadmin2.default.listModules()),getModule:e=>u(()=>_crudifyadmin2.default.getModule(e)),createModule:e=>u(()=>_crudifyadmin2.default.createModule(e)),editModule:(e,i)=>u(()=>_crudifyadmin2.default.editModule(e,i)),deleteModule:e=>u(()=>_crudifyadmin2.default.deleteModule(e)),activateModule:e=>u(()=>_crudifyadmin2.default.activateModule(e)),deactivateModule:e=>u(()=>_crudifyadmin2.default.deactivateModule(e)),getModuleVersions:e=>u(()=>_crudifyadmin2.default.getModuleVersions(e))};exports.AuthRoute = O; exports.CRITICAL_TRANSLATIONS = _chunkO3AIFSLDjs.a; exports.CrudiaAutoGenerate = _chunkO3AIFSLDjs.o; exports.CrudifyInitializationManager = C; exports.CrudifyInitializer = je; exports.CrudifyLogin = _chunkO3AIFSLDjs.h; exports.CrudifyProvider = _chunk5TLJYWXZjs.b; exports.CrudifyThemeProvider = Ue; exports.ERROR_CODES = _chunkYIIUEOXCjs.a; exports.ERROR_SEVERITY_MAP = _chunkYIIUEOXCjs.b; exports.GlobalNotificationProvider = _chunk5TLJYWXZjs.g; exports.LoginComponent = _chunkO3AIFSLDjs.m; exports.POLICY_ACTIONS = _chunkO3AIFSLDjs.j; exports.PREFERRED_POLICY_ORDER = _chunkO3AIFSLDjs.k; exports.Policies = _chunkO3AIFSLDjs.l; exports.ProtectedRoute = N; exports.SessionDebugInfo = _chunk5TLJYWXZjs.k; exports.SessionLoadingScreen = A; exports.SessionManager = _chunk5TLJYWXZjs.e; exports.SessionProvider = _chunk5TLJYWXZjs.i; exports.SessionStatus = _chunkO3AIFSLDjs.n; exports.TokenStorage = _chunk5TLJYWXZjs.d; exports.TranslationService = _chunkO3AIFSLDjs.d; exports.TranslationsProvider = _chunkO3AIFSLDjs.f; exports.UserProfileDisplay = _chunkO3AIFSLDjs.i; exports.createErrorTranslator = _chunkAT74WV5Wjs.e; exports.crudify = _crudifybrowser2.default; exports.crudifyAdmin = oi; exports.crudifyInitManager = R; exports.decodeJwtSafely = _chunkAT74WV5Wjs.h; exports.extractSafeRedirectFromUrl = T; exports.getCookie = _chunkAT74WV5Wjs.a; exports.getCriticalLanguages = _chunkO3AIFSLDjs.b; exports.getCriticalTranslations = _chunkO3AIFSLDjs.c; exports.getCurrentUserEmail = _chunkAT74WV5Wjs.i; exports.getErrorMessage = _chunkYIIUEOXCjs.e; exports.handleCrudifyError = _chunkYIIUEOXCjs.g; exports.isTokenExpired = _chunkAT74WV5Wjs.j; exports.parseApiError = _chunkYIIUEOXCjs.c; exports.parseJavaScriptError = _chunkYIIUEOXCjs.f; exports.parseTransactionError = _chunkYIIUEOXCjs.d; exports.secureLocalStorage = _chunkNNY4A73Vjs.b; exports.secureSessionStorage = _chunkNNY4A73Vjs.a; exports.translateError = _chunkAT74WV5Wjs.d; exports.translateErrorCode = _chunkAT74WV5Wjs.b; exports.translateErrorCodes = _chunkAT74WV5Wjs.c; exports.translationService = _chunkO3AIFSLDjs.e; exports.useAuth = _chunkOKKGXNWAjs.b; exports.useAutoGenerate = _chunk5TLJYWXZjs.m; exports.useCrudify = _chunk5TLJYWXZjs.c; exports.useCrudifyInitializer = ei; exports.useCrudifyWithNotifications = _chunkOKKGXNWAjs.d; exports.useData = _chunkOKKGXNWAjs.c; exports.useGlobalNotification = _chunk5TLJYWXZjs.h; exports.useSession = _chunk5TLJYWXZjs.f; exports.useSessionContext = _chunk5TLJYWXZjs.j; exports.useTranslations = _chunkO3AIFSLDjs.g; exports.useUserData = _chunkOKKGXNWAjs.a; exports.useUserProfile = _chunk5TLJYWXZjs.l; exports.validateInternalRedirect = P;
6
+ `});function v({stage:e="loading",message:i}){let r=i||{initializing:"Initializing application...","validating-session":"Validating session...",loading:"Loading..."}[e];return _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[_jsxruntime.jsx.call(void 0, Ke,{}),_jsxruntime.jsxs.call(void 0, "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:[_jsxruntime.jsx.call(void 0, "div",{style:Fe}),_jsxruntime.jsx.call(void 0, "p",{style:{fontSize:"1.25em",fontWeight:"500",marginTop:"24px",color:"#1f2937"},children:r})]})]})}var _e=/^[a-zA-Z0-9\-_./\?=&%#]+$/,Be=[/^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]/,/\\/],A= exports.validateInternalRedirect =(e,i="/")=>{if(!e||typeof e!="string")return i;let t=e.trim();if(!t)return i;if(!t.startsWith("/"))return console.warn("\u{1F6A8} Open redirect blocked (relative path):",e),i;if(!_e.test(t))return console.warn("\u{1F6A8} Open redirect blocked (invalid characters):",e),i;let r=t.toLowerCase();for(let o of Be)if(o.test(r))return console.warn("\u{1F6A8} Open redirect blocked (dangerous pattern):",e),i;let n=t.split("?")[0].split("/").filter(Boolean);if(n.length===0)return t;for(let o of n)if(o===".."||o.includes(":")||o.length>100)return console.warn("\u{1F6A8} Open redirect blocked (suspicious path part):",o),i;return t},T= exports.extractSafeRedirectFromUrl =(e,i="/")=>{try{let r=(typeof e=="string"?new URLSearchParams(e):e).get("redirect");if(!r)return i;let n=decodeURIComponent(r);return A(n,i)}catch(t){return console.warn("\u{1F6A8} Error parsing redirect parameter:",t),i}};function N({children:e,loadingComponent:i,loginPath:t="/login"}){let{isAuthenticated:r,isLoading:n,isInitialized:o,tokens:s,error:c}=_chunk5TLJYWXZjs.j.call(void 0, ),u=_reactrouterdom.useLocation.call(void 0, );if(!o||n)return _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:i||_jsxruntime.jsx.call(void 0, v,{stage:"validating-session"})});let p=r&&_optionalChain([s, 'optionalAccess', _2 => _2.accessToken])&&s.accessToken.length>0;if(c||!r||!p){s&&(!s.accessToken||s.accessToken.length===0)&&localStorage.removeItem("crudify_tokens");let g=u.pathname+u.search,I=A(g),m=encodeURIComponent(I);return _jsxruntime.jsx.call(void 0, _reactrouterdom.Navigate,{to:`${t}?redirect=${m}`,replace:!0})}return _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:e})}function O({children:e,redirectTo:i="/"}){let{isAuthenticated:t}=_chunk5TLJYWXZjs.j.call(void 0, ),r=_reactrouterdom.useLocation.call(void 0, );if(t){let n=new URLSearchParams(r.search),o=T(n,i);return _jsxruntime.jsx.call(void 0, _reactrouterdom.Navigate,{to:o,replace:!0})}return _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:e})}var R=class e{constructor(){this.state={status:"UNINITIALIZED",priority:null,publicApiKey:null,env:null,error:null,initializedBy:null};this.initializationPromise=null;this.highPriorityInitializerPresent=!1;this.waitingForHighPriority=new Set;this.HIGH_PRIORITY_WAIT_TIMEOUT=100}static getInstance(){return e.instance||(e.instance=new e),e.instance}registerHighPriorityInitializer(){this.highPriorityInitializerPresent=!0}isHighPriorityInitializerPresent(){return this.highPriorityInitializerPresent}getState(){return{...this.state}}async initialize(i){let{priority:t,publicApiKey:r,env:n,enableLogging:o,requestedBy:s}=i;if(this.state.status==="INITIALIZED"){this.state.publicApiKey!==r&&console.warn(`[CrudifyInitialization] ${s} attempted to initialize with different key. Already initialized with key: ${_optionalChain([this, 'access', _3 => _3.state, 'access', _4 => _4.publicApiKey, 'optionalAccess', _5 => _5.slice, 'call', _6 => _6(0,10)])}... by ${this.state.initializedBy}`);return}if(this.initializationPromise)return o&&console.log(`[CrudifyInitialization] ${s} waiting for ongoing initialization...`),this.initializationPromise;if(t==="LOW"&&this.highPriorityInitializerPresent&&this.state.status==="UNINITIALIZED"){if(o&&console.log(`[CrudifyInitialization] ${s} (LOW priority) waiting for HIGH priority initializer...`),this.waitingForHighPriority.add(s),await this.waitForHighPriorityOrTimeout(o),this.waitingForHighPriority.delete(s),this.getState().status==="INITIALIZED"){o&&console.log(`[CrudifyInitialization] ${s} found initialization completed by HIGH priority`);return}o&&console.warn(`[CrudifyInitialization] ${s} timeout waiting for HIGH priority, initializing with LOW priority`)}t==="HIGH"&&this.state.status==="INITIALIZING"&&this.state.priority==="LOW"&&(console.warn(`[CrudifyInitialization] HIGH priority request from ${s} interrupting LOW priority initialization by ${this.state.initializedBy}`),this.state.status="UNINITIALIZED",this.initializationPromise=null),o&&console.log(`[CrudifyInitialization] ${s} starting initialization (${t} priority)...`),this.state.status="INITIALIZING",this.state.priority=t,this.state.initializedBy=s,this.initializationPromise=this.performInitialization(r,n,o);try{await this.initializationPromise,this.state.status="INITIALIZED",this.state.publicApiKey=r,this.state.env=n,this.state.error=null,o&&console.log(`[CrudifyInitialization] \u2705 Successfully initialized by ${s} (${t} priority)`)}catch(c){throw this.state.status="ERROR",this.state.error=c instanceof Error?c:new Error(String(c)),this.initializationPromise=null,console.error(`[CrudifyInitialization] \u274C Initialization failed for ${s}:`,c),c}}async waitForHighPriorityOrTimeout(i){return new Promise(t=>{let n=0,o=setInterval(()=>{if(n+=10,this.state.status==="INITIALIZED"&&this.state.priority==="HIGH"){clearInterval(o),t();return}if(this.state.status==="INITIALIZING"&&this.state.priority==="HIGH"){n=0;return}n>=this.HIGH_PRIORITY_WAIT_TIMEOUT&&(clearInterval(o),i&&console.log(`[CrudifyInitialization] Timeout waiting for HIGH priority (${this.HIGH_PRIORITY_WAIT_TIMEOUT}ms)`),t())},10)})}async performInitialization(i,t,r){let n=_crudifybrowser2.default.getTokenData();if(n&&n.endpoint){r&&console.log("[CrudifyInitialization] SDK already initialized externally");return}_crudifybrowser2.default.config(t);let o=r?"debug":"none",s=await _crudifybrowser2.default.init(i,o);if(s.success===!1)throw new Error(`Crudify initialization failed: ${JSON.stringify(s.errors||"Unknown error")}`)}reset(){this.state={status:"UNINITIALIZED",priority:null,publicApiKey:null,env:null,error:null,initializedBy:null},this.initializationPromise=null,this.highPriorityInitializerPresent=!1,this.waitingForHighPriority.clear()}isInitialized(){return this.state.status==="INITIALIZED"}getDiagnostics(){return{...this.state,waitingCount:this.waitingForHighPriority.size,waitingComponents:Array.from(this.waitingForHighPriority),hasActivePromise:this.initializationPromise!==null}}},C= exports.crudifyInitManager =R.getInstance();var D=_react.createContext.call(void 0, void 0),je= exports.CrudifyInitializer =({config:e,children:i,fallback:t=null,onInitialized:r,onError:n})=>{let[o,s]=_react.useState.call(void 0, !1),[c,u]=_react.useState.call(void 0, !1),[p,g]=_react.useState.call(void 0, null),I=_react.useRef.call(void 0, !1),m=_react.useRef.call(void 0, !1);_react.useEffect.call(void 0, ()=>{I.current||(C.registerHighPriorityInitializer(),I.current=!0),m.current||(m.current=!0,(async()=>{u(!0),g(null);try{await C.initialize({priority:"HIGH",publicApiKey:e.publicApiKey,env:e.env||"stg",enableLogging:e.enableLogging,requestedBy:"CrudifyInitializer"}),s(!0),u(!1),r&&r()}catch(x){let w=x instanceof Error?x:new Error(String(x));g(w),u(!1),n&&n(w)}})())},[e.publicApiKey,e.env,e.enableLogging,r,n]);let F={isInitialized:o,isInitializing:c,error:p};return c&&t?_jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:t}):(p&&console.error("[CrudifyInitializer] Initialization failed:",p),_jsxruntime.jsx.call(void 0, D.Provider,{value:F,children:i}))},ei= exports.useCrudifyInitializer =()=>{let e=_react.useContext.call(void 0, D);if(!e)throw new Error("useCrudifyInitializer must be used within CrudifyInitializer");return e};var _crudifyadmin = require('@nocios/crudify-admin'); var _crudifyadmin2 = _interopRequireDefault(_crudifyadmin);var G=!1,y=null;async function ti(){let i=_chunk5TLJYWXZjs.e.getInstance().getTokenInfo(),t=_optionalChain([i, 'optionalAccess', _7 => _7.apiEndpointAdmin]),r=_optionalChain([i, 'optionalAccess', _8 => _8.apiKeyEndpointAdmin]);return t&&r?{apiUrl:t,apiKey:r}:_chunk5TLJYWXZjs.a.waitForCredentials()}async function ri(){if(!G)return y||(y=(async()=>{try{let e=_chunk5TLJYWXZjs.e.getInstance(),{apiUrl:i,apiKey:t}=await ti();_crudifyadmin2.default.init({url:i,apiKey:t,getAdditionalHeaders:()=>{let r=e.getTokenInfo();return _optionalChain([r, 'optionalAccess', _9 => _9.crudifyTokens, 'optionalAccess', _10 => _10.accessToken])?{Authorization:`Bearer ${r.crudifyTokens.accessToken}`}:{}}}),G=!0}catch(e){throw y=null,console.error("[crudifyAdminWrapper] Initialization failed:",e),e}})(),y)}async function l(e){try{await ri();let i=await e();return!i.success&&_optionalChain([i, 'access', _11 => _11.errors, 'optionalAccess', _12 => _12.includes, 'call', _13 => _13("401")])?await _chunk5TLJYWXZjs.e.getInstance().refreshTokens()?await e():(console.error("[crudifyAdmin] Token refresh failed"),typeof window<"u"&&(window.location.href="/login"),i):i}catch(i){return console.error("[crudifyAdmin] Operation error:",i),{success:!1,errors:i instanceof Error?i.message:"Unknown error"}}}var oi={listModules:()=>l(()=>_crudifyadmin2.default.listModules()),getModule:e=>l(()=>_crudifyadmin2.default.getModule(e)),createModule:e=>l(()=>_crudifyadmin2.default.createModule(e)),editModule:(e,i)=>l(()=>_crudifyadmin2.default.editModule(e,i)),deleteModule:e=>l(()=>_crudifyadmin2.default.deleteModule(e)),activateModule:e=>l(()=>_crudifyadmin2.default.activateModule(e)),deactivateModule:e=>l(()=>_crudifyadmin2.default.deactivateModule(e)),getModuleVersions:e=>l(()=>_crudifyadmin2.default.getModuleVersions(e)),listActions:e=>l(()=>_crudifyadmin2.default.listActions(e)),getAction:e=>l(()=>_crudifyadmin2.default.getAction(e)),createAction:e=>l(()=>_crudifyadmin2.default.createAction(e)),editAction:(e,i)=>l(()=>_crudifyadmin2.default.editAction(e,i)),deleteAction:e=>l(()=>_crudifyadmin2.default.deleteAction(e)),activateAction:e=>l(()=>_crudifyadmin2.default.activateAction(e)),deactivateAction:e=>l(()=>_crudifyadmin2.default.deactivateAction(e)),getActionVersions:e=>l(()=>_crudifyadmin2.default.getActionVersions(e))};exports.AuthRoute = O; exports.CRITICAL_TRANSLATIONS = _chunkO3AIFSLDjs.a; exports.CrudiaAutoGenerate = _chunkO3AIFSLDjs.o; exports.CrudifyInitializationManager = R; exports.CrudifyInitializer = je; exports.CrudifyLogin = _chunkO3AIFSLDjs.h; exports.CrudifyProvider = _chunk5TLJYWXZjs.b; exports.CrudifyThemeProvider = Ue; exports.ERROR_CODES = _chunkYIIUEOXCjs.a; exports.ERROR_SEVERITY_MAP = _chunkYIIUEOXCjs.b; exports.GlobalNotificationProvider = _chunk5TLJYWXZjs.g; exports.LoginComponent = _chunkO3AIFSLDjs.m; exports.POLICY_ACTIONS = _chunkO3AIFSLDjs.j; exports.PREFERRED_POLICY_ORDER = _chunkO3AIFSLDjs.k; exports.Policies = _chunkO3AIFSLDjs.l; exports.ProtectedRoute = N; exports.SessionDebugInfo = _chunk5TLJYWXZjs.k; exports.SessionLoadingScreen = v; exports.SessionManager = _chunk5TLJYWXZjs.e; exports.SessionProvider = _chunk5TLJYWXZjs.i; exports.SessionStatus = _chunkO3AIFSLDjs.n; exports.TokenStorage = _chunk5TLJYWXZjs.d; exports.TranslationService = _chunkO3AIFSLDjs.d; exports.TranslationsProvider = _chunkO3AIFSLDjs.f; exports.UserProfileDisplay = _chunkO3AIFSLDjs.i; exports.createErrorTranslator = _chunkAT74WV5Wjs.e; exports.crudify = _crudifybrowser2.default; exports.crudifyAdmin = oi; exports.crudifyInitManager = C; exports.decodeJwtSafely = _chunkAT74WV5Wjs.h; exports.extractSafeRedirectFromUrl = T; exports.getCookie = _chunkAT74WV5Wjs.a; exports.getCriticalLanguages = _chunkO3AIFSLDjs.b; exports.getCriticalTranslations = _chunkO3AIFSLDjs.c; exports.getCurrentUserEmail = _chunkAT74WV5Wjs.i; exports.getErrorMessage = _chunkYIIUEOXCjs.e; exports.handleCrudifyError = _chunkYIIUEOXCjs.g; exports.isTokenExpired = _chunkAT74WV5Wjs.j; exports.parseApiError = _chunkYIIUEOXCjs.c; exports.parseJavaScriptError = _chunkYIIUEOXCjs.f; exports.parseTransactionError = _chunkYIIUEOXCjs.d; exports.secureLocalStorage = _chunkNNY4A73Vjs.b; exports.secureSessionStorage = _chunkNNY4A73Vjs.a; exports.translateError = _chunkAT74WV5Wjs.d; exports.translateErrorCode = _chunkAT74WV5Wjs.b; exports.translateErrorCodes = _chunkAT74WV5Wjs.c; exports.translationService = _chunkO3AIFSLDjs.e; exports.useAuth = _chunkOKKGXNWAjs.b; exports.useAutoGenerate = _chunk5TLJYWXZjs.m; exports.useCrudify = _chunk5TLJYWXZjs.c; exports.useCrudifyInitializer = ei; exports.useCrudifyWithNotifications = _chunkOKKGXNWAjs.d; exports.useData = _chunkOKKGXNWAjs.c; exports.useGlobalNotification = _chunk5TLJYWXZjs.h; exports.useSession = _chunk5TLJYWXZjs.f; exports.useSessionContext = _chunk5TLJYWXZjs.j; exports.useTranslations = _chunkO3AIFSLDjs.g; exports.useUserData = _chunkOKKGXNWAjs.a; exports.useUserProfile = _chunk5TLJYWXZjs.l; exports.validateInternalRedirect = A;
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
- import{a as K,b as $,c as _,d as B,e as Z,f as W,g as V,h as me,i as he,j as Pe,k as xe,l as Ce,m as Re,n as ze,o as Ae}from"./chunk-CZ76PERQ.mjs";import{a as Te,b as Se,c as we,d as Le}from"./chunk-G6A5EVA6.mjs";import{a as E,b as q,c as Y,d as J,e as d,f as ie,g as ne,h as se,i as ae,j as f,k as le,l as Ie,m as ve}from"./chunk-NEPYABGC.mjs";import{a as be,b as Ee}from"./chunk-T2CPA46I.mjs";import{a as ue,b as ce,c as pe,d as de,e as fe,f as ye,g as ge}from"./chunk-BJ6PIVZR.mjs";import{a as v,b as Q,c as X,d as j,e as ee,h as te,i as re,j as oe}from"./chunk-5JKS55SE.mjs";import{default as Bi}from"@nocios/crudify-browser";export*from"@nocios/crudify-browser";import{useMemo as Me}from"react";import{ThemeProvider as Ne,createTheme as ke,CssBaseline as Oe}from"@mui/material";import{jsx as De,jsxs as Ge}from"react/jsx-runtime";var He=(e={})=>{try{let i=v("theme");if(i){let t=JSON.parse(decodeURIComponent(i));return{...e,...t}}}catch(i){console.warn("Error parsing theme from cookie:",i)}return e};function Ue({children:e,defaultTheme:i={},disableCssBaseline:t=!1}){let r=Me(()=>{let n=He(i);return ke(n)},[i]);return Ge(Ne,{theme:r,children:[!t&&De(Oe,{}),e]})}import{Navigate as Ze,useLocation as We}from"react-router-dom";import{Fragment as $e,jsx as h,jsxs as L}from"react/jsx-runtime";var Fe={border:"5px solid rgba(0, 0, 0, 0.1)",borderTopColor:"#3B82F6",borderRadius:"50%",width:"50px",height:"50px",animation:"spin 1s linear infinite"},Ke=()=>h("style",{children:`
1
+ import{a as K,b as $,c as _,d as B,e as Z,f as V,g as W,h as Ie,i as he,j as Ae,k as Pe,l as Re,m as Ce,n as xe,o as ve}from"./chunk-CZ76PERQ.mjs";import{a as Te,b as Se,c as Ee,d as Le}from"./chunk-G6A5EVA6.mjs";import{a as b,b as q,c as Y,d as J,e as d,f as ie,g as ne,h as se,i as ae,j as f,k as le,l as me,m as ze}from"./chunk-NEPYABGC.mjs";import{a as we,b as be}from"./chunk-T2CPA46I.mjs";import{a as ce,b as ue,c as pe,d as de,e as fe,f as ye,g as ge}from"./chunk-BJ6PIVZR.mjs";import{a as z,b as Q,c as X,d as j,e as ee,h as te,i as re,j as oe}from"./chunk-5JKS55SE.mjs";import{default as Bi}from"@nocios/crudify-browser";export*from"@nocios/crudify-browser";import{useMemo as Me}from"react";import{ThemeProvider as Ne,createTheme as ke,CssBaseline as Oe}from"@mui/material";import{jsx as De,jsxs as Ge}from"react/jsx-runtime";var He=(e={})=>{try{let i=z("theme");if(i){let t=JSON.parse(decodeURIComponent(i));return{...e,...t}}}catch(i){console.warn("Error parsing theme from cookie:",i)}return e};function Ue({children:e,defaultTheme:i={},disableCssBaseline:t=!1}){let r=Me(()=>{let n=He(i);return ke(n)},[i]);return Ge(Ne,{theme:r,children:[!t&&De(Oe,{}),e]})}import{Navigate as Ze,useLocation as Ve}from"react-router-dom";import{Fragment as $e,jsx as h,jsxs as L}from"react/jsx-runtime";var Fe={border:"5px solid rgba(0, 0, 0, 0.1)",borderTopColor:"#3B82F6",borderRadius:"50%",width:"50px",height:"50px",animation:"spin 1s linear infinite"},Ke=()=>h("style",{children:`
2
2
  @keyframes spin {
3
3
  0% { transform: rotate(0deg); }
4
4
  100% { transform: rotate(360deg); }
5
5
  }
6
- `});function A({stage:e="loading",message:i}){let r=i||{initializing:"Initializing application...","validating-session":"Validating session...",loading:"Loading..."}[e];return L($e,{children:[h(Ke,{}),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:Fe}),h("p",{style:{fontSize:"1.25em",fontWeight:"500",marginTop:"24px",color:"#1f2937"},children:r})]})]})}var _e=/^[a-zA-Z0-9\-_./\?=&%#]+$/,Be=[/^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]/,/\\/],P=(e,i="/")=>{if(!e||typeof e!="string")return i;let t=e.trim();if(!t)return i;if(!t.startsWith("/"))return console.warn("\u{1F6A8} Open redirect blocked (relative path):",e),i;if(!_e.test(t))return console.warn("\u{1F6A8} Open redirect blocked (invalid characters):",e),i;let r=t.toLowerCase();for(let o of Be)if(o.test(r))return console.warn("\u{1F6A8} Open redirect blocked (dangerous pattern):",e),i;let n=t.split("?")[0].split("/").filter(Boolean);if(n.length===0)return t;for(let o of n)if(o===".."||o.includes(":")||o.length>100)return console.warn("\u{1F6A8} Open redirect blocked (suspicious path part):",o),i;return t},T=(e,i="/")=>{try{let r=(typeof e=="string"?new URLSearchParams(e):e).get("redirect");if(!r)return i;let n=decodeURIComponent(r);return P(n,i)}catch(t){return console.warn("\u{1F6A8} Error parsing redirect parameter:",t),i}};import{Fragment as M,jsx as x}from"react/jsx-runtime";function N({children:e,loadingComponent:i,loginPath:t="/login"}){let{isAuthenticated:r,isLoading:n,isInitialized:o,tokens:s,error:a}=f(),c=We();if(!o||n)return x(M,{children:i||x(A,{stage:"validating-session"})});let p=r&&s?.accessToken&&s.accessToken.length>0;if(a||!r||!p){s&&(!s.accessToken||s.accessToken.length===0)&&localStorage.removeItem("crudify_tokens");let g=c.pathname+c.search,m=P(g),I=encodeURIComponent(m);return x(Ze,{to:`${t}?redirect=${I}`,replace:!0})}return x(M,{children:e})}import{Navigate as Ve,useLocation as qe}from"react-router-dom";import{Fragment as Ye,jsx as k}from"react/jsx-runtime";function O({children:e,redirectTo:i="/"}){let{isAuthenticated:t}=f(),r=qe();if(t){let n=new URLSearchParams(r.search),o=T(n,i);return k(Ve,{to:o,replace:!0})}return k(Ye,{children:e})}import S from"@nocios/crudify-browser";var C=class e{constructor(){this.state={status:"UNINITIALIZED",priority:null,publicApiKey:null,env:null,error:null,initializedBy:null};this.initializationPromise=null;this.highPriorityInitializerPresent=!1;this.waitingForHighPriority=new Set;this.HIGH_PRIORITY_WAIT_TIMEOUT=100}static getInstance(){return e.instance||(e.instance=new e),e.instance}registerHighPriorityInitializer(){this.highPriorityInitializerPresent=!0}isHighPriorityInitializerPresent(){return this.highPriorityInitializerPresent}getState(){return{...this.state}}async initialize(i){let{priority:t,publicApiKey:r,env:n,enableLogging:o,requestedBy:s}=i;if(this.state.status==="INITIALIZED"){this.state.publicApiKey!==r&&console.warn(`[CrudifyInitialization] ${s} attempted to initialize with different key. Already initialized with key: ${this.state.publicApiKey?.slice(0,10)}... by ${this.state.initializedBy}`);return}if(this.initializationPromise)return o&&console.log(`[CrudifyInitialization] ${s} waiting for ongoing initialization...`),this.initializationPromise;if(t==="LOW"&&this.highPriorityInitializerPresent&&this.state.status==="UNINITIALIZED"){if(o&&console.log(`[CrudifyInitialization] ${s} (LOW priority) waiting for HIGH priority initializer...`),this.waitingForHighPriority.add(s),await this.waitForHighPriorityOrTimeout(o),this.waitingForHighPriority.delete(s),this.getState().status==="INITIALIZED"){o&&console.log(`[CrudifyInitialization] ${s} found initialization completed by HIGH priority`);return}o&&console.warn(`[CrudifyInitialization] ${s} timeout waiting for HIGH priority, initializing with LOW priority`)}t==="HIGH"&&this.state.status==="INITIALIZING"&&this.state.priority==="LOW"&&(console.warn(`[CrudifyInitialization] HIGH priority request from ${s} interrupting LOW priority initialization by ${this.state.initializedBy}`),this.state.status="UNINITIALIZED",this.initializationPromise=null),o&&console.log(`[CrudifyInitialization] ${s} starting initialization (${t} priority)...`),this.state.status="INITIALIZING",this.state.priority=t,this.state.initializedBy=s,this.initializationPromise=this.performInitialization(r,n,o);try{await this.initializationPromise,this.state.status="INITIALIZED",this.state.publicApiKey=r,this.state.env=n,this.state.error=null,o&&console.log(`[CrudifyInitialization] \u2705 Successfully initialized by ${s} (${t} priority)`)}catch(a){throw this.state.status="ERROR",this.state.error=a instanceof Error?a:new Error(String(a)),this.initializationPromise=null,console.error(`[CrudifyInitialization] \u274C Initialization failed for ${s}:`,a),a}}async waitForHighPriorityOrTimeout(i){return new Promise(t=>{let n=0,o=setInterval(()=>{if(n+=10,this.state.status==="INITIALIZED"&&this.state.priority==="HIGH"){clearInterval(o),t();return}if(this.state.status==="INITIALIZING"&&this.state.priority==="HIGH"){n=0;return}n>=this.HIGH_PRIORITY_WAIT_TIMEOUT&&(clearInterval(o),i&&console.log(`[CrudifyInitialization] Timeout waiting for HIGH priority (${this.HIGH_PRIORITY_WAIT_TIMEOUT}ms)`),t())},10)})}async performInitialization(i,t,r){let n=S.getTokenData();if(n&&n.endpoint){r&&console.log("[CrudifyInitialization] SDK already initialized externally");return}S.config(t);let o=r?"debug":"none",s=await S.init(i,o);if(s.success===!1)throw new Error(`Crudify initialization failed: ${JSON.stringify(s.errors||"Unknown error")}`)}reset(){this.state={status:"UNINITIALIZED",priority:null,publicApiKey:null,env:null,error:null,initializedBy:null},this.initializationPromise=null,this.highPriorityInitializerPresent=!1,this.waitingForHighPriority.clear()}isInitialized(){return this.state.status==="INITIALIZED"}getDiagnostics(){return{...this.state,waitingCount:this.waitingForHighPriority.size,waitingComponents:Array.from(this.waitingForHighPriority),hasActivePromise:this.initializationPromise!==null}}},R=C.getInstance();import{createContext as Je,useContext as Qe,useEffect as Xe,useRef as H,useState as w}from"react";import{Fragment as ii,jsx as U}from"react/jsx-runtime";var D=Je(void 0),je=({config:e,children:i,fallback:t=null,onInitialized:r,onError:n})=>{let[o,s]=w(!1),[a,c]=w(!1),[p,g]=w(null),m=H(!1),I=H(!1);Xe(()=>{m.current||(R.registerHighPriorityInitializer(),m.current=!0),I.current||(I.current=!0,(async()=>{c(!0),g(null);try{await R.initialize({priority:"HIGH",publicApiKey:e.publicApiKey,env:e.env||"stg",enableLogging:e.enableLogging,requestedBy:"CrudifyInitializer"}),s(!0),c(!1),r&&r()}catch(z){let b=z instanceof Error?z:new Error(String(z));g(b),c(!1),n&&n(b)}})())},[e.publicApiKey,e.env,e.enableLogging,r,n]);let F={isInitialized:o,isInitializing:a,error:p};return a&&t?U(ii,{children:t}):(p&&console.error("[CrudifyInitializer] Initialization failed:",p),U(D.Provider,{value:F,children:i}))},ei=()=>{let e=Qe(D);if(!e)throw new Error("useCrudifyInitializer must be used within CrudifyInitializer");return e};import l from"@nocios/crudify-admin";var G=!1,y=null;async function ti(){let i=d.getInstance().getTokenInfo(),t=i?.apiEndpointAdmin,r=i?.apiKeyEndpointAdmin;return t&&r?{apiUrl:t,apiKey:r}:E.waitForCredentials()}async function ri(){if(!G)return y||(y=(async()=>{try{let e=d.getInstance(),{apiUrl:i,apiKey:t}=await ti();l.init({url:i,apiKey:t,getAdditionalHeaders:()=>{let r=e.getTokenInfo();return r?.crudifyTokens?.accessToken?{Authorization:`Bearer ${r.crudifyTokens.accessToken}`}:{}}}),G=!0}catch(e){throw y=null,console.error("[crudifyAdminWrapper] Initialization failed:",e),e}})(),y)}async function u(e){try{await ri();let i=await e();return!i.success&&i.errors?.includes("401")?await d.getInstance().refreshTokens()?await e():(console.error("[crudifyAdmin] Token refresh failed"),typeof window<"u"&&(window.location.href="/login"),i):i}catch(i){return console.error("[crudifyAdmin] Operation error:",i),{success:!1,errors:i instanceof Error?i.message:"Unknown error"}}}var oi={listModules:()=>u(()=>l.listModules()),getModule:e=>u(()=>l.getModule(e)),createModule:e=>u(()=>l.createModule(e)),editModule:(e,i)=>u(()=>l.editModule(e,i)),deleteModule:e=>u(()=>l.deleteModule(e)),activateModule:e=>u(()=>l.activateModule(e)),deactivateModule:e=>u(()=>l.deactivateModule(e)),getModuleVersions:e=>u(()=>l.getModuleVersions(e))};export{O as AuthRoute,K as CRITICAL_TRANSLATIONS,Ae as CrudiaAutoGenerate,C as CrudifyInitializationManager,je as CrudifyInitializer,me as CrudifyLogin,q as CrudifyProvider,Ue as CrudifyThemeProvider,ue as ERROR_CODES,ce as ERROR_SEVERITY_MAP,ne as GlobalNotificationProvider,Re as LoginComponent,Pe as POLICY_ACTIONS,xe as PREFERRED_POLICY_ORDER,Ce as Policies,N as ProtectedRoute,le as SessionDebugInfo,A as SessionLoadingScreen,d as SessionManager,ae as SessionProvider,ze as SessionStatus,J as TokenStorage,B as TranslationService,W as TranslationsProvider,he as UserProfileDisplay,ee as createErrorTranslator,Bi as crudify,oi as crudifyAdmin,R as crudifyInitManager,te as decodeJwtSafely,T as extractSafeRedirectFromUrl,v as getCookie,$ as getCriticalLanguages,_ as getCriticalTranslations,re as getCurrentUserEmail,fe as getErrorMessage,ge as handleCrudifyError,oe as isTokenExpired,pe as parseApiError,ye as parseJavaScriptError,de as parseTransactionError,Ee as secureLocalStorage,be as secureSessionStorage,j as translateError,Q as translateErrorCode,X as translateErrorCodes,Z as translationService,Se as useAuth,ve as useAutoGenerate,Y as useCrudify,ei as useCrudifyInitializer,Le as useCrudifyWithNotifications,we as useData,se as useGlobalNotification,ie as useSession,f as useSessionContext,V as useTranslations,Te as useUserData,Ie as useUserProfile,P as validateInternalRedirect};
6
+ `});function v({stage:e="loading",message:i}){let r=i||{initializing:"Initializing application...","validating-session":"Validating session...",loading:"Loading..."}[e];return L($e,{children:[h(Ke,{}),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:Fe}),h("p",{style:{fontSize:"1.25em",fontWeight:"500",marginTop:"24px",color:"#1f2937"},children:r})]})]})}var _e=/^[a-zA-Z0-9\-_./\?=&%#]+$/,Be=[/^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]/,/\\/],A=(e,i="/")=>{if(!e||typeof e!="string")return i;let t=e.trim();if(!t)return i;if(!t.startsWith("/"))return console.warn("\u{1F6A8} Open redirect blocked (relative path):",e),i;if(!_e.test(t))return console.warn("\u{1F6A8} Open redirect blocked (invalid characters):",e),i;let r=t.toLowerCase();for(let o of Be)if(o.test(r))return console.warn("\u{1F6A8} Open redirect blocked (dangerous pattern):",e),i;let n=t.split("?")[0].split("/").filter(Boolean);if(n.length===0)return t;for(let o of n)if(o===".."||o.includes(":")||o.length>100)return console.warn("\u{1F6A8} Open redirect blocked (suspicious path part):",o),i;return t},T=(e,i="/")=>{try{let r=(typeof e=="string"?new URLSearchParams(e):e).get("redirect");if(!r)return i;let n=decodeURIComponent(r);return A(n,i)}catch(t){return console.warn("\u{1F6A8} Error parsing redirect parameter:",t),i}};import{Fragment as M,jsx as P}from"react/jsx-runtime";function N({children:e,loadingComponent:i,loginPath:t="/login"}){let{isAuthenticated:r,isLoading:n,isInitialized:o,tokens:s,error:c}=f(),u=Ve();if(!o||n)return P(M,{children:i||P(v,{stage:"validating-session"})});let p=r&&s?.accessToken&&s.accessToken.length>0;if(c||!r||!p){s&&(!s.accessToken||s.accessToken.length===0)&&localStorage.removeItem("crudify_tokens");let g=u.pathname+u.search,I=A(g),m=encodeURIComponent(I);return P(Ze,{to:`${t}?redirect=${m}`,replace:!0})}return P(M,{children:e})}import{Navigate as We,useLocation as qe}from"react-router-dom";import{Fragment as Ye,jsx as k}from"react/jsx-runtime";function O({children:e,redirectTo:i="/"}){let{isAuthenticated:t}=f(),r=qe();if(t){let n=new URLSearchParams(r.search),o=T(n,i);return k(We,{to:o,replace:!0})}return k(Ye,{children:e})}import S from"@nocios/crudify-browser";var R=class e{constructor(){this.state={status:"UNINITIALIZED",priority:null,publicApiKey:null,env:null,error:null,initializedBy:null};this.initializationPromise=null;this.highPriorityInitializerPresent=!1;this.waitingForHighPriority=new Set;this.HIGH_PRIORITY_WAIT_TIMEOUT=100}static getInstance(){return e.instance||(e.instance=new e),e.instance}registerHighPriorityInitializer(){this.highPriorityInitializerPresent=!0}isHighPriorityInitializerPresent(){return this.highPriorityInitializerPresent}getState(){return{...this.state}}async initialize(i){let{priority:t,publicApiKey:r,env:n,enableLogging:o,requestedBy:s}=i;if(this.state.status==="INITIALIZED"){this.state.publicApiKey!==r&&console.warn(`[CrudifyInitialization] ${s} attempted to initialize with different key. Already initialized with key: ${this.state.publicApiKey?.slice(0,10)}... by ${this.state.initializedBy}`);return}if(this.initializationPromise)return o&&console.log(`[CrudifyInitialization] ${s} waiting for ongoing initialization...`),this.initializationPromise;if(t==="LOW"&&this.highPriorityInitializerPresent&&this.state.status==="UNINITIALIZED"){if(o&&console.log(`[CrudifyInitialization] ${s} (LOW priority) waiting for HIGH priority initializer...`),this.waitingForHighPriority.add(s),await this.waitForHighPriorityOrTimeout(o),this.waitingForHighPriority.delete(s),this.getState().status==="INITIALIZED"){o&&console.log(`[CrudifyInitialization] ${s} found initialization completed by HIGH priority`);return}o&&console.warn(`[CrudifyInitialization] ${s} timeout waiting for HIGH priority, initializing with LOW priority`)}t==="HIGH"&&this.state.status==="INITIALIZING"&&this.state.priority==="LOW"&&(console.warn(`[CrudifyInitialization] HIGH priority request from ${s} interrupting LOW priority initialization by ${this.state.initializedBy}`),this.state.status="UNINITIALIZED",this.initializationPromise=null),o&&console.log(`[CrudifyInitialization] ${s} starting initialization (${t} priority)...`),this.state.status="INITIALIZING",this.state.priority=t,this.state.initializedBy=s,this.initializationPromise=this.performInitialization(r,n,o);try{await this.initializationPromise,this.state.status="INITIALIZED",this.state.publicApiKey=r,this.state.env=n,this.state.error=null,o&&console.log(`[CrudifyInitialization] \u2705 Successfully initialized by ${s} (${t} priority)`)}catch(c){throw this.state.status="ERROR",this.state.error=c instanceof Error?c:new Error(String(c)),this.initializationPromise=null,console.error(`[CrudifyInitialization] \u274C Initialization failed for ${s}:`,c),c}}async waitForHighPriorityOrTimeout(i){return new Promise(t=>{let n=0,o=setInterval(()=>{if(n+=10,this.state.status==="INITIALIZED"&&this.state.priority==="HIGH"){clearInterval(o),t();return}if(this.state.status==="INITIALIZING"&&this.state.priority==="HIGH"){n=0;return}n>=this.HIGH_PRIORITY_WAIT_TIMEOUT&&(clearInterval(o),i&&console.log(`[CrudifyInitialization] Timeout waiting for HIGH priority (${this.HIGH_PRIORITY_WAIT_TIMEOUT}ms)`),t())},10)})}async performInitialization(i,t,r){let n=S.getTokenData();if(n&&n.endpoint){r&&console.log("[CrudifyInitialization] SDK already initialized externally");return}S.config(t);let o=r?"debug":"none",s=await S.init(i,o);if(s.success===!1)throw new Error(`Crudify initialization failed: ${JSON.stringify(s.errors||"Unknown error")}`)}reset(){this.state={status:"UNINITIALIZED",priority:null,publicApiKey:null,env:null,error:null,initializedBy:null},this.initializationPromise=null,this.highPriorityInitializerPresent=!1,this.waitingForHighPriority.clear()}isInitialized(){return this.state.status==="INITIALIZED"}getDiagnostics(){return{...this.state,waitingCount:this.waitingForHighPriority.size,waitingComponents:Array.from(this.waitingForHighPriority),hasActivePromise:this.initializationPromise!==null}}},C=R.getInstance();import{createContext as Je,useContext as Qe,useEffect as Xe,useRef as H,useState as E}from"react";import{Fragment as ii,jsx as U}from"react/jsx-runtime";var D=Je(void 0),je=({config:e,children:i,fallback:t=null,onInitialized:r,onError:n})=>{let[o,s]=E(!1),[c,u]=E(!1),[p,g]=E(null),I=H(!1),m=H(!1);Xe(()=>{I.current||(C.registerHighPriorityInitializer(),I.current=!0),m.current||(m.current=!0,(async()=>{u(!0),g(null);try{await C.initialize({priority:"HIGH",publicApiKey:e.publicApiKey,env:e.env||"stg",enableLogging:e.enableLogging,requestedBy:"CrudifyInitializer"}),s(!0),u(!1),r&&r()}catch(x){let w=x instanceof Error?x:new Error(String(x));g(w),u(!1),n&&n(w)}})())},[e.publicApiKey,e.env,e.enableLogging,r,n]);let F={isInitialized:o,isInitializing:c,error:p};return c&&t?U(ii,{children:t}):(p&&console.error("[CrudifyInitializer] Initialization failed:",p),U(D.Provider,{value:F,children:i}))},ei=()=>{let e=Qe(D);if(!e)throw new Error("useCrudifyInitializer must be used within CrudifyInitializer");return e};import a from"@nocios/crudify-admin";var G=!1,y=null;async function ti(){let i=d.getInstance().getTokenInfo(),t=i?.apiEndpointAdmin,r=i?.apiKeyEndpointAdmin;return t&&r?{apiUrl:t,apiKey:r}:b.waitForCredentials()}async function ri(){if(!G)return y||(y=(async()=>{try{let e=d.getInstance(),{apiUrl:i,apiKey:t}=await ti();a.init({url:i,apiKey:t,getAdditionalHeaders:()=>{let r=e.getTokenInfo();return r?.crudifyTokens?.accessToken?{Authorization:`Bearer ${r.crudifyTokens.accessToken}`}:{}}}),G=!0}catch(e){throw y=null,console.error("[crudifyAdminWrapper] Initialization failed:",e),e}})(),y)}async function l(e){try{await ri();let i=await e();return!i.success&&i.errors?.includes("401")?await d.getInstance().refreshTokens()?await e():(console.error("[crudifyAdmin] Token refresh failed"),typeof window<"u"&&(window.location.href="/login"),i):i}catch(i){return console.error("[crudifyAdmin] Operation error:",i),{success:!1,errors:i instanceof Error?i.message:"Unknown error"}}}var oi={listModules:()=>l(()=>a.listModules()),getModule:e=>l(()=>a.getModule(e)),createModule:e=>l(()=>a.createModule(e)),editModule:(e,i)=>l(()=>a.editModule(e,i)),deleteModule:e=>l(()=>a.deleteModule(e)),activateModule:e=>l(()=>a.activateModule(e)),deactivateModule:e=>l(()=>a.deactivateModule(e)),getModuleVersions:e=>l(()=>a.getModuleVersions(e)),listActions:e=>l(()=>a.listActions(e)),getAction:e=>l(()=>a.getAction(e)),createAction:e=>l(()=>a.createAction(e)),editAction:(e,i)=>l(()=>a.editAction(e,i)),deleteAction:e=>l(()=>a.deleteAction(e)),activateAction:e=>l(()=>a.activateAction(e)),deactivateAction:e=>l(()=>a.deactivateAction(e)),getActionVersions:e=>l(()=>a.getActionVersions(e))};export{O as AuthRoute,K as CRITICAL_TRANSLATIONS,ve as CrudiaAutoGenerate,R as CrudifyInitializationManager,je as CrudifyInitializer,Ie as CrudifyLogin,q as CrudifyProvider,Ue as CrudifyThemeProvider,ce as ERROR_CODES,ue as ERROR_SEVERITY_MAP,ne as GlobalNotificationProvider,Ce as LoginComponent,Ae as POLICY_ACTIONS,Pe as PREFERRED_POLICY_ORDER,Re as Policies,N as ProtectedRoute,le as SessionDebugInfo,v as SessionLoadingScreen,d as SessionManager,ae as SessionProvider,xe as SessionStatus,J as TokenStorage,B as TranslationService,V as TranslationsProvider,he as UserProfileDisplay,ee as createErrorTranslator,Bi as crudify,oi as crudifyAdmin,C as crudifyInitManager,te as decodeJwtSafely,T as extractSafeRedirectFromUrl,z as getCookie,$ as getCriticalLanguages,_ as getCriticalTranslations,re as getCurrentUserEmail,fe as getErrorMessage,ge as handleCrudifyError,oe as isTokenExpired,pe as parseApiError,ye as parseJavaScriptError,de as parseTransactionError,be as secureLocalStorage,we as secureSessionStorage,j as translateError,Q as translateErrorCode,X as translateErrorCodes,Z as translationService,Se as useAuth,ze as useAutoGenerate,Y as useCrudify,ei as useCrudifyInitializer,Le as useCrudifyWithNotifications,Ee as useData,se as useGlobalNotification,ie as useSession,f as useSessionContext,W as useTranslations,Te as useUserData,me as useUserProfile,A as validateInternalRedirect};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nocios/crudify-ui",
3
- "version": "4.3.36",
3
+ "version": "4.4.0",
4
4
  "description": "Biblioteca de componentes UI para Crudify",
5
5
  "author": "Nocios",
6
6
  "license": "MIT",