@nocios/crudify-ui 4.4.26 → 4.4.30

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.
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkOLTLD4XBjs = require('./chunk-OLTLD4XB.js');var _chunkWUOGD7AZjs = require('./chunk-WUOGD7AZ.js');require('./chunk-YIIUEOXC.js');require('./chunk-FC7HOMNQ.js');var _react = require('react');var _jsxruntime = require('react/jsx-runtime');function B({showBelowMinutes:f=5,position:c="bottom-right",colorNormal:m="#ed6c02",colorCritical:x="#d32f2f",style:u,className:g}={}){let{isAuthenticated:o,tokens:t}=_chunkWUOGD7AZjs.f.call(void 0, ),[i,y]=_react.useState.call(void 0, 0),[h,S]=_react.useState.call(void 0, 100);if(_react.useEffect.call(void 0, ()=>{if(!o||!t)return;let C=setInterval(()=>{let P=Date.now(),p=t.expiresAt-P,w=900*1e3;y(Math.max(0,p)),S(Math.max(0,p/w*100))},1e3);return()=>clearInterval(C)},[o,t]),!o||i<=0)return null;let e=Math.floor(i/6e4),b=Math.floor(i%6e4/1e3);if(e>=f)return null;let s=e<2,a=s?x:m,v={"top-left":{top:"16px",left:"16px"},"top-right":{top:"16px",right:"16px"},"bottom-left":{bottom:"16px",left:"16px"},"bottom-right":{bottom:"16px",right:"16px"}}[c];return _jsxruntime.jsxs.call(void 0, "div",{className:g,style:{position:"fixed",...v,padding:"12px 16px",backgroundColor:"white",borderRadius:"8px",boxShadow:"0 4px 12px rgba(0, 0, 0, 0.15)",minWidth:"200px",zIndex:9999,fontFamily:"system-ui, -apple-system, sans-serif",...u},children:[_jsxruntime.jsxs.call(void 0, "div",{style:{marginBottom:"8px"},children:[_jsxruntime.jsx.call(void 0, "div",{style:{fontSize:"12px",fontWeight:600,color:a,marginBottom:"4px"},children:s?"\u26A0\uFE0F Sesi\xF3n expirando":"\u23F0 Sesi\xF3n por expirar"}),_jsxruntime.jsxs.call(void 0, "div",{style:{fontSize:"14px",color:"#333",fontWeight:500},children:[e,":",b.toString().padStart(2,"0")]})]}),_jsxruntime.jsx.call(void 0, "div",{style:{width:"100%",height:"6px",backgroundColor:"#e0e0e0",borderRadius:"3px",overflow:"hidden"},children:_jsxruntime.jsx.call(void 0, "div",{style:{width:`${h}%`,height:"100%",backgroundColor:a,transition:"width 1s linear"}})})]})}exports.CrudiaAutoGenerate = _chunkOLTLD4XBjs.o; exports.CrudifyLogin = _chunkOLTLD4XBjs.h; exports.GlobalNotificationProvider = _chunkWUOGD7AZjs.g; exports.LoginComponent = _chunkOLTLD4XBjs.m; exports.Policies = _chunkOLTLD4XBjs.l; exports.SessionStatus = _chunkOLTLD4XBjs.n; exports.SessionTimeIndicator = B; exports.UserProfileDisplay = _chunkOLTLD4XBjs.i; exports.useGlobalNotification = _chunkWUOGD7AZjs.h;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkPSZ2DSVHjs = require('./chunk-PSZ2DSVH.js');var _chunkMMFYNCPIjs = require('./chunk-MMFYNCPI.js');require('./chunk-YIIUEOXC.js');require('./chunk-FC7HOMNQ.js');var _react = require('react');var _jsxruntime = require('react/jsx-runtime');function B({showBelowMinutes:f=5,position:c="bottom-right",colorNormal:m="#ed6c02",colorCritical:x="#d32f2f",style:u,className:g}={}){let{isAuthenticated:o,tokens:t}=_chunkMMFYNCPIjs.f.call(void 0, ),[i,y]=_react.useState.call(void 0, 0),[h,S]=_react.useState.call(void 0, 100);if(_react.useEffect.call(void 0, ()=>{if(!o||!t)return;let v=setInterval(()=>{let P=Date.now(),p=t.expiresAt-P,w=900*1e3;y(Math.max(0,p)),S(Math.max(0,p/w*100))},1e3);return()=>clearInterval(v)},[o,t]),!o||i<=0)return null;let e=Math.floor(i/6e4),b=Math.floor(i%6e4/1e3);if(e>=f)return null;let s=e<2,a=s?x:m,C={"top-left":{top:"16px",left:"16px"},"top-right":{top:"16px",right:"16px"},"bottom-left":{bottom:"16px",left:"16px"},"bottom-right":{bottom:"16px",right:"16px"}}[c];return _jsxruntime.jsxs.call(void 0, "div",{className:g,style:{position:"fixed",...C,padding:"12px 16px",backgroundColor:"white",borderRadius:"8px",boxShadow:"0 4px 12px rgba(0, 0, 0, 0.15)",minWidth:"200px",zIndex:9999,fontFamily:"system-ui, -apple-system, sans-serif",...u},children:[_jsxruntime.jsxs.call(void 0, "div",{style:{marginBottom:"8px"},children:[_jsxruntime.jsx.call(void 0, "div",{style:{fontSize:"12px",fontWeight:600,color:a,marginBottom:"4px"},children:s?"\u26A0\uFE0F Sesi\xF3n expirando":"\u23F0 Sesi\xF3n por expirar"}),_jsxruntime.jsxs.call(void 0, "div",{style:{fontSize:"14px",color:"#333",fontWeight:500},children:[e,":",b.toString().padStart(2,"0")]})]}),_jsxruntime.jsx.call(void 0, "div",{style:{width:"100%",height:"6px",backgroundColor:"#e0e0e0",borderRadius:"3px",overflow:"hidden"},children:_jsxruntime.jsx.call(void 0, "div",{style:{width:`${h}%`,height:"100%",backgroundColor:a,transition:"width 1s linear"}})})]})}exports.CrudiaAutoGenerate = _chunkPSZ2DSVHjs.o; exports.CrudiaFileField = _chunkPSZ2DSVHjs.p; exports.CrudifyLogin = _chunkPSZ2DSVHjs.h; exports.GlobalNotificationProvider = _chunkMMFYNCPIjs.g; exports.LoginComponent = _chunkPSZ2DSVHjs.m; exports.Policies = _chunkPSZ2DSVHjs.l; exports.SessionStatus = _chunkPSZ2DSVHjs.n; exports.SessionTimeIndicator = B; exports.UserProfileDisplay = _chunkPSZ2DSVHjs.i; exports.useGlobalNotification = _chunkMMFYNCPIjs.h;
@@ -1 +1 @@
1
- import{h as T,i as G,l as L,m as A,n as M,o as R}from"./chunk-35AID65H.mjs";import{f as l,g as I,h as N}from"./chunk-TZKAMU3P.mjs";import"./chunk-BJ6PIVZR.mjs";import"./chunk-6GPSBDW6.mjs";import{useEffect as k,useState as d}from"react";import{jsx as r,jsxs as n}from"react/jsx-runtime";function B({showBelowMinutes:f=5,position:c="bottom-right",colorNormal:m="#ed6c02",colorCritical:x="#d32f2f",style:u,className:g}={}){let{isAuthenticated:o,tokens:t}=l(),[i,y]=d(0),[h,S]=d(100);if(k(()=>{if(!o||!t)return;let C=setInterval(()=>{let P=Date.now(),p=t.expiresAt-P,w=900*1e3;y(Math.max(0,p)),S(Math.max(0,p/w*100))},1e3);return()=>clearInterval(C)},[o,t]),!o||i<=0)return null;let e=Math.floor(i/6e4),b=Math.floor(i%6e4/1e3);if(e>=f)return null;let s=e<2,a=s?x:m,v={"top-left":{top:"16px",left:"16px"},"top-right":{top:"16px",right:"16px"},"bottom-left":{bottom:"16px",left:"16px"},"bottom-right":{bottom:"16px",right:"16px"}}[c];return n("div",{className:g,style:{position:"fixed",...v,padding:"12px 16px",backgroundColor:"white",borderRadius:"8px",boxShadow:"0 4px 12px rgba(0, 0, 0, 0.15)",minWidth:"200px",zIndex:9999,fontFamily:"system-ui, -apple-system, sans-serif",...u},children:[n("div",{style:{marginBottom:"8px"},children:[r("div",{style:{fontSize:"12px",fontWeight:600,color:a,marginBottom:"4px"},children:s?"\u26A0\uFE0F Sesi\xF3n expirando":"\u23F0 Sesi\xF3n por expirar"}),n("div",{style:{fontSize:"14px",color:"#333",fontWeight:500},children:[e,":",b.toString().padStart(2,"0")]})]}),r("div",{style:{width:"100%",height:"6px",backgroundColor:"#e0e0e0",borderRadius:"3px",overflow:"hidden"},children:r("div",{style:{width:`${h}%`,height:"100%",backgroundColor:a,transition:"width 1s linear"}})})]})}export{R as CrudiaAutoGenerate,T as CrudifyLogin,I as GlobalNotificationProvider,A as LoginComponent,L as Policies,M as SessionStatus,B as SessionTimeIndicator,G as UserProfileDisplay,N as useGlobalNotification};
1
+ import{h as T,i as F,l as G,m as L,n as A,o as M,p as R}from"./chunk-IZD5WNI4.mjs";import{f as l,g as I,h as N}from"./chunk-ZSP7TBON.mjs";import"./chunk-BJ6PIVZR.mjs";import"./chunk-6GPSBDW6.mjs";import{useEffect as k,useState as d}from"react";import{jsx as r,jsxs as n}from"react/jsx-runtime";function B({showBelowMinutes:f=5,position:c="bottom-right",colorNormal:m="#ed6c02",colorCritical:x="#d32f2f",style:u,className:g}={}){let{isAuthenticated:o,tokens:t}=l(),[i,y]=d(0),[h,S]=d(100);if(k(()=>{if(!o||!t)return;let v=setInterval(()=>{let P=Date.now(),p=t.expiresAt-P,w=900*1e3;y(Math.max(0,p)),S(Math.max(0,p/w*100))},1e3);return()=>clearInterval(v)},[o,t]),!o||i<=0)return null;let e=Math.floor(i/6e4),b=Math.floor(i%6e4/1e3);if(e>=f)return null;let s=e<2,a=s?x:m,C={"top-left":{top:"16px",left:"16px"},"top-right":{top:"16px",right:"16px"},"bottom-left":{bottom:"16px",left:"16px"},"bottom-right":{bottom:"16px",right:"16px"}}[c];return n("div",{className:g,style:{position:"fixed",...C,padding:"12px 16px",backgroundColor:"white",borderRadius:"8px",boxShadow:"0 4px 12px rgba(0, 0, 0, 0.15)",minWidth:"200px",zIndex:9999,fontFamily:"system-ui, -apple-system, sans-serif",...u},children:[n("div",{style:{marginBottom:"8px"},children:[r("div",{style:{fontSize:"12px",fontWeight:600,color:a,marginBottom:"4px"},children:s?"\u26A0\uFE0F Sesi\xF3n expirando":"\u23F0 Sesi\xF3n por expirar"}),n("div",{style:{fontSize:"14px",color:"#333",fontWeight:500},children:[e,":",b.toString().padStart(2,"0")]})]}),r("div",{style:{width:"100%",height:"6px",backgroundColor:"#e0e0e0",borderRadius:"3px",overflow:"hidden"},children:r("div",{style:{width:`${h}%`,height:"100%",backgroundColor:a,transition:"width 1s linear"}})})]})}export{M as CrudiaAutoGenerate,R as CrudiaFileField,T as CrudifyLogin,I as GlobalNotificationProvider,L as LoginComponent,G as Policies,A as SessionStatus,B as SessionTimeIndicator,F as UserProfileDisplay,N as useGlobalNotification};
package/dist/hooks.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- export { d as SessionState, j as UseAuthReturn, l as UseDataReturn, U as UseSessionOptions, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, n as useCrudifyWithNotifications, k as useData, u as useSession, e as useUserData, m as useUserProfile } from './index-Bjn8TCuc.mjs';
1
+ export { F as FileItem, q as FileStatus, d as SessionState, j as UseAuthReturn, l as UseDataReturn, o as UseFileUploadOptions, p as UseFileUploadReturn, U as UseSessionOptions, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, r as useCrudifyWithNotifications, k as useData, n as useFileUpload, u as useSession, e as useUserData, m as useUserProfile } from './index-wi46iw-x.mjs';
2
2
  export { A as AutoGenerateConfig, d as UseAutoGenerateOptions, U as UseAutoGenerateReturn, c as useAutoGenerate } from './GlobalNotificationProvider-Zq18OkpI.mjs';
