@cravery/firebase 0.0.44 → 0.0.46

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.
Files changed (72) hide show
  1. package/dist/converters/access/usage.d.ts.map +1 -1
  2. package/dist/converters/access/usage.js.map +1 -1
  3. package/dist/converters/equipment/content.d.ts +1 -1
  4. package/dist/converters/equipment/content.d.ts.map +1 -1
  5. package/dist/converters/equipment/content.js +2 -2
  6. package/dist/converters/equipment/content.js.map +1 -1
  7. package/dist/converters/equipment/meta.d.ts +1 -1
  8. package/dist/converters/equipment/meta.d.ts.map +1 -1
  9. package/dist/converters/equipment/meta.js +2 -2
  10. package/dist/converters/equipment/meta.js.map +1 -1
  11. package/dist/converters/index.d.ts +2 -1
  12. package/dist/converters/index.d.ts.map +1 -1
  13. package/dist/converters/index.js +2 -1
  14. package/dist/converters/index.js.map +1 -1
  15. package/dist/converters/ingredients/content.d.ts +1 -1
  16. package/dist/converters/ingredients/content.d.ts.map +1 -1
  17. package/dist/converters/ingredients/content.js +2 -2
  18. package/dist/converters/ingredients/content.js.map +1 -1
  19. package/dist/converters/ingredients/meta.d.ts +1 -1
  20. package/dist/converters/ingredients/meta.d.ts.map +1 -1
  21. package/dist/converters/ingredients/meta.js +2 -2
  22. package/dist/converters/ingredients/meta.js.map +1 -1
  23. package/dist/converters/interactions/cook.d.ts +4 -0
  24. package/dist/converters/interactions/cook.d.ts.map +1 -0
  25. package/dist/converters/interactions/cook.js +26 -0
  26. package/dist/converters/interactions/cook.js.map +1 -0
  27. package/dist/converters/interactions/index.d.ts +4 -0
  28. package/dist/converters/interactions/index.d.ts.map +1 -0
  29. package/dist/converters/interactions/index.js +20 -0
  30. package/dist/converters/interactions/index.js.map +1 -0
  31. package/dist/converters/interactions/rate.d.ts +4 -0
  32. package/dist/converters/interactions/rate.d.ts.map +1 -0
  33. package/dist/converters/interactions/rate.js +26 -0
  34. package/dist/converters/interactions/rate.js.map +1 -0
  35. package/dist/converters/interactions/save.d.ts +4 -0
  36. package/dist/converters/interactions/save.d.ts.map +1 -0
  37. package/dist/converters/interactions/save.js +26 -0
  38. package/dist/converters/interactions/save.js.map +1 -0
  39. package/dist/converters/limits/index.d.ts +2 -0
  40. package/dist/converters/limits/index.d.ts.map +1 -0
  41. package/dist/converters/limits/index.js +18 -0
  42. package/dist/converters/limits/index.js.map +1 -0
  43. package/dist/converters/limits/usage.d.ts +4 -0
  44. package/dist/converters/limits/usage.d.ts.map +1 -0
  45. package/dist/converters/limits/usage.js +21 -0
  46. package/dist/converters/limits/usage.js.map +1 -0
  47. package/dist/converters/subscriptions/subscription.d.ts.map +1 -1
  48. package/dist/converters/subscriptions/subscription.js +4 -4
  49. package/dist/converters/subscriptions/subscription.js.map +1 -1
  50. package/dist/converters/users/index.d.ts +0 -2
  51. package/dist/converters/users/index.d.ts.map +1 -1
  52. package/dist/converters/users/index.js +0 -2
  53. package/dist/converters/users/index.js.map +1 -1
  54. package/dist/lib/monitoring.d.ts +5 -4
  55. package/dist/lib/monitoring.d.ts.map +1 -1
  56. package/dist/lib/monitoring.js +93 -25
  57. package/dist/lib/monitoring.js.map +1 -1
  58. package/package.json +2 -2
  59. package/src/converters/equipment/content.ts +1 -1
  60. package/src/converters/equipment/meta.ts +1 -1
  61. package/src/converters/index.ts +2 -1
  62. package/src/converters/ingredients/content.ts +1 -1
  63. package/src/converters/ingredients/meta.ts +1 -1
  64. package/src/converters/interactions/cook.ts +36 -0
  65. package/src/converters/interactions/index.ts +3 -0
  66. package/src/converters/{users/profile.ts → interactions/rate.ts} +36 -36
  67. package/src/converters/{users/bookmark.ts → interactions/save.ts} +6 -6
  68. package/src/converters/{access → limits}/index.ts +1 -1
  69. package/src/converters/{access → limits}/usage.ts +24 -28
  70. package/src/converters/subscriptions/subscription.ts +4 -2
  71. package/src/converters/users/index.ts +0 -2
  72. package/src/lib/monitoring.ts +121 -33
