@nocios/crudify-components 2.0.32 → 2.0.38

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.
Files changed (178) hide show
  1. package/coverage/base.css +224 -0
  2. package/coverage/block-navigation.js +87 -0
  3. package/coverage/components/CrudiaAutoGenerate.tsx.html +583 -0
  4. package/coverage/components/CrudiaFileField/CrudiaFileField.tsx.html +1276 -0
  5. package/coverage/components/CrudiaFileField/components/DeleteConfirmationDialog.tsx.html +355 -0
  6. package/coverage/components/CrudiaFileField/components/DropZone.tsx.html +433 -0
  7. package/coverage/components/CrudiaFileField/components/FileItemRow.tsx.html +751 -0
  8. package/coverage/components/CrudiaFileField/components/FileThumbnail.tsx.html +1195 -0
  9. package/coverage/components/CrudiaFileField/components/index.html +176 -0
  10. package/coverage/components/CrudiaFileField/components/index.ts.html +115 -0
  11. package/coverage/components/CrudiaFileField/hooks/index.html +146 -0
  12. package/coverage/components/CrudiaFileField/hooks/index.ts.html +112 -0
  13. package/coverage/components/CrudiaFileField/hooks/useDeleteConfirmation.ts.html +421 -0
  14. package/coverage/components/CrudiaFileField/hooks/useDragDrop.ts.html +403 -0
  15. package/coverage/components/CrudiaFileField/index.html +131 -0
  16. package/coverage/components/CrudiaFileField/index.ts.html +112 -0
  17. package/coverage/components/CrudiaFileField/utils/formatters.ts.html +163 -0
  18. package/coverage/components/CrudiaFileField/utils/icons.tsx.html +253 -0
  19. package/coverage/components/CrudiaFileField/utils/index.html +131 -0
  20. package/coverage/components/CrudiaMarkdownField.tsx.html +619 -0
  21. package/coverage/components/CrudifyLogin/Forms/CheckCodeForm.tsx.html +586 -0
  22. package/coverage/components/CrudifyLogin/Forms/ForgotPasswordForm.tsx.html +694 -0
  23. package/coverage/components/CrudifyLogin/Forms/LoginForm.tsx.html +835 -0
  24. package/coverage/components/CrudifyLogin/Forms/ResetPasswordForm.tsx.html +1180 -0
  25. package/coverage/components/CrudifyLogin/Forms/components/CodeInput.tsx.html +283 -0
  26. package/coverage/components/CrudifyLogin/Forms/components/FormAlert.tsx.html +202 -0
  27. package/coverage/components/CrudifyLogin/Forms/components/PasswordInput.tsx.html +340 -0
  28. package/coverage/components/CrudifyLogin/Forms/components/index.html +161 -0
  29. package/coverage/components/CrudifyLogin/Forms/components/index.ts.html +106 -0
  30. package/coverage/components/CrudifyLogin/Forms/index.html +161 -0
  31. package/coverage/components/CrudifyLogin/Forms/utils/errorTranslation.ts.html +268 -0
  32. package/coverage/components/CrudifyLogin/Forms/utils/index.html +161 -0
  33. package/coverage/components/CrudifyLogin/Forms/utils/index.ts.html +106 -0
  34. package/coverage/components/CrudifyLogin/Forms/utils/paramUtils.ts.html +478 -0
  35. package/coverage/components/CrudifyLogin/Forms/utils/validation.ts.html +289 -0
  36. package/coverage/components/CrudifyLogin/components/CrudifyInitializer.tsx.html +262 -0
  37. package/coverage/components/CrudifyLogin/components/index.html +116 -0
  38. package/coverage/components/CrudifyLogin/context/CrudifyProvider.tsx.html +382 -0
  39. package/coverage/components/CrudifyLogin/context/I18nProvider.tsx.html +397 -0
  40. package/coverage/components/CrudifyLogin/context/LoginStateProvider.tsx.html +1249 -0
  41. package/coverage/components/CrudifyLogin/context/index.html +146 -0
  42. package/coverage/components/CrudifyLogin/hooks/index.html +116 -0
  43. package/coverage/components/CrudifyLogin/hooks/useTranslationsFromUrl.ts.html +292 -0
  44. package/coverage/components/CrudifyLogin/index.html +116 -0
  45. package/coverage/components/CrudifyLogin/index.tsx.html +475 -0
  46. package/coverage/components/GlobalNotificationProvider.tsx.html +781 -0
  47. package/coverage/components/LoginComponent.tsx.html +727 -0
  48. package/coverage/components/PasswordRequirements/index.html +116 -0
  49. package/coverage/components/PasswordRequirements/index.tsx.html +226 -0
  50. package/coverage/components/PublicPolicies/FieldSelector/FieldSelector.tsx.html +982 -0
  51. package/coverage/components/PublicPolicies/FieldSelector/index.html +131 -0
  52. package/coverage/components/PublicPolicies/FieldSelector/index.ts.html +85 -0
  53. package/coverage/components/PublicPolicies/Policies.tsx.html +610 -0
  54. package/coverage/components/PublicPolicies/PolicyItem/PolicyItem.tsx.html +856 -0
  55. package/coverage/components/PublicPolicies/PolicyItem/index.html +131 -0
  56. package/coverage/components/PublicPolicies/PolicyItem/index.ts.html +85 -0
  57. package/coverage/components/PublicPolicies/constants.ts.html +127 -0
  58. package/coverage/components/PublicPolicies/index.html +131 -0
  59. package/coverage/components/SessionTimeIndicator/index.html +116 -0
  60. package/coverage/components/SessionTimeIndicator/index.tsx.html +505 -0
  61. package/coverage/components/UserProfile/UserProfileDisplay.tsx.html +826 -0
  62. package/coverage/components/UserProfile/index.html +131 -0
  63. package/coverage/components/UserProfile/index.ts.html +85 -0
  64. package/coverage/components/index.html +176 -0
  65. package/coverage/components/index.ts.html +160 -0
  66. package/coverage/core/CrossTabSyncManager.ts.html +814 -0
  67. package/coverage/core/CrudifyInitializationManager.ts.html +1132 -0
  68. package/coverage/core/SessionManager.ts.html +2764 -0
  69. package/coverage/core/index.html +146 -0
  70. package/coverage/coverage-final.json +87 -0
  71. package/coverage/favicon.png +0 -0
  72. package/coverage/hooks/index.html +131 -0
  73. package/coverage/hooks/useAutoGenerate.ts.html +562 -0
  74. package/coverage/hooks/useFileUpload/index.html +131 -0
  75. package/coverage/hooks/useFileUpload/index.ts.html +112 -0
  76. package/coverage/hooks/useFileUpload/services/index.html +116 -0
  77. package/coverage/hooks/useFileUpload/services/uploadService.ts.html +610 -0
  78. package/coverage/hooks/useFileUpload/useFileUpload.ts.html +1870 -0
  79. package/coverage/hooks/useFileUpload/utils/fileUtils.ts.html +271 -0
  80. package/coverage/hooks/useFileUpload/utils/index.html +146 -0
  81. package/coverage/hooks/useFileUpload/utils/mimeTypes.ts.html +235 -0
  82. package/coverage/hooks/useFileUpload/utils/validation.ts.html +379 -0
  83. package/coverage/hooks/useSession/constants.ts.html +217 -0
  84. package/coverage/hooks/useSession/hooks/index.html +176 -0
  85. package/coverage/hooks/useSession/hooks/useAuthEventSubscriber.ts.html +331 -0
  86. package/coverage/hooks/useSession/hooks/useCrossTabSync.ts.html +433 -0
  87. package/coverage/hooks/useSession/hooks/useSessionActions.ts.html +664 -0
  88. package/coverage/hooks/useSession/hooks/useSessionState.ts.html +295 -0
  89. package/coverage/hooks/useSession/hooks/useTokenRefreshScheduler.ts.html +490 -0
  90. package/coverage/hooks/useSession/index.html +161 -0
  91. package/coverage/hooks/useSession/index.ts.html +127 -0
  92. package/coverage/hooks/useSession/types.ts.html +427 -0
  93. package/coverage/hooks/useSession/useSession.ts.html +526 -0
  94. package/coverage/hooks/useSession/utils/index.html +131 -0
  95. package/coverage/hooks/useSession/utils/initializeSession.ts.html +424 -0
  96. package/coverage/hooks/useSession/utils/tokenUtils.ts.html +280 -0
  97. package/coverage/hooks/useUserProfile.ts.html +658 -0
  98. package/coverage/index.html +566 -0
  99. package/coverage/prettify.css +1 -0
  100. package/coverage/prettify.js +2 -0
  101. package/coverage/providers/SessionProvider.tsx.html +1150 -0
  102. package/coverage/providers/TranslationsProvider.tsx.html +1450 -0
  103. package/coverage/providers/index.html +131 -0
  104. package/coverage/services/credentialsEventBus.ts.html +310 -0
  105. package/coverage/services/index.html +131 -0
  106. package/coverage/services/translationService.ts.html +1318 -0
  107. package/coverage/sort-arrow-sprite.png +0 -0
  108. package/coverage/sorter.js +210 -0
  109. package/coverage/translations/critical.ts.html +1195 -0
  110. package/coverage/translations/index.html +116 -0
  111. package/coverage/types/index.html +116 -0
  112. package/coverage/types/password.ts.html +178 -0
  113. package/coverage/utils/authEventBus.ts.html +454 -0
  114. package/coverage/utils/configResolver.ts.html +460 -0
  115. package/coverage/utils/cookieSync.ts.html +580 -0
  116. package/coverage/utils/errorHandler.ts.html +1264 -0
  117. package/coverage/utils/errorTranslation.ts.html +862 -0
  118. package/coverage/utils/index.html +296 -0
  119. package/coverage/utils/jwtUtils.ts.html +301 -0
  120. package/coverage/utils/logger.ts.html +901 -0
  121. package/coverage/utils/navigationTracker.ts.html +565 -0
  122. package/coverage/utils/passwordValidation.ts.html +259 -0
  123. package/coverage/utils/redirectSecurity.ts.html +715 -0
  124. package/coverage/utils/tenantConfig.ts.html +700 -0
  125. package/coverage/utils/tokenStorage.ts.html +1768 -0
  126. package/coverage/utils/webCrypto.ts.html +472 -0
  127. package/dist/{CrudiaMarkdownField-C54-A_J3.d.mts → CrudiaMarkdownField-BvJn2GL8.d.mts} +17 -7
  128. package/dist/{CrudiaMarkdownField-C8HQh7s5.d.ts → CrudiaMarkdownField-CggOpcBM.d.ts} +17 -7
  129. package/dist/chunk-44VU4TSP.mjs +1 -0
  130. package/dist/chunk-4LMFQECS.js +1 -0
  131. package/dist/chunk-77UKXG5L.mjs +1 -0
  132. package/dist/{chunk-4VN5YRYZ.js → chunk-BXFEQ6KP.js} +1 -1
  133. package/dist/{chunk-6ONAT4QU.js → chunk-H6XXWDUT.js} +1 -1
  134. package/dist/chunk-NIRLP2TC.js +1 -0
  135. package/dist/chunk-O4FUHIQG.mjs +1 -0
  136. package/dist/chunk-SYHNHKFA.mjs +1 -0
  137. package/dist/chunk-W4ZYKPOK.js +1 -0
  138. package/dist/{chunk-RJBX4MWF.mjs → chunk-WMLIOPUC.mjs} +1 -1
  139. package/dist/components.d.mts +1 -1
  140. package/dist/components.d.ts +1 -1
  141. package/dist/components.js +1 -1
  142. package/dist/components.mjs +1 -1
  143. package/dist/errorTranslation-D-Y7uNN_.d.mts +141 -0
  144. package/dist/errorTranslation-DDlAXpMl.d.ts +141 -0
  145. package/dist/hooks.d.mts +2 -2
  146. package/dist/hooks.d.ts +2 -2
  147. package/dist/hooks.js +1 -1
  148. package/dist/hooks.mjs +1 -1
  149. package/dist/{index-DY90WVQQ.d.mts → index-U--xRr8A.d.mts} +225 -191
  150. package/dist/{index-d1vE803G.d.ts → index-dXVRVcEB.d.ts} +225 -191
  151. package/dist/index.d.mts +179 -6
  152. package/dist/index.d.ts +179 -6
  153. package/dist/index.js +2 -2
  154. package/dist/index.mjs +1 -1
  155. package/dist/{errorTranslation-By5Av0tL.d.ts → tenantConfig-DqJqQkoR.d.mts} +116 -139
  156. package/dist/{errorTranslation-DeeDj7Vt.d.mts → tenantConfig-DqJqQkoR.d.ts} +116 -139
  157. package/dist/utils.d.mts +2 -2
  158. package/dist/utils.d.ts +2 -2
  159. package/dist/utils.js +1 -1
  160. package/dist/utils.mjs +1 -1
  161. package/package.json +1 -1
  162. package/coverage/.tmp/coverage-102.json +0 -1
  163. package/coverage/.tmp/coverage-103.json +0 -1
  164. package/coverage/.tmp/coverage-104.json +0 -1
  165. package/coverage/.tmp/coverage-105.json +0 -1
  166. package/coverage/.tmp/coverage-106.json +0 -1
  167. package/coverage/.tmp/coverage-107.json +0 -1
  168. package/dist/api-B4uXiHF0.d.mts +0 -118
  169. package/dist/api-B4uXiHF0.d.ts +0 -118
  170. package/dist/chunk-4ILUXVPW.mjs +0 -1
  171. package/dist/chunk-5XBTRBE5.js +0 -1
  172. package/dist/chunk-CR5KJUST.js +0 -1
  173. package/dist/chunk-H5M2Q6PB.mjs +0 -1
  174. package/dist/chunk-JAPL7EZJ.mjs +0 -1
  175. package/dist/chunk-L7GKP6XY.mjs +0 -1
  176. package/dist/chunk-NSV6ECYO.js +0 -1
  177. package/dist/chunk-PTUSZGL4.mjs +0 -1
  178. package/dist/chunk-T6R65ROU.js +0 -1
