@signaldb/indexeddb 1.0.0 → 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/indexeddb
2
2
 
3
- This is the `IndexedDB` 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 `IndexedDB` 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/indexeddb/ for more information.
package/dist/index.d.ts CHANGED
@@ -1,11 +1,19 @@
1
+ type IndexedDatabaseAdapterOptions = {
2
+ databaseName?: string;
3
+ version?: number;
4
+ onUpgrade?: (database: IDBDatabase, oldVersion: number, newVersion: number | null) => Promise<void>;
5
+ };
1
6
  /**
2
7
  * Creates a persistence adapter for managing a SignalDB collection using IndexedDB.
3
8
  * This adapter reads and writes data to an IndexedDB object store, with customizable serialization and deserialization.
4
9
  * @template T - The type of the items in the collection.
5
10
  * @template I - The type of the unique identifier for the items.
6
11
  * @param name - A unique name for the collection, used as the database name.
12
+ * @param options - Optional configuration for the adapter.
13
+ * @param options.prefix - A prefix to be added to the database name (default: 'signaldb-').
7
14
  * @returns A SignalDB persistence adapter for managing data in IndexedDB.
8
15
  */
9
16
  export default function createIndexedDBAdapter<T extends {
10
17
  id: I;
11
- } & Record<string, any>, I extends IDBValidKey>(name: string): import("@signaldb/core").PersistenceAdapter<T, I>;
18
+ } & Record<string, any>, I extends IDBValidKey>(name: string, options?: IndexedDatabaseAdapterOptions): import("@signaldb/core").StorageAdapter<T, I>;
19
+ export {};
package/dist/index.mjs CHANGED
@@ -1,50 +1,135 @@
1
- import { createPersistenceAdapter as f } from "@signaldb/core";
2
- function g(u) {
3
- const l = `signaldb-${u}`, s = "items";
4
- function d() {
5
- return new Promise((a, c) => {
6
- const e = indexedDB.open(l, 1);
7
- e.onupgradeneeded = () => {
8
- const r = e.result;
9
- r.objectStoreNames.contains(s) || r.createObjectStore(s, { keyPath: "id" });
10
- }, e.onsuccess = () => a(e.result), e.onerror = () => {
11
- var r;
12
- return c(new Error(((r = e.error) === null || r === void 0 ? void 0 : r.message) || "Database error"));
13
- };
1
+ import { createStorageAdapter as b } from "@signaldb/core";
2
+ async function y(p, E = 1, f) {
3
+ const a = indexedDB.open(p, E), d = new Promise((l, u) => {
4
+ a.addEventListener("upgradeneeded", (m) => {
5
+ const w = a.result, r = a.transaction;
6
+ if (f) {
7
+ f(w, r, m.oldVersion, m.newVersion ?? null).then(() => l()).catch(
8
+ /* istanbul ignore next -- @preserve */
9
+ (t) => {
10
+ u(t);
11
+ }
12
+ );
13
+ return;
14
+ }
15
+ /* istanbul ignore next -- @preserve */
16
+ l();
14
17
  });
15
- }
16
- async function m() {
17
- const a = await d();
18
- return new Promise((c, e) => {
19
- const t = a.transaction(s, "readonly").objectStore(s).getAll();
20
- t.onsuccess = () => {
21
- const { result: o } = t;
22
- c(o);
23
- }, t.onerror = () => {
24
- var o;
25
- return e(new Error(((o = t.error) === null || o === void 0 ? void 0 : o.message) || "Error fetching items"));
26
- };
18
+ }), o = new Promise((l, u) => {
19
+ a.addEventListener("success", () => l(a.result)), a.addEventListener("error", () => u(new Error(a.error?.message || "Database error")));
20
+ });
21
+ return await Promise.all([
22
+ o,
23
+ d
24
+ ]), o;
25
+ }
26
+ function L(p, E) {
27
+ const f = E?.databaseName || "signaldb", a = `${p}`;
28
+ let d = null;
29
+ const o = async (r = !1) => {
30
+ const t = await d;
31
+ if (!t)
32
+ throw new Error("Database not initialized");
33
+ return t.transaction(a, r ? "readwrite" : "readonly").objectStore(a);
34
+ }, l = async (r) => {
35
+ const t = await o();
36
+ if (!t.indexNames.contains(r))
37
+ throw new Error(`Index on field "${r}" does not exist`);
38
+ return new Promise((s, e) => {
39
+ const i = t.index(r), n = /* @__PURE__ */ new Map(), c = i.openCursor();
40
+ c.addEventListener("success", () => {
41
+ const g = c.result;
42
+ if (g) {
43
+ const x = g.key, v = g.value.id;
44
+ n.has(x) || n.set(x, /* @__PURE__ */ new Set()), n.get(x)?.add(v), g.continue();
45
+ } else
46
+ s(n);
47
+ }), c.addEventListener("error", () => e(new Error(c.error?.message || "Error reading index")));
27
48
  });
28
- }
29
- return f({
30
- async load() {
31
- return { items: await m() };
32
- },
33
- async save(a, { added: c, modified: e, removed: r }) {
34
- const t = (await d()).transaction(s, "readwrite"), o = t.objectStore(s);
35
- return c.forEach((n) => o.add(n)), e.forEach((n) => o.put(n)), r.forEach((n) => o.delete(n.id)), new Promise((n, v) => {
36
- t.oncomplete = () => n(), t.onerror = () => {
37
- var i;
38
- return v(new Error(((i = t.error) === null || i === void 0 ? void 0 : i.message) || "Transaction error"));
39
- };
49
+ };
50
+ let u = !1;
51
+ const m = /* @__PURE__ */ new Set(), w = /* @__PURE__ */ new Set();
52
+ return b({
53
+ // lifecycle methods
54
+ setup: async () => {
55
+ u = !0, d = y(f, E?.version, async (r, t) => {
56
+ if (r.objectStoreNames.contains(a) || r.createObjectStore(a, {
57
+ keyPath: "id",
58
+ autoIncrement: !0
59
+ }), m.size === 0 && w.size === 0)
60
+ return;
61
+ const s = t.objectStore(a);
62
+ m.forEach((e) => {
63
+ s.indexNames.contains(e) || s.createIndex(e, e, { unique: !1 });
64
+ }), w.forEach((e) => {
65
+ s.indexNames.contains(e) && s.deleteIndex(e);
66
+ });
67
+ }), await d;
68
+ },
69
+ teardown: async () => {
70
+ if (!d)
71
+ return;
72
+ (await d).close(), d = null;
73
+ },
74
+ // data retrieval methods
75
+ readAll: async () => {
76
+ const r = await o();
77
+ return new Promise((t, s) => {
78
+ const e = r.getAll();
79
+ e.addEventListener("success", () => t(e.result)), e.addEventListener("error", () => s(new Error(e.error?.message || "Error fetching items")));
40
80
  });
41
81
  },
42
- async register() {
43
- return Promise.resolve();
82
+ readIds: async (r) => {
83
+ const t = await o();
84
+ return (await Promise.all(r.map((e) => new Promise((i, n) => {
85
+ const c = t.get(e);
86
+ c.addEventListener("success", () => i(c.result || null)), c.addEventListener("error", () => n(new Error(c.error?.message || "Error fetching item")));
87
+ })))).filter((e) => e !== null);
88
+ },
89
+ // index methods
90
+ createIndex: async (r) => {
91
+ if (u)
92
+ throw new Error("createIndex must be called before setup()");
93
+ m.add(r);
94
+ },
95
+ dropIndex: async (r) => {
96
+ if (u)
97
+ throw new Error("createIndex must be called before setup()");
98
+ w.add(r);
99
+ },
100
+ readIndex: l,
101
+ // data manipulation methods
102
+ insert: async (r) => {
103
+ const t = await o(!0);
104
+ await Promise.all(r.map((s) => new Promise((e, i) => {
105
+ const n = t.add(s);
106
+ n.addEventListener("success", () => e()), n.addEventListener("error", () => i(new Error(n.error?.message || "Error inserting item")));
107
+ })));
108
+ },
109
+ replace: async (r) => {
110
+ const t = await o(!0);
111
+ await Promise.all(r.map((s) => new Promise((e, i) => {
112
+ const n = t.put(s);
113
+ n.addEventListener("success", () => e()), n.addEventListener("error", () => i(new Error(n.error?.message || "Error replacing item")));
114
+ })));
115
+ },
116
+ remove: async (r) => {
117
+ const t = await o(!0);
118
+ await Promise.all(r.map(async (s) => new Promise((e, i) => {
119
+ const n = t.delete(s.id);
120
+ n.addEventListener("success", () => e()), n.addEventListener("error", () => i(new Error(n.error?.message || "Error removing item")));
121
+ })));
122
+ },
123
+ removeAll: async () => {
124
+ const r = await o(!0);
125
+ return new Promise((t, s) => {
126
+ const e = r.clear();
127
+ e.addEventListener("success", () => t()), e.addEventListener("error", () => s(new Error(e.error?.message || "Error clearing items")));
128
+ });
44
129
  }
45
130
  });
46
131
  }
47
132
  export {
48
- g as default
133
+ L as default
49
134
  };
50
135
  //# 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 IndexedDB.\n * This adapter reads and writes data to an IndexedDB object store, 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 database name.\n * @returns A SignalDB persistence adapter for managing data in IndexedDB.\n */\nexport default function createIndexedDBAdapter(name) {\n const dbName = `signaldb-${name}`;\n const storeName = 'items';\n function openDatabase() {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(dbName, 1);\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(storeName)) {\n db.createObjectStore(storeName, { keyPath: 'id' });\n }\n };\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => { var _a; return reject(new Error(((_a = request.error) === null || _a === void 0 ? void 0 : _a.message) || 'Database error')); };\n });\n }\n async function getAllItems() {\n const db = await openDatabase();\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(storeName, 'readonly');\n const store = transaction.objectStore(storeName);\n const request = store.getAll();\n request.onsuccess = () => {\n const { result } = request;\n resolve(result); // Ensure proper typing\n };\n request.onerror = () => { var _a; return reject(new Error(((_a = request.error) === null || _a === void 0 ? void 0 : _a.message) || 'Error fetching items')); };\n });\n }\n return createPersistenceAdapter({\n async load() {\n const items = await getAllItems();\n return { items };\n },\n async save(items, { added, modified, removed }) {\n const db = await openDatabase();\n const transaction = db.transaction(storeName, 'readwrite');\n const store = transaction.objectStore(storeName);\n added.forEach(item => store.add(item));\n modified.forEach(item => store.put(item));\n removed.forEach(item => store.delete(item.id));\n return new Promise((resolve, reject) => {\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => { var _a; return reject(new Error(((_a = transaction.error) === null || _a === void 0 ? void 0 : _a.message) || 'Transaction error')); };\n });\n },\n async register() {\n return Promise.resolve();\n },\n });\n}\n"],"names":["createIndexedDBAdapter","name","dbName","storeName","openDatabase","resolve","reject","request","db","_a","getAllItems","result","createPersistenceAdapter","items","added","modified","removed","transaction","store","item"],"mappings":";AASA,SAAwBA,EAAuBC,GAAM;AAC3C,QAAAC,IAAS,YAAYD,CAAI,IACzBE,IAAY;AAClB,WAASC,IAAe;AACpB,WAAO,IAAI,QAAQ,CAACC,GAASC,MAAW;AACpC,YAAMC,IAAU,UAAU,KAAKL,GAAQ,CAAC;AACxC,MAAAK,EAAQ,kBAAkB,MAAM;AAC5B,cAAMC,IAAKD,EAAQ;AACnB,QAAKC,EAAG,iBAAiB,SAASL,CAAS,KACvCK,EAAG,kBAAkBL,GAAW,EAAE,SAAS,MAAM;AAAA,MAEzD,GACAI,EAAQ,YAAY,MAAMF,EAAQE,EAAQ,MAAM,GAChDA,EAAQ,UAAU,MAAM;AAAM,YAAAE;AAAI,eAAOH,EAAO,IAAI,QAAQG,IAAKF,EAAQ,WAAW,QAAQE,MAAO,SAAS,SAASA,EAAG,YAAY,gBAAgB,CAAC;AAAA,MAAG;AAAA,IAAA,CAC3J;AAAA,EAAA;AAEL,iBAAeC,IAAc;AACnB,UAAAF,IAAK,MAAMJ,EAAa;AAC9B,WAAO,IAAI,QAAQ,CAACC,GAASC,MAAW;AAG9B,YAAAC,IAFcC,EAAG,YAAYL,GAAW,UAAU,EAC9B,YAAYA,CAAS,EACzB,OAAO;AAC7B,MAAAI,EAAQ,YAAY,MAAM;AAChB,cAAA,EAAE,QAAAI,MAAWJ;AACnB,QAAAF,EAAQM,CAAM;AAAA,MAClB,GACAJ,EAAQ,UAAU,MAAM;AAAM,YAAAE;AAAI,eAAOH,EAAO,IAAI,QAAQG,IAAKF,EAAQ,WAAW,QAAQE,MAAO,SAAS,SAASA,EAAG,YAAY,sBAAsB,CAAC;AAAA,MAAG;AAAA,IAAA,CACjK;AAAA,EAAA;AAEL,SAAOG,EAAyB;AAAA,IAC5B,MAAM,OAAO;AAET,aAAO,EAAE,OADK,MAAMF,EAAY,EACjB;AAAA,IACnB;AAAA,IACA,MAAM,KAAKG,GAAO,EAAE,OAAAC,GAAO,UAAAC,GAAU,SAAAC,KAAW;AAE5C,YAAMC,KADK,MAAMb,EAAa,GACP,YAAYD,GAAW,WAAW,GACnDe,IAAQD,EAAY,YAAYd,CAAS;AAC/C,aAAAW,EAAM,QAAQ,CAAAK,MAAQD,EAAM,IAAIC,CAAI,CAAC,GACrCJ,EAAS,QAAQ,CAAAI,MAAQD,EAAM,IAAIC,CAAI,CAAC,GACxCH,EAAQ,QAAQ,CAAQG,MAAAD,EAAM,OAAOC,EAAK,EAAE,CAAC,GACtC,IAAI,QAAQ,CAACd,GAASC,MAAW;AACxB,QAAAW,EAAA,aAAa,MAAMZ,EAAQ,GACvCY,EAAY,UAAU,MAAM;AAAM,cAAAR;AAAI,iBAAOH,EAAO,IAAI,QAAQG,IAAKQ,EAAY,WAAW,QAAQR,MAAO,SAAS,SAASA,EAAG,YAAY,mBAAmB,CAAC;AAAA,QAAG;AAAA,MAAA,CACtK;AAAA,IACL;AAAA,IACA,MAAM,WAAW;AACb,aAAO,QAAQ,QAAQ;AAAA,IAAA;AAAA,EAC3B,CACH;AACL;"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/index.ts"],"sourcesContent":["import { createStorageAdapter } from '@signaldb/core';\n/**\n * Opens the IndexedDB database and creates the object store if it doesn't exist.\n * @param databaseName - The name of the database.\n * @param version - The version of the database.\n * @param onUpgrade - Optional callback for handling database upgrades.\n * @returns A promise that resolves with the opened database.\n */\nasync function openDatabase(databaseName, version = 1, onUpgrade) {\n const request = indexedDB.open(databaseName, version);\n const upgradePromise = new Promise((resolve, reject) => {\n request.addEventListener('upgradeneeded', (event) => {\n const database = request.result;\n const tx = request.transaction;\n if (onUpgrade) {\n onUpgrade(database, tx, event.oldVersion, event.newVersion ?? null)\n .then(() => resolve())\n .catch(\n /* istanbul ignore next -- @preserve */\n (error) => {\n reject(error);\n });\n return;\n }\n // No custom upgrade logic provided, resolve immediately\n /* istanbul ignore next -- @preserve */\n resolve();\n });\n });\n const databasePromise = new Promise((resolve, reject) => {\n request.addEventListener('success', () => resolve(request.result));\n request.addEventListener('error', () => reject(new Error(request.error?.message || 'Database error')));\n });\n await Promise.all([\n databasePromise,\n upgradePromise,\n ]);\n return databasePromise;\n}\n/**\n * Creates a persistence adapter for managing a SignalDB collection using IndexedDB.\n * This adapter reads and writes data to an IndexedDB object store, 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 database name.\n * @param options - Optional configuration for the adapter.\n * @param options.prefix - A prefix to be added to the database name (default: 'signaldb-').\n * @returns A SignalDB persistence adapter for managing data in IndexedDB.\n */\nexport default function createIndexedDBAdapter(name, options) {\n const databaseName = options?.databaseName || 'signaldb';\n const storeName = `${name}`;\n let databasePromise = null;\n const getStore = async (writeAccess = false) => {\n const database = await databasePromise;\n if (!database)\n throw new Error('Database not initialized');\n const transaction = database.transaction(storeName, writeAccess ? 'readwrite' : 'readonly');\n const store = transaction.objectStore(storeName);\n return store;\n };\n const readIndex = async (field) => {\n const store = await getStore();\n if (!store.indexNames.contains(field)) {\n throw new Error(`Index on field \"${field}\" does not exist`);\n }\n return new Promise((resolve, reject) => {\n const index = store.index(field);\n const result = new Map();\n const request = index.openCursor();\n request.addEventListener('success', () => {\n const cursor = request.result;\n if (cursor) {\n const key = cursor.key;\n const id = cursor.value.id;\n if (!result.has(key)) {\n result.set(key, new Set());\n }\n result.get(key)?.add(id);\n cursor.continue();\n }\n else {\n resolve(result);\n }\n });\n request.addEventListener('error', () => reject(new Error(request.error?.message || 'Error reading index')));\n });\n };\n let setupCalled = false;\n const indexesToCreate = new Set();\n const indexesToDrop = new Set();\n return createStorageAdapter({\n // lifecycle methods\n setup: async () => {\n setupCalled = true;\n databasePromise = openDatabase(databaseName, options?.version, async (database, tx) => {\n // Ensure the object store exists; if not, create it within the same upgrade transaction\n if (!database.objectStoreNames.contains(storeName)) {\n database.createObjectStore(storeName, {\n keyPath: 'id',\n autoIncrement: true,\n });\n }\n // If there are no index changes, nothing else to do\n if (indexesToCreate.size === 0 && indexesToDrop.size === 0)\n return;\n // Use the provided versionchange transaction to mutate indexes\n const store = tx.objectStore(storeName);\n indexesToCreate.forEach((field) => {\n if (store.indexNames.contains(field))\n return;\n store.createIndex(field, field, { unique: false });\n });\n indexesToDrop.forEach((field) => {\n if (!store.indexNames.contains(field))\n return;\n store.deleteIndex(field);\n });\n });\n await databasePromise;\n },\n teardown: async () => {\n if (!databasePromise)\n return;\n const database = await databasePromise;\n database.close();\n databasePromise = null;\n },\n // data retrieval methods\n readAll: async () => {\n const store = await getStore();\n return new Promise((resolve, reject) => {\n const request = store.getAll();\n request.addEventListener('success', () => resolve(request.result));\n request.addEventListener('error', () => reject(new Error(request.error?.message || 'Error fetching items')));\n });\n },\n readIds: async (ids) => {\n const store = await getStore();\n const results = await Promise.all(ids.map(id => new Promise((resolve, reject) => {\n const request = store.get(id);\n request.addEventListener('success', () => resolve(request.result || null));\n request.addEventListener('error', () => reject(new Error(request.error?.message || 'Error fetching item')));\n })));\n return results.filter(item => item !== null);\n },\n // index methods\n createIndex: async (field) => {\n if (setupCalled)\n throw new Error('createIndex must be called before setup()');\n indexesToCreate.add(field);\n },\n dropIndex: async (field) => {\n if (setupCalled)\n throw new Error('createIndex must be called before setup()');\n indexesToDrop.add(field);\n },\n readIndex,\n // data manipulation methods\n insert: async (newItems) => {\n const store = await getStore(true);\n await Promise.all(newItems.map(item => new Promise((resolve, reject) => {\n const request = store.add(item);\n request.addEventListener('success', () => resolve());\n request.addEventListener('error', () => reject(new Error(request.error?.message || 'Error inserting item')));\n })));\n },\n replace: async (items) => {\n const store = await getStore(true);\n await Promise.all(items.map(item => new Promise((resolve, reject) => {\n const request = store.put(item);\n request.addEventListener('success', () => resolve());\n request.addEventListener('error', () => reject(new Error(request.error?.message || 'Error replacing item')));\n })));\n },\n remove: async (itemsToRemove) => {\n const store = await getStore(true);\n await Promise.all(itemsToRemove.map(async (item) => new Promise((resolve, reject) => {\n const request = store.delete(item.id);\n request.addEventListener('success', () => resolve());\n request.addEventListener('error', () => reject(new Error(request.error?.message || 'Error removing item')));\n })));\n },\n removeAll: async () => {\n const store = await getStore(true);\n return new Promise((resolve, reject) => {\n const request = store.clear();\n request.addEventListener('success', () => resolve());\n request.addEventListener('error', () => reject(new Error(request.error?.message || 'Error clearing items')));\n });\n },\n });\n}\n"],"names":["openDatabase","databaseName","version","onUpgrade","request","upgradePromise","resolve","reject","event","database","tx","error","databasePromise","createIndexedDBAdapter","name","options","storeName","getStore","writeAccess","readIndex","field","store","index","result","cursor","key","id","setupCalled","indexesToCreate","indexesToDrop","createStorageAdapter","ids","item","newItems","items","itemsToRemove"],"mappings":"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"}
package/dist/index.umd.js CHANGED
@@ -1,2 +1,2 @@
1
- (function(s,i){typeof exports=="object"&&typeof module<"u"?module.exports=i(require("@signaldb/core")):typeof define=="function"&&define.amd?define(["@signaldb/core"],i):(s=typeof globalThis<"u"?globalThis:s||self,s.SignalDB=i(s.core))})(this,function(s){"use strict";function i(m){const f=`signaldb-${m}`,a="items";function l(){return new Promise((c,d)=>{const e=indexedDB.open(f,1);e.onupgradeneeded=()=>{const r=e.result;r.objectStoreNames.contains(a)||r.createObjectStore(a,{keyPath:"id"})},e.onsuccess=()=>c(e.result),e.onerror=()=>{var r;return d(new Error(((r=e.error)===null||r===void 0?void 0:r.message)||"Database error"))}})}async function b(){const c=await l();return new Promise((d,e)=>{const t=c.transaction(a,"readonly").objectStore(a).getAll();t.onsuccess=()=>{const{result:n}=t;d(n)},t.onerror=()=>{var n;return e(new Error(((n=t.error)===null||n===void 0?void 0:n.message)||"Error fetching items"))}})}return s.createPersistenceAdapter({async load(){return{items:await b()}},async save(c,{added:d,modified:e,removed:r}){const t=(await l()).transaction(a,"readwrite"),n=t.objectStore(a);return d.forEach(o=>n.add(o)),e.forEach(o=>n.put(o)),r.forEach(o=>n.delete(o.id)),new Promise((o,g)=>{t.oncomplete=()=>o(),t.onerror=()=>{var u;return g(new Error(((u=t.error)===null||u===void 0?void 0:u.message)||"Transaction error"))}})},async register(){return Promise.resolve()}})}return i});
1
+ (function(l,E){typeof exports=="object"&&typeof module<"u"?module.exports=E(require("@signaldb/core")):typeof define=="function"&&define.amd?define(["@signaldb/core"],E):(l=typeof globalThis<"u"?globalThis:l||self,l.SignalDB=E(l.core))})(this,(function(l){"use strict";async function E(b,p=1,g){const a=indexedDB.open(b,p),d=new Promise((m,u)=>{a.addEventListener("upgradeneeded",w=>{const f=a.result,r=a.transaction;if(g){g(f,r,w.oldVersion,w.newVersion??null).then(()=>m()).catch(t=>{u(t)});return}/* istanbul ignore next -- @preserve */m()})}),o=new Promise((m,u)=>{a.addEventListener("success",()=>m(a.result)),a.addEventListener("error",()=>u(new Error(a.error?.message||"Database error")))});return await Promise.all([o,d]),o}function v(b,p){const g=p?.databaseName||"signaldb",a=`${b}`;let d=null;const o=async(r=!1)=>{const t=await d;if(!t)throw new Error("Database not initialized");return t.transaction(a,r?"readwrite":"readonly").objectStore(a)},m=async r=>{const t=await o();if(!t.indexNames.contains(r))throw new Error(`Index on field "${r}" does not exist`);return new Promise((s,e)=>{const i=t.index(r),n=new Map,c=i.openCursor();c.addEventListener("success",()=>{const x=c.result;if(x){const y=x.key,P=x.value.id;n.has(y)||n.set(y,new Set),n.get(y)?.add(P),x.continue()}else s(n)}),c.addEventListener("error",()=>e(new Error(c.error?.message||"Error reading index")))})};let u=!1;const w=new Set,f=new Set;return l.createStorageAdapter({setup:async()=>{u=!0,d=E(g,p?.version,async(r,t)=>{if(r.objectStoreNames.contains(a)||r.createObjectStore(a,{keyPath:"id",autoIncrement:!0}),w.size===0&&f.size===0)return;const s=t.objectStore(a);w.forEach(e=>{s.indexNames.contains(e)||s.createIndex(e,e,{unique:!1})}),f.forEach(e=>{s.indexNames.contains(e)&&s.deleteIndex(e)})}),await d},teardown:async()=>{if(!d)return;(await d).close(),d=null},readAll:async()=>{const r=await o();return new Promise((t,s)=>{const e=r.getAll();e.addEventListener("success",()=>t(e.result)),e.addEventListener("error",()=>s(new Error(e.error?.message||"Error fetching items")))})},readIds:async r=>{const t=await o();return(await Promise.all(r.map(e=>new Promise((i,n)=>{const c=t.get(e);c.addEventListener("success",()=>i(c.result||null)),c.addEventListener("error",()=>n(new Error(c.error?.message||"Error fetching item")))})))).filter(e=>e!==null)},createIndex:async r=>{if(u)throw new Error("createIndex must be called before setup()");w.add(r)},dropIndex:async r=>{if(u)throw new Error("createIndex must be called before setup()");f.add(r)},readIndex:m,insert:async r=>{const t=await o(!0);await Promise.all(r.map(s=>new Promise((e,i)=>{const n=t.add(s);n.addEventListener("success",()=>e()),n.addEventListener("error",()=>i(new Error(n.error?.message||"Error inserting item")))})))},replace:async r=>{const t=await o(!0);await Promise.all(r.map(s=>new Promise((e,i)=>{const n=t.put(s);n.addEventListener("success",()=>e()),n.addEventListener("error",()=>i(new Error(n.error?.message||"Error replacing item")))})))},remove:async r=>{const t=await o(!0);await Promise.all(r.map(async s=>new Promise((e,i)=>{const n=t.delete(s.id);n.addEventListener("success",()=>e()),n.addEventListener("error",()=>i(new Error(n.error?.message||"Error removing item")))})))},removeAll:async()=>{const r=await o(!0);return new Promise((t,s)=>{const e=r.clear();e.addEventListener("success",()=>t()),e.addEventListener("error",()=>s(new Error(e.error?.message||"Error clearing items")))})}})}return v}));
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 IndexedDB.\n * This adapter reads and writes data to an IndexedDB object store, 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 database name.\n * @returns A SignalDB persistence adapter for managing data in IndexedDB.\n */\nexport default function createIndexedDBAdapter(name) {\n const dbName = `signaldb-${name}`;\n const storeName = 'items';\n function openDatabase() {\n return new Promise((resolve, reject) => {\n const request = indexedDB.open(dbName, 1);\n request.onupgradeneeded = () => {\n const db = request.result;\n if (!db.objectStoreNames.contains(storeName)) {\n db.createObjectStore(storeName, { keyPath: 'id' });\n }\n };\n request.onsuccess = () => resolve(request.result);\n request.onerror = () => { var _a; return reject(new Error(((_a = request.error) === null || _a === void 0 ? void 0 : _a.message) || 'Database error')); };\n });\n }\n async function getAllItems() {\n const db = await openDatabase();\n return new Promise((resolve, reject) => {\n const transaction = db.transaction(storeName, 'readonly');\n const store = transaction.objectStore(storeName);\n const request = store.getAll();\n request.onsuccess = () => {\n const { result } = request;\n resolve(result); // Ensure proper typing\n };\n request.onerror = () => { var _a; return reject(new Error(((_a = request.error) === null || _a === void 0 ? void 0 : _a.message) || 'Error fetching items')); };\n });\n }\n return createPersistenceAdapter({\n async load() {\n const items = await getAllItems();\n return { items };\n },\n async save(items, { added, modified, removed }) {\n const db = await openDatabase();\n const transaction = db.transaction(storeName, 'readwrite');\n const store = transaction.objectStore(storeName);\n added.forEach(item => store.add(item));\n modified.forEach(item => store.put(item));\n removed.forEach(item => store.delete(item.id));\n return new Promise((resolve, reject) => {\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => { var _a; return reject(new Error(((_a = transaction.error) === null || _a === void 0 ? void 0 : _a.message) || 'Transaction error')); };\n });\n },\n async register() {\n return Promise.resolve();\n },\n });\n}\n"],"names":["createIndexedDBAdapter","name","dbName","storeName","openDatabase","resolve","reject","request","db","_a","getAllItems","result","createPersistenceAdapter","items","added","modified","removed","transaction","store","item"],"mappings":"4QASA,SAAwBA,EAAuBC,EAAM,CAC3C,MAAAC,EAAS,YAAYD,CAAI,GACzBE,EAAY,QAClB,SAASC,GAAe,CACpB,OAAO,IAAI,QAAQ,CAACC,EAASC,IAAW,CACpC,MAAMC,EAAU,UAAU,KAAKL,EAAQ,CAAC,EACxCK,EAAQ,gBAAkB,IAAM,CAC5B,MAAMC,EAAKD,EAAQ,OACdC,EAAG,iBAAiB,SAASL,CAAS,GACvCK,EAAG,kBAAkBL,EAAW,CAAE,QAAS,KAAM,CAEzD,EACAI,EAAQ,UAAY,IAAMF,EAAQE,EAAQ,MAAM,EAChDA,EAAQ,QAAU,IAAM,CAAM,IAAAE,EAAI,OAAOH,EAAO,IAAI,QAAQG,EAAKF,EAAQ,SAAW,MAAQE,IAAO,OAAS,OAASA,EAAG,UAAY,gBAAgB,CAAC,CAAG,CAAA,CAC3J,CAAA,CAEL,eAAeC,GAAc,CACnB,MAAAF,EAAK,MAAMJ,EAAa,EAC9B,OAAO,IAAI,QAAQ,CAACC,EAASC,IAAW,CAG9B,MAAAC,EAFcC,EAAG,YAAYL,EAAW,UAAU,EAC9B,YAAYA,CAAS,EACzB,OAAO,EAC7BI,EAAQ,UAAY,IAAM,CAChB,KAAA,CAAE,OAAAI,GAAWJ,EACnBF,EAAQM,CAAM,CAClB,EACAJ,EAAQ,QAAU,IAAM,CAAM,IAAAE,EAAI,OAAOH,EAAO,IAAI,QAAQG,EAAKF,EAAQ,SAAW,MAAQE,IAAO,OAAS,OAASA,EAAG,UAAY,sBAAsB,CAAC,CAAG,CAAA,CACjK,CAAA,CAEL,OAAOG,2BAAyB,CAC5B,MAAM,MAAO,CAET,MAAO,CAAE,MADK,MAAMF,EAAY,CACjB,CACnB,EACA,MAAM,KAAKG,EAAO,CAAE,MAAAC,EAAO,SAAAC,EAAU,QAAAC,GAAW,CAE5C,MAAMC,GADK,MAAMb,EAAa,GACP,YAAYD,EAAW,WAAW,EACnDe,EAAQD,EAAY,YAAYd,CAAS,EAC/C,OAAAW,EAAM,QAAQK,GAAQD,EAAM,IAAIC,CAAI,CAAC,EACrCJ,EAAS,QAAQI,GAAQD,EAAM,IAAIC,CAAI,CAAC,EACxCH,EAAQ,QAAgBG,GAAAD,EAAM,OAAOC,EAAK,EAAE,CAAC,EACtC,IAAI,QAAQ,CAACd,EAASC,IAAW,CACxBW,EAAA,WAAa,IAAMZ,EAAQ,EACvCY,EAAY,QAAU,IAAM,CAAM,IAAAR,EAAI,OAAOH,EAAO,IAAI,QAAQG,EAAKQ,EAAY,SAAW,MAAQR,IAAO,OAAS,OAASA,EAAG,UAAY,mBAAmB,CAAC,CAAG,CAAA,CACtK,CACL,EACA,MAAM,UAAW,CACb,OAAO,QAAQ,QAAQ,CAAA,CAC3B,CACH,CACL"}
1
+ {"version":3,"file":"index.umd.js","sources":["../src/index.ts"],"sourcesContent":["import { createStorageAdapter } from '@signaldb/core';\n/**\n * Opens the IndexedDB database and creates the object store if it doesn't exist.\n * @param databaseName - The name of the database.\n * @param version - The version of the database.\n * @param onUpgrade - Optional callback for handling database upgrades.\n * @returns A promise that resolves with the opened database.\n */\nasync function openDatabase(databaseName, version = 1, onUpgrade) {\n const request = indexedDB.open(databaseName, version);\n const upgradePromise = new Promise((resolve, reject) => {\n request.addEventListener('upgradeneeded', (event) => {\n const database = request.result;\n const tx = request.transaction;\n if (onUpgrade) {\n onUpgrade(database, tx, event.oldVersion, event.newVersion ?? null)\n .then(() => resolve())\n .catch(\n /* istanbul ignore next -- @preserve */\n (error) => {\n reject(error);\n });\n return;\n }\n // No custom upgrade logic provided, resolve immediately\n /* istanbul ignore next -- @preserve */\n resolve();\n });\n });\n const databasePromise = new Promise((resolve, reject) => {\n request.addEventListener('success', () => resolve(request.result));\n request.addEventListener('error', () => reject(new Error(request.error?.message || 'Database error')));\n });\n await Promise.all([\n databasePromise,\n upgradePromise,\n ]);\n return databasePromise;\n}\n/**\n * Creates a persistence adapter for managing a SignalDB collection using IndexedDB.\n * This adapter reads and writes data to an IndexedDB object store, 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 database name.\n * @param options - Optional configuration for the adapter.\n * @param options.prefix - A prefix to be added to the database name (default: 'signaldb-').\n * @returns A SignalDB persistence adapter for managing data in IndexedDB.\n */\nexport default function createIndexedDBAdapter(name, options) {\n const databaseName = options?.databaseName || 'signaldb';\n const storeName = `${name}`;\n let databasePromise = null;\n const getStore = async (writeAccess = false) => {\n const database = await databasePromise;\n if (!database)\n throw new Error('Database not initialized');\n const transaction = database.transaction(storeName, writeAccess ? 'readwrite' : 'readonly');\n const store = transaction.objectStore(storeName);\n return store;\n };\n const readIndex = async (field) => {\n const store = await getStore();\n if (!store.indexNames.contains(field)) {\n throw new Error(`Index on field \"${field}\" does not exist`);\n }\n return new Promise((resolve, reject) => {\n const index = store.index(field);\n const result = new Map();\n const request = index.openCursor();\n request.addEventListener('success', () => {\n const cursor = request.result;\n if (cursor) {\n const key = cursor.key;\n const id = cursor.value.id;\n if (!result.has(key)) {\n result.set(key, new Set());\n }\n result.get(key)?.add(id);\n cursor.continue();\n }\n else {\n resolve(result);\n }\n });\n request.addEventListener('error', () => reject(new Error(request.error?.message || 'Error reading index')));\n });\n };\n let setupCalled = false;\n const indexesToCreate = new Set();\n const indexesToDrop = new Set();\n return createStorageAdapter({\n // lifecycle methods\n setup: async () => {\n setupCalled = true;\n databasePromise = openDatabase(databaseName, options?.version, async (database, tx) => {\n // Ensure the object store exists; if not, create it within the same upgrade transaction\n if (!database.objectStoreNames.contains(storeName)) {\n database.createObjectStore(storeName, {\n keyPath: 'id',\n autoIncrement: true,\n });\n }\n // If there are no index changes, nothing else to do\n if (indexesToCreate.size === 0 && indexesToDrop.size === 0)\n return;\n // Use the provided versionchange transaction to mutate indexes\n const store = tx.objectStore(storeName);\n indexesToCreate.forEach((field) => {\n if (store.indexNames.contains(field))\n return;\n store.createIndex(field, field, { unique: false });\n });\n indexesToDrop.forEach((field) => {\n if (!store.indexNames.contains(field))\n return;\n store.deleteIndex(field);\n });\n });\n await databasePromise;\n },\n teardown: async () => {\n if (!databasePromise)\n return;\n const database = await databasePromise;\n database.close();\n databasePromise = null;\n },\n // data retrieval methods\n readAll: async () => {\n const store = await getStore();\n return new Promise((resolve, reject) => {\n const request = store.getAll();\n request.addEventListener('success', () => resolve(request.result));\n request.addEventListener('error', () => reject(new Error(request.error?.message || 'Error fetching items')));\n });\n },\n readIds: async (ids) => {\n const store = await getStore();\n const results = await Promise.all(ids.map(id => new Promise((resolve, reject) => {\n const request = store.get(id);\n request.addEventListener('success', () => resolve(request.result || null));\n request.addEventListener('error', () => reject(new Error(request.error?.message || 'Error fetching item')));\n })));\n return results.filter(item => item !== null);\n },\n // index methods\n createIndex: async (field) => {\n if (setupCalled)\n throw new Error('createIndex must be called before setup()');\n indexesToCreate.add(field);\n },\n dropIndex: async (field) => {\n if (setupCalled)\n throw new Error('createIndex must be called before setup()');\n indexesToDrop.add(field);\n },\n readIndex,\n // data manipulation methods\n insert: async (newItems) => {\n const store = await getStore(true);\n await Promise.all(newItems.map(item => new Promise((resolve, reject) => {\n const request = store.add(item);\n request.addEventListener('success', () => resolve());\n request.addEventListener('error', () => reject(new Error(request.error?.message || 'Error inserting item')));\n })));\n },\n replace: async (items) => {\n const store = await getStore(true);\n await Promise.all(items.map(item => new Promise((resolve, reject) => {\n const request = store.put(item);\n request.addEventListener('success', () => resolve());\n request.addEventListener('error', () => reject(new Error(request.error?.message || 'Error replacing item')));\n })));\n },\n remove: async (itemsToRemove) => {\n const store = await getStore(true);\n await Promise.all(itemsToRemove.map(async (item) => new Promise((resolve, reject) => {\n const request = store.delete(item.id);\n request.addEventListener('success', () => resolve());\n request.addEventListener('error', () => reject(new Error(request.error?.message || 'Error removing item')));\n })));\n },\n removeAll: async () => {\n const store = await getStore(true);\n return new Promise((resolve, reject) => {\n const request = store.clear();\n request.addEventListener('success', () => resolve());\n request.addEventListener('error', () => reject(new Error(request.error?.message || 'Error clearing items')));\n });\n },\n });\n}\n"],"names":["openDatabase","databaseName","version","onUpgrade","request","upgradePromise","resolve","reject","event","database","tx","error","databasePromise","createIndexedDBAdapter","name","options","storeName","getStore","writeAccess","readIndex","field","store","index","result","cursor","key","id","setupCalled","indexesToCreate","indexesToDrop","createStorageAdapter","ids","item","newItems","items","itemsToRemove"],"mappings":"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"}
package/package.json CHANGED
@@ -1,9 +1,11 @@
1
1
  {
2
2
  "name": "@signaldb/indexeddb",
3
- "version": "1.0.0",
3
+ "version": "2.0.0-beta.0",
4
4
  "description": "",
5
5
  "scripts": {
6
- "build": "rimraf dist && vite build"
6
+ "build": "rimraf dist && vite build",
7
+ "analyze-bundle": "bundle-analyzer ./dist --upload-token=$BUNDLE_ANALYZER_UPLOAD_TOKEN --bundle-name=@signaldb/indexeddb",
8
+ "test": "vitest"
7
9
  },
8
10
  "repository": {
9
11
  "type": "git",
@@ -51,9 +53,9 @@
51
53
  "dist"
52
54
  ],
53
55
  "devDependencies": {
54
- "fake-indexeddb": "6.0.0"
56
+ "fake-indexeddb": "6.2.2"
55
57
  },
56
58
  "peerDependencies": {
57
- "@signaldb/core": "1.x"
59
+ "@signaldb/core": "2.0.0-beta.0"
58
60
  }
59
61
  }