@ddd-ts/store-firestore 0.0.32 → 0.0.33

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,7 +5,7 @@ export declare class DefaultConverter<T extends FirebaseFirestore.DocumentData>
5
5
  fromFirestoreSnapshot(snapshot: FirebaseFirestore.DocumentSnapshot): T | undefined;
6
6
  toFirestorePartial(modelObject: Partial<T> | FirebaseFirestore.UpdateData<T>): FirebaseFirestore.UpdateData<T>;
7
7
  }
8
- export declare function removeUndefined<T>(obj: T): T;
8
+ export declare function toFirestore<T>(obj: T): T;
9
9
  /**
10
10
  * decode Firebase timestamps into Dates
11
11
  */
@@ -1 +1 @@
1
- {"version":3,"file":"converter.d.ts","sourceRoot":"","sources":["../src/converter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAE9E,qBAAa,gBAAgB,CAAC,CAAC,SAAS,iBAAiB,CAAC,YAAY,CACpE,YAAW,sBAAsB,CAAC,CAAC,CAAC;IAE7B,WAAW,CAAC,WAAW,EAAE,CAAC,GAAG,iBAAiB,CAAC,YAAY;IAI3D,aAAa,CAAC,QAAQ,EAAE,iBAAiB,CAAC,qBAAqB,GAAG,CAAC;IAInE,qBAAqB,CAC1B,QAAQ,EAAE,iBAAiB,CAAC,gBAAgB,GAC3C,CAAC,GAAG,SAAS;IAQT,kBAAkB,CACvB,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC,GACxD,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;CAGnC;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAuB5C;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,iBAAiB,CAAC,YAAY,GAClC,iBAAiB,CAAC,YAAY,CAuBhC"}
1
+ {"version":3,"file":"converter.d.ts","sourceRoot":"","sources":["../src/converter.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,sBAAsB,EAEvB,MAAM,0BAA0B,CAAC;AAElC,qBAAa,gBAAgB,CAAC,CAAC,SAAS,iBAAiB,CAAC,YAAY,CACpE,YAAW,sBAAsB,CAAC,CAAC,CAAC;IAE7B,WAAW,CAAC,WAAW,EAAE,CAAC,GAAG,iBAAiB,CAAC,YAAY;IAI3D,aAAa,CAAC,QAAQ,EAAE,iBAAiB,CAAC,qBAAqB,GAAG,CAAC;IAInE,qBAAqB,CAC1B,QAAQ,EAAE,iBAAiB,CAAC,gBAAgB,GAC3C,CAAC,GAAG,SAAS;IAQT,kBAAkB,CACvB,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC,GACxD,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;CAGnC;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAmCxC;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE,iBAAiB,CAAC,YAAY,GAClC,iBAAiB,CAAC,YAAY,CAgChC"}
package/dist/converter.js CHANGED
@@ -1,12 +1,12 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DefaultConverter = void 0;
4
- exports.removeUndefined = removeUndefined;
4
+ exports.toFirestore = toFirestore;
5
5
  exports.decodeFirebaseTimestamps = decodeFirebaseTimestamps;
6
6
  const firestore_1 = require("firebase-admin/firestore");
7
7
  class DefaultConverter {
8
8
  toFirestore(modelObject) {
9
- return removeUndefined(modelObject);
9
+ return toFirestore(modelObject);
10
10
  }
11
11
  fromFirestore(snapshot) {
12
12
  return decodeFirebaseTimestamps(snapshot.data());
@@ -19,23 +19,32 @@ class DefaultConverter {
19
19
  return decodeFirebaseTimestamps(data);
20
20
  }
21
21
  toFirestorePartial(modelObject) {
22
- return removeUndefined(modelObject);
22
+ return toFirestore(modelObject);
23
23
  }
24
24
  }
25
25
  exports.DefaultConverter = DefaultConverter;
26
- function removeUndefined(obj) {
27
- if (obj instanceof Date ||
28
- obj instanceof firestore_1.FieldValue ||
29
- obj?.constructor?.name === "VectorValue") {
26
+ function toFirestore(obj) {
27
+ if (obj instanceof Date) {
28
+ if ("microseconds" in obj &&
29
+ typeof obj.microseconds === "bigint") {
30
+ const microseconds = obj.microseconds;
31
+ const seconds = microseconds / 1000000n;
32
+ const micros = microseconds % 1000000n;
33
+ const nanoseconds = micros * 1000n; // Convert to nanoseconds
34
+ return new firestore_1.Timestamp(Number(seconds), Number(nanoseconds));
35
+ }
36
+ return obj;
37
+ }
38
+ if (obj instanceof firestore_1.FieldValue || obj?.constructor?.name === "VectorValue") {
30
39
  return obj;
31
40
  }
32
41
  if (Array.isArray(obj)) {
33
- return obj.map(removeUndefined);
42
+ return obj.map(toFirestore);
34
43
  }
35
44
  if (obj instanceof Object) {
36
45
  return Object.entries(obj).reduce((map, [key, value]) => {
37
46
  if (value !== undefined) {
38
- map[key] = removeUndefined(value);
47
+ map[key] = toFirestore(value);
39
48
  }
40
49
  return map;
41
50
  }, {});
@@ -50,7 +59,14 @@ function decodeFirebaseTimestamps(obj) {
50
59
  return obj;
51
60
  }
52
61
  if (obj?.toDate) {
53
- return obj.toDate();
62
+ const result = obj.toDate();
63
+ if (obj?.seconds !== undefined && obj?.nanoseconds !== undefined) {
64
+ const microseconds = BigInt(obj.seconds) * BigInt(1_000_000) +
65
+ BigInt(obj.nanoseconds) / BigInt(1_000);
66
+ result.microseconds = microseconds; // Attach microseconds to the date
67
+ return result;
68
+ }
69
+ return result;
54
70
  }
55
71
  if (obj?.constructor?.name === "VectorValue") {
56
72
  return obj;
@@ -1 +1 @@
1
- {"version":3,"file":"converter.js","sourceRoot":"","sources":["../src/converter.ts"],"names":[],"mappings":";;;AA8BA,0CAuBC;AAKD,4DAyBC;AAnFD,wDAA8E;AAE9E,MAAa,gBAAgB;IAGpB,WAAW,CAAC,WAAc;QAC/B,OAAO,eAAe,CAAC,WAAW,CAAC,CAAC;IACtC,CAAC;IAEM,aAAa,CAAC,QAAiD;QACpE,OAAO,wBAAwB,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;IACxD,CAAC;IAEM,qBAAqB,CAC1B,QAA4C;QAE5C,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,wBAAwB,CAAC,IAAI,CAAM,CAAC;IAC7C,CAAC;IAEM,kBAAkB,CACvB,WAAyD;QAEzD,OAAO,eAAe,CAAC,WAAW,CAAQ,CAAC;IAC7C,CAAC;CACF;AA1BD,4CA0BC;AAED,SAAgB,eAAe,CAAI,GAAM;IACvC,IACE,GAAG,YAAY,IAAI;QACnB,GAAG,YAAY,sBAAU;QACzB,GAAG,EAAE,WAAW,EAAE,IAAI,KAAK,aAAa,EACxC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,GAAG,CAAC,eAAe,CAAiB,CAAC;IAClD,CAAC;IACD,IAAI,GAAG,YAAY,MAAM,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAC/B,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YACpB,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,GAAG,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;YACpC,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,EACD,EAA4B,CACxB,CAAC;IACT,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,SAAgB,wBAAwB,CACtC,GAAmC;IAEnC,IAAI,GAAG,YAAY,IAAI,EAAE,CAAC;QACxB,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,GAAG,EAAE,MAAM,EAAE,CAAC;QAChB,OAAO,GAAG,CAAC,MAAM,EAAE,CAAC;IACtB,CAAC;IACD,IAAI,GAAG,EAAE,WAAW,EAAE,IAAI,KAAK,aAAa,EAAE,CAAC;QAC7C,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,GAAG,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,GAAG,YAAY,MAAM,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,CAC/B,CAAC,GAAG,EAAE,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YACpB,GAAG,CAAC,GAAG,CAAC,GAAG,wBAAwB,CAAC,KAAK,CAAC,CAAC;YAC3C,OAAO,GAAG,CAAC;QACb,CAAC,EACD,EAA4B,CAC7B,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC","sourcesContent":["import { FieldValue, FirestoreDataConverter } from \"firebase-admin/firestore\";\n\nexport class DefaultConverter<T extends FirebaseFirestore.DocumentData>\n implements FirestoreDataConverter<T>\n{\n public toFirestore(modelObject: T): FirebaseFirestore.DocumentData {\n return removeUndefined(modelObject);\n }\n\n public fromFirestore(snapshot: FirebaseFirestore.QueryDocumentSnapshot): T {\n return decodeFirebaseTimestamps(snapshot.data()) as T;\n }\n\n public fromFirestoreSnapshot(\n snapshot: FirebaseFirestore.DocumentSnapshot,\n ): T | undefined {\n const data = snapshot.data();\n if (!data) {\n return undefined;\n }\n return decodeFirebaseTimestamps(data) as T;\n }\n\n public toFirestorePartial(\n modelObject: Partial<T> | FirebaseFirestore.UpdateData<T>,\n ): FirebaseFirestore.UpdateData<T> {\n return removeUndefined(modelObject) as any;\n }\n}\n\nexport function removeUndefined<T>(obj: T): T {\n if (\n obj instanceof Date ||\n obj instanceof FieldValue ||\n obj?.constructor?.name === \"VectorValue\"\n ) {\n return obj;\n }\n if (Array.isArray(obj)) {\n return obj.map(removeUndefined) as unknown as T;\n }\n if (obj instanceof Object) {\n return Object.entries(obj).reduce(\n (map, [key, value]) => {\n if (value !== undefined) {\n map[key] = removeUndefined(value);\n }\n return map;\n },\n {} as { [key: string]: any },\n ) as T;\n }\n return obj;\n}\n\n/**\n * decode Firebase timestamps into Dates\n */\nexport function decodeFirebaseTimestamps(\n obj: FirebaseFirestore.DocumentData,\n): FirebaseFirestore.DocumentData {\n if (obj instanceof Date) {\n return obj;\n }\n if (obj?.toDate) {\n return obj.toDate();\n }\n if (obj?.constructor?.name === \"VectorValue\") {\n return obj;\n }\n if (Array.isArray(obj)) {\n return obj.map(decodeFirebaseTimestamps);\n }\n if (obj instanceof Object) {\n return Object.entries(obj).reduce(\n (map, [key, value]) => {\n map[key] = decodeFirebaseTimestamps(value);\n return map;\n },\n {} as { [key: string]: any },\n );\n }\n return obj;\n}\n"]}
1
+ {"version":3,"file":"converter.js","sourceRoot":"","sources":["../src/converter.ts"],"names":[],"mappings":"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","sourcesContent":["import { MicrosecondTimestamp } from \"@ddd-ts/shape\";\nimport {\n FieldValue,\n FirestoreDataConverter,\n Timestamp,\n} from \"firebase-admin/firestore\";\n\nexport class DefaultConverter<T extends FirebaseFirestore.DocumentData>\n implements FirestoreDataConverter<T>\n{\n public toFirestore(modelObject: T): FirebaseFirestore.DocumentData {\n return toFirestore(modelObject) as FirebaseFirestore.DocumentData;\n }\n\n public fromFirestore(snapshot: FirebaseFirestore.QueryDocumentSnapshot): T {\n return decodeFirebaseTimestamps(snapshot.data()) as T;\n }\n\n public fromFirestoreSnapshot(\n snapshot: FirebaseFirestore.DocumentSnapshot,\n ): T | undefined {\n const data = snapshot.data();\n if (!data) {\n return undefined;\n }\n return decodeFirebaseTimestamps(data) as T;\n }\n\n public toFirestorePartial(\n modelObject: Partial<T> | FirebaseFirestore.UpdateData<T>,\n ): FirebaseFirestore.UpdateData<T> {\n return toFirestore(modelObject) as any;\n }\n}\n\nexport function toFirestore<T>(obj: T): T {\n if (obj instanceof Date) {\n if (\n \"microseconds\" in obj &&\n typeof (obj as any).microseconds === \"bigint\"\n ) {\n const microseconds = (obj as any).microseconds as bigint;\n const seconds = microseconds / 1_000_000n;\n const micros = microseconds % 1_000_000n;\n const nanoseconds = micros * 1000n; // Convert to nanoseconds\n return new Timestamp(\n Number(seconds),\n Number(nanoseconds),\n ) as unknown as T;\n }\n return obj;\n }\n if (obj instanceof FieldValue || obj?.constructor?.name === \"VectorValue\") {\n return obj;\n }\n if (Array.isArray(obj)) {\n return obj.map(toFirestore) as unknown as T;\n }\n if (obj instanceof Object) {\n return Object.entries(obj).reduce(\n (map, [key, value]) => {\n if (value !== undefined) {\n map[key] = toFirestore(value);\n }\n return map;\n },\n {} as { [key: string]: any },\n ) as T;\n }\n return obj;\n}\n\n/**\n * decode Firebase timestamps into Dates\n */\nexport function decodeFirebaseTimestamps(\n obj: FirebaseFirestore.DocumentData,\n): FirebaseFirestore.DocumentData {\n if (obj instanceof Date) {\n return obj;\n }\n if (obj?.toDate) {\n const result = obj.toDate();\n\n if (obj?.seconds !== undefined && obj?.nanoseconds !== undefined) {\n const microseconds =\n BigInt(obj.seconds) * BigInt(1_000_000) +\n BigInt(obj.nanoseconds) / BigInt(1_000);\n (result as any).microseconds = microseconds; // Attach microseconds to the date\n return result;\n }\n return result;\n }\n if (obj?.constructor?.name === \"VectorValue\") {\n return obj;\n }\n if (Array.isArray(obj)) {\n return obj.map(decodeFirebaseTimestamps);\n }\n if (obj instanceof Object) {\n return Object.entries(obj).reduce(\n (map, [key, value]) => {\n map[key] = decodeFirebaseTimestamps(value);\n return map;\n },\n {} as { [key: string]: any },\n );\n }\n return obj;\n}\n"]}
@@ -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;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"}
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;IAsBb,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"}
@@ -53,7 +53,11 @@ class FirestoreStore {
53
53
  ? query.stream()
54
54
  : this.streamPages(query, finalPageSize);
55
55
  for await (const docs of (0, asyncTools_1.batch)(stream, finalPageSize)) {
56
- const deserializedDocs = await Promise.all(docs.map((doc) => this.serializer.deserialize({ id: doc.id, ...doc.data() })));
56
+ const deserializedDocs = await Promise.all(docs.map((doc) => this.serializer.deserialize({
57
+ ...(this.$name ? { $name: this.$name } : {}),
58
+ id: doc.id,
59
+ ...doc.data(),
60
+ })));
57
61
  for (const deserializedDoc of deserializedDocs) {
58
62
  yield deserializedDoc;
59
63
  }
@@ -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 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"]}
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 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({\n ...(this.$name ? { $name: this.$name } : {}),\n id: doc.id,\n ...(doc.data() as any),\n }),\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"]}
@@ -35,17 +35,18 @@ var __importStar = (this && this.__importStar) || (function () {
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
36
  process.env.FIRESTORE_EMULATOR_HOST = "localhost:8080";
37
37
  const fb = __importStar(require("firebase-admin"));
38
- const dist_1 = require("../../shape/dist");
38
+ const shape_1 = require("@ddd-ts/shape");
39
39
  const firestore_store_1 = require("./firestore.store");
40
40
  const core_1 = require("@ddd-ts/core");
41
41
  describe("FirestoreStore", () => {
42
42
  const app = fb.initializeApp({ projectId: "demo-es" });
43
43
  const database = app.firestore();
44
- class AccountId extends (0, dist_1.Primitive)(String) {
44
+ class AccountId extends (0, shape_1.Primitive)(String) {
45
45
  }
46
- class Account extends (0, dist_1.Shape)({
46
+ class Account extends (0, shape_1.Shape)({
47
47
  id: AccountId,
48
48
  balance: Number,
49
+ timestamp: (0, shape_1.Optional)(shape_1.MicrosecondTimestamp),
49
50
  }) {
50
51
  }
51
52
  class AccountSerializer extends core_1.AutoSerializer.First(Account) {
@@ -57,7 +58,11 @@ describe("FirestoreStore", () => {
57
58
  }
58
59
  const firestoreAccountStore = new FirestoreAccountStore(database);
59
60
  it("saves and retrieves an account", async () => {
60
- const account = new Account({ id: new AccountId("123"), balance: 100 });
61
+ const account = new Account({
62
+ id: new AccountId("123"),
63
+ balance: 100,
64
+ timestamp: undefined,
65
+ });
61
66
  await firestoreAccountStore.save(account);
62
67
  const retrievedAccount = await firestoreAccountStore.load(account.id);
63
68
  expect(retrievedAccount).toEqual(account);
@@ -67,5 +72,16 @@ describe("FirestoreStore", () => {
67
72
  expect(accounts).toBeInstanceOf(Array);
68
73
  expect(accounts.length).toBeGreaterThan(0);
69
74
  });
75
+ it("works with microsecond timestamps", async () => {
76
+ const timestamp = shape_1.MicrosecondTimestamp.now().add(123n);
77
+ const account = new Account({
78
+ id: new AccountId("456"),
79
+ balance: 200,
80
+ timestamp: timestamp,
81
+ });
82
+ await firestoreAccountStore.save(account);
83
+ const retrievedAccount = await firestoreAccountStore.load(account.id);
84
+ expect(retrievedAccount).toEqual(account);
85
+ });
70
86
  });
71
87
  //# sourceMappingURL=firestore.store.spec.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"firestore.store.spec.js","sourceRoot":"","sources":["../src/firestore.store.spec.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,gBAAgB,CAAC;AAEvD,mDAAqC;AACrC,2CAAoD;AACpD,uDAAmD;AACnD,uCAA8C;AAE9C,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,MAAM,GAAG,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;IAEjC,MAAM,SAAU,SAAQ,IAAA,gBAAS,EAAC,MAAM,CAAC;KAAG;IAC5C,MAAM,OAAQ,SAAQ,IAAA,YAAK,EAAC;QAC1B,EAAE,EAAE,SAAS;QACb,OAAO,EAAE,MAAM;KAChB,CAAC;KAAG;IAEL,MAAM,iBAAkB,SAAQ,qBAAc,CAAC,KAAK,CAAC,OAAO,CAAC;KAAG;IAEhE,MAAM,qBAAsB,SAAQ,gCAAuB;QACzD,YAAY,QAAgC;YAC1C,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,IAAI,iBAAiB,EAAE,CAAC,CAAC;QAClE,CAAC;KACF;IAED,MAAM,qBAAqB,GAAG,IAAI,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAElE,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,EAAE,EAAE,IAAI,SAAS,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QACxE,MAAM,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE1C,MAAM,gBAAgB,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACtE,MAAM,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;QAClC,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,OAAO,EAAE,CAAC;QACvD,MAAM,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["process.env.FIRESTORE_EMULATOR_HOST = \"localhost:8080\";\n\nimport * as fb from \"firebase-admin\";\nimport { Primitive, Shape } from \"../../shape/dist\";\nimport { FirestoreStore } from \"./firestore.store\";\nimport { AutoSerializer } from \"@ddd-ts/core\";\n\ndescribe(\"FirestoreStore\", () => {\n const app = fb.initializeApp({ projectId: \"demo-es\" });\n const database = app.firestore();\n\n class AccountId extends Primitive(String) {}\n class Account extends Shape({\n id: AccountId,\n balance: Number,\n }) {}\n\n class AccountSerializer extends AutoSerializer.First(Account) {}\n\n class FirestoreAccountStore extends FirestoreStore<Account> {\n constructor(database: fb.firestore.Firestore) {\n super(database.collection(\"accounts\"), new AccountSerializer());\n }\n }\n\n const firestoreAccountStore = new FirestoreAccountStore(database);\n\n it(\"saves and retrieves an account\", async () => {\n const account = new Account({ id: new AccountId(\"123\"), balance: 100 });\n await firestoreAccountStore.save(account);\n\n const retrievedAccount = await firestoreAccountStore.load(account.id);\n expect(retrievedAccount).toEqual(account);\n });\n\n it(\"loads all accounts\", async () => {\n const accounts = await firestoreAccountStore.loadAll();\n expect(accounts).toBeInstanceOf(Array);\n expect(accounts.length).toBeGreaterThan(0);\n });\n});\n"]}
1
+ {"version":3,"file":"firestore.store.spec.js","sourceRoot":"","sources":["../src/firestore.store.spec.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,gBAAgB,CAAC;AAEvD,mDAAqC;AACrC,yCAKuB;AACvB,uDAAmD;AACnD,uCAA8C;AAE9C,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,MAAM,GAAG,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,SAAS,EAAE,SAAS,EAAE,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC;IAEjC,MAAM,SAAU,SAAQ,IAAA,iBAAS,EAAC,MAAM,CAAC;KAAG;IAC5C,MAAM,OAAQ,SAAQ,IAAA,aAAK,EAAC;QAC1B,EAAE,EAAE,SAAS;QACb,OAAO,EAAE,MAAM;QACf,SAAS,EAAE,IAAA,gBAAQ,EAAC,4BAAoB,CAAC;KAC1C,CAAC;KAAG;IAEL,MAAM,iBAAkB,SAAQ,qBAAc,CAAC,KAAK,CAAC,OAAO,CAAC;KAAG;IAEhE,MAAM,qBAAsB,SAAQ,gCAAuB;QACzD,YAAY,QAAgC;YAC1C,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,IAAI,iBAAiB,EAAE,CAAC,CAAC;QAClE,CAAC;KACF;IAED,MAAM,qBAAqB,GAAG,IAAI,qBAAqB,CAAC,QAAQ,CAAC,CAAC;IAElE,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC;YAC1B,EAAE,EAAE,IAAI,SAAS,CAAC,KAAK,CAAC;YACxB,OAAO,EAAE,GAAG;YACZ,SAAS,EAAE,SAAS;SACrB,CAAC,CAAC;QACH,MAAM,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE1C,MAAM,gBAAgB,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACtE,MAAM,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oBAAoB,EAAE,KAAK,IAAI,EAAE;QAClC,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,OAAO,EAAE,CAAC;QACvD,MAAM,CAAC,QAAQ,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IAC7C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,SAAS,GAAG,4BAAoB,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAEvD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC;YAC1B,EAAE,EAAE,IAAI,SAAS,CAAC,KAAK,CAAC;YACxB,OAAO,EAAE,GAAG;YACZ,SAAS,EAAE,SAAS;SACrB,CAAC,CAAC;QAEH,MAAM,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE1C,MAAM,gBAAgB,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACtE,MAAM,CAAC,gBAAgB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["process.env.FIRESTORE_EMULATOR_HOST = \"localhost:8080\";\n\nimport * as fb from \"firebase-admin\";\nimport {\n Primitive,\n Shape,\n MicrosecondTimestamp,\n Optional,\n} from \"@ddd-ts/shape\";\nimport { FirestoreStore } from \"./firestore.store\";\nimport { AutoSerializer } from \"@ddd-ts/core\";\n\ndescribe(\"FirestoreStore\", () => {\n const app = fb.initializeApp({ projectId: \"demo-es\" });\n const database = app.firestore();\n\n class AccountId extends Primitive(String) {}\n class Account extends Shape({\n id: AccountId,\n balance: Number,\n timestamp: Optional(MicrosecondTimestamp),\n }) {}\n\n class AccountSerializer extends AutoSerializer.First(Account) {}\n\n class FirestoreAccountStore extends FirestoreStore<Account> {\n constructor(database: fb.firestore.Firestore) {\n super(database.collection(\"accounts\"), new AccountSerializer());\n }\n }\n\n const firestoreAccountStore = new FirestoreAccountStore(database);\n\n it(\"saves and retrieves an account\", async () => {\n const account = new Account({\n id: new AccountId(\"123\"),\n balance: 100,\n timestamp: undefined,\n });\n await firestoreAccountStore.save(account);\n\n const retrievedAccount = await firestoreAccountStore.load(account.id);\n expect(retrievedAccount).toEqual(account);\n });\n\n it(\"loads all accounts\", async () => {\n const accounts = await firestoreAccountStore.loadAll();\n expect(accounts).toBeInstanceOf(Array);\n expect(accounts.length).toBeGreaterThan(0);\n });\n\n it(\"works with microsecond timestamps\", async () => {\n const timestamp = MicrosecondTimestamp.now().add(123n);\n\n const account = new Account({\n id: new AccountId(\"456\"),\n balance: 200,\n timestamp: timestamp,\n });\n\n await firestoreAccountStore.save(account);\n\n const retrievedAccount = await firestoreAccountStore.load(account.id);\n expect(retrievedAccount).toEqual(account);\n });\n});\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ddd-ts/store-firestore",
3
- "version": "0.0.32",
3
+ "version": "0.0.33",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "license": "MIT",
@@ -8,12 +8,13 @@
8
8
  "build": "tsc"
9
9
  },
10
10
  "dependencies": {
11
- "@ddd-ts/core": "0.0.32",
11
+ "@ddd-ts/core": "0.0.33",
12
12
  "firebase-admin": "^13.2.0"
13
13
  },
14
14
  "devDependencies": {
15
- "@ddd-ts/tools": "0.0.32",
16
- "@ddd-ts/types": "0.0.32",
15
+ "@ddd-ts/shape": "0.0.33",
16
+ "@ddd-ts/tools": "0.0.33",
17
+ "@ddd-ts/types": "0.0.33",
17
18
  "@types/jest": "^29.5.1"
18
19
  }
19
20
  }