@@ -0,0 +1,472 @@
1
+
2
+ <!doctype html>
3
+ <html lang="en">
4
+
5
+ <head>
6
+ <title>Code coverage report for utils/webCrypto.ts</title>
7
+ <meta charset="utf-8" />
8
+ <link rel="stylesheet" href="../prettify.css" />
9
+ <link rel="stylesheet" href="../base.css" />
10
+ <link rel="shortcut icon" type="image/x-icon" href="../favicon.png" />
11
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
12
+ <style type='text/css'>
13
+ .coverage-summary .sorter {
14
+ background-image: url(../sort-arrow-sprite.png);
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body>
20
+ <div class='wrapper'>
21
+ <div class='pad1'>
22
+ <h1><a href="../index.html">All files</a> / <a href="index.html">utils</a> webCrypto.ts</h1>
23
+ <div class='clearfix'>
24
+
25
+ <div class='fl pad1y space-right2'>
26
+ <span class="strong">37.98% </span>
27
+ <span class="quiet">Statements</span>
28
+ <span class='fraction'>49/129</span>
29
+ </div>
30
+
31
+
32
+ <div class='fl pad1y space-right2'>
33
+ <span class="strong">100% </span>
34
+ <span class="quiet">Branches</span>
35
+ <span class='fraction'>0/0</span>
36
+ </div>
37
+
38
+
39
+ <div class='fl pad1y space-right2'>
40
+ <span class="strong">0% </span>
41
+ <span class="quiet">Functions</span>
42
+ <span class='fraction'>0/8</span>
43
+ </div>
44
+
45
+
46
+ <div class='fl pad1y space-right2'>
47
+ <span class="strong">37.98% </span>
48
+ <span class="quiet">Lines</span>
49
+ <span class='fraction'>49/129</span>
50
+ </div>
51
+
52
+
53
+ </div>
54
+ <p class="quiet">
55
+ Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block.
56
+ </p>
57
+ <template id="filterTemplate">
58
+ <div class="quiet">
59
+ Filter:
60
+ <input type="search" id="fileSearch">
61
+ </div>
62
+ </template>
63
+ </div>
64
+ <div class='status-line low'></div>
65
+ <pre><table class="coverage">
66
+ <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a>
67
+ <a name='L2'></a><a href='#L2'>2</a>
68
+ <a name='L3'></a><a href='#L3'>3</a>
69
+ <a name='L4'></a><a href='#L4'>4</a>
70
+ <a name='L5'></a><a href='#L5'>5</a>
71
+ <a name='L6'></a><a href='#L6'>6</a>
72
+ <a name='L7'></a><a href='#L7'>7</a>
73
+ <a name='L8'></a><a href='#L8'>8</a>
74
+ <a name='L9'></a><a href='#L9'>9</a>
75
+ <a name='L10'></a><a href='#L10'>10</a>
76
+ <a name='L11'></a><a href='#L11'>11</a>
77
+ <a name='L12'></a><a href='#L12'>12</a>
78
+ <a name='L13'></a><a href='#L13'>13</a>
79
+ <a name='L14'></a><a href='#L14'>14</a>
80
+ <a name='L15'></a><a href='#L15'>15</a>
81
+ <a name='L16'></a><a href='#L16'>16</a>
82
+ <a name='L17'></a><a href='#L17'>17</a>
83
+ <a name='L18'></a><a href='#L18'>18</a>
84
+ <a name='L19'></a><a href='#L19'>19</a>
85
+ <a name='L20'></a><a href='#L20'>20</a>
86
+ <a name='L21'></a><a href='#L21'>21</a>
87
+ <a name='L22'></a><a href='#L22'>22</a>
88
+ <a name='L23'></a><a href='#L23'>23</a>
89
+ <a name='L24'></a><a href='#L24'>24</a>
90
+ <a name='L25'></a><a href='#L25'>25</a>
91
+ <a name='L26'></a><a href='#L26'>26</a>
92
+ <a name='L27'></a><a href='#L27'>27</a>
93
+ <a name='L28'></a><a href='#L28'>28</a>
94
+ <a name='L29'></a><a href='#L29'>29</a>
95
+ <a name='L30'></a><a href='#L30'>30</a>
96
+ <a name='L31'></a><a href='#L31'>31</a>
97
+ <a name='L32'></a><a href='#L32'>32</a>
98
+ <a name='L33'></a><a href='#L33'>33</a>
99
+ <a name='L34'></a><a href='#L34'>34</a>
100
+ <a name='L35'></a><a href='#L35'>35</a>
101
+ <a name='L36'></a><a href='#L36'>36</a>
102
+ <a name='L37'></a><a href='#L37'>37</a>
103
+ <a name='L38'></a><a href='#L38'>38</a>
104
+ <a name='L39'></a><a href='#L39'>39</a>
105
+ <a name='L40'></a><a href='#L40'>40</a>
106
+ <a name='L41'></a><a href='#L41'>41</a>
107
+ <a name='L42'></a><a href='#L42'>42</a>
108
+ <a name='L43'></a><a href='#L43'>43</a>
109
+ <a name='L44'></a><a href='#L44'>44</a>
110
+ <a name='L45'></a><a href='#L45'>45</a>
111
+ <a name='L46'></a><a href='#L46'>46</a>
112
+ <a name='L47'></a><a href='#L47'>47</a>
113
+ <a name='L48'></a><a href='#L48'>48</a>
114
+ <a name='L49'></a><a href='#L49'>49</a>
115
+ <a name='L50'></a><a href='#L50'>50</a>
116
+ <a name='L51'></a><a href='#L51'>51</a>
117
+ <a name='L52'></a><a href='#L52'>52</a>
118
+ <a name='L53'></a><a href='#L53'>53</a>
119
+ <a name='L54'></a><a href='#L54'>54</a>
120
+ <a name='L55'></a><a href='#L55'>55</a>
121
+ <a name='L56'></a><a href='#L56'>56</a>
122
+ <a name='L57'></a><a href='#L57'>57</a>
123
+ <a name='L58'></a><a href='#L58'>58</a>
124
+ <a name='L59'></a><a href='#L59'>59</a>
125
+ <a name='L60'></a><a href='#L60'>60</a>
126
+ <a name='L61'></a><a href='#L61'>61</a>
127
+ <a name='L62'></a><a href='#L62'>62</a>
128
+ <a name='L63'></a><a href='#L63'>63</a>
129
+ <a name='L64'></a><a href='#L64'>64</a>
130
+ <a name='L65'></a><a href='#L65'>65</a>
131
+ <a name='L66'></a><a href='#L66'>66</a>
132
+ <a name='L67'></a><a href='#L67'>67</a>
133
+ <a name='L68'></a><a href='#L68'>68</a>
134
+ <a name='L69'></a><a href='#L69'>69</a>
135
+ <a name='L70'></a><a href='#L70'>70</a>
136
+ <a name='L71'></a><a href='#L71'>71</a>
137
+ <a name='L72'></a><a href='#L72'>72</a>
138
+ <a name='L73'></a><a href='#L73'>73</a>
139
+ <a name='L74'></a><a href='#L74'>74</a>
140
+ <a name='L75'></a><a href='#L75'>75</a>
141
+ <a name='L76'></a><a href='#L76'>76</a>
142
+ <a name='L77'></a><a href='#L77'>77</a>
143
+ <a name='L78'></a><a href='#L78'>78</a>
144
+ <a name='L79'></a><a href='#L79'>79</a>
145
+ <a name='L80'></a><a href='#L80'>80</a>
146
+ <a name='L81'></a><a href='#L81'>81</a>
147
+ <a name='L82'></a><a href='#L82'>82</a>
148
+ <a name='L83'></a><a href='#L83'>83</a>
149
+ <a name='L84'></a><a href='#L84'>84</a>
150
+ <a name='L85'></a><a href='#L85'>85</a>
151
+ <a name='L86'></a><a href='#L86'>86</a>
152
+ <a name='L87'></a><a href='#L87'>87</a>
153
+ <a name='L88'></a><a href='#L88'>88</a>
154
+ <a name='L89'></a><a href='#L89'>89</a>
155
+ <a name='L90'></a><a href='#L90'>90</a>
156
+ <a name='L91'></a><a href='#L91'>91</a>
157
+ <a name='L92'></a><a href='#L92'>92</a>
158
+ <a name='L93'></a><a href='#L93'>93</a>
159
+ <a name='L94'></a><a href='#L94'>94</a>
160
+ <a name='L95'></a><a href='#L95'>95</a>
161
+ <a name='L96'></a><a href='#L96'>96</a>
162
+ <a name='L97'></a><a href='#L97'>97</a>
163
+ <a name='L98'></a><a href='#L98'>98</a>
164
+ <a name='L99'></a><a href='#L99'>99</a>
165
+ <a name='L100'></a><a href='#L100'>100</a>
166
+ <a name='L101'></a><a href='#L101'>101</a>
167
+ <a name='L102'></a><a href='#L102'>102</a>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a>
170
+ <a name='L105'></a><a href='#L105'>105</a>
171
+ <a name='L106'></a><a href='#L106'>106</a>
172
+ <a name='L107'></a><a href='#L107'>107</a>
173
+ <a name='L108'></a><a href='#L108'>108</a>
174
+ <a name='L109'></a><a href='#L109'>109</a>
175
+ <a name='L110'></a><a href='#L110'>110</a>
176
+ <a name='L111'></a><a href='#L111'>111</a>
177
+ <a name='L112'></a><a href='#L112'>112</a>
178
+ <a name='L113'></a><a href='#L113'>113</a>
179
+ <a name='L114'></a><a href='#L114'>114</a>
180
+ <a name='L115'></a><a href='#L115'>115</a>
181
+ <a name='L116'></a><a href='#L116'>116</a>
182
+ <a name='L117'></a><a href='#L117'>117</a>
183
+ <a name='L118'></a><a href='#L118'>118</a>
184
+ <a name='L119'></a><a href='#L119'>119</a>
185
+ <a name='L120'></a><a href='#L120'>120</a>
186
+ <a name='L121'></a><a href='#L121'>121</a>
187
+ <a name='L122'></a><a href='#L122'>122</a>
188
+ <a name='L123'></a><a href='#L123'>123</a>
189
+ <a name='L124'></a><a href='#L124'>124</a>
190
+ <a name='L125'></a><a href='#L125'>125</a>
191
+ <a name='L126'></a><a href='#L126'>126</a>
192
+ <a name='L127'></a><a href='#L127'>127</a>
193
+ <a name='L128'></a><a href='#L128'>128</a>
194
+ <a name='L129'></a><a href='#L129'>129</a>
195
+ <a name='L130'></a><a href='#L130'>130</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
196
+ <span class="cline-any cline-yes">1x</span>
197
+ <span class="cline-any cline-yes">1x</span>
198
+ <span class="cline-any cline-yes">1x</span>
199
+ <span class="cline-any cline-yes">1x</span>
200
+ <span class="cline-any cline-yes">1x</span>
201
+ <span class="cline-any cline-yes">1x</span>
202
+ <span class="cline-any cline-yes">1x</span>
203
+ <span class="cline-any cline-yes">1x</span>
204
+ <span class="cline-any cline-yes">1x</span>
205
+ <span class="cline-any cline-yes">1x</span>
206
+ <span class="cline-any cline-yes">1x</span>
207
+ <span class="cline-any cline-yes">1x</span>
208
+ <span class="cline-any cline-yes">1x</span>
209
+ <span class="cline-any cline-yes">1x</span>
210
+ <span class="cline-any cline-yes">1x</span>
211
+ <span class="cline-any cline-yes">1x</span>
212
+ <span class="cline-any cline-yes">1x</span>
213
+ <span class="cline-any cline-yes">1x</span>
214
+ <span class="cline-any cline-yes">1x</span>
215
+ <span class="cline-any cline-yes">1x</span>
216
+ <span class="cline-any cline-no">&nbsp;</span>
217
+ <span class="cline-any cline-no">&nbsp;</span>
218
+ <span class="cline-any cline-no">&nbsp;</span>
219
+ <span class="cline-any cline-no">&nbsp;</span>
220
+ <span class="cline-any cline-no">&nbsp;</span>
221
+ <span class="cline-any cline-no">&nbsp;</span>
222
+ <span class="cline-any cline-no">&nbsp;</span>
223
+ <span class="cline-any cline-yes">1x</span>
224
+ <span class="cline-any cline-yes">1x</span>
225
+ <span class="cline-any cline-yes">1x</span>
226
+ <span class="cline-any cline-yes">1x</span>
227
+ <span class="cline-any cline-no">&nbsp;</span>
228
+ <span class="cline-any cline-no">&nbsp;</span>
229
+ <span class="cline-any cline-no">&nbsp;</span>
230
+ <span class="cline-any cline-no">&nbsp;</span>
231
+ <span class="cline-any cline-no">&nbsp;</span>
232
+ <span class="cline-any cline-no">&nbsp;</span>
233
+ <span class="cline-any cline-no">&nbsp;</span>
234
+ <span class="cline-any cline-no">&nbsp;</span>
235
+ <span class="cline-any cline-no">&nbsp;</span>
236
+ <span class="cline-any cline-no">&nbsp;</span>
237
+ <span class="cline-any cline-no">&nbsp;</span>
238
+ <span class="cline-any cline-no">&nbsp;</span>
239
+ <span class="cline-any cline-no">&nbsp;</span>
240
+ <span class="cline-any cline-no">&nbsp;</span>
241
+ <span class="cline-any cline-no">&nbsp;</span>
242
+ <span class="cline-any cline-no">&nbsp;</span>
243
+ <span class="cline-any cline-no">&nbsp;</span>
244
+ <span class="cline-any cline-yes">1x</span>
245
+ <span class="cline-any cline-yes">1x</span>
246
+ <span class="cline-any cline-yes">1x</span>
247
+ <span class="cline-any cline-yes">1x</span>
248
+ <span class="cline-any cline-yes">1x</span>
249
+ <span class="cline-any cline-no">&nbsp;</span>
250
+ <span class="cline-any cline-no">&nbsp;</span>
251
+ <span class="cline-any cline-no">&nbsp;</span>
252
+ <span class="cline-any cline-no">&nbsp;</span>
253
+ <span class="cline-any cline-no">&nbsp;</span>
254
+ <span class="cline-any cline-no">&nbsp;</span>
255
+ <span class="cline-any cline-no">&nbsp;</span>
256
+ <span class="cline-any cline-no">&nbsp;</span>
257
+ <span class="cline-any cline-no">&nbsp;</span>
258
+ <span class="cline-any cline-no">&nbsp;</span>
259
+ <span class="cline-any cline-no">&nbsp;</span>
260
+ <span class="cline-any cline-no">&nbsp;</span>
261
+ <span class="cline-any cline-no">&nbsp;</span>
262
+ <span class="cline-any cline-yes">1x</span>
263
+ <span class="cline-any cline-yes">1x</span>
264
+ <span class="cline-any cline-yes">1x</span>
265
+ <span class="cline-any cline-yes">1x</span>
266
+ <span class="cline-any cline-yes">1x</span>
267
+ <span class="cline-any cline-no">&nbsp;</span>
268
+ <span class="cline-any cline-no">&nbsp;</span>
269
+ <span class="cline-any cline-no">&nbsp;</span>
270
+ <span class="cline-any cline-no">&nbsp;</span>
271
+ <span class="cline-any cline-no">&nbsp;</span>
272
+ <span class="cline-any cline-no">&nbsp;</span>
273
+ <span class="cline-any cline-no">&nbsp;</span>
274
+ <span class="cline-any cline-no">&nbsp;</span>
275
+ <span class="cline-any cline-no">&nbsp;</span>
276
+ <span class="cline-any cline-no">&nbsp;</span>
277
+ <span class="cline-any cline-no">&nbsp;</span>
278
+ <span class="cline-any cline-no">&nbsp;</span>
279
+ <span class="cline-any cline-no">&nbsp;</span>
280
+ <span class="cline-any cline-no">&nbsp;</span>
281
+ <span class="cline-any cline-no">&nbsp;</span>
282
+ <span class="cline-any cline-no">&nbsp;</span>
283
+ <span class="cline-any cline-no">&nbsp;</span>
284
+ <span class="cline-any cline-no">&nbsp;</span>
285
+ <span class="cline-any cline-no">&nbsp;</span>
286
+ <span class="cline-any cline-no">&nbsp;</span>
287
+ <span class="cline-any cline-no">&nbsp;</span>
288
+ <span class="cline-any cline-no">&nbsp;</span>
289
+ <span class="cline-any cline-no">&nbsp;</span>
290
+ <span class="cline-any cline-no">&nbsp;</span>
291
+ <span class="cline-any cline-yes">1x</span>
292
+ <span class="cline-any cline-yes">1x</span>
293
+ <span class="cline-any cline-yes">1x</span>
294
+ <span class="cline-any cline-yes">1x</span>
295
+ <span class="cline-any cline-yes">1x</span>
296
+ <span class="cline-any cline-no">&nbsp;</span>
297
+ <span class="cline-any cline-no">&nbsp;</span>
298
+ <span class="cline-any cline-yes">1x</span>
299
+ <span class="cline-any cline-yes">1x</span>
300
+ <span class="cline-any cline-yes">1x</span>
301
+ <span class="cline-any cline-yes">1x</span>
302
+ <span class="cline-any cline-yes">1x</span>
303
+ <span class="cline-any cline-no">&nbsp;</span>
304
+ <span class="cline-any cline-no">&nbsp;</span>
305
+ <span class="cline-any cline-yes">1x</span>
306
+ <span class="cline-any cline-yes">1x</span>
307
+ <span class="cline-any cline-yes">1x</span>
308
+ <span class="cline-any cline-no">&nbsp;</span>
309
+ <span class="cline-any cline-no">&nbsp;</span>
310
+ <span class="cline-any cline-no">&nbsp;</span>
311
+ <span class="cline-any cline-no">&nbsp;</span>
312
+ <span class="cline-any cline-no">&nbsp;</span>
313
+ <span class="cline-any cline-no">&nbsp;</span>
314
+ <span class="cline-any cline-no">&nbsp;</span>
315
+ <span class="cline-any cline-yes">1x</span>
316
+ <span class="cline-any cline-no">&nbsp;</span>
317
+ <span class="cline-any cline-no">&nbsp;</span>
318
+ <span class="cline-any cline-no">&nbsp;</span>
319
+ <span class="cline-any cline-no">&nbsp;</span>
320
+ <span class="cline-any cline-no">&nbsp;</span>
321
+ <span class="cline-any cline-no">&nbsp;</span>
322
+ <span class="cline-any cline-no">&nbsp;</span>
323
+ <span class="cline-any cline-no">&nbsp;</span>
324
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">/**
325
+ * Web Crypto API utilities for secure encryption/decryption
326
+ * Replaces deprecated crypto-js with native browser APIs
327
+ *
328
+ * Security features:
329
+ * - AES-GCM: Authenticated encryption (detects tampering)
330
+ * - PBKDF2: Secure key derivation from password/fingerprint
331
+ * - Random IV: Each encryption uses unique initialization vector
332
+ */
333
+ &nbsp;
334
+ const ALGORITHM = "AES-GCM";
335
+ const KEY_LENGTH = 256;
336
+ const IV_LENGTH = 12; // 96 bits for AES-GCM (recommended)
337
+ const SALT_LENGTH = 16; // 128 bits
338
+ const PBKDF2_ITERATIONS = 100000;
339
+ const VERSION_PREFIX = "v2:";
340
+ &nbsp;
341
+ /**
342
+ * Generate SHA-256 hash of a string
343
+ * Used for browser fingerprint hashing
344
+ */
345
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export async function sha256(message: string): Promise&lt;string&gt; {</span></span>
346
+ <span class="cstat-no" title="statement not covered" > const encoder = new TextEncoder();</span>
347
+ <span class="cstat-no" title="statement not covered" > const data = encoder.encode(message);</span>
348
+ <span class="cstat-no" title="statement not covered" > const hashBuffer = await crypto.subtle.digest("SHA-256", data);</span>
349
+ <span class="cstat-no" title="statement not covered" > const hashArray = Array.from(new Uint8Array(hashBuffer));</span>
350
+ <span class="cstat-no" title="statement not covered" > return hashArray.map((b) =&gt; b.toString(16).padStart(2, "0")).join("");</span>
351
+ <span class="cstat-no" title="statement not covered" >}</span>
352
+ &nbsp;
353
+ /**
354
+ * Derive an AES-GCM CryptoKey from a password using PBKDF2
355
+ */
356
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export async function deriveKey(password: string, salt: Uint8Array): Promise&lt;CryptoKey&gt; {</span></span>
357
+ <span class="cstat-no" title="statement not covered" > const encoder = new TextEncoder();</span>
358
+ <span class="cstat-no" title="statement not covered" > const keyMaterial = await crypto.subtle.importKey("raw", encoder.encode(password), "PBKDF2", false, ["deriveKey"]);</span>
359
+ <span class="cstat-no" title="statement not covered" ></span>
360
+ <span class="cstat-no" title="statement not covered" > return crypto.subtle.deriveKey(</span>
361
+ <span class="cstat-no" title="statement not covered" > {</span>
362
+ <span class="cstat-no" title="statement not covered" > name: "PBKDF2",</span>
363
+ <span class="cstat-no" title="statement not covered" > salt: salt.buffer as ArrayBuffer,</span>
364
+ <span class="cstat-no" title="statement not covered" > iterations: PBKDF2_ITERATIONS,</span>
365
+ <span class="cstat-no" title="statement not covered" > hash: "SHA-256",</span>
366
+ <span class="cstat-no" title="statement not covered" > },</span>
367
+ <span class="cstat-no" title="statement not covered" > keyMaterial,</span>
368
+ <span class="cstat-no" title="statement not covered" > { name: ALGORITHM, length: KEY_LENGTH },</span>
369
+ <span class="cstat-no" title="statement not covered" > false,</span>
370
+ <span class="cstat-no" title="statement not covered" > ["encrypt", "decrypt"]</span>
371
+ <span class="cstat-no" title="statement not covered" > );</span>
372
+ <span class="cstat-no" title="statement not covered" >}</span>
373
+ &nbsp;
374
+ /**
375
+ * Encrypt plaintext using AES-GCM
376
+ * Returns format: v2:base64(iv):base64(salt):base64(ciphertext)
377
+ */
378
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export async function encrypt(plaintext: string, key: CryptoKey, salt: Uint8Array): Promise&lt;string&gt; {</span></span>
379
+ <span class="cstat-no" title="statement not covered" > const encoder = new TextEncoder();</span>
380
+ <span class="cstat-no" title="statement not covered" > const iv = crypto.getRandomValues(new Uint8Array(IV_LENGTH));</span>
381
+ <span class="cstat-no" title="statement not covered" ></span>
382
+ <span class="cstat-no" title="statement not covered" > const ciphertext = await crypto.subtle.encrypt({ name: ALGORITHM, iv }, key, encoder.encode(plaintext));</span>
383
+ <span class="cstat-no" title="statement not covered" ></span>
384
+ <span class="cstat-no" title="statement not covered" > // Convert to base64</span>
385
+ <span class="cstat-no" title="statement not covered" > const ivBase64 = arrayBufferToBase64(iv);</span>
386
+ <span class="cstat-no" title="statement not covered" > const saltBase64 = arrayBufferToBase64(salt);</span>
387
+ <span class="cstat-no" title="statement not covered" > const ciphertextBase64 = arrayBufferToBase64(new Uint8Array(ciphertext));</span>
388
+ <span class="cstat-no" title="statement not covered" ></span>
389
+ <span class="cstat-no" title="statement not covered" > return `${VERSION_PREFIX}${ivBase64}:${saltBase64}:${ciphertextBase64}`;</span>
390
+ <span class="cstat-no" title="statement not covered" >}</span>
391
+ &nbsp;
392
+ /**
393
+ * Decrypt data encrypted with AES-GCM
394
+ * Expects format: v2:base64(iv):base64(salt):base64(ciphertext)
395
+ */
396
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >export async function decrypt(encrypted: string, password: string): Promise&lt;string | null&gt; {</span></span>
397
+ <span class="cstat-no" title="statement not covered" > if (!encrypted.startsWith(VERSION_PREFIX)) {</span>
398
+ <span class="cstat-no" title="statement not covered" > return null; // Not our format (legacy or corrupted)</span>
399
+ <span class="cstat-no" title="statement not covered" > }</span>
400
+ <span class="cstat-no" title="statement not covered" ></span>
401
+ <span class="cstat-no" title="statement not covered" > try {</span>
402
+ <span class="cstat-no" title="statement not covered" > const parts = encrypted.slice(VERSION_PREFIX.length).split(":");</span>
403
+ <span class="cstat-no" title="statement not covered" > if (parts.length !== 3) return null;</span>
404
+ <span class="cstat-no" title="statement not covered" ></span>
405
+ <span class="cstat-no" title="statement not covered" > const [ivBase64, saltBase64, ciphertextBase64] = parts;</span>
406
+ <span class="cstat-no" title="statement not covered" ></span>
407
+ <span class="cstat-no" title="statement not covered" > const iv = base64ToArrayBuffer(ivBase64);</span>
408
+ <span class="cstat-no" title="statement not covered" > const salt = base64ToArrayBuffer(saltBase64);</span>
409
+ <span class="cstat-no" title="statement not covered" > const ciphertext = base64ToArrayBuffer(ciphertextBase64);</span>
410
+ <span class="cstat-no" title="statement not covered" ></span>
411
+ <span class="cstat-no" title="statement not covered" > const key = await deriveKey(password, salt);</span>
412
+ <span class="cstat-no" title="statement not covered" ></span>
413
+ <span class="cstat-no" title="statement not covered" > const decrypted = await crypto.subtle.decrypt({ name: ALGORITHM, iv: iv.buffer as ArrayBuffer }, key, ciphertext.buffer as ArrayBuffer);</span>
414
+ <span class="cstat-no" title="statement not covered" ></span>
415
+ <span class="cstat-no" title="statement not covered" > return new TextDecoder().decode(decrypted);</span>
416
+ <span class="cstat-no" title="statement not covered" > } catch {</span>
417
+ <span class="cstat-no" title="statement not covered" > return null; // Decryption failed (wrong key, corrupted data, etc.)</span>
418
+ <span class="cstat-no" title="statement not covered" > }</span>
419
+ <span class="cstat-no" title="statement not covered" >}</span>
420
+ &nbsp;
421
+ /**
422
+ * Generate a random salt for key derivation
423
+ */
424
+ export <span class="fstat-no" title="function not covered" >function generateSalt(): Uint8Array {</span>
425
+ <span class="cstat-no" title="statement not covered" > return crypto.getRandomValues(new Uint8Array(SALT_LENGTH));</span>
426
+ <span class="cstat-no" title="statement not covered" >}</span>
427
+ &nbsp;
428
+ /**
429
+ * Check if data is in the new encrypted format
430
+ */
431
+ export <span class="fstat-no" title="function not covered" >function isNewFormat(data: string): boolean {</span>
432
+ <span class="cstat-no" title="statement not covered" > return data.startsWith(VERSION_PREFIX);</span>
433
+ <span class="cstat-no" title="statement not covered" >}</span>
434
+ &nbsp;
435
+ // Helper functions for base64 encoding/decoding
436
+ &nbsp;
437
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function arrayBufferToBase64(buffer: Uint8Array): string {</span></span>
438
+ <span class="cstat-no" title="statement not covered" > let binary = "";</span>
439
+ <span class="cstat-no" title="statement not covered" > for (let i = 0; i &lt; buffer.length; i++) {</span>
440
+ <span class="cstat-no" title="statement not covered" > binary += String.fromCharCode(buffer[i]);</span>
441
+ <span class="cstat-no" title="statement not covered" > }</span>
442
+ <span class="cstat-no" title="statement not covered" > return btoa(binary);</span>
443
+ <span class="cstat-no" title="statement not covered" >}</span>
444
+ &nbsp;
445
+ <span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" >function base64ToArrayBuffer(base64: string): Uint8Array {</span></span>
446
+ <span class="cstat-no" title="statement not covered" > const binary = atob(base64);</span>
447
+ <span class="cstat-no" title="statement not covered" > const bytes = new Uint8Array(binary.length);</span>
448
+ <span class="cstat-no" title="statement not covered" > for (let i = 0; i &lt; binary.length; i++) {</span>
449
+ <span class="cstat-no" title="statement not covered" > bytes[i] = binary.charCodeAt(i);</span>
450
+ <span class="cstat-no" title="statement not covered" > }</span>
451
+ <span class="cstat-no" title="statement not covered" > return bytes;</span>
452
+ <span class="cstat-no" title="statement not covered" >}</span>
453
+ &nbsp;</pre></td></tr></table></pre>
454
+
455
+ <div class='push'></div><!-- for sticky footer -->
456
+ </div><!-- /wrapper -->
457
+ <div class='footer quiet pad2 space-top1 center small'>
458
+ Code coverage generated by
459
+ <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
460
+ at 2026-01-28T06:22:15.683Z
461
+ </div>
462
+ <script src="../prettify.js"></script>
463
+ <script>
464
+ window.onload = function () {
465
+ prettyPrint();
466
+ };
467
+ </script>
468
+ <script src="../sorter.js"></script>
469
+ <script src="../block-navigation.js"></script>
470
+ </body>
471
+ </html>
472
+
@@ -108,6 +108,7 @@ interface CrudiaAutoGenerateProps {
108
108
  helperText?: string;
109
109
  readOnly?: boolean;
110
110
  disabled?: boolean;
111
+ name?: string;
111
112
  }