@@ -1,36 +1,75 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.shutdown = exports.createMetricsScope = exports.registerGauge = exports.withTiming = exports.recordTiming = exports.incrementCounter = void 0;
3
+ exports.shutdown = exports.forceFlush = exports.createMetricsScope = exports.registerGauge = exports.withTiming = exports.recordTiming = exports.incrementCounter = void 0;
4
4
  const sdk_metrics_1 = require("@opentelemetry/sdk-metrics");
5
5
  const resources_1 = require("@opentelemetry/resources");
6
6
  const opentelemetry_cloud_monitoring_exporter_1 = require("@google-cloud/opentelemetry-cloud-monitoring-exporter");
7
+ const METRIC_NAME_REGEX = /^[a-zA-Z][a-zA-Z0-9_.-]*$/;
8
+ const MAX_CACHED_METRICS = 1000;
9
+ const validateMetricName = (name) => {
10
+ if (!METRIC_NAME_REGEX.test(name)) {
11
+ throw new Error(`Invalid metric name "${name}": must start with a letter and contain only alphanumeric characters, underscores, dots, or hyphens`);
12
+ }
13
+ };
7
14
  const resource = (0, resources_1.resourceFromAttributes)({
8
15
  "service.name": "cravery-backend",
9
16
  });
10
- const exporter = new opentelemetry_cloud_monitoring_exporter_1.MetricExporter();
11
- const meterProvider = new sdk_metrics_1.MeterProvider({
12
- resource,
13
- readers: [
14
- new sdk_metrics_1.PeriodicExportingMetricReader({
15
- exporter,
16
- exportIntervalMillis: 60000,
17
- }),
18
- ],
19
- });
20
- const meter = meterProvider.getMeter("cravery");
17
+ let meterProvider = null;
18
+ let meter = null;
19
+ let isShutdown = false;
20
+ const initializeProvider = () => {
21
+ if (meterProvider)
22
+ return;
23
+ try {
24
+ const exporter = new opentelemetry_cloud_monitoring_exporter_1.MetricExporter();
25
+ meterProvider = new sdk_metrics_1.MeterProvider({
26
+ resource,
27
+ readers: [
28
+ new sdk_metrics_1.PeriodicExportingMetricReader({
29
+ exporter,
30
+ exportIntervalMillis: 60000,
31
+ }),
32
+ ],
33
+ });
34
+ meter = meterProvider.getMeter("cravery");
35
+ }
36
+ catch (error) {
37
+ console.error("Failed to initialize metrics provider:", error);
38
+ throw error;
39
+ }
40
+ };
41
+ const getMeter = () => {
42
+ if (isShutdown) {
43
+ throw new Error("Metrics provider has been shut down");
44
+ }
45
+ if (!meter) {
46
+ initializeProvider();
47
+ }
48
+ return meter;
49
+ };
21
50
  const counters = new Map();
22
51
  const histograms = new Map();
52
+ const gauges = new Map();
23
53
  const getCounter = (name, description) => {
54
+ validateMetricName(name);
55
+ if (counters.size >= MAX_CACHED_METRICS && !counters.has(name)) {
56
+ throw new Error(`Maximum number of cached counters (${MAX_CACHED_METRICS}) exceeded. Avoid dynamic metric names.`);
57
+ }
24
58
  if (!counters.has(name)) {
25
- counters.set(name, meter.createCounter(`cravery.${name}`, { description }));
59
+ counters.set(name, getMeter().createCounter(`cravery.${name}`, { description }));
26
60
  }
27
61
  return counters.get(name);
28
62
  };
