@davigomesdev/cache 0.0.0 → 0.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.
- package/dist/cache.d.ts +12 -4
- package/dist/cache.d.ts.map +1 -1
- package/dist/cache.js +57 -18
- package/package.json +2 -2
package/dist/cache.d.ts
CHANGED
|
@@ -1,32 +1,40 @@
|
|
|
1
1
|
export type CacheProps<T> = {
|
|
2
2
|
fetchKey: any;
|
|
3
3
|
refetchInterval?: number;
|
|
4
|
+
persist?: boolean;
|
|
4
5
|
fetchFn: () => Promise<T>;
|
|
5
6
|
onError?: (error: any) => Promise<void> | void;
|
|
6
|
-
|
|
7
|
+
onFetch?: (response: T) => Promise<void> | void;
|
|
7
8
|
onRefetch?: (response: T) => Promise<void> | void;
|
|
9
|
+
onSuccess?: (response: T) => Promise<void> | void;
|
|
8
10
|
onFirstFetch?: (response: T) => Promise<void> | void;
|
|
9
11
|
};
|
|
10
12
|
export type CacheItem = {
|
|
11
13
|
isFetch?: boolean;
|
|
12
14
|
isRefetch?: boolean;
|
|
13
15
|
isFirstFetch?: boolean;
|
|
14
|
-
|
|
16
|
+
key: string;
|
|
15
17
|
data?: any;
|
|
18
|
+
persist?: boolean;
|
|
19
|
+
interval?: ReturnType<typeof setInterval> | null;
|
|
16
20
|
refetchFn?: () => Promise<void>;
|
|
17
21
|
onError: Array<(error: any) => Promise<void> | void>;
|
|
18
|
-
|
|
22
|
+
onFetch: Array<(response: any) => Promise<void> | void>;
|
|
19
23
|
onRefetch: Array<(response: any) => Promise<void> | void>;
|
|
24
|
+
onSuccess: Array<(response: any) => Promise<void> | void>;
|
|
20
25
|
onFirstFetch: Array<(response: any) => Promise<void> | void>;
|
|
21
26
|
};
|
|
22
27
|
export declare class Cache {
|
|
23
28
|
private static cache;
|
|
24
|
-
static fetch<T>({ fetchKey, refetchInterval, fetchFn, onError,
|
|
29
|
+
static fetch<T>({ fetchKey, refetchInterval, persist, fetchFn, onError, onFetch, onRefetch, onSuccess, onFirstFetch }: CacheProps<T>): void;
|
|
25
30
|
static refetch(fetchKey: any): void;
|
|
26
31
|
static invalidate(fetchKey: any): void;
|
|
27
32
|
static invalidatePrefix(prefix: any): void;
|
|
28
33
|
private static getItem;
|
|
29
34
|
private static createCacheKey;
|
|
30
35
|
private static stableStringify;
|
|
36
|
+
private static loadPersisted;
|
|
37
|
+
private static persistData;
|
|
38
|
+
private static removePersisted;
|
|
31
39
|
}
|
|
32
40
|
//# sourceMappingURL=cache.d.ts.map
|
package/dist/cache.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;IAC1B,QAAQ,EAAE,GAAG,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC/C,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAClD,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAClD,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACtD,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,GAAG,IAAI,CAAC;IACjD,
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;IAC1B,QAAQ,EAAE,GAAG,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC/C,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAChD,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAClD,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAClD,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACtD,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,GAAG,IAAI,CAAC;IACjD,SAAS,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,EAAE,KAAK,CAAC,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IACrD,OAAO,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IACxD,SAAS,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAC1D,SAAS,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;IAC1D,YAAY,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;CAC9D,CAAC;AAEF,qBAAa,KAAK;IAChB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAqD;WAE3D,KAAK,CAAC,CAAC,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI;WA6EpI,OAAO,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI;WAK5B,UAAU,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI;WAY/B,gBAAgB,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI;IAUjD,OAAO,CAAC,MAAM,CAAC,OAAO;IAmBtB,OAAO,CAAC,MAAM,CAAC,cAAc;IAI7B,OAAO,CAAC,MAAM,CAAC,eAAe;IAc9B,OAAO,CAAC,MAAM,CAAC,aAAa;IAS5B,OAAO,CAAC,MAAM,CAAC,WAAW;IAQ1B,OAAO,CAAC,MAAM,CAAC,eAAe;CAO/B"}
|
package/dist/cache.js
CHANGED
|
@@ -1,26 +1,43 @@
|
|
|
1
1
|
export class Cache {
|
|
2
|
-
static fetch({ fetchKey, refetchInterval, fetchFn, onError,
|
|
2
|
+
static fetch({ fetchKey, refetchInterval, persist, fetchFn, onError, onFetch, onRefetch, onSuccess, onFirstFetch }) {
|
|
3
3
|
const item = Cache.getItem(fetchKey);
|
|
4
|
+
if (persist) {
|
|
5
|
+
item.persist = true;
|
|
6
|
+
}
|
|
4
7
|
if (onError)
|
|
5
8
|
item.onError.push(onError);
|
|
9
|
+
if (onFetch)
|
|
10
|
+
item.onRefetch.push(onFetch);
|
|
6
11
|
if (onSuccess)
|
|
7
12
|
item.onSuccess.push(onSuccess);
|
|
8
13
|
if (onRefetch)
|
|
9
14
|
item.onRefetch.push(onRefetch);
|
|
10
15
|
if (onFirstFetch)
|
|
11
16
|
item.onFirstFetch.push(onFirstFetch);
|
|
17
|
+
if (item.data !== undefined) {
|
|
18
|
+
for (const cb of item.onSuccess)
|
|
19
|
+
cb(item.data);
|
|
20
|
+
}
|
|
21
|
+
const save = (data) => {
|
|
22
|
+
item.data = data;
|
|
23
|
+
if (item.persist) {
|
|
24
|
+
Cache.persistData(item.key, data);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
12
27
|
if (!item.refetchFn) {
|
|
13
28
|
item.refetchFn = async () => {
|
|
14
|
-
if (item.isRefetch)
|
|
29
|
+
if (item.isRefetch || item.isFetch)
|
|
15
30
|
return;
|
|
16
31
|
item.isRefetch = true;
|
|
17
32
|
try {
|
|
18
33
|
const data = await fetchFn();
|
|
34
|
+
for (const cb of item.onFetch)
|
|
35
|
+
cb(data);
|
|
19
36
|
for (const cb of item.onRefetch)
|
|
20
37
|
cb(data);
|
|
21
38
|
for (const cb of item.onSuccess)
|
|
22
39
|
cb(data);
|
|
23
|
-
|
|
40
|
+
save(data);
|
|
24
41
|
}
|
|
25
42
|
catch (error) {
|
|
26
43
|
for (const cb of item.onError)
|
|
@@ -36,24 +53,17 @@ export class Cache {
|
|
|
36
53
|
}, refetchInterval);
|
|
37
54
|
}
|
|
38
55
|
}
|
|
39
|
-
if (item.data !== undefined) {
|
|
40
|
-
for (const cb of item.onSuccess)
|
|
41
|
-
cb(item.data);
|
|
42
|
-
}
|
|
43
56
|
const runFetch = async () => {
|
|
57
|
+
if (item.isRefetch || item.isFetch)
|
|
58
|
+
return;
|
|
44
59
|
item.isFetch = true;
|
|
45
60
|
try {
|
|
46
61
|
const data = await fetchFn();
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
else {
|
|
53
|
-
for (const cb of item.onRefetch)
|
|
54
|
-
cb(data);
|
|
55
|
-
}
|
|
56
|
-
item.data = data;
|
|
62
|
+
for (const cb of item.onFetch)
|
|
63
|
+
cb(data);
|
|
64
|
+
for (const cb of item.onSuccess)
|
|
65
|
+
cb(data);
|
|
66
|
+
save(data);
|
|
57
67
|
if (item.isFirstFetch === undefined || !item.isFirstFetch) {
|
|
58
68
|
for (const cb of item.onFirstFetch)
|
|
59
69
|
cb(data);
|
|
@@ -81,6 +91,7 @@ export class Cache {
|
|
|
81
91
|
item.interval = null;
|
|
82
92
|
}
|
|
83
93
|
item.data = undefined;
|
|
94
|
+
Cache.removePersisted(item.key);
|
|
84
95
|
}
|
|
85
96
|
static invalidatePrefix(prefix) {
|
|
86
97
|
const prefixKey = Cache.createCacheKey(prefix);
|
|
@@ -94,10 +105,13 @@ export class Cache {
|
|
|
94
105
|
const key = Cache.createCacheKey(fetchKey);
|
|
95
106
|
if (!Cache.cache.has(key)) {
|
|
96
107
|
Cache.cache.set(key, {
|
|
108
|
+
key,
|
|
109
|
+
data: Cache.loadPersisted(key),
|
|
97
110
|
interval: null,
|
|
98
111
|
onError: [],
|
|
99
|
-
|
|
112
|
+
onFetch: [],
|
|
100
113
|
onRefetch: [],
|
|
114
|
+
onSuccess: [],
|
|
101
115
|
onFirstFetch: [],
|
|
102
116
|
});
|
|
103
117
|
}
|
|
@@ -116,5 +130,30 @@ export class Cache {
|
|
|
116
130
|
const keys = Object.keys(value).sort();
|
|
117
131
|
return `{${keys.map((k) => `${k}:${Cache.stableStringify(value[k])}`).join(',')}}`;
|
|
118
132
|
}
|
|
133
|
+
static loadPersisted(key) {
|
|
134
|
+
try {
|
|
135
|
+
const raw = localStorage.getItem(key);
|
|
136
|
+
return raw ? JSON.parse(raw) : undefined;
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
return undefined;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
static persistData(key, data) {
|
|
143
|
+
try {
|
|
144
|
+
localStorage.setItem(key, JSON.stringify(data));
|
|
145
|
+
}
|
|
146
|
+
catch {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
static removePersisted(key) {
|
|
151
|
+
try {
|
|
152
|
+
localStorage.removeItem(key);
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
119
158
|
}
|
|
120
159
|
Cache.cache = new Map();
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@davigomesdev/cache",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.2",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"types": "dist/index.d.ts",
|
|
6
6
|
"files": ["dist"],
|
|
7
7
|
"scripts": {
|
|
8
8
|
"build": "tsc",
|
|
9
|
-
"
|
|
9
|
+
"publish": "npm publish --access public"
|
|
10
10
|
},
|
|
11
11
|
"devDependencies": {
|
|
12
12
|
"@eslint/js": "^9.39.2",
|