112
113
  /**
113
114
  * Componente para campos autogenerados (códigos secuenciales)
@@ -156,13 +157,7 @@ interface CrudiaAutoGenerateProps {
156
157
  declare const CrudiaAutoGenerate: React.FC<CrudiaAutoGenerateProps>;
157
158
 
158
159
  /**
159
- * File field component with:
160
- * - Drag & drop
161
- * - File preview
162
- * - Progress bar during upload
163
- * - Delete files (soft delete)
164
- * - Type and size validation
165
- * - Single/multiple support
160
+ * Types and interfaces for CrudiaFileField component
166
161
  */
167
162
 
168
163
  /**
@@ -259,7 +254,20 @@ interface CrudiaFileFieldProps {
259
254
  * @default "create"
260
255
  */
261
256
  mode?: "create" | "edit";
257
+ /** HTML name attribute for the hidden file input */
258
+ name?: string;
262
259
  }
260
+
261
+ /**
262
+ * File field component with:
263
+ * - Drag & drop
264
+ * - File preview
265
+ * - Progress bar during upload
266
+ * - Delete files (soft delete)
267
+ * - Type and size validation
268
+ * - Single/multiple support
269
+ */
270
+
263
271
  /**
264
272
  * Main file field component
265
273
  *
@@ -322,6 +330,8 @@ interface CrudiaMarkdownFieldProps {
322
330
  minHeight?: number;
323
331
  /** Maximum editor height in pixels (scrolls after) */