3
3
  import './api-Djqihi4n.mjs';
4
4
  import '@nocios/crudify-browser';
package/dist/hooks.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { d as SessionState, j as UseAuthReturn, l as UseDataReturn, U as UseSessionOptions, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, n as useCrudifyWithNotifications, k as useData, u as useSession, e as useUserData, m as useUserProfile } from './index-BbvxA2Se.js';
1
+ export { F as FileItem, q as FileStatus, d as SessionState, j as UseAuthReturn, l as UseDataReturn, o as UseFileUploadOptions, p as UseFileUploadReturn, U as UseSessionOptions, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, r as useCrudifyWithNotifications, k as useData, n as useFileUpload, u as useSession, e as useUserData, m as useUserProfile } from './index-BicpdTC_.js';
2
2
  export { A as AutoGenerateConfig, d as UseAutoGenerateOptions, U as UseAutoGenerateReturn, c as useAutoGenerate } from './GlobalNotificationProvider-Zq18OkpI.js';
3
3
  import './api-Djqihi4n.js';
4
4
  import '@nocios/crudify-browser';
package/dist/hooks.js CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkZWSHZHIHjs = require('./chunk-ZWSHZHIH.js');var _chunkWUOGD7AZjs = require('./chunk-WUOGD7AZ.js');require('./chunk-FC7HOMNQ.js');exports.useAuth = _chunkZWSHZHIHjs.b; exports.useAutoGenerate = _chunkWUOGD7AZjs.m; exports.useCrudifyWithNotifications = _chunkZWSHZHIHjs.d; exports.useData = _chunkZWSHZHIHjs.c; exports.useSession = _chunkWUOGD7AZjs.f; exports.useUserData = _chunkZWSHZHIHjs.a; exports.useUserProfile = _chunkWUOGD7AZjs.l;
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});var _chunkM2BIAQ3Vjs = require('./chunk-M2BIAQ3V.js');var _chunkMMFYNCPIjs = require('./chunk-MMFYNCPI.js');require('./chunk-FC7HOMNQ.js');exports.useAuth = _chunkM2BIAQ3Vjs.b; exports.useAutoGenerate = _chunkMMFYNCPIjs.m; exports.useCrudifyWithNotifications = _chunkM2BIAQ3Vjs.d; exports.useData = _chunkM2BIAQ3Vjs.c; exports.useFileUpload = _chunkMMFYNCPIjs.p; exports.useSession = _chunkMMFYNCPIjs.f; exports.useUserData = _chunkM2BIAQ3Vjs.a; exports.useUserProfile = _chunkMMFYNCPIjs.l;
package/dist/hooks.mjs CHANGED
@@ -1 +1 @@
1
- import{a as o,b as s,c as u,d as a}from"./chunk-6PXLM74L.mjs";import{f as e,l as t,m as r}from"./chunk-TZKAMU3P.mjs";import"./chunk-6GPSBDW6.mjs";export{s as useAuth,r as useAutoGenerate,a as useCrudifyWithNotifications,u as useData,e as useSession,o as useUserData,t as useUserProfile};
1
+ import{a as s,b as u,c as a,d as p}from"./chunk-P4SZ3U4U.mjs";import{f as e,l as t,m as o,p as r}from"./chunk-ZSP7TBON.mjs";import"./chunk-6GPSBDW6.mjs";export{u as useAuth,o as useAutoGenerate,p as useCrudifyWithNotifications,a as useData,r as useFileUpload,e as useSession,s as useUserData,t as useUserProfile};
@@ -462,6 +462,152 @@ interface UseUserProfileReturn {
462
462
  }
463
463
  declare const useUserProfile: (options?: UseUserProfileOptions) => UseUserProfileReturn;
464
464
 
