@signaldb/localstorage 1.0.1 → 2.0.0-beta.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.
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  # @signaldb/localstorage
2
2
 
3
- This is the `localStorage` persistence adapter for [SignalDB](https://github.com/maxnowack/signaldb). SignalDB is a local-first JavaScript database with real-time sync, enabling optimistic UI with signal-based reactivity across multiple frameworks.
3
+ This is the `localStorage` storage adapter for [SignalDB](https://github.com/maxnowack/signaldb). SignalDB is a local-first JavaScript database with real-time sync, enabling optimistic UI with signal-based reactivity across multiple frameworks.
4
4
 
5
5
  See https://signaldb.js.org/reference/localstorage/ for more information.
package/dist/index.d.ts CHANGED
@@ -1,30 +1,16 @@
1
1
  /**
2
- * Creates a persistence adapter for managing a SignalDB collection using browser `localStorage`.
3
- * This adapter reads and writes data to `localStorage`, with customizable serialization and deserialization.
4
- * @template T - The type of the items in the collection.
5
- * @template I - The type of the unique identifier for the items.
6
- * @param name - A unique name for the collection, used as the key in `localStorage`.
7
- * @param options - Optional configuration for serialization and deserialization.
2
+ * Creates a storage adapter for managing a SignalDB collection using localStorage.
3
+ * @param name - A unique name for the collection, used as part of the localStorage key.
4
+ * @param options - Optional configuration for the adapter.
5
+ * @param options.databaseName - An optional name for the database to namespace the storage (default: 'signaldb').
8
6
  * @param options.serialize - A function to serialize items to a string (default: `JSON.stringify`).
9
7
  * @param options.deserialize - A function to deserialize a string into items (default: `JSON.parse`).
10
- * @returns A SignalDB persistence adapter for managing data in `localStorage`.
11
- * @example
12
- * import createLocalStorageAdapter from './createLocalStorageAdapter';
13
- *
14
- * const adapter = createLocalStorageAdapter('myCollection', {
15
- * serialize: (items) => JSON.stringify(items, null, 2), // Pretty-print JSON
16
- * deserialize: (itemsString) => JSON.parse(itemsString), // Default JSON parse
17
- * });
18
- *
19
- * const collection = new Collection({
20
- * persistence: adapter,
21
- * });
22
- *
23
- * // Perform operations on the collection, and changes will be reflected in local storage.
8
+ * @returns A SignalDB storage adapter for managing data in localStorage.
24
9
  */
25
10
  export default function createLocalStorageAdapter<T extends {
26
11
  id: I;
27
12
  } & Record<string, any>, I>(name: string, options?: {
28
- serialize?: (items: T[]) => string;
29
- deserialize?: (itemsString: string) => T[];
30
- }): import("@signaldb/core").PersistenceAdapter<T, I>;
13
+ databaseName?: string;
14
+ serialize?: (items: any) => string;
15
+ deserialize?: (itemsString: string) => any;
16
+ }): import("@signaldb/core").StorageAdapter<T, I>;
package/dist/index.mjs CHANGED
@@ -1,42 +1,166 @@
1
- import { createPersistenceAdapter as p } from "@signaldb/core";
2
- function I(c, o) {
3
- const { serialize: a = JSON.stringify, deserialize: d = JSON.parse } = o || {}, s = `signaldb-collection-${c}`;
4
- function i() {
5
- return d(localStorage.getItem(s) || "[]");
6
- }
7
- return p({
8
- async load() {
9
- return { items: i() };
10
- },
11
- async save(l, { added: f, modified: u, removed: g }) {
12
- const e = [...i()];
13
- f.forEach((t) => {
14
- const n = e.findIndex(({ id: r }) => r === t.id);
15
- /* istanbul ignore if -- @preserve */
16
- if (n !== -1) {
17
- e[n] = t;
18
- return;
19
- }
20
- e.push(t);
21
- }), u.forEach((t) => {
22
- const n = e.findIndex(({ id: r }) => r === t.id);
23
- /* istanbul ignore if -- @preserve */
24
- if (n === -1) {
25
- e.push(t);
26
- return;
1
+ import { createStorageAdapter as O, get as f, serializeValue as x } from "@signaldb/core";
2
+ function C(v, h) {
3
+ const p = h?.serialize || ((e) => JSON.stringify(e)), S = h?.deserialize || ((e) => JSON.parse(e)), E = h?.databaseName || "signaldb", M = `${v}`, i = `${E}-${M}`, l = (e) => `${i}-index-${e}`, c = [], d = () => {
4
+ const e = localStorage.getItem(i);
5
+ if (!e)
6
+ return [];
7
+ try {
8
+ const n = S(e);
9
+ return Array.isArray(n) ? n : [];
10
+ } catch {
11
+ return [];
12
+ }
13
+ }, u = (e) => {
14
+ localStorage.setItem(i, p(e));
15
+ }, $ = async (e) => {
16
+ const n = localStorage.getItem(l(e));
17
+ if (!n)
18
+ throw new Error(`Index on field "${e}" does not exist`);
19
+ let t;
20
+ try {
21
+ t = S(n);
22
+ } catch {
23
+ throw new Error(`Corrupted index on field "${e}"`);
24
+ }
25
+ const o = /* @__PURE__ */ new Map();
26
+ return Object.entries(t).forEach(([r, a]) => {
27
+ o.has(r) || o.set(r, /* @__PURE__ */ new Set()), a.forEach((s) => o.get(r)?.add(s));
28
+ }), o;
29
+ }, z = async (e, n = d()) => {
30
+ const t = /* @__PURE__ */ new Map();
31
+ n.forEach((r) => {
32
+ const a = f(r, e);
33
+ a != null && (t.has(a) || t.set(a, /* @__PURE__ */ new Set()), t.get(a)?.add(r.id));
34
+ });
35
+ const o = {};
36
+ t.forEach((r, a) => {
37
+ const s = String(x(a));
38
+ o[s] = [...r];
39
+ }), localStorage.setItem(l(e), p(o));
40
+ }, g = (e) => String(x(e)), b = (e) => {
41
+ const n = localStorage.getItem(l(e));
42
+ if (!n)
43
+ return;
44
+ let t;
45
+ try {
46
+ t = S(n);
47
+ } catch {
48
+ throw new Error(`Corrupted index on field "${e}"`);
49
+ }
50
+ const o = /* @__PURE__ */ new Map();
51
+ return Object.entries(t).forEach(([r, a]) => {
52
+ o.set(r, new Set(a));
53
+ }), o;
54
+ }, A = (e, n) => {
55
+ const t = {};
56
+ n.forEach((o, r) => {
57
+ t[r] = [...o];
58
+ }), localStorage.setItem(l(e), p(t));
59
+ }, m = (e, n, t, o, r) => {
60
+ e.has(n) || e.set(n, { adds: /* @__PURE__ */ new Map(), removes: /* @__PURE__ */ new Map() });
61
+ const a = e.get(n);
62
+ if (!a)
63
+ return;
64
+ const s = t === "add" ? a.adds : a.removes;
65
+ s.has(o) || s.set(o, /* @__PURE__ */ new Set()), s.get(o)?.add(r);
66
+ }, y = (e) => {
67
+ e.forEach((n, t) => {
68
+ const o = b(t);
69
+ o && (n.removes.forEach((r, a) => {
70
+ const s = o.get(a);
71
+ s && (r.forEach((w) => s.delete(w)), s.size === 0 && o.delete(a));
72
+ }), n.adds.forEach((r, a) => {
73
+ let s = o.get(a);
74
+ s || (s = /* @__PURE__ */ new Set(), o.set(a, s)), r.forEach((w) => s.add(w));
75
+ }), A(t, o));
76
+ });
77
+ }, K = (e, n, t, o, r) => {
78
+ const a = t == null ? void 0 : g(t), s = o == null ? void 0 : g(o);
79
+ a !== s && (a != null && m(e, n, "remove", a, r), s != null && m(e, n, "add", s, r));
80
+ }, D = (e, n, t) => {
81
+ if (n)
82
+ for (const o of c)
83
+ K(e, o, f(n, o), f(t, o), t.id);
84
+ else
85
+ for (const o of c) {
86
+ const r = f(t, o);
87
+ r != null && m(e, o, "add", g(r), t.id);
88
+ }
89
+ }, N = (e, n) => {
90
+ for (const t of c) {
91
+ const o = f(n, t);
92
+ o != null && m(e, t, "remove", g(o), n.id);
93
+ }
94
+ }, I = (e) => {
95
+ const n = d(), t = new Map(n.map((r) => [r.id, r])), o = /* @__PURE__ */ new Map();
96
+ for (const r of e) {
97
+ const a = t.get(r.id);
98
+ D(o, a, r), t.set(r.id, r);
99
+ }
100
+ u([...t.values()]), y(o);
101
+ };
102
+ return O({
103
+ // lifecycle methods
104
+ setup: async () => {
105
+ localStorage.getItem(i) == null && u([]);
106
+ const e = `${i}-index-`;
107
+ for (let n = 0; n < localStorage.length; n++) {
108
+ const t = localStorage.key(n);
109
+ if (t && t.startsWith(e)) {
110
+ const o = t.slice(e.length);
111
+ c.includes(o) || c.push(o);
27
112
  }
28
- e[n] = t;
29
- }), g.forEach((t) => {
30
- const n = e.findIndex(({ id: r }) => r === t.id);
31
- /* istanbul ignore if -- @preserve */
32
- n !== -1 && e.splice(n, 1);
33
- }), localStorage.setItem(s, a(e));
34
- },
35
- async register() {
113
+ }
114
+ },
115
+ teardown: async () => {
116
+ },
117
+ // data retrieval methods
118
+ readAll: async () => d(),
119
+ readIds: async (e) => {
120
+ const n = d(), t = new Set(e);
121
+ return n.filter((o) => t.has(o.id));
122
+ },
123
+ // index methods
124
+ createIndex: async (e) => {
125
+ c.includes(e) || c.push(e), await z(e);
126
+ },
127
+ dropIndex: async (e) => {
128
+ if (c.includes(e)) {
129
+ const t = c.indexOf(e);
130
+ c.splice(t, 1);
131
+ }
132
+ const n = l(e);
133
+ if (localStorage.getItem(n) == null)
134
+ throw new Error(`Index on field "${e}" does not exist`);
135
+ localStorage.removeItem(n);
136
+ },
137
+ readIndex: $,
138
+ // data manipulation methods
139
+ insert: async (e) => {
140
+ I(e);
141
+ },
142
+ replace: async (e) => {
143
+ I(e);
144
+ },
145
+ remove: async (e) => {
146
+ const n = d(), t = new Map(n.map((a) => [a.id, a])), o = /* @__PURE__ */ new Map();
147
+ new Set(e.map((a) => a.id)).forEach((a) => {
148
+ const s = t.get(a);
149
+ s && (N(o, s), t.delete(a));
150
+ }), u([...t.values()]), y(o);
151
+ },
152
+ removeAll: async () => {
153
+ u([]);
154
+ const e = `${i}-index-`, n = [];
155
+ for (let t = 0; t < localStorage.length; t++) {
156
+ const o = localStorage.key(t);
157
+ o && o.startsWith(e) && n.push(o);
158
+ }
159
+ n.forEach((t) => localStorage.removeItem(t)), c.splice(0);
36
160
  }
37
161
  });
38
162
  }
39
163
  export {
40
- I as default
164
+ C as default
41
165
  };
42
166
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import { createPersistenceAdapter } from '@signaldb/core';\n/**\n * Creates a persistence adapter for managing a SignalDB collection using browser `localStorage`.\n * This adapter reads and writes data to `localStorage`, with customizable serialization and deserialization.\n * @template T - The type of the items in the collection.\n * @template I - The type of the unique identifier for the items.\n * @param name - A unique name for the collection, used as the key in `localStorage`.\n * @param options - Optional configuration for serialization and deserialization.\n * @param options.serialize - A function to serialize items to a string (default: `JSON.stringify`).\n * @param options.deserialize - A function to deserialize a string into items (default: `JSON.parse`).\n * @returns A SignalDB persistence adapter for managing data in `localStorage`.\n * @example\n * import createLocalStorageAdapter from './createLocalStorageAdapter';\n *\n * const adapter = createLocalStorageAdapter('myCollection', {\n * serialize: (items) => JSON.stringify(items, null, 2), // Pretty-print JSON\n * deserialize: (itemsString) => JSON.parse(itemsString), // Default JSON parse\n * });\n *\n * const collection = new Collection({\n * persistence: adapter,\n * });\n *\n * // Perform operations on the collection, and changes will be reflected in local storage.\n */\nexport default function createLocalStorageAdapter(name, options) {\n const { serialize = JSON.stringify, deserialize = JSON.parse } = options || {};\n const collectionId = `signaldb-collection-${name}`;\n /**\n * Retrieves items from localStorage and deserializes them.\n * @returns The deserialized items from localStorage.\n */\n function getItems() {\n return deserialize(localStorage.getItem(collectionId) || '[]');\n }\n return createPersistenceAdapter({\n async load() {\n const items = getItems();\n return { items };\n },\n async save(_items, { added, modified, removed }) {\n const items = [...getItems()];\n added.forEach((item) => {\n const index = items.findIndex(({ id }) => id === item.id);\n /* istanbul ignore if -- @preserve */\n if (index !== -1) {\n items[index] = item;\n return;\n }\n items.push(item);\n });\n modified.forEach((item) => {\n const index = items.findIndex(({ id }) => id === item.id);\n /* istanbul ignore if -- @preserve */\n if (index === -1) {\n items.push(item);\n return;\n }\n items[index] = item;\n });\n removed.forEach((item) => {\n const index = items.findIndex(({ id }) => id === item.id);\n /* istanbul ignore if -- @preserve */\n if (index === -1)\n return;\n items.splice(index, 1);\n });\n localStorage.setItem(collectionId, serialize(items));\n return;\n },\n async register() {\n return;\n },\n });\n}\n"],"names":["createLocalStorageAdapter","name","options","serialize","deserialize","collectionId","getItems","createPersistenceAdapter","_items","added","modified","removed","items","item","index","id"],"mappings":";AAyBwB,SAAAA,EAA0BC,GAAMC,GAAS;AACvD,QAAA,EAAE,WAAAC,IAAY,KAAK,WAAW,aAAAC,IAAc,KAAK,UAAUF,KAAW,CAAC,GACvEG,IAAe,uBAAuBJ,CAAI;AAKhD,WAASK,IAAW;AAChB,WAAOF,EAAY,aAAa,QAAQC,CAAY,KAAK,IAAI;AAAA,EAAA;AAEjE,SAAOE,EAAyB;AAAA,IAC5B,MAAM,OAAO;AAET,aAAO,EAAE,OADKD,EAAS,EACR;AAAA,IACnB;AAAA,IACA,MAAM,KAAKE,GAAQ,EAAE,OAAAC,GAAO,UAAAC,GAAU,SAAAC,KAAW;AAC7C,YAAMC,IAAQ,CAAC,GAAGN,GAAU;AACtB,MAAAG,EAAA,QAAQ,CAACI,MAAS;AACd,cAAAC,IAAQF,EAAM,UAAU,CAAC,EAAE,IAAAG,QAASA,MAAOF,EAAK,EAAE;AAAA,QAAA;AAExD,YAAIC,MAAU,IAAI;AACd,UAAAF,EAAME,CAAK,IAAID;AACf;AAAA,QAAA;AAEJ,QAAAD,EAAM,KAAKC,CAAI;AAAA,MAAA,CAClB,GACQH,EAAA,QAAQ,CAACG,MAAS;AACjB,cAAAC,IAAQF,EAAM,UAAU,CAAC,EAAE,IAAAG,QAASA,MAAOF,EAAK,EAAE;AAAA,QAAA;AAExD,YAAIC,MAAU,IAAI;AACd,UAAAF,EAAM,KAAKC,CAAI;AACf;AAAA,QAAA;AAEJ,QAAAD,EAAME,CAAK,IAAID;AAAA,MAAA,CAClB,GACOF,EAAA,QAAQ,CAACE,MAAS;AAChB,cAAAC,IAAQF,EAAM,UAAU,CAAC,EAAE,IAAAG,QAASA,MAAOF,EAAK,EAAE;AAAA,QAAA;AAExD,QAAIC,MAAU,MAERF,EAAA,OAAOE,GAAO,CAAC;AAAA,MAAA,CACxB,GACD,aAAa,QAAQT,GAAcF,EAAUS,CAAK,CAAC;AAAA,IAEvD;AAAA,IACA,MAAM,WAAW;AAAA,IACb;AAAA,EACJ,CACH;AACL;"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import { createStorageAdapter, get, serializeValue } from '@signaldb/core';\n/**\n * Creates a storage adapter for managing a SignalDB collection using localStorage.\n * @param name - A unique name for the collection, used as part of the localStorage key.\n * @param options - Optional configuration for the adapter.\n * @param options.databaseName - An optional name for the database to namespace the storage (default: 'signaldb').\n * @param options.serialize - A function to serialize items to a string (default: `JSON.stringify`).\n * @param options.deserialize - A function to deserialize a string into items (default: `JSON.parse`).\n * @returns A SignalDB storage adapter for managing data in localStorage.\n */\nexport default function createLocalStorageAdapter(name, options) {\n const serialize = options?.serialize || (data => JSON.stringify(data));\n const deserialize = options?.deserialize || (input => JSON.parse(input));\n const databaseName = options?.databaseName || 'signaldb';\n const storeName = `${name}`;\n // We use a single key that namespaces by database and store names\n const storageKey = `${databaseName}-${storeName}`;\n const indexKeyFor = (field) => `${storageKey}-index-${field}`;\n const indices = [];\n const readFromStorage = () => {\n const serialized = localStorage.getItem(storageKey);\n if (!serialized)\n return [];\n try {\n const parsed = deserialize(serialized);\n return Array.isArray(parsed) ? parsed : [];\n }\n catch {\n // If parsing fails, treat as empty to avoid corrupting runtime\n return [];\n }\n };\n const writeToStorage = (items) => {\n localStorage.setItem(storageKey, serialize(items));\n };\n const readIndex = async (field) => {\n const serialized = localStorage.getItem(indexKeyFor(field));\n if (!serialized)\n throw new Error(`Index on field \"${field}\" does not exist`);\n let data;\n try {\n data = deserialize(serialized);\n }\n catch {\n throw new Error(`Corrupted index on field \"${field}\"`);\n }\n const index = new Map();\n Object.entries(data).forEach(([key, ids]) => {\n if (!index.has(key))\n index.set(key, new Set());\n ids.forEach(id => index.get(key)?.add(id));\n });\n return index;\n };\n const ensureIndex = async (field, items = readFromStorage()) => {\n const index = new Map();\n items.forEach((item) => {\n const fieldValue = get(item, field);\n if (fieldValue == null)\n return;\n if (!index.has(fieldValue))\n index.set(fieldValue, new Set());\n index.get(fieldValue)?.add(item.id);\n });\n const safeIndex = {};\n index.forEach((ids, key) => {\n const safeKey = String(serializeValue(key));\n safeIndex[safeKey] = [...ids];\n });\n localStorage.setItem(indexKeyFor(field), serialize(safeIndex));\n };\n // --- Delta indexing helpers ---\n const safeKeyFor = (value) => String(serializeValue(value));\n const loadIndexMap = (field) => {\n const serialized = localStorage.getItem(indexKeyFor(field));\n if (!serialized)\n return undefined;\n let data;\n try {\n data = deserialize(serialized);\n }\n catch {\n throw new Error(`Corrupted index on field \"${field}\"`);\n }\n const index = new Map();\n Object.entries(data).forEach(([key, ids]) => {\n index.set(key, new Set(ids));\n });\n return index;\n };\n const saveIndexMap = (field, index) => {\n const safeIndex = {};\n index.forEach((ids, key) => {\n safeIndex[key] = [...ids];\n });\n localStorage.setItem(indexKeyFor(field), serialize(safeIndex));\n };\n const addToDelta = (deltas, field, kind, key, id) => {\n if (!deltas.has(field)) {\n deltas.set(field, { adds: new Map(), removes: new Map() });\n }\n const delta = deltas.get(field);\n if (!delta)\n return;\n const target = kind === 'add' ? delta.adds : delta.removes;\n if (!target.has(key))\n target.set(key, new Set());\n target.get(key)?.add(id);\n };\n const applyIndexDeltas = (deltas) => {\n // Update only the indices that have changes\n deltas.forEach((delta, field) => {\n const index = loadIndexMap(field);\n // If the index doesn't exist, skip (we only maintain indices that were created)\n if (!index)\n return;\n // Apply removals\n delta.removes.forEach((ids, key) => {\n const set = index.get(key);\n if (!set)\n return;\n ids.forEach(id => set.delete(id));\n if (set.size === 0)\n index.delete(key);\n });\n // Apply additions\n delta.adds.forEach((ids, key) => {\n let set = index.get(key);\n if (!set) {\n set = new Set();\n index.set(key, set);\n }\n ids.forEach(id => set.add(id));\n });\n saveIndexMap(field, index);\n });\n };\n const addDeltaForChange = (deltas, field, oldValue, newValue, id) => {\n const oldKey = oldValue == null ? undefined : safeKeyFor(oldValue);\n const newKey = newValue == null ? undefined : safeKeyFor(newValue);\n if (oldKey === newKey)\n return;\n if (oldKey != null)\n addToDelta(deltas, field, 'remove', oldKey, id);\n if (newKey != null)\n addToDelta(deltas, field, 'add', newKey, id);\n };\n const accumulateUpsertDelta = (deltas, existing, next) => {\n if (existing) {\n for (const field of indices) {\n addDeltaForChange(deltas, field, get(existing, field), get(next, field), next.id);\n }\n }\n else {\n for (const field of indices) {\n const value = get(next, field);\n if (value == null)\n continue;\n addToDelta(deltas, field, 'add', safeKeyFor(value), next.id);\n }\n }\n };\n const accumulateRemoveDelta = (deltas, existing) => {\n for (const field of indices) {\n const value = get(existing, field);\n if (value == null)\n continue;\n addToDelta(deltas, field, 'remove', safeKeyFor(value), existing.id);\n }\n };\n const upsertItems = (itemsToUpsert) => {\n const items = readFromStorage();\n const byId = new Map(items.map(item => [item.id, item]));\n const deltas = new Map();\n for (const item of itemsToUpsert) {\n const existing = byId.get(item.id);\n accumulateUpsertDelta(deltas, existing, item);\n byId.set(item.id, item);\n }\n writeToStorage([...byId.values()]);\n applyIndexDeltas(deltas);\n };\n return createStorageAdapter({\n // lifecycle methods\n setup: async () => {\n // For localStorage, there is no database to open; we just ensure the key exists\n if (localStorage.getItem(storageKey) == null) {\n writeToStorage([]);\n }\n // Hydrate known index fields from existing keys so that we can keep them updated across sessions\n const prefix = `${storageKey}-index-`;\n for (let i = 0; i < localStorage.length; i++) {\n const k = localStorage.key(i);\n if (k && k.startsWith(prefix)) {\n const field = k.slice(prefix.length);\n if (!indices.includes(field))\n indices.push(field);\n }\n }\n },\n teardown: async () => {\n // no-op\n },\n // data retrieval methods\n readAll: async () => {\n return readFromStorage();\n },\n readIds: async (ids) => {\n const items = readFromStorage();\n const idSet = new Set(ids);\n return items.filter(item => idSet.has(item.id));\n },\n // index methods\n createIndex: async (field) => {\n if (!indices.includes(field))\n indices.push(field);\n await ensureIndex(field);\n },\n dropIndex: async (field) => {\n if (indices.includes(field)) {\n const i = indices.indexOf(field);\n indices.splice(i, 1);\n }\n const key = indexKeyFor(field);\n if (localStorage.getItem(key) == null) {\n throw new Error(`Index on field \"${field}\" does not exist`);\n }\n localStorage.removeItem(key);\n },\n readIndex,\n // data manipulation methods\n insert: async (newItems) => {\n upsertItems(newItems);\n },\n replace: async (itemsToReplace) => {\n upsertItems(itemsToReplace);\n },\n remove: async (itemsToRemove) => {\n const items = readFromStorage();\n const byId = new Map(items.map(item => [item.id, item]));\n const deltas = new Map();\n const removeSet = new Set(itemsToRemove.map(item => item.id));\n removeSet.forEach((id) => {\n const existing = byId.get(id);\n if (!existing)\n return;\n accumulateRemoveDelta(deltas, existing);\n byId.delete(id);\n });\n writeToStorage([...byId.values()]);\n applyIndexDeltas(deltas);\n },\n removeAll: async () => {\n writeToStorage([]);\n // remove all index keys for this store\n const prefix = `${storageKey}-index-`;\n const keysToRemove = [];\n for (let i = 0; i < localStorage.length; i++) {\n const k = localStorage.key(i);\n if (k && k.startsWith(prefix))\n keysToRemove.push(k);\n }\n keysToRemove.forEach(k => localStorage.removeItem(k));\n indices.splice(0);\n },\n });\n}\n"],"names":["createLocalStorageAdapter","name","options","serialize","data","deserialize","input","databaseName","storeName","storageKey","indexKeyFor","field","indices","readFromStorage","serialized","parsed","writeToStorage","items","readIndex","index","key","ids","id","ensureIndex","item","fieldValue","get","safeIndex","safeKey","serializeValue","safeKeyFor","value","loadIndexMap","saveIndexMap","addToDelta","deltas","kind","delta","target","applyIndexDeltas","set","addDeltaForChange","oldValue","newValue","oldKey","newKey","accumulateUpsertDelta","existing","next","accumulateRemoveDelta","upsertItems","itemsToUpsert","byId","createStorageAdapter","prefix","i","k","idSet","newItems","itemsToReplace","itemsToRemove","keysToRemove"],"mappings":"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"}
package/dist/index.umd.js CHANGED
@@ -1,2 +1,2 @@
1
- (function(i,r){typeof exports=="object"&&typeof module<"u"?module.exports=r(require("@signaldb/core")):typeof define=="function"&&define.amd?define(["@signaldb/core"],r):(i=typeof globalThis<"u"?globalThis:i||self,i.SignalDB=r(i.core))})(this,function(i){"use strict";function r(d,a){const{serialize:f=JSON.stringify,deserialize:u=JSON.parse}=a||{},o=`signaldb-collection-${d}`;function c(){return u(localStorage.getItem(o)||"[]")}return i.createPersistenceAdapter({async load(){return{items:c()}},async save(l,{added:p,modified:g,removed:h}){const e=[...c()];p.forEach(n=>{const t=e.findIndex(({id:s})=>s===n.id);/* istanbul ignore if -- @preserve */if(t!==-1){e[t]=n;return}e.push(n)}),g.forEach(n=>{const t=e.findIndex(({id:s})=>s===n.id);/* istanbul ignore if -- @preserve */if(t===-1){e.push(n);return}e[t]=n}),h.forEach(n=>{const t=e.findIndex(({id:s})=>s===n.id);/* istanbul ignore if -- @preserve */t!==-1&&e.splice(t,1)}),localStorage.setItem(o,f(e))},async register(){}})}return r});
1
+ (function(c,l){typeof exports=="object"&&typeof module<"u"?module.exports=l(require("@signaldb/core")):typeof define=="function"&&define.amd?define(["@signaldb/core"],l):(c=typeof globalThis<"u"?globalThis:c||self,c.SignalDB=l(c.core))})(this,(function(c){"use strict";function l(v,m){const S=m?.serialize||(e=>JSON.stringify(e)),w=m?.deserialize||(e=>JSON.parse(e)),E=m?.databaseName||"signaldb",M=`${v}`,d=`${E}-${M}`,f=e=>`${d}-index-${e}`,i=[],u=()=>{const e=localStorage.getItem(d);if(!e)return[];try{const o=w(e);return Array.isArray(o)?o:[]}catch{return[]}},g=e=>{localStorage.setItem(d,S(e))},$=async e=>{const o=localStorage.getItem(f(e));if(!o)throw new Error(`Index on field "${e}" does not exist`);let t;try{t=w(o)}catch{throw new Error(`Corrupted index on field "${e}"`)}const n=new Map;return Object.entries(t).forEach(([a,s])=>{n.has(a)||n.set(a,new Set),s.forEach(r=>n.get(a)?.add(r))}),n},z=async(e,o=u())=>{const t=new Map;o.forEach(a=>{const s=c.get(a,e);s!=null&&(t.has(s)||t.set(s,new Set),t.get(s)?.add(a.id))});const n={};t.forEach((a,s)=>{const r=String(c.serializeValue(s));n[r]=[...a]}),localStorage.setItem(f(e),S(n))},p=e=>String(c.serializeValue(e)),b=e=>{const o=localStorage.getItem(f(e));if(!o)return;let t;try{t=w(o)}catch{throw new Error(`Corrupted index on field "${e}"`)}const n=new Map;return Object.entries(t).forEach(([a,s])=>{n.set(a,new Set(s))}),n},A=(e,o)=>{const t={};o.forEach((n,a)=>{t[a]=[...n]}),localStorage.setItem(f(e),S(t))},h=(e,o,t,n,a)=>{e.has(o)||e.set(o,{adds:new Map,removes:new Map});const s=e.get(o);if(!s)return;const r=t==="add"?s.adds:s.removes;r.has(n)||r.set(n,new Set),r.get(n)?.add(a)},x=e=>{e.forEach((o,t)=>{const n=b(t);n&&(o.removes.forEach((a,s)=>{const r=n.get(s);r&&(a.forEach(y=>r.delete(y)),r.size===0&&n.delete(s))}),o.adds.forEach((a,s)=>{let r=n.get(s);r||(r=new Set,n.set(s,r)),a.forEach(y=>r.add(y))}),A(t,n))})},D=(e,o,t,n,a)=>{const s=t==null?void 0:p(t),r=n==null?void 0:p(n);s!==r&&(s!=null&&h(e,o,"remove",s,a),r!=null&&h(e,o,"add",r,a))},K=(e,o,t)=>{if(o)for(const n of i)D(e,n,c.get(o,n),c.get(t,n),t.id);else for(const n of i){const a=c.get(t,n);a!=null&&h(e,n,"add",p(a),t.id)}},N=(e,o)=>{for(const t of i){const n=c.get(o,t);n!=null&&h(e,t,"remove",p(n),o.id)}},I=e=>{const o=u(),t=new Map(o.map(a=>[a.id,a])),n=new Map;for(const a of e){const s=t.get(a.id);K(n,s,a),t.set(a.id,a)}g([...t.values()]),x(n)};return c.createStorageAdapter({setup:async()=>{localStorage.getItem(d)==null&&g([]);const e=`${d}-index-`;for(let o=0;o<localStorage.length;o++){const t=localStorage.key(o);if(t&&t.startsWith(e)){const n=t.slice(e.length);i.includes(n)||i.push(n)}}},teardown:async()=>{},readAll:async()=>u(),readIds:async e=>{const o=u(),t=new Set(e);return o.filter(n=>t.has(n.id))},createIndex:async e=>{i.includes(e)||i.push(e),await z(e)},dropIndex:async e=>{if(i.includes(e)){const t=i.indexOf(e);i.splice(t,1)}const o=f(e);if(localStorage.getItem(o)==null)throw new Error(`Index on field "${e}" does not exist`);localStorage.removeItem(o)},readIndex:$,insert:async e=>{I(e)},replace:async e=>{I(e)},remove:async e=>{const o=u(),t=new Map(o.map(s=>[s.id,s])),n=new Map;new Set(e.map(s=>s.id)).forEach(s=>{const r=t.get(s);r&&(N(n,r),t.delete(s))}),g([...t.values()]),x(n)},removeAll:async()=>{g([]);const e=`${d}-index-`,o=[];for(let t=0;t<localStorage.length;t++){const n=localStorage.key(t);n&&n.startsWith(e)&&o.push(n)}o.forEach(t=>localStorage.removeItem(t)),i.splice(0)}})}return l}));
2
2
  //# sourceMappingURL=index.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/index.ts"],"sourcesContent":["import { createPersistenceAdapter } from '@signaldb/core';\n/**\n * Creates a persistence adapter for managing a SignalDB collection using browser `localStorage`.\n * This adapter reads and writes data to `localStorage`, with customizable serialization and deserialization.\n * @template T - The type of the items in the collection.\n * @template I - The type of the unique identifier for the items.\n * @param name - A unique name for the collection, used as the key in `localStorage`.\n * @param options - Optional configuration for serialization and deserialization.\n * @param options.serialize - A function to serialize items to a string (default: `JSON.stringify`).\n * @param options.deserialize - A function to deserialize a string into items (default: `JSON.parse`).\n * @returns A SignalDB persistence adapter for managing data in `localStorage`.\n * @example\n * import createLocalStorageAdapter from './createLocalStorageAdapter';\n *\n * const adapter = createLocalStorageAdapter('myCollection', {\n * serialize: (items) => JSON.stringify(items, null, 2), // Pretty-print JSON\n * deserialize: (itemsString) => JSON.parse(itemsString), // Default JSON parse\n * });\n *\n * const collection = new Collection({\n * persistence: adapter,\n * });\n *\n * // Perform operations on the collection, and changes will be reflected in local storage.\n */\nexport default function createLocalStorageAdapter(name, options) {\n const { serialize = JSON.stringify, deserialize = JSON.parse } = options || {};\n const collectionId = `signaldb-collection-${name}`;\n /**\n * Retrieves items from localStorage and deserializes them.\n * @returns The deserialized items from localStorage.\n */\n function getItems() {\n return deserialize(localStorage.getItem(collectionId) || '[]');\n }\n return createPersistenceAdapter({\n async load() {\n const items = getItems();\n return { items };\n },\n async save(_items, { added, modified, removed }) {\n const items = [...getItems()];\n added.forEach((item) => {\n const index = items.findIndex(({ id }) => id === item.id);\n /* istanbul ignore if -- @preserve */\n if (index !== -1) {\n items[index] = item;\n return;\n }\n items.push(item);\n });\n modified.forEach((item) => {\n const index = items.findIndex(({ id }) => id === item.id);\n /* istanbul ignore if -- @preserve */\n if (index === -1) {\n items.push(item);\n return;\n }\n items[index] = item;\n });\n removed.forEach((item) => {\n const index = items.findIndex(({ id }) => id === item.id);\n /* istanbul ignore if -- @preserve */\n if (index === -1)\n return;\n items.splice(index, 1);\n });\n localStorage.setItem(collectionId, serialize(items));\n return;\n },\n async register() {\n return;\n },\n });\n}\n"],"names":["createLocalStorageAdapter","name","options","serialize","deserialize","collectionId","getItems","createPersistenceAdapter","_items","added","modified","removed","items","item","index","id"],"mappings":"4QAyBwB,SAAAA,EAA0BC,EAAMC,EAAS,CACvD,KAAA,CAAE,UAAAC,EAAY,KAAK,UAAW,YAAAC,EAAc,KAAK,OAAUF,GAAW,CAAC,EACvEG,EAAe,uBAAuBJ,CAAI,GAKhD,SAASK,GAAW,CAChB,OAAOF,EAAY,aAAa,QAAQC,CAAY,GAAK,IAAI,CAAA,CAEjE,OAAOE,2BAAyB,CAC5B,MAAM,MAAO,CAET,MAAO,CAAE,MADKD,EAAS,CACR,CACnB,EACA,MAAM,KAAKE,EAAQ,CAAE,MAAAC,EAAO,SAAAC,EAAU,QAAAC,GAAW,CAC7C,MAAMC,EAAQ,CAAC,GAAGN,GAAU,EACtBG,EAAA,QAASI,GAAS,CACd,MAAAC,EAAQF,EAAM,UAAU,CAAC,CAAE,GAAAG,KAASA,IAAOF,EAAK,EAAE,EAAA,qCAExD,GAAIC,IAAU,GAAI,CACdF,EAAME,CAAK,EAAID,EACf,MAAA,CAEJD,EAAM,KAAKC,CAAI,CAAA,CAClB,EACQH,EAAA,QAASG,GAAS,CACjB,MAAAC,EAAQF,EAAM,UAAU,CAAC,CAAE,GAAAG,KAASA,IAAOF,EAAK,EAAE,EAAA,qCAExD,GAAIC,IAAU,GAAI,CACdF,EAAM,KAAKC,CAAI,EACf,MAAA,CAEJD,EAAME,CAAK,EAAID,CAAA,CAClB,EACOF,EAAA,QAASE,GAAS,CAChB,MAAAC,EAAQF,EAAM,UAAU,CAAC,CAAE,GAAAG,KAASA,IAAOF,EAAK,EAAE,EAAA,qCAEpDC,IAAU,IAERF,EAAA,OAAOE,EAAO,CAAC,CAAA,CACxB,EACD,aAAa,QAAQT,EAAcF,EAAUS,CAAK,CAAC,CAEvD,EACA,MAAM,UAAW,CACb,CACJ,CACH,CACL"}
1
+ {"version":3,"file":"index.umd.js","sources":["../src/index.ts"],"sourcesContent":["import { createStorageAdapter, get, serializeValue } from '@signaldb/core';\n/**\n * Creates a storage adapter for managing a SignalDB collection using localStorage.\n * @param name - A unique name for the collection, used as part of the localStorage key.\n * @param options - Optional configuration for the adapter.\n * @param options.databaseName - An optional name for the database to namespace the storage (default: 'signaldb').\n * @param options.serialize - A function to serialize items to a string (default: `JSON.stringify`).\n * @param options.deserialize - A function to deserialize a string into items (default: `JSON.parse`).\n * @returns A SignalDB storage adapter for managing data in localStorage.\n */\nexport default function createLocalStorageAdapter(name, options) {\n const serialize = options?.serialize || (data => JSON.stringify(data));\n const deserialize = options?.deserialize || (input => JSON.parse(input));\n const databaseName = options?.databaseName || 'signaldb';\n const storeName = `${name}`;\n // We use a single key that namespaces by database and store names\n const storageKey = `${databaseName}-${storeName}`;\n const indexKeyFor = (field) => `${storageKey}-index-${field}`;\n const indices = [];\n const readFromStorage = () => {\n const serialized = localStorage.getItem(storageKey);\n if (!serialized)\n return [];\n try {\n const parsed = deserialize(serialized);\n return Array.isArray(parsed) ? parsed : [];\n }\n catch {\n // If parsing fails, treat as empty to avoid corrupting runtime\n return [];\n }\n };\n const writeToStorage = (items) => {\n localStorage.setItem(storageKey, serialize(items));\n };\n const readIndex = async (field) => {\n const serialized = localStorage.getItem(indexKeyFor(field));\n if (!serialized)\n throw new Error(`Index on field \"${field}\" does not exist`);\n let data;\n try {\n data = deserialize(serialized);\n }\n catch {\n throw new Error(`Corrupted index on field \"${field}\"`);\n }\n const index = new Map();\n Object.entries(data).forEach(([key, ids]) => {\n if (!index.has(key))\n index.set(key, new Set());\n ids.forEach(id => index.get(key)?.add(id));\n });\n return index;\n };\n const ensureIndex = async (field, items = readFromStorage()) => {\n const index = new Map();\n items.forEach((item) => {\n const fieldValue = get(item, field);\n if (fieldValue == null)\n return;\n if (!index.has(fieldValue))\n index.set(fieldValue, new Set());\n index.get(fieldValue)?.add(item.id);\n });\n const safeIndex = {};\n index.forEach((ids, key) => {\n const safeKey = String(serializeValue(key));\n safeIndex[safeKey] = [...ids];\n });\n localStorage.setItem(indexKeyFor(field), serialize(safeIndex));\n };\n // --- Delta indexing helpers ---\n const safeKeyFor = (value) => String(serializeValue(value));\n const loadIndexMap = (field) => {\n const serialized = localStorage.getItem(indexKeyFor(field));\n if (!serialized)\n return undefined;\n let data;\n try {\n data = deserialize(serialized);\n }\n catch {\n throw new Error(`Corrupted index on field \"${field}\"`);\n }\n const index = new Map();\n Object.entries(data).forEach(([key, ids]) => {\n index.set(key, new Set(ids));\n });\n return index;\n };\n const saveIndexMap = (field, index) => {\n const safeIndex = {};\n index.forEach((ids, key) => {\n safeIndex[key] = [...ids];\n });\n localStorage.setItem(indexKeyFor(field), serialize(safeIndex));\n };\n const addToDelta = (deltas, field, kind, key, id) => {\n if (!deltas.has(field)) {\n deltas.set(field, { adds: new Map(), removes: new Map() });\n }\n const delta = deltas.get(field);\n if (!delta)\n return;\n const target = kind === 'add' ? delta.adds : delta.removes;\n if (!target.has(key))\n target.set(key, new Set());\n target.get(key)?.add(id);\n };\n const applyIndexDeltas = (deltas) => {\n // Update only the indices that have changes\n deltas.forEach((delta, field) => {\n const index = loadIndexMap(field);\n // If the index doesn't exist, skip (we only maintain indices that were created)\n if (!index)\n return;\n // Apply removals\n delta.removes.forEach((ids, key) => {\n const set = index.get(key);\n if (!set)\n return;\n ids.forEach(id => set.delete(id));\n if (set.size === 0)\n index.delete(key);\n });\n // Apply additions\n delta.adds.forEach((ids, key) => {\n let set = index.get(key);\n if (!set) {\n set = new Set();\n index.set(key, set);\n }\n ids.forEach(id => set.add(id));\n });\n saveIndexMap(field, index);\n });\n };\n const addDeltaForChange = (deltas, field, oldValue, newValue, id) => {\n const oldKey = oldValue == null ? undefined : safeKeyFor(oldValue);\n const newKey = newValue == null ? undefined : safeKeyFor(newValue);\n if (oldKey === newKey)\n return;\n if (oldKey != null)\n addToDelta(deltas, field, 'remove', oldKey, id);\n if (newKey != null)\n addToDelta(deltas, field, 'add', newKey, id);\n };\n const accumulateUpsertDelta = (deltas, existing, next) => {\n if (existing) {\n for (const field of indices) {\n addDeltaForChange(deltas, field, get(existing, field), get(next, field), next.id);\n }\n }\n else {\n for (const field of indices) {\n const value = get(next, field);\n if (value == null)\n continue;\n addToDelta(deltas, field, 'add', safeKeyFor(value), next.id);\n }\n }\n };\n const accumulateRemoveDelta = (deltas, existing) => {\n for (const field of indices) {\n const value = get(existing, field);\n if (value == null)\n continue;\n addToDelta(deltas, field, 'remove', safeKeyFor(value), existing.id);\n }\n };\n const upsertItems = (itemsToUpsert) => {\n const items = readFromStorage();\n const byId = new Map(items.map(item => [item.id, item]));\n const deltas = new Map();\n for (const item of itemsToUpsert) {\n const existing = byId.get(item.id);\n accumulateUpsertDelta(deltas, existing, item);\n byId.set(item.id, item);\n }\n writeToStorage([...byId.values()]);\n applyIndexDeltas(deltas);\n };\n return createStorageAdapter({\n // lifecycle methods\n setup: async () => {\n // For localStorage, there is no database to open; we just ensure the key exists\n if (localStorage.getItem(storageKey) == null) {\n writeToStorage([]);\n }\n // Hydrate known index fields from existing keys so that we can keep them updated across sessions\n const prefix = `${storageKey}-index-`;\n for (let i = 0; i < localStorage.length; i++) {\n const k = localStorage.key(i);\n if (k && k.startsWith(prefix)) {\n const field = k.slice(prefix.length);\n if (!indices.includes(field))\n indices.push(field);\n }\n }\n },\n teardown: async () => {\n // no-op\n },\n // data retrieval methods\n readAll: async () => {\n return readFromStorage();\n },\n readIds: async (ids) => {\n const items = readFromStorage();\n const idSet = new Set(ids);\n return items.filter(item => idSet.has(item.id));\n },\n // index methods\n createIndex: async (field) => {\n if (!indices.includes(field))\n indices.push(field);\n await ensureIndex(field);\n },\n dropIndex: async (field) => {\n if (indices.includes(field)) {\n const i = indices.indexOf(field);\n indices.splice(i, 1);\n }\n const key = indexKeyFor(field);\n if (localStorage.getItem(key) == null) {\n throw new Error(`Index on field \"${field}\" does not exist`);\n }\n localStorage.removeItem(key);\n },\n readIndex,\n // data manipulation methods\n insert: async (newItems) => {\n upsertItems(newItems);\n },\n replace: async (itemsToReplace) => {\n upsertItems(itemsToReplace);\n },\n remove: async (itemsToRemove) => {\n const items = readFromStorage();\n const byId = new Map(items.map(item => [item.id, item]));\n const deltas = new Map();\n const removeSet = new Set(itemsToRemove.map(item => item.id));\n removeSet.forEach((id) => {\n const existing = byId.get(id);\n if (!existing)\n return;\n accumulateRemoveDelta(deltas, existing);\n byId.delete(id);\n });\n writeToStorage([...byId.values()]);\n applyIndexDeltas(deltas);\n },\n removeAll: async () => {\n writeToStorage([]);\n // remove all index keys for this store\n const prefix = `${storageKey}-index-`;\n const keysToRemove = [];\n for (let i = 0; i < localStorage.length; i++) {\n const k = localStorage.key(i);\n if (k && k.startsWith(prefix))\n keysToRemove.push(k);\n }\n keysToRemove.forEach(k => localStorage.removeItem(k));\n indices.splice(0);\n },\n });\n}\n"],"names":["createLocalStorageAdapter","name","options","serialize","data","deserialize","input","databaseName","storeName","storageKey","indexKeyFor","field","indices","readFromStorage","serialized","parsed","writeToStorage","items","readIndex","index","key","ids","id","ensureIndex","item","fieldValue","get","safeIndex","safeKey","serializeValue","safeKeyFor","value","loadIndexMap","saveIndexMap","addToDelta","deltas","kind","delta","target","applyIndexDeltas","set","addDeltaForChange","oldValue","newValue","oldKey","newKey","accumulateUpsertDelta","existing","next","accumulateRemoveDelta","upsertItems","itemsToUpsert","byId","createStorageAdapter","prefix","i","k","idSet","newItems","itemsToReplace","itemsToRemove","keysToRemove"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@signaldb/localstorage",
3
- "version": "1.0.1",
3
+ "version": "2.0.0-beta.0",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "build": "rimraf dist && vite build",
@@ -53,6 +53,6 @@
53
53
  "dist"
54
54
  ],
55
55
  "peerDependencies": {
56
- "@signaldb/core": "1.x"
56
+ "@signaldb/core": "2.0.0-beta.0"
57
57
  }
58
58
  }