@idealyst/storage 1.0.50
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/package.json +62 -0
- package/src/async-storage.d.ts +15 -0
- package/src/index.native.ts +8 -0
- package/src/index.ts +2 -0
- package/src/index.web.ts +8 -0
- package/src/storage.native.ts +79 -0
- package/src/storage.ts +82 -0
- package/src/storage.web.ts +84 -0
- package/src/types.ts +16 -0
package/package.json
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@idealyst/storage",
|
|
3
|
+
"version": "1.0.50",
|
|
4
|
+
"description": "Cross-platform storage abstraction for React and React Native",
|
|
5
|
+
"documentation": "https://github.com/your-username/idealyst-framework/tree/main/packages/storage#readme",
|
|
6
|
+
"main": "src/index.ts",
|
|
7
|
+
"module": "src/index.ts",
|
|
8
|
+
"types": "src/index.ts",
|
|
9
|
+
"react-native": "src/index.native.ts",
|
|
10
|
+
"repository": {
|
|
11
|
+
"type": "git",
|
|
12
|
+
"url": "https://github.com/your-username/idealyst-framework.git",
|
|
13
|
+
"directory": "packages/storage"
|
|
14
|
+
},
|
|
15
|
+
"author": "Your Name <your.email@example.com>",
|
|
16
|
+
"license": "MIT",
|
|
17
|
+
"publishConfig": {
|
|
18
|
+
"access": "public"
|
|
19
|
+
},
|
|
20
|
+
"exports": {
|
|
21
|
+
".": {
|
|
22
|
+
"react-native": "./src/index.native.ts",
|
|
23
|
+
"browser": "./src/index.web.ts",
|
|
24
|
+
"import": "./src/index.ts",
|
|
25
|
+
"require": "./src/index.ts",
|
|
26
|
+
"types": "./src/index.ts"
|
|
27
|
+
}
|
|
28
|
+
},
|
|
29
|
+
"scripts": {
|
|
30
|
+
"prepublishOnly": "echo 'Publishing TypeScript source directly'",
|
|
31
|
+
"publish:npm": "npm publish"
|
|
32
|
+
},
|
|
33
|
+
"peerDependencies": {
|
|
34
|
+
"@react-native-async-storage/async-storage": ">=1.0.0",
|
|
35
|
+
"react": ">=16.8.0",
|
|
36
|
+
"react-native": ">=0.60.0"
|
|
37
|
+
},
|
|
38
|
+
"peerDependenciesMeta": {
|
|
39
|
+
"@react-native-async-storage/async-storage": {
|
|
40
|
+
"optional": true
|
|
41
|
+
},
|
|
42
|
+
"react-native": {
|
|
43
|
+
"optional": true
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@types/react": "^19.1.0",
|
|
48
|
+
"typescript": "^5.0.0"
|
|
49
|
+
},
|
|
50
|
+
"files": [
|
|
51
|
+
"src",
|
|
52
|
+
"README.md"
|
|
53
|
+
],
|
|
54
|
+
"keywords": [
|
|
55
|
+
"react",
|
|
56
|
+
"react-native",
|
|
57
|
+
"storage",
|
|
58
|
+
"cross-platform",
|
|
59
|
+
"localStorage",
|
|
60
|
+
"AsyncStorage"
|
|
61
|
+
]
|
|
62
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
declare module '@react-native-async-storage/async-storage' {
|
|
2
|
+
export interface AsyncStorageStatic {
|
|
3
|
+
getItem(key: string): Promise<string | null>;
|
|
4
|
+
setItem(key: string, value: string): Promise<void>;
|
|
5
|
+
removeItem(key: string): Promise<void>;
|
|
6
|
+
clear(): Promise<void>;
|
|
7
|
+
getAllKeys(): Promise<string[]>;
|
|
8
|
+
multiGet(keys: string[]): Promise<Array<[string, string | null]>>;
|
|
9
|
+
multiSet(keyValuePairs: Array<[string, string]>): Promise<void>;
|
|
10
|
+
multiRemove(keys: string[]): Promise<void>;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const AsyncStorage: AsyncStorageStatic;
|
|
14
|
+
export default AsyncStorage;
|
|
15
|
+
}
|
package/src/index.ts
ADDED
package/src/index.web.ts
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import AsyncStorage from '@react-native-async-storage/async-storage';
|
|
2
|
+
import { IStorage } from './types';
|
|
3
|
+
|
|
4
|
+
class NativeStorage implements IStorage {
|
|
5
|
+
async getItem(key: string): Promise<string | null> {
|
|
6
|
+
try {
|
|
7
|
+
return await AsyncStorage.getItem(key);
|
|
8
|
+
} catch (error) {
|
|
9
|
+
console.error('Error getting item from AsyncStorage:', error);
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
async setItem(key: string, value: string): Promise<void> {
|
|
15
|
+
try {
|
|
16
|
+
await AsyncStorage.setItem(key, value);
|
|
17
|
+
} catch (error) {
|
|
18
|
+
console.error('Error setting item in AsyncStorage:', error);
|
|
19
|
+
throw error;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async removeItem(key: string): Promise<void> {
|
|
24
|
+
try {
|
|
25
|
+
await AsyncStorage.removeItem(key);
|
|
26
|
+
} catch (error) {
|
|
27
|
+
console.error('Error removing item from AsyncStorage:', error);
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
async clear(): Promise<void> {
|
|
33
|
+
try {
|
|
34
|
+
await AsyncStorage.clear();
|
|
35
|
+
} catch (error) {
|
|
36
|
+
console.error('Error clearing AsyncStorage:', error);
|
|
37
|
+
throw error;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
async getAllKeys(): Promise<string[]> {
|
|
42
|
+
try {
|
|
43
|
+
return await AsyncStorage.getAllKeys();
|
|
44
|
+
} catch (error) {
|
|
45
|
+
console.error('Error getting all keys from AsyncStorage:', error);
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
async multiGet(keys: string[]): Promise<Array<[string, string | null]>> {
|
|
51
|
+
try {
|
|
52
|
+
const results = await AsyncStorage.multiGet(keys);
|
|
53
|
+
return results as Array<[string, string | null]>;
|
|
54
|
+
} catch (error) {
|
|
55
|
+
console.error('Error in multiGet from AsyncStorage:', error);
|
|
56
|
+
return keys.map(key => [key, null]);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async multiSet(keyValuePairs: Array<[string, string]>): Promise<void> {
|
|
61
|
+
try {
|
|
62
|
+
await AsyncStorage.multiSet(keyValuePairs);
|
|
63
|
+
} catch (error) {
|
|
64
|
+
console.error('Error in multiSet to AsyncStorage:', error);
|
|
65
|
+
throw error;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
async multiRemove(keys: string[]): Promise<void> {
|
|
70
|
+
try {
|
|
71
|
+
await AsyncStorage.multiRemove(keys);
|
|
72
|
+
} catch (error) {
|
|
73
|
+
console.error('Error in multiRemove from AsyncStorage:', error);
|
|
74
|
+
throw error;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export default NativeStorage;
|
package/src/storage.ts
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { IStorage, IStorageWithListener, StorageListener } from './types';
|
|
2
|
+
|
|
3
|
+
class BaseStorage implements IStorageWithListener {
|
|
4
|
+
protected storage: IStorage;
|
|
5
|
+
protected listeners: Set<StorageListener> = new Set();
|
|
6
|
+
|
|
7
|
+
constructor(storage: IStorage) {
|
|
8
|
+
this.storage = storage;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
async getItem(key: string): Promise<string | null> {
|
|
12
|
+
return this.storage.getItem(key);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
async setItem(key: string, value: string): Promise<void> {
|
|
16
|
+
await this.storage.setItem(key, value);
|
|
17
|
+
this.notifyListeners(key, value);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
async removeItem(key: string): Promise<void> {
|
|
21
|
+
await this.storage.removeItem(key);
|
|
22
|
+
this.notifyListeners(key, null);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
async clear(): Promise<void> {
|
|
26
|
+
await this.storage.clear();
|
|
27
|
+
this.notifyListeners(null, null);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async getAllKeys(): Promise<string[]> {
|
|
31
|
+
return this.storage.getAllKeys();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async multiGet(keys: string[]): Promise<Array<[string, string | null]>> {
|
|
35
|
+
if (this.storage.multiGet) {
|
|
36
|
+
return this.storage.multiGet(keys);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const results = await Promise.all(
|
|
40
|
+
keys.map(async (key) => {
|
|
41
|
+
const value = await this.getItem(key);
|
|
42
|
+
return [key, value] as [string, string | null];
|
|
43
|
+
})
|
|
44
|
+
);
|
|
45
|
+
return results;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async multiSet(keyValuePairs: Array<[string, string]>): Promise<void> {
|
|
49
|
+
if (this.storage.multiSet) {
|
|
50
|
+
await this.storage.multiSet(keyValuePairs);
|
|
51
|
+
keyValuePairs.forEach(([key, value]) => this.notifyListeners(key, value));
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
await Promise.all(
|
|
56
|
+
keyValuePairs.map(([key, value]) => this.setItem(key, value))
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async multiRemove(keys: string[]): Promise<void> {
|
|
61
|
+
if (this.storage.multiRemove) {
|
|
62
|
+
await this.storage.multiRemove(keys);
|
|
63
|
+
keys.forEach((key) => this.notifyListeners(key, null));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
await Promise.all(keys.map((key) => this.removeItem(key)));
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
addListener(listener: StorageListener): () => void {
|
|
71
|
+
this.listeners.add(listener);
|
|
72
|
+
return () => {
|
|
73
|
+
this.listeners.delete(listener);
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
protected notifyListeners(key: string | null, value: string | null): void {
|
|
78
|
+
this.listeners.forEach((listener) => listener(key, value));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export default BaseStorage;
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { IStorage } from './types';
|
|
2
|
+
|
|
3
|
+
class WebStorage implements IStorage {
|
|
4
|
+
private storage: Storage;
|
|
5
|
+
|
|
6
|
+
constructor(storage: Storage = window.localStorage) {
|
|
7
|
+
this.storage = storage;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
async getItem(key: string): Promise<string | null> {
|
|
11
|
+
try {
|
|
12
|
+
return this.storage.getItem(key);
|
|
13
|
+
} catch (error) {
|
|
14
|
+
console.error('Error getting item from storage:', error);
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async setItem(key: string, value: string): Promise<void> {
|
|
20
|
+
try {
|
|
21
|
+
this.storage.setItem(key, value);
|
|
22
|
+
} catch (error) {
|
|
23
|
+
console.error('Error setting item in storage:', error);
|
|
24
|
+
throw error;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async removeItem(key: string): Promise<void> {
|
|
29
|
+
try {
|
|
30
|
+
this.storage.removeItem(key);
|
|
31
|
+
} catch (error) {
|
|
32
|
+
console.error('Error removing item from storage:', error);
|
|
33
|
+
throw error;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
async clear(): Promise<void> {
|
|
38
|
+
try {
|
|
39
|
+
this.storage.clear();
|
|
40
|
+
} catch (error) {
|
|
41
|
+
console.error('Error clearing storage:', error);
|
|
42
|
+
throw error;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
async getAllKeys(): Promise<string[]> {
|
|
47
|
+
try {
|
|
48
|
+
const keys: string[] = [];
|
|
49
|
+
for (let i = 0; i < this.storage.length; i++) {
|
|
50
|
+
const key = this.storage.key(i);
|
|
51
|
+
if (key !== null) {
|
|
52
|
+
keys.push(key);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return keys;
|
|
56
|
+
} catch (error) {
|
|
57
|
+
console.error('Error getting all keys from storage:', error);
|
|
58
|
+
return [];
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
async multiGet(keys: string[]): Promise<Array<[string, string | null]>> {
|
|
63
|
+
return Promise.all(
|
|
64
|
+
keys.map(async (key) => {
|
|
65
|
+
const value = await this.getItem(key);
|
|
66
|
+
return [key, value] as [string, string | null];
|
|
67
|
+
})
|
|
68
|
+
);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async multiSet(keyValuePairs: Array<[string, string]>): Promise<void> {
|
|
72
|
+
for (const [key, value] of keyValuePairs) {
|
|
73
|
+
await this.setItem(key, value);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
async multiRemove(keys: string[]): Promise<void> {
|
|
78
|
+
for (const key of keys) {
|
|
79
|
+
await this.removeItem(key);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export default WebStorage;
|
package/src/types.ts
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface IStorage {
|
|
2
|
+
getItem: (key: string) => Promise<string | null>;
|
|
3
|
+
setItem: (key: string, value: string) => Promise<void>;
|
|
4
|
+
removeItem: (key: string) => Promise<void>;
|
|
5
|
+
clear: () => Promise<void>;
|
|
6
|
+
getAllKeys: () => Promise<string[]>;
|
|
7
|
+
multiGet?: (keys: string[]) => Promise<Array<[string, string | null]>>;
|
|
8
|
+
multiSet?: (keyValuePairs: Array<[string, string]>) => Promise<void>;
|
|
9
|
+
multiRemove?: (keys: string[]) => Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export type StorageListener = (key: string | null, value: string | null) => void;
|
|
13
|
+
|
|
14
|
+
export interface IStorageWithListener extends IStorage {
|
|
15
|
+
addListener: (listener: StorageListener) => () => void;
|
|
16
|
+
}
|