29
- const getHistogram = (name, description) => {
63
+ const getHistogram = (name, options = {}) => {
64
+ var _a;
65
+ validateMetricName(name);
66
+ if (histograms.size >= MAX_CACHED_METRICS && !histograms.has(name)) {
67
+ throw new Error(`Maximum number of cached histograms (${MAX_CACHED_METRICS}) exceeded. Avoid dynamic metric names.`);
68
+ }
30
69
  if (!histograms.has(name)) {
31
- histograms.set(name, meter.createHistogram(`cravery.${name}`, {
32
- description,
33
- unit: "ms",
70
+ histograms.set(name, getMeter().createHistogram(`cravery.${name}`, {
71
+ description: options.description,
72
+ unit: (_a = options.unit) !== null && _a !== void 0 ? _a : "ms",
34
73
  }));
35
74
  }
36
75
  return histograms.get(name);
@@ -45,17 +84,30 @@ const recordTiming = (name, durationMs, attributes) => {
45
84
  exports.recordTiming = recordTiming;
46
85
  const withTiming = async (name, fn, attributes) => {
47
86
  const start = Date.now();
48
- const result = await fn();
49
- (0, exports.recordTiming)(name, Date.now() - start, attributes);
50
- return result;
87
+ try {
88
+ return await fn();
89
+ }
90
+ finally {
91
+ (0, exports.recordTiming)(name, Date.now() - start, attributes);
92
+ }
51
93
  };
52
94
  exports.withTiming = withTiming;
53
95
  const registerGauge = (name, callback, attributes) => {
54
- const gauge = meter.createObservableGauge(`cravery.${name}`);
55
- gauge.addCallback(async (observableResult) => {
56
- const value = await callback();
57
- observableResult.observe(value, attributes);
96
+ validateMetricName(name);
97
+ if (gauges.has(name)) {
98
+ throw new Error(`Gauge "${name}" is already registered. Gauges cannot be re-registered.`);
99
+ }
100
+ const gauge = getMeter().createObservableGauge(`cravery.${name}`);
101
+ gauge.addCallback((observableResult) => {
102
+ try {
103
+ const value = callback();
104
+ observableResult.observe(value, attributes);
105
+ }
106
+ catch (error) {
107
+ console.error(`Error in gauge callback for "${name}":`, error);
108
+ }
58
109
  });
110
+ gauges.set(name, gauge);
59
111
  return gauge;
60
112
  };
61
113
  exports.registerGauge = registerGauge;
@@ -66,6 +118,22 @@ const createMetricsScope = (defaultAttributes) => ({
66
118
  registerGauge: (name, callback, attributes) => (0, exports.registerGauge)(name, callback, Object.assign(Object.assign({}, defaultAttributes), attributes)),
67
119
  });
68
120
  exports.createMetricsScope = createMetricsScope;
69
- const shutdown = () => meterProvider.shutdown();
121
+ const forceFlush = async () => {
122
+ if (!meterProvider || isShutdown) {
123
+ return;
124
+ }
125
+ await meterProvider.forceFlush();
126
+ };
127
+ exports.forceFlush = forceFlush;
128
+ const shutdown = async () => {
129
+ if (!meterProvider || isShutdown) {
130
+ return;
131
+ }
132
+ isShutdown = true;
133
+ await meterProvider.shutdown();
134
+ counters.clear();
135
+ histograms.clear();
136
+ gauges.clear();
137
+ };
70
138
  exports.shutdown = shutdown;
71
139
  //# sourceMappingURL=monitoring.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"monitoring.js","sourceRoot":"","sources":["../../src/lib/monitoring.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"monitoring.js","sourceRoot":"","sources":["../../src/lib/monitoring.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cravery/firebase",
3
- "version": "0.0.44",
3
+ "version": "0.0.46",
4
4
  "description": "Shared Firebase Admin SDK utilities for Cravery",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -28,7 +28,7 @@
28
28
  "typescript": "^5.9.3"
29
29
  },
30
30
  "dependencies": {
31
- "@cravery/core": "^0.0.66",
31
+ "@cravery/core": "^0.0.68",
32
32
  "@google-cloud/opentelemetry-cloud-monitoring-exporter": "^0.21.0",
33
33
  "@opentelemetry/api": "^1.9.0",
34
34
  "@opentelemetry/resources": "^2.4.0",
@@ -6,7 +6,7 @@ import {
6
6
  import type { EquipmentEntityContent } from "@cravery/core";
7
7
  import { stripUndefined } from "../../lib";
8
8
 
9
- export const equipmentContentConverter: FirestoreDataConverter<EquipmentEntityContent> =
9
+ export const equipmentEntityContentConverter: FirestoreDataConverter<EquipmentEntityContent> =
10
10
  {
11
11
  toFirestore(content: EquipmentEntityContent): DocumentData {
12
12
  return stripUndefined({ ...content });
@@ -12,7 +12,7 @@ import {
12
12
  stripUndefined,
13
13
  } from "../../lib";
14
14
 
15
- export const equipmentMetaConverter: FirestoreDataConverter<EquipmentEntityMeta> =
15
+ export const equipmentEntityMetaConverter: FirestoreDataConverter<EquipmentEntityMeta> =
16
16
  {
17
17
  toFirestore(meta: EquipmentEntityMeta): DocumentData {
18
18
  const { id, createdAt, updatedAt, deletedAt, ...rest } = meta;
@@ -1,6 +1,7 @@
1
- export * from "./access";
2
1
  export * from "./equipment";
3
2
  export * from "./ingredients";
3
+ export * from "./interactions";
4
+ export * from "./limits";
4
5
  export * from "./recipes";
5
6
  export * from "./reports";
6
7
  export * from "./settings";
@@ -6,7 +6,7 @@ import {
6
6
  import type { IngredientEntityContent } from "@cravery/core";
7
7
  import { stripUndefined } from "../../lib";
8
8
 
9
- export const ingredientContentConverter: FirestoreDataConverter<IngredientEntityContent> =
9
+ export const ingredientEntityContentConverter: FirestoreDataConverter<IngredientEntityContent> =
10
10
  {
11
11
  toFirestore(content: IngredientEntityContent): DocumentData {
12
12
  return stripUndefined({ ...content });
@@ -12,7 +12,7 @@ import {
12
12
  stripUndefined,
13
13
  } from "../../lib";
14
14
 
15
- export const ingredientMetaConverter: FirestoreDataConverter<IngredientEntityMeta> =
15
+ export const ingredientEntityMetaConverter: FirestoreDataConverter<IngredientEntityMeta> =
16
16
  {
17
17
  toFirestore(meta: IngredientEntityMeta): DocumentData {
18
18
  const { id, createdAt, updatedAt, deletedAt, ...rest } = meta;
@@ -0,0 +1,36 @@
1
+ import {
2
+ FirestoreDataConverter,
3
+ QueryDocumentSnapshot,
4
+ DocumentData,
5
+ } from "firebase-admin/firestore";
6
+ import type { CookedRecipe } from "@cravery/core";
7
+ import {
8
+ toTimestamp,
9
+ toOptionalTimestamp,
10
+ toFirestoreTimestamp,
11
+ toOptionalFirestoreTimestamp,
12
+ stripUndefined,
13
+ } from "../../lib";
14
+
15
+ export const cookedRecipeConverter: FirestoreDataConverter<CookedRecipe> = {
16
+ toFirestore(cookedRecipe: CookedRecipe): DocumentData {
17
+ const { id, createdAt, updatedAt, deletedAt, ...rest } = cookedRecipe;
18
+ return stripUndefined({
19
+ ...rest,
20
+ createdAt: toFirestoreTimestamp(createdAt),
21
+ updatedAt: toFirestoreTimestamp(updatedAt),
22
+ deletedAt: toOptionalFirestoreTimestamp(deletedAt),
23
+ });
24
+ },
25
+
26
+ fromFirestore(snapshot: QueryDocumentSnapshot): CookedRecipe {
27
+ const { createdAt, updatedAt, deletedAt, ...rest } = snapshot.data();
28
+ return {
29
+ ...rest,
30
+ id: snapshot.id,
31
+ createdAt: toTimestamp(createdAt),
32
+ updatedAt: toTimestamp(updatedAt),
33
+ deletedAt: toOptionalTimestamp(deletedAt),
34
+ } as CookedRecipe;
35
+ },
36
+ };
@@ -0,0 +1,3 @@
1
+ export * from "./cook";
2
+ export * from "./rate";
3
+ export * from "./save";
@@ -1,36 +1,36 @@
1
- import {
2
- FirestoreDataConverter,
3
- QueryDocumentSnapshot,
4
- DocumentData,
5
- } from "firebase-admin/firestore";
6
- import type { Profile } from "@cravery/core";
7
- import {
8
- toTimestamp,
9
- toOptionalTimestamp,
10
- toFirestoreTimestamp,
11
- toOptionalFirestoreTimestamp,
12
- stripUndefined,
13
- } from "../../lib";
14
-
15
- export const profileConverter: FirestoreDataConverter<Profile> = {
16
- toFirestore(profile: Profile): DocumentData {
17
- const { id, createdAt, updatedAt, deletedAt, ...rest } = profile;
18
- return stripUndefined({
19
- ...rest,
20
- createdAt: toFirestoreTimestamp(createdAt),
21
- updatedAt: toFirestoreTimestamp(updatedAt),
22
- deletedAt: toOptionalFirestoreTimestamp(deletedAt),
23
- });
24
- },
25
-
26
- fromFirestore(snapshot: QueryDocumentSnapshot): Profile {
27
- const { createdAt, updatedAt, deletedAt, ...rest } = snapshot.data();
28
- return {
29
- ...rest,
30
- id: snapshot.id,
31
- createdAt: toTimestamp(createdAt),
32
- updatedAt: toTimestamp(updatedAt),
33
- deletedAt: toOptionalTimestamp(deletedAt),
34
- } as Profile;
35
- },
36
- };
1
+ import {
2
+ FirestoreDataConverter,
3
+ QueryDocumentSnapshot,
4
+ DocumentData,
5
+ } from "firebase-admin/firestore";
6
+ import type { RatedRecipe } from "@cravery/core";
7
+ import {
8
+ toTimestamp,
9
+ toOptionalTimestamp,
10
+ toFirestoreTimestamp,
11
+ toOptionalFirestoreTimestamp,
12
+ stripUndefined,
13
+ } from "../../lib";
14
+
15
+ export const ratedRecipeConverter: FirestoreDataConverter<RatedRecipe> = {
16
+ toFirestore(ratedRecipe: RatedRecipe): DocumentData {
17
+ const { id, createdAt, updatedAt, deletedAt, ...rest } = ratedRecipe;
18
+ return stripUndefined({
19
+ ...rest,
20
+ createdAt: toFirestoreTimestamp(createdAt),
21
+ updatedAt: toFirestoreTimestamp(updatedAt),
22
+ deletedAt: toOptionalFirestoreTimestamp(deletedAt),
23
+ });
24
+ },
25
+
26
+ fromFirestore(snapshot: QueryDocumentSnapshot): RatedRecipe {
27
+ const { createdAt, updatedAt, deletedAt, ...rest } = snapshot.data();
28
+ return {
29
+ ...rest,
30
+ id: snapshot.id,
31
+ createdAt: toTimestamp(createdAt),
32
+ updatedAt: toTimestamp(updatedAt),
33
+ deletedAt: toOptionalTimestamp(deletedAt),
34
+ } as RatedRecipe;
35
+ },
36
+ };
@@ -3,7 +3,7 @@ import {
3
3
  QueryDocumentSnapshot,
4
4
  DocumentData,
5
5
  } from "firebase-admin/firestore";
6
- import type { Bookmark } from "@cravery/core";
6
+ import type { SavedRecipe } from "@cravery/core";
7
7
  import {
8
8
  toTimestamp,
9
9
  toOptionalTimestamp,
@@ -12,9 +12,9 @@ import {
12
12
  stripUndefined,
13
13
  } from "../../lib";
14
14
 
15
- export const bookmarkConverter: FirestoreDataConverter<Bookmark> = {
16
- toFirestore(bookmark: Bookmark): DocumentData {
17
- const { id, createdAt, updatedAt, deletedAt, ...rest } = bookmark;
15
+ export const savedRecipeConverter: FirestoreDataConverter<SavedRecipe> = {
16
+ toFirestore(savedRecipe: SavedRecipe): DocumentData {
17
+ const { id, createdAt, updatedAt, deletedAt, ...rest } = savedRecipe;
18
18
  return stripUndefined({
19
19
  ...rest,
20
20
  createdAt: toFirestoreTimestamp(createdAt),
@@ -23,7 +23,7 @@ export const bookmarkConverter: FirestoreDataConverter<Bookmark> = {
23
23
  });
24
24
  },
25
25
 
26
- fromFirestore(snapshot: QueryDocumentSnapshot): Bookmark {
26
+ fromFirestore(snapshot: QueryDocumentSnapshot): SavedRecipe {
27
27
  const { createdAt, updatedAt, deletedAt, ...rest } = snapshot.data();
28
28
  return {
29
29
  ...rest,
@@ -31,6 +31,6 @@ export const bookmarkConverter: FirestoreDataConverter<Bookmark> = {
31
31
  createdAt: toTimestamp(createdAt),
32
32
  updatedAt: toTimestamp(updatedAt),
33
33
  deletedAt: toOptionalTimestamp(deletedAt),
34
- } as Bookmark;
34
+ } as SavedRecipe;
35
35
  },
36
36
  };
@@ -1 +1 @@
1
- export * from "./usage";
1
+ export * from "./usage";
@@ -1,28 +1,24 @@
1
- import {
2
- FirestoreDataConverter,
3
- QueryDocumentSnapshot,
4
- DocumentData,
5
- } from "firebase-admin/firestore";
6
- import type { UsagePeriod } from "@cravery/core";
7
- import {
8
- toTimestamp,
9
- toFirestoreTimestamp,
10
- stripUndefined,
11
- } from "../../lib";
12
-
13
- export const usagePeriodConverter: FirestoreDataConverter<UsagePeriod> = {
14
- toFirestore(usage: UsagePeriod): DocumentData {
15
- return stripUndefined({
16
- counts: usage.counts,
17
- updatedAt: toFirestoreTimestamp(usage.updatedAt),
18
- });
19
- },
20
-
21
- fromFirestore(snapshot: QueryDocumentSnapshot): UsagePeriod {
22
- const data = snapshot.data();
23
- return {
24
- counts: data.counts ?? {},
25
- updatedAt: toTimestamp(data.updatedAt),
26
- };
27
- },
28
- };
1
+ import {
2
+ FirestoreDataConverter,
3
+ QueryDocumentSnapshot,
4
+ DocumentData,
5
+ } from "firebase-admin/firestore";
6
+ import type { UsagePeriod } from "@cravery/core";
7
+ import { toTimestamp, toFirestoreTimestamp, stripUndefined } from "../../lib";
8
+
9
+ export const usagePeriodConverter: FirestoreDataConverter<UsagePeriod> = {
10
+ toFirestore(usage: UsagePeriod): DocumentData {
11
+ return stripUndefined({
12
+ counts: usage.counts,
13
+ updatedAt: toFirestoreTimestamp(usage.updatedAt),
14
+ });
15
+ },
16
+
17
+ fromFirestore(snapshot: QueryDocumentSnapshot): UsagePeriod {
18
+ const data = snapshot.data();
19
+ return {
20
+ counts: data.counts ?? {},
21
+ updatedAt: toTimestamp(data.updatedAt),
22
+ };
23
+ },
24
+ };
@@ -13,20 +13,22 @@ import {
13
13
  } from "../../lib";
14
14
 
15
15
  function toFirestoreMember(member: Member): DocumentData {
16
- const { invitedAt, joinedAt, ...rest } = member;
16
+ const { invitedAt, joinedAt, removedAt, ...rest } = member;
17
17
  return stripUndefined({
18
18
  ...rest,
19
19
  invitedAt: toFirestoreTimestamp(invitedAt),
20
20
  joinedAt: toOptionalFirestoreTimestamp(joinedAt),
21
+ removedAt: toOptionalFirestoreTimestamp(removedAt),
21
22
  });
22
23
  }
23
24
 
24
25
  function fromFirestoreMember(data: DocumentData): Member {
25
- const { invitedAt, joinedAt, ...rest } = data;
26
+ const { invitedAt, joinedAt, removedAt, ...rest } = data;
26
27
  return {
27
28
  ...rest,
28
29
  invitedAt: toTimestamp(invitedAt),
29
30
  joinedAt: toOptionalTimestamp(joinedAt),
31
+ removedAt: toOptionalTimestamp(removedAt),
30
32
  } as Member;
31
33
  }
32
34
 
@@ -1,4 +1,2 @@
1
- export * from "./bookmark";
2
- export * from "./profile";
3
1
  export * from "./request";
4
2
  export * from "./user";