strata-storage 2.3.0 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/src/main/java/com/strata/storage/EncryptedStorage.java +57 -3
- package/android/src/main/java/com/strata/storage/SQLiteStorage.java +58 -3
- package/android/src/main/java/com/strata/storage/SharedPreferencesStorage.java +57 -3
- package/dist/android/src/main/java/com/strata/storage/EncryptedStorage.java +57 -3
- package/dist/android/src/main/java/com/strata/storage/SQLiteStorage.java +58 -3
- package/dist/android/src/main/java/com/strata/storage/SharedPreferencesStorage.java +57 -3
- package/dist/package.json +1 -1
- package/package.json +1 -1
|
@@ -11,6 +11,7 @@ import java.util.Map;
|
|
|
11
11
|
import java.util.List;
|
|
12
12
|
import java.util.ArrayList;
|
|
13
13
|
import org.json.JSONObject;
|
|
14
|
+
import org.json.JSONArray;
|
|
14
15
|
|
|
15
16
|
public class EncryptedStorage {
|
|
16
17
|
private SharedPreferences encryptedPrefs;
|
|
@@ -52,9 +53,17 @@ public class EncryptedStorage {
|
|
|
52
53
|
stringValue = (String) value;
|
|
53
54
|
} else {
|
|
54
55
|
// Convert complex objects to JSON
|
|
55
|
-
|
|
56
|
-
((JSONObject) value).toString()
|
|
57
|
-
|
|
56
|
+
if (value instanceof JSONObject) {
|
|
57
|
+
stringValue = ((JSONObject) value).toString();
|
|
58
|
+
} else {
|
|
59
|
+
// Use helper method to convert object to JSON string
|
|
60
|
+
try {
|
|
61
|
+
stringValue = objectToJsonString(value);
|
|
62
|
+
} catch (Exception e) {
|
|
63
|
+
// Fallback to string representation
|
|
64
|
+
stringValue = value.toString();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
58
67
|
}
|
|
59
68
|
editor.putString(key, stringValue);
|
|
60
69
|
return editor.commit();
|
|
@@ -140,6 +149,51 @@ public class EncryptedStorage {
|
|
|
140
149
|
return new SizeInfo(totalSize, count);
|
|
141
150
|
}
|
|
142
151
|
|
|
152
|
+
/**
|
|
153
|
+
* Convert an object to JSON string using reflection
|
|
154
|
+
*/
|
|
155
|
+
private String objectToJsonString(Object obj) throws Exception {
|
|
156
|
+
if (obj == null) {
|
|
157
|
+
return "null";
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (obj instanceof String || obj instanceof Number || obj instanceof Boolean) {
|
|
161
|
+
return obj.toString();
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (obj instanceof Map) {
|
|
165
|
+
JSONObject jsonObj = new JSONObject();
|
|
166
|
+
Map<?, ?> map = (Map<?, ?>) obj;
|
|
167
|
+
for (Map.Entry<?, ?> entry : map.entrySet()) {
|
|
168
|
+
String key = entry.getKey().toString();
|
|
169
|
+
jsonObj.put(key, entry.getValue());
|
|
170
|
+
}
|
|
171
|
+
return jsonObj.toString();
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
if (obj instanceof List || obj.getClass().isArray()) {
|
|
175
|
+
JSONArray jsonArray = new JSONArray();
|
|
176
|
+
if (obj instanceof List) {
|
|
177
|
+
List<?> list = (List<?>) obj;
|
|
178
|
+
for (Object item : list) {
|
|
179
|
+
jsonArray.put(item);
|
|
180
|
+
}
|
|
181
|
+
} else {
|
|
182
|
+
Object[] array = (Object[]) obj;
|
|
183
|
+
for (Object item : array) {
|
|
184
|
+
jsonArray.put(item);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return jsonArray.toString();
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// For other objects, create a simple JSON object with their string representation
|
|
191
|
+
JSONObject jsonObj = new JSONObject();
|
|
192
|
+
jsonObj.put("value", obj.toString());
|
|
193
|
+
jsonObj.put("type", obj.getClass().getSimpleName());
|
|
194
|
+
return jsonObj.toString();
|
|
195
|
+
}
|
|
196
|
+
|
|
143
197
|
/**
|
|
144
198
|
* Size information class
|
|
145
199
|
*/
|
|
@@ -10,6 +10,7 @@ import java.util.List;
|
|
|
10
10
|
import java.util.HashMap;
|
|
11
11
|
import java.util.Map;
|
|
12
12
|
import org.json.JSONObject;
|
|
13
|
+
import org.json.JSONArray;
|
|
13
14
|
import java.nio.charset.StandardCharsets;
|
|
14
15
|
|
|
15
16
|
public class SQLiteStorage extends SQLiteOpenHelper {
|
|
@@ -62,9 +63,18 @@ public class SQLiteStorage extends SQLiteOpenHelper {
|
|
|
62
63
|
valueBytes = ((String) value).getBytes(StandardCharsets.UTF_8);
|
|
63
64
|
} else {
|
|
64
65
|
// Convert complex objects to JSON then to bytes
|
|
65
|
-
String json
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
String json;
|
|
67
|
+
if (value instanceof JSONObject) {
|
|
68
|
+
json = ((JSONObject) value).toString();
|
|
69
|
+
} else {
|
|
70
|
+
// Use helper method to convert object to JSON string
|
|
71
|
+
try {
|
|
72
|
+
json = objectToJsonString(value);
|
|
73
|
+
} catch (Exception jsonEx) {
|
|
74
|
+
// Fallback to string representation
|
|
75
|
+
json = value.toString();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
68
78
|
valueBytes = json.getBytes(StandardCharsets.UTF_8);
|
|
69
79
|
}
|
|
70
80
|
} catch (Exception e) {
|
|
@@ -217,6 +227,51 @@ public class SQLiteStorage extends SQLiteOpenHelper {
|
|
|
217
227
|
return new SizeInfo(totalSize, count);
|
|
218
228
|
}
|
|
219
229
|
|
|
230
|
+
/**
|
|
231
|
+
* Convert an object to JSON string using reflection
|
|
232
|
+
*/
|
|
233
|
+
private String objectToJsonString(Object obj) throws Exception {
|
|
234
|
+
if (obj == null) {
|
|
235
|
+
return "null";
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
if (obj instanceof String || obj instanceof Number || obj instanceof Boolean) {
|
|
239
|
+
return obj.toString();
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if (obj instanceof Map) {
|
|
243
|
+
JSONObject jsonObj = new JSONObject();
|
|
244
|
+
Map<?, ?> map = (Map<?, ?>) obj;
|
|
245
|
+
for (Map.Entry<?, ?> entry : map.entrySet()) {
|
|
246
|
+
String key = entry.getKey().toString();
|
|
247
|
+
jsonObj.put(key, entry.getValue());
|
|
248
|
+
}
|
|
249
|
+
return jsonObj.toString();
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
if (obj instanceof List || obj.getClass().isArray()) {
|
|
253
|
+
JSONArray jsonArray = new JSONArray();
|
|
254
|
+
if (obj instanceof List) {
|
|
255
|
+
List<?> list = (List<?>) obj;
|
|
256
|
+
for (Object item : list) {
|
|
257
|
+
jsonArray.put(item);
|
|
258
|
+
}
|
|
259
|
+
} else {
|
|
260
|
+
Object[] array = (Object[]) obj;
|
|
261
|
+
for (Object item : array) {
|
|
262
|
+
jsonArray.put(item);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return jsonArray.toString();
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// For other objects, create a simple JSON object with their string representation
|
|
269
|
+
JSONObject jsonObj = new JSONObject();
|
|
270
|
+
jsonObj.put("value", obj.toString());
|
|
271
|
+
jsonObj.put("type", obj.getClass().getSimpleName());
|
|
272
|
+
return jsonObj.toString();
|
|
273
|
+
}
|
|
274
|
+
|
|
220
275
|
/**
|
|
221
276
|
* Size information class
|
|
222
277
|
*/
|
|
@@ -40,9 +40,18 @@ public class SharedPreferencesStorage {
|
|
|
40
40
|
editor.putStringSet(key, (Set<String>) value);
|
|
41
41
|
} else {
|
|
42
42
|
// Convert complex objects to JSON
|
|
43
|
-
String json
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
String json;
|
|
44
|
+
if (value instanceof JSONObject) {
|
|
45
|
+
json = ((JSONObject) value).toString();
|
|
46
|
+
} else {
|
|
47
|
+
// Use reflection to convert object to JSON string
|
|
48
|
+
try {
|
|
49
|
+
json = objectToJsonString(value);
|
|
50
|
+
} catch (Exception e) {
|
|
51
|
+
// Fallback to string representation
|
|
52
|
+
json = value.toString();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
46
55
|
editor.putString(key, json);
|
|
47
56
|
}
|
|
48
57
|
return editor.commit();
|
|
@@ -133,6 +142,51 @@ public class SharedPreferencesStorage {
|
|
|
133
142
|
return new SizeInfo(totalSize, count);
|
|
134
143
|
}
|
|
135
144
|
|
|
145
|
+
/**
|
|
146
|
+
* Convert an object to JSON string using reflection
|
|
147
|
+
*/
|
|
148
|
+
private String objectToJsonString(Object obj) throws Exception {
|
|
149
|
+
if (obj == null) {
|
|
150
|
+
return "null";
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (obj instanceof String || obj instanceof Number || obj instanceof Boolean) {
|
|
154
|
+
return obj.toString();
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if (obj instanceof Map) {
|
|
158
|
+
JSONObject jsonObj = new JSONObject();
|
|
159
|
+
Map<?, ?> map = (Map<?, ?>) obj;
|
|
160
|
+
for (Map.Entry<?, ?> entry : map.entrySet()) {
|
|
161
|
+
String key = entry.getKey().toString();
|
|
162
|
+
jsonObj.put(key, entry.getValue());
|
|
163
|
+
}
|
|
164
|
+
return jsonObj.toString();
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (obj instanceof List || obj.getClass().isArray()) {
|
|
168
|
+
JSONArray jsonArray = new JSONArray();
|
|
169
|
+
if (obj instanceof List) {
|
|
170
|
+
List<?> list = (List<?>) obj;
|
|
171
|
+
for (Object item : list) {
|
|
172
|
+
jsonArray.put(item);
|
|
173
|
+
}
|
|
174
|
+
} else {
|
|
175
|
+
Object[] array = (Object[]) obj;
|
|
176
|
+
for (Object item : array) {
|
|
177
|
+
jsonArray.put(item);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return jsonArray.toString();
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// For other objects, create a simple JSON object with their string representation
|
|
184
|
+
JSONObject jsonObj = new JSONObject();
|
|
185
|
+
jsonObj.put("value", obj.toString());
|
|
186
|
+
jsonObj.put("type", obj.getClass().getSimpleName());
|
|
187
|
+
return jsonObj.toString();
|
|
188
|
+
}
|
|
189
|
+
|
|
136
190
|
/**
|
|
137
191
|
* Size information class
|
|
138
192
|
*/
|
|
@@ -11,6 +11,7 @@ import java.util.Map;
|
|
|
11
11
|
import java.util.List;
|
|
12
12
|
import java.util.ArrayList;
|
|
13
13
|
import org.json.JSONObject;
|
|
14
|
+
import org.json.JSONArray;
|
|
14
15
|
|
|
15
16
|
public class EncryptedStorage {
|
|
16
17
|
private SharedPreferences encryptedPrefs;
|
|
@@ -52,9 +53,17 @@ public class EncryptedStorage {
|
|
|
52
53
|
stringValue = (String) value;
|
|
53
54
|
} else {
|
|
54
55
|
// Convert complex objects to JSON
|
|
55
|
-
|
|
56
|
-
((JSONObject) value).toString()
|
|
57
|
-
|
|
56
|
+
if (value instanceof JSONObject) {
|
|
57
|
+
stringValue = ((JSONObject) value).toString();
|
|
58
|
+
} else {
|
|
59
|
+
// Use helper method to convert object to JSON string
|
|
60
|
+
try {
|
|
61
|
+
stringValue = objectToJsonString(value);
|
|
62
|
+
} catch (Exception e) {
|
|
63
|
+
// Fallback to string representation
|
|
64
|
+
stringValue = value.toString();
|
|
65
|
+
}
|
|
66
|
+
}
|
|
58
67
|
}
|
|
59
68
|
editor.putString(key, stringValue);
|
|
60
69
|
return editor.commit();
|
|
@@ -140,6 +149,51 @@ public class EncryptedStorage {
|
|
|
140
149
|
return new SizeInfo(totalSize, count);
|
|
141
150
|
}
|
|
142
151
|
|
|
152
|
+
/**
|
|
153
|
+
* Convert an object to JSON string using reflection
|
|
154
|
+
*/
|
|
155
|
+
private String objectToJsonString(Object obj) throws Exception {
|
|
156
|
+
if (obj == null) {
|
|
157
|
+
return "null";
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
if (obj instanceof String || obj instanceof Number || obj instanceof Boolean) {
|
|
161
|
+
return obj.toString();
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (obj instanceof Map) {
|
|
165
|
+
JSONObject jsonObj = new JSONObject();
|
|
166
|
+
Map<?, ?> map = (Map<?, ?>) obj;
|
|
167
|
+
for (Map.Entry<?, ?> entry : map.entrySet()) {
|
|
168
|
+
String key = entry.getKey().toString();
|
|
169
|
+
jsonObj.put(key, entry.getValue());
|
|
170
|
+
}
|
|
171
|
+
return jsonObj.toString();
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
if (obj instanceof List || obj.getClass().isArray()) {
|
|
175
|
+
JSONArray jsonArray = new JSONArray();
|
|
176
|
+
if (obj instanceof List) {
|
|
177
|
+
List<?> list = (List<?>) obj;
|
|
178
|
+
for (Object item : list) {
|
|
179
|
+
jsonArray.put(item);
|
|
180
|
+
}
|
|
181
|
+
} else {
|
|
182
|
+
Object[] array = (Object[]) obj;
|
|
183
|
+
for (Object item : array) {
|
|
184
|
+
jsonArray.put(item);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return jsonArray.toString();
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// For other objects, create a simple JSON object with their string representation
|
|
191
|
+
JSONObject jsonObj = new JSONObject();
|
|
192
|
+
jsonObj.put("value", obj.toString());
|
|
193
|
+
jsonObj.put("type", obj.getClass().getSimpleName());
|
|
194
|
+
return jsonObj.toString();
|
|
195
|
+
}
|
|
196
|
+
|
|
143
197
|
/**
|
|
144
198
|
* Size information class
|
|
145
199
|
*/
|
|
@@ -10,6 +10,7 @@ import java.util.List;
|
|
|
10
10
|
import java.util.HashMap;
|
|
11
11
|
import java.util.Map;
|
|
12
12
|
import org.json.JSONObject;
|
|
13
|
+
import org.json.JSONArray;
|
|
13
14
|
import java.nio.charset.StandardCharsets;
|
|
14
15
|
|
|
15
16
|
public class SQLiteStorage extends SQLiteOpenHelper {
|
|
@@ -62,9 +63,18 @@ public class SQLiteStorage extends SQLiteOpenHelper {
|
|
|
62
63
|
valueBytes = ((String) value).getBytes(StandardCharsets.UTF_8);
|
|
63
64
|
} else {
|
|
64
65
|
// Convert complex objects to JSON then to bytes
|
|
65
|
-
String json
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
String json;
|
|
67
|
+
if (value instanceof JSONObject) {
|
|
68
|
+
json = ((JSONObject) value).toString();
|
|
69
|
+
} else {
|
|
70
|
+
// Use helper method to convert object to JSON string
|
|
71
|
+
try {
|
|
72
|
+
json = objectToJsonString(value);
|
|
73
|
+
} catch (Exception jsonEx) {
|
|
74
|
+
// Fallback to string representation
|
|
75
|
+
json = value.toString();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
68
78
|
valueBytes = json.getBytes(StandardCharsets.UTF_8);
|
|
69
79
|
}
|
|
70
80
|
} catch (Exception e) {
|
|
@@ -217,6 +227,51 @@ public class SQLiteStorage extends SQLiteOpenHelper {
|
|
|
217
227
|
return new SizeInfo(totalSize, count);
|
|
218
228
|
}
|
|
219
229
|
|
|
230
|
+
/**
|
|
231
|
+
* Convert an object to JSON string using reflection
|
|
232
|
+
*/
|
|
233
|
+
private String objectToJsonString(Object obj) throws Exception {
|
|
234
|
+
if (obj == null) {
|
|
235
|
+
return "null";
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
if (obj instanceof String || obj instanceof Number || obj instanceof Boolean) {
|
|
239
|
+
return obj.toString();
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if (obj instanceof Map) {
|
|
243
|
+
JSONObject jsonObj = new JSONObject();
|
|
244
|
+
Map<?, ?> map = (Map<?, ?>) obj;
|
|
245
|
+
for (Map.Entry<?, ?> entry : map.entrySet()) {
|
|
246
|
+
String key = entry.getKey().toString();
|
|
247
|
+
jsonObj.put(key, entry.getValue());
|
|
248
|
+
}
|
|
249
|
+
return jsonObj.toString();
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
if (obj instanceof List || obj.getClass().isArray()) {
|
|
253
|
+
JSONArray jsonArray = new JSONArray();
|
|
254
|
+
if (obj instanceof List) {
|
|
255
|
+
List<?> list = (List<?>) obj;
|
|
256
|
+
for (Object item : list) {
|
|
257
|
+
jsonArray.put(item);
|
|
258
|
+
}
|
|
259
|
+
} else {
|
|
260
|
+
Object[] array = (Object[]) obj;
|
|
261
|
+
for (Object item : array) {
|
|
262
|
+
jsonArray.put(item);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return jsonArray.toString();
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// For other objects, create a simple JSON object with their string representation
|
|
269
|
+
JSONObject jsonObj = new JSONObject();
|
|
270
|
+
jsonObj.put("value", obj.toString());
|
|
271
|
+
jsonObj.put("type", obj.getClass().getSimpleName());
|
|
272
|
+
return jsonObj.toString();
|
|
273
|
+
}
|
|
274
|
+
|
|
220
275
|
/**
|
|
221
276
|
* Size information class
|
|
222
277
|
*/
|
|
@@ -40,9 +40,18 @@ public class SharedPreferencesStorage {
|
|
|
40
40
|
editor.putStringSet(key, (Set<String>) value);
|
|
41
41
|
} else {
|
|
42
42
|
// Convert complex objects to JSON
|
|
43
|
-
String json
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
String json;
|
|
44
|
+
if (value instanceof JSONObject) {
|
|
45
|
+
json = ((JSONObject) value).toString();
|
|
46
|
+
} else {
|
|
47
|
+
// Use reflection to convert object to JSON string
|
|
48
|
+
try {
|
|
49
|
+
json = objectToJsonString(value);
|
|
50
|
+
} catch (Exception e) {
|
|
51
|
+
// Fallback to string representation
|
|
52
|
+
json = value.toString();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
46
55
|
editor.putString(key, json);
|
|
47
56
|
}
|
|
48
57
|
return editor.commit();
|
|
@@ -133,6 +142,51 @@ public class SharedPreferencesStorage {
|
|
|
133
142
|
return new SizeInfo(totalSize, count);
|
|
134
143
|
}
|
|
135
144
|
|
|
145
|
+
/**
|
|
146
|
+
* Convert an object to JSON string using reflection
|
|
147
|
+
*/
|
|
148
|
+
private String objectToJsonString(Object obj) throws Exception {
|
|
149
|
+
if (obj == null) {
|
|
150
|
+
return "null";
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (obj instanceof String || obj instanceof Number || obj instanceof Boolean) {
|
|
154
|
+
return obj.toString();
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
if (obj instanceof Map) {
|
|
158
|
+
JSONObject jsonObj = new JSONObject();
|
|
159
|
+
Map<?, ?> map = (Map<?, ?>) obj;
|
|
160
|
+
for (Map.Entry<?, ?> entry : map.entrySet()) {
|
|
161
|
+
String key = entry.getKey().toString();
|
|
162
|
+
jsonObj.put(key, entry.getValue());
|
|
163
|
+
}
|
|
164
|
+
return jsonObj.toString();
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
if (obj instanceof List || obj.getClass().isArray()) {
|
|
168
|
+
JSONArray jsonArray = new JSONArray();
|
|
169
|
+
if (obj instanceof List) {
|
|
170
|
+
List<?> list = (List<?>) obj;
|
|
171
|
+
for (Object item : list) {
|
|
172
|
+
jsonArray.put(item);
|
|
173
|
+
}
|
|
174
|
+
} else {
|
|
175
|
+
Object[] array = (Object[]) obj;
|
|
176
|
+
for (Object item : array) {
|
|
177
|
+
jsonArray.put(item);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return jsonArray.toString();
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
// For other objects, create a simple JSON object with their string representation
|
|
184
|
+
JSONObject jsonObj = new JSONObject();
|
|
185
|
+
jsonObj.put("value", obj.toString());
|
|
186
|
+
jsonObj.put("type", obj.getClass().getSimpleName());
|
|
187
|
+
return jsonObj.toString();
|
|
188
|
+
}
|
|
189
|
+
|
|
136
190
|
/**
|
|
137
191
|
* Size information class
|
|
138
192
|
*/
|
package/dist/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "strata-storage",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.0",
|
|
4
4
|
"description": "Zero-dependency universal storage plugin providing a unified API for all storage operations across web, Android, and iOS platforms",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./index.js",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "strata-storage",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.0",
|
|
4
4
|
"description": "Zero-dependency universal storage plugin providing a unified API for all storage operations across web, Android, and iOS platforms",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|