flet-box 0.0.0-stage → 1.0.2

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/LICENSE +21 -0
  2. package/README.md +190 -2
  3. package/bin/cli.js +394 -0
  4. package/bin/commands/buildAndroid.js +200 -0
  5. package/bin/commands/buildIOS.js +237 -0
  6. package/bin/commands/create.js +406 -0
  7. package/bin/commands/createBundle.js +375 -0
  8. package/bin/commands/createComponent.js +115 -0
  9. package/bin/commands/createScreen.js +161 -0
  10. package/bin/commands/killServer.js +107 -0
  11. package/bin/commands/package.js +131 -0
  12. package/bin/commands/release.js +189 -0
  13. package/bin/commands/runBundle.js +62 -0
  14. package/bin/commands/runCloudflare.js +89 -0
  15. package/bin/commands/runNative.js +109 -0
  16. package/bin/commands/runServer.js +390 -0
  17. package/bin/ota/loader.js +361 -0
  18. package/bin/utils/bundleConfig.js +178 -0
  19. package/bin/utils/capacitor.js +137 -0
  20. package/bin/utils/colors.js +215 -0
  21. package/bin/utils/helpers.js +80 -0
  22. package/bin/utils/spinner.js +96 -0
  23. package/bin/utils/templates.js +1824 -0
  24. package/bin/utils/version.js +108 -0
  25. package/package.json +58 -4
  26. package/src/animations/AnimatedBox.js +607 -0
  27. package/src/animations/AnimatedText.js +105 -0
  28. package/src/animations/MatrixRain.js +220 -0
  29. package/src/animations/ParallaxBox.js +369 -0
  30. package/src/animations/animate.js +332 -0
  31. package/src/animations/index.js +25 -0
  32. package/src/app.js +41 -0
  33. package/src/assets/icon-1024-maskable.png +0 -0
  34. package/src/assets/icon-192-maskable.png +0 -0
  35. package/src/assets/icon-192.png +0 -0
  36. package/src/assets/icon-512-maskable.png +0 -0
  37. package/src/assets/icon-512.png +0 -0
  38. package/src/assets/logo.png +0 -0
  39. package/src/core/App.js +44 -0
  40. package/src/core/hmr-client.js +142 -0
  41. package/src/core/index.js +34 -0
  42. package/src/core/pwa.js +100 -0
  43. package/src/core/runApp.js +430 -0
  44. package/src/create-index.sh +237 -0
  45. package/src/fonts/MaterialIcons-Regular.woff2 +0 -0
  46. package/src/fonts/icons.css +23 -0
  47. package/src/index.d.ts +1930 -0
  48. package/src/index.js +288 -0
  49. package/src/navigations/AdaptiveScaffold.js +149 -0
  50. package/src/navigations/AppBar.js +331 -0
  51. package/src/navigations/BottomNavigation.js +298 -0
  52. package/src/navigations/CollapsibleSideBar.js +139 -0
  53. package/src/navigations/Drawer.js +333 -0
  54. package/src/navigations/DrawerItem.js +260 -0
  55. package/src/navigations/Router.js +475 -0
  56. package/src/navigations/Scaffold.js +537 -0
  57. package/src/navigations/Tabs.js +384 -0
  58. package/src/navigations/index.js +57 -0
  59. package/src/services/RamStore.js +213 -0
  60. package/src/services/Session.js +310 -0
  61. package/src/services/Storage.js +309 -0
  62. package/src/services/http.js +350 -0
  63. package/src/services/index.js +57 -0
  64. package/src/tools/animation.js +42 -0
  65. package/src/tools/array.js +95 -0
  66. package/src/tools/border.js +28 -0
  67. package/src/tools/clipboard.js +104 -0
  68. package/src/tools/color.js +329 -0
  69. package/src/tools/createList.js +215 -0
  70. package/src/tools/delay.js +55 -0
  71. package/src/tools/device.js +138 -0
  72. package/src/tools/dict.js +297 -0
  73. package/src/tools/dimensions.js +118 -0
  74. package/src/tools/filter.js +41 -0
  75. package/src/tools/flex.js +26 -0
  76. package/src/tools/gradient.js +34 -0
  77. package/src/tools/grid.js +57 -0
  78. package/src/tools/index.js +38 -0
  79. package/src/tools/mapList.js +107 -0
  80. package/src/tools/margin.js +93 -0
  81. package/src/tools/memo.js +60 -0
  82. package/src/tools/os.js +104 -0
  83. package/src/tools/padding.js +93 -0
  84. package/src/tools/print.js +69 -0
  85. package/src/tools/random.js +299 -0
  86. package/src/tools/ref.js +70 -0
  87. package/src/tools/rgba.js +4 -0
  88. package/src/tools/shadow.js +23 -0
  89. package/src/tools/string.js +85 -0
  90. package/src/tools/time.js +674 -0
  91. package/src/tools/transform.js +68 -0
  92. package/src/tools/transition.js +48 -0
  93. package/src/tools/useState.js +268 -0
  94. package/src/tools/uuid.js +42 -0
  95. package/src/utils/TextInputValidator.js +256 -0
  96. package/src/utils/composeUpdate.js +65 -0
  97. package/src/utils/getWidgetProps.js +35 -0
  98. package/src/utils/index.js +76 -0
  99. package/src/utils/markdownParser.js +368 -0
  100. package/src/utils/mediaTime.js +79 -0
  101. package/src/utils/navigation.js +263 -0
  102. package/src/utils/scriptInjector.js +73 -0
  103. package/src/utils/stackPosition.js +31 -0
  104. package/src/utils/stopWebRefresh.js +77 -0
  105. package/src/utils/styleInjector.js +38 -0
  106. package/src/utils/syntaxHighlight.js +339 -0
  107. package/src/utils/themes.js +347 -0
  108. package/src/utils/units.js +87 -0
  109. package/src/utils/visualEffects.js +169 -0
  110. package/src/widget-factory/addChildren.js +114 -0
  111. package/src/widget-factory/assignProps.js +256 -0
  112. package/src/widget-factory/createWidget.js +28 -0
  113. package/src/widget-factory/effects.js +132 -0
  114. package/src/widget-factory/index.js +7 -0
  115. package/src/widget-factory/lifecycle.js +210 -0
  116. package/src/widget-factory/makeParentable.js +89 -0
  117. package/src/widget-factory/pixTool.js +40 -0
  118. package/src/widget-factory/processProps.js +122 -0
  119. package/src/widget-factory/reactivity.js +98 -0
  120. package/src/widget-factory/remTool.js +34 -0
  121. package/src/widget-factory/stackPosition.js +87 -0
  122. package/src/widget-factory/stringTool.js +26 -0
  123. package/src/widget-factory/tools.js +249 -0
  124. package/src/widget-factory/translateProps.js +1049 -0
  125. package/src/widget-factory/warnings.js +284 -0
  126. package/src/widget-factory/widgetFactory.js +200 -0
  127. package/src/widgets/Accordion.js +562 -0
  128. package/src/widgets/AdMob.js +315 -0
  129. package/src/widgets/AdSense.js +268 -0
  130. package/src/widgets/AlertDialog.js +162 -0
  131. package/src/widgets/Audio.js +311 -0
  132. package/src/widgets/Avatar.js +210 -0
  133. package/src/widgets/Badge.js +189 -0
  134. package/src/widgets/BottomSheet.js +287 -0
  135. package/src/widgets/Button.js +247 -0
  136. package/src/widgets/Card.js +33 -0
  137. package/src/widgets/Carousel.js +301 -0
  138. package/src/widgets/Chart.js +632 -0
  139. package/src/widgets/Checkbox.js +106 -0
  140. package/src/widgets/Chip.js +153 -0
  141. package/src/widgets/CircularBar.js +352 -0
  142. package/src/widgets/CircularChart.js +549 -0
  143. package/src/widgets/CodeViewer.js +236 -0
  144. package/src/widgets/Column.js +29 -0
  145. package/src/widgets/Container.js +31 -0
  146. package/src/widgets/DataTable.js +257 -0
  147. package/src/widgets/Divider.js +93 -0
  148. package/src/widgets/DraggBox.js +115 -0
  149. package/src/widgets/Dropdown.js +505 -0
  150. package/src/widgets/DroppBox.js +180 -0
  151. package/src/widgets/FloatingActionButton.js +91 -0
  152. package/src/widgets/GridView.js +20 -0
  153. package/src/widgets/Icon.js +33 -0
  154. package/src/widgets/Image.js +15 -0
  155. package/src/widgets/Input.js +565 -0
  156. package/src/widgets/Inspector.js +254 -0
  157. package/src/widgets/InstallButton.js +110 -0
  158. package/src/widgets/ListTile.js +224 -0
  159. package/src/widgets/ListView.js +503 -0
  160. package/src/widgets/Markdown.js +1236 -0
  161. package/src/widgets/Modal.js +496 -0
  162. package/src/widgets/Pagination.js +195 -0
  163. package/src/widgets/ProgressBar.js +178 -0
  164. package/src/widgets/QRCode.js +467 -0
  165. package/src/widgets/Radio.js +132 -0
  166. package/src/widgets/Rating.js +261 -0
  167. package/src/widgets/Row.js +29 -0
  168. package/src/widgets/Skeleton.js +243 -0
  169. package/src/widgets/Slider.js +527 -0
  170. package/src/widgets/SnackBar.js +227 -0
  171. package/src/widgets/Stack.js +29 -0
  172. package/src/widgets/Stepper.js +296 -0
  173. package/src/widgets/Switch.js +102 -0
  174. package/src/widgets/Text.js +98 -0
  175. package/src/widgets/Tooltip.js +267 -0
  176. package/src/widgets/TreeView.js +370 -0
  177. package/src/widgets/Video.js +92 -0
  178. package/src/widgets/index.js +52 -0
