@esportsplus/web-storage 0.1.25 → 0.1.27

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 CHANGED
@@ -1,35 +1 @@
1
- import local from './local';
2
- import memory from './memory';
3
- declare const _default: {
4
- local: {
5
- store: <T>(options: import("./local/types").Options) => {
6
- instance: LocalForage;
7
- iterate: <T_1, U>(iteratee: (value: T_1, key: string, iterationNumber: number) => U, callback?: ((err: any, result: U) => void) | undefined) => Promise<U>;
8
- keys: (callback?: ((err: any, keys: string[]) => void) | undefined) => Promise<string[]>;
9
- length: (callback?: ((err: any, numberOfKeys: number) => void) | undefined) => Promise<number>;
10
- all(): Promise<Record<string, never> | T>;
11
- clear(): Promise<void>;
12
- delete(...keys: (keyof T)[]): Promise<void>;
13
- filter(filter: Function): Promise<Record<string, never> | T>;
14
- get(key: keyof T): Promise<(T[keyof T] & {}) | undefined>;
15
- only(...keys: (keyof T)[]): Promise<Record<string, never> | T>;
16
- replace(values: T): Promise<void>;
17
- set(key: keyof T, value: T[keyof T]): Promise<void>;
18
- };
19
- };
20
- memory: {
21
- store: <T_2>(data: T_2) => {
22
- store: T_2;
23
- all(): {} & T_2;
24
- clear(): void;
25
- delete(key: keyof T_2): void;
26
- filter(filter: Function): Promise<Record<string, never> | T_2>;
27
- get(key: keyof T_2): T_2[keyof T_2];
28
- only(...keys: (keyof T_2)[]): T_2;
29
- replace(values: T_2): void;
30
- set(key: keyof T_2, value: T_2[keyof T_2]): void;
31
- };
32
- };
33
- };
34
- export default _default;
35
- export { local, memory };
1
+ export { default as local } from './local';
package/build/index.js CHANGED
@@ -1,4 +1 @@
1
- import local from './local';
2
- import memory from './memory';
3
- export default { local, memory };
4
- export { local, memory };
1
+ export { default as local } from './local';
@@ -0,0 +1,21 @@
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
+ private deserialize;
10
+ private serialize;
11
+ all(): Promise<T>;
12
+ clear(): Promise<void>;
13
+ delete(...keys: (keyof T)[]): Promise<void>;
14
+ filter(fn: Filter<T>): Promise<T>;
15
+ get(key: keyof T): Promise<T[keyof T] | undefined>;
16
+ only(...keys: (keyof T)[]): Promise<T>;
17
+ replace(values: T): Promise<void>;
18
+ set(key: keyof T, value: T[keyof T]): Promise<void>;
19
+ }
20
+ declare const _default: <T>(options: Options, secret?: string) => Local<T>;
21
+ export default _default;
package/build/local.js ADDED
@@ -0,0 +1,109 @@
1
+ import { Driver } from './types';
2
+ import { decrypt, encrypt } from '@esportsplus/crypto';
3
+ import localforage from 'localforage';
4
+ class Local {
5
+ instance;
6
+ iterate;
7
+ keys;
8
+ length;
9
+ secret = null;
10
+ constructor(options, secret) {
11
+ switch ((options.driver || Driver.IndexedDB)) {
12
+ case Driver.LocalStorage:
13
+ options.driver = localforage.LOCALSTORAGE;
14
+ break;
15
+ default:
16
+ options.driver = localforage.INDEXEDDB;
17
+ break;
18
+ }
19
+ this.instance = localforage.createInstance(Object.assign(options, { storeName: options.name }));
20
+ this.iterate = this.instance.iterate;
21
+ this.keys = this.instance.keys;
22
+ this.length = this.instance.length;
23
+ if (secret) {
24
+ this.secret = secret;
25
+ }
26
+ }
27
+ async deserialize(value) {
28
+ if (this.secret && typeof value === 'string') {
29
+ value = await decrypt(value, this.secret);
30
+ }
31
+ if (typeof value === 'string') {
32
+ try {
33
+ value = JSON.parse(value);
34
+ }
35
+ catch {
36
+ return undefined;
37
+ }
38
+ }
39
+ return value;
40
+ }
41
+ async serialize(value) {
42
+ if (value === null || value === undefined) {
43
+ return undefined;
44
+ }
45
+ value = JSON.stringify(value);
46
+ if (this.secret) {
47
+ value = await encrypt(value, this.secret);
48
+ }
49
+ return value;
50
+ }
51
+ async all() {
52
+ let stack = [], values = {};
53
+ await this.instance.iterate((v, k) => {
54
+ stack.push(this.deserialize(v).then((value) => {
55
+ if (value === undefined) {
56
+ return;
57
+ }
58
+ values[k] = value;
59
+ }));
60
+ });
61
+ await Promise.allSettled(stack);
62
+ return values;
63
+ }
64
+ async clear() {
65
+ await this.instance.clear();
66
+ }
67
+ async delete(...keys) {
68
+ let stack = [];
69
+ for (let i = 0, n = keys.length; i < n; i++) {
70
+ stack.push(this.instance.removeItem(keys[i]));
71
+ }
72
+ await Promise.allSettled(stack);
73
+ }
74
+ async filter(fn) {
75
+ let stop = () => {
76
+ stopped = true;
77
+ }, stopped = false, values = {};
78
+ await this.instance.iterate(async (v, k, i) => {
79
+ let key = k, value = await this.deserialize(v);
80
+ if (value === undefined) {
81
+ return;
82
+ }
83
+ if (await fn({ i, key, stop, value })) {
84
+ values[key] = value;
85
+ }
86
+ if (stopped) {
87
+ return true;
88
+ }
89
+ });
90
+ return values;
91
+ }
92
+ async get(key) {
93
+ return await this.deserialize(await this.instance.getItem(key));
94
+ }
95
+ async only(...keys) {
96
+ return await this.filter(({ key }) => keys.includes(key));
97
+ }
98
+ async replace(values) {
99
+ let stack = [];
100
+ for (let key in values) {
101
+ stack.push(this.set(key, values[key]));
102
+ }
103
+ await Promise.allSettled(stack);
104
+ }
105
+ async set(key, value) {
106
+ await this.instance.setItem(key, await this.serialize(value));
107
+ }
108
+ }
109
+ export default (options, secret) => new Local(options, secret);
@@ -3,6 +3,12 @@ declare enum Driver {
3
3
  IndexedDB = 0,
4
4
  LocalStorage = 1
5
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>;
6
12
  type LocalForage = typeof localforage;
7
13
  type Options = {
8
14
  description?: string;
@@ -11,4 +17,4 @@ type Options = {
11
17
  size?: number;
12
18
  version?: number;
13
19
  };
14
- export { Driver, LocalForage, Options };
20
+ export { Driver, Filter, LocalForage, Options };
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "author": "ICJR",
3
3
  "dependencies": {
4
+ "@esportsplus/crypto": "^0.0.2",
4
5
  "localforage": "^1.10.0"
5
6
  },
6
7
  "description": "Web storage utility",
7
8
  "devDependencies": {
8
- "@esportsplus/webpack": "^0.0.80"
9
+ "@esportsplus/webpack": "^0.0.81"
9
10
  },
10
11
  "main": "build/index.js",
11
12
  "name": "@esportsplus/web-storage",
@@ -17,5 +18,5 @@
17
18
  "prepublishOnly": "npm run build"
18
19
  },
19
20
  "types": "build/index.d.ts",
20
- "version": "0.1.25"
21
+ "version": "0.1.27"
21
22
  }