465
+ /**
466
+ * Estado de un archivo individual
467
+ */
468
+ type FileStatus = "pending" | "uploading" | "completed" | "error" | "removing";
469
+ /**
470
+ * Representa un archivo en el sistema
471
+ */
472
+ interface FileItem {
473
+ /** ID único del archivo (generado o desde servidor) */
474
+ id: string;
475
+ /** Nombre original del archivo */
476
+ name: string;
477
+ /** Tamaño en bytes */
478
+ size: number;
479
+ /** Content type MIME */
480
+ contentType: string;
481
+ /** Estado actual del archivo */
482
+ status: FileStatus;
483
+ /** Progreso de upload (0-100) */
484
+ progress: number;
485
+ /**
486
+ * Ruta relativa del archivo (incluye visibility)
487
+ * Formato: "public/path/file.ext" o "private/path/file.ext"
488
+ */
489
+ filePath?: string;
490
+ /**
491
+ * Visibilidad del archivo
492
+ * Extraída del filePath para conveniencia
493
+ */
494
+ visibility?: "public" | "private";
495
+ /** URL pública para archivos públicos */
496
+ publicUrl?: string;
497
+ /** URL de preview (para imágenes) */
498
+ previewUrl?: string;
499
+ /** Mensaje de error si falló */
500
+ errorMessage?: string;
501
+ /** Timestamp de creación */
502
+ createdAt: number;
503
+ /** Archivo original (solo durante upload) */
504
+ file?: File;
505
+ }
506
+ /**
507
+ * Configuración del hook
508
+ */
509
+ interface UseFileUploadOptions {
510
+ /** Tipos MIME permitidos (ej: ["image/png", "image/jpeg", "application/pdf"]) */
511
+ acceptedTypes?: string[];
512
+ /** Tamaño máximo por archivo en bytes (default: 10MB) */
513
+ maxFileSize?: number;
514
+ /** Número máximo de archivos (undefined = sin límite) */
515
+ maxFiles?: number;
516
+ /** Número mínimo de archivos requeridos (default: 0) */
517
+ minFiles?: number;
518
+ /**
519
+ * Visibilidad de los archivos subidos
520
+ * @default "private"
521
+ */
522
+ visibility?: "public" | "private";
523
+ /** Callback cuando se completa un upload exitoso */
524
+ onUploadComplete?: (file: FileItem) => void;
525
+ /** Callback cuando falla un upload */
526
+ onUploadError?: (file: FileItem, error: string) => void;
527
+ /** Callback cuando se elimina un archivo */
528
+ onFileRemoved?: (file: FileItem) => void;
529
+ /** Callback cuando cambia la lista de archivos */
530
+ onFilesChange?: (files: FileItem[]) => void;
531
+ }
532
+ /**
533
+ * Resultado del hook
534
+ */
535
+ interface UseFileUploadReturn {
536
+ /** Lista de archivos actuales */
537
+ files: FileItem[];
538
+ /** Si hay uploads en progreso */
539
+ isUploading: boolean;
540
+ /** Número de uploads pendientes */
541
+ pendingCount: number;
542
+ /** Agregar archivos (dispara upload automático) */
543
+ addFiles: (files: FileList | File[]) => Promise<void>;
544
+ /** Eliminar un archivo (soft delete en S3) */
545
+ removeFile: (fileId: string) => Promise<boolean>;
546
+ /** Limpiar todos los archivos */
547
+ clearFiles: () => void;
548
+ /** Reintentar upload de un archivo fallido */
549
+ retryUpload: (fileId: string) => Promise<void>;
550
+ /** Validar si cumple requisitos mínimos */
551
+ isValid: boolean;
552
+ /** Mensaje de error de validación */
553
+ validationError: string | null;
554
+ /** Esperar a que todos los uploads terminen */
555
+ waitForUploads: () => Promise<void>;
556
+ /**
557
+ * Rutas de archivos completados (para guardar en formulario)
558
+ * Son rutas relativas con visibility - el subscriberKey se agrega en backend
559
+ */
560
+ completedFilePaths: string[];
561
+ /** Inicializar con archivos existentes (para edición) */
562
+ initializeFiles: (existingFiles: Array<{
563
+ filePath: string;
564
+ name: string;
565
+ size?: number;
566
+ contentType?: string;
567
+ }>) => void;
568
+ /** Si el usuario ha interactuado con el campo */
569
+ isTouched: boolean;
570
+ /** Marcar el campo como tocado (para mostrar errores de validación) */
571
+ markAsTouched: () => void;
572
+ /**
573
+ * Obtener URL para preview de archivo
574
+ * - Públicos: retorna publicUrl directamente
575
+ * - Privados: solicita signed URL al backend
576
+ */
577
+ getPreviewUrl: (fileId: string) => Promise<string | null>;
578
+ }
579
+ /**
580
+ * Hook para manejo completo de archivos con upload a S3
581
+ *
582
+ * @example
583
+ * ```tsx
584
+ * const {
585
+ * files,
586
+ * addFiles,
587
+ * removeFile,
588
+ * isUploading,
589
+ * isValid,
590
+ * completedS3Keys
591
+ * } = useFileUpload({
592
+ * acceptedTypes: ["image/png", "image/jpeg", "application/pdf"],
593
+ * maxFileSize: 5 * 1024 * 1024, // 5MB
594
+ * maxFiles: 3,
595
+ * minFiles: 1
596
+ * });
597
+ *
598
+ * // En el submit del formulario
599
+ * const handleSubmit = async () => {
600
+ * await waitForUploads(); // Esperar uploads pendientes
601
+ * if (!isValid) return;
602
+ *
603
+ * await crudify.createItem("documents", {
604
+ * files: completedS3Keys
605
+ * });
606
+ * };
607
+ * ```
608
+ */
609
+ declare const useFileUpload: (options?: UseFileUploadOptions) => UseFileUploadReturn;
610
+
465
611
  interface CrudifyWithNotificationsOptions {
466
612
  showSuccessNotifications?: boolean;
467
613
  showErrorNotifications?: boolean;
@@ -484,4 +630,4 @@ declare const useCrudifyWithNotifications: (options?: CrudifyWithNotificationsOp
484
630
  shouldShowNotification: (response: CrudifyResponse) => boolean;
485
631
  };
486
632
 
487
- export { type LoginResult as L, SessionManager as S, type TokenData as T, type UseSessionOptions as U, type SessionConfig as a, TokenStorage as b, type StorageType as c, type SessionState as d, useUserData as e, type UseUserDataReturn as f, type UseUserDataOptions as g, type UserData as h, useAuth as i, type UseAuthReturn as j, useData as k, type UseDataReturn as l, useUserProfile as m, useCrudifyWithNotifications as n, useSession as u };
633
+ export { type FileItem as F, type LoginResult as L, SessionManager as S, type TokenData as T, type UseSessionOptions as U, type SessionConfig as a, TokenStorage as b, type StorageType as c, type SessionState as d, useUserData as e, type UseUserDataReturn as f, type UseUserDataOptions as g, type UserData as h, useAuth as i, type UseAuthReturn as j, useData as k, type UseDataReturn as l, useUserProfile as m, useFileUpload as n, type UseFileUploadOptions as o, type UseFileUploadReturn as p, type FileStatus as q, useCrudifyWithNotifications as r, useSession as u };
@@ -462,6 +462,152 @@ interface UseUserProfileReturn {
462
462
  }
463
463
  declare const useUserProfile: (options?: UseUserProfileOptions) => UseUserProfileReturn;
464
464
 
465
+ /**
466
+ * Estado de un archivo individual
467
+ */
468
+ type FileStatus = "pending" | "uploading" | "completed" | "error" | "removing";
469
+ /**
470
+ * Representa un archivo en el sistema
471
+ */
472
+ interface FileItem {
473
+ /** ID único del archivo (generado o desde servidor) */
474
+ id: string;
475
+ /** Nombre original del archivo */
476
+ name: string;
477
+ /** Tamaño en bytes */
478
+ size: number;
479
+ /** Content type MIME */
480
+ contentType: string;
481
+ /** Estado actual del archivo */
482
+ status: FileStatus;
483
+ /** Progreso de upload (0-100) */
484
+ progress: number;
485
+ /**
486
+ * Ruta relativa del archivo (incluye visibility)
487
+ * Formato: "public/path/file.ext" o "private/path/file.ext"
488
+ */
489
+ filePath?: string;
490
+ /**
491
+ * Visibilidad del archivo
492
+ * Extraída del filePath para conveniencia
493
+ */
494
+ visibility?: "public" | "private";
495
+ /** URL pública para archivos públicos */
496
+ publicUrl?: string;
497
+ /** URL de preview (para imágenes) */
498
+ previewUrl?: string;
499
+ /** Mensaje de error si falló */
500
+ errorMessage?: string;
501
+ /** Timestamp de creación */
502
+ createdAt: number;
503
+ /** Archivo original (solo durante upload) */
504
+ file?: File;
505
+ }
506
+ /**
507
+ * Configuración del hook
508
+ */
509
+ interface UseFileUploadOptions {
510
+ /** Tipos MIME permitidos (ej: ["image/png", "image/jpeg", "application/pdf"]) */
511
+ acceptedTypes?: string[];
512
+ /** Tamaño máximo por archivo en bytes (default: 10MB) */
513
+ maxFileSize?: number;
514
+ /** Número máximo de archivos (undefined = sin límite) */
515
+ maxFiles?: number;
516
+ /** Número mínimo de archivos requeridos (default: 0) */
517
+ minFiles?: number;
518
+ /**
519
+ * Visibilidad de los archivos subidos
520
+ * @default "private"
521
+ */
522
+ visibility?: "public" | "private";
523
+ /** Callback cuando se completa un upload exitoso */
524
+ onUploadComplete?: (file: FileItem) => void;
525
+ /** Callback cuando falla un upload */
526
+ onUploadError?: (file: FileItem, error: string) => void;
527
+ /** Callback cuando se elimina un archivo */
528
+ onFileRemoved?: (file: FileItem) => void;
529
+ /** Callback cuando cambia la lista de archivos */
530
+ onFilesChange?: (files: FileItem[]) => void;
531
+ }
532
+ /**
533
+ * Resultado del hook
534
+ */
535
+ interface UseFileUploadReturn {
536
+ /** Lista de archivos actuales */
537
+ files: FileItem[];
538
+ /** Si hay uploads en progreso */
539
+ isUploading: boolean;
540
+ /** Número de uploads pendientes */
541
+ pendingCount: number;
542
+ /** Agregar archivos (dispara upload automático) */
543
+ addFiles: (files: FileList | File[]) => Promise<void>;
544
+ /** Eliminar un archivo (soft delete en S3) */
545
+ removeFile: (fileId: string) => Promise<boolean>;
546
+ /** Limpiar todos los archivos */
547
+ clearFiles: () => void;
548
+ /** Reintentar upload de un archivo fallido */
549
+ retryUpload: (fileId: string) => Promise<void>;
550
+ /** Validar si cumple requisitos mínimos */
551
+ isValid: boolean;
552
+ /** Mensaje de error de validación */
553
+ validationError: string | null;
554
+ /** Esperar a que todos los uploads terminen */
555
+ waitForUploads: () => Promise<void>;
556
+ /**
557
+ * Rutas de archivos completados (para guardar en formulario)
558
+ * Son rutas relativas con visibility - el subscriberKey se agrega en backend
559
+ */
560
+ completedFilePaths: string[];
561
+ /** Inicializar con archivos existentes (para edición) */
562
+ initializeFiles: (existingFiles: Array<{
563
+ filePath: string;
564
+ name: string;
565
+ size?: number;
566
+ contentType?: string;
567
+ }>) => void;
568
+ /** Si el usuario ha interactuado con el campo */
569
+ isTouched: boolean;
570
+ /** Marcar el campo como tocado (para mostrar errores de validación) */
571
+ markAsTouched: () => void;
572
+ /**
573
+ * Obtener URL para preview de archivo
574
+ * - Públicos: retorna publicUrl directamente
575
+ * - Privados: solicita signed URL al backend
576
+ */
577
+ getPreviewUrl: (fileId: string) => Promise<string | null>;
578
+ }
579
+ /**
580
+ * Hook para manejo completo de archivos con upload a S3
581
+ *
582
+ * @example
583
+ * ```tsx
584
+ * const {
585
+ * files,
586
+ * addFiles,
587
+ * removeFile,
588
+ * isUploading,
589
+ * isValid,
590
+ * completedS3Keys
591
+ * } = useFileUpload({
592
+ * acceptedTypes: ["image/png", "image/jpeg", "application/pdf"],
593
+ * maxFileSize: 5 * 1024 * 1024, // 5MB
594
+ * maxFiles: 3,
595
+ * minFiles: 1
596
+ * });
597
+ *
598
+ * // En el submit del formulario
599
+ * const handleSubmit = async () => {
600
+ * await waitForUploads(); // Esperar uploads pendientes
601
+ * if (!isValid) return;
602
+ *
603
+ * await crudify.createItem("documents", {
604
+ * files: completedS3Keys
605
+ * });
606
+ * };
607
+ * ```
608
+ */
609
+ declare const useFileUpload: (options?: UseFileUploadOptions) => UseFileUploadReturn;
610
+
465
611
  interface CrudifyWithNotificationsOptions {
466
612
  showSuccessNotifications?: boolean;
467
613
  showErrorNotifications?: boolean;
@@ -484,4 +630,4 @@ declare const useCrudifyWithNotifications: (options?: CrudifyWithNotificationsOp
484
630
  shouldShowNotification: (response: CrudifyResponse) => boolean;
485
631
  };
486
632
 
487
- export { type LoginResult as L, SessionManager as S, type TokenData as T, type UseSessionOptions as U, type SessionConfig as a, TokenStorage as b, type StorageType as c, type SessionState as d, useUserData as e, type UseUserDataReturn as f, type UseUserDataOptions as g, type UserData as h, useAuth as i, type UseAuthReturn as j, useData as k, type UseDataReturn as l, useUserProfile as m, useCrudifyWithNotifications as n, useSession as u };
633
+ export { type FileItem as F, type LoginResult as L, SessionManager as S, type TokenData as T, type UseSessionOptions as U, type SessionConfig as a, TokenStorage as b, type StorageType as c, type SessionState as d, useUserData as e, type UseUserDataReturn as f, type UseUserDataOptions as g, type UserData as h, useAuth as i, type UseAuthReturn as j, useData as k, type UseDataReturn as l, useUserProfile as m, useFileUpload as n, type UseFileUploadOptions as o, type UseFileUploadReturn as p, type FileStatus as q, useCrudifyWithNotifications as r, useSession as u };
package/dist/index.d.mts CHANGED
@@ -1,12 +1,12 @@
1
1
  import crudify__default from '@nocios/crudify-browser';
2
2
  export * from '@nocios/crudify-browser';
3
3
  export { default as crudify } from '@nocios/crudify-browser';
4
- import { b as CrudifyLoginConfig } from './CrudiaAutoGenerate-CORiNekq.mjs';
5
- export { B as BoxScreenType, a as CrudiaAutoGenerate, g as CrudiaAutoGenerateProps, C as CrudifyLogin, c as CrudifyLoginProps, d as CrudifyLoginTranslations, L as LoginComponent, h as POLICY_ACTIONS, i as PREFERRED_POLICY_ORDER, P as Policies, f as PolicyAction, S as SessionStatus, e as UserLoginData, U as UserProfileDisplay } from './CrudiaAutoGenerate-CORiNekq.mjs';
4
+ import { c as CrudifyLoginConfig } from './CrudiaFileField-D5zDp_Y1.mjs';
5
+ export { B as BoxScreenType, a as CrudiaAutoGenerate, h as CrudiaAutoGenerateProps, b as CrudiaFileField, i as CrudiaFileFieldProps, C as CrudifyLogin, d as CrudifyLoginProps, e as CrudifyLoginTranslations, L as LoginComponent, j as POLICY_ACTIONS, k as PREFERRED_POLICY_ORDER, P as Policies, g as PolicyAction, S as SessionStatus, f as UserLoginData, U as UserProfileDisplay } from './CrudiaFileField-D5zDp_Y1.mjs';
6
6
  import React, { ReactNode } from 'react';
7
7
  export { A as ApiError, C as CrudifyApiResponse, a as CrudifyTransactionResponse, F as ForgotPasswordRequest, J as JwtPayload, b as LoginRequest, L as LoginResponse, R as ResetPasswordRequest, T as TransactionResponseData, U as UserProfile, V as ValidateCodeRequest, c as ValidationError } from './api-Djqihi4n.mjs';
8
- import { U as UseSessionOptions, T as TokenData, L as LoginResult } from './index-Bjn8TCuc.mjs';
9
- export { a as SessionConfig, S as SessionManager, d as SessionState, c as StorageType, b as TokenStorage, j as UseAuthReturn, l as UseDataReturn, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, n as useCrudifyWithNotifications, k as useData, u as useSession, e as useUserData, m as useUserProfile } from './index-Bjn8TCuc.mjs';
8
+ import { U as UseSessionOptions, T as TokenData, L as LoginResult } from './index-wi46iw-x.mjs';
9
+ export { F as FileItem, q as FileStatus, a as SessionConfig, S as SessionManager, d as SessionState, c as StorageType, b as TokenStorage, j as UseAuthReturn, l as UseDataReturn, o as UseFileUploadOptions, p as UseFileUploadReturn, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, r as useCrudifyWithNotifications, k as useData, n as useFileUpload, u as useSession, e as useUserData, m as useUserProfile } from './index-wi46iw-x.mjs';
10
10
  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';
package/dist/index.d.ts CHANGED
@@ -1,12 +1,12 @@
1
1
  import crudify__default from '@nocios/crudify-browser';
2
2
  export * from '@nocios/crudify-browser';
3
3
  export { default as crudify } from '@nocios/crudify-browser';
4
- import { b as CrudifyLoginConfig } from './CrudiaAutoGenerate-BMWqk_Nx.js';
5
- export { B as BoxScreenType, a as CrudiaAutoGenerate, g as CrudiaAutoGenerateProps, C as CrudifyLogin, c as CrudifyLoginProps, d as CrudifyLoginTranslations, L as LoginComponent, h as POLICY_ACTIONS, i as PREFERRED_POLICY_ORDER, P as Policies, f as PolicyAction, S as SessionStatus, e as UserLoginData, U as UserProfileDisplay } from './CrudiaAutoGenerate-BMWqk_Nx.js';
4
+ import { c as CrudifyLoginConfig } from './CrudiaFileField-CXyBfgOd.js';
5
+ export { B as BoxScreenType, a as CrudiaAutoGenerate, h as CrudiaAutoGenerateProps, b as CrudiaFileField, i as CrudiaFileFieldProps, C as CrudifyLogin, d as CrudifyLoginProps, e as CrudifyLoginTranslations, L as LoginComponent, j as POLICY_ACTIONS, k as PREFERRED_POLICY_ORDER, P as Policies, g as PolicyAction, S as SessionStatus, f as UserLoginData, U as UserProfileDisplay } from './CrudiaFileField-CXyBfgOd.js';
6
6
  import React, { ReactNode } from 'react';
7
7
  export { A as ApiError, C as CrudifyApiResponse, a as CrudifyTransactionResponse, F as ForgotPasswordRequest, J as JwtPayload, b as LoginRequest, L as LoginResponse, R as ResetPasswordRequest, T as TransactionResponseData, U as UserProfile, V as ValidateCodeRequest, c as ValidationError } from './api-Djqihi4n.js';
8
- import { U as UseSessionOptions, T as TokenData, L as LoginResult } from './index-BbvxA2Se.js';
9
- export { a as SessionConfig, S as SessionManager, d as SessionState, c as StorageType, b as TokenStorage, j as UseAuthReturn, l as UseDataReturn, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, n as useCrudifyWithNotifications, k as useData, u as useSession, e as useUserData, m as useUserProfile } from './index-BbvxA2Se.js';
8
+ import { U as UseSessionOptions, T as TokenData, L as LoginResult } from './index-BicpdTC_.js';
9
+ export { F as FileItem, q as FileStatus, a as SessionConfig, S as SessionManager, d as SessionState, c as StorageType, b as TokenStorage, j as UseAuthReturn, l as UseDataReturn, o as UseFileUploadOptions, p as UseFileUploadReturn, g as UseUserDataOptions, f as UseUserDataReturn, h as UserData, i as useAuth, r as useCrudifyWithNotifications, k as useData, n as useFileUpload, u as useSession, e as useUserData, m as useUserProfile } from './index-BicpdTC_.js';
10
10
  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';
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _createStarExport(obj) { Object.keys(obj) .filter((key) => key !== "default" && key !== "__esModule") .forEach((key) => { if (exports.hasOwnProperty(key)) { return; } Object.defineProperty(exports, key, {enumerable: true, configurable: true, get: () => obj[key]}); }); } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _chunkOLTLD4XBjs = require('./chunk-OLTLD4XB.js');var _chunkZWSHZHIHjs = require('./chunk-ZWSHZHIH.js');var _chunkWUOGD7AZjs = require('./chunk-WUOGD7AZ.js');var _chunkNNY4A73Vjs = require('./chunk-NNY4A73V.js');var _chunkYIIUEOXCjs = require('./chunk-YIIUEOXC.js');var _chunkFC7HOMNQjs = require('./chunk-FC7HOMNQ.js');var _crudifybrowser = require('@nocios/crudify-browser'); var _crudifybrowser2 = _interopRequireDefault(_crudifybrowser); _createStarExport(_crudifybrowser);var _react = require('react');var _material = require('@mui/material');var _jsxruntime = require('react/jsx-runtime');var He=(e={})=>{try{let i=_chunkFC7HOMNQjs.a.call(void 0, "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 De({children:e,defaultTheme:i={},disableCssBaseline:t=!1}){let r=_react.useMemo.call(void 0, ()=>{let n=He(i);return _material.createTheme.call(void 0, n)},[i]);return _jsxruntime.jsxs.call(void 0, _material.ThemeProvider,{theme:r,children:[!t&&_jsxruntime.jsx.call(void 0, _material.CssBaseline,{}),e]})}var _reactrouterdom = require('react-router-dom');var Fe={border:"5px solid rgba(0, 0, 0, 0.1)",borderTopColor:"#3B82F6",borderRadius:"50%",width:"50px",height:"50px",animation:"spin 1s linear infinite"},$e=()=>_jsxruntime.jsx.call(void 0, "style",{children:`
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _createStarExport(obj) { Object.keys(obj) .filter((key) => key !== "default" && key !== "__esModule") .forEach((key) => { if (exports.hasOwnProperty(key)) { return; } Object.defineProperty(exports, key, {enumerable: true, configurable: true, get: () => obj[key]}); }); } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }var _chunkPSZ2DSVHjs = require('./chunk-PSZ2DSVH.js');var _chunkM2BIAQ3Vjs = require('./chunk-M2BIAQ3V.js');var _chunkMMFYNCPIjs = require('./chunk-MMFYNCPI.js');var _chunkNNY4A73Vjs = require('./chunk-NNY4A73V.js');var _chunkYIIUEOXCjs = require('./chunk-YIIUEOXC.js');var _chunkFC7HOMNQjs = require('./chunk-FC7HOMNQ.js');var _crudifybrowser = require('@nocios/crudify-browser'); var _crudifybrowser2 = _interopRequireDefault(_crudifybrowser); _createStarExport(_crudifybrowser);var _react = require('react');var _material = require('@mui/material');var _jsxruntime = require('react/jsx-runtime');var De=(e={})=>{try{let r=_chunkFC7HOMNQjs.a.call(void 0, "theme");if(r){let o=JSON.parse(decodeURIComponent(r));return{...e,...o}}}catch(r){console.warn("Error parsing theme from cookie:",r)}return e};function Ge({children:e,defaultTheme:r={},disableCssBaseline:o=!1}){let t=_react.useMemo.call(void 0, ()=>{let s=De(r);return _material.createTheme.call(void 0, s)},[r]);return _jsxruntime.jsxs.call(void 0, _material.ThemeProvider,{theme:t,children:[!o&&_jsxruntime.jsx.call(void 0, _material.CssBaseline,{}),e]})}var _reactrouterdom = require('react-router-dom');var _e={border:"5px solid rgba(0, 0, 0, 0.1)",borderTopColor:"#3B82F6",borderRadius:"50%",width:"50px",height:"50px",animation:"spin 1s linear infinite"},Be=()=>_jsxruntime.jsx.call(void 0, "style",{children:`
2
2
  @keyframes spin {
3
3
  0% { transform: rotate(0deg); }
4
4
  100% { transform: rotate(360deg); }
5
5
  }
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, $e,{}),_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\-_./\?=&%#]+$/,Ze=[/^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 Ze)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 k({children:e,loadingComponent:i,loginPath:t="/login"}){let{isAuthenticated:r,isLoading:n,isInitialized:o,tokens:s,error:c}=_chunkWUOGD7AZjs.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 d=r&&_optionalChain([s, 'optionalAccess', _2 => _2.accessToken])&&s.accessToken.length>0;if(c||!r||!d){s&&(!s.accessToken||s.accessToken.length===0)&&localStorage.removeItem("crudify_tokens");let m=u.pathname+u.search,I=P(m),h=encodeURIComponent(I);return _jsxruntime.jsx.call(void 0, _reactrouterdom.Navigate,{to:`${t}?redirect=${h}`,replace:!0})}return _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:e})}function O({children:e,redirectTo:i="/"}){let{isAuthenticated:t}=_chunkWUOGD7AZjs.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(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}}},x= exports.crudifyInitManager =C.getInstance();var G=_react.createContext.call(void 0, void 0),ei= 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),[d,m]=_react.useState.call(void 0, null),I=_react.useRef.call(void 0, !1),h=_react.useRef.call(void 0, !1);_react.useEffect.call(void 0, ()=>{I.current||(x.registerHighPriorityInitializer(),I.current=!0),h.current||(h.current=!0,(async()=>{u(!0),m(null);try{let p=_chunkFC7HOMNQjs.b.call(void 0, {publicApiKey:_optionalChain([e, 'optionalAccess', _7 => _7.publicApiKey]),env:_optionalChain([e, 'optionalAccess', _8 => _8.env]),enableDebug:_optionalChain([e, 'optionalAccess', _9 => _9.enableLogging])});if(!p.publicApiKey)throw new Error("Crudify configuration missing. Please provide publicApiKey via props or ensure cookies are set by Lambda.");await x.initialize({priority:"HIGH",publicApiKey:p.publicApiKey,env:p.env||"prod",enableLogging:_optionalChain([e, 'optionalAccess', _10 => _10.enableLogging]),requestedBy:"CrudifyInitializer"}),s(!0),u(!1),r&&r()}catch(p){let E=p instanceof Error?p:new Error(String(p));m(E),u(!1),n&&n(E)}})())},[_optionalChain([e, 'optionalAccess', _11 => _11.publicApiKey]),_optionalChain([e, 'optionalAccess', _12 => _12.env]),_optionalChain([e, 'optionalAccess', _13 => _13.enableLogging]),r,n]);let F={isInitialized:o,isInitializing:c,error:d};return c&&t?_jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:t}):(d&&console.error("[CrudifyInitializer] Initialization failed:",d),_jsxruntime.jsx.call(void 0, G.Provider,{value:F,children:i}))},ii= exports.useCrudifyInitializer =()=>{let e=_react.useContext.call(void 0, G);if(!e)throw new Error("useCrudifyInitializer must be used within CrudifyInitializer");return e};var _crudifyadmin = require('@nocios/crudify-admin'); var _crudifyadmin2 = _interopRequireDefault(_crudifyadmin);var K=!1,g=null;async function ri(){let i=_chunkWUOGD7AZjs.e.getInstance().getTokenInfo(),t=_optionalChain([i, 'optionalAccess', _14 => _14.apiEndpointAdmin]),r=_optionalChain([i, 'optionalAccess', _15 => _15.apiKeyEndpointAdmin]);return t&&r?{apiUrl:t,apiKey:r}:_chunkWUOGD7AZjs.a.waitForCredentials()}async function oi(){if(!K)return g||(g=(async()=>{try{let e=_chunkWUOGD7AZjs.e.getInstance(),{apiUrl:i,apiKey:t}=await ri();_crudifyadmin2.default.init({url:i,apiKey:t,getAdditionalHeaders:()=>{let r=e.getTokenInfo();return _optionalChain([r, 'optionalAccess', _16 => _16.crudifyTokens, 'optionalAccess', _17 => _17.accessToken])?{Authorization:`Bearer ${r.crudifyTokens.accessToken}`}:{}}}),K=!0}catch(e){throw g=null,console.error("[crudifyAdminWrapper] Initialization failed:",e),e}})(),g)}async function l(e){try{await oi();let i=await e();return!i.success&&_optionalChain([i, 'access', _18 => _18.errors, 'optionalAccess', _19 => _19.includes, 'call', _20 => _20("401")])?await _chunkWUOGD7AZjs.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 ni={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)),getActionsByProfile:e=>l(()=>_crudifyadmin2.default.getActionsByProfile(e)),updateActionsProfiles:e=>l(()=>_crudifyadmin2.default.updateActionsProfiles(e))};exports.AuthRoute = O; exports.CRITICAL_TRANSLATIONS = _chunkOLTLD4XBjs.a; exports.CrudiaAutoGenerate = _chunkOLTLD4XBjs.o; exports.CrudifyInitializationManager = C; exports.CrudifyInitializer = ei; exports.CrudifyLogin = _chunkOLTLD4XBjs.h; exports.CrudifyProvider = _chunkWUOGD7AZjs.b; exports.CrudifyThemeProvider = De; exports.ERROR_CODES = _chunkYIIUEOXCjs.a; exports.ERROR_SEVERITY_MAP = _chunkYIIUEOXCjs.b; exports.GlobalNotificationProvider = _chunkWUOGD7AZjs.g; exports.LoginComponent = _chunkOLTLD4XBjs.m; exports.POLICY_ACTIONS = _chunkOLTLD4XBjs.j; exports.PREFERRED_POLICY_ORDER = _chunkOLTLD4XBjs.k; exports.Policies = _chunkOLTLD4XBjs.l; exports.ProtectedRoute = k; exports.SessionDebugInfo = _chunkWUOGD7AZjs.k; exports.SessionLoadingScreen = v; exports.SessionManager = _chunkWUOGD7AZjs.e; exports.SessionProvider = _chunkWUOGD7AZjs.i; exports.SessionStatus = _chunkOLTLD4XBjs.n; exports.TokenStorage = _chunkWUOGD7AZjs.d; exports.TranslationService = _chunkOLTLD4XBjs.d; exports.TranslationsProvider = _chunkOLTLD4XBjs.f; exports.UserProfileDisplay = _chunkOLTLD4XBjs.i; exports.createErrorTranslator = _chunkFC7HOMNQjs.g; exports.crudify = _crudifybrowser2.default; exports.crudifyAdmin = ni; exports.crudifyInitManager = x; exports.decodeJwtSafely = _chunkFC7HOMNQjs.j; exports.extractSafeRedirectFromUrl = T; exports.getCookie = _chunkFC7HOMNQjs.a; exports.getCriticalLanguages = _chunkOLTLD4XBjs.b; exports.getCriticalTranslations = _chunkOLTLD4XBjs.c; exports.getCurrentUserEmail = _chunkFC7HOMNQjs.k; exports.getErrorMessage = _chunkYIIUEOXCjs.e; exports.handleCrudifyError = _chunkYIIUEOXCjs.g; exports.isTokenExpired = _chunkFC7HOMNQjs.l; exports.parseApiError = _chunkYIIUEOXCjs.c; exports.parseJavaScriptError = _chunkYIIUEOXCjs.f; exports.parseTransactionError = _chunkYIIUEOXCjs.d; exports.secureLocalStorage = _chunkNNY4A73Vjs.b; exports.secureSessionStorage = _chunkNNY4A73Vjs.a; exports.translateError = _chunkFC7HOMNQjs.f; exports.translateErrorCode = _chunkFC7HOMNQjs.d; exports.translateErrorCodes = _chunkFC7HOMNQjs.e; exports.translationService = _chunkOLTLD4XBjs.e; exports.useAuth = _chunkZWSHZHIHjs.b; exports.useAutoGenerate = _chunkWUOGD7AZjs.m; exports.useCrudify = _chunkWUOGD7AZjs.c; exports.useCrudifyInitializer = ii; exports.useCrudifyWithNotifications = _chunkZWSHZHIHjs.d; exports.useData = _chunkZWSHZHIHjs.c; exports.useGlobalNotification = _chunkWUOGD7AZjs.h; exports.useSession = _chunkWUOGD7AZjs.f; exports.useSessionContext = _chunkWUOGD7AZjs.j; exports.useTranslations = _chunkOLTLD4XBjs.g; exports.useUserData = _chunkZWSHZHIHjs.a; exports.useUserProfile = _chunkWUOGD7AZjs.l; exports.validateInternalRedirect = P;
6
+ `});function S({stage:e="loading",message:r}){let t=r||{initializing:"Initializing application...","validating-session":"Validating session...",loading:"Loading..."}[e];return _jsxruntime.jsxs.call(void 0, _jsxruntime.Fragment,{children:[_jsxruntime.jsx.call(void 0, Be,{}),_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:_e}),_jsxruntime.jsx.call(void 0, "p",{style:{fontSize:"1.25em",fontWeight:"500",marginTop:"24px",color:"#1f2937"},children:t})]})]})}var qe=/^[a-zA-Z0-9\-_./\?=&%#]+$/,We=[/^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]/,/\\/],C= exports.validateInternalRedirect =(e,r="/")=>{if(!e||typeof e!="string")return r;let o=e.trim();if(!o)return r;if(!o.startsWith("/"))return console.warn("\u{1F6A8} Open redirect blocked (relative path):",e),r;if(!qe.test(o))return console.warn("\u{1F6A8} Open redirect blocked (invalid characters):",e),r;let t=o.toLowerCase();for(let a of We)if(a.test(t))return console.warn("\u{1F6A8} Open redirect blocked (dangerous pattern):",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 console.warn("\u{1F6A8} Open redirect blocked (suspicious path part):",a),r;return o},v= exports.extractSafeRedirectFromUrl =(e,r="/")=>{try{let t=(typeof e=="string"?new URLSearchParams(e):e).get("redirect");if(!t)return r;let s=decodeURIComponent(t);return C(s,r)}catch(o){return console.warn("\u{1F6A8} Error parsing redirect parameter:",o),r}};function U({children:e,loadingComponent:r,loginPath:o="/login"}){let{isAuthenticated:t,isLoading:s,isInitialized:a,tokens:p,error:g}=_chunkMMFYNCPIjs.j.call(void 0, ),l=_reactrouterdom.useLocation.call(void 0, );if(!a||s)return _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:r||_jsxruntime.jsx.call(void 0, S,{stage:"validating-session"})});let d=t&&_optionalChain([p, 'optionalAccess', _2 => _2.accessToken])&&p.accessToken.length>0;if(g||!t||!d){p&&(!p.accessToken||p.accessToken.length===0)&&localStorage.removeItem("crudify_tokens");let y=l.pathname+l.search,A=C(y),x=encodeURIComponent(A);return _jsxruntime.jsx.call(void 0, _reactrouterdom.Navigate,{to:`${o}?redirect=${x}`,replace:!0})}return _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:e})}function w({children:e,redirectTo:r="/"}){let{isAuthenticated:o}=_chunkMMFYNCPIjs.j.call(void 0, ),t=_reactrouterdom.useLocation.call(void 0, );if(o){let s=new URLSearchParams(t.search),a=v(s,r);return _jsxruntime.jsx.call(void 0, _reactrouterdom.Navigate,{to:a,replace:!0})}return _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:e})}var N=_react.createContext.call(void 0, void 0),rr= exports.CrudifyInitializer =({config:e,children:r,fallback:o=null,onInitialized:t,onError:s})=>{let[a,p]=_react.useState.call(void 0, !1),[g,l]=_react.useState.call(void 0, !1),[d,y]=_react.useState.call(void 0, null),A=_react.useRef.call(void 0, !1),x=_react.useRef.call(void 0, !1);_react.useEffect.call(void 0, ()=>{A.current||(_chunkMMFYNCPIjs.o.registerHighPriorityInitializer(),A.current=!0),x.current||(x.current=!0,(async()=>{l(!0),y(null);try{let c=_chunkFC7HOMNQjs.b.call(void 0, {publicApiKey:_optionalChain([e, 'optionalAccess', _3 => _3.publicApiKey]),env:_optionalChain([e, 'optionalAccess', _4 => _4.env]),enableDebug:_optionalChain([e, 'optionalAccess', _5 => _5.enableLogging])});if(!c.publicApiKey)throw new Error("Crudify configuration missing. Please provide publicApiKey via props or ensure cookies are set by Lambda.");await _chunkMMFYNCPIjs.o.initialize({priority:"HIGH",publicApiKey:c.publicApiKey,env:c.env||"prod",enableLogging:_optionalChain([e, 'optionalAccess', _6 => _6.enableLogging]),requestedBy:"CrudifyInitializer"}),p(!0),l(!1),t&&t()}catch(c){let z=c instanceof Error?c:new Error(String(c));y(z),l(!1),s&&s(z)}})())},[_optionalChain([e, 'optionalAccess', _7 => _7.publicApiKey]),_optionalChain([e, 'optionalAccess', _8 => _8.env]),_optionalChain([e, 'optionalAccess', _9 => _9.enableLogging]),t,s]);let G={isInitialized:a,isInitializing:g,error:d};return g&&o?_jsxruntime.jsx.call(void 0, _jsxruntime.Fragment,{children:o}):(d&&console.error("[CrudifyInitializer] Initialization failed:",d),_jsxruntime.jsx.call(void 0, N.Provider,{value:G,children:r}))},or= exports.useCrudifyInitializer =()=>{let e=_react.useContext.call(void 0, N);if(!e)throw new Error("useCrudifyInitializer must be used within CrudifyInitializer");return e};var _crudifyadmin = require('@nocios/crudify-admin'); var _crudifyadmin2 = _interopRequireDefault(_crudifyadmin);var D=!1,m=null;async function ir(){let r=_chunkMMFYNCPIjs.e.getInstance().getTokenInfo(),o=_optionalChain([r, 'optionalAccess', _10 => _10.apiEndpointAdmin]),t=_optionalChain([r, 'optionalAccess', _11 => _11.apiKeyEndpointAdmin]);return o&&t?{apiUrl:o,apiKey:t}:_chunkMMFYNCPIjs.a.waitForCredentials()}async function nr(){if(!D)return m||(m=(async()=>{try{let e=_chunkMMFYNCPIjs.e.getInstance(),{apiUrl:r,apiKey:o}=await ir();_crudifyadmin2.default.init({url:r,apiKey:o,getAdditionalHeaders:()=>{let t=e.getTokenInfo();return _optionalChain([t, 'optionalAccess', _12 => _12.crudifyTokens, 'optionalAccess', _13 => _13.accessToken])?{Authorization:`Bearer ${t.crudifyTokens.accessToken}`}:{}}}),D=!0}catch(e){throw m=null,console.error("[crudifyAdminWrapper] Initialization failed:",e),e}})(),m)}async function n(e){try{await nr();let r=await e();return!r.success&&_optionalChain([r, 'access', _14 => _14.errors, 'optionalAccess', _15 => _15.includes, 'call', _16 => _16("401")])?await _chunkMMFYNCPIjs.e.getInstance().refreshTokens()?await e():(console.error("[crudifyAdmin] Token refresh failed"),typeof window<"u"&&(window.location.href="/login"),r):r}catch(r){return console.error("[crudifyAdmin] Operation error:",r),{success:!1,errors:r instanceof Error?r.message:"Unknown error"}}}var sr={listModules:()=>n(()=>_crudifyadmin2.default.listModules()),getModule:e=>n(()=>_crudifyadmin2.default.getModule(e)),createModule:e=>n(()=>_crudifyadmin2.default.createModule(e)),editModule:(e,r)=>n(()=>_crudifyadmin2.default.editModule(e,r)),deleteModule:e=>n(()=>_crudifyadmin2.default.deleteModule(e)),activateModule:e=>n(()=>_crudifyadmin2.default.activateModule(e)),deactivateModule:e=>n(()=>_crudifyadmin2.default.deactivateModule(e)),getModuleVersions:e=>n(()=>_crudifyadmin2.default.getModuleVersions(e)),listActions:e=>n(()=>_crudifyadmin2.default.listActions(e)),getAction:e=>n(()=>_crudifyadmin2.default.getAction(e)),createAction:e=>n(()=>_crudifyadmin2.default.createAction(e)),editAction:(e,r)=>n(()=>_crudifyadmin2.default.editAction(e,r)),deleteAction:e=>n(()=>_crudifyadmin2.default.deleteAction(e)),activateAction:e=>n(()=>_crudifyadmin2.default.activateAction(e)),deactivateAction:e=>n(()=>_crudifyadmin2.default.deactivateAction(e)),getActionVersions:e=>n(()=>_crudifyadmin2.default.getActionVersions(e)),getActionsByProfile:e=>n(()=>_crudifyadmin2.default.getActionsByProfile(e)),updateActionsProfiles:e=>n(()=>_crudifyadmin2.default.updateActionsProfiles(e))};exports.AuthRoute = w; exports.CRITICAL_TRANSLATIONS = _chunkPSZ2DSVHjs.a; exports.CrudiaAutoGenerate = _chunkPSZ2DSVHjs.o; exports.CrudiaFileField = _chunkPSZ2DSVHjs.p; exports.CrudifyInitializationManager = _chunkMMFYNCPIjs.n; exports.CrudifyInitializer = rr; exports.CrudifyLogin = _chunkPSZ2DSVHjs.h; exports.CrudifyProvider = _chunkMMFYNCPIjs.b; exports.CrudifyThemeProvider = Ge; exports.ERROR_CODES = _chunkYIIUEOXCjs.a; exports.ERROR_SEVERITY_MAP = _chunkYIIUEOXCjs.b; exports.GlobalNotificationProvider = _chunkMMFYNCPIjs.g; exports.LoginComponent = _chunkPSZ2DSVHjs.m; exports.POLICY_ACTIONS = _chunkPSZ2DSVHjs.j; exports.PREFERRED_POLICY_ORDER = _chunkPSZ2DSVHjs.k; exports.Policies = _chunkPSZ2DSVHjs.l; exports.ProtectedRoute = U; exports.SessionDebugInfo = _chunkMMFYNCPIjs.k; exports.SessionLoadingScreen = S; exports.SessionManager = _chunkMMFYNCPIjs.e; exports.SessionProvider = _chunkMMFYNCPIjs.i; exports.SessionStatus = _chunkPSZ2DSVHjs.n; exports.TokenStorage = _chunkMMFYNCPIjs.d; exports.TranslationService = _chunkPSZ2DSVHjs.d; exports.TranslationsProvider = _chunkPSZ2DSVHjs.f; exports.UserProfileDisplay = _chunkPSZ2DSVHjs.i; exports.createErrorTranslator = _chunkFC7HOMNQjs.g; exports.crudify = _crudifybrowser2.default; exports.crudifyAdmin = sr; exports.crudifyInitManager = _chunkMMFYNCPIjs.o; exports.decodeJwtSafely = _chunkFC7HOMNQjs.j; exports.extractSafeRedirectFromUrl = v; exports.getCookie = _chunkFC7HOMNQjs.a; exports.getCriticalLanguages = _chunkPSZ2DSVHjs.b; exports.getCriticalTranslations = _chunkPSZ2DSVHjs.c; exports.getCurrentUserEmail = _chunkFC7HOMNQjs.k; exports.getErrorMessage = _chunkYIIUEOXCjs.e; exports.handleCrudifyError = _chunkYIIUEOXCjs.g; exports.isTokenExpired = _chunkFC7HOMNQjs.l; exports.parseApiError = _chunkYIIUEOXCjs.c; exports.parseJavaScriptError = _chunkYIIUEOXCjs.f; exports.parseTransactionError = _chunkYIIUEOXCjs.d; exports.secureLocalStorage = _chunkNNY4A73Vjs.b; exports.secureSessionStorage = _chunkNNY4A73Vjs.a; exports.translateError = _chunkFC7HOMNQjs.f; exports.translateErrorCode = _chunkFC7HOMNQjs.d; exports.translateErrorCodes = _chunkFC7HOMNQjs.e; exports.translationService = _chunkPSZ2DSVHjs.e; exports.useAuth = _chunkM2BIAQ3Vjs.b; exports.useAutoGenerate = _chunkMMFYNCPIjs.m; exports.useCrudify = _chunkMMFYNCPIjs.c; exports.useCrudifyInitializer = or; exports.useCrudifyWithNotifications = _chunkM2BIAQ3Vjs.d; exports.useData = _chunkM2BIAQ3Vjs.c; exports.useFileUpload = _chunkMMFYNCPIjs.p; exports.useGlobalNotification = _chunkMMFYNCPIjs.h; exports.useSession = _chunkMMFYNCPIjs.f; exports.useSessionContext = _chunkMMFYNCPIjs.j; exports.useTranslations = _chunkPSZ2DSVHjs.g; exports.useUserData = _chunkM2BIAQ3Vjs.a; exports.useUserProfile = _chunkMMFYNCPIjs.l; exports.validateInternalRedirect = C;
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
- import{a as $,b as B,c as _,d as Z,e as V,f as W,g as q,h as Ie,i as Ae,j as Pe,k as Re,l as Ce,m as xe,n as ze,o as Te}from"./chunk-35AID65H.mjs";import{a as Se,b as be,c as Ee,d as Me}from"./chunk-6PXLM74L.mjs";import{a as L,b as Y,c as J,d as Q,e as f,f as te,g as se,h as ae,i as le,j as y,k as ce,l as he,m as ve}from"./chunk-TZKAMU3P.mjs";import{a as we,b as Le}from"./chunk-T2CPA46I.mjs";import{a as pe,b as ue,c as de,d as fe,e as ye,f as ge,g as me}from"./chunk-BJ6PIVZR.mjs";import{a as z,b as w,d as X,e as j,f as ee,g as ie,j as re,k as oe,l as ne}from"./chunk-6GPSBDW6.mjs";import{default as Vi}from"@nocios/crudify-browser";export*from"@nocios/crudify-browser";import{useMemo as Ne}from"react";import{ThemeProvider as ke,createTheme as Ue,CssBaseline as Oe}from"@mui/material";import{jsx as Ge,jsxs as Ke}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 De({children:e,defaultTheme:i={},disableCssBaseline:t=!1}){let r=Ne(()=>{let n=He(i);return Ue(n)},[i]);return Ke(ke,{theme:r,children:[!t&&Ge(Oe,{}),e]})}import{Navigate as Ve,useLocation as We}from"react-router-dom";import{Fragment as Be,jsx as A,jsxs as M}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"},$e=()=>A("style",{children:`
1
+ import{a as K,b as V,c as _,d as B,e as H,f as q,g as W,h as ge,i as Ae,j as xe,k as Re,l as Pe,m as Ce,n as Ie,o as Se,p as ze}from"./chunk-IZD5WNI4.mjs";import{a as Ee,b as Me,c as be,d as ke}from"./chunk-P4SZ3U4U.mjs";import{a as M,b as J,c as $,d as Y,e as u,f as ee,g as ie,h as ne,i as se,j as f,k as ae,l as ye,m as he,n as ve,o as R,p as Te}from"./chunk-ZSP7TBON.mjs";import{a as Le,b as Ue}from"./chunk-T2CPA46I.mjs";import{a as pe,b as ce,c as le,d as de,e as ue,f as fe,g as me}from"./chunk-BJ6PIVZR.mjs";import{a as h,b as E,d as Z,e as Q,f as X,g as j,j as re,k as oe,l as te}from"./chunk-6GPSBDW6.mjs";import{default as qr}from"@nocios/crudify-browser";export*from"@nocios/crudify-browser";import{useMemo as we}from"react";import{ThemeProvider as Oe,createTheme as Fe,CssBaseline as Ne}from"@mui/material";import{jsx as Ke,jsxs as Ve}from"react/jsx-runtime";var De=(e={})=>{try{let r=h("theme");if(r){let o=JSON.parse(decodeURIComponent(r));return{...e,...o}}}catch(r){console.warn("Error parsing theme from cookie:",r)}return e};function Ge({children:e,defaultTheme:r={},disableCssBaseline:o=!1}){let t=we(()=>{let s=De(r);return Fe(s)},[r]);return Ve(Oe,{theme:t,children:[!o&&Ke(Ne,{}),e]})}import{Navigate as Je,useLocation as $e}from"react-router-dom";import{Fragment as He,jsx as P,jsxs as b}from"react/jsx-runtime";var _e={border:"5px solid rgba(0, 0, 0, 0.1)",borderTopColor:"#3B82F6",borderRadius:"50%",width:"50px",height:"50px",animation:"spin 1s linear infinite"},Be=()=>P("style",{children:`
2
2
  @keyframes spin {
3
3
  0% { transform: rotate(0deg); }
4
4
  100% { transform: rotate(360deg); }
5
5
  }
6
- `});function v({stage:e="loading",message:i}){let r=i||{initializing:"Initializing application...","validating-session":"Validating session...",loading:"Loading..."}[e];return M(Be,{children:[A($e,{}),M("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:[A("div",{style:Fe}),A("p",{style:{fontSize:"1.25em",fontWeight:"500",marginTop:"24px",color:"#1f2937"},children:r})]})]})}var _e=/^[a-zA-Z0-9\-_./\?=&%#]+$/,Ze=[/^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 Ze)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 N,jsx as R}from"react/jsx-runtime";function k({children:e,loadingComponent:i,loginPath:t="/login"}){let{isAuthenticated:r,isLoading:n,isInitialized:o,tokens:s,error:c}=y(),u=We();if(!o||n)return R(N,{children:i||R(v,{stage:"validating-session"})});let d=r&&s?.accessToken&&s.accessToken.length>0;if(c||!r||!d){s&&(!s.accessToken||s.accessToken.length===0)&&localStorage.removeItem("crudify_tokens");let m=u.pathname+u.search,I=P(m),h=encodeURIComponent(I);return R(Ve,{to:`${t}?redirect=${h}`,replace:!0})}return R(N,{children:e})}import{Navigate as qe,useLocation as Ye}from"react-router-dom";import{Fragment as Je,jsx as U}from"react/jsx-runtime";function O({children:e,redirectTo:i="/"}){let{isAuthenticated:t}=y(),r=Ye();if(t){let n=new URLSearchParams(r.search),o=T(n,i);return U(qe,{to:o,replace:!0})}return U(Je,{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(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}}},x=C.getInstance();import{createContext as Qe,useContext as Xe,useEffect as je,useRef as H,useState as b}from"react";import{Fragment as ti,jsx as D}from"react/jsx-runtime";var G=Qe(void 0),ei=({config:e,children:i,fallback:t=null,onInitialized:r,onError:n})=>{let[o,s]=b(!1),[c,u]=b(!1),[d,m]=b(null),I=H(!1),h=H(!1);je(()=>{I.current||(x.registerHighPriorityInitializer(),I.current=!0),h.current||(h.current=!0,(async()=>{u(!0),m(null);try{let p=w({publicApiKey:e?.publicApiKey,env:e?.env,enableDebug:e?.enableLogging});if(!p.publicApiKey)throw new Error("Crudify configuration missing. Please provide publicApiKey via props or ensure cookies are set by Lambda.");await x.initialize({priority:"HIGH",publicApiKey:p.publicApiKey,env:p.env||"prod",enableLogging:e?.enableLogging,requestedBy:"CrudifyInitializer"}),s(!0),u(!1),r&&r()}catch(p){let E=p instanceof Error?p:new Error(String(p));m(E),u(!1),n&&n(E)}})())},[e?.publicApiKey,e?.env,e?.enableLogging,r,n]);let F={isInitialized:o,isInitializing:c,error:d};return c&&t?D(ti,{children:t}):(d&&console.error("[CrudifyInitializer] Initialization failed:",d),D(G.Provider,{value:F,children:i}))},ii=()=>{let e=Xe(G);if(!e)throw new Error("useCrudifyInitializer must be used within CrudifyInitializer");return e};import a from"@nocios/crudify-admin";var K=!1,g=null;async function ri(){let i=f.getInstance().getTokenInfo(),t=i?.apiEndpointAdmin,r=i?.apiKeyEndpointAdmin;return t&&r?{apiUrl:t,apiKey:r}:L.waitForCredentials()}async function oi(){if(!K)return g||(g=(async()=>{try{let e=f.getInstance(),{apiUrl:i,apiKey:t}=await ri();a.init({url:i,apiKey:t,getAdditionalHeaders:()=>{let r=e.getTokenInfo();return r?.crudifyTokens?.accessToken?{Authorization:`Bearer ${r.crudifyTokens.accessToken}`}:{}}}),K=!0}catch(e){throw g=null,console.error("[crudifyAdminWrapper] Initialization failed:",e),e}})(),g)}async function l(e){try{await oi();let i=await e();return!i.success&&i.errors?.includes("401")?await f.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 ni={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)),getActionsByProfile:e=>l(()=>a.getActionsByProfile(e)),updateActionsProfiles:e=>l(()=>a.updateActionsProfiles(e))};export{O as AuthRoute,$ as CRITICAL_TRANSLATIONS,Te as CrudiaAutoGenerate,C as CrudifyInitializationManager,ei as CrudifyInitializer,Ie as CrudifyLogin,Y as CrudifyProvider,De as CrudifyThemeProvider,pe as ERROR_CODES,ue as ERROR_SEVERITY_MAP,se as GlobalNotificationProvider,xe as LoginComponent,Pe as POLICY_ACTIONS,Re as PREFERRED_POLICY_ORDER,Ce as Policies,k as ProtectedRoute,ce as SessionDebugInfo,v as SessionLoadingScreen,f as SessionManager,le as SessionProvider,ze as SessionStatus,Q as TokenStorage,Z as TranslationService,W as TranslationsProvider,Ae as UserProfileDisplay,ie as createErrorTranslator,Vi as crudify,ni as crudifyAdmin,x as crudifyInitManager,re as decodeJwtSafely,T as extractSafeRedirectFromUrl,z as getCookie,B as getCriticalLanguages,_ as getCriticalTranslations,oe as getCurrentUserEmail,ye as getErrorMessage,me as handleCrudifyError,ne as isTokenExpired,de as parseApiError,ge as parseJavaScriptError,fe as parseTransactionError,Le as secureLocalStorage,we as secureSessionStorage,ee as translateError,X as translateErrorCode,j as translateErrorCodes,V as translationService,be as useAuth,ve as useAutoGenerate,J as useCrudify,ii as useCrudifyInitializer,Me as useCrudifyWithNotifications,Ee as useData,ae as useGlobalNotification,te as useSession,y as useSessionContext,q as useTranslations,Se as useUserData,he as useUserProfile,P as validateInternalRedirect};
6
+ `});function S({stage:e="loading",message:r}){let t=r||{initializing:"Initializing application...","validating-session":"Validating session...",loading:"Loading..."}[e];return b(He,{children:[P(Be,{}),b("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:[P("div",{style:_e}),P("p",{style:{fontSize:"1.25em",fontWeight:"500",marginTop:"24px",color:"#1f2937"},children:t})]})]})}var qe=/^[a-zA-Z0-9\-_./\?=&%#]+$/,We=[/^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]/,/\\/],C=(e,r="/")=>{if(!e||typeof e!="string")return r;let o=e.trim();if(!o)return r;if(!o.startsWith("/"))return console.warn("\u{1F6A8} Open redirect blocked (relative path):",e),r;if(!qe.test(o))return console.warn("\u{1F6A8} Open redirect blocked (invalid characters):",e),r;let t=o.toLowerCase();for(let a of We)if(a.test(t))return console.warn("\u{1F6A8} Open redirect blocked (dangerous pattern):",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 console.warn("\u{1F6A8} Open redirect blocked (suspicious path part):",a),r;return o},v=(e,r="/")=>{try{let t=(typeof e=="string"?new URLSearchParams(e):e).get("redirect");if(!t)return r;let s=decodeURIComponent(t);return C(s,r)}catch(o){return console.warn("\u{1F6A8} Error parsing redirect parameter:",o),r}};import{Fragment as L,jsx as I}from"react/jsx-runtime";function U({children:e,loadingComponent:r,loginPath:o="/login"}){let{isAuthenticated:t,isLoading:s,isInitialized:a,tokens:p,error:g}=f(),l=$e();if(!a||s)return I(L,{children:r||I(S,{stage:"validating-session"})});let d=t&&p?.accessToken&&p.accessToken.length>0;if(g||!t||!d){p&&(!p.accessToken||p.accessToken.length===0)&&localStorage.removeItem("crudify_tokens");let y=l.pathname+l.search,A=C(y),x=encodeURIComponent(A);return I(Je,{to:`${o}?redirect=${x}`,replace:!0})}return I(L,{children:e})}import{Navigate as Ye,useLocation as Ze}from"react-router-dom";import{Fragment as Qe,jsx as k}from"react/jsx-runtime";function w({children:e,redirectTo:r="/"}){let{isAuthenticated:o}=f(),t=Ze();if(o){let s=new URLSearchParams(t.search),a=v(s,r);return k(Ye,{to:a,replace:!0})}return k(Qe,{children:e})}import{createContext as Xe,useContext as je,useEffect as er,useRef as O,useState as T}from"react";import{Fragment as tr,jsx as F}from"react/jsx-runtime";var N=Xe(void 0),rr=({config:e,children:r,fallback:o=null,onInitialized:t,onError:s})=>{let[a,p]=T(!1),[g,l]=T(!1),[d,y]=T(null),A=O(!1),x=O(!1);er(()=>{A.current||(R.registerHighPriorityInitializer(),A.current=!0),x.current||(x.current=!0,(async()=>{l(!0),y(null);try{let c=E({publicApiKey:e?.publicApiKey,env:e?.env,enableDebug:e?.enableLogging});if(!c.publicApiKey)throw new Error("Crudify configuration missing. Please provide publicApiKey via props or ensure cookies are set by Lambda.");await R.initialize({priority:"HIGH",publicApiKey:c.publicApiKey,env:c.env||"prod",enableLogging:e?.enableLogging,requestedBy:"CrudifyInitializer"}),p(!0),l(!1),t&&t()}catch(c){let z=c instanceof Error?c:new Error(String(c));y(z),l(!1),s&&s(z)}})())},[e?.publicApiKey,e?.env,e?.enableLogging,t,s]);let G={isInitialized:a,isInitializing:g,error:d};return g&&o?F(tr,{children:o}):(d&&console.error("[CrudifyInitializer] Initialization failed:",d),F(N.Provider,{value:G,children:r}))},or=()=>{let e=je(N);if(!e)throw new Error("useCrudifyInitializer must be used within CrudifyInitializer");return e};import i from"@nocios/crudify-admin";var D=!1,m=null;async function ir(){let r=u.getInstance().getTokenInfo(),o=r?.apiEndpointAdmin,t=r?.apiKeyEndpointAdmin;return o&&t?{apiUrl:o,apiKey:t}:M.waitForCredentials()}async function nr(){if(!D)return m||(m=(async()=>{try{let e=u.getInstance(),{apiUrl:r,apiKey:o}=await ir();i.init({url:r,apiKey:o,getAdditionalHeaders:()=>{let t=e.getTokenInfo();return t?.crudifyTokens?.accessToken?{Authorization:`Bearer ${t.crudifyTokens.accessToken}`}:{}}}),D=!0}catch(e){throw m=null,console.error("[crudifyAdminWrapper] Initialization failed:",e),e}})(),m)}async function n(e){try{await nr();let r=await e();return!r.success&&r.errors?.includes("401")?await u.getInstance().refreshTokens()?await e():(console.error("[crudifyAdmin] Token refresh failed"),typeof window<"u"&&(window.location.href="/login"),r):r}catch(r){return console.error("[crudifyAdmin] Operation error:",r),{success:!1,errors:r instanceof Error?r.message:"Unknown error"}}}var sr={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{w as AuthRoute,K as CRITICAL_TRANSLATIONS,Se as CrudiaAutoGenerate,ze as CrudiaFileField,ve as CrudifyInitializationManager,rr as CrudifyInitializer,ge as CrudifyLogin,J as CrudifyProvider,Ge as CrudifyThemeProvider,pe as ERROR_CODES,ce as ERROR_SEVERITY_MAP,ie as GlobalNotificationProvider,Ce as LoginComponent,xe as POLICY_ACTIONS,Re as PREFERRED_POLICY_ORDER,Pe as Policies,U as ProtectedRoute,ae as SessionDebugInfo,S as SessionLoadingScreen,u as SessionManager,se as SessionProvider,Ie as SessionStatus,Y as TokenStorage,B as TranslationService,q as TranslationsProvider,Ae as UserProfileDisplay,j as createErrorTranslator,qr as crudify,sr as crudifyAdmin,R as crudifyInitManager,re as decodeJwtSafely,v as extractSafeRedirectFromUrl,h as getCookie,V as getCriticalLanguages,_ as getCriticalTranslations,oe as getCurrentUserEmail,ue as getErrorMessage,me as handleCrudifyError,te as isTokenExpired,le as parseApiError,fe as parseJavaScriptError,de as parseTransactionError,Ue as secureLocalStorage,Le as secureSessionStorage,X as translateError,Z as translateErrorCode,Q as translateErrorCodes,H as translationService,Me as useAuth,he as useAutoGenerate,$ as useCrudify,or as useCrudifyInitializer,ke as useCrudifyWithNotifications,be as useData,Te as useFileUpload,ne as useGlobalNotification,ee as useSession,f as useSessionContext,W as useTranslations,Ee as useUserData,ye as useUserProfile,C as validateInternalRedirect};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nocios/crudify-ui",
3
- "version": "4.4.26",
3
+ "version": "4.4.30",
4
4
  "description": "Biblioteca de componentes UI para Crudify",
5
5
  "author": "Nocios",
6
6
  "license": "MIT",
@@ -40,7 +40,7 @@
40
40
  },
41
41
  "dependencies": {
42
42
  "@nocios/crudify-admin": "^2.2.0",
43
- "@nocios/crudify-browser": "^4.1.8",
43
+ "@nocios/crudify-browser": "^4.1.12",
44
44
  "crypto-js": "^4.2.0",
45
45
  "dompurify": "^3.2.7",
46
46
  "uuid": "^13.0.0"