11import { persisted , writable } from '../index'
22import { get } from 'svelte/store'
33import { expect , vi , beforeEach , describe , test , it } from 'vitest'
4+ import localforage from 'localforage'
45
5- beforeEach ( ( ) => localStorage . clear ( ) )
6+ beforeEach ( async ( ) => {
7+ await localforage . clear ( ) ;
8+ /* Set the driver to localStorage, overriding the default IndexedDB,
9+ since localStorage is used in all but the final two tests. */
10+ await localforage . setDriver ( localforage . LOCALSTORAGE ) ;
11+ } )
612
713describe ( 'writable()' , ( ) => {
8- test ( 'it works, but raises deprecation warning' , ( ) => {
14+ test ( 'it works, but raises deprecation warning' , async ( ) => {
915 console . warn = vi . fn ( )
1016
11- localStorage . setItem ( 'myKey2' , '"existing"' )
17+ await localforage . setItem ( 'myKey2' , '"existing"' )
1218
13- const store = writable ( 'myKey2' , 'initial' )
19+ const store = await writable ( 'myKey2' , 'initial' )
1420 const value = get ( store )
1521
1622 expect ( value ) . toEqual ( 'existing' )
@@ -19,120 +25,120 @@ describe('writable()', () => {
1925} )
2026
2127describe ( 'persisted()' , ( ) => {
22- test ( 'uses initial value if nothing in local storage' , ( ) => {
23- const store = persisted ( 'myKey' , 123 )
28+ test ( 'uses initial value if nothing in local storage' , async ( ) => {
29+ const store = await persisted ( 'myKey' , 123 )
2430 const value = get ( store )
2531
2632 expect ( value ) . toEqual ( 123 )
27- expect ( localStorage . myKey ) . toBeUndefined ( )
33+ expect ( await localforage . getItem ( " myKey" ) ) . toBeNull ( )
2834 } )
2935
30- test ( 'uses existing value if data already in local storage' , ( ) => {
31- localStorage . setItem ( 'myKey2' , '"existing"' )
36+ test ( 'uses existing value if data already in local storage' , async ( ) => {
37+ await localforage . setItem ( 'myKey2' , '"existing"' )
3238
33- const store = persisted ( 'myKey2' , 'initial' )
39+ const store = await persisted ( 'myKey2' , 'initial' )
3440 const value = get ( store )
3541
3642 expect ( value ) . toEqual ( 'existing' )
3743 } )
3844
3945 describe ( 'set()' , ( ) => {
40- test ( 'replaces old value' , ( ) => {
41- localStorage . setItem ( 'myKey3' , '"existing"' )
46+ test ( 'replaces old value' , async ( ) => {
47+ await localforage . setItem ( 'myKey3' , '"existing"' )
4248
43- const store = persisted ( 'myKey3' , '' )
44- store . set ( 'new-value' )
49+ const store = await persisted ( 'myKey3' , '' )
50+ await store . set ( 'new-value' )
4551 const value = get ( store )
4652
47- expect ( localStorage . myKey3 ) . toEqual ( '"new-value"' )
53+ expect ( await localforage . getItem ( " myKey3" ) ) . toEqual ( '"new-value"' )
4854 expect ( value ) . toEqual ( 'new-value' )
4955 } )
5056
51- test ( 'adds new value' , ( ) => {
52- const store = persisted ( 'myKey4' , '' )
53- store . set ( 'new-value' )
57+ test ( 'adds new value' , async ( ) => {
58+ const store = await persisted ( 'myKey4' , '' )
59+ await store . set ( 'new-value' )
5460 const value = get ( store )
5561
56- expect ( localStorage . myKey4 ) . toEqual ( '"new-value"' )
62+ expect ( await localforage . getItem ( " myKey4" ) ) . toEqual ( '"new-value"' )
5763 expect ( value ) . toEqual ( 'new-value' )
5864 } )
5965 } )
6066
6167 describe ( 'update()' , ( ) => {
62- test ( 'replaces old value' , ( ) => {
63- const store = persisted ( 'myKey5' , 123 )
68+ test ( 'replaces old value' , async ( ) => {
69+ const store = await persisted ( 'myKey5' , 123 )
6470 store . update ( n => n + 1 )
6571 const value = get ( store )
6672
67- expect ( localStorage . myKey5 ) . toEqual ( '124' )
73+ expect ( await ( await localforage . getItem ( " myKey5" ) ) ) . toEqual ( '124' )
6874 expect ( value ) . toEqual ( 124 )
6975 } )
7076
71- test ( 'adds new value' , ( ) => {
72- const store = persisted ( 'myKey6' , 123 )
73- store . update ( n => n + 1 )
77+ test ( 'adds new value' , async ( ) => {
78+ const store = await persisted ( 'myKey6' , 123 )
79+ await store . update ( n => n + 1 )
7480 const value = get ( store )
7581
76- expect ( localStorage . myKey6 ) . toEqual ( '124' )
82+ expect ( await localforage . getItem ( " myKey6" ) ) . toEqual ( '124' )
7783 expect ( value ) . toEqual ( 124 )
7884 } )
7985
80- test ( "BUG: update should use existing value" , ( ) => {
81- localStorage . setItem ( 'myKey6b' , '12345' )
82- const store = persisted ( 'myKey6b' , 123 )
83- store . update ( n => { n += 1 ; return n } )
86+ test ( "BUG: update should use existing value" , async ( ) => {
87+ await localforage . setItem ( 'myKey6b' , '12345' )
88+ const store = await persisted ( 'myKey6b' , 123 )
89+ await store . update ( n => { n += 1 ; return n } )
8490
85- expect ( localStorage . myKey6b ) . toEqual ( '12346' )
91+ expect ( await localforage . getItem ( " myKey6b" ) ) . toEqual ( '12346' )
8692 } )
8793 } )
8894
8995 describe ( 'reset' , ( ) => {
90- it ( 'resets to initial value' , ( ) => {
91- const store = persisted ( 'myKey14' , 123 ) ;
92- store . set ( 456 ) ;
93- store . reset ( ) ;
96+ it ( 'resets to initial value' , async ( ) => {
97+ const store = await persisted ( 'myKey14' , 123 ) ;
98+ await store . set ( 456 ) ;
99+ await store . reset ( ) ;
94100 const value = get ( store ) ;
95101
96102 expect ( value ) . toEqual ( 123 ) ;
97- expect ( localStorage . myKey14 ) . toEqual ( '123' ) ;
103+ expect ( await localforage . getItem ( " myKey14" ) ) . toEqual ( '123' ) ;
98104 } ) ;
99105 } ) ;
100106
101107 describe ( 'subscribe()' , ( ) => {
102- it ( 'publishes updates' , ( ) => {
103- const store = persisted ( 'myKey7' , 123 )
108+ it ( 'publishes updates' , async ( ) => {
109+ const store = await persisted ( 'myKey7' , 123 )
104110 const values : number [ ] = [ ]
105111 const unsub = store . subscribe ( ( value : number ) => {
106112 if ( value !== undefined ) values . push ( value )
107113 } )
108- store . set ( 456 )
109- store . set ( 999 )
114+ await store . set ( 456 )
115+ await store . set ( 999 )
110116
111117 expect ( values ) . toEqual ( [ 123 , 456 , 999 ] )
112118
113119 unsub ( )
114120 } )
115121 } )
116122
117- it ( 'handles duplicate stores with the same key' , ( ) => {
118- const store1 = persisted ( 'same-key' , 1 )
123+ it ( 'handles duplicate stores with the same key' , async ( ) => {
124+ const store1 = await persisted ( 'same-key' , 1 )
119125 const values1 : number [ ] = [ ]
120126
121- const unsub1 = store1 . subscribe ( value => {
127+ const unsub1 = ( await store1 ) . subscribe ( value => {
122128 values1 . push ( value )
123129 } )
124130
125- store1 . set ( 2 )
131+ await store1 . set ( 2 )
126132
127- const store2 = persisted ( 'same-key' , 99 )
133+ const store2 = await persisted ( 'same-key' , 99 )
128134 const values2 : number [ ] = [ ]
129135
130- const unsub2 = store2 . subscribe ( value => {
136+ const unsub2 = ( await store2 ) . subscribe ( value => {
131137 values2 . push ( value )
132138 } )
133139
134- store1 . set ( 3 )
135- store2 . set ( 4 )
140+ await store1 . set ( 3 )
141+ await store2 . set ( 4 )
136142
137143 expect ( values1 ) . toEqual ( [ 1 , 2 , 3 , 4 ] )
138144 expect ( values2 ) . toEqual ( [ 2 , 3 , 4 ] )
@@ -145,13 +151,13 @@ describe('persisted()', () => {
145151 } )
146152
147153 describe ( "beforeRead and beforeWrite" , ( ) => {
148- it ( "allows modifying initial value before reading" , ( ) => {
149- localStorage . setItem ( "beforeRead-init-test" , JSON . stringify ( 2 ) )
150- const store = persisted ( "beforeRead-init-test" , 0 , { beforeRead : ( v : number ) => v * 2 } )
154+ it ( "allows modifying initial value before reading" , async ( ) => {
155+ await localforage . setItem ( "beforeRead-init-test" , JSON . stringify ( 2 ) )
156+ const store = await persisted ( "beforeRead-init-test" , 0 , { beforeRead : ( v : number ) => v * 2 } )
151157 expect ( get ( store ) ) . toEqual ( 4 )
152158 } )
153- it ( "allows modifying value before reading upon event" , ( ) => {
154- const store = persisted ( "beforeRead-test" , 0 , { beforeRead : ( v : number ) => v * 2 } )
159+ it ( "allows modifying value before reading upon event" , async ( ) => {
160+ const store = await persisted ( "beforeRead-test" , 0 , { beforeRead : ( v : number ) => v * 2 } )
155161 const values : number [ ] = [ ]
156162
157163 const unsub = store . subscribe ( ( val : number ) => {
@@ -166,19 +172,19 @@ describe('persisted()', () => {
166172 unsub ( )
167173 } )
168174
169- it ( "allows modifying value before writing" , ( ) => {
170- const store = persisted ( "beforeWrite-test" , 0 , { beforeWrite : ( v ) => v * 2 } )
171- store . set ( 2 )
175+ it ( "allows modifying value before writing" , async ( ) => {
176+ const store = await persisted ( "beforeWrite-test" , 0 , { beforeWrite : ( v ) => v * 2 } )
177+ await store . set ( 2 )
172178
173- expect ( JSON . parse ( localStorage . getItem ( "beforeWrite-test" ) as string ) ) . toEqual ( 4 )
179+ expect ( JSON . parse ( await localforage . getItem ( "beforeWrite-test" ) as string ) ) . toEqual ( 4 )
174180 } )
175181 } )
176182
177183 describe ( 'handles window.storage event' , ( ) => {
178184 type NumberDict = { [ key : string ] : number }
179185
180- it ( 'sets storage when key matches' , ( ) => {
181- const store = persisted ( 'myKey8' , { a : 1 } )
186+ it ( 'sets storage when key matches' , async ( ) => {
187+ const store = await persisted ( 'myKey8' , { a : 1 } )
182188 const values : NumberDict [ ] = [ ]
183189
184190 const unsub = store . subscribe ( ( value : NumberDict ) => {
@@ -193,8 +199,8 @@ describe('persisted()', () => {
193199 unsub ( )
194200 } )
195201
196- it ( 'ignores storages events when value is null' , ( ) => {
197- const store = persisted ( 'myKey9' , { a : 1 } )
202+ it ( 'ignores storages events when value is null' , async ( ) => {
203+ const store = await persisted ( 'myKey9' , { a : 1 } )
198204 const values : NumberDict [ ] = [ ]
199205
200206 const unsub = store . subscribe ( ( value : NumberDict ) => {
@@ -209,8 +215,8 @@ describe('persisted()', () => {
209215 unsub ( )
210216 } )
211217
212- it ( "doesn't update store when key doesn't match" , ( ) => {
213- const store = persisted ( 'myKey10' , 1 )
218+ it ( "doesn't update store when key doesn't match" , async ( ) => {
219+ const store = await persisted ( 'myKey10' , 1 )
214220 const values : number [ ] = [ ]
215221
216222 const unsub = store . subscribe ( ( value : number ) => {
@@ -225,10 +231,10 @@ describe('persisted()', () => {
225231 unsub ( )
226232 } )
227233
228- it ( "doesn't update store when there are no subscribers" , ( ) => {
229- localStorage . setItem ( 'myKeyb' , '2' )
234+ it ( "doesn't update store when there are no subscribers" , async ( ) => {
235+ await localforage . setItem ( 'myKeyb' , '2' )
230236
231- const store = persisted ( 'myKeyb' , 1 )
237+ const store = await persisted ( 'myKeyb' , 1 )
232238 const values : number [ ] = [ ]
233239
234240 const event = new StorageEvent ( 'storage' , { key : 'myKeyb' , newValue : '2' } )
@@ -243,8 +249,8 @@ describe('persisted()', () => {
243249 unsub ( )
244250 } )
245251
246- it ( 'ignores session-backed stores' , ( ) => {
247- const store = persisted ( 'myKey10' , 1 , { storage : 'session' } )
252+ it ( 'ignores session-backed stores' , async ( ) => {
253+ const store = await persisted ( 'myKey10' , 1 , { storage : 'session' } )
248254 const values : number [ ] = [ ]
249255
250256 const unsub = store . subscribe ( ( value ) => {
@@ -259,8 +265,8 @@ describe('persisted()', () => {
259265 unsub ( )
260266 } )
261267
262- it ( "doesn't update, when syncTabs option is disabled" , ( ) => {
263- const store = persisted ( 'myKey13' , 1 , { syncTabs : false } )
268+ it ( "doesn't update, when syncTabs option is disabled" , async ( ) => {
269+ const store = await persisted ( 'myKey13' , 1 , { syncTabs : false } )
264270 const values : number [ ] = [ ]
265271
266272 const unsub = store . subscribe ( ( value ) => {
@@ -276,21 +282,21 @@ describe('persisted()', () => {
276282 } )
277283 } )
278284
279- it ( 'allows custom serialize/deserialize functions' , ( ) => {
285+ it ( 'allows custom serialize/deserialize functions' , async ( ) => {
280286 const serializer = {
281287 stringify : ( set : Set < number > ) => JSON . stringify ( Array . from ( set ) ) ,
282288 parse : ( json : string ) => new Set ( JSON . parse ( json ) ) ,
283289 }
284290
285291 const testSet = new Set ( [ 1 , 2 , 3 ] )
286292
287- const store = persisted ( 'myKey11' , testSet , { serializer } )
293+ const store = await persisted ( 'myKey11' , testSet , { serializer } )
288294 const value = get ( store )
289295
290- store . update ( d => d . add ( 4 ) )
296+ await store . update ( d => d . add ( 4 ) )
291297
292298 expect ( value ) . toEqual ( testSet )
293- expect ( localStorage . myKey11 ) . toEqual ( serializer . stringify ( new Set ( [ 1 , 2 , 3 , 4 ] ) ) )
299+ expect ( await localforage . getItem ( " myKey11" ) ) . toEqual ( serializer . stringify ( new Set ( [ 1 , 2 , 3 , 4 ] ) ) )
294300 } )
295301
296302 it ( 'lets you switch storage type' , ( ) => {
@@ -299,11 +305,11 @@ describe('persisted()', () => {
299305
300306 const value = 'foo'
301307
302- const store = persisted ( 'myKey12' , value , {
308+ const store = await persisted ( 'myKey12' , value , {
303309 storage : 'session'
304310 } )
305311
306- store . set ( 'bar' )
312+ await store . set ( 'bar' )
307313
308314 expect ( window . sessionStorage . setItem ) . toHaveBeenCalled ( )
309315 } )
0 commit comments