@@ -15,8 +15,11 @@ export const localStorage: chrome.storage.LocalStorageArea = window?.chrome?.sto
15
15
*/
16
16
export const sessionStorage : chrome . storage . StorageArea = window ?. chrome ?. storage ?. session ;
17
17
18
- const filterObject = ( object : Record < string , unknown > , regex : string ) =>
19
- Object . fromEntries ( Object . entries ( object ) . filter ( ( [ key ] ) => new RegExp ( regex ) . test ( key ) ) ) ;
18
+ const filterObject = ( object : Record < string , unknown > , regex : string | RegExp ) =>
19
+ Object . fromEntries ( Object . entries ( object ) . filter ( ( [ key ] ) => ( typeof regex === 'string' ? new RegExp ( regex ) : regex ) . test ( key ) ) ) ;
20
+
21
+ const reverseFilterObject = ( object : Record < string , unknown > , regex : string | RegExp ) =>
22
+ Object . fromEntries ( Object . entries ( object ) . filter ( ( [ key ] ) => ! ( typeof regex === 'string' ? new RegExp ( regex ) : regex ) . test ( key ) ) ) ;
20
23
21
24
/**
22
25
* This function is used to wrap the storage areas to provide type inference and a more convenient interface.
@@ -50,18 +53,31 @@ export const storageWrapper = (area: chrome.storage.StorageArea, name: string) =
50
53
51
54
window . trakt = { ...window . trakt , [ name ] : storage } ;
52
55
return {
53
- getAll : async < T > ( regex ?: string ) : Promise < T > => ( regex ? filterObject ( storage . values , regex ) : storage . values ) as T ,
56
+ getAll : async < T > ( regex ?: string | RegExp ) : Promise < T > => ( regex ? filterObject ( storage . values , regex ) : storage . values ) as T ,
54
57
get : async < T > ( key : string ) : Promise < T > => storage . values [ key ] as T ,
55
58
set : async < T > ( key : string , value : T ) : Promise < void > => storage . setItem ( key , value ) ,
56
59
remove : async ( key : string ) : Promise < void > => storage . removeItem ( key ) ,
60
+ removeAll : async ( regex : string | RegExp ) : Promise < void > => {
61
+ storage . values = reverseFilterObject ( storage . values , regex ) ;
62
+ } ,
57
63
clear : async ( ) : Promise < void > => storage . clear ( ) ,
58
64
} ;
59
65
}
60
66
return {
61
- getAll : < T > ( regex ?: string ) : Promise < T > => area . get ( ) . then ( data => ( regex ? filterObject ( data , regex ) : data ) as T ) ,
67
+ getAll : < T > ( regex ?: string | RegExp ) : Promise < T > => area . get ( ) . then ( data => ( regex ? filterObject ( data , regex ) : data ) as T ) ,
62
68
get : < T > ( key : string ) : Promise < T > => area . get ( key ) . then ( ( { [ key ] : value } ) => value ) ,
63
69
set : < T > ( key : string , value : T ) : Promise < void > => area . set ( { [ key ] : value } ) ,
64
70
remove : ( key : string ) : Promise < void > => area . remove ( key ) ,
71
+ removeAll : async ( regex : string | RegExp ) : Promise < void > => {
72
+ const data = await area . get ( ) ;
73
+ const _regex = typeof regex === 'string' ? new RegExp ( regex ) : regex ;
74
+ await Promise . all (
75
+ Object . keys ( data ) . map ( key => {
76
+ if ( _regex . test ( key ) ) return area . remove ( key ) ;
77
+ return Promise . resolve ( ) ;
78
+ } ) ,
79
+ ) ;
80
+ } ,
65
81
clear : ( ) : Promise < void > => area . clear ( ) ,
66
82
} ;
67
83
} ;
0 commit comments