@slimr/dbsync 0.0.7 → 0.0.9
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 +7 -4
- package/cjs/DbRepository.d.ts +8 -0
- package/cjs/DbRepository.js +10 -0
- package/cjs/DbRepository.js.map +1 -1
- package/cjs/DbSync.d.ts +9 -3
- package/cjs/DbSync.js +11 -4
- package/cjs/DbSync.js.map +1 -1
- package/cjs/DbTxRepository.d.ts +7 -0
- package/cjs/DbTxRepository.js +9 -0
- package/cjs/DbTxRepository.js.map +1 -1
- package/cjs/index.d.ts +1 -0
- package/cjs/internal/DbTransaction.d.ts +9 -0
- package/cjs/internal/DbTransaction.js +11 -0
- package/cjs/internal/DbTransaction.js.map +1 -1
- package/cjs/internal/MigrationManager.d.ts +3 -3
- package/cjs/internal/MigrationManager.js.map +1 -1
- package/cjs/internal/StorageManager.d.ts +8 -1
- package/cjs/internal/StorageManager.js +50 -6
- package/cjs/internal/StorageManager.js.map +1 -1
- package/cjs/useDbQuery.d.ts +7 -2
- package/cjs/useDbQuery.js +10 -6
- package/cjs/useDbQuery.js.map +1 -1
- package/esm/DbRepository.d.ts +8 -0
- package/esm/DbRepository.js +10 -0
- package/esm/DbRepository.js.map +1 -1
- package/esm/DbSync.d.ts +9 -3
- package/esm/DbSync.js +11 -4
- package/esm/DbSync.js.map +1 -1
- package/esm/DbTxRepository.d.ts +7 -0
- package/esm/DbTxRepository.js +9 -0
- package/esm/DbTxRepository.js.map +1 -1
- package/esm/index.d.ts +1 -0
- package/esm/internal/DbTransaction.d.ts +9 -0
- package/esm/internal/DbTransaction.js +11 -0
- package/esm/internal/DbTransaction.js.map +1 -1
- package/esm/internal/MigrationManager.d.ts +3 -3
- package/esm/internal/MigrationManager.js.map +1 -1
- package/esm/internal/StorageManager.d.ts +8 -1
- package/esm/internal/StorageManager.js +50 -6
- package/esm/internal/StorageManager.js.map +1 -1
- package/esm/useDbQuery.d.ts +7 -2
- package/esm/useDbQuery.js +10 -6
- package/esm/useDbQuery.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -34,7 +34,7 @@ const dbAdapter = process.env.TEST ? new LocalAdapter() : new RestAdapter({ url:
|
|
|
34
34
|
const db = new DbSync({
|
|
35
35
|
adapter: dbAdapter,
|
|
36
36
|
tables: {
|
|
37
|
-
posts: { indexes: ['userId', 'updatedAt'] },
|
|
37
|
+
posts: { indexes: ['userId', 'updatedAt'], beforeWrite: () => ({ category: 0 }) },
|
|
38
38
|
users: { indexes: ['email'] }
|
|
39
39
|
}
|
|
40
40
|
});
|
|
@@ -97,6 +97,7 @@ const tx = db.getTransaction();
|
|
|
97
97
|
|
|
98
98
|
tx.put('posts', { id: '1', content: 'Atomic write 1' });
|
|
99
99
|
tx.put('posts', { id: '2', content: 'Atomic write 2' });
|
|
100
|
+
tx.patch('posts', { id: '2', content: 'Atomic write 2b' });
|
|
100
101
|
tx.delete('users', 'bad_user');
|
|
101
102
|
|
|
102
103
|
// Writes hit the database together
|
|
@@ -115,12 +116,13 @@ class Tx {
|
|
|
115
116
|
posts = new DbTxRepository<Post>(this.tx, 'posts');
|
|
116
117
|
users = new DbTxRepository<User>(this.tx, 'users');
|
|
117
118
|
|
|
118
|
-
commit =
|
|
119
|
+
commit = this.tx.commit.bind(this.tx);
|
|
119
120
|
}
|
|
120
121
|
|
|
121
122
|
const tx = new Tx();
|
|
122
123
|
tx.posts.put({ id: '1', content: 'Atomic write 1' });
|
|
123
124
|
tx.posts.put({ id: '2', content: 'Atomic write 2' });
|
|
125
|
+
tx.posts.patch({ id: '2', content: 'Atomic write 2b' });
|
|
124
126
|
tx.users.delete('bad_user');
|
|
125
127
|
|
|
126
128
|
// Writes hit the database together
|
|
@@ -150,9 +152,10 @@ import { useDbQuery } from '@slimr/dbsync/react';
|
|
|
150
152
|
|
|
151
153
|
function PostList({ db }) {
|
|
152
154
|
// Re-renders automatically whenever the 'posts' table changes!
|
|
153
|
-
const posts = useDbQuery(db, 'posts', () => db.findAll('posts'));
|
|
155
|
+
const { value: posts, loading } = useDbQuery(db, 'posts', () => db.findAll('posts'));
|
|
154
156
|
|
|
155
|
-
if (
|
|
157
|
+
if (loading) return <Spinner />;
|
|
158
|
+
if (!posts) return <p>No posts found.</p>;
|
|
156
159
|
return <ul>{posts.map(p => <li key={p.id}>{p.content}</li>)}</ul>;
|
|
157
160
|
}
|
|
158
161
|
```
|
package/cjs/DbRepository.d.ts
CHANGED
|
@@ -50,6 +50,14 @@ export declare class DbRepository<T> {
|
|
|
50
50
|
* @returns A promise resolving when the deletion is complete.
|
|
51
51
|
*/
|
|
52
52
|
delete(key: string | number): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Partially updates an existing record in the object store.
|
|
55
|
+
*
|
|
56
|
+
* @param value The partial object payload.
|
|
57
|
+
* @param key An optional explicit primary key.
|
|
58
|
+
* @returns A promise resolving to the final patched record.
|
|
59
|
+
*/
|
|
60
|
+
patch(value: Partial<T>, key?: string | number): Promise<T>;
|
|
53
61
|
/**
|
|
54
62
|
* Discards all records present in the object store.
|
|
55
63
|
*
|
package/cjs/DbRepository.js
CHANGED
|
@@ -65,6 +65,16 @@ class DbRepository {
|
|
|
65
65
|
async delete(key) {
|
|
66
66
|
return this.db.delete(this.storeName, key);
|
|
67
67
|
}
|
|
68
|
+
/**
|
|
69
|
+
* Partially updates an existing record in the object store.
|
|
70
|
+
*
|
|
71
|
+
* @param value The partial object payload.
|
|
72
|
+
* @param key An optional explicit primary key.
|
|
73
|
+
* @returns A promise resolving to the final patched record.
|
|
74
|
+
*/
|
|
75
|
+
async patch(value, key) {
|
|
76
|
+
return this.db.patch(this.storeName, value, key);
|
|
77
|
+
}
|
|
68
78
|
/**
|
|
69
79
|
* Discards all records present in the object store.
|
|
70
80
|
*
|
package/cjs/DbRepository.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DbRepository.js","sourceRoot":"","sources":["../src/DbRepository.ts"],"names":[],"mappings":";;;AAEA;;;;GAIG;AACH,MAAa,YAAY;IAQb;IACM;IARjB;;;;;OAKG;IACH,YACW,EAAU,EACJ,SAAiB;QADvB,OAAE,GAAF,EAAE,CAAQ;QACJ,cAAS,GAAT,SAAS,CAAQ;IAC/B,CAAC;IAEJ;;;;;OAKG;IACH,KAAK,CAAC,QAAQ,CAAC,EAAmB;QACjC,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,CAAI,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;IAC1C,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO;QACZ,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAI,IAAI,CAAC,SAAS,CAAC,CAAA;IAC1C,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,GAAG,CAAC,KAAiB,EAAE,GAAqB;QACjD,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,CAAI,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;IAClD,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,GAAG,CAAC,KAAQ,EAAE,GAAqB;QACxC,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,CAAI,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;IAClD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,MAAM,CAAC,GAAoB;QAChC,OAAO,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;IAC3C,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK;QACV,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACrC,CAAC;CACD;
|
|
1
|
+
{"version":3,"file":"DbRepository.js","sourceRoot":"","sources":["../src/DbRepository.ts"],"names":[],"mappings":";;;AAEA;;;;GAIG;AACH,MAAa,YAAY;IAQb;IACM;IARjB;;;;;OAKG;IACH,YACW,EAAU,EACJ,SAAiB;QADvB,OAAE,GAAF,EAAE,CAAQ;QACJ,cAAS,GAAT,SAAS,CAAQ;IAC/B,CAAC;IAEJ;;;;;OAKG;IACH,KAAK,CAAC,QAAQ,CAAC,EAAmB;QACjC,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,CAAI,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;IAC1C,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO;QACZ,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAI,IAAI,CAAC,SAAS,CAAC,CAAA;IAC1C,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,GAAG,CAAC,KAAiB,EAAE,GAAqB;QACjD,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,CAAI,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;IAClD,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,GAAG,CAAC,KAAQ,EAAE,GAAqB;QACxC,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,CAAI,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;IAClD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,MAAM,CAAC,GAAoB;QAChC,OAAO,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;IAC3C,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,KAAK,CAAC,KAAiB,EAAE,GAAqB;QACnD,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,CAAI,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;IACpD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK;QACV,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACrC,CAAC;CACD;AAlFD,oCAkFC"}
|
package/cjs/DbSync.d.ts
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
import type { BackendAdapter } from "./adapters/types.js";
|
|
2
2
|
import { type SyncState } from "./internal/EventBus.js";
|
|
3
3
|
import { StorageManager } from "./internal/StorageManager.js";
|
|
4
|
+
export interface DbSyncTableConfig {
|
|
5
|
+
/** Optional index names to create for the store. */
|
|
6
|
+
indexes?: string[];
|
|
7
|
+
/** Optional callback that fills in default fields before write operations. */
|
|
8
|
+
beforeWrite?: (value: any) => any;
|
|
9
|
+
}
|
|
4
10
|
export interface DbSyncConfig {
|
|
5
11
|
/** The backend adapter used for authentication and synchronization. */
|
|
6
12
|
adapter: BackendAdapter;
|
|
7
13
|
/** Optional fixed IndexedDB version. */
|
|
8
14
|
version?: number;
|
|
9
15
|
/** The object stores and their index definitions. */
|
|
10
|
-
tables: Record<string,
|
|
11
|
-
indexes?: string[];
|
|
12
|
-
}>;
|
|
16
|
+
tables: Record<string, DbSyncTableConfig>;
|
|
13
17
|
}
|
|
14
18
|
export type { SyncState };
|
|
15
19
|
/**
|
|
@@ -48,6 +52,8 @@ export declare class DbSync {
|
|
|
48
52
|
findAll<T>(storeName: string): Promise<T[]>;
|
|
49
53
|
/** Inserts a new record into the given object store. */
|
|
50
54
|
add<T>(storeName: string, value: any, key?: string | number): Promise<T>;
|
|
55
|
+
/** Partially updates an existing record in the given object store. */
|
|
56
|
+
patch<T>(storeName: string, value: Partial<T>, key?: string | number): Promise<T>;
|
|
51
57
|
/** Upserts a record into the given object store. */
|
|
52
58
|
put<T>(storeName: string, value: any, key?: string | number): Promise<T>;
|
|
53
59
|
/** Deletes a record from the given object store. */
|
package/cjs/DbSync.js
CHANGED
|
@@ -33,7 +33,9 @@ class DbSync {
|
|
|
33
33
|
const adapter = config.adapter;
|
|
34
34
|
const onSchemaChange = () => this.onSchemaChangeDetected();
|
|
35
35
|
this.storage = new StorageManager_js_1.StorageManager(config, this.events, onSchemaChange);
|
|
36
|
-
this.authManager = new AuthManager_js_1.AuthManager(adapter, this.storage, () => {
|
|
36
|
+
this.authManager = new AuthManager_js_1.AuthManager(adapter, this.storage, () => {
|
|
37
|
+
void this.stop();
|
|
38
|
+
});
|
|
37
39
|
this.syncEngine = new SyncEngine_js_1.SyncEngine(config, this.syncInterval, this.events, this.storage, this.authManager, adapter, onSchemaChange);
|
|
38
40
|
}
|
|
39
41
|
/** Returns a fresh RFC-4122 UUID. */
|
|
@@ -62,13 +64,18 @@ class DbSync {
|
|
|
62
64
|
}
|
|
63
65
|
/** Inserts a new record into the given object store. */
|
|
64
66
|
async add(storeName, value, key) {
|
|
65
|
-
await this.storage.executeTransaction([{ type: "add", storeName, value, key }]);
|
|
67
|
+
const [executedWrite] = await this.storage.executeTransaction([{ type: "add", storeName, value, key }]);
|
|
68
|
+
return executedWrite?.value;
|
|
69
|
+
}
|
|
70
|
+
/** Partially updates an existing record in the given object store. */
|
|
71
|
+
async patch(storeName, value, key) {
|
|
72
|
+
await this.storage.executeTransaction([{ type: "patch", storeName, value, key }]);
|
|
66
73
|
return value;
|
|
67
74
|
}
|
|
68
75
|
/** Upserts a record into the given object store. */
|
|
69
76
|
async put(storeName, value, key) {
|
|
70
|
-
await this.storage.executeTransaction([{ type: "put", storeName, value, key }]);
|
|
71
|
-
return value;
|
|
77
|
+
const [executedWrite] = await this.storage.executeTransaction([{ type: "put", storeName, value, key }]);
|
|
78
|
+
return executedWrite?.value;
|
|
72
79
|
}
|
|
73
80
|
/** Deletes a record from the given object store. */
|
|
74
81
|
async delete(storeName, key) {
|
package/cjs/DbSync.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DbSync.js","sourceRoot":"","sources":["../src/DbSync.ts"],"names":[],"mappings":";;;AACA,8DAAuD;AACvD,wDAAiE;AACjE,oEAA6D;AAC7D,4DAAqD;AACrD,kDAA6C;
|
|
1
|
+
{"version":3,"file":"DbSync.js","sourceRoot":"","sources":["../src/DbSync.ts"],"names":[],"mappings":"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"}
|
package/cjs/DbTxRepository.d.ts
CHANGED
|
@@ -34,6 +34,13 @@ export declare class DbTxRepository<T> {
|
|
|
34
34
|
* @param key The primary key of the record to delete.
|
|
35
35
|
*/
|
|
36
36
|
delete(key: string | number): void;
|
|
37
|
+
/**
|
|
38
|
+
* Queues a partial update operation for an existing record.
|
|
39
|
+
*
|
|
40
|
+
* @param value The object partial payload to patch.
|
|
41
|
+
* @param key An optional explicit primary key.
|
|
42
|
+
*/
|
|
43
|
+
patch(value: Partial<T>, key?: string | number): void;
|
|
37
44
|
/**
|
|
38
45
|
* Queues an operation to remove all records from the object store.
|
|
39
46
|
*/
|
package/cjs/DbTxRepository.js
CHANGED
|
@@ -45,6 +45,15 @@ class DbTxRepository {
|
|
|
45
45
|
delete(key) {
|
|
46
46
|
this.tx.delete(this.storeName, key);
|
|
47
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Queues a partial update operation for an existing record.
|
|
50
|
+
*
|
|
51
|
+
* @param value The object partial payload to patch.
|
|
52
|
+
* @param key An optional explicit primary key.
|
|
53
|
+
*/
|
|
54
|
+
patch(value, key) {
|
|
55
|
+
this.tx.patch(this.storeName, value, key);
|
|
56
|
+
}
|
|
48
57
|
/**
|
|
49
58
|
* Queues an operation to remove all records from the object store.
|
|
50
59
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DbTxRepository.js","sourceRoot":"","sources":["../src/DbTxRepository.ts"],"names":[],"mappings":";;;AAEA;;;;GAIG;AACH,MAAa,cAAc;IAQf;IACM;IARjB;;;;;OAKG;IACH,YACW,EAAiB,EACX,SAAiB;QADvB,OAAE,GAAF,EAAE,CAAe;QACX,cAAS,GAAT,SAAS,CAAQ;IAC/B,CAAC;IAEJ;;;;;OAKG;IACH,GAAG,CAAC,KAAiB,EAAE,GAAqB;QAC3C,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;IACxC,CAAC;IAED;;;;;OAKG;IACH,GAAG,CAAC,KAAQ,EAAE,GAAqB;QAClC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;IACxC,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,GAAoB;QAC1B,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;IACpC,CAAC;IAED;;OAEG;IACH,KAAK;QACJ,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC9B,CAAC;CACD;
|
|
1
|
+
{"version":3,"file":"DbTxRepository.js","sourceRoot":"","sources":["../src/DbTxRepository.ts"],"names":[],"mappings":";;;AAEA;;;;GAIG;AACH,MAAa,cAAc;IAQf;IACM;IARjB;;;;;OAKG;IACH,YACW,EAAiB,EACX,SAAiB;QADvB,OAAE,GAAF,EAAE,CAAe;QACX,cAAS,GAAT,SAAS,CAAQ;IAC/B,CAAC;IAEJ;;;;;OAKG;IACH,GAAG,CAAC,KAAiB,EAAE,GAAqB;QAC3C,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;IACxC,CAAC;IAED;;;;;OAKG;IACH,GAAG,CAAC,KAAQ,EAAE,GAAqB;QAClC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;IACxC,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,GAAoB;QAC1B,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;IACpC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,KAAiB,EAAE,GAAqB;QAC7C,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK;QACJ,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC9B,CAAC;CACD;AAzDD,wCAyDC"}
|
package/cjs/index.d.ts
CHANGED
|
@@ -34,6 +34,15 @@ export declare class DbTransaction {
|
|
|
34
34
|
* @param key An optional explicit primary key.
|
|
35
35
|
*/
|
|
36
36
|
put(storeName: string, value: any, key?: string | number): void;
|
|
37
|
+
/**
|
|
38
|
+
* Queues a partial update of an existing record.
|
|
39
|
+
* Fails if the primary key does not already exist in the database.
|
|
40
|
+
*
|
|
41
|
+
* @param storeName The name of the target object store.
|
|
42
|
+
* @param value The partial object payload containing the primary key and fields to update.
|
|
43
|
+
* @param key An optional explicit primary key.
|
|
44
|
+
*/
|
|
45
|
+
patch(storeName: string, value: any, key?: string | number): void;
|
|
37
46
|
/**
|
|
38
47
|
* Queues a deletion operation.
|
|
39
48
|
*
|
|
@@ -44,6 +44,17 @@ class DbTransaction {
|
|
|
44
44
|
put(storeName, value, key) {
|
|
45
45
|
this.operations.push({ type: "put", storeName, value, key });
|
|
46
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Queues a partial update of an existing record.
|
|
49
|
+
* Fails if the primary key does not already exist in the database.
|
|
50
|
+
*
|
|
51
|
+
* @param storeName The name of the target object store.
|
|
52
|
+
* @param value The partial object payload containing the primary key and fields to update.
|
|
53
|
+
* @param key An optional explicit primary key.
|
|
54
|
+
*/
|
|
55
|
+
patch(storeName, value, key) {
|
|
56
|
+
this.operations.push({ type: "patch", storeName, value, key });
|
|
57
|
+
}
|
|
47
58
|
/**
|
|
48
59
|
* Queues a deletion operation.
|
|
49
60
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DbTransaction.js","sourceRoot":"","sources":["../../src/internal/DbTransaction.ts"],"names":[],"mappings":";AAAA,8CAA8C;;;AAE9C;;;;GAIG;AACH,MAAa,aAAa;IAmBL;IAlBpB;;;OAGG;IACK,UAAU,GAKZ,EAAE,CAAA;IAER;;;;;;OAMG;IACH,YAAoB,QAAuC;QAAvC,aAAQ,GAAR,QAAQ,CAA+B;IAAG,CAAC;IAE/D;;;;;;OAMG;IACH,GAAG,CAAC,SAAiB,EAAE,KAAU,EAAE,GAAqB;QACvD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IAC7D,CAAC;IAED;;;;;;OAMG;IACH,GAAG,CAAC,SAAiB,EAAE,KAAU,EAAE,GAAqB;QACvD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IAC7D,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,SAAiB,EAAE,GAAoB;QAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAA;IACzD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,SAAiB;QACtB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAA;IACnD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM;QACX,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QACxC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACtC,CAAC;IAED;;OAEG;IACH,MAAM;QACL,IAAI,CAAC,UAAU,GAAG,EAAE,CAAA;IACrB,CAAC;CACD;
|
|
1
|
+
{"version":3,"file":"DbTransaction.js","sourceRoot":"","sources":["../../src/internal/DbTransaction.ts"],"names":[],"mappings":";AAAA,8CAA8C;;;AAE9C;;;;GAIG;AACH,MAAa,aAAa;IAmBL;IAlBpB;;;OAGG;IACK,UAAU,GAKZ,EAAE,CAAA;IAER;;;;;;OAMG;IACH,YAAoB,QAAuC;QAAvC,aAAQ,GAAR,QAAQ,CAA+B;IAAG,CAAC;IAE/D;;;;;;OAMG;IACH,GAAG,CAAC,SAAiB,EAAE,KAAU,EAAE,GAAqB;QACvD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IAC7D,CAAC;IAED;;;;;;OAMG;IACH,GAAG,CAAC,SAAiB,EAAE,KAAU,EAAE,GAAqB;QACvD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IAC7D,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,SAAiB,EAAE,KAAU,EAAE,GAAqB;QACzD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IAC/D,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,SAAiB,EAAE,GAAoB;QAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAA;IACzD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,SAAiB;QACtB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAA;IACnD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM;QACX,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QACxC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACtC,CAAC;IAED;;OAEG;IACH,MAAM;QACL,IAAI,CAAC,UAAU,GAAG,EAAE,CAAA;IACrB,CAAC;CACD;AA1FD,sCA0FC"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Migrations allow existing offline data to be selectively upgraded rather than wiped
|
|
4
4
|
* when backend domain modeling changes.
|
|
5
5
|
*/
|
|
6
|
-
export interface
|
|
6
|
+
export interface MigrationManagerMigration<T = any> {
|
|
7
7
|
/**
|
|
8
8
|
* An ascending integer determining execution order. A record currently at `storeVersion: 1`
|
|
9
9
|
* will only trigger migrations where `version >= 2`.
|
|
@@ -39,7 +39,7 @@ export declare class MigrationManager {
|
|
|
39
39
|
*
|
|
40
40
|
* @param schemaMigrations A dictionary mapping store names to arrays of `IMigration` steps.
|
|
41
41
|
*/
|
|
42
|
-
runAll(schemaMigrations: Record<string,
|
|
42
|
+
runAll(schemaMigrations: Record<string, MigrationManagerMigration[]>): Promise<void>;
|
|
43
43
|
/**
|
|
44
44
|
* Sorts and attempts to apply a sequence of migrations to a single record in memory.
|
|
45
45
|
* Evaluates `storeVersion` to ensure migrations are only executed sequentially and exactly once.
|
|
@@ -48,7 +48,7 @@ export declare class MigrationManager {
|
|
|
48
48
|
* @param migrations The full list of potential migrations for the record's domain type.
|
|
49
49
|
* @returns The functionally upgraded record with an updated `storeVersion`.
|
|
50
50
|
*/
|
|
51
|
-
static upgradeRecord<T>(record: any, migrations:
|
|
51
|
+
static upgradeRecord<T>(record: any, migrations: MigrationManagerMigration<T>[]): Promise<any>;
|
|
52
52
|
/**
|
|
53
53
|
* Reads all records from a specific store, upgrades out-of-date entries,
|
|
54
54
|
* and atomically flushes the changed entries back within a single database transaction.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MigrationManager.js","sourceRoot":"","sources":["../../src/internal/MigrationManager.ts"],"names":[],"mappings":";;;AA0BA;;;GAGG;AACH,MAAa,gBAAgB;IAOR;IANpB;;;;;OAKG;IACH,YAAoB,EAAO;QAAP,OAAE,GAAF,EAAE,CAAK;IAAG,CAAC,CAAC,wBAAwB;IAExD;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"MigrationManager.js","sourceRoot":"","sources":["../../src/internal/MigrationManager.ts"],"names":[],"mappings":";;;AA0BA;;;GAGG;AACH,MAAa,gBAAgB;IAOR;IANpB;;;;;OAKG;IACH,YAAoB,EAAO;QAAP,OAAE,GAAF,EAAE,CAAK;IAAG,CAAC,CAAC,wBAAwB;IAExD;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,gBAA6D;QACzE,KAAK,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACxE,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;QAC/C,CAAC;IACF,CAAC;IAED;;;;;;;OAOG;IACI,MAAM,CAAC,KAAK,CAAC,aAAa,CAAI,MAAW,EAAE,UAA0C;QAC3F,MAAM,gBAAgB,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAA;QAC9E,KAAK,MAAM,SAAS,IAAI,gBAAgB,EAAE,CAAC;YAC1C,MAAM,cAAc,GAAG,MAAM,CAAC,YAAY,IAAI,CAAC,CAAA;YAC/C,IAAI,cAAc,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;gBACxC,MAAM,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;gBAC/B,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC,OAAO,CAAA;YACxC,CAAC;QACF,CAAC;QACD,OAAO,MAAM,CAAA;IACd,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,YAAY,CAAC,SAAiB,EAAE,UAAuC;QACpF,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QACnD,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAA;QAEnC,KAAK,MAAM,aAAa,IAAI,UAAU,EAAE,CAAC;YACxC,MAAM,UAAU,GAAG,EAAE,GAAG,aAAa,EAAE,CAAA;YACvC,MAAM,gBAAgB,CAAC,aAAa,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;YAE5D,IAAI,UAAU,CAAC,YAAY,KAAK,aAAa,CAAC,YAAY,EAAE,CAAC;gBAC5D,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;YAC9B,CAAC;QACF,CAAC;QAED,MAAM,EAAE,CAAC,MAAM,EAAE,CAAA;IAClB,CAAC;CACD;AA9DD,4CA8DC"}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import type { DbSyncConfig } from "../DbSync.js";
|
|
2
2
|
import { DbTransaction } from "./DbTransaction.js";
|
|
3
3
|
import type { EventBus } from "./EventBus.js";
|
|
4
|
+
type ExecutedWrite = {
|
|
5
|
+
type: string;
|
|
6
|
+
storeName: string;
|
|
7
|
+
value?: any;
|
|
8
|
+
key?: string | number;
|
|
9
|
+
};
|
|
4
10
|
/**
|
|
5
11
|
* Owns IndexedDB initialization, transactions, and record access.
|
|
6
12
|
*/
|
|
@@ -29,7 +35,7 @@ export declare class StorageManager {
|
|
|
29
35
|
/** Opens IndexedDB and creates the configured stores when needed. */
|
|
30
36
|
init(): Promise<void>;
|
|
31
37
|
/** Executes a batch of writes inside a single IndexedDB transaction. */
|
|
32
|
-
executeTransaction(operations: any[]): Promise<
|
|
38
|
+
executeTransaction(operations: any[]): Promise<ExecutedWrite[]>;
|
|
33
39
|
/** Reads a typed record by primary key from the requested store. */
|
|
34
40
|
get<T>(storeName: string, id: string | number): Promise<T | undefined>;
|
|
35
41
|
/** Returns every record from the requested store. */
|
|
@@ -39,3 +45,4 @@ export declare class StorageManager {
|
|
|
39
45
|
/** Closes the underlying IndexedDB connection. */
|
|
40
46
|
dispose(): void;
|
|
41
47
|
}
|
|
48
|
+
export {};
|
|
@@ -42,7 +42,9 @@ class StorageManager {
|
|
|
42
42
|
}
|
|
43
43
|
/** Creates a transaction wrapper used by the sync engine and public facade. */
|
|
44
44
|
getTransaction() {
|
|
45
|
-
return new DbTransaction_js_1.DbTransaction((operations) =>
|
|
45
|
+
return new DbTransaction_js_1.DbTransaction(async (operations) => {
|
|
46
|
+
await this.executeTransaction(operations);
|
|
47
|
+
});
|
|
46
48
|
}
|
|
47
49
|
/** Opens IndexedDB and creates the configured stores when needed. */
|
|
48
50
|
async init() {
|
|
@@ -93,23 +95,65 @@ class StorageManager {
|
|
|
93
95
|
"dirtyQueue",
|
|
94
96
|
"deletedQueue",
|
|
95
97
|
]);
|
|
98
|
+
const executedWrites = [];
|
|
99
|
+
// Pre-fetch objects for patch operations using a separate read-only transaction.
|
|
100
|
+
// A standard IndexedDB transaction auto-commits if we await inside it, so we must
|
|
101
|
+
// gather everything into memory synchronously before opening the main readwrite transaction.
|
|
102
|
+
const patchOperations = operations.filter((o) => o.type === "patch");
|
|
103
|
+
const patchRecords = {};
|
|
104
|
+
if (patchOperations.length > 0) {
|
|
105
|
+
const preTx = this.db.transaction(storeNames, "readonly");
|
|
106
|
+
const fetchPromises = patchOperations.map(async (op) => {
|
|
107
|
+
const recordId = String(op.key || op.value?.id);
|
|
108
|
+
const { promise: p, resolve: r, reject: rej } = (0, promiseWithResolvers_js_1.promiseWithResolvers)();
|
|
109
|
+
const getReq = preTx.objectStore(op.storeName).get(recordId);
|
|
110
|
+
getReq.onsuccess = () => r(getReq.result);
|
|
111
|
+
getReq.onerror = () => rej(getReq.error);
|
|
112
|
+
const existingRecord = await p;
|
|
113
|
+
if (!existingRecord) {
|
|
114
|
+
throw new Error(`[dbsync]: Cannot patch record ${recordId} in ${op.storeName} because it doesn't exist`);
|
|
115
|
+
}
|
|
116
|
+
patchRecords[`${op.storeName}-${recordId}`] = existingRecord;
|
|
117
|
+
});
|
|
118
|
+
await Promise.all(fetchPromises);
|
|
119
|
+
}
|
|
120
|
+
// Now execute the actual write bundle synchronously
|
|
96
121
|
const { promise, resolve, reject } = (0, promiseWithResolvers_js_1.promiseWithResolvers)();
|
|
97
122
|
const tx = this.db.transaction(storeNames, "readwrite");
|
|
98
123
|
tx.oncomplete = () => {
|
|
99
124
|
this.events.notifySubscribers(storeNames);
|
|
100
|
-
resolve();
|
|
125
|
+
resolve(executedWrites);
|
|
101
126
|
};
|
|
102
127
|
tx.onerror = () => reject(tx.error);
|
|
103
128
|
operations.forEach((op) => {
|
|
104
129
|
const store = tx.objectStore(op.storeName);
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
130
|
+
let payloadToWrite = op.value;
|
|
131
|
+
let recordId = op.key || op.value?.id;
|
|
132
|
+
if (op.type === "put" || op.type === "add" || op.type === "patch") {
|
|
133
|
+
if (op.type === "put" || op.type === "add") {
|
|
134
|
+
const beforeWrite = this.config.tables[op.storeName]?.beforeWrite;
|
|
135
|
+
if (beforeWrite) {
|
|
136
|
+
payloadToWrite = beforeWrite(payloadToWrite);
|
|
137
|
+
}
|
|
138
|
+
recordId = op.key || payloadToWrite?.id;
|
|
139
|
+
}
|
|
140
|
+
else if (op.type === "patch") {
|
|
141
|
+
const existingRecord = patchRecords[`${op.storeName}-${recordId}`];
|
|
142
|
+
payloadToWrite = { ...existingRecord, ...op.value };
|
|
143
|
+
recordId = op.key || payloadToWrite?.id;
|
|
144
|
+
}
|
|
145
|
+
store.put(payloadToWrite);
|
|
146
|
+
executedWrites.push({
|
|
147
|
+
type: op.type,
|
|
148
|
+
storeName: op.storeName,
|
|
149
|
+
value: payloadToWrite,
|
|
150
|
+
key: recordId,
|
|
151
|
+
});
|
|
108
152
|
if (op.storeName !== "dirtyQueue" && op.storeName !== "deletedQueue") {
|
|
109
153
|
tx.objectStore("dirtyQueue").put({
|
|
110
154
|
id: recordId,
|
|
111
155
|
table: op.storeName,
|
|
112
|
-
payload:
|
|
156
|
+
payload: payloadToWrite,
|
|
113
157
|
timestamp: Date.now(),
|
|
114
158
|
});
|
|
115
159
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StorageManager.js","sourceRoot":"","sources":["../../src/internal/StorageManager.ts"],"names":[],"mappings":";;;AACA,6EAAsE;AACtE,yDAAkD;
|
|
1
|
+
{"version":3,"file":"StorageManager.js","sourceRoot":"","sources":["../../src/internal/StorageManager.ts"],"names":[],"mappings":"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"}
|
package/cjs/useDbQuery.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import type { DbSync } from "./DbSync.js";
|
|
2
|
+
type DbQueryState<T> = {
|
|
3
|
+
value: T | null;
|
|
4
|
+
loading: boolean;
|
|
5
|
+
};
|
|
2
6
|
/**
|
|
3
7
|
* A React hook that subscribes to one or more `DbSync` tables and natively
|
|
4
8
|
* re-evaluates a strictly typed query function whenever local mutations or
|
|
@@ -8,6 +12,7 @@ import type { DbSync } from "./DbSync.js";
|
|
|
8
12
|
* @param stores A string or array of strings containing the table names the query function reads from.
|
|
9
13
|
* @param queryFn An asynchronous function invoked to pull data from IndexedDB.
|
|
10
14
|
* @param deps A standard React dependency array for parameters referenced inside the `queryFn`.
|
|
11
|
-
* @returns
|
|
15
|
+
* @returns An object containing the latest query result and whether the initial fetch is still pending.
|
|
12
16
|
*/
|
|
13
|
-
export declare function useDbQuery<T>(db: DbSync, stores: string | string[], queryFn: () => Promise<T>, deps?: any[]): T
|
|
17
|
+
export declare function useDbQuery<T>(db: DbSync, stores: string | string[], queryFn: () => Promise<T>, deps?: any[]): DbQueryState<T>;
|
|
18
|
+
export {};
|
package/cjs/useDbQuery.js
CHANGED
|
@@ -11,11 +11,11 @@ const react_1 = require("react");
|
|
|
11
11
|
* @param stores A string or array of strings containing the table names the query function reads from.
|
|
12
12
|
* @param queryFn An asynchronous function invoked to pull data from IndexedDB.
|
|
13
13
|
* @param deps A standard React dependency array for parameters referenced inside the `queryFn`.
|
|
14
|
-
* @returns
|
|
14
|
+
* @returns An object containing the latest query result and whether the initial fetch is still pending.
|
|
15
15
|
*/
|
|
16
16
|
function useDbQuery(db, stores, queryFn, deps = []) {
|
|
17
|
-
/** Holds the latest query result. */
|
|
18
|
-
const [
|
|
17
|
+
/** Holds the latest query result and loading state. */
|
|
18
|
+
const [state, setState] = (0, react_1.useState)({ value: null, loading: true });
|
|
19
19
|
/** Normalizes the store input into an array for matching. */
|
|
20
20
|
const storeArray = Array.isArray(stores) ? stores : [stores];
|
|
21
21
|
(0, react_1.useEffect)(() => {
|
|
@@ -34,11 +34,15 @@ function useDbQuery(db, stores, queryFn, deps = []) {
|
|
|
34
34
|
}
|
|
35
35
|
try {
|
|
36
36
|
const result = await queryFn();
|
|
37
|
-
if (isMounted)
|
|
38
|
-
|
|
37
|
+
if (isMounted) {
|
|
38
|
+
setState({ value: result ?? null, loading: false });
|
|
39
|
+
}
|
|
39
40
|
}
|
|
40
41
|
catch (err) {
|
|
41
42
|
console.error("[dbsync useDbQuery]: Query failed", err);
|
|
43
|
+
if (isMounted) {
|
|
44
|
+
setState((current) => ({ ...current, loading: false }));
|
|
45
|
+
}
|
|
42
46
|
}
|
|
43
47
|
};
|
|
44
48
|
// Initial fetch
|
|
@@ -56,6 +60,6 @@ function useDbQuery(db, stores, queryFn, deps = []) {
|
|
|
56
60
|
};
|
|
57
61
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
58
62
|
}, [db, JSON.stringify(storeArray), ...deps]);
|
|
59
|
-
return
|
|
63
|
+
return state;
|
|
60
64
|
}
|
|
61
65
|
//# sourceMappingURL=useDbQuery.js.map
|
package/cjs/useDbQuery.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDbQuery.js","sourceRoot":"","sources":["../src/useDbQuery.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"useDbQuery.js","sourceRoot":"","sources":["../src/useDbQuery.ts"],"names":[],"mappings":";;AAmBA,gCA0DC;AA7ED,iCAA2C;AAQ3C;;;;;;;;;;GAUG;AACH,SAAgB,UAAU,CACzB,EAAU,EACV,MAAyB,EACzB,OAAyB,EACzB,OAAc,EAAE;IAEhB,uDAAuD;IACvD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,IAAA,gBAAQ,EAAkB,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;IACnF,6DAA6D;IAC7D,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;IAE5D,IAAA,iBAAS,EAAC,GAAG,EAAE;QACd,IAAI,SAAS,GAAG,IAAI,CAAA;QAEpB,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;YAC5B,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;gBACjB,oDAAoD;gBACpD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;oBACnC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;wBAC9B,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;4BAC9B,aAAa,CAAC,KAAK,CAAC,CAAA;4BACpB,OAAO,EAAE,CAAA;wBACV,CAAC;oBACF,CAAC,EAAE,EAAE,CAAC,CAAA;gBACP,CAAC,CAAC,CAAA;YACH,CAAC;YACD,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAA;gBAC9B,IAAI,SAAS,EAAE,CAAC;oBACf,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,IAAI,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;gBACpD,CAAC;YACF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,GAAG,CAAC,CAAA;gBACvD,IAAI,SAAS,EAAE,CAAC;oBACf,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;gBACxD,CAAC;YACF,CAAC;QACF,CAAC,CAAA;QAED,gBAAgB;QAChB,SAAS,EAAE,CAAA;QAEX,+BAA+B;QAC/B,MAAM,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,aAAa,EAAE,EAAE;YAC1C,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;YACtE,IAAI,YAAY,EAAE,CAAC;gBAClB,SAAS,EAAE,CAAA;YACZ,CAAC;QACF,CAAC,CAAC,CAAA;QAEF,OAAO,GAAG,EAAE;YACX,SAAS,GAAG,KAAK,CAAA;YACjB,GAAG,CAAC,KAAK,EAAE,CAAA;QACZ,CAAC,CAAA;QACD,uDAAuD;IACxD,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;IAE7C,OAAO,KAAK,CAAA;AACb,CAAC"}
|
package/esm/DbRepository.d.ts
CHANGED
|
@@ -50,6 +50,14 @@ export declare class DbRepository<T> {
|
|
|
50
50
|
* @returns A promise resolving when the deletion is complete.
|
|
51
51
|
*/
|
|
52
52
|
delete(key: string | number): Promise<void>;
|
|
53
|
+
/**
|
|
54
|
+
* Partially updates an existing record in the object store.
|
|
55
|
+
*
|
|
56
|
+
* @param value The partial object payload.
|
|
57
|
+
* @param key An optional explicit primary key.
|
|
58
|
+
* @returns A promise resolving to the final patched record.
|
|
59
|
+
*/
|
|
60
|
+
patch(value: Partial<T>, key?: string | number): Promise<T>;
|
|
53
61
|
/**
|
|
54
62
|
* Discards all records present in the object store.
|
|
55
63
|
*
|
package/esm/DbRepository.js
CHANGED
|
@@ -62,6 +62,16 @@ export class DbRepository {
|
|
|
62
62
|
async delete(key) {
|
|
63
63
|
return this.db.delete(this.storeName, key);
|
|
64
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Partially updates an existing record in the object store.
|
|
67
|
+
*
|
|
68
|
+
* @param value The partial object payload.
|
|
69
|
+
* @param key An optional explicit primary key.
|
|
70
|
+
* @returns A promise resolving to the final patched record.
|
|
71
|
+
*/
|
|
72
|
+
async patch(value, key) {
|
|
73
|
+
return this.db.patch(this.storeName, value, key);
|
|
74
|
+
}
|
|
65
75
|
/**
|
|
66
76
|
* Discards all records present in the object store.
|
|
67
77
|
*
|
package/esm/DbRepository.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DbRepository.js","sourceRoot":"","sources":["../src/DbRepository.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,OAAO,YAAY;IAQb;IACM;IARjB;;;;;OAKG;IACH,YACW,EAAU,EACJ,SAAiB;QADvB,OAAE,GAAF,EAAE,CAAQ;QACJ,cAAS,GAAT,SAAS,CAAQ;IAC/B,CAAC;IAEJ;;;;;OAKG;IACH,KAAK,CAAC,QAAQ,CAAC,EAAmB;QACjC,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,CAAI,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;IAC1C,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO;QACZ,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAI,IAAI,CAAC,SAAS,CAAC,CAAA;IAC1C,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,GAAG,CAAC,KAAiB,EAAE,GAAqB;QACjD,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,CAAI,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;IAClD,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,GAAG,CAAC,KAAQ,EAAE,GAAqB;QACxC,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,CAAI,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;IAClD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,MAAM,CAAC,GAAoB;QAChC,OAAO,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;IAC3C,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK;QACV,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACrC,CAAC;CACD"}
|
|
1
|
+
{"version":3,"file":"DbRepository.js","sourceRoot":"","sources":["../src/DbRepository.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,OAAO,YAAY;IAQb;IACM;IARjB;;;;;OAKG;IACH,YACW,EAAU,EACJ,SAAiB;QADvB,OAAE,GAAF,EAAE,CAAQ;QACJ,cAAS,GAAT,SAAS,CAAQ;IAC/B,CAAC;IAEJ;;;;;OAKG;IACH,KAAK,CAAC,QAAQ,CAAC,EAAmB;QACjC,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,CAAI,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,CAAA;IAC1C,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,OAAO;QACZ,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,CAAI,IAAI,CAAC,SAAS,CAAC,CAAA;IAC1C,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,GAAG,CAAC,KAAiB,EAAE,GAAqB;QACjD,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,CAAI,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;IAClD,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,GAAG,CAAC,KAAQ,EAAE,GAAqB;QACxC,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,CAAI,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;IAClD,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,MAAM,CAAC,GAAoB;QAChC,OAAO,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;IAC3C,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,KAAK,CAAC,KAAiB,EAAE,GAAqB;QACnD,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,CAAI,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;IACpD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,KAAK;QACV,OAAO,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IACrC,CAAC;CACD"}
|
package/esm/DbSync.d.ts
CHANGED
|
@@ -1,15 +1,19 @@
|
|
|
1
1
|
import type { BackendAdapter } from "./adapters/types.js";
|
|
2
2
|
import { type SyncState } from "./internal/EventBus.js";
|
|
3
3
|
import { StorageManager } from "./internal/StorageManager.js";
|
|
4
|
+
export interface DbSyncTableConfig {
|
|
5
|
+
/** Optional index names to create for the store. */
|
|
6
|
+
indexes?: string[];
|
|
7
|
+
/** Optional callback that fills in default fields before write operations. */
|
|
8
|
+
beforeWrite?: (value: any) => any;
|
|
9
|
+
}
|
|
4
10
|
export interface DbSyncConfig {
|
|
5
11
|
/** The backend adapter used for authentication and synchronization. */
|
|
6
12
|
adapter: BackendAdapter;
|
|
7
13
|
/** Optional fixed IndexedDB version. */
|
|
8
14
|
version?: number;
|
|
9
15
|
/** The object stores and their index definitions. */
|
|
10
|
-
tables: Record<string,
|
|
11
|
-
indexes?: string[];
|
|
12
|
-
}>;
|
|
16
|
+
tables: Record<string, DbSyncTableConfig>;
|
|
13
17
|
}
|
|
14
18
|
export type { SyncState };
|
|
15
19
|
/**
|
|
@@ -48,6 +52,8 @@ export declare class DbSync {
|
|
|
48
52
|
findAll<T>(storeName: string): Promise<T[]>;
|
|
49
53
|
/** Inserts a new record into the given object store. */
|
|
50
54
|
add<T>(storeName: string, value: any, key?: string | number): Promise<T>;
|
|
55
|
+
/** Partially updates an existing record in the given object store. */
|
|
56
|
+
patch<T>(storeName: string, value: Partial<T>, key?: string | number): Promise<T>;
|
|
51
57
|
/** Upserts a record into the given object store. */
|
|
52
58
|
put<T>(storeName: string, value: any, key?: string | number): Promise<T>;
|
|
53
59
|
/** Deletes a record from the given object store. */
|
package/esm/DbSync.js
CHANGED
|
@@ -30,7 +30,9 @@ export class DbSync {
|
|
|
30
30
|
const adapter = config.adapter;
|
|
31
31
|
const onSchemaChange = () => this.onSchemaChangeDetected();
|
|
32
32
|
this.storage = new StorageManager(config, this.events, onSchemaChange);
|
|
33
|
-
this.authManager = new AuthManager(adapter, this.storage, () => {
|
|
33
|
+
this.authManager = new AuthManager(adapter, this.storage, () => {
|
|
34
|
+
void this.stop();
|
|
35
|
+
});
|
|
34
36
|
this.syncEngine = new SyncEngine(config, this.syncInterval, this.events, this.storage, this.authManager, adapter, onSchemaChange);
|
|
35
37
|
}
|
|
36
38
|
/** Returns a fresh RFC-4122 UUID. */
|
|
@@ -59,13 +61,18 @@ export class DbSync {
|
|
|
59
61
|
}
|
|
60
62
|
/** Inserts a new record into the given object store. */
|
|
61
63
|
async add(storeName, value, key) {
|
|
62
|
-
await this.storage.executeTransaction([{ type: "add", storeName, value, key }]);
|
|
64
|
+
const [executedWrite] = await this.storage.executeTransaction([{ type: "add", storeName, value, key }]);
|
|
65
|
+
return executedWrite?.value;
|
|
66
|
+
}
|
|
67
|
+
/** Partially updates an existing record in the given object store. */
|
|
68
|
+
async patch(storeName, value, key) {
|
|
69
|
+
await this.storage.executeTransaction([{ type: "patch", storeName, value, key }]);
|
|
63
70
|
return value;
|
|
64
71
|
}
|
|
65
72
|
/** Upserts a record into the given object store. */
|
|
66
73
|
async put(storeName, value, key) {
|
|
67
|
-
await this.storage.executeTransaction([{ type: "put", storeName, value, key }]);
|
|
68
|
-
return value;
|
|
74
|
+
const [executedWrite] = await this.storage.executeTransaction([{ type: "put", storeName, value, key }]);
|
|
75
|
+
return executedWrite?.value;
|
|
69
76
|
}
|
|
70
77
|
/** Deletes a record from the given object store. */
|
|
71
78
|
async delete(storeName, key) {
|
package/esm/DbSync.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DbSync.js","sourceRoot":"","sources":["../src/DbSync.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAA;AACvD,OAAO,EAAE,QAAQ,EAAkB,MAAM,wBAAwB,CAAA;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAA;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAA;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAA;
|
|
1
|
+
{"version":3,"file":"DbSync.js","sourceRoot":"","sources":["../src/DbSync.ts"],"names":[],"mappings":"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"}
|
package/esm/DbTxRepository.d.ts
CHANGED
|
@@ -34,6 +34,13 @@ export declare class DbTxRepository<T> {
|
|
|
34
34
|
* @param key The primary key of the record to delete.
|
|
35
35
|
*/
|
|
36
36
|
delete(key: string | number): void;
|
|
37
|
+
/**
|
|
38
|
+
* Queues a partial update operation for an existing record.
|
|
39
|
+
*
|
|
40
|
+
* @param value The object partial payload to patch.
|
|
41
|
+
* @param key An optional explicit primary key.
|
|
42
|
+
*/
|
|
43
|
+
patch(value: Partial<T>, key?: string | number): void;
|
|
37
44
|
/**
|
|
38
45
|
* Queues an operation to remove all records from the object store.
|
|
39
46
|
*/
|
package/esm/DbTxRepository.js
CHANGED
|
@@ -42,6 +42,15 @@ export class DbTxRepository {
|
|
|
42
42
|
delete(key) {
|
|
43
43
|
this.tx.delete(this.storeName, key);
|
|
44
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Queues a partial update operation for an existing record.
|
|
47
|
+
*
|
|
48
|
+
* @param value The object partial payload to patch.
|
|
49
|
+
* @param key An optional explicit primary key.
|
|
50
|
+
*/
|
|
51
|
+
patch(value, key) {
|
|
52
|
+
this.tx.patch(this.storeName, value, key);
|
|
53
|
+
}
|
|
45
54
|
/**
|
|
46
55
|
* Queues an operation to remove all records from the object store.
|
|
47
56
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DbTxRepository.js","sourceRoot":"","sources":["../src/DbTxRepository.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,OAAO,cAAc;IAQf;IACM;IARjB;;;;;OAKG;IACH,YACW,EAAiB,EACX,SAAiB;QADvB,OAAE,GAAF,EAAE,CAAe;QACX,cAAS,GAAT,SAAS,CAAQ;IAC/B,CAAC;IAEJ;;;;;OAKG;IACH,GAAG,CAAC,KAAiB,EAAE,GAAqB;QAC3C,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;IACxC,CAAC;IAED;;;;;OAKG;IACH,GAAG,CAAC,KAAQ,EAAE,GAAqB;QAClC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;IACxC,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,GAAoB;QAC1B,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;IACpC,CAAC;IAED;;OAEG;IACH,KAAK;QACJ,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC9B,CAAC;CACD"}
|
|
1
|
+
{"version":3,"file":"DbTxRepository.js","sourceRoot":"","sources":["../src/DbTxRepository.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,OAAO,cAAc;IAQf;IACM;IARjB;;;;;OAKG;IACH,YACW,EAAiB,EACX,SAAiB;QADvB,OAAE,GAAF,EAAE,CAAe;QACX,cAAS,GAAT,SAAS,CAAQ;IAC/B,CAAC;IAEJ;;;;;OAKG;IACH,GAAG,CAAC,KAAiB,EAAE,GAAqB;QAC3C,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;IACxC,CAAC;IAED;;;;;OAKG;IACH,GAAG,CAAC,KAAQ,EAAE,GAAqB;QAClC,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;IACxC,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,GAAoB;QAC1B,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC,CAAA;IACpC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,KAAiB,EAAE,GAAqB;QAC7C,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAA;IAC1C,CAAC;IAED;;OAEG;IACH,KAAK;QACJ,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAC9B,CAAC;CACD"}
|
package/esm/index.d.ts
CHANGED
|
@@ -34,6 +34,15 @@ export declare class DbTransaction {
|
|
|
34
34
|
* @param key An optional explicit primary key.
|
|
35
35
|
*/
|
|
36
36
|
put(storeName: string, value: any, key?: string | number): void;
|
|
37
|
+
/**
|
|
38
|
+
* Queues a partial update of an existing record.
|
|
39
|
+
* Fails if the primary key does not already exist in the database.
|
|
40
|
+
*
|
|
41
|
+
* @param storeName The name of the target object store.
|
|
42
|
+
* @param value The partial object payload containing the primary key and fields to update.
|
|
43
|
+
* @param key An optional explicit primary key.
|
|
44
|
+
*/
|
|
45
|
+
patch(storeName: string, value: any, key?: string | number): void;
|
|
37
46
|
/**
|
|
38
47
|
* Queues a deletion operation.
|
|
39
48
|
*
|
|
@@ -41,6 +41,17 @@ export class DbTransaction {
|
|
|
41
41
|
put(storeName, value, key) {
|
|
42
42
|
this.operations.push({ type: "put", storeName, value, key });
|
|
43
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* Queues a partial update of an existing record.
|
|
46
|
+
* Fails if the primary key does not already exist in the database.
|
|
47
|
+
*
|
|
48
|
+
* @param storeName The name of the target object store.
|
|
49
|
+
* @param value The partial object payload containing the primary key and fields to update.
|
|
50
|
+
* @param key An optional explicit primary key.
|
|
51
|
+
*/
|
|
52
|
+
patch(storeName, value, key) {
|
|
53
|
+
this.operations.push({ type: "patch", storeName, value, key });
|
|
54
|
+
}
|
|
44
55
|
/**
|
|
45
56
|
* Queues a deletion operation.
|
|
46
57
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DbTransaction.js","sourceRoot":"","sources":["../../src/internal/DbTransaction.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAE9C;;;;GAIG;AACH,MAAM,OAAO,aAAa;IAmBL;IAlBpB;;;OAGG;IACK,UAAU,GAKZ,EAAE,CAAA;IAER;;;;;;OAMG;IACH,YAAoB,QAAuC;QAAvC,aAAQ,GAAR,QAAQ,CAA+B;IAAG,CAAC;IAE/D;;;;;;OAMG;IACH,GAAG,CAAC,SAAiB,EAAE,KAAU,EAAE,GAAqB;QACvD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IAC7D,CAAC;IAED;;;;;;OAMG;IACH,GAAG,CAAC,SAAiB,EAAE,KAAU,EAAE,GAAqB;QACvD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IAC7D,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,SAAiB,EAAE,GAAoB;QAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAA;IACzD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,SAAiB;QACtB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAA;IACnD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM;QACX,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QACxC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACtC,CAAC;IAED;;OAEG;IACH,MAAM;QACL,IAAI,CAAC,UAAU,GAAG,EAAE,CAAA;IACrB,CAAC;CACD"}
|
|
1
|
+
{"version":3,"file":"DbTransaction.js","sourceRoot":"","sources":["../../src/internal/DbTransaction.ts"],"names":[],"mappings":"AAAA,8CAA8C;AAE9C;;;;GAIG;AACH,MAAM,OAAO,aAAa;IAmBL;IAlBpB;;;OAGG;IACK,UAAU,GAKZ,EAAE,CAAA;IAER;;;;;;OAMG;IACH,YAAoB,QAAuC;QAAvC,aAAQ,GAAR,QAAQ,CAA+B;IAAG,CAAC;IAE/D;;;;;;OAMG;IACH,GAAG,CAAC,SAAiB,EAAE,KAAU,EAAE,GAAqB;QACvD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IAC7D,CAAC;IAED;;;;;;OAMG;IACH,GAAG,CAAC,SAAiB,EAAE,KAAU,EAAE,GAAqB;QACvD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IAC7D,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,SAAiB,EAAE,KAAU,EAAE,GAAqB;QACzD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAA;IAC/D,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,SAAiB,EAAE,GAAoB;QAC7C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAA;IACzD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,SAAiB;QACtB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAA;IACnD,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM;QACX,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAM;QACxC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;IACtC,CAAC;IAED;;OAEG;IACH,MAAM;QACL,IAAI,CAAC,UAAU,GAAG,EAAE,CAAA;IACrB,CAAC;CACD"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Migrations allow existing offline data to be selectively upgraded rather than wiped
|
|
4
4
|
* when backend domain modeling changes.
|
|
5
5
|
*/
|
|
6
|
-
export interface
|
|
6
|
+
export interface MigrationManagerMigration<T = any> {
|
|
7
7
|
/**
|
|
8
8
|
* An ascending integer determining execution order. A record currently at `storeVersion: 1`
|
|
9
9
|
* will only trigger migrations where `version >= 2`.
|
|
@@ -39,7 +39,7 @@ export declare class MigrationManager {
|
|
|
39
39
|
*
|
|
40
40
|
* @param schemaMigrations A dictionary mapping store names to arrays of `IMigration` steps.
|
|
41
41
|
*/
|
|
42
|
-
runAll(schemaMigrations: Record<string,
|
|
42
|
+
runAll(schemaMigrations: Record<string, MigrationManagerMigration[]>): Promise<void>;
|
|
43
43
|
/**
|
|
44
44
|
* Sorts and attempts to apply a sequence of migrations to a single record in memory.
|
|
45
45
|
* Evaluates `storeVersion` to ensure migrations are only executed sequentially and exactly once.
|
|
@@ -48,7 +48,7 @@ export declare class MigrationManager {
|
|
|
48
48
|
* @param migrations The full list of potential migrations for the record's domain type.
|
|
49
49
|
* @returns The functionally upgraded record with an updated `storeVersion`.
|
|
50
50
|
*/
|
|
51
|
-
static upgradeRecord<T>(record: any, migrations:
|
|
51
|
+
static upgradeRecord<T>(record: any, migrations: MigrationManagerMigration<T>[]): Promise<any>;
|
|
52
52
|
/**
|
|
53
53
|
* Reads all records from a specific store, upgrades out-of-date entries,
|
|
54
54
|
* and atomically flushes the changed entries back within a single database transaction.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MigrationManager.js","sourceRoot":"","sources":["../../src/internal/MigrationManager.ts"],"names":[],"mappings":"AA0BA;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IAOR;IANpB;;;;;OAKG;IACH,YAAoB,EAAO;QAAP,OAAE,GAAF,EAAE,CAAK;IAAG,CAAC,CAAC,wBAAwB;IAExD;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"MigrationManager.js","sourceRoot":"","sources":["../../src/internal/MigrationManager.ts"],"names":[],"mappings":"AA0BA;;;GAGG;AACH,MAAM,OAAO,gBAAgB;IAOR;IANpB;;;;;OAKG;IACH,YAAoB,EAAO;QAAP,OAAE,GAAF,EAAE,CAAK;IAAG,CAAC,CAAC,wBAAwB;IAExD;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,gBAA6D;QACzE,KAAK,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACxE,MAAM,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;QAC/C,CAAC;IACF,CAAC;IAED;;;;;;;OAOG;IACI,MAAM,CAAC,KAAK,CAAC,aAAa,CAAI,MAAW,EAAE,UAA0C;QAC3F,MAAM,gBAAgB,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,CAAA;QAC9E,KAAK,MAAM,SAAS,IAAI,gBAAgB,EAAE,CAAC;YAC1C,MAAM,cAAc,GAAG,MAAM,CAAC,YAAY,IAAI,CAAC,CAAA;YAC/C,IAAI,cAAc,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC;gBACxC,MAAM,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;gBAC/B,MAAM,CAAC,YAAY,GAAG,SAAS,CAAC,OAAO,CAAA;YACxC,CAAC;QACF,CAAC;QACD,OAAO,MAAM,CAAA;IACd,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,YAAY,CAAC,SAAiB,EAAE,UAAuC;QACpF,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QACnD,MAAM,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC,cAAc,EAAE,CAAA;QAEnC,KAAK,MAAM,aAAa,IAAI,UAAU,EAAE,CAAC;YACxC,MAAM,UAAU,GAAG,EAAE,GAAG,aAAa,EAAE,CAAA;YACvC,MAAM,gBAAgB,CAAC,aAAa,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;YAE5D,IAAI,UAAU,CAAC,YAAY,KAAK,aAAa,CAAC,YAAY,EAAE,CAAC;gBAC5D,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;YAC9B,CAAC;QACF,CAAC;QAED,MAAM,EAAE,CAAC,MAAM,EAAE,CAAA;IAClB,CAAC;CACD"}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import type { DbSyncConfig } from "../DbSync.js";
|
|
2
2
|
import { DbTransaction } from "./DbTransaction.js";
|
|
3
3
|
import type { EventBus } from "./EventBus.js";
|
|
4
|
+
type ExecutedWrite = {
|
|
5
|
+
type: string;
|
|
6
|
+
storeName: string;
|
|
7
|
+
value?: any;
|
|
8
|
+
key?: string | number;
|
|
9
|
+
};
|
|
4
10
|
/**
|
|
5
11
|
* Owns IndexedDB initialization, transactions, and record access.
|
|
6
12
|
*/
|
|
@@ -29,7 +35,7 @@ export declare class StorageManager {
|
|
|
29
35
|
/** Opens IndexedDB and creates the configured stores when needed. */
|
|
30
36
|
init(): Promise<void>;
|
|
31
37
|
/** Executes a batch of writes inside a single IndexedDB transaction. */
|
|
32
|
-
executeTransaction(operations: any[]): Promise<
|
|
38
|
+
executeTransaction(operations: any[]): Promise<ExecutedWrite[]>;
|
|
33
39
|
/** Reads a typed record by primary key from the requested store. */
|
|
34
40
|
get<T>(storeName: string, id: string | number): Promise<T | undefined>;
|
|
35
41
|
/** Returns every record from the requested store. */
|
|
@@ -39,3 +45,4 @@ export declare class StorageManager {
|
|
|
39
45
|
/** Closes the underlying IndexedDB connection. */
|
|
40
46
|
dispose(): void;
|
|
41
47
|
}
|
|
48
|
+
export {};
|
|
@@ -39,7 +39,9 @@ export class StorageManager {
|
|
|
39
39
|
}
|
|
40
40
|
/** Creates a transaction wrapper used by the sync engine and public facade. */
|
|
41
41
|
getTransaction() {
|
|
42
|
-
return new DbTransaction((operations) =>
|
|
42
|
+
return new DbTransaction(async (operations) => {
|
|
43
|
+
await this.executeTransaction(operations);
|
|
44
|
+
});
|
|
43
45
|
}
|
|
44
46
|
/** Opens IndexedDB and creates the configured stores when needed. */
|
|
45
47
|
async init() {
|
|
@@ -90,23 +92,65 @@ export class StorageManager {
|
|
|
90
92
|
"dirtyQueue",
|
|
91
93
|
"deletedQueue",
|
|
92
94
|
]);
|
|
95
|
+
const executedWrites = [];
|
|
96
|
+
// Pre-fetch objects for patch operations using a separate read-only transaction.
|
|
97
|
+
// A standard IndexedDB transaction auto-commits if we await inside it, so we must
|
|
98
|
+
// gather everything into memory synchronously before opening the main readwrite transaction.
|
|
99
|
+
const patchOperations = operations.filter((o) => o.type === "patch");
|
|
100
|
+
const patchRecords = {};
|
|
101
|
+
if (patchOperations.length > 0) {
|
|
102
|
+
const preTx = this.db.transaction(storeNames, "readonly");
|
|
103
|
+
const fetchPromises = patchOperations.map(async (op) => {
|
|
104
|
+
const recordId = String(op.key || op.value?.id);
|
|
105
|
+
const { promise: p, resolve: r, reject: rej } = promiseWithResolvers();
|
|
106
|
+
const getReq = preTx.objectStore(op.storeName).get(recordId);
|
|
107
|
+
getReq.onsuccess = () => r(getReq.result);
|
|
108
|
+
getReq.onerror = () => rej(getReq.error);
|
|
109
|
+
const existingRecord = await p;
|
|
110
|
+
if (!existingRecord) {
|
|
111
|
+
throw new Error(`[dbsync]: Cannot patch record ${recordId} in ${op.storeName} because it doesn't exist`);
|
|
112
|
+
}
|
|
113
|
+
patchRecords[`${op.storeName}-${recordId}`] = existingRecord;
|
|
114
|
+
});
|
|
115
|
+
await Promise.all(fetchPromises);
|
|
116
|
+
}
|
|
117
|
+
// Now execute the actual write bundle synchronously
|
|
93
118
|
const { promise, resolve, reject } = promiseWithResolvers();
|
|
94
119
|
const tx = this.db.transaction(storeNames, "readwrite");
|
|
95
120
|
tx.oncomplete = () => {
|
|
96
121
|
this.events.notifySubscribers(storeNames);
|
|
97
|
-
resolve();
|
|
122
|
+
resolve(executedWrites);
|
|
98
123
|
};
|
|
99
124
|
tx.onerror = () => reject(tx.error);
|
|
100
125
|
operations.forEach((op) => {
|
|
101
126
|
const store = tx.objectStore(op.storeName);
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
127
|
+
let payloadToWrite = op.value;
|
|
128
|
+
let recordId = op.key || op.value?.id;
|
|
129
|
+
if (op.type === "put" || op.type === "add" || op.type === "patch") {
|
|
130
|
+
if (op.type === "put" || op.type === "add") {
|
|
131
|
+
const beforeWrite = this.config.tables[op.storeName]?.beforeWrite;
|
|
132
|
+
if (beforeWrite) {
|
|
133
|
+
payloadToWrite = beforeWrite(payloadToWrite);
|
|
134
|
+
}
|
|
135
|
+
recordId = op.key || payloadToWrite?.id;
|
|
136
|
+
}
|
|
137
|
+
else if (op.type === "patch") {
|
|
138
|
+
const existingRecord = patchRecords[`${op.storeName}-${recordId}`];
|
|
139
|
+
payloadToWrite = { ...existingRecord, ...op.value };
|
|
140
|
+
recordId = op.key || payloadToWrite?.id;
|
|
141
|
+
}
|
|
142
|
+
store.put(payloadToWrite);
|
|
143
|
+
executedWrites.push({
|
|
144
|
+
type: op.type,
|
|
145
|
+
storeName: op.storeName,
|
|
146
|
+
value: payloadToWrite,
|
|
147
|
+
key: recordId,
|
|
148
|
+
});
|
|
105
149
|
if (op.storeName !== "dirtyQueue" && op.storeName !== "deletedQueue") {
|
|
106
150
|
tx.objectStore("dirtyQueue").put({
|
|
107
151
|
id: recordId,
|
|
108
152
|
table: op.storeName,
|
|
109
|
-
payload:
|
|
153
|
+
payload: payloadToWrite,
|
|
110
154
|
timestamp: Date.now(),
|
|
111
155
|
});
|
|
112
156
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StorageManager.js","sourceRoot":"","sources":["../../src/internal/StorageManager.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAA;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"StorageManager.js","sourceRoot":"","sources":["../../src/internal/StorageManager.ts"],"names":[],"mappings":"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"}
|
package/esm/useDbQuery.d.ts
CHANGED
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
import type { DbSync } from "./DbSync.js";
|
|
2
|
+
type DbQueryState<T> = {
|
|
3
|
+
value: T | null;
|
|
4
|
+
loading: boolean;
|
|
5
|
+
};
|
|
2
6
|
/**
|
|
3
7
|
* A React hook that subscribes to one or more `DbSync` tables and natively
|
|
4
8
|
* re-evaluates a strictly typed query function whenever local mutations or
|
|
@@ -8,6 +12,7 @@ import type { DbSync } from "./DbSync.js";
|
|
|
8
12
|
* @param stores A string or array of strings containing the table names the query function reads from.
|
|
9
13
|
* @param queryFn An asynchronous function invoked to pull data from IndexedDB.
|
|
10
14
|
* @param deps A standard React dependency array for parameters referenced inside the `queryFn`.
|
|
11
|
-
* @returns
|
|
15
|
+
* @returns An object containing the latest query result and whether the initial fetch is still pending.
|
|
12
16
|
*/
|
|
13
|
-
export declare function useDbQuery<T>(db: DbSync, stores: string | string[], queryFn: () => Promise<T>, deps?: any[]): T
|
|
17
|
+
export declare function useDbQuery<T>(db: DbSync, stores: string | string[], queryFn: () => Promise<T>, deps?: any[]): DbQueryState<T>;
|
|
18
|
+
export {};
|
package/esm/useDbQuery.js
CHANGED
|
@@ -8,11 +8,11 @@ import { useEffect, useState } from "react";
|
|
|
8
8
|
* @param stores A string or array of strings containing the table names the query function reads from.
|
|
9
9
|
* @param queryFn An asynchronous function invoked to pull data from IndexedDB.
|
|
10
10
|
* @param deps A standard React dependency array for parameters referenced inside the `queryFn`.
|
|
11
|
-
* @returns
|
|
11
|
+
* @returns An object containing the latest query result and whether the initial fetch is still pending.
|
|
12
12
|
*/
|
|
13
13
|
export function useDbQuery(db, stores, queryFn, deps = []) {
|
|
14
|
-
/** Holds the latest query result. */
|
|
15
|
-
const [
|
|
14
|
+
/** Holds the latest query result and loading state. */
|
|
15
|
+
const [state, setState] = useState({ value: null, loading: true });
|
|
16
16
|
/** Normalizes the store input into an array for matching. */
|
|
17
17
|
const storeArray = Array.isArray(stores) ? stores : [stores];
|
|
18
18
|
useEffect(() => {
|
|
@@ -31,11 +31,15 @@ export function useDbQuery(db, stores, queryFn, deps = []) {
|
|
|
31
31
|
}
|
|
32
32
|
try {
|
|
33
33
|
const result = await queryFn();
|
|
34
|
-
if (isMounted)
|
|
35
|
-
|
|
34
|
+
if (isMounted) {
|
|
35
|
+
setState({ value: result ?? null, loading: false });
|
|
36
|
+
}
|
|
36
37
|
}
|
|
37
38
|
catch (err) {
|
|
38
39
|
console.error("[dbsync useDbQuery]: Query failed", err);
|
|
40
|
+
if (isMounted) {
|
|
41
|
+
setState((current) => ({ ...current, loading: false }));
|
|
42
|
+
}
|
|
39
43
|
}
|
|
40
44
|
};
|
|
41
45
|
// Initial fetch
|
|
@@ -53,6 +57,6 @@ export function useDbQuery(db, stores, queryFn, deps = []) {
|
|
|
53
57
|
};
|
|
54
58
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
55
59
|
}, [db, JSON.stringify(storeArray), ...deps]);
|
|
56
|
-
return
|
|
60
|
+
return state;
|
|
57
61
|
}
|
|
58
62
|
//# sourceMappingURL=useDbQuery.js.map
|
package/esm/useDbQuery.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDbQuery.js","sourceRoot":"","sources":["../src/useDbQuery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"useDbQuery.js","sourceRoot":"","sources":["../src/useDbQuery.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;AAQ3C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,UAAU,CACzB,EAAU,EACV,MAAyB,EACzB,OAAyB,EACzB,OAAc,EAAE;IAEhB,uDAAuD;IACvD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAkB,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;IACnF,6DAA6D;IAC7D,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAA;IAE5D,SAAS,CAAC,GAAG,EAAE;QACd,IAAI,SAAS,GAAG,IAAI,CAAA;QAEpB,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;YAC5B,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;gBACjB,oDAAoD;gBACpD,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;oBACnC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;wBAC9B,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;4BAC9B,aAAa,CAAC,KAAK,CAAC,CAAA;4BACpB,OAAO,EAAE,CAAA;wBACV,CAAC;oBACF,CAAC,EAAE,EAAE,CAAC,CAAA;gBACP,CAAC,CAAC,CAAA;YACH,CAAC;YACD,IAAI,CAAC;gBACJ,MAAM,MAAM,GAAG,MAAM,OAAO,EAAE,CAAA;gBAC9B,IAAI,SAAS,EAAE,CAAC;oBACf,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAM,IAAI,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAA;gBACpD,CAAC;YACF,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,KAAK,CAAC,mCAAmC,EAAE,GAAG,CAAC,CAAA;gBACvD,IAAI,SAAS,EAAE,CAAC;oBACf,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,CAAA;gBACxD,CAAC;YACF,CAAC;QACF,CAAC,CAAA;QAED,gBAAgB;QAChB,SAAS,EAAE,CAAA;QAEX,+BAA+B;QAC/B,MAAM,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,aAAa,EAAE,EAAE;YAC1C,MAAM,YAAY,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAA;YACtE,IAAI,YAAY,EAAE,CAAC;gBAClB,SAAS,EAAE,CAAA;YACZ,CAAC;QACF,CAAC,CAAC,CAAA;QAEF,OAAO,GAAG,EAAE;YACX,SAAS,GAAG,KAAK,CAAA;YACjB,GAAG,CAAC,KAAK,EAAE,CAAA;QACZ,CAAC,CAAA;QACD,uDAAuD;IACxD,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAA;IAE7C,OAAO,KAAK,CAAA;AACb,CAAC"}
|