@ddd-ts/store-firestore 0.0.30 → 0.0.31

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.
@@ -5,8 +5,9 @@ import { DefaultConverter } from "./converter";
5
5
  export declare class FirestoreStore<M extends IIdentifiable, S extends ISerializer<M> = ISerializer<M>> implements Store<M> {
6
6
  readonly _collection: CollectionReference;
7
7
  readonly serializer: S;
8
+ readonly $name?: string | undefined;
8
9
  defaultConverter: DefaultConverter<DocumentData>;
9
- constructor(_collection: CollectionReference, serializer: S);
10
+ constructor(_collection: CollectionReference, serializer: S, $name?: string | undefined);
10
11
  get firestore(): FirebaseFirestore.Firestore;
11
12
  get collection(): CollectionReference<Serialized<S>, Serialized<S>>;
12
13
  executeQuery(query: FirebaseFirestore.Query<any>, trx?: FirestoreTransaction): Promise<M[]>;
@@ -1 +1 @@
1
- {"version":3,"file":"firestore.store.d.ts","sourceRoot":"","sources":["../src/firestore.store.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,qBAAqB,EAEtB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,KAAK,EACL,WAAW,EACX,KAAK,aAAa,EAClB,UAAU,EACX,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,qBAAa,cAAc,CACzB,CAAC,SAAS,aAAa,EACvB,CAAC,SAAS,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CACzC,YAAW,KAAK,CAAC,CAAC,CAAC;aAID,WAAW,EAAE,mBAAmB;aAChC,UAAU,EAAE,CAAC;IAHxB,gBAAgB,iCAA0B;gBAE/B,WAAW,EAAE,mBAAmB,EAChC,UAAU,EAAE,CAAC;IAG/B,IAAI,SAAS,gCAEZ;IAED,IAAI,UAAU,IAGP,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CACvD;IAEK,YAAY,CAChB,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,EACnC,GAAG,CAAC,EAAE,oBAAoB,GACzB,OAAO,CAAC,CAAC,EAAE,CAAC;IAUR,WAAW,CAAC,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM;IAyBjE,WAAW,CAChB,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,EACnC,QAAQ,CAAC,EAAE,MAAM,GAChB,aAAa,CAAC,CAAC,CAAC;IAkBb,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAUzD,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/D,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAerE,OAAO,CAAC,WAAW,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAezD,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9D,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAKxE,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC;IAIxC,QAAQ;IAIR,KAAK,CAAC,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,YAAY,CAAC;CAGzD"}
1
+ {"version":3,"file":"firestore.store.d.ts","sourceRoot":"","sources":["../src/firestore.store.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,YAAY,EACZ,qBAAqB,EAEtB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EACL,KAAK,EACL,WAAW,EACX,KAAK,aAAa,EAClB,UAAU,EACX,MAAM,cAAc,CAAC;AAEtB,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,qBAAa,cAAc,CACzB,CAAC,SAAS,aAAa,EACvB,CAAC,SAAS,WAAW,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CACzC,YAAW,KAAK,CAAC,CAAC,CAAC;aAID,WAAW,EAAE,mBAAmB;aAChC,UAAU,EAAE,CAAC;aACb,KAAK,CAAC,EAAE,MAAM;IAJzB,gBAAgB,iCAA0B;gBAE/B,WAAW,EAAE,mBAAmB,EAChC,UAAU,EAAE,CAAC,EACb,KAAK,CAAC,EAAE,MAAM,YAAA;IAGhC,IAAI,SAAS,gCAEZ;IAED,IAAI,UAAU,IAGP,mBAAmB,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CACvD;IAEK,YAAY,CAChB,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,EACnC,GAAG,CAAC,EAAE,oBAAoB,GACzB,OAAO,CAAC,CAAC,EAAE,CAAC;IAcR,WAAW,CAAC,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM;IAyBjE,WAAW,CAChB,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,EACnC,QAAQ,CAAC,EAAE,MAAM,GAChB,aAAa,CAAC,CAAC,CAAC;IAkBb,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAUzD,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAI/D,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAgBrE,OAAO,CAAC,WAAW,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAmBzD,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,GAAG,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ9D,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAKxE,SAAS,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC,CAAC,CAAC;IAIxC,QAAQ;IAIR,KAAK,CAAC,KAAK,EAAE,iBAAiB,CAAC,KAAK,CAAC,YAAY,CAAC;CAGzD"}
@@ -6,10 +6,12 @@ const converter_1 = require("./converter");
6
6
  class FirestoreStore {
7
7
  _collection;
8
8
  serializer;
9
+ $name;
9
10
  defaultConverter = new converter_1.DefaultConverter();
10
- constructor(_collection, serializer) {
11
+ constructor(_collection, serializer, $name) {
11
12
  this._collection = _collection;
12
13
  this.serializer = serializer;
14
+ this.$name = $name;
13
15
  }
14
16
  get firestore() {
15
17
  return this._collection.firestore;
@@ -19,7 +21,11 @@ class FirestoreStore {
19
21
  }
20
22
  async executeQuery(query, trx) {
21
23
  const result = trx ? await trx.transaction.get(query) : await query.get();
22
- return Promise.all(result.docs.map((doc) => this.serializer.deserialize({ id: doc.id, ...doc.data() })));
24
+ return Promise.all(result.docs.map((doc) => this.serializer.deserialize({
25
+ ...(this.$name ? { $name: this.$name } : {}),
26
+ id: doc.id,
27
+ ...doc.data(),
28
+ })));
23
29
  }
24
30
  async *streamPages(query, pageSize) {
25
31
  let last;
@@ -70,6 +76,7 @@ class FirestoreStore {
70
76
  return undefined;
71
77
  }
72
78
  return this.serializer.deserialize({
79
+ ...(this.$name ? { $name: this.$name } : {}),
73
80
  id: id.serialize(),
74
81
  ...snapshot.data(),
75
82
  });
@@ -82,7 +89,11 @@ class FirestoreStore {
82
89
  else {
83
90
  ({ docs } = await this.collection.get());
84
91
  }
85
- return Promise.all(docs.map((doc) => this.serializer.deserialize({ id: doc.id, ...doc.data() })));
92
+ return Promise.all(docs.map((doc) => this.serializer.deserialize({
93
+ ...(this.$name ? { $name: this.$name } : {}),
94
+ id: doc.id,
95
+ ...doc.data(),
96
+ })));
86
97
  }
87
98
  async delete(id, trx) {
88
99
  if (trx) {
@@ -1 +1 @@
1
- {"version":3,"file":"firestore.store.js","sourceRoot":"","sources":["../src/firestore.store.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n CollectionReference,\n DocumentData,\n QueryDocumentSnapshot,\n DocumentSnapshot,\n} from \"firebase-admin/firestore\";\n\nimport {\n Store,\n ISerializer,\n type IIdentifiable,\n Serialized,\n} from \"@ddd-ts/core\";\n\nimport { FirestoreTransaction } from \"./firestore.transaction\";\nimport { batch } from \"./asyncTools\";\nimport { DefaultConverter } from \"./converter\";\n\nexport class FirestoreStore<\n M extends IIdentifiable,\n S extends ISerializer<M> = ISerializer<M>,\n> implements Store<M>\n{\n public defaultConverter = new DefaultConverter();\n constructor(\n public readonly _collection: CollectionReference,\n public readonly serializer: S,\n ) {}\n\n get firestore() {\n return this._collection.firestore;\n }\n\n get collection() {\n return this._collection.withConverter(\n this.defaultConverter,\n ) as CollectionReference<Serialized<S>, Serialized<S>>;\n }\n\n async executeQuery(\n query: FirebaseFirestore.Query<any>,\n trx?: FirestoreTransaction,\n ): Promise<M[]> {\n const result = trx ? await trx.transaction.get(query) : await query.get();\n\n return Promise.all(\n result.docs.map((doc) =>\n this.serializer.deserialize({ id: doc.id, ...doc.data() }),\n ),\n );\n }\n\n async *streamPages(query: FirebaseFirestore.Query<any>, pageSize: number) {\n let last: DocumentSnapshot | undefined;\n let nextPagePromise:\n | Promise<FirebaseFirestore.QuerySnapshot<any>>\n | undefined;\n\n function getNextPagePromise(cursor: DocumentSnapshot | undefined) {\n return cursor\n ? query.limit(pageSize).startAfter(cursor).get()\n : query.limit(pageSize).get();\n }\n\n do {\n const paginatedQuery = nextPagePromise ?? getNextPagePromise(last);\n const { docs } = await paginatedQuery;\n last = docs[pageSize - 1];\n if (last) {\n nextPagePromise = getNextPagePromise(last);\n }\n for (const doc of docs) {\n yield doc;\n }\n } while (last);\n }\n\n async *streamQuery(\n query: FirebaseFirestore.Query<any>,\n pageSize?: number,\n ): AsyncIterable<M> {\n const finalPageSize = pageSize ?? 50;\n const stream =\n finalPageSize === 1\n ? (query.stream() as AsyncIterable<QueryDocumentSnapshot>)\n : this.streamPages(query, finalPageSize);\n for await (const docs of batch(stream, finalPageSize)) {\n const deserializedDocs = await Promise.all(\n docs.map((doc) =>\n this.serializer.deserialize({ id: doc.id, ...(doc.data() as any) }),\n ),\n );\n for (const deserializedDoc of deserializedDocs) {\n yield deserializedDoc;\n }\n }\n }\n\n async save(model: M, trx?: FirestoreTransaction): Promise<void> {\n const serialized = await this.serializer.serialize(model);\n\n const ref = this.collection.doc(model.id.serialize());\n\n trx\n ? trx.transaction.set(ref, serialized)\n : await ref.set(serialized as any);\n }\n\n async saveAll(models: M[], trx?: FirestoreTransaction): Promise<void> {\n await Promise.all(models.map((m) => this.save(m, trx)));\n }\n\n async load(id: M[\"id\"], trx?: FirestoreTransaction): Promise<M | undefined> {\n const ref = this.collection.doc(id.serialize());\n\n const snapshot = trx ? await trx.transaction.get(ref) : await ref.get();\n\n if (!snapshot.exists) {\n return undefined;\n }\n\n return this.serializer.deserialize({\n id: id.serialize(),\n ...snapshot.data(),\n });\n }\n\n async loadAll(transaction?: FirestoreTransaction): Promise<M[]> {\n let docs: DocumentSnapshot[];\n\n if (transaction) {\n docs = await transaction.transaction.getAll();\n } else {\n ({ docs } = await this.collection.get());\n }\n return Promise.all(\n docs.map((doc) =>\n this.serializer.deserialize({ id: doc.id, ...doc.data() }),\n ),\n );\n }\n\n async delete(id: M[\"id\"], trx?: FirestoreTransaction): Promise<void> {\n if (trx) {\n trx.transaction.delete(this.collection.doc(id.serialize()));\n } else {\n await this.collection.doc(id.serialize()).delete();\n }\n }\n\n async loadMany(ids: M[\"id\"][], trx?: FirestoreTransaction): Promise<M[]> {\n const result = await Promise.all(ids.map((id) => this.load(id, trx)));\n return result.filter((m) => m !== undefined) as M[];\n }\n\n streamAll(pageSize?: number): AsyncIterable<M> {\n return this.streamQuery(this.collection, pageSize);\n }\n\n async countAll() {\n return (await this.collection.count().get()).data().count;\n }\n\n async count(query: FirebaseFirestore.Query<DocumentData>) {\n return (await query.count().get()).data().count;\n }\n}\n"]}
1
+ {"version":3,"file":"firestore.store.js","sourceRoot":"","sources":["../src/firestore.store.ts"],"names":[],"mappings":";;;AAeA,6CAAqC;AACrC,2CAA+C;AAE/C,MAAa,cAAc;IAOP;IACA;IACA;IAJX,gBAAgB,GAAG,IAAI,4BAAgB,EAAE,CAAC;IACjD,YACkB,WAAgC,EAChC,UAAa,EACb,KAAc;QAFd,gBAAW,GAAX,WAAW,CAAqB;QAChC,eAAU,GAAV,UAAU,CAAG;QACb,UAAK,GAAL,KAAK,CAAS;IAC7B,CAAC;IAEJ,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;IACpC,CAAC;IAED,IAAI,UAAU;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC,aAAa,CACnC,IAAI,CAAC,gBAAgB,CAC+B,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,YAAY,CAChB,KAAmC,EACnC,GAA0B;QAE1B,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,GAAG,EAAE,CAAC;QAE1E,OAAO,OAAO,CAAC,GAAG,CAChB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACtB,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;YAC1B,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5C,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,GAAG,GAAG,CAAC,IAAI,EAAE;SACd,CAAC,CACH,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,CAAC,WAAW,CAAC,KAAmC,EAAE,QAAgB;QACtE,IAAI,IAAkC,CAAC;QACvC,IAAI,eAES,CAAC;QAEd,SAAS,kBAAkB,CAAC,MAAoC;YAC9D,OAAO,MAAM;gBACX,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE;gBAChD,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,CAAC;QAClC,CAAC;QAED,GAAG,CAAC;YACF,MAAM,cAAc,GAAG,eAAe,IAAI,kBAAkB,CAAC,IAAI,CAAC,CAAC;YACnE,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,cAAc,CAAC;YACtC,IAAI,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;YAC1B,IAAI,IAAI,EAAE,CAAC;gBACT,eAAe,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;YAC7C,CAAC;YACD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,GAAG,CAAC;YACZ,CAAC;QACH,CAAC,QAAQ,IAAI,EAAE;IACjB,CAAC;IAED,KAAK,CAAC,CAAC,WAAW,CAChB,KAAmC,EACnC,QAAiB;QAEjB,MAAM,aAAa,GAAG,QAAQ,IAAI,EAAE,CAAC;QACrC,MAAM,MAAM,GACV,aAAa,KAAK,CAAC;YACjB,CAAC,CAAE,KAAK,CAAC,MAAM,EAA2C;YAC1D,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC;QAC7C,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,IAAA,kBAAK,EAAC,MAAM,EAAE,aAAa,CAAC,EAAE,CAAC;YACtD,MAAM,gBAAgB,GAAG,MAAM,OAAO,CAAC,GAAG,CACxC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACf,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,EAAE,GAAI,GAAG,CAAC,IAAI,EAAU,EAAE,CAAC,CACpE,CACF,CAAC;YACF,KAAK,MAAM,eAAe,IAAI,gBAAgB,EAAE,CAAC;gBAC/C,MAAM,eAAe,CAAC;YACxB,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAQ,EAAE,GAA0B;QAC7C,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QAE1D,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC;QAEtD,GAAG;YACD,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC;YACtC,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,UAAiB,CAAC,CAAC;IACvC,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,MAAW,EAAE,GAA0B;QACnD,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAW,EAAE,GAA0B;QAChD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC;QAEhD,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,EAAE,CAAC;QAExE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACrB,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,OAAO,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;YACjC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5C,EAAE,EAAE,EAAE,CAAC,SAAS,EAAE;YAClB,GAAG,QAAQ,CAAC,IAAI,EAAE;SACnB,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,WAAkC;QAC9C,IAAI,IAAwB,CAAC;QAE7B,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,CAAC,EAAE,IAAI,EAAE,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,OAAO,CAAC,GAAG,CAChB,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CACf,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;YAC1B,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5C,EAAE,EAAE,GAAG,CAAC,EAAE;YACV,GAAG,GAAG,CAAC,IAAI,EAAE;SACd,CAAC,CACH,CACF,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAW,EAAE,GAA0B;QAClD,IAAI,GAAG,EAAE,CAAC;YACR,GAAG,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAC9D,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;QACrD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAc,EAAE,GAA0B;QACvD,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QACtE,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,SAAS,CAAQ,CAAC;IACtD,CAAC;IAED,SAAS,CAAC,QAAiB;QACzB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,OAAO,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,KAA4C;QACtD,OAAO,CAAC,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC;IAClD,CAAC;CACF;AA9JD,wCA8JC","sourcesContent":["import {\n CollectionReference,\n DocumentData,\n QueryDocumentSnapshot,\n DocumentSnapshot,\n} from \"firebase-admin/firestore\";\n\nimport {\n Store,\n ISerializer,\n type IIdentifiable,\n Serialized,\n} from \"@ddd-ts/core\";\n\nimport { FirestoreTransaction } from \"./firestore.transaction\";\nimport { batch } from \"./asyncTools\";\nimport { DefaultConverter } from \"./converter\";\n\nexport class FirestoreStore<\n M extends IIdentifiable,\n S extends ISerializer<M> = ISerializer<M>,\n> implements Store<M>\n{\n public defaultConverter = new DefaultConverter();\n constructor(\n public readonly _collection: CollectionReference,\n public readonly serializer: S,\n public readonly $name?: string,\n ) {}\n\n get firestore() {\n return this._collection.firestore;\n }\n\n get collection() {\n return this._collection.withConverter(\n this.defaultConverter,\n ) as CollectionReference<Serialized<S>, Serialized<S>>;\n }\n\n async executeQuery(\n query: FirebaseFirestore.Query<any>,\n trx?: FirestoreTransaction,\n ): Promise<M[]> {\n const result = trx ? await trx.transaction.get(query) : await query.get();\n\n return Promise.all(\n result.docs.map((doc) =>\n this.serializer.deserialize({\n ...(this.$name ? { $name: this.$name } : {}),\n id: doc.id,\n ...doc.data(),\n }),\n ),\n );\n }\n\n async *streamPages(query: FirebaseFirestore.Query<any>, pageSize: number) {\n let last: DocumentSnapshot | undefined;\n let nextPagePromise:\n | Promise<FirebaseFirestore.QuerySnapshot<any>>\n | undefined;\n\n function getNextPagePromise(cursor: DocumentSnapshot | undefined) {\n return cursor\n ? query.limit(pageSize).startAfter(cursor).get()\n : query.limit(pageSize).get();\n }\n\n do {\n const paginatedQuery = nextPagePromise ?? getNextPagePromise(last);\n const { docs } = await paginatedQuery;\n last = docs[pageSize - 1];\n if (last) {\n nextPagePromise = getNextPagePromise(last);\n }\n for (const doc of docs) {\n yield doc;\n }\n } while (last);\n }\n\n async *streamQuery(\n query: FirebaseFirestore.Query<any>,\n pageSize?: number,\n ): AsyncIterable<M> {\n const finalPageSize = pageSize ?? 50;\n const stream =\n finalPageSize === 1\n ? (query.stream() as AsyncIterable<QueryDocumentSnapshot>)\n : this.streamPages(query, finalPageSize);\n for await (const docs of batch(stream, finalPageSize)) {\n const deserializedDocs = await Promise.all(\n docs.map((doc) =>\n this.serializer.deserialize({ id: doc.id, ...(doc.data() as any) }),\n ),\n );\n for (const deserializedDoc of deserializedDocs) {\n yield deserializedDoc;\n }\n }\n }\n\n async save(model: M, trx?: FirestoreTransaction): Promise<void> {\n const serialized = await this.serializer.serialize(model);\n\n const ref = this.collection.doc(model.id.serialize());\n\n trx\n ? trx.transaction.set(ref, serialized)\n : await ref.set(serialized as any);\n }\n\n async saveAll(models: M[], trx?: FirestoreTransaction): Promise<void> {\n await Promise.all(models.map((m) => this.save(m, trx)));\n }\n\n async load(id: M[\"id\"], trx?: FirestoreTransaction): Promise<M | undefined> {\n const ref = this.collection.doc(id.serialize());\n\n const snapshot = trx ? await trx.transaction.get(ref) : await ref.get();\n\n if (!snapshot.exists) {\n return undefined;\n }\n\n return this.serializer.deserialize({\n ...(this.$name ? { $name: this.$name } : {}),\n id: id.serialize(),\n ...snapshot.data(),\n });\n }\n\n async loadAll(transaction?: FirestoreTransaction): Promise<M[]> {\n let docs: DocumentSnapshot[];\n\n if (transaction) {\n docs = await transaction.transaction.getAll();\n } else {\n ({ docs } = await this.collection.get());\n }\n return Promise.all(\n docs.map((doc) =>\n this.serializer.deserialize({\n ...(this.$name ? { $name: this.$name } : {}),\n id: doc.id,\n ...doc.data(),\n }),\n ),\n );\n }\n\n async delete(id: M[\"id\"], trx?: FirestoreTransaction): Promise<void> {\n if (trx) {\n trx.transaction.delete(this.collection.doc(id.serialize()));\n } else {\n await this.collection.doc(id.serialize()).delete();\n }\n }\n\n async loadMany(ids: M[\"id\"][], trx?: FirestoreTransaction): Promise<M[]> {\n const result = await Promise.all(ids.map((id) => this.load(id, trx)));\n return result.filter((m) => m !== undefined) as M[];\n }\n\n streamAll(pageSize?: number): AsyncIterable<M> {\n return this.streamQuery(this.collection, pageSize);\n }\n\n async countAll() {\n return (await this.collection.count().get()).data().count;\n }\n\n async count(query: FirebaseFirestore.Query<DocumentData>) {\n return (await query.count().get()).data().count;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ddd-ts/store-firestore",
3
- "version": "0.0.30",
3
+ "version": "0.0.31",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "license": "MIT",
@@ -8,12 +8,12 @@
8
8
  "build": "tsc"
9
9
  },
10
10
  "dependencies": {
11
- "@ddd-ts/core": "0.0.30",
11
+ "@ddd-ts/core": "0.0.31",
12
12
  "firebase-admin": "^13.2.0"
13
13
  },
14
14
  "devDependencies": {
15
- "@ddd-ts/tools": "0.0.30",
16
- "@ddd-ts/types": "0.0.30",
15
+ "@ddd-ts/tools": "0.0.31",
16
+ "@ddd-ts/types": "0.0.31",
17
17
  "@types/jest": "^29.5.1"
18
18
  }
19
19
  }