@@ -0,0 +1,310 @@
1
+ // src/modules/FletBox/services/Session.js
2
+
3
+ /**
4
+ * Session - Temporary DOM storage (synchronous, similar to sessionStorage)
5
+ *
6
+ * @description Uses the browser's sessionStorage to persist data only during the session.
7
+ * Data is removed when the tab or browser is closed.
8
+ * Supports strings, objects, arrays, numbers, booleans.
9
+ *
10
+ * @example
11
+ * import { saveSession, getSession, deleteSession, clearAllSession, getAllSessionKeys, getAllSessionData } from './services/Session.js';
12
+ *
13
+ * // Save
14
+ * saveSession('user', { name: 'Juan', age: 30 });
15
+ *
16
+ * // Read
17
+ * const user = getSession('user');
18
+ *
19
+ * // Delete
20
+ * deleteSession('user');
21
+ *
22
+ * // Clear everything
23
+ * clearAllSession();
24
+ *
25
+ * // Get all keys
26
+ * const keys = getAllSessionKeys();
27
+ *
28
+ * // Get all data
29
+ * const allData = getAllSessionData();
30
+ */
31
+
32
+ // ========== CREATE / UPDATE ==========
33
+ /**
34
+ * Saves or updates a value in sessionStorage
35
+ * @param {string} key - Data key
36
+ * @param {any} value - Value to save (string, object, array, number, boolean)
37
+ * @returns {boolean} - true if saved successfully
38
+ */
39
+ export const saveSession = (key, value) => {
40
+ try {
41
+ const serialized = JSON.stringify(value);
42
+ sessionStorage.setItem(key, serialized);
43
+ return true;
44
+ } catch (error) {
45
+ console.error("Error saving session data:", error);
46
+ return false;
47
+ }
48
+ };
49
+
50
+ // ========== READ ==========
51
+ /**
52
+ * Gets a value from sessionStorage
53
+ * @param {string} key - Data key
54
+ * @returns {any} - The saved value or null if it does not exist
55
+ */
56
+ export const getSession = (key) => {
57
+ try {
58
+ const value = sessionStorage.getItem(key);
59
+ return value !== null ? JSON.parse(value) : null;
60
+ } catch (error) {
61
+ console.error("Error reading session data:", error);
62
+ return null;
63
+ }
64
+ };
65
+
66
+ // ========== READ (direct synchronous) ==========
67
+ /**
68
+ * Gets a value from sessionStorage synchronously (alias of getSession)
69
+ * @param {string} key - Data key
70
+ * @returns {any} - The saved value or null if it does not exist
71
+ */
72
+ export const getSessionSync = (key) => {
73
+ return getSession(key);
74
+ };
75
+
76
+ // ========== UPDATE ==========
77
+ /**
78
+ * Updates an existing value (only if it exists)
79
+ * @param {string} key - Data key
80
+ * @param {any} newValue - New value
81
+ * @returns {boolean} - true if updated, false if it did not exist
82
+ */
83
+ export const updateSession = (key, newValue) => {
84
+ try {
85
+ const exists = sessionStorage.getItem(key);
86
+ if (exists === null) return false;
87
+
88
+ sessionStorage.setItem(key, JSON.stringify(newValue));
89
+ return true;
90
+ } catch (error) {
91
+ console.error("Error updating session data:", error);
92
+ return false;
93
+ }
94
+ };
95
+
96
+ // ========== DELETE ==========
97
+ /**
98
+ * Deletes a value from sessionStorage
99
+ * @param {string} key - Data key
100
+ * @returns {boolean} - true if removed successfully
101
+ */
102
+ export const deleteSession = (key) => {
103
+ try {
104
+ sessionStorage.removeItem(key);
105
+ return true;
106
+ } catch (error) {
107
+ console.error("Error deleting session data:", error);
108
+ return false;
109
+ }
110
+ };
111
+
112
+ // ========== DELETE ALL ==========
113
+ /**
114
+ * Deletes ALL data from sessionStorage
115
+ * @returns {boolean} - true if cleared successfully
116
+ */
117
+ export const clearAllSession = () => {
118
+ try {
119
+ sessionStorage.clear();
120
+ return true;
121
+ } catch (error) {
122
+ console.error("Error clearing session data:", error);
123
+ return false;
124
+ }
125
+ };
126
+
127
+ // ========== UTILS ==========
128
+ /**
129
+ * Checks whether a key exists in sessionStorage
130
+ * @param {string} key - Key to check
131
+ * @returns {boolean} - true if it exists
132
+ */
133
+ export const hasSession = (key) => {
134
+ try {
135
+ return sessionStorage.getItem(key) !== null;
136
+ } catch (error) {
137
+ console.error("Error checking session data:", error);
138
+ return false;
139
+ }
140
+ };
141
+
142
+ /**
143
+ * Gets all keys saved in sessionStorage
144
+ * @returns {string[]} - Array of keys
145
+ */
146
+ export const getAllSessionKeys = () => {
147
+ try {
148
+ const keys = [];
149
+ for (let i = 0; i < sessionStorage.length; i++) {
150
+ const key = sessionStorage.key(i);
151
+ if (key) keys.push(key);
152
+ }
153
+ return keys;
154
+ } catch (error) {
155
+ console.error("Error getting all session keys:", error);
156
+ return [];
157
+ }
158
+ };
159
+
160
+ /**
161
+ * Gets all data saved in sessionStorage
162
+ * @returns {Object} - Object with all keys and values
163
+ */
164
+ export const getAllSessionData = () => {
165
+ try {
166
+ const result = {};
167
+ for (let i = 0; i < sessionStorage.length; i++) {
168
+ const key = sessionStorage.key(i);
169
+ if (key) {
170
+ try {
171
+ const value = sessionStorage.getItem(key);
172
+ result[key] = value !== null ? JSON.parse(value) : null;
173
+ } catch {
174
+ result[key] = sessionStorage.getItem(key);
175
+ }
176
+ }
177
+ }
178
+ return result;
179
+ } catch (error) {
180
+ console.error("Error getting all session data:", error);
181
+ return {};
182
+ }
183
+ };
184
+
185
+ /**
186
+ * Gets the approximate size used in sessionStorage (in bytes)
187
+ * @returns {number} - Size in bytes
188
+ */
189
+ export const getSessionSize = () => {
190
+ try {
191
+ let total = 0;
192
+ for (let i = 0; i < sessionStorage.length; i++) {
193
+ const key = sessionStorage.key(i);
194
+ if (key) {
195
+ const value = sessionStorage.getItem(key);
196
+ total += (key.length + (value?.length || 0)) * 2;
197
+ }
198
+ }
199
+ return total;
200
+ } catch (error) {
201
+ console.error("Error getting session size:", error);
202
+ return 0;
203
+ }
204
+ };
205
+
206
+ /**
207
+ * Deletes data by key prefix
208
+ * @param {string} prefix - Prefix of the keys to delete
209
+ * @returns {number} - Number of deleted items
210
+ */
211
+ export const deleteSessionByPrefix = (prefix) => {
212
+ try {
213
+ let deleted = 0;
214
+ const keysToRemove = [];
215
+
216
+ for (let i = 0; i < sessionStorage.length; i++) {
217
+ const key = sessionStorage.key(i);
218
+ if (key && key.startsWith(prefix)) {
219
+ keysToRemove.push(key);
220
+ }
221
+ }
222
+
223
+ keysToRemove.forEach((key) => {
224
+ sessionStorage.removeItem(key);
225
+ deleted++;
226
+ });
227
+
228
+ return deleted;
229
+ } catch (error) {
230
+ console.error("Error deleting session by prefix:", error);
231
+ return 0;
232
+ }
233
+ };
234
+
235
+ /**
236
+ * Deletes data by key suffix
237
+ * @param {string} suffix - Suffix of the keys to delete
238
+ * @returns {number} - Number of deleted items
239
+ */
240
+ export const deleteSessionBySuffix = (suffix) => {
241
+ try {
242
+ let deleted = 0;
243
+ const keysToRemove = [];
244
+
245
+ for (let i = 0; i < sessionStorage.length; i++) {
246
+ const key = sessionStorage.key(i);
247
+ if (key && key.endsWith(suffix)) {
248
+ keysToRemove.push(key);
249
+ }
250
+ }
251
+
252
+ keysToRemove.forEach((key) => {
253
+ sessionStorage.removeItem(key);
254
+ deleted++;
255
+ });
256
+
257
+ return deleted;
258
+ } catch (error) {
259
+ console.error("Error deleting session by suffix:", error);
260
+ return 0;
261
+ }
262
+ };
263
+
264
+ /**
265
+ * Gets the total number of items in sessionStorage
266
+ * @returns {number} - Number of items
267
+ */
268
+ export const getSessionItemCount = () => {
269
+ try {
270
+ return sessionStorage.length;
271
+ } catch (error) {
272
+ console.error("Error getting session item count:", error);
273
+ return 0;
274
+ }
275
+ };
276
+
277
+ /**
278
+ * Checks whether sessionStorage is available
279
+ * @returns {boolean} - true if available
280
+ */
281
+ export const isSessionAvailable = () => {
282
+ try {
283
+ const test = "__session_test__";
284
+ sessionStorage.setItem(test, test);
285
+ sessionStorage.removeItem(test);
286
+ return true;
287
+ } catch (e) {
288
+ return false;
289
+ }
290
+ };
291
+
292
+ // ========== EXPORT DEFAULT ==========
293
+ const Session = {
294
+ saveSession,
295
+ getSession,
296
+ getSessionSync,
297
+ updateSession,
298
+ deleteSession,
299
+ clearAllSession,
300
+ hasSession,
301
+ getAllSessionKeys,
302
+ getAllSessionData,
303
+ getSessionSize,
304
+ deleteSessionByPrefix,
305
+ deleteSessionBySuffix,
306
+ getSessionItemCount,
307
+ isSessionAvailable,
308
+ };
309
+
310
+ export default Session;
@@ -0,0 +1,309 @@
1
+ // src/modules/FletBox/services/Storage.js
2
+
3
+ /**
4
+ * Storage - Local DOM storage (synchronous, similar to localStorage)
5
+ *
6
+ * @description Uses the browser's localStorage to persist data.
7
+ * Supports strings, objects, arrays, numbers, booleans.
8
+ *
9
+ * @example
10
+ * import { saveData, getData, deleteData, clearAllData, getAllKeys, getAllData } from './services/Storage.js';
11
+ *
12
+ * // Save
13
+ * saveData('user', { name: 'Juan', age: 30 });
14
+ *
15
+ * // Read
16
+ * const user = getData('user');
17
+ *
18
+ * // Delete
19
+ * deleteData('user');
20
+ *
21
+ * // Clear everything
22
+ * clearAllData();
23
+ *
24
+ * // Get all keys
25
+ * const keys = getAllKeys();
26
+ *
27
+ * // Get all data
28
+ * const allData = getAllData();
29
+ */
30
+
31
+ // ========== CREATE / UPDATE ==========
32
+ /**
33
+ * Saves or updates a value in localStorage
34
+ * @param {string} key - Data key
35
+ * @param {any} value - Value to save (string, object, array, number, boolean)
36
+ * @returns {boolean} - true if saved successfully
37
+ */
38
+ export const saveData = (key, value) => {
39
+ try {
40
+ const serialized = JSON.stringify(value);
41
+ localStorage.setItem(key, serialized);
42
+ return true;
43
+ } catch (error) {
44
+ console.error("Error saving data:", error);
45
+ return false;
46
+ }
47
+ };
48
+
49
+ // ========== READ ==========
50
+ /**
51
+ * Gets a value from localStorage
52
+ * @param {string} key - Data key
53
+ * @returns {any} - The saved value or null if it does not exist
54
+ */
55
+ export const getData = (key) => {
56
+ try {
57
+ const value = localStorage.getItem(key);
58
+ return value !== null ? JSON.parse(value) : null;
59
+ } catch (error) {
60
+ console.error("Error reading data:", error);
61
+ return null;
62
+ }
63
+ };
64
+
65
+ // ========== READ (direct synchronous) ==========
66
+ /**
67
+ * Gets a value from localStorage synchronously (alias of getData)
68
+ * @param {string} key - Data key
69
+ * @returns {any} - The saved value or null if it does not exist
70
+ */
71
+ export const getDataSync = (key) => {
72
+ return getData(key);
73
+ };
74
+
75
+ // ========== UPDATE ==========
76
+ /**
77
+ * Updates an existing value (only if it exists)
78
+ * @param {string} key - Data key
79
+ * @param {any} newValue - New value
80
+ * @returns {boolean} - true if updated, false if it did not exist
81
+ */
82
+ export const updateData = (key, newValue) => {
83
+ try {
84
+ const exists = localStorage.getItem(key);
85
+ if (exists === null) return false;
86
+
87
+ localStorage.setItem(key, JSON.stringify(newValue));
88
+ return true;
89
+ } catch (error) {
90
+ console.error("Error updating data:", error);
91
+ return false;
92
+ }
93
+ };
94
+
95
+ // ========== DELETE ==========
96
+ /**
97
+ * Deletes a value from localStorage
98
+ * @param {string} key - Data key
99
+ * @returns {boolean} - true if removed successfully
100
+ */
101
+ export const deleteData = (key) => {
102
+ try {
103
+ localStorage.removeItem(key);
104
+ return true;
105
+ } catch (error) {
106
+ console.error("Error deleting data:", error);
107
+ return false;
108
+ }
109
+ };
110
+
111
+ // ========== DELETE ALL ==========
112
+ /**
113
+ * Deletes ALL data from localStorage
114
+ * @returns {boolean} - true if cleared successfully
115
+ */
116
+ export const clearAllData = () => {
117
+ try {
118
+ localStorage.clear();
119
+ return true;
120
+ } catch (error) {
121
+ console.error("Error clearing data:", error);
122
+ return false;
123
+ }
124
+ };
125
+
126
+ // ========== UTILS ==========
127
+ /**
128
+ * Checks whether a key exists in localStorage
129
+ * @param {string} key - Key to check
130
+ * @returns {boolean} - true if it exists
131
+ */
132
+ export const hasData = (key) => {
133
+ try {
134
+ return localStorage.getItem(key) !== null;
135
+ } catch (error) {
136
+ console.error("Error checking data:", error);
137
+ return false;
138
+ }
139
+ };
140
+
141
+ /**
142
+ * Gets all keys saved in localStorage
143
+ * @returns {string[]} - Array of keys
144
+ */
145
+ export const getAllKeys = () => {
146
+ try {
147
+ const keys = [];
148
+ for (let i = 0; i < localStorage.length; i++) {
149
+ const key = localStorage.key(i);
150
+ if (key) keys.push(key);
151
+ }
152
+ return keys;
153
+ } catch (error) {
154
+ console.error("Error getting all keys:", error);
155
+ return [];
156
+ }
157
+ };
158
+
159
+ /**
160
+ * Gets all data saved in localStorage
161
+ * @returns {Object} - Object with all keys and values
162
+ */
163
+ export const getAllData = () => {
164
+ try {
165
+ const result = {};
166
+ for (let i = 0; i < localStorage.length; i++) {
167
+ const key = localStorage.key(i);
168
+ if (key) {
169
+ try {
170
+ const value = localStorage.getItem(key);
171
+ result[key] = value !== null ? JSON.parse(value) : null;
172
+ } catch {
173
+ result[key] = localStorage.getItem(key);
174
+ }
175
+ }
176
+ }
177
+ return result;
178
+ } catch (error) {
179
+ console.error("Error getting all data:", error);
180
+ return {};
181
+ }
182
+ };
183
+
184
+ /**
185
+ * Gets the approximate size used in localStorage (in bytes)
186
+ * @returns {number} - Size in bytes
187
+ */
188
+ export const getStorageSize = () => {
189
+ try {
190
+ let total = 0;
191
+ for (let i = 0; i < localStorage.length; i++) {
192
+ const key = localStorage.key(i);
193
+ if (key) {
194
+ const value = localStorage.getItem(key);
195
+ total += (key.length + (value?.length || 0)) * 2;
196
+ }
197
+ }
198
+ return total;
199
+ } catch (error) {
200
+ console.error("Error getting storage size:", error);
201
+ return 0;
202
+ }
203
+ };
204
+
205
+ /**
206
+ * Deletes data by key prefix
207
+ * @param {string} prefix - Prefix of the keys to delete
208
+ * @returns {number} - Number of deleted items
209
+ */
210
+ export const deleteDataByPrefix = (prefix) => {
211
+ try {
212
+ let deleted = 0;
213
+ const keysToRemove = [];
214
+
215
+ for (let i = 0; i < localStorage.length; i++) {
216
+ const key = localStorage.key(i);
217
+ if (key && key.startsWith(prefix)) {
218
+ keysToRemove.push(key);
219
+ }
220
+ }
221
+
222
+ keysToRemove.forEach((key) => {
223
+ localStorage.removeItem(key);
224
+ deleted++;
225
+ });
226
+
227
+ return deleted;
228
+ } catch (error) {
229
+ console.error("Error deleting data by prefix:", error);
230
+ return 0;
231
+ }
232
+ };
233
+
234
+ /**
235
+ * Deletes data by key suffix
236
+ * @param {string} suffix - Suffix of the keys to delete
237
+ * @returns {number} - Number of deleted items
238
+ */
239
+ export const deleteDataBySuffix = (suffix) => {
240
+ try {
241
+ let deleted = 0;
242
+ const keysToRemove = [];
243
+
244
+ for (let i = 0; i < localStorage.length; i++) {
245
+ const key = localStorage.key(i);
246
+ if (key && key.endsWith(suffix)) {
247
+ keysToRemove.push(key);
248
+ }
249
+ }
250
+
251
+ keysToRemove.forEach((key) => {
252
+ localStorage.removeItem(key);
253
+ deleted++;
254
+ });
255
+
256
+ return deleted;
257
+ } catch (error) {
258
+ console.error("Error deleting data by suffix:", error);
259
+ return 0;
260
+ }
261
+ };
262
+
263
+ /**
264
+ * Gets the total number of items in localStorage
265
+ * @returns {number} - Number of items
266
+ */
267
+ export const getItemCount = () => {
268
+ try {
269
+ return localStorage.length;
270
+ } catch (error) {
271
+ console.error("Error getting item count:", error);
272
+ return 0;
273
+ }
274
+ };
275
+
276
+ /**
277
+ * Checks whether localStorage is available
278
+ * @returns {boolean} - true if available
279
+ */
280
+ export const isStorageAvailable = () => {
281
+ try {
282
+ const test = "__storage_test__";
283
+ localStorage.setItem(test, test);
284
+ localStorage.removeItem(test);
285
+ return true;
286
+ } catch (e) {
287
+ return false;
288
+ }
289
+ };
290
+
291
+ // ========== EXPORT DEFAULT ==========
292
+ const Storage = {
293
+ saveData,
294
+ getData,
295
+ getDataSync,
296
+ updateData,
297
+ deleteData,
298
+ clearAllData,
299
+ hasData,
300
+ getAllKeys,
301
+ getAllData,
302
+ getStorageSize,
303
+ deleteDataByPrefix,
304
+ deleteDataBySuffix,
305
+ getItemCount,
306
+ isStorageAvailable,
307
+ };
308
+
309
+ export default Storage;