324
332
  maxHeight?: number;
333
+ /** HTML name attribute for hidden input (for form semantics) */
334
+ name?: string;
325
335
  }
326
336
  declare const CrudiaMarkdownField: React.FC<CrudiaMarkdownFieldProps>;
327
337
 
@@ -108,6 +108,7 @@ interface CrudiaAutoGenerateProps {
108
108
  helperText?: string;
109
109
  readOnly?: boolean;
110
110
  disabled?: boolean;
111
+ name?: string;
111
112
  }
112
113
  /**
113
114
  * Componente para campos autogenerados (códigos secuenciales)
@@ -156,13 +157,7 @@ interface CrudiaAutoGenerateProps {
156
157
  declare const CrudiaAutoGenerate: React.FC<CrudiaAutoGenerateProps>;
157
158
 
158
159
  /**
159
- * File field component with:
160
- * - Drag & drop
161
- * - File preview
162
- * - Progress bar during upload
163
- * - Delete files (soft delete)
164
- * - Type and size validation
165
- * - Single/multiple support
160
+ * Types and interfaces for CrudiaFileField component
166
161
  */
167
162
 
168
163
  /**
@@ -259,7 +254,20 @@ interface CrudiaFileFieldProps {
259
254
  * @default "create"
260
255
  */
261
256
  mode?: "create" | "edit";
