@pyreon/storage 0.11.4 → 0.11.6
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/README.md +10 -10
- package/lib/index.js.map +1 -1
- package/lib/types/index.d.ts +3 -3
- package/package.json +14 -14
- package/src/clear.ts +13 -13
- package/src/cookie.ts +15 -15
- package/src/custom.ts +7 -7
- package/src/index.ts +9 -9
- package/src/indexed-db.ts +16 -16
- package/src/local.ts +12 -12
- package/src/registry.ts +1 -1
- package/src/session.ts +9 -9
- package/src/tests/clear-remove.test.ts +77 -77
- package/src/tests/clear.test.ts +43 -43
- package/src/tests/cookie-options.test.ts +92 -92
- package/src/tests/cookie.test.ts +66 -66
- package/src/tests/cross-tab-sync.test.ts +58 -58
- package/src/tests/custom.test.ts +59 -59
- package/src/tests/indexed-db-debounce.test.ts +43 -43
- package/src/tests/indexed-db.test.ts +36 -36
- package/src/tests/local.test.ts +98 -98
- package/src/tests/memory-storage.test.ts +94 -94
- package/src/tests/session.test.ts +31 -31
- package/src/types.ts +2 -2
- package/src/utils.ts +9 -9
package/src/local.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { signal } from
|
|
2
|
-
import { getEntry, removeEntry, setEntry } from
|
|
3
|
-
import type { StorageOptions, StorageSignal } from
|
|
4
|
-
import { deserialize, getWebStorage, isBrowser, serialize } from
|
|
1
|
+
import { signal } from '@pyreon/reactivity'
|
|
2
|
+
import { getEntry, removeEntry, setEntry } from './registry'
|
|
3
|
+
import type { StorageOptions, StorageSignal } from './types'
|
|
4
|
+
import { deserialize, getWebStorage, isBrowser, serialize } from './utils'
|
|
5
5
|
|
|
6
6
|
// ─── Cross-tab sync ──────────────────────────────────────────────────────────
|
|
7
7
|
|
|
@@ -11,9 +11,9 @@ function attachStorageListener(): void {
|
|
|
11
11
|
if (listenerAttached || !isBrowser()) return
|
|
12
12
|
listenerAttached = true
|
|
13
13
|
|
|
14
|
-
window.addEventListener(
|
|
14
|
+
window.addEventListener('storage', (e) => {
|
|
15
15
|
if (!e.key) return
|
|
16
|
-
const entry = getEntry(
|
|
16
|
+
const entry = getEntry('local', e.key)
|
|
17
17
|
if (!entry) return
|
|
18
18
|
|
|
19
19
|
const newValue =
|
|
@@ -43,10 +43,10 @@ export function useStorage<T>(
|
|
|
43
43
|
options?: StorageOptions<T>,
|
|
44
44
|
): StorageSignal<T> {
|
|
45
45
|
// Return existing signal if already registered
|
|
46
|
-
const existing = getEntry<T>(
|
|
46
|
+
const existing = getEntry<T>('local', key)
|
|
47
47
|
if (existing) return existing.signal
|
|
48
48
|
|
|
49
|
-
const storage = getWebStorage(
|
|
49
|
+
const storage = getWebStorage('local')
|
|
50
50
|
|
|
51
51
|
// Read initial value from storage
|
|
52
52
|
let initialValue = defaultValue
|
|
@@ -60,9 +60,9 @@ export function useStorage<T>(
|
|
|
60
60
|
const sig = signal<T>(initialValue)
|
|
61
61
|
|
|
62
62
|
// Create the storage signal by extending the base signal
|
|
63
|
-
const storageSig = createStorageSignal(sig, key, defaultValue,
|
|
63
|
+
const storageSig = createStorageSignal(sig, key, defaultValue, 'local', options)
|
|
64
64
|
|
|
65
|
-
setEntry(
|
|
65
|
+
setEntry('local', key, storageSig, defaultValue)
|
|
66
66
|
attachStorageListener()
|
|
67
67
|
|
|
68
68
|
return storageSig
|
|
@@ -78,7 +78,7 @@ export function createStorageSignal<T>(
|
|
|
78
78
|
sig: ReturnType<typeof signal<T>>,
|
|
79
79
|
key: string,
|
|
80
80
|
defaultValue: T,
|
|
81
|
-
backend:
|
|
81
|
+
backend: 'local' | 'session',
|
|
82
82
|
options?: StorageOptions<T>,
|
|
83
83
|
): StorageSignal<T> {
|
|
84
84
|
const storage = getWebStorage(backend)
|
|
@@ -92,7 +92,7 @@ export function createStorageSignal<T>(
|
|
|
92
92
|
storageSig.direct = (updater: () => void) => sig.direct(updater)
|
|
93
93
|
storageSig.debug = () => sig.debug()
|
|
94
94
|
|
|
95
|
-
Object.defineProperty(storageSig,
|
|
95
|
+
Object.defineProperty(storageSig, 'label', {
|
|
96
96
|
get: () => sig.label,
|
|
97
97
|
set: (v: string | undefined) => {
|
|
98
98
|
sig.label = v
|
package/src/registry.ts
CHANGED
package/src/session.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { signal } from
|
|
2
|
-
import { createStorageSignal } from
|
|
3
|
-
import { getEntry, setEntry } from
|
|
4
|
-
import type { StorageOptions, StorageSignal } from
|
|
5
|
-
import { deserialize, getWebStorage } from
|
|
1
|
+
import { signal } from '@pyreon/reactivity'
|
|
2
|
+
import { createStorageSignal } from './local'
|
|
3
|
+
import { getEntry, setEntry } from './registry'
|
|
4
|
+
import type { StorageOptions, StorageSignal } from './types'
|
|
5
|
+
import { deserialize, getWebStorage } from './utils'
|
|
6
6
|
|
|
7
7
|
// ─── useSessionStorage ───────────────────────────────────────────────────────
|
|
8
8
|
|
|
@@ -24,10 +24,10 @@ export function useSessionStorage<T>(
|
|
|
24
24
|
options?: StorageOptions<T>,
|
|
25
25
|
): StorageSignal<T> {
|
|
26
26
|
// Return existing signal if already registered
|
|
27
|
-
const existing = getEntry<T>(
|
|
27
|
+
const existing = getEntry<T>('session', key)
|
|
28
28
|
if (existing) return existing.signal
|
|
29
29
|
|
|
30
|
-
const storage = getWebStorage(
|
|
30
|
+
const storage = getWebStorage('session')
|
|
31
31
|
|
|
32
32
|
// Read initial value from storage
|
|
33
33
|
let initialValue = defaultValue
|
|
@@ -39,9 +39,9 @@ export function useSessionStorage<T>(
|
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
const sig = signal<T>(initialValue)
|
|
42
|
-
const storageSig = createStorageSignal(sig, key, defaultValue,
|
|
42
|
+
const storageSig = createStorageSignal(sig, key, defaultValue, 'session', options)
|
|
43
43
|
|
|
44
|
-
setEntry(
|
|
44
|
+
setEntry('session', key, storageSig, defaultValue)
|
|
45
45
|
|
|
46
46
|
return storageSig
|
|
47
47
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, it } from
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest'
|
|
2
2
|
import {
|
|
3
3
|
_resetRegistry,
|
|
4
4
|
clearStorage,
|
|
@@ -6,9 +6,9 @@ import {
|
|
|
6
6
|
useCookie,
|
|
7
7
|
useSessionStorage,
|
|
8
8
|
useStorage,
|
|
9
|
-
} from
|
|
9
|
+
} from '../index'
|
|
10
10
|
|
|
11
|
-
describe(
|
|
11
|
+
describe('removeStorage — comprehensive', () => {
|
|
12
12
|
beforeEach(() => {
|
|
13
13
|
localStorage.clear()
|
|
14
14
|
sessionStorage.clear()
|
|
@@ -21,63 +21,63 @@ describe("removeStorage — comprehensive", () => {
|
|
|
21
21
|
_resetRegistry()
|
|
22
22
|
})
|
|
23
23
|
|
|
24
|
-
it(
|
|
25
|
-
const theme = useStorage(
|
|
26
|
-
theme.set(
|
|
27
|
-
removeStorage(
|
|
28
|
-
expect(theme()).toBe(
|
|
29
|
-
expect(localStorage.getItem(
|
|
24
|
+
it('removes localStorage entry and resets signal to default', () => {
|
|
25
|
+
const theme = useStorage('theme', 'light')
|
|
26
|
+
theme.set('dark')
|
|
27
|
+
removeStorage('theme')
|
|
28
|
+
expect(theme()).toBe('light')
|
|
29
|
+
expect(localStorage.getItem('theme')).toBeNull()
|
|
30
30
|
})
|
|
31
31
|
|
|
32
|
-
it(
|
|
33
|
-
const step = useSessionStorage(
|
|
32
|
+
it('removes sessionStorage entry', () => {
|
|
33
|
+
const step = useSessionStorage('step', 0)
|
|
34
34
|
step.set(5)
|
|
35
|
-
removeStorage(
|
|
35
|
+
removeStorage('step', { type: 'session' })
|
|
36
36
|
expect(step()).toBe(0)
|
|
37
|
-
expect(sessionStorage.getItem(
|
|
37
|
+
expect(sessionStorage.getItem('step')).toBeNull()
|
|
38
38
|
})
|
|
39
39
|
|
|
40
|
-
it(
|
|
41
|
-
const locale = useCookie(
|
|
42
|
-
locale.set(
|
|
43
|
-
removeStorage(
|
|
44
|
-
expect(locale()).toBe(
|
|
40
|
+
it('removes cookie entry', () => {
|
|
41
|
+
const locale = useCookie('locale', 'en')
|
|
42
|
+
locale.set('de')
|
|
43
|
+
removeStorage('locale', { type: 'cookie' })
|
|
44
|
+
expect(locale()).toBe('en')
|
|
45
45
|
})
|
|
46
46
|
|
|
47
|
-
it(
|
|
48
|
-
localStorage.setItem(
|
|
49
|
-
removeStorage(
|
|
50
|
-
expect(localStorage.getItem(
|
|
47
|
+
it('removes raw localStorage entry without a signal', () => {
|
|
48
|
+
localStorage.setItem('orphan', 'value')
|
|
49
|
+
removeStorage('orphan')
|
|
50
|
+
expect(localStorage.getItem('orphan')).toBeNull()
|
|
51
51
|
})
|
|
52
52
|
|
|
53
|
-
it(
|
|
54
|
-
sessionStorage.setItem(
|
|
55
|
-
removeStorage(
|
|
56
|
-
expect(sessionStorage.getItem(
|
|
53
|
+
it('removes raw sessionStorage entry without a signal', () => {
|
|
54
|
+
sessionStorage.setItem('orphan', 'value')
|
|
55
|
+
removeStorage('orphan', { type: 'session' })
|
|
56
|
+
expect(sessionStorage.getItem('orphan')).toBeNull()
|
|
57
57
|
})
|
|
58
58
|
|
|
59
|
-
it(
|
|
60
|
-
expect(() => removeStorage(
|
|
59
|
+
it('removes cookie without a registered signal (no throw)', () => {
|
|
60
|
+
expect(() => removeStorage('nonexistent', { type: 'cookie' })).not.toThrow()
|
|
61
61
|
})
|
|
62
62
|
|
|
63
|
-
it(
|
|
64
|
-
localStorage.setItem(
|
|
65
|
-
removeStorage(
|
|
66
|
-
expect(localStorage.getItem(
|
|
63
|
+
it('defaults to localStorage when no type specified', () => {
|
|
64
|
+
localStorage.setItem('default-type', 'val')
|
|
65
|
+
removeStorage('default-type')
|
|
66
|
+
expect(localStorage.getItem('default-type')).toBeNull()
|
|
67
67
|
})
|
|
68
68
|
|
|
69
|
-
it(
|
|
70
|
-
const a = useStorage(
|
|
71
|
-
a.set(
|
|
72
|
-
removeStorage(
|
|
69
|
+
it('after removeStorage, a new useStorage call creates fresh signal', () => {
|
|
70
|
+
const a = useStorage('resettable', 'first')
|
|
71
|
+
a.set('modified')
|
|
72
|
+
removeStorage('resettable')
|
|
73
73
|
|
|
74
|
-
const b = useStorage(
|
|
75
|
-
expect(b()).toBe(
|
|
74
|
+
const b = useStorage('resettable', 'second')
|
|
75
|
+
expect(b()).toBe('second')
|
|
76
76
|
expect(a).not.toBe(b)
|
|
77
77
|
})
|
|
78
78
|
})
|
|
79
79
|
|
|
80
|
-
describe(
|
|
80
|
+
describe('clearStorage — comprehensive', () => {
|
|
81
81
|
beforeEach(() => {
|
|
82
82
|
localStorage.clear()
|
|
83
83
|
sessionStorage.clear()
|
|
@@ -90,10 +90,10 @@ describe("clearStorage — comprehensive", () => {
|
|
|
90
90
|
_resetRegistry()
|
|
91
91
|
})
|
|
92
92
|
|
|
93
|
-
it(
|
|
94
|
-
const a = useStorage(
|
|
95
|
-
const b = useStorage(
|
|
96
|
-
const c = useStorage(
|
|
93
|
+
it('clears all managed localStorage entries', () => {
|
|
94
|
+
const a = useStorage('a', 1)
|
|
95
|
+
const b = useStorage('b', 2)
|
|
96
|
+
const c = useStorage('c', 3)
|
|
97
97
|
a.set(10)
|
|
98
98
|
b.set(20)
|
|
99
99
|
c.set(30)
|
|
@@ -104,55 +104,55 @@ describe("clearStorage — comprehensive", () => {
|
|
|
104
104
|
expect(c()).toBe(3)
|
|
105
105
|
})
|
|
106
106
|
|
|
107
|
-
it(
|
|
108
|
-
const a = useSessionStorage(
|
|
109
|
-
const b = useSessionStorage(
|
|
110
|
-
a.set(
|
|
111
|
-
b.set(
|
|
107
|
+
it('clears all managed sessionStorage entries', () => {
|
|
108
|
+
const a = useSessionStorage('a', 'x')
|
|
109
|
+
const b = useSessionStorage('b', 'y')
|
|
110
|
+
a.set('modified-a')
|
|
111
|
+
b.set('modified-b')
|
|
112
112
|
|
|
113
|
-
clearStorage(
|
|
114
|
-
expect(a()).toBe(
|
|
115
|
-
expect(b()).toBe(
|
|
113
|
+
clearStorage('session')
|
|
114
|
+
expect(a()).toBe('x')
|
|
115
|
+
expect(b()).toBe('y')
|
|
116
116
|
})
|
|
117
117
|
|
|
118
|
-
it(
|
|
119
|
-
const locale = useCookie(
|
|
120
|
-
locale.set(
|
|
118
|
+
it('clears managed cookie entries', () => {
|
|
119
|
+
const locale = useCookie('locale', 'en')
|
|
120
|
+
locale.set('de')
|
|
121
121
|
|
|
122
|
-
clearStorage(
|
|
123
|
-
expect(locale()).toBe(
|
|
122
|
+
clearStorage('cookie')
|
|
123
|
+
expect(locale()).toBe('en')
|
|
124
124
|
})
|
|
125
125
|
|
|
126
126
|
it('clears all backends with "all"', () => {
|
|
127
|
-
const local = useStorage(
|
|
128
|
-
const session = useSessionStorage(
|
|
129
|
-
const cookie = useCookie(
|
|
130
|
-
local.set(
|
|
131
|
-
session.set(
|
|
132
|
-
cookie.set(
|
|
127
|
+
const local = useStorage('local-key', 'default')
|
|
128
|
+
const session = useSessionStorage('session-key', 'default')
|
|
129
|
+
const cookie = useCookie('cookie-key', 'default')
|
|
130
|
+
local.set('changed')
|
|
131
|
+
session.set('changed')
|
|
132
|
+
cookie.set('changed')
|
|
133
133
|
|
|
134
|
-
clearStorage(
|
|
135
|
-
expect(local()).toBe(
|
|
136
|
-
expect(session()).toBe(
|
|
137
|
-
expect(cookie()).toBe(
|
|
134
|
+
clearStorage('all')
|
|
135
|
+
expect(local()).toBe('default')
|
|
136
|
+
expect(session()).toBe('default')
|
|
137
|
+
expect(cookie()).toBe('default')
|
|
138
138
|
})
|
|
139
139
|
|
|
140
|
-
it(
|
|
140
|
+
it('clearStorage with no managed entries does not throw', () => {
|
|
141
141
|
expect(() => clearStorage()).not.toThrow()
|
|
142
|
-
expect(() => clearStorage(
|
|
143
|
-
expect(() => clearStorage(
|
|
144
|
-
expect(() => clearStorage(
|
|
145
|
-
expect(() => clearStorage(
|
|
142
|
+
expect(() => clearStorage('session')).not.toThrow()
|
|
143
|
+
expect(() => clearStorage('cookie')).not.toThrow()
|
|
144
|
+
expect(() => clearStorage('indexeddb')).not.toThrow()
|
|
145
|
+
expect(() => clearStorage('all')).not.toThrow()
|
|
146
146
|
})
|
|
147
147
|
|
|
148
|
-
it(
|
|
149
|
-
localStorage.setItem(
|
|
150
|
-
const managed = useStorage(
|
|
151
|
-
managed.set(
|
|
148
|
+
it('clearStorage does not affect unmanaged entries', () => {
|
|
149
|
+
localStorage.setItem('unmanaged', 'value')
|
|
150
|
+
const managed = useStorage('managed', 'default')
|
|
151
|
+
managed.set('changed')
|
|
152
152
|
|
|
153
153
|
clearStorage()
|
|
154
|
-
expect(managed()).toBe(
|
|
154
|
+
expect(managed()).toBe('default')
|
|
155
155
|
// Unmanaged key should still exist (clearStorage only affects registered signals)
|
|
156
|
-
expect(localStorage.getItem(
|
|
156
|
+
expect(localStorage.getItem('unmanaged')).toBe('value')
|
|
157
157
|
})
|
|
158
158
|
})
|
package/src/tests/clear.test.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { afterEach, beforeEach, describe, expect, it } from
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest'
|
|
2
2
|
import {
|
|
3
3
|
_resetRegistry,
|
|
4
4
|
clearStorage,
|
|
5
5
|
removeStorage,
|
|
6
6
|
useSessionStorage,
|
|
7
7
|
useStorage,
|
|
8
|
-
} from
|
|
8
|
+
} from '../index'
|
|
9
9
|
|
|
10
|
-
describe(
|
|
10
|
+
describe('removeStorage', () => {
|
|
11
11
|
beforeEach(() => {
|
|
12
12
|
localStorage.clear()
|
|
13
13
|
sessionStorage.clear()
|
|
@@ -20,43 +20,43 @@ describe("removeStorage", () => {
|
|
|
20
20
|
_resetRegistry()
|
|
21
21
|
})
|
|
22
22
|
|
|
23
|
-
it(
|
|
24
|
-
const theme = useStorage(
|
|
25
|
-
theme.set(
|
|
23
|
+
it('removes a localStorage entry via signal', () => {
|
|
24
|
+
const theme = useStorage('theme', 'light')
|
|
25
|
+
theme.set('dark')
|
|
26
26
|
|
|
27
|
-
removeStorage(
|
|
28
|
-
expect(theme()).toBe(
|
|
29
|
-
expect(localStorage.getItem(
|
|
27
|
+
removeStorage('theme')
|
|
28
|
+
expect(theme()).toBe('light')
|
|
29
|
+
expect(localStorage.getItem('theme')).toBeNull()
|
|
30
30
|
})
|
|
31
31
|
|
|
32
|
-
it(
|
|
33
|
-
const step = useSessionStorage(
|
|
32
|
+
it('removes a sessionStorage entry', () => {
|
|
33
|
+
const step = useSessionStorage('step', 0)
|
|
34
34
|
step.set(3)
|
|
35
35
|
|
|
36
|
-
removeStorage(
|
|
36
|
+
removeStorage('step', { type: 'session' })
|
|
37
37
|
expect(step()).toBe(0)
|
|
38
|
-
expect(sessionStorage.getItem(
|
|
38
|
+
expect(sessionStorage.getItem('step')).toBeNull()
|
|
39
39
|
})
|
|
40
40
|
|
|
41
|
-
it(
|
|
42
|
-
localStorage.setItem(
|
|
43
|
-
removeStorage(
|
|
44
|
-
expect(localStorage.getItem(
|
|
41
|
+
it('removes raw localStorage even without a signal', () => {
|
|
42
|
+
localStorage.setItem('orphan', 'value')
|
|
43
|
+
removeStorage('orphan')
|
|
44
|
+
expect(localStorage.getItem('orphan')).toBeNull()
|
|
45
45
|
})
|
|
46
46
|
|
|
47
|
-
it(
|
|
48
|
-
sessionStorage.setItem(
|
|
49
|
-
removeStorage(
|
|
50
|
-
expect(sessionStorage.getItem(
|
|
47
|
+
it('removes raw sessionStorage even without a signal', () => {
|
|
48
|
+
sessionStorage.setItem('orphan', 'value')
|
|
49
|
+
removeStorage('orphan', { type: 'session' })
|
|
50
|
+
expect(sessionStorage.getItem('orphan')).toBeNull()
|
|
51
51
|
})
|
|
52
52
|
|
|
53
|
-
it(
|
|
54
|
-
removeStorage(
|
|
53
|
+
it('removes cookie without a signal', () => {
|
|
54
|
+
removeStorage('orphan-cookie', { type: 'cookie' })
|
|
55
55
|
// Should not throw even when cookie doesn't exist
|
|
56
56
|
})
|
|
57
57
|
})
|
|
58
58
|
|
|
59
|
-
describe(
|
|
59
|
+
describe('clearStorage', () => {
|
|
60
60
|
beforeEach(() => {
|
|
61
61
|
localStorage.clear()
|
|
62
62
|
sessionStorage.clear()
|
|
@@ -69,9 +69,9 @@ describe("clearStorage", () => {
|
|
|
69
69
|
_resetRegistry()
|
|
70
70
|
})
|
|
71
71
|
|
|
72
|
-
it(
|
|
73
|
-
const a = useStorage(
|
|
74
|
-
const b = useStorage(
|
|
72
|
+
it('clears all managed localStorage entries', () => {
|
|
73
|
+
const a = useStorage('a', 1)
|
|
74
|
+
const b = useStorage('b', 2)
|
|
75
75
|
a.set(10)
|
|
76
76
|
b.set(20)
|
|
77
77
|
|
|
@@ -80,25 +80,25 @@ describe("clearStorage", () => {
|
|
|
80
80
|
expect(b()).toBe(2)
|
|
81
81
|
})
|
|
82
82
|
|
|
83
|
-
it(
|
|
84
|
-
const a = useSessionStorage(
|
|
85
|
-
const b = useSessionStorage(
|
|
86
|
-
a.set(
|
|
87
|
-
b.set(
|
|
83
|
+
it('clears all managed sessionStorage entries', () => {
|
|
84
|
+
const a = useSessionStorage('a', 'x')
|
|
85
|
+
const b = useSessionStorage('b', 'y')
|
|
86
|
+
a.set('modified')
|
|
87
|
+
b.set('modified')
|
|
88
88
|
|
|
89
|
-
clearStorage(
|
|
90
|
-
expect(a()).toBe(
|
|
91
|
-
expect(b()).toBe(
|
|
89
|
+
clearStorage('session')
|
|
90
|
+
expect(a()).toBe('x')
|
|
91
|
+
expect(b()).toBe('y')
|
|
92
92
|
})
|
|
93
93
|
|
|
94
94
|
it('clears all backends with "all"', () => {
|
|
95
|
-
const local = useStorage(
|
|
96
|
-
const session = useSessionStorage(
|
|
97
|
-
local.set(
|
|
98
|
-
session.set(
|
|
99
|
-
|
|
100
|
-
clearStorage(
|
|
101
|
-
expect(local()).toBe(
|
|
102
|
-
expect(session()).toBe(
|
|
95
|
+
const local = useStorage('l', 'default')
|
|
96
|
+
const session = useSessionStorage('s', 'default')
|
|
97
|
+
local.set('changed')
|
|
98
|
+
session.set('changed')
|
|
99
|
+
|
|
100
|
+
clearStorage('all')
|
|
101
|
+
expect(local()).toBe('default')
|
|
102
|
+
expect(session()).toBe('default')
|
|
103
103
|
})
|
|
104
104
|
})
|