package/src/index.ts CHANGED
@@ -1,6 +1 @@
1
- import local from './local';
2
- import memory from './memory';
3
-
4
-
5
- export default { local, memory };
6
- export { local, memory };
1
+ export { default as local } from './local';
package/src/local.ts ADDED
@@ -0,0 +1,157 @@
1
+ import { Driver, Filter, LocalForage, Options } from '~/types';
2
+ import { decrypt, encrypt } from '@esportsplus/crypto';
3
+ import localforage from 'localforage';
4
+
5
+
6
+ class Local<T> {
7
+ instance: LocalForage;
8
+ iterate: LocalForage['iterate'];
9
+ keys: LocalForage['keys'];
10
+ length: LocalForage['length'];
11
+ secret: null | string = null;
12
+
13
+
14
+ constructor(options: Options, secret?: string) {
15
+ switch ((options.driver || Driver.IndexedDB) as Driver) {
16
+ case Driver.LocalStorage:
17
+ options.driver = localforage.LOCALSTORAGE;
18
+ break;
19
+ default:
20
+ options.driver = localforage.INDEXEDDB;
21
+ break;
22
+ }
23
+
24
+ this.instance = localforage.createInstance(
25
+ Object.assign(options, { storeName: options.name })
26
+ );
27
+ this.iterate = this.instance.iterate;
28
+ this.keys = this.instance.keys;
29
+ this.length = this.instance.length;
30
+
31
+ if (secret) {
32
+ this.secret = secret;
33
+ }
34
+ }
35
+
36
+
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
+ try {
44
+ value = JSON.parse(value);
45
+ }
46
+ catch {
47
+ return undefined;
48
+ }
49
+ }
50
+
51
+ return value as T[keyof T];
52
+ }
53
+
54
+ private async serialize(value: unknown) {
55
+ if (value === null || value === undefined) {
56
+ return undefined;
57
+ }
58
+
59
+ value = JSON.stringify(value);
60
+
61
+ if (this.secret) {
62
+ value = await encrypt(value as string, this.secret);
63
+ }
64
+
65
+ return value as string;
66
+ }
67
+
68
+
69
+ async all(): Promise<T> {
70
+ let stack: Promise<void>[] = [],
71
+ values: T = {} as T;
72
+
73
+ await this.instance.iterate((v: unknown, k: string) => {
74
+ stack.push(
75
+ this.deserialize(v).then((value) => {
76
+ if (value === undefined) {
77
+ return;
78
+ }
79
+
80
+ values[k as keyof T] = value;
81
+ })
82
+ )
83
+ });
84
+
85
+ await Promise.allSettled(stack);
86
+
87
+ return values;
88
+ }
89
+
90
+ async clear() {
91
+ await this.instance.clear();
92
+ }
93
+
94
+ async delete(...keys: (keyof T)[]) {
95
+ let stack: Promise<void>[] = [];
96
+
97
+ for (let i = 0, n = keys.length; i < n; i++) {
98
+ stack.push( this.instance.removeItem(keys[i] as string) );
99
+ }
100
+
101
+ await Promise.allSettled(stack);
102
+ }
103
+
104
+ async filter(fn: Filter<T>): Promise<T> {
105
+ let stop: VoidFunction = () => {
106
+ stopped = true;
107
+ },
108
+ stopped: boolean = false,
109
+ values: T = {} as T;
110
+
111
+ await this.instance.iterate(async (v, k, i) => {
112
+ let key = k as keyof T,
113
+ value = await this.deserialize(v);
114
+
115
+ if (value === undefined) {
116
+ return;
117
+ }
118
+
119
+ if (await fn({ i, key, stop, value })) {
120
+ values[key] = value;
121
+ }
122
+
123
+ // LocalForage iterate will stop once a non
124
+ // undefined value is returned
125
+ if (stopped) {
126
+ return true;
127
+ }
128
+ });
129
+
130
+ return values;
131
+ }
132
+
133
+ async get(key: keyof T) {
134
+ return await this.deserialize( await this.instance.getItem(key as string) );
135
+ }
136
+
137
+ async only(...keys: (keyof T)[]) {
138
+ return await this.filter(({ key }) => keys.includes(key));
139
+ }
140
+
141
+ async replace(values: T) {
142
+ let stack: Promise<void>[] = [];
143
+
144
+ for (let key in values) {
145
+ stack.push( this.set(key, values[key]) );
146
+ }
147
+
148
+ await Promise.allSettled(stack);
149
+ }
150
+
151
+ async set(key: keyof T, value: T[keyof T]) {
152
+ await this.instance.setItem(key as string, await this.serialize(value));
153
+ }
154
+ }
155
+
156
+
157
+ export default <T>(options: Options, secret?: string) => new Local<T>(options, secret);
@@ -6,6 +6,8 @@ enum Driver {
6
6
  LocalStorage
7
7
  };
