@pyreon/storage 0.11.5 → 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/src/local.ts CHANGED
@@ -1,7 +1,7 @@
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"
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("storage", (e) => {
14
+ window.addEventListener('storage', (e) => {
15
15
  if (!e.key) return
16
- const entry = getEntry("local", e.key)
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>("local", key)
46
+ const existing = getEntry<T>('local', key)
47
47
  if (existing) return existing.signal
48
48
 
49
- const storage = getWebStorage("local")
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, "local", options)
63
+ const storageSig = createStorageSignal(sig, key, defaultValue, 'local', options)
64
64
 
65
- setEntry("local", key, storageSig, defaultValue)
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: "local" | "session",
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, "label", {
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
@@ -1,4 +1,4 @@
1
- import type { StorageSignal } from "./types"
1
+ import type { StorageSignal } from './types'
2
2
 
3
3
  // ─── Signal Registry ─────────────────────────────────────────────────────────
4
4
 
package/src/session.ts CHANGED
@@ -1,8 +1,8 @@
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"
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>("session", key)
27
+ const existing = getEntry<T>('session', key)
28
28
  if (existing) return existing.signal
29
29
 
30
- const storage = getWebStorage("session")
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, "session", options)
42
+ const storageSig = createStorageSignal(sig, key, defaultValue, 'session', options)
43
43
 
44
- setEntry("session", key, storageSig, defaultValue)
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 "vitest"
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 "../index"
9
+ } from '../index'
10
10
 
11
- describe("removeStorage — comprehensive", () => {
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("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()
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("removes sessionStorage entry", () => {
33
- const step = useSessionStorage("step", 0)
32
+ it('removes sessionStorage entry', () => {
33
+ const step = useSessionStorage('step', 0)
34
34
  step.set(5)
35
- removeStorage("step", { type: "session" })
35
+ removeStorage('step', { type: 'session' })
36
36
  expect(step()).toBe(0)
37
- expect(sessionStorage.getItem("step")).toBeNull()
37
+ expect(sessionStorage.getItem('step')).toBeNull()
38
38
  })
39
39
 
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")
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("removes raw localStorage entry without a signal", () => {
48
- localStorage.setItem("orphan", "value")
49
- removeStorage("orphan")
50
- expect(localStorage.getItem("orphan")).toBeNull()
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("removes raw sessionStorage entry without a signal", () => {
54
- sessionStorage.setItem("orphan", "value")
55
- removeStorage("orphan", { type: "session" })
56
- expect(sessionStorage.getItem("orphan")).toBeNull()
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("removes cookie without a registered signal (no throw)", () => {
60
- expect(() => removeStorage("nonexistent", { type: "cookie" })).not.toThrow()
59
+ it('removes cookie without a registered signal (no throw)', () => {
60
+ expect(() => removeStorage('nonexistent', { type: 'cookie' })).not.toThrow()
61
61
  })
62
62
 
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()
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("after removeStorage, a new useStorage call creates fresh signal", () => {
70
- const a = useStorage("resettable", "first")
71
- a.set("modified")
72
- removeStorage("resettable")
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("resettable", "second")
75
- expect(b()).toBe("second")
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("clearStorage — comprehensive", () => {
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("clears all managed localStorage entries", () => {
94
- const a = useStorage("a", 1)
95
- const b = useStorage("b", 2)
96
- const c = useStorage("c", 3)
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("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")
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("session")
114
- expect(a()).toBe("x")
115
- expect(b()).toBe("y")
113
+ clearStorage('session')
114
+ expect(a()).toBe('x')
115
+ expect(b()).toBe('y')
116
116
  })
117
117
 
118
- it("clears managed cookie entries", () => {
119
- const locale = useCookie("locale", "en")
120
- locale.set("de")
118
+ it('clears managed cookie entries', () => {
119
+ const locale = useCookie('locale', 'en')
120
+ locale.set('de')
121
121
 
122
- clearStorage("cookie")
123
- expect(locale()).toBe("en")
122
+ clearStorage('cookie')
123
+ expect(locale()).toBe('en')
124
124
  })
125
125
 
126
126
  it('clears all backends with "all"', () => {
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")
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("all")
135
- expect(local()).toBe("default")
136
- expect(session()).toBe("default")
137
- expect(cookie()).toBe("default")
134
+ clearStorage('all')
135
+ expect(local()).toBe('default')
136
+ expect(session()).toBe('default')
137
+ expect(cookie()).toBe('default')
138
138
  })
139
139
 
140
- it("clearStorage with no managed entries does not throw", () => {
140
+ it('clearStorage with no managed entries does not throw', () => {
141
141
  expect(() => clearStorage()).not.toThrow()
142
- expect(() => clearStorage("session")).not.toThrow()
143
- expect(() => clearStorage("cookie")).not.toThrow()
144
- expect(() => clearStorage("indexeddb")).not.toThrow()
145
- expect(() => clearStorage("all")).not.toThrow()
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("clearStorage does not affect unmanaged entries", () => {
149
- localStorage.setItem("unmanaged", "value")
150
- const managed = useStorage("managed", "default")
151
- managed.set("changed")
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("default")
154
+ expect(managed()).toBe('default')
155
155
  // Unmanaged key should still exist (clearStorage only affects registered signals)
156
- expect(localStorage.getItem("unmanaged")).toBe("value")
156
+ expect(localStorage.getItem('unmanaged')).toBe('value')
157
157
  })
158
158
  })
@@ -1,13 +1,13 @@
1
- import { afterEach, beforeEach, describe, expect, it } from "vitest"
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 "../index"
8
+ } from '../index'
9
9
 
10
- describe("removeStorage", () => {
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("removes a localStorage entry via signal", () => {
24
- const theme = useStorage("theme", "light")
25
- theme.set("dark")
23
+ it('removes a localStorage entry via signal', () => {
24
+ const theme = useStorage('theme', 'light')
25
+ theme.set('dark')
26
26
 
27
- removeStorage("theme")
28
- expect(theme()).toBe("light")
29
- expect(localStorage.getItem("theme")).toBeNull()
27
+ removeStorage('theme')
28
+ expect(theme()).toBe('light')
29
+ expect(localStorage.getItem('theme')).toBeNull()
30
30
  })
31
31
 
32
- it("removes a sessionStorage entry", () => {
33
- const step = useSessionStorage("step", 0)
32
+ it('removes a sessionStorage entry', () => {
33
+ const step = useSessionStorage('step', 0)
34
34
  step.set(3)
35
35
 
36
- removeStorage("step", { type: "session" })
36
+ removeStorage('step', { type: 'session' })
37
37
  expect(step()).toBe(0)
38
- expect(sessionStorage.getItem("step")).toBeNull()
38
+ expect(sessionStorage.getItem('step')).toBeNull()
39
39
  })
40
40
 
41
- it("removes raw localStorage even without a signal", () => {
42
- localStorage.setItem("orphan", "value")
43
- removeStorage("orphan")
44
- expect(localStorage.getItem("orphan")).toBeNull()
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("removes raw sessionStorage even without a signal", () => {
48
- sessionStorage.setItem("orphan", "value")
49
- removeStorage("orphan", { type: "session" })
50
- expect(sessionStorage.getItem("orphan")).toBeNull()
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("removes cookie without a signal", () => {
54
- removeStorage("orphan-cookie", { type: "cookie" })
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("clearStorage", () => {
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("clears all managed localStorage entries", () => {
73
- const a = useStorage("a", 1)
74
- const b = useStorage("b", 2)
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("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")
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("session")
90
- expect(a()).toBe("x")
91
- expect(b()).toBe("y")
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("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")
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
  })