@esportsplus/web-storage 0.1.28 → 0.1.30
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/index.d.ts +1 -1
- package/build/index.js +1 -1
- package/build/local.d.ts +19 -21
- package/build/local.js +119 -118
- package/build/types.d.ts +20 -20
- package/build/types.js +7 -7
- package/package.json +2 -2
- package/src/local.ts +37 -36
- package/tsconfig.json +1 -1
package/build/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { default as local } from './local';
|
|
1
|
+
export { default as local } from './local';
|
package/build/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export { default as local } from './local';
|
|
1
|
+
export { default as local } from './local';
|
package/build/local.d.ts
CHANGED
|
@@ -1,21 +1,19 @@
|
|
|
1
|
-
import { Filter, LocalForage, Options } from './types';
|
|
2
|
-
declare class Local<T> {
|
|
3
|
-
instance: LocalForage;
|
|
4
|
-
iterate: LocalForage['iterate'];
|
|
5
|
-
keys: LocalForage['keys'];
|
|
6
|
-
length: LocalForage['length'];
|
|
7
|
-
secret: null | string;
|
|
8
|
-
constructor(options: Options, secret?: string);
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
declare const _default: <T>(options: Options, secret?: string) => Local<T>;
|
|
21
|
-
export default _default;
|
|
1
|
+
import { Filter, LocalForage, Options } from './types';
|
|
2
|
+
declare class Local<T> {
|
|
3
|
+
instance: LocalForage;
|
|
4
|
+
iterate: LocalForage['iterate'];
|
|
5
|
+
keys: LocalForage['keys'];
|
|
6
|
+
length: LocalForage['length'];
|
|
7
|
+
secret: null | string;
|
|
8
|
+
constructor(options: Options, secret?: string);
|
|
9
|
+
all(): Promise<T>;
|
|
10
|
+
clear(): Promise<void>;
|
|
11
|
+
delete(...keys: (keyof T)[]): Promise<void>;
|
|
12
|
+
filter(fn: Filter<T>): Promise<T>;
|
|
13
|
+
get(key: keyof T): Promise<unknown>;
|
|
14
|
+
only(...keys: (keyof T)[]): Promise<T>;
|
|
15
|
+
replace(values: T): Promise<string[]>;
|
|
16
|
+
set(key: keyof T, value: T[keyof T]): Promise<boolean>;
|
|
17
|
+
}
|
|
18
|
+
declare const _default: <T>(options: Options, secret?: string) => Local<T>;
|
|
19
|
+
export default _default;
|
package/build/local.js
CHANGED
|
@@ -1,118 +1,119 @@
|
|
|
1
|
-
import { Driver } from './types';
|
|
2
|
-
import { decrypt, encrypt } from '@esportsplus/crypto';
|
|
3
|
-
import localforage from 'localforage';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
}
|
|
46
|
-
async all() {
|
|
47
|
-
let stack = [], values = {};
|
|
48
|
-
await this.instance.iterate((v, k) => {
|
|
49
|
-
stack.push(
|
|
50
|
-
.then((value) => {
|
|
51
|
-
if (value === undefined) {
|
|
52
|
-
return;
|
|
53
|
-
}
|
|
54
|
-
values[k] = value;
|
|
55
|
-
})
|
|
56
|
-
.catch(() => { }));
|
|
57
|
-
});
|
|
58
|
-
await Promise.allSettled(stack);
|
|
59
|
-
return values;
|
|
60
|
-
}
|
|
61
|
-
async clear() {
|
|
62
|
-
await this.instance.clear();
|
|
63
|
-
}
|
|
64
|
-
async delete(...keys) {
|
|
65
|
-
let stack = [];
|
|
66
|
-
for (let i = 0, n = keys.length; i < n; i++) {
|
|
67
|
-
stack.push(this.instance.removeItem(keys[i]));
|
|
68
|
-
}
|
|
69
|
-
await Promise.allSettled(stack);
|
|
70
|
-
}
|
|
71
|
-
async filter(fn) {
|
|
72
|
-
let stop = () => {
|
|
73
|
-
stopped = true;
|
|
74
|
-
}, stopped = false, values = {};
|
|
75
|
-
await this.instance.iterate(async (v, k, i) => {
|
|
76
|
-
let key = k, value = await
|
|
77
|
-
if (value === undefined) {
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
if (await fn({ i, key, stop, value })) {
|
|
81
|
-
values[key] = value;
|
|
82
|
-
}
|
|
83
|
-
if (stopped) {
|
|
84
|
-
return true;
|
|
85
|
-
}
|
|
86
|
-
});
|
|
87
|
-
return values;
|
|
88
|
-
}
|
|
89
|
-
async get(key) {
|
|
90
|
-
return await
|
|
91
|
-
}
|
|
92
|
-
async only(...keys) {
|
|
93
|
-
return await this.filter(({ key }) => keys.includes(key));
|
|
94
|
-
}
|
|
95
|
-
async replace(values) {
|
|
96
|
-
let failed = [], stack = [];
|
|
97
|
-
for (let key in values) {
|
|
98
|
-
stack.push(this.set(key, values[key])
|
|
99
|
-
.then((ok) => {
|
|
100
|
-
if (ok) {
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
failed.push(key);
|
|
104
|
-
}));
|
|
105
|
-
}
|
|
106
|
-
await Promise.allSettled(stack);
|
|
107
|
-
return failed;
|
|
108
|
-
}
|
|
109
|
-
async set(key, value) {
|
|
110
|
-
let ok = true;
|
|
111
|
-
await this.instance.setItem(key, await
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
}
|
|
118
|
-
|
|
1
|
+
import { Driver } from './types';
|
|
2
|
+
import { decrypt, encrypt } from '@esportsplus/crypto';
|
|
3
|
+
import localforage from 'localforage';
|
|
4
|
+
async function deserialize(value, secret = null) {
|
|
5
|
+
if (secret && typeof value === 'string') {
|
|
6
|
+
value = await decrypt(value, secret);
|
|
7
|
+
}
|
|
8
|
+
if (typeof value === 'string') {
|
|
9
|
+
value = JSON.parse(value);
|
|
10
|
+
}
|
|
11
|
+
return value;
|
|
12
|
+
}
|
|
13
|
+
async function serialize(value, secret = null) {
|
|
14
|
+
if (value === null || value === undefined) {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
value = JSON.stringify(value);
|
|
18
|
+
if (secret) {
|
|
19
|
+
value = await encrypt(value, secret);
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
}
|
|
23
|
+
class Local {
|
|
24
|
+
instance;
|
|
25
|
+
iterate;
|
|
26
|
+
keys;
|
|
27
|
+
length;
|
|
28
|
+
secret = null;
|
|
29
|
+
constructor(options, secret) {
|
|
30
|
+
switch ((options.driver || Driver.IndexedDB)) {
|
|
31
|
+
case Driver.LocalStorage:
|
|
32
|
+
options.driver = localforage.LOCALSTORAGE;
|
|
33
|
+
break;
|
|
34
|
+
default:
|
|
35
|
+
options.driver = localforage.INDEXEDDB;
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
this.instance = localforage.createInstance(Object.assign(options, { storeName: options.name }));
|
|
39
|
+
this.iterate = this.instance.iterate;
|
|
40
|
+
this.keys = this.instance.keys;
|
|
41
|
+
this.length = this.instance.length;
|
|
42
|
+
if (secret) {
|
|
43
|
+
this.secret = secret;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
async all() {
|
|
47
|
+
let stack = [], values = {};
|
|
48
|
+
await this.instance.iterate((v, k) => {
|
|
49
|
+
stack.push(deserialize(v, this.secret)
|
|
50
|
+
.then((value) => {
|
|
51
|
+
if (value === undefined) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
values[k] = value;
|
|
55
|
+
})
|
|
56
|
+
.catch(() => { }));
|
|
57
|
+
});
|
|
58
|
+
await Promise.allSettled(stack);
|
|
59
|
+
return values;
|
|
60
|
+
}
|
|
61
|
+
async clear() {
|
|
62
|
+
await this.instance.clear();
|
|
63
|
+
}
|
|
64
|
+
async delete(...keys) {
|
|
65
|
+
let stack = [];
|
|
66
|
+
for (let i = 0, n = keys.length; i < n; i++) {
|
|
67
|
+
stack.push(this.instance.removeItem(keys[i]));
|
|
68
|
+
}
|
|
69
|
+
await Promise.allSettled(stack);
|
|
70
|
+
}
|
|
71
|
+
async filter(fn) {
|
|
72
|
+
let stop = () => {
|
|
73
|
+
stopped = true;
|
|
74
|
+
}, stopped = false, values = {};
|
|
75
|
+
await this.instance.iterate(async (v, k, i) => {
|
|
76
|
+
let key = k, value = await deserialize(v, this.secret).catch(() => undefined);
|
|
77
|
+
if (value === undefined) {
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
if (await fn({ i, key, stop, value })) {
|
|
81
|
+
values[key] = value;
|
|
82
|
+
}
|
|
83
|
+
if (stopped) {
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
return values;
|
|
88
|
+
}
|
|
89
|
+
async get(key) {
|
|
90
|
+
return await deserialize(await this.instance.getItem(key), this.secret).catch(() => undefined);
|
|
91
|
+
}
|
|
92
|
+
async only(...keys) {
|
|
93
|
+
return await this.filter(({ key }) => keys.includes(key));
|
|
94
|
+
}
|
|
95
|
+
async replace(values) {
|
|
96
|
+
let failed = [], stack = [];
|
|
97
|
+
for (let key in values) {
|
|
98
|
+
stack.push(this.set(key, values[key])
|
|
99
|
+
.then((ok) => {
|
|
100
|
+
if (ok) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
failed.push(key);
|
|
104
|
+
}));
|
|
105
|
+
}
|
|
106
|
+
await Promise.allSettled(stack);
|
|
107
|
+
return failed;
|
|
108
|
+
}
|
|
109
|
+
async set(key, value) {
|
|
110
|
+
let ok = true;
|
|
111
|
+
await this.instance.setItem(key, await serialize(value, this.secret)
|
|
112
|
+
.catch(() => {
|
|
113
|
+
ok = false;
|
|
114
|
+
return undefined;
|
|
115
|
+
}));
|
|
116
|
+
return ok;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
export default (options, secret) => new Local(options, secret);
|
package/build/types.d.ts
CHANGED
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
import localforage from 'localforage';
|
|
2
|
-
declare enum Driver {
|
|
3
|
-
IndexedDB = 0,
|
|
4
|
-
LocalStorage = 1
|
|
5
|
-
}
|
|
6
|
-
type Filter<T> = (data: {
|
|
7
|
-
i: number;
|
|
8
|
-
key: keyof T;
|
|
9
|
-
stop: VoidFunction;
|
|
10
|
-
value: T[keyof T];
|
|
11
|
-
}) => boolean | Promise<boolean>;
|
|
12
|
-
type LocalForage = typeof localforage;
|
|
13
|
-
type Options = {
|
|
14
|
-
description?: string;
|
|
15
|
-
driver?: string | string[];
|
|
16
|
-
name: string;
|
|
17
|
-
size?: number;
|
|
18
|
-
version?: number;
|
|
19
|
-
};
|
|
20
|
-
export { Driver, Filter, LocalForage, Options };
|
|
1
|
+
import localforage from 'localforage';
|
|
2
|
+
declare enum Driver {
|
|
3
|
+
IndexedDB = 0,
|
|
4
|
+
LocalStorage = 1
|
|
5
|
+
}
|
|
6
|
+
type Filter<T> = (data: {
|
|
7
|
+
i: number;
|
|
8
|
+
key: keyof T;
|
|
9
|
+
stop: VoidFunction;
|
|
10
|
+
value: T[keyof T];
|
|
11
|
+
}) => boolean | Promise<boolean>;
|
|
12
|
+
type LocalForage = typeof localforage;
|
|
13
|
+
type Options = {
|
|
14
|
+
description?: string;
|
|
15
|
+
driver?: string | string[];
|
|
16
|
+
name: string;
|
|
17
|
+
size?: number;
|
|
18
|
+
version?: number;
|
|
19
|
+
};
|
|
20
|
+
export { Driver, Filter, LocalForage, Options };
|
package/build/types.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
var Driver;
|
|
2
|
-
(function (Driver) {
|
|
3
|
-
Driver[Driver["IndexedDB"] = 0] = "IndexedDB";
|
|
4
|
-
Driver[Driver["LocalStorage"] = 1] = "LocalStorage";
|
|
5
|
-
})(Driver || (Driver = {}));
|
|
6
|
-
;
|
|
7
|
-
export { Driver };
|
|
1
|
+
var Driver;
|
|
2
|
+
(function (Driver) {
|
|
3
|
+
Driver[Driver["IndexedDB"] = 0] = "IndexedDB";
|
|
4
|
+
Driver[Driver["LocalStorage"] = 1] = "LocalStorage";
|
|
5
|
+
})(Driver || (Driver = {}));
|
|
6
|
+
;
|
|
7
|
+
export { Driver };
|
package/package.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
},
|
|
7
7
|
"description": "Web storage utility",
|
|
8
8
|
"devDependencies": {
|
|
9
|
-
"@esportsplus/
|
|
9
|
+
"@esportsplus/rspack": "^0.0.15"
|
|
10
10
|
},
|
|
11
11
|
"main": "build/index.js",
|
|
12
12
|
"name": "@esportsplus/web-storage",
|
|
@@ -18,5 +18,5 @@
|
|
|
18
18
|
"prepublishOnly": "npm run build"
|
|
19
19
|
},
|
|
20
20
|
"types": "build/index.d.ts",
|
|
21
|
-
"version": "0.1.
|
|
21
|
+
"version": "0.1.30"
|
|
22
22
|
}
|
package/src/local.ts
CHANGED
|
@@ -3,6 +3,33 @@ import { decrypt, encrypt } from '@esportsplus/crypto';
|
|
|
3
3
|
import localforage from 'localforage';
|
|
4
4
|
|
|
5
5
|
|
|
6
|
+
async function deserialize(value: unknown, secret: null | string = null) {
|
|
7
|
+
if (secret && typeof value === 'string') {
|
|
8
|
+
value = await decrypt(value, secret);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
if (typeof value === 'string') {
|
|
12
|
+
value = JSON.parse(value);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
return value;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
async function serialize(value: unknown, secret: null | string = null) {
|
|
19
|
+
if (value === null || value === undefined) {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
value = JSON.stringify(value);
|
|
24
|
+
|
|
25
|
+
if (secret) {
|
|
26
|
+
value = await encrypt(value as string, secret);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
return value as string;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
|
|
6
33
|
class Local<T> {
|
|
7
34
|
instance: LocalForage;
|
|
8
35
|
iterate: LocalForage['iterate'];
|
|
@@ -34,46 +61,19 @@ class Local<T> {
|
|
|
34
61
|
}
|
|
35
62
|
|
|
36
63
|
|
|
37
|
-
private async deserialize(value: unknown) {
|
|
38
|
-
if (this.secret && typeof value === 'string') {
|
|
39
|
-
value = await decrypt(value, this.secret);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
if (typeof value === 'string') {
|
|
43
|
-
value = JSON.parse(value);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
return value as T[keyof T];
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
private async serialize(value: unknown) {
|
|
50
|
-
if (value === null || value === undefined) {
|
|
51
|
-
return undefined;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
value = JSON.stringify(value);
|
|
55
|
-
|
|
56
|
-
if (this.secret) {
|
|
57
|
-
value = await encrypt(value as string, this.secret);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
return value as string;
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
|
|
64
64
|
async all(): Promise<T> {
|
|
65
65
|
let stack: Promise<void>[] = [],
|
|
66
66
|
values: T = {} as T;
|
|
67
67
|
|
|
68
68
|
await this.instance.iterate((v: unknown, k: string) => {
|
|
69
69
|
stack.push(
|
|
70
|
-
|
|
70
|
+
deserialize(v, this.secret)
|
|
71
71
|
.then((value) => {
|
|
72
72
|
if (value === undefined) {
|
|
73
73
|
return;
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
-
values[k as keyof T] = value;
|
|
76
|
+
values[k as keyof T] = value as T[keyof T];
|
|
77
77
|
})
|
|
78
78
|
.catch(() => {})
|
|
79
79
|
)
|
|
@@ -107,7 +107,7 @@ class Local<T> {
|
|
|
107
107
|
|
|
108
108
|
await this.instance.iterate(async (v, k, i) => {
|
|
109
109
|
let key = k as keyof T,
|
|
110
|
-
value = await
|
|
110
|
+
value = await deserialize(v, this.secret).catch(() => undefined) as T[keyof T];
|
|
111
111
|
|
|
112
112
|
if (value === undefined) {
|
|
113
113
|
return;
|
|
@@ -128,11 +128,11 @@ class Local<T> {
|
|
|
128
128
|
}
|
|
129
129
|
|
|
130
130
|
async get(key: keyof T) {
|
|
131
|
-
return await
|
|
131
|
+
return await deserialize( await this.instance.getItem(key as string), this.secret ).catch(() => undefined);
|
|
132
132
|
}
|
|
133
133
|
|
|
134
134
|
async only(...keys: (keyof T)[]) {
|
|
135
|
-
return await this.filter(({ key }) => keys.includes(key));
|
|
135
|
+
return await this.filter( ({ key }) => keys.includes(key) );
|
|
136
136
|
}
|
|
137
137
|
|
|
138
138
|
async replace(values: T) {
|
|
@@ -162,10 +162,11 @@ class Local<T> {
|
|
|
162
162
|
|
|
163
163
|
await this.instance.setItem(
|
|
164
164
|
key as string,
|
|
165
|
-
await
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
165
|
+
await serialize(value, this.secret)
|
|
166
|
+
.catch(() => {
|
|
167
|
+
ok = false;
|
|
168
|
+
return undefined;
|
|
169
|
+
})
|
|
169
170
|
);
|
|
170
171
|
|
|
171
172
|
return ok;
|