8
8
 
9
+ type Filter<T> = (data: { i: number, key: keyof T, stop: VoidFunction, value: T[keyof T] }) => boolean | Promise<boolean>;
10
+
9
11
  type LocalForage = typeof localforage;
10
12
 
11
13
  type Options = {
@@ -17,4 +19,4 @@ type Options = {
17
19
  };
18
20
 
19
21
 
20
- export { Driver, LocalForage, Options };
22
+ export { Driver, Filter, LocalForage, Options };
@@ -1,20 +0,0 @@
1
- import { LocalForage, Options } from './types';
2
- declare class Store<T> {
3
- instance: LocalForage;
4
- iterate: LocalForage['iterate'];
5
- keys: LocalForage['keys'];
6
- length: LocalForage['length'];
7
- constructor(options: Options);
8
- all(): Promise<T | Record<string, never>>;
9
- clear(): Promise<void>;
10
- delete(...keys: (keyof T)[]): Promise<void>;
11
- filter(filter: Function): Promise<T | Record<string, never>>;
12
- get(key: keyof T): Promise<(T[keyof T] & {}) | undefined>;
13
- only(...keys: (keyof T)[]): Promise<T | Record<string, never>>;
14
- replace(values: T): Promise<void>;
15
- set(key: keyof T, value: T[keyof T]): Promise<void>;
16
- }
17
- declare const _default: {
18
- store: <T>(options: Options) => Store<T>;
19
- };
20
- export default _default;
@@ -1,76 +0,0 @@
1
- import { Driver } from './types';
2
- import localforage from 'localforage';
3
- class Store {
4
- instance;
5
- iterate;
6
- keys;
7
- length;
8
- constructor(options) {
9
- let driver;
10
- switch ((options.driver || Driver.IndexedDB)) {
11
- case Driver.LocalStorage:
12
- driver = localforage.LOCALSTORAGE;
13
- break;
14
- default:
15
- driver = localforage.INDEXEDDB;
16
- break;
17
- }
18
- this.instance = localforage.createInstance(Object.assign(options, { driver, storeName: options.name }));
19
- this.iterate = this.instance.iterate;
20
- this.keys = this.instance.keys;
21
- this.length = this.instance.length;
22
- }
23
- async all() {
24
- let values = {};
25
- await this.instance.iterate((value, key) => {
26
- values[key] = value;
27
- });
28
- return values;
29
- }
30
- async clear() {
31
- await this.instance.clear();
32
- }
33
- async delete(...keys) {
34
- if (!keys.length) {
35
- return;
36
- }
37
- for (let i = 0, n = keys.length; i < n; i++) {
38
- await this.instance.removeItem(keys[i]);
39
- }
40
- }
41
- async filter(filter) {
42
- let s = () => {
43
- stop = true;
44
- }, stop = false, values = {};
45
- await this.instance.iterate((value, key, i) => {
46
- if (filter({ i, key, stop: s, value })) {
47
- values[key] = value;
48
- }
49
- if (stop) {
50
- return true;
51
- }
52
- });
53
- return values;
54
- }
55
- async get(key) {
56
- let value = await this.instance.getItem(key);
57
- if (value === null) {
58
- return undefined;
59
- }
60
- return value;
61
- }
62
- async only(...keys) {
63
- return await this.filter((key) => keys.includes(key));
64
- }
65
- async replace(values) {
66
- for (let key in values) {
67
- await this.instance.setItem(key, values[key]);
68
- }
69
- }
70
- async set(key, value) {
71
- await this.instance.setItem(key, value);
72
- }
73
- }
74
- export default {
75
- store: (options) => new Store(options)
76
- };
@@ -1,16 +0,0 @@
1
- declare class Store<T> {
2
- store: T;
3
- constructor(data: T);
4
- all(): {} & T;
5
- clear(): void;
6
- delete(key: keyof T): void;
7
- filter(filter: Function): Promise<T | Record<string, never>>;
8
- get(key: keyof T): T[keyof T];
9
- only(...keys: (keyof T)[]): T;
10
- replace(values: T): void;
11
- set(key: keyof T, value: T[keyof T]): void;
12
- }
13
- declare const _default: {
14
- store: <T>(data: T) => Store<T>;
15
- };
16
- export default _default;
@@ -1,51 +0,0 @@
1
- class Store {
2
- store;
3
- constructor(data) {
4
- this.store = data;
5
- }
6
- all() {
7
- return Object.assign({}, this.store);
8
- }
9
- clear() {
10
- this.store = {};
11
- }
12
- delete(key) {
13
- delete this.store[key];
14
- }
15
- async filter(filter) {
16
- let s = () => {
17
- stop = true;
18
- }, stop = false, values = {};
19
- for (let key in this.store) {
20
- let value = this.store[key];
21
- if (await filter({ key, stop: s, value })) {
22
- values[key] = value;
23
- }
24
- if (stop) {
25
- break;
26
- }
27
- }
28
- return values;
29
- }
30
- get(key) {
31
- return this.store[key];
32
- }
33
- only(...keys) {
34
- let data = {};
35
- for (let i = 0, n = keys.length; i < n; i++) {
36
- data[keys[i]] = this.store[keys[i]];
37
- }
38
- return data;
39
- }
40
- replace(values) {
41
- for (let key in values) {
42
- this.store[key] = values[key];
43
- }
44
- }
45
- set(key, value) {
46
- this.store[key] = value;
47
- }
48
- }
49
- export default {
50
- store: (data) => new Store(data)
51
- };
@@ -1,107 +0,0 @@
1
- import { Driver, LocalForage, Options } from './types';
2
- import localforage from 'localforage';
3
-
4
-
5
- class Store<T> {
6
- instance: LocalForage;
7
- iterate: LocalForage['iterate'];
8
- keys: LocalForage['keys'];
9
- length: LocalForage['length'];
10
-
11
-
12
- constructor(options: Options) {
13
- let driver;
14
-
15
- switch ((options.driver || Driver.IndexedDB) as Driver) {
16
- case Driver.LocalStorage:
17
- driver = localforage.LOCALSTORAGE;
18
- break;
19
- default:
20
- driver = localforage.INDEXEDDB;
21
- break;
22
- }
23
-
24
- this.instance = localforage.createInstance(
25
- Object.assign(options, { driver, storeName: options.name })
26
- );
27
- this.iterate = this.instance.iterate;
28
- this.keys = this.instance.keys;
29
- this.length = this.instance.length;
30
- }
31
-
32
-
33
- async all(): Promise<T | Record<string, never>> {
34
- let values: T = {} as T;
35
-
36
- await this.instance.iterate((value: any, key: string) => {
37
- values[key as keyof T] = value;
38
- });
39
-
40
- return values;
41
- }
42
-
43
- async clear() {
44
- await this.instance.clear();
45
- }
46
-
47
- async delete(...keys: (keyof T)[]) {
48
- if (!keys.length) {
49
- return;
50
- }
51
-
52
- for (let i = 0, n = keys.length; i < n; i++) {
53
- await this.instance.removeItem(keys[i] as string);
54
- }
55
- }
56
-
57
- async filter(filter: Function): Promise<T | Record<string, never>> {
58
- let s: VoidFunction = () => {
59
- stop = true;
60
- },
61
- stop: boolean = false,
62
- values: T = {} as T;
63
-
64
- await this.instance.iterate((value: any, key: string, i: number) => {
65
- if (filter({ i, key, stop: s, value })) {
66
- values[key as keyof T] = value;
67
- }
68
-
69
- // LocalForage iterate will stop once a non
70
- // undefined value is returned
71
- if (stop) {
72
- return true;
73
- }
74
- });
75
-
76
- return values;
77
- }
78
-
79
- async get(key: keyof T) {
80
- let value: T[keyof T] | null = await this.instance.getItem(key as string);
81
-
82
- if (value === null) {
83
- return undefined;
84
- }
85
-
86
- return value;
87
- }
88
-
89
- async only(...keys: (keyof T)[]) {
90
- return await this.filter((key: string) => keys.includes(key as keyof T));
91
- }
92
-
93
- async replace(values: T) {
94
- for (let key in values) {
95
- await this.instance.setItem(key, values[key]);
96
- }
97
- }
98
-
99
- async set(key: keyof T, value: T[keyof T]) {
100
- await this.instance.setItem(key as string, value);
101
- }
102
- }
103
-
104
-
105
- export default {
106
- store: <T>(options: Options) => new Store<T>(options)
107
- };
@@ -1,72 +0,0 @@
1
- class Store<T> {
2
- store: T;
3
-
4
-
5
- constructor(data: T) {
6
- this.store = data as T;
7
- }
8
-
9
-
10
- all() {
11
- return Object.assign({}, this.store);
12
- }
13
-
14
- clear() {
15
- this.store = {} as T;
16
- }
17
-
18
- delete(key: keyof T) {
19
- delete this.store[key];
20
- }
21
-
22
- async filter(filter: Function): Promise<T | Record<string, never>> {
23
- let s: VoidFunction = () => {
24
- stop = true;
25
- },
26
- stop: boolean = false,
27
- values: T = {} as T;
28
-
29
- for (let key in this.store) {
30
- let value = this.store[key];
31
-
32
- if (await filter({ key, stop: s, value })) {
33
- values[key as keyof T] = value;
34
- }
35
-
36
- if (stop) {
37
- break;
38
- }
39
- }
40
-
41
- return values;
42
- }
43
-
44
- get(key: keyof T) {
45
- return this.store[key];
46
- }
47
-
48
- only(...keys: (keyof T)[]) {
49
- let data: T = {} as T;
50
-
51
- for (let i = 0, n = keys.length; i < n; i++) {
52
- data[keys[i]] = this.store[keys[i]];
53
- }
54
-
55
- return data;
56
- }
57
-
58
- replace(values: T) {
59
- for (let key in values) {
60
- this.store[key as keyof T] = values[key];
61
- }
62
- }
63
-
64
- set(key: keyof T, value: T[keyof T]) {
65
- this.store[key] = value;
66
- }
67
- }
68
-
69
-
70
- export default {
71
- store: <T>(data: T) => new Store<T>(data)
72
- };
File without changes