@davigomesdev/cache 0.0.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.
@@ -0,0 +1,32 @@
1
+ export type CacheProps<T> = {
2
+ fetchKey: any;
3
+ refetchInterval?: number;
4
+ fetchFn: () => Promise<T>;
5
+ onError?: (error: any) => Promise<void> | void;
6
+ onSuccess?: (response: T) => Promise<void> | void;
7
+ onRefetch?: (response: T) => Promise<void> | void;
8
+ onFirstFetch?: (response: T) => Promise<void> | void;
9
+ };
10
+ export type CacheItem = {
11
+ isFetch?: boolean;
12
+ isRefetch?: boolean;
13
+ isFirstFetch?: boolean;
14
+ interval?: ReturnType<typeof setInterval> | null;
15
+ data?: any;
16
+ refetchFn?: () => Promise<void>;
17
+ onError: Array<(error: any) => Promise<void> | void>;
18
+ onSuccess: Array<(response: any) => Promise<void> | void>;
19
+ onRefetch: Array<(response: any) => Promise<void> | void>;
20
+ onFirstFetch: Array<(response: any) => Promise<void> | void>;
21
+ };
22
+ export declare class Cache {
23
+ private static cache;
24
+ static fetch<T>({ fetchKey, refetchInterval, fetchFn, onError, onSuccess, onRefetch, onFirstFetch }: CacheProps<T>): void;
25
+ static refetch(fetchKey: any): void;
26
+ static invalidate(fetchKey: any): void;
27
+ static invalidatePrefix(prefix: any): void;
28
+ private static getItem;
29
+ private static createCacheKey;
30
+ private static stableStringify;
31
+ }
32
+ //# sourceMappingURL=cache.d.ts.map
@@ -0,0 +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,IAAI,CAAC,EAAE,GAAG,CAAC;IACX,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,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,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,IAAI;WAmElH,OAAO,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI;WAK5B,UAAU,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI;WAW/B,gBAAgB,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI;IAUjD,OAAO,CAAC,MAAM,CAAC,OAAO;IAgBtB,OAAO,CAAC,MAAM,CAAC,cAAc;IAI7B,OAAO,CAAC,MAAM,CAAC,eAAe;CAa/B"}
package/dist/cache.js ADDED
@@ -0,0 +1,120 @@
1
+ export class Cache {
2
+ static fetch({ fetchKey, refetchInterval, fetchFn, onError, onSuccess, onRefetch, onFirstFetch }) {
3
+ const item = Cache.getItem(fetchKey);
4
+ if (onError)
5
+ item.onError.push(onError);
6
+ if (onSuccess)
7
+ item.onSuccess.push(onSuccess);
8
+ if (onRefetch)
9
+ item.onRefetch.push(onRefetch);
10
+ if (onFirstFetch)
11
+ item.onFirstFetch.push(onFirstFetch);
12
+ if (!item.refetchFn) {
13
+ item.refetchFn = async () => {
14
+ if (item.isRefetch)
15
+ return;
16
+ item.isRefetch = true;
17
+ try {
18
+ const data = await fetchFn();
19
+ for (const cb of item.onRefetch)
20
+ cb(data);
21
+ for (const cb of item.onSuccess)
22
+ cb(data);
23
+ item.data = data;
24
+ }
25
+ catch (error) {
26
+ for (const cb of item.onError)
27
+ cb(error);
28
+ }
29
+ finally {
30
+ item.isRefetch = false;
31
+ }
32
+ };
33
+ if (refetchInterval && !item.interval) {
34
+ item.interval = setInterval(() => {
35
+ item.refetchFn();
36
+ }, refetchInterval);
37
+ }
38
+ }
39
+ if (item.data !== undefined) {
40
+ for (const cb of item.onSuccess)
41
+ cb(item.data);
42
+ }
43
+ const runFetch = async () => {
44
+ item.isFetch = true;
45
+ try {
46
+ const data = await fetchFn();
47
+ const wasEmpty = item.data === undefined;
48
+ if (wasEmpty) {
49
+ for (const cb of item.onSuccess)
50
+ cb(data);
51
+ }
52
+ else {
53
+ for (const cb of item.onRefetch)
54
+ cb(data);
55
+ }
56
+ item.data = data;
57
+ if (item.isFirstFetch === undefined || !item.isFirstFetch) {
58
+ for (const cb of item.onFirstFetch)
59
+ cb(data);
60
+ item.isFirstFetch = true;
61
+ }
62
+ }
63
+ catch (error) {
64
+ for (const cb of item.onError)
65
+ cb(error);
66
+ }
67
+ finally {
68
+ item.isFetch = false;
69
+ }
70
+ };
71
+ runFetch();
72
+ }
73
+ static refetch(fetchKey) {
74
+ const item = Cache.getItem(fetchKey);
75
+ item.refetchFn();
76
+ }
77
+ static invalidate(fetchKey) {
78
+ const item = Cache.getItem(fetchKey);
79
+ if (item.interval) {
80
+ clearInterval(item.interval);
81
+ item.interval = null;
82
+ }
83
+ item.data = undefined;
84
+ }
85
+ static invalidatePrefix(prefix) {
86
+ const prefixKey = Cache.createCacheKey(prefix);
87
+ for (const key of Cache.cache.keys()) {
88
+ if (key.startsWith(prefixKey)) {
89
+ Cache.invalidate(key);
90
+ }
91
+ }
92
+ }
93
+ static getItem(fetchKey) {
94
+ const key = Cache.createCacheKey(fetchKey);
95
+ if (!Cache.cache.has(key)) {
96
+ Cache.cache.set(key, {
97
+ interval: null,
98
+ onError: [],
99
+ onSuccess: [],
100
+ onRefetch: [],
101
+ onFirstFetch: [],
102
+ });
103
+ }
104
+ return Cache.cache.get(key);
105
+ }
106
+ static createCacheKey(key) {
107
+ return typeof key === 'string' ? key : Cache.stableStringify(key);
108
+ }
109
+ static stableStringify(value) {
110
+ if (value === null || typeof value !== 'object') {
111
+ return String(value);
112
+ }
113
+ if (Array.isArray(value)) {
114
+ return `[${value.map(Cache.stableStringify).join(',')}]`;
115
+ }
116
+ const keys = Object.keys(value).sort();
117
+ return `{${keys.map((k) => `${k}:${Cache.stableStringify(value[k])}`).join(',')}}`;
118
+ }
119
+ }
120
+ Cache.cache = new Map();
@@ -0,0 +1,2 @@
1
+ export * from './cache';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1 @@
1
+ export * from './cache';
package/package.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "@davigomesdev/cache",
3
+ "version": "0.0.0",
4
+ "main": "dist/index.js",
5
+ "types": "dist/index.d.ts",
6
+ "files": ["dist"],
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "prepublishOnly": "npm run build"
10
+ },
11
+ "devDependencies": {
12
+ "@eslint/js": "^9.39.2",
13
+ "@types/node": "^25.0.2",
14
+ "@typescript-eslint/eslint-plugin": "^8.50.0",
15
+ "@typescript-eslint/parser": "^8.50.0",
16
+ "eslint": "^9.39.2",
17
+ "eslint-plugin-prettier": "^5.5.4",
18
+ "globals": "^16.5.0",
19
+ "prettier": "^3.7.4",
20
+ "typescript": "~5.9.3",
21
+ "typescript-eslint": "^8.50.0"
22
+ }
23
+ }