257
+ /** HTML name attribute for the hidden file input */
258
+ name?: string;
262
259
  }
260
+
261
+ /**
262
+ * File field component with:
263
+ * - Drag & drop
264
+ * - File preview
265
+ * - Progress bar during upload
266
+ * - Delete files (soft delete)
267
+ * - Type and size validation
268
+ * - Single/multiple support
269
+ */
270
+
263
271
  /**
264
272
  * Main file field component
265
273
  *
@@ -322,6 +330,8 @@ interface CrudiaMarkdownFieldProps {
322
330
  minHeight?: number;
323
331
  /** Maximum editor height in pixels (scrolls after) */
324
332
  maxHeight?: number;
333
+ /** HTML name attribute for hidden input (for form semantics) */
334
+ name?: string;
325
335
  }
326
336
  declare const CrudiaMarkdownField: React.FC<CrudiaMarkdownFieldProps>;
327
337
 
@@ -0,0 +1 @@
1
+ var b=[/password[^:]*[:=]\s*[^\s,}]+/gi,/token[^:]*[:=]\s*[^\s,}]+/gi,/key[^:]*[:=]\s*["']?[^\s,}"']+/gi,/secret[^:]*[:=]\s*[^\s,}]+/gi,/authorization[^:]*[:=]\s*[^\s,}]+/gi,/mongodb(\+srv)?:\/\/[^\s]+/gi,/postgres:\/\/[^\s]+/gi,/mysql:\/\/[^\s]+/gi];function w(){if(typeof window>"u")return"prod";let e=window.__TENANT_CONFIG__;return e?.environment&&["dev","stg","api","prod"].includes(e.environment)?e.environment:window.__CRUDIFY_ENV__?window.__CRUDIFY_ENV__:"prod"}var h=null,D="CrudifyUI",y=class{constructor(){this.explicitEnv=null;this.explicitEnv=h,this.prefix=D}getEffectiveEnv(){return this.explicitEnv!==null?this.explicitEnv:w()}sanitize(n){let r=n;for(let t of b)r=r.replace(t,"[REDACTED]");return r}sanitizeContext(n){let r={};for(let[t,i]of Object.entries(n))if(i!=null)if(t==="userId"&&typeof i=="string")r[t]=i.length>8?`${i.substring(0,8)}***`:i;else if(t==="email"&&typeof i=="string"){let[a,s]=i.split("@");r[t]=a&&s?`${a.substring(0,3)}***@${s}`:"[REDACTED]"}else typeof i=="string"?r[t]=this.sanitize(i):typeof i=="object"&&i!==null?r[t]=this.sanitizeContext(i):r[t]=i;return r}shouldLog(n){if(typeof window<"u"&&window.__CRUDIFY_DEBUG_MODE__)return!0;let r=this.getEffectiveEnv();return!((r==="prod"||r==="production"||r==="api")&&n!=="error")}log(n,r,t){if(!this.shouldLog(n))return;let i=this.sanitize(r),a=t?this.sanitizeContext(t):void 0,s={timestamp:new Date().toISOString(),level:n,environment:this.getEffectiveEnv(),service:this.prefix,message:i,...a&&Object.keys(a).length>0&&{context:a}},l=JSON.stringify(s);switch(n){case"error":console.error(l);break;case"warn":console.warn(l);break;case"info":console.info(l);break;case"debug":console.log(l);break}}error(n,r){let t;r instanceof Error?t={errorName:r.name,errorMessage:r.message,stack:r.stack}:t=r,this.log("error",n,t)}warn(n,r){this.log("warn",n,r)}info(n,r){this.log("info",n,r)}debug(n,r){this.log("debug",n,r)}getEnvironment(){return this.getEffectiveEnv()}setEnvironment(n){if(this.explicitEnv=n,h=n,typeof window<"u"){let r=["dev","stg","api","prod"];window.__CRUDIFY_ENV__=r.includes(n)?n:void 0}}isExplicitlyConfigured(){return this.explicitEnv!==null}},u=new y;var U=["dev","stg","api","prod"];function L(e){return!!e&&U.includes(e)}function x(){if(typeof window>"u")return null;let e=window.__TENANT_CONFIG__;return!e||!e.publicApiKey?null:e}function T(e={}){let{publicApiKey:n,env:r,appName:t,logo:i,loginActions:a,featureKeys:s,theme:l,enabledServices:g,enableDebug:d=!1}=e,c=x();if(c){d&&u.info("[TenantConfig] Using INJECTED configuration (Lambda@Edge)",{hasApiKey:!!c.publicApiKey,environment:c.environment,hasAppName:!!c.appName,hasLogo:!!c.logo,loginActionsCount:c.loginActions?.length,featureKeysCount:c.featureKeys?.length,hasTheme:!!c.theme});let p=L(c.environment)?c.environment:"prod";return{publicApiKey:c.publicApiKey,environment:p,appName:c.appName,logo:c.logo,loginActions:c.loginActions,featureKeys:c.featureKeys,theme:c.theme,enabledServices:c.enabledServices,configSource:"injected"}}return n?(d&&u.info("[TenantConfig] Using PROPS configuration (development)",{environment:r,hasAppName:!!t,hasLogo:!!i,loginActionsCount:a?.length,featureKeysCount:s?.length,hasTheme:!!l}),{publicApiKey:n,environment:r||"prod",appName:t,logo:i,loginActions:a,featureKeys:s,theme:l,enabledServices:g,configSource:"props"}):(d&&u.error("[TenantConfig] No configuration found! Ensure Lambda@Edge injects window.__TENANT_CONFIG__ (production) or provide props (development)."),{configSource:"none"})}function Q(e={}){return T(e)}function P(e){return e==="injected"?"cookies":e}function k(e={}){let n={publicApiKey:e.publicApiKey,env:e.env,appName:e.appName,logo:e.logo,loginActions:e.loginActions,featureKeys:e.featureKeys,enableDebug:e.enableDebug},r=T(n),t={publicApiKey:r.publicApiKey,env:r.environment,appName:r.appName,logo:r.logo,loginActions:r.loginActions,featureKeys:r.featureKeys,theme:r.theme,configSource:P(r.configSource)};return e.enableDebug&&typeof window<"u"&&(window.__CRUDIFY_RESOLVED_CONFIG=t),t}function X(e={}){return k(e)}var _=class e{constructor(){this.listeners=new Set;this.isHandlingAuthError=!1;this.lastErrorTime=0;this.lastEventType=null;this.DEBOUNCE_TIME=1e3}static getInstance(){return e.instance||(e.instance=new e),e.instance}emit(n,r){let t=Date.now();if(this.isHandlingAuthError&&this.lastEventType===n&&t-this.lastErrorTime<this.DEBOUNCE_TIME){u.debug(`AuthEventBus: Ignoring duplicate ${n} event (debounced)`);return}this.isHandlingAuthError=!0,this.lastErrorTime=t,this.lastEventType=n,u.debug(`AuthEventBus: Emitting ${n} event`,r?{details:r}:void 0);let i={type:n,details:r,timestamp:t};this.listeners.forEach(a=>{try{a(i)}catch(s){u.error("AuthEventBus: Error in listener",s instanceof Error?s:{message:String(s)})}}),setTimeout(()=>{this.isHandlingAuthError=!1,this.lastEventType=null},2e3)}subscribe(n){return this.listeners.add(n),()=>{this.listeners.delete(n)}}clear(){this.listeners.clear(),this.isHandlingAuthError=!1,this.lastEventType=null}isHandling(){return this.isHandlingAuthError}},ee=_.getInstance();var K=["errors.{category}.{code}","errors.{code}","login.{code}","error.{code}","messages.{code}","{code}"],V={INVALID_CREDENTIALS:"auth",UNAUTHORIZED:"auth",INVALID_API_KEY:"auth",USER_NOT_FOUND:"auth",USER_NOT_ACTIVE:"auth",NO_PERMISSION:"auth",SESSION_EXPIRED:"auth",ITEM_NOT_FOUND:"data",NOT_FOUND:"data",IN_USE:"data",DUPLICATE_ENTRY:"data",FIELD_ERROR:"validation",BAD_REQUEST:"validation",INVALID_EMAIL:"validation",INVALID_CODE:"validation",REQUIRED_FIELD:"validation",INTERNAL_SERVER_ERROR:"system",DATABASE_CONNECTION_ERROR:"system",INVALID_CONFIGURATION:"system",UNKNOWN_OPERATION:"system",TIMEOUT_ERROR:"system",NETWORK_ERROR:"system",TOO_MANY_REQUESTS:"rate_limit"},F={INVALID_CREDENTIALS:"Invalid username or password",UNAUTHORIZED:"You are not authorized to perform this action",SESSION_EXPIRED:"Your session has expired. Please log in again.",USER_NOT_FOUND:"User not found",ITEM_NOT_FOUND:"Item not found",FIELD_ERROR:"Invalid field value",INTERNAL_SERVER_ERROR:"An internal error occurred",NETWORK_ERROR:"Network connection error",TIMEOUT_ERROR:"Request timeout",UNKNOWN_OPERATION:"Unknown operation",INVALID_EMAIL:"Invalid email format",INVALID_CODE:"Invalid code",TOO_MANY_REQUESTS:"Too many requests, please try again later"};function f(e,n){let{translateFn:r,currentLanguage:t,enableDebug:i}=n;i&&u.debug(`[ErrorTranslation] Translating error code: ${e} (lang: ${t||"unknown"})`);let a=e.toUpperCase(),s=V[a],l=K.map(c=>c.replace("{category}",s||"general").replace("{code}",a));i&&u.debug("[ErrorTranslation] Searching keys:",{translationKeys:l});for(let c of l){let p=r(c);if(i&&u.debug(`[ErrorTranslation] Checking key: "${c}" -> result: "${p}" (same as key: ${p===c})`),p&&p!==c)return i&&u.debug(`[ErrorTranslation] Found translation at key: ${c} = "${p}"`),p}let g=F[a];if(g)return i&&u.debug(`[ErrorTranslation] Using default message: "${g}"`),g;let d=a.replace(/_/g," ").toLowerCase().replace(/\b\w/g,c=>c.toUpperCase());return i&&u.debug(`[ErrorTranslation] No translation found, using friendly code: "${d}"`),d}function M(e,n){return e.map(r=>f(r,n))}function B(e,n){let{enableDebug:r}=n;r&&u.debug("[ErrorTranslation] Translating error:",{error:e});let t=f(e.code,n);return t!==e.code.toUpperCase()&&t!==e.code?(r&&u.debug(`[ErrorTranslation] Using hierarchical translation: "${t}"`),e.field?`${e.field}: ${t}`:t):e.message&&!e.message.includes("Error:")&&e.message.length>0&&e.message!==e.code?(r&&u.debug(`[ErrorTranslation] No hierarchical translation found, using API message: "${e.message}"`),e.message):(r&&u.debug(`[ErrorTranslation] Using final fallback: "${t}"`),e.field?`${e.field}: ${t}`:t)}function te(e,n={}){let r={translateFn:e,currentLanguage:n.currentLanguage,enableDebug:n.enableDebug||!1};return{translateErrorCode:t=>f(t,r),translateErrorCodes:t=>M(t,r),translateError:t=>B(t,r),translateApiError:t=>t?.data?.response?.status?f(t.data.response.status,r):t?.status?f(t.status,r):t?.code?f(t.code,r):"Unknown error"}}var E=class E{constructor(){this.isPatched=!1;this.refCount=0;this.listeners=new Set;this.originalPushState=window.history.pushState,this.originalReplaceState=window.history.replaceState}static getInstance(){return E.instance||(E.instance=new E),E.instance}subscribe(n){return this.listeners.add(n),this.refCount++,this.isPatched||this.applyPatches(),()=>{this.unsubscribe(n)}}unsubscribe(n){this.listeners.delete(n),this.refCount--,this.refCount===0&&this.isPatched&&this.removePatches()}applyPatches(){let n=this;window.history.pushState=function(...r){let t=n.originalPushState.apply(this,r);return n.notifyListeners(),t},window.history.replaceState=function(...r){let t=n.originalReplaceState.apply(this,r);return n.notifyListeners(),t},this.isPatched=!0}removePatches(){window.history.pushState=this.originalPushState,window.history.replaceState=this.originalReplaceState,this.isPatched=!1}notifyListeners(){this.listeners.forEach(n=>{try{n()}catch(r){u.error("NavigationTracker: Error in navigation listener",r instanceof Error?r:{message:String(r)})}})}static reset(){E.instance?.isPatched&&E.instance.removePatches(),E.instance=null}getSubscriberCount(){return this.refCount}isActive(){return this.isPatched}};E.instance=null;var v=E;var m=e=>{try{let n=e.split(".");if(n.length!==3)return u.warn("Invalid JWT format: token must have 3 parts"),null;let r=n[1],t=r+"=".repeat((4-r.length%4)%4);return JSON.parse(atob(t))}catch(n){return u.warn("Failed to decode JWT token",n instanceof Error?{errorMessage:n.message}:{message:String(n)}),null}},ce=()=>{try{let e=null;if(e=sessionStorage.getItem("authToken"),e||(e=sessionStorage.getItem("token")),e||(e=localStorage.getItem("authToken")||localStorage.getItem("token")),!e)return null;let n=m(e);return n&&(n.email||n["cognito:username"])||null}catch(e){return u.warn("Failed to get current user email",e instanceof Error?{errorMessage:e.message}:{message:String(e)}),null}},le=e=>{try{let n=m(e);if(!n||!n.exp)return!0;let r=Math.floor(Date.now()/1e3);return n.exp<r}catch{return!0}};var o={INVALID_CREDENTIALS:"INVALID_CREDENTIALS",UNAUTHORIZED:"UNAUTHORIZED",INVALID_API_KEY:"INVALID_API_KEY",USER_NOT_FOUND:"USER_NOT_FOUND",USER_NOT_ACTIVE:"USER_NOT_ACTIVE",NO_PERMISSION:"NO_PERMISSION",ITEM_NOT_FOUND:"ITEM_NOT_FOUND",NOT_FOUND:"NOT_FOUND",IN_USE:"IN_USE",FIELD_ERROR:"FIELD_ERROR",BAD_REQUEST:"BAD_REQUEST",INVALID_EMAIL:"INVALID_EMAIL",INVALID_CODE:"INVALID_CODE",INTERNAL_SERVER_ERROR:"INTERNAL_SERVER_ERROR",DATABASE_CONNECTION_ERROR:"DATABASE_CONNECTION_ERROR",INVALID_CONFIGURATION:"INVALID_CONFIGURATION",UNKNOWN_OPERATION:"UNKNOWN_OPERATION",TOO_MANY_REQUESTS:"TOO_MANY_REQUESTS",NETWORK_ERROR:"NETWORK_ERROR",TIMEOUT_ERROR:"TIMEOUT_ERROR"},N={[o.INVALID_CREDENTIALS]:"warning",[o.UNAUTHORIZED]:"warning",[o.INVALID_API_KEY]:"error",[o.USER_NOT_FOUND]:"warning",[o.USER_NOT_ACTIVE]:"warning",[o.NO_PERMISSION]:"warning",[o.ITEM_NOT_FOUND]:"info",[o.NOT_FOUND]:"info",[o.IN_USE]:"warning",[o.FIELD_ERROR]:"warning",[o.BAD_REQUEST]:"warning",[o.INVALID_EMAIL]:"warning",[o.INVALID_CODE]:"warning",[o.INTERNAL_SERVER_ERROR]:"error",[o.DATABASE_CONNECTION_ERROR]:"error",[o.INVALID_CONFIGURATION]:"error",[o.UNKNOWN_OPERATION]:"error",[o.TOO_MANY_REQUESTS]:"warning",[o.NETWORK_ERROR]:"error",[o.TIMEOUT_ERROR]:"error"};function C(e){let n=[];try{let r=e;if(r.data&&typeof r.data=="object"){let t=r.data;if(t.response){let{status:i,fieldsWarning:a}=t.response;if(a&&typeof a=="object"&&Object.entries(a).forEach(([s,l])=>{Array.isArray(l)&&l.length>0&&n.push({code:o.FIELD_ERROR,message:l[0],severity:"warning",field:s})}),i&&typeof i=="string"){let s=i;N[s]&&n.push({code:s,message:R(s),severity:N[s]})}}}if(r.errors){if(typeof r.errors=="string")n.push({code:o.BAD_REQUEST,message:r.errors,severity:"warning"});else if(typeof r.errors=="object"){let t=r.errors;Object.entries(t).forEach(([i,a])=>{Array.isArray(a)&&a.length>0&&(i==="_error"?a.forEach(s=>{let l=typeof s=="string"&&S(s)?s:o.BAD_REQUEST;n.push({code:l,message:typeof s=="string"?s:R(l),severity:N[l]||"warning"})}):i==="_graphql"?a.forEach(s=>{if(typeof s=="string"){let l=S(s)?s:o.BAD_REQUEST;n.push({code:l,message:R(l),severity:N[l]||"warning"})}}):n.push({code:o.FIELD_ERROR,message:typeof a[0]=="string"?a[0]:"Validation error",severity:"warning",field:i}))})}}n.length===0&&r.success===!1&&n.push({code:o.BAD_REQUEST,message:"Request failed",severity:"warning"})}catch(r){n.push({code:o.INTERNAL_SERVER_ERROR,message:"Failed to parse error response",severity:"error",details:{originalError:r}})}return n.length>0?n:[{code:o.INTERNAL_SERVER_ERROR,message:"Unknown error occurred",severity:"error"}]}function Y(e){try{let n=e;if(n.data&&Array.isArray(n.data)){let r=[];return n.data.forEach((t,i)=>{t.response?.status==="TOO_MANY_REQUESTS"?r.push({code:o.TOO_MANY_REQUESTS,message:R(o.TOO_MANY_REQUESTS),severity:"warning",details:{transactionIndex:i}}):(!t.response||t.response.status!=="OK")&&r.push({code:o.BAD_REQUEST,message:"Transaction failed",severity:"warning",details:{transactionIndex:i,response:t.response}})}),r}return C(e)}catch(n){return[{code:o.INTERNAL_SERVER_ERROR,message:"Failed to parse transaction error",severity:"error",details:{originalError:n}}]}}function S(e){return Object.values(o).includes(e)}function R(e){return{[o.INVALID_CREDENTIALS]:"Invalid email or password",[o.UNAUTHORIZED]:"You are not authorized to perform this action",[o.INVALID_API_KEY]:"Invalid API key",[o.USER_NOT_FOUND]:"User not found",[o.USER_NOT_ACTIVE]:"User account is not active",[o.NO_PERMISSION]:"You do not have permission to perform this action",[o.ITEM_NOT_FOUND]:"Item not found",[o.NOT_FOUND]:"Resource not found",[o.IN_USE]:"Resource is currently in use",[o.FIELD_ERROR]:"Validation error",[o.BAD_REQUEST]:"Invalid request",[o.INVALID_EMAIL]:"Please enter a valid email address",[o.INVALID_CODE]:"Invalid or expired code",[o.INTERNAL_SERVER_ERROR]:"Internal server error",[o.DATABASE_CONNECTION_ERROR]:"Database connection error",[o.INVALID_CONFIGURATION]:"Invalid configuration",[o.UNKNOWN_OPERATION]:"Unknown operation",[o.TOO_MANY_REQUESTS]:"Too many requests. Please try again later.",[o.NETWORK_ERROR]:"Network error. Please check your connection.",[o.TIMEOUT_ERROR]:"Request timed out. Please try again."}[e]||"An unknown error occurred"}function H(e){return e instanceof Error?e.name==="AbortError"?{code:o.TIMEOUT_ERROR,message:"Request was cancelled",severity:"info"}:e.message.includes("NetworkError")||e.message.includes("Failed to fetch")?{code:o.NETWORK_ERROR,message:R(o.NETWORK_ERROR),severity:"error"}:{code:o.INTERNAL_SERVER_ERROR,message:e.message||"An unexpected error occurred",severity:"error",details:{originalError:e}}:{code:o.INTERNAL_SERVER_ERROR,message:"An unknown error occurred",severity:"error",details:{originalError:e}}}function Ee(e){if(e instanceof Error)return[H(e)];if(typeof e=="object"&&e!==null){let n=e;return n.data&&Array.isArray(n.data)?Y(e):C(e)}return[{code:o.INTERNAL_SERVER_ERROR,message:"An unknown error occurred",severity:"error",details:{originalError:e}}]}var O="AES-GCM";async function de(e){let r=new TextEncoder().encode(e),t=await crypto.subtle.digest("SHA-256",r);return Array.from(new Uint8Array(t)).map(a=>a.toString(16).padStart(2,"0")).join("")}async function $(e,n){let r=new TextEncoder,t=await crypto.subtle.importKey("raw",r.encode(e),"PBKDF2",!1,["deriveKey"]);return crypto.subtle.deriveKey({name:"PBKDF2",salt:n.buffer,iterations:1e5,hash:"SHA-256"},t,{name:O,length:256},!1,["encrypt","decrypt"])}async function pe(e,n,r){let t=new TextEncoder,i=crypto.getRandomValues(new Uint8Array(12)),a=await crypto.subtle.encrypt({name:O,iv:i},n,t.encode(e)),s=A(i),l=A(r),g=A(new Uint8Array(a));return`v2:${s}:${l}:${g}`}async function fe(e,n){if(!e.startsWith("v2:"))return null;try{let r=e.slice(3).split(":");if(r.length!==3)return null;let[t,i,a]=r,s=I(t),l=I(i),g=I(a),d=await $(n,l),c=await crypto.subtle.decrypt({name:O,iv:s.buffer},d,g.buffer);return new TextDecoder().decode(c)}catch{return null}}function Re(){return crypto.getRandomValues(new Uint8Array(16))}function Ne(e){return e.startsWith("v2:")}function A(e){let n="";for(let r=0;r<e.length;r++)n+=String.fromCharCode(e[r]);return btoa(n)}function I(e){let n=atob(e),r=new Uint8Array(n.length);for(let t=0;t<n.length;t++)r[t]=n.charCodeAt(t);return r}export{u as a,T as b,Q as c,k as d,X as e,ee as f,de as g,$ as h,pe as i,fe as j,Re as k,Ne as l,f as m,M as n,B as o,te as p,v as q,m as r,ce as s,le as t,o as u,N as v,C as w,Y as x,R as y,H as z,Ee as A};