@blaze-chat/tanstack-db-idb-collection 0.0.2 → 0.0.3

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/dist/index.d.ts CHANGED
@@ -3,31 +3,35 @@ import { StandardSchemaV1 } from "@standard-schema/spec";
3
3
  import { DeleteMutationFn, InsertMutationFn, SyncConfig, UpdateMutationFn } from "@tanstack/db";
4
4
 
5
5
  //#region src/types.d.ts
6
- type IdType = number | string;
6
+ type ValidId = number | string;
7
7
  /**
8
- * Extract Valid Id Type from Entity
8
+ * Extract Valid ID Type from Entity
9
9
  */
10
- type ValidIdPath<Entity extends object> = { [K in keyof Entity]: Entity[K] extends IdType ? K : never }[keyof Entity];
11
- type ObjectStore<Entity extends object = any> = {
10
+ type ValidIdPath<Entity extends object> = { [K in keyof Entity]: Entity[K] extends ValidId ? K : never }[keyof Entity];
11
+ type ObjectStore<Entity extends object = any, IdPath extends ValidIdPath<Entity> = any> = {
12
12
  schema: StandardSchemaV1<Entity>;
13
- idPath: ValidIdPath<Entity>;
13
+ idPath: IdPath;
14
14
  indicies?: (keyof Entity & string)[];
15
15
  };
16
+ type ObjectStores = Record<string, ObjectStore>;
16
17
  /**
17
- * Extract the `Entity` type from ObjectStore
18
+ * Extract `Entity` from ObjectStore
18
19
  */
19
- type ObjectStoreEntity<T extends ObjectStore> = T extends ObjectStore<infer O> ? O : never;
20
+ type ObjectStoreEntity<Store extends ObjectStore> = Store extends ObjectStore<infer Entity> ? Entity : never;
20
21
  /**
21
- * Extract the `Entity` type from ObjectStore
22
+ * Extract `IdPath` from ObjectStore
22
23
  */
23
- type ObjectStoreId<T extends ObjectStore> = ObjectStoreEntity<T>[T["idPath"]];
24
- type ObjectStores = Record<string, ObjectStore>;
24
+ type ObjectStoreIdPath<Store extends ObjectStore> = Store extends ObjectStore<any, infer IdPath> ? IdPath : never;
25
+ /**
26
+ * Get IdType from ObjectStore
27
+ */
28
+ type ObjectStoreIdType<Store extends ObjectStore> = Store extends ObjectStore<infer Entity, infer IdPath> ? Entity[IdPath] : never;
25
29
  //#endregion
26
30
  //#region src/database.d.ts
27
31
  /**
28
32
  * Helper function for IDE auto completion
29
33
  */
30
- declare function defineObjectStore<Entity extends object>(objectStore: ObjectStore<Entity>): ObjectStore<Entity>;
34
+ declare function defineObjectStore<const Entity extends object, const IdPath extends ValidIdPath<Entity>>(objectStore: ObjectStore<Entity, IdPath>): ObjectStore<Entity, IdPath>;
31
35
  type Database<T extends ObjectStores> = {
32
36
  /**
33
37
  * Note: Safari does not support Top-Level Await
@@ -38,29 +42,32 @@ type Database<T extends ObjectStores> = {
38
42
  declare function createDatabase<const T extends ObjectStores>(name: string, version: number, objectStores: T): Database<T>;
39
43
  //#endregion
40
44
  //#region src/options.d.ts
41
- declare class IDBCollectionConfig<const T extends ObjectStores, Name extends keyof T & string, Entity extends ObjectStoreEntity<T[Name]>, IdType$1 extends ObjectStoreId<T[Name]>> {
45
+ declare class IDBCollectionConfig<const Store extends ObjectStore, const Entity extends ObjectStoreEntity<Store>, const IdType extends ObjectStoreIdType<Store>> {
42
46
  id: string;
43
47
  schema: StandardSchemaV1<Entity>;
44
- getKey: (entity: Entity) => IdType$1;
45
- sync: SyncConfig<Entity>;
46
- onInsert: InsertMutationFn<Entity, IdType$1>;
47
- onUpdate: UpdateMutationFn<Entity, IdType$1>;
48
- onDelete: DeleteMutationFn<Entity, IdType$1>;
48
+ getKey: (entity: Entity) => IdType;
49
+ sync: SyncConfig<Entity, IdType>;
50
+ onInsert: InsertMutationFn<Entity, IdType>;
51
+ onUpdate: UpdateMutationFn<Entity, IdType>;
52
+ onDelete: DeleteMutationFn<Entity, IdType>;
49
53
  private begin;
50
54
  private write;
51
55
  private commit;
52
- constructor({
56
+ constructor(idb: Promise<IDBPDatabase>, name: string, {
57
+ idPath,
58
+ schema
59
+ }: Store);
60
+ }
61
+ declare function idbCollectionOptions<const T extends ObjectStores, const Name extends keyof T & string>({
62
+ database: {
53
63
  idb,
54
64
  objectStores
55
- }: Database<T>, name: Name);
56
- }
57
- declare function idbCollectionOptions<const T extends ObjectStores, Name extends keyof T & string>({
58
- database,
65
+ },
59
66
  name
60
67
  }: {
61
68
  database: Database<T>;
62
69
  name: Name;
63
- }): IDBCollectionConfig<T, Name, ObjectStoreEntity<T[Name]>, ObjectStoreId<T[Name]>>;
70
+ }): IDBCollectionConfig<NonNullable<T[Name]>, ObjectStoreEntity<NonNullable<T[Name]>>, ObjectStoreIdType<NonNullable<T[Name]>>>;
64
71
  //#endregion
65
- export { Database, IdType, ObjectStore, ObjectStoreEntity, ObjectStoreId, ObjectStores, ValidIdPath, createDatabase, defineObjectStore, idbCollectionOptions };
72
+ export { Database, IDBCollectionConfig, ObjectStore, ObjectStoreEntity, ObjectStoreIdPath, ObjectStoreIdType, ObjectStores, ValidId, ValidIdPath, createDatabase, defineObjectStore, idbCollectionOptions };
66
73
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/database.ts","../src/options.ts"],"mappings":";;;;;KAEY,MAAA;AAAA;AAKZ;;AALY,KAKA,WAAA,wCACE,MAAA,GAAS,MAAA,CAAO,CAAA,UAAW,MAAA,GAAS,CAAA,iBAC1C,MAAA;AAAA,KAEI,WAAA;EAAA,MAAA,EACF,gBAAA,CAAiB,MAAA;EAAA,MAAA,EACjB,WAAA,CAAY,MAAA;EAAA,QAAA,UACF,MAAA;AAAA;AAAA;;AAMpB;AANoB,KAMR,iBAAA,WAA4B,WAAA,IACtC,CAAA,SAAU,WAAA,YAAA,CAAA;AAAA;;AAKZ;AALY,KAKA,aAAA,WAAwB,WAAA,IAClC,iBAAA,CAAkB,CAAA,EAAG,CAAA;AAAA,KAEX,YAAA,GAAe,MAAA,SAAe,WAAA;;;;ACvB1C;;iBAAgB,iBAAA,uBAAA,CAAA,WAAA,EACD,WAAA,CAAY,MAAA,IACxB,WAAA,CAAY,MAAA;AAAA,KAIH,QAAA,WAAmB,YAAA;EAAA;;;EAAA,GAAA,EAIxB,OAAA,CAAQ,YAAA;EAAA,YAAA,EACC,CAAA;AAAA;AAAA,iBAGA,cAAA,iBAA+B,YAAA,CAAA,CAAA,IAAA,UAAA,OAAA,UAAA,YAAA,EAG/B,CAAA,GACb,QAAA,CAAS,CAAA;;;cCRN,mBAAA,iBACY,YAAA,qBACG,CAAA,0BACJ,iBAAA,CAAkB,CAAA,CAAE,IAAA,qBACpB,aAAA,CAAc,CAAA,CAAE,IAAA;EAAA,EAAA;EAAA,MAAA,EAGvB,gBAAA,CAAiB,MAAA;EAAA,MAAA,GAAA,MAAA,EACR,MAAA,KAAW,QAAA;EAAA,IAAA,EACtB,UAAA,CAAW,MAAA;EAAA,QAAA,EAEP,gBAAA,CAAiB,MAAA,EAAQ,QAAA;EAAA,QAAA,EACzB,gBAAA,CAAiB,MAAA,EAAQ,QAAA;EAAA,QAAA,EACzB,gBAAA,CAAiB,MAAA,EAAQ,QAAA;EAAA,QAAA,KAAA;EAAA,QAAA,KAAA;EAAA,QAAA,MAAA;EAAA,YAAA;IAAA,GAAA;IAAA;EAAA,GAQA,QAAA,CAAS,CAAA,GAAA,IAAA,EAAU,IAAA;AAAA;AAAA,iBA8ExC,oBAAA,iBACE,YAAA,qBACG,CAAA,UAAA,CAAA;EAAA,QAAA;EAAA;AAAA;EAAA,QAAA,EACa,QAAA,CAAS,CAAA;EAAA,IAAA,EAAU,IAAA;AAAA,IAAM,mBAAA,CAAA,CAAA,EAAA,IAAA,EAAA,iBAAA,CAAA,CAAA,CAAA,IAAA,IAAA,aAAA,CAAA,CAAA,CAAA,IAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/types.ts","../src/database.ts","../src/options.ts"],"mappings":";;;;;KAEY,OAAA;AAAA;AAKZ;;AALY,KAKA,WAAA,wCACE,MAAA,GAAS,MAAA,CAAO,CAAA,UAAW,OAAA,GAAU,CAAA,iBAC3C,MAAA;AAAA,KAEI,WAAA,6CAAwD,WAAA,CAAY,MAAA;EAAA,MAAA,EACtE,gBAAA,CAAiB,MAAA;EAAA,MAAA,EACjB,MAAA;EAAA,QAAA,UACU,MAAA;AAAA;AAAA,KAGR,YAAA,GAAe,MAAA,SAAe,WAAA;AAAA;AAK1C;;AAL0C,KAK9B,iBAAA,eAAgC,WAAA,IAC1C,KAAA,SAAc,WAAA,iBAAA,MAAA;AAAA;;AAKhB;AALgB,KAKJ,iBAAA,eAAgC,WAAA,IAC1C,KAAA,SAAc,WAAA,sBAAA,MAAA;AAAA;;AAKhB;AALgB,KAKJ,iBAAA,eAAgC,WAAA,IAC1C,KAAA,SAAc,WAAA,+BAA0C,MAAA,CAAO,MAAA;;;;AC7BjE;;iBAAgB,iBAAA,mDAEO,WAAA,CAAY,MAAA,EAAA,CAAA,WAAA,EACpB,WAAA,CAAY,MAAA,EAAQ,MAAA,IAAU,WAAA,CAAY,MAAA,EAAQ,MAAA;AAAA,KAIrD,QAAA,WAAmB,YAAA;EAAA;;;EAAA,GAAA,EAIxB,OAAA,CAAQ,YAAA;EAAA,YAAA,EACC,CAAA;AAAA;AAAA,iBAGA,cAAA,iBAA+B,YAAA,CAAA,CAAA,IAAA,UAAA,OAAA,UAAA,YAAA,EAG/B,CAAA,GACb,QAAA,CAAS,CAAA;;;cCbC,mBAAA,qBACS,WAAA,uBACC,iBAAA,CAAkB,KAAA,wBAClB,iBAAA,CAAkB,KAAA;EAAA,EAAA;EAAA,MAAA,EAG/B,gBAAA,CAAiB,MAAA;EAAA,MAAA,GAAA,MAAA,EACR,MAAA,KAAW,MAAA;EAAA,IAAA,EACtB,UAAA,CAAW,MAAA,EAAQ,MAAA;EAAA,QAAA,EAEf,gBAAA,CAAiB,MAAA,EAAQ,MAAA;EAAA,QAAA,EACzB,gBAAA,CAAiB,MAAA,EAAQ,MAAA;EAAA,QAAA,EACzB,gBAAA,CAAiB,MAAA,EAAQ,MAAA;EAAA,QAAA,KAAA;EAAA,QAAA,KAAA;EAAA,QAAA,MAAA;EAAA,YAAA,GAAA,EAMlB,OAAA,CAAQ,YAAA,GAAA,IAAA;IAAA,MAAA;IAAA;EAAA,GAAiD,KAAA;AAAA;AAAA,iBA6E5D,oBAAA,iBACE,YAAA,2BACS,CAAA,UAAA,CAAA;EAAA,QAAA;IAAA,GAAA;IAAA;EAAA;EAAA;AAAA;EAAA,QAAA,EAC8B,QAAA,CAAS,CAAA;EAAA,IAAA,EAAU,IAAA;AAAA,IAAM,mBAAA,CAAA,WAAA,CAAA,CAAA,CAAA,IAAA,IAAA,iBAAA,CAAA,WAAA,CAAA,CAAA,CAAA,IAAA,KAAA,iBAAA,CAAA,WAAA,CAAA,CAAA,CAAA,IAAA"}
package/dist/index.js CHANGED
@@ -32,8 +32,7 @@ var IDBCollectionConfig = class {
32
32
  begin;
33
33
  write;
34
34
  commit;
35
- constructor({ idb, objectStores }, name) {
36
- const { schema, idPath } = objectStores[name];
35
+ constructor(idb, name, { idPath, schema }) {
37
36
  this.id = name;
38
37
  this.schema = schema;
39
38
  this.getKey = (entity) => entity[idPath];
@@ -92,10 +91,10 @@ var IDBCollectionConfig = class {
92
91
  };
93
92
  }
94
93
  };
95
- function idbCollectionOptions({ database, name }) {
96
- return new IDBCollectionConfig(database, name);
94
+ function idbCollectionOptions({ database: { idb, objectStores }, name }) {
95
+ return new IDBCollectionConfig(idb, name, objectStores[name]);
97
96
  }
98
97
 
99
98
  //#endregion
100
- export { createDatabase, defineObjectStore, idbCollectionOptions };
99
+ export { IDBCollectionConfig, createDatabase, defineObjectStore, idbCollectionOptions };
101
100
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../src/database.ts","../src/options.ts"],"sourcesContent":["import { openDB, type IDBPDatabase } from \"idb\";\nimport type { ObjectStore, ObjectStores } from \"./types\";\n\n/**\n * Helper function for IDE auto completion\n */\nexport function defineObjectStore<Entity extends object>(\n objectStore: ObjectStore<Entity>,\n): ObjectStore<Entity> {\n return objectStore;\n}\n\nexport type Database<T extends ObjectStores> = {\n /**\n * Note: Safari does not support Top-Level Await\n */\n idb: Promise<IDBPDatabase>;\n objectStores: T;\n};\n\nexport function createDatabase<const T extends ObjectStores>(\n name: string,\n version: number,\n objectStores: T,\n): Database<T> {\n const idb = openDB(name, version, {\n async upgrade(database) {\n for (const [key, { idPath: keyPath, indicies }] of Object.entries(\n objectStores,\n )) {\n const objectStore = database.createObjectStore(key, { keyPath });\n\n if (indicies) {\n // oxlint-disable-next-line no-await-in-loop\n await Promise.all(\n indicies.map((index) => objectStore.createIndex(name, index)),\n );\n }\n }\n },\n });\n\n return { idb, objectStores };\n}\n","import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type {\n ChangeMessageOrDeleteKeyMessage,\n DeleteMutationFn,\n InsertMutationFn,\n SyncConfig,\n UpdateMutationFn,\n} from \"@tanstack/db\";\nimport type { Database } from \"./database\";\nimport type {\n ObjectStore,\n ObjectStoreEntity,\n ObjectStoreId,\n ObjectStores,\n} from \"./types\";\n\nclass IDBCollectionConfig<\n const T extends ObjectStores,\n Name extends keyof T & string,\n Entity extends ObjectStoreEntity<T[Name]>,\n IdType extends ObjectStoreId<T[Name]>,\n> {\n id: string;\n schema: StandardSchemaV1<Entity>;\n getKey: (entity: Entity) => IdType;\n sync: SyncConfig<Entity>;\n\n onInsert: InsertMutationFn<Entity, IdType>;\n onUpdate: UpdateMutationFn<Entity, IdType>;\n onDelete: DeleteMutationFn<Entity, IdType>;\n\n private begin!: () => void;\n private write!: (\n message: ChangeMessageOrDeleteKeyMessage<Entity, IdType>,\n ) => void;\n private commit!: () => void;\n\n constructor({ idb, objectStores }: Database<T>, name: Name) {\n const { schema, idPath } = objectStores[name]! as ObjectStore<Entity>;\n\n this.id = name;\n this.schema = schema;\n this.getKey = (entity) => entity[idPath];\n this.sync = {\n sync: ({ begin, write, commit, markReady }) => {\n this.begin = begin;\n this.write = write;\n this.commit = commit;\n\n (async () => {\n try {\n begin();\n\n for (const entity of await (await idb).getAll(name)) {\n write({ type: \"insert\", value: entity });\n }\n\n commit();\n } finally {\n markReady();\n }\n })();\n },\n };\n\n this.onInsert = async ({ transaction }) => {\n const entities = transaction.mutations.map((m) => m.modified);\n\n const tx = (await idb).transaction(name, \"readwrite\");\n\n await Promise.all(entities.map((entity) => tx.store.add(entity)));\n\n await tx.done;\n\n this.begin();\n for (const entity of entities) {\n this.write({ type: \"insert\", value: entity });\n }\n this.commit();\n };\n\n this.onUpdate = async ({ transaction }) => {\n const entities = transaction.mutations.map((m) => m.modified);\n\n const tx = (await idb).transaction(name, \"readwrite\");\n\n await Promise.all(entities.map((entity) => tx.store.put(entity)));\n\n await tx.done;\n\n this.begin();\n for (const entity of entities) {\n this.write({ type: \"update\", value: entity });\n }\n this.commit();\n };\n\n this.onDelete = async ({ transaction }) => {\n const keys = transaction.mutations.map((m) => m.key as IdType);\n\n const tx = (await idb).transaction(name, \"readwrite\");\n\n await Promise.all(keys.map((key) => tx.store.delete(key)));\n\n await tx.done;\n\n this.begin();\n for (const key of keys) {\n this.write({ type: \"delete\", key });\n }\n this.commit();\n };\n }\n}\n\nexport function idbCollectionOptions<\n const T extends ObjectStores,\n Name extends keyof T & string,\n>({ database, name }: { database: Database<T>; name: Name }) {\n return new IDBCollectionConfig(database, name);\n}\n"],"mappings":";;;;;;AAMA,SAAgB,kBACd,aACqB;AACrB,QAAO;;AAWT,SAAgB,eACd,MACA,SACA,cACa;AAkBb,QAAO;EAAE,KAjBG,OAAO,MAAM,SAAS,EAChC,MAAM,QAAQ,UAAU;AACtB,QAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,SAAS,eAAe,OAAO,QACxD,aACD,EAAE;IACD,MAAM,cAAc,SAAS,kBAAkB,KAAK,EAAE,SAAS,CAAC;AAEhE,QAAI,SAEF,OAAM,QAAQ,IACZ,SAAS,KAAK,UAAU,YAAY,YAAY,MAAM,MAAM,CAAC,CAC9D;;KAIR,CAAC;EAEY;EAAc;;;;;AC1B9B,IAAM,sBAAN,MAKE;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CAEA,AAAQ;CACR,AAAQ;CAGR,AAAQ;CAER,YAAY,EAAE,KAAK,gBAA6B,MAAY;EAC1D,MAAM,EAAE,QAAQ,WAAW,aAAa;AAExC,OAAK,KAAK;AACV,OAAK,SAAS;AACd,OAAK,UAAU,WAAW,OAAO;AACjC,OAAK,OAAO,EACV,OAAO,EAAE,OAAO,OAAO,QAAQ,gBAAgB;AAC7C,QAAK,QAAQ;AACb,QAAK,QAAQ;AACb,QAAK,SAAS;AAEd,IAAC,YAAY;AACX,QAAI;AACF,YAAO;AAEP,UAAK,MAAM,UAAU,OAAO,MAAM,KAAK,OAAO,KAAK,CACjD,OAAM;MAAE,MAAM;MAAU,OAAO;MAAQ,CAAC;AAG1C,aAAQ;cACA;AACR,gBAAW;;OAEX;KAEP;AAED,OAAK,WAAW,OAAO,EAAE,kBAAkB;GACzC,MAAM,WAAW,YAAY,UAAU,KAAK,MAAM,EAAE,SAAS;GAE7D,MAAM,MAAM,MAAM,KAAK,YAAY,MAAM,YAAY;AAErD,SAAM,QAAQ,IAAI,SAAS,KAAK,WAAW,GAAG,MAAM,IAAI,OAAO,CAAC,CAAC;AAEjE,SAAM,GAAG;AAET,QAAK,OAAO;AACZ,QAAK,MAAM,UAAU,SACnB,MAAK,MAAM;IAAE,MAAM;IAAU,OAAO;IAAQ,CAAC;AAE/C,QAAK,QAAQ;;AAGf,OAAK,WAAW,OAAO,EAAE,kBAAkB;GACzC,MAAM,WAAW,YAAY,UAAU,KAAK,MAAM,EAAE,SAAS;GAE7D,MAAM,MAAM,MAAM,KAAK,YAAY,MAAM,YAAY;AAErD,SAAM,QAAQ,IAAI,SAAS,KAAK,WAAW,GAAG,MAAM,IAAI,OAAO,CAAC,CAAC;AAEjE,SAAM,GAAG;AAET,QAAK,OAAO;AACZ,QAAK,MAAM,UAAU,SACnB,MAAK,MAAM;IAAE,MAAM;IAAU,OAAO;IAAQ,CAAC;AAE/C,QAAK,QAAQ;;AAGf,OAAK,WAAW,OAAO,EAAE,kBAAkB;GACzC,MAAM,OAAO,YAAY,UAAU,KAAK,MAAM,EAAE,IAAc;GAE9D,MAAM,MAAM,MAAM,KAAK,YAAY,MAAM,YAAY;AAErD,SAAM,QAAQ,IAAI,KAAK,KAAK,QAAQ,GAAG,MAAM,OAAO,IAAI,CAAC,CAAC;AAE1D,SAAM,GAAG;AAET,QAAK,OAAO;AACZ,QAAK,MAAM,OAAO,KAChB,MAAK,MAAM;IAAE,MAAM;IAAU;IAAK,CAAC;AAErC,QAAK,QAAQ;;;;AAKnB,SAAgB,qBAGd,EAAE,UAAU,QAA+C;AAC3D,QAAO,IAAI,oBAAoB,UAAU,KAAK"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../src/database.ts","../src/options.ts"],"sourcesContent":["import { openDB, type IDBPDatabase } from \"idb\";\nimport type { ObjectStore, ObjectStores, ValidIdPath } from \"./types\";\n\n/**\n * Helper function for IDE auto completion\n */\nexport function defineObjectStore<\n const Entity extends object,\n const IdPath extends ValidIdPath<Entity>,\n>(objectStore: ObjectStore<Entity, IdPath>): ObjectStore<Entity, IdPath> {\n return objectStore;\n}\n\nexport type Database<T extends ObjectStores> = {\n /**\n * Note: Safari does not support Top-Level Await\n */\n idb: Promise<IDBPDatabase>;\n objectStores: T;\n};\n\nexport function createDatabase<const T extends ObjectStores>(\n name: string,\n version: number,\n objectStores: T,\n): Database<T> {\n const idb = openDB(name, version, {\n async upgrade(database) {\n for (const [key, { idPath: keyPath, indicies }] of Object.entries(objectStores)) {\n const objectStore = database.createObjectStore(key, { keyPath });\n\n if (indicies) {\n // oxlint-disable-next-line no-await-in-loop\n await Promise.all(indicies.map((index) => objectStore.createIndex(name, index)));\n }\n }\n },\n });\n\n return { idb, objectStores };\n}\n","import type { StandardSchemaV1 } from \"@standard-schema/spec\";\nimport type {\n ChangeMessageOrDeleteKeyMessage,\n DeleteMutationFn,\n InsertMutationFn,\n SyncConfig,\n UpdateMutationFn,\n} from \"@tanstack/db\";\nimport type { IDBPDatabase } from \"idb\";\nimport type { Database } from \"./database\";\nimport type { ObjectStore, ObjectStoreEntity, ObjectStoreIdType, ObjectStores } from \"./types\";\n\nexport class IDBCollectionConfig<\n const Store extends ObjectStore,\n const Entity extends ObjectStoreEntity<Store>,\n const IdType extends ObjectStoreIdType<Store>,\n> {\n id: string;\n schema: StandardSchemaV1<Entity>;\n getKey: (entity: Entity) => IdType;\n sync: SyncConfig<Entity, IdType>;\n\n onInsert: InsertMutationFn<Entity, IdType>;\n onUpdate: UpdateMutationFn<Entity, IdType>;\n onDelete: DeleteMutationFn<Entity, IdType>;\n\n private begin!: () => void;\n private write!: (message: ChangeMessageOrDeleteKeyMessage<Entity, IdType>) => void;\n private commit!: () => void;\n\n constructor(idb: Promise<IDBPDatabase>, name: string, { idPath, schema }: Store) {\n this.id = name;\n this.schema = schema;\n this.getKey = (entity) => entity[idPath];\n this.sync = {\n sync: ({ begin, write, commit, markReady }) => {\n this.begin = begin;\n this.write = write;\n this.commit = commit;\n\n // oxlint-disable-next-line typescript/no-floating-promises\n (async () => {\n try {\n begin();\n\n for (const entity of await (await idb).getAll(name)) {\n write({ type: \"insert\", value: entity });\n }\n\n commit();\n } finally {\n markReady();\n }\n })();\n },\n };\n\n this.onInsert = async ({ transaction }) => {\n const entities = transaction.mutations.map((m) => m.modified);\n\n const tx = (await idb).transaction(name, \"readwrite\");\n\n await Promise.all(entities.map((entity) => tx.store.add(entity)));\n\n await tx.done;\n\n this.begin();\n for (const entity of entities) {\n this.write({ type: \"insert\", value: entity });\n }\n this.commit();\n };\n\n this.onUpdate = async ({ transaction }) => {\n const entities = transaction.mutations.map((m) => m.modified);\n\n const tx = (await idb).transaction(name, \"readwrite\");\n\n await Promise.all(entities.map((entity) => tx.store.put(entity)));\n\n await tx.done;\n\n this.begin();\n for (const entity of entities) {\n this.write({ type: \"update\", value: entity });\n }\n this.commit();\n };\n\n this.onDelete = async ({ transaction }) => {\n const keys = transaction.mutations.map((m) => m.key);\n\n const tx = (await idb).transaction(name, \"readwrite\");\n\n await Promise.all(keys.map((key) => tx.store.delete(key)));\n\n await tx.done;\n\n this.begin();\n for (const key of keys) {\n this.write({ type: \"delete\", key });\n }\n this.commit();\n };\n }\n}\n\nexport function idbCollectionOptions<\n const T extends ObjectStores,\n const Name extends keyof T & string,\n>({ database: { idb, objectStores }, name }: { database: Database<T>; name: Name }) {\n return new IDBCollectionConfig(idb, name, objectStores[name]!);\n}\n"],"mappings":";;;;;;AAMA,SAAgB,kBAGd,aAAuE;AACvE,QAAO;;AAWT,SAAgB,eACd,MACA,SACA,cACa;AAcb,QAAO;EAAE,KAbG,OAAO,MAAM,SAAS,EAChC,MAAM,QAAQ,UAAU;AACtB,QAAK,MAAM,CAAC,KAAK,EAAE,QAAQ,SAAS,eAAe,OAAO,QAAQ,aAAa,EAAE;IAC/E,MAAM,cAAc,SAAS,kBAAkB,KAAK,EAAE,SAAS,CAAC;AAEhE,QAAI,SAEF,OAAM,QAAQ,IAAI,SAAS,KAAK,UAAU,YAAY,YAAY,MAAM,MAAM,CAAC,CAAC;;KAIvF,CAAC;EAEY;EAAc;;;;;AC3B9B,IAAa,sBAAb,MAIE;CACA;CACA;CACA;CACA;CAEA;CACA;CACA;CAEA,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,YAAY,KAA4B,MAAc,EAAE,QAAQ,UAAiB;AAC/E,OAAK,KAAK;AACV,OAAK,SAAS;AACd,OAAK,UAAU,WAAW,OAAO;AACjC,OAAK,OAAO,EACV,OAAO,EAAE,OAAO,OAAO,QAAQ,gBAAgB;AAC7C,QAAK,QAAQ;AACb,QAAK,QAAQ;AACb,QAAK,SAAS;AAGd,IAAC,YAAY;AACX,QAAI;AACF,YAAO;AAEP,UAAK,MAAM,UAAU,OAAO,MAAM,KAAK,OAAO,KAAK,CACjD,OAAM;MAAE,MAAM;MAAU,OAAO;MAAQ,CAAC;AAG1C,aAAQ;cACA;AACR,gBAAW;;OAEX;KAEP;AAED,OAAK,WAAW,OAAO,EAAE,kBAAkB;GACzC,MAAM,WAAW,YAAY,UAAU,KAAK,MAAM,EAAE,SAAS;GAE7D,MAAM,MAAM,MAAM,KAAK,YAAY,MAAM,YAAY;AAErD,SAAM,QAAQ,IAAI,SAAS,KAAK,WAAW,GAAG,MAAM,IAAI,OAAO,CAAC,CAAC;AAEjE,SAAM,GAAG;AAET,QAAK,OAAO;AACZ,QAAK,MAAM,UAAU,SACnB,MAAK,MAAM;IAAE,MAAM;IAAU,OAAO;IAAQ,CAAC;AAE/C,QAAK,QAAQ;;AAGf,OAAK,WAAW,OAAO,EAAE,kBAAkB;GACzC,MAAM,WAAW,YAAY,UAAU,KAAK,MAAM,EAAE,SAAS;GAE7D,MAAM,MAAM,MAAM,KAAK,YAAY,MAAM,YAAY;AAErD,SAAM,QAAQ,IAAI,SAAS,KAAK,WAAW,GAAG,MAAM,IAAI,OAAO,CAAC,CAAC;AAEjE,SAAM,GAAG;AAET,QAAK,OAAO;AACZ,QAAK,MAAM,UAAU,SACnB,MAAK,MAAM;IAAE,MAAM;IAAU,OAAO;IAAQ,CAAC;AAE/C,QAAK,QAAQ;;AAGf,OAAK,WAAW,OAAO,EAAE,kBAAkB;GACzC,MAAM,OAAO,YAAY,UAAU,KAAK,MAAM,EAAE,IAAI;GAEpD,MAAM,MAAM,MAAM,KAAK,YAAY,MAAM,YAAY;AAErD,SAAM,QAAQ,IAAI,KAAK,KAAK,QAAQ,GAAG,MAAM,OAAO,IAAI,CAAC,CAAC;AAE1D,SAAM,GAAG;AAET,QAAK,OAAO;AACZ,QAAK,MAAM,OAAO,KAChB,MAAK,MAAM;IAAE,MAAM;IAAU;IAAK,CAAC;AAErC,QAAK,QAAQ;;;;AAKnB,SAAgB,qBAGd,EAAE,UAAU,EAAE,KAAK,gBAAgB,QAA+C;AAClF,QAAO,IAAI,oBAAoB,KAAK,MAAM,aAAa,MAAO"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@blaze-chat/tanstack-db-idb-collection",
3
- "version": "0.0.2",
3
+ "version": "0.0.3",
4
4
  "license": "Apache-2.0",
5
5
  "author": "MioYi Sama",
6
6
  "repository": "https://github.com/MioYiSama/blaze-chat/tree/main/packages/tanstack-db-idb-collection",