@signaldb/indexeddb 1.0.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 +5 -0
- package/dist/.vite/manifest.json +8 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.mjs +50 -0
- package/dist/index.mjs.map +1 -0
- package/dist/index.umd.js +2 -0
- package/dist/index.umd.js.map +1 -0
- package/package.json +59 -0
package/README.md
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
# @signaldb/indexeddb
|
|
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.
|
|
4
|
+
|
|
5
|
+
See https://signaldb.js.org/reference/indexeddb/ for more information.
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Creates a persistence adapter for managing a SignalDB collection using IndexedDB.
|
|
3
|
+
* This adapter reads and writes data to an IndexedDB object store, 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 database name.
|
|
7
|
+
* @returns A SignalDB persistence adapter for managing data in IndexedDB.
|
|
8
|
+
*/
|
|
9
|
+
export default function createIndexedDBAdapter<T extends {
|
|
10
|
+
id: I;
|
|
11
|
+
} & Record<string, any>, I extends IDBValidKey>(name: string): import("@signaldb/core").PersistenceAdapter<T, I>;
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
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
|
+
};
|
|
14
|
+
});
|
|
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
|
+
};
|
|
27
|
+
});
|
|
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
|
+
};
|
|
40
|
+
});
|
|
41
|
+
},
|
|
42
|
+
async register() {
|
|
43
|
+
return Promise.resolve();
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
export {
|
|
48
|
+
g as default
|
|
49
|
+
};
|
|
50
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +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;"}
|
|
@@ -0,0 +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});
|
|
2
|
+
//# sourceMappingURL=index.umd.js.map
|
|
@@ -0,0 +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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@signaldb/indexeddb",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"build": "rimraf dist && vite build"
|
|
7
|
+
},
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/maxnowack/signaldb.git"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://signaldb.js.org",
|
|
13
|
+
"keywords": [
|
|
14
|
+
"indexeddb",
|
|
15
|
+
"client-database",
|
|
16
|
+
"client",
|
|
17
|
+
"database",
|
|
18
|
+
"local-database",
|
|
19
|
+
"offline-first",
|
|
20
|
+
"optimistic-ui",
|
|
21
|
+
"plugin",
|
|
22
|
+
"reactive",
|
|
23
|
+
"reactivity",
|
|
24
|
+
"solid",
|
|
25
|
+
"synchronization",
|
|
26
|
+
"typescript"
|
|
27
|
+
],
|
|
28
|
+
"author": "Max Nowack <max.nowack@gmail.com>",
|
|
29
|
+
"license": "MIT",
|
|
30
|
+
"sideEffects": false,
|
|
31
|
+
"exports": {
|
|
32
|
+
".": {
|
|
33
|
+
"types": "./dist/index.d.ts",
|
|
34
|
+
"import": "./dist/index.mjs",
|
|
35
|
+
"require": "./dist/index.umd.js",
|
|
36
|
+
"default": "./dist/index.umd.js"
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
"main": "./dist/index.umd.js",
|
|
40
|
+
"module": "./dist/index.mjs",
|
|
41
|
+
"types": "./dist/index.d.ts",
|
|
42
|
+
"typesVersions": {
|
|
43
|
+
"*": {
|
|
44
|
+
"*": [
|
|
45
|
+
"./dist/*",
|
|
46
|
+
"./dist/index.d.ts"
|
|
47
|
+
]
|
|
48
|
+
}
|
|
49
|
+
},
|
|
50
|
+
"files": [
|
|
51
|
+
"dist"
|
|
52
|
+
],
|
|
53
|
+
"devDependencies": {
|
|
54
|
+
"fake-indexeddb": "6.0.0"
|
|
55
|
+
},
|
|
56
|
+
"peerDependencies": {
|
|
57
|
+
"@signaldb/core": "1.x"
|
|
58
|
+
}
|
|
59
|
+
}
|