@data-weave/backend-firestore 0.4.5 → 0.4.7

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 (31) hide show
  1. package/lib/backend-firestore/src/FirestoreDataManager.d.ts +45 -0
  2. package/lib/{FirestoreDataManager.js → backend-firestore/src/FirestoreDataManager.js} +3 -3
  3. package/lib/backend-firestore/src/FirestoreList.d.ts +23 -0
  4. package/lib/{FirestoreList.js → backend-firestore/src/FirestoreList.js} +2 -2
  5. package/lib/backend-firestore/src/FirestoreMetadata.d.ts +32 -0
  6. package/lib/backend-firestore/src/FirestoreReference.d.ts +27 -0
  7. package/lib/{FirestoreReference.js → backend-firestore/src/FirestoreReference.js} +2 -2
  8. package/lib/backend-firestore/src/firestoreTypes.d.ts +117 -0
  9. package/lib/backend-firestore/src/index.d.ts +6 -0
  10. package/lib/backend-firestore/src/utils.d.ts +14 -0
  11. package/lib/backend-firestore/src/version.d.ts +2 -0
  12. package/lib/{version.js → backend-firestore/src/version.js} +1 -1
  13. package/lib/datamanager/src/Cache.d.ts +15 -0
  14. package/lib/datamanager/src/Cache.js +32 -0
  15. package/lib/datamanager/src/DataManager.d.ts +42 -0
  16. package/lib/datamanager/src/DataManager.js +13 -0
  17. package/lib/datamanager/src/List.d.ts +11 -0
  18. package/lib/datamanager/src/List.js +24 -0
  19. package/lib/datamanager/src/LiveList.d.ts +24 -0
  20. package/lib/datamanager/src/LiveList.js +55 -0
  21. package/lib/datamanager/src/LiveReference.d.ts +21 -0
  22. package/lib/datamanager/src/LiveReference.js +46 -0
  23. package/lib/datamanager/src/Reference.d.ts +15 -0
  24. package/lib/datamanager/src/Reference.js +25 -0
  25. package/lib/datamanager/src/index.d.ts +6 -0
  26. package/lib/datamanager/src/index.js +22 -0
  27. package/package.json +3 -3
  28. /package/lib/{FirestoreMetadata.js → backend-firestore/src/FirestoreMetadata.js} +0 -0
  29. /package/lib/{firestoreTypes.js → backend-firestore/src/firestoreTypes.js} +0 -0
  30. /package/lib/{index.js → backend-firestore/src/index.js} +0 -0
  31. /package/lib/{utils.js → backend-firestore/src/utils.js} +0 -0
@@ -0,0 +1,45 @@
1
+ import { Cache, DataManager, IdentifiableReference, List, ListPaginationParams, WithMetadata, WithoutId } from '@data-weave/datamanager';
2
+ import { FirestoreList, FirestoreListContext } from './FirestoreList';
3
+ import { FirestoreSerializedMetadata } from './FirestoreMetadata';
4
+ import { FirestoreReference, FirestoreReferenceContext } from './FirestoreReference';
5
+ import { FilterBy, FirebaseCreateOptions, Firestore, FirestoreDataConverter, FirestoreReadMode, FirestoreReadOptions, FirestoreTypes, FirestoreWriteOptions, OrderBy, WithFieldValue } from './firestoreTypes';
6
+ export type FirebaseDataManagerDeleteMode = 'soft' | 'hard';
7
+ export interface FirebaseDataManagerOptions {
8
+ readonly idResolver?: () => string;
9
+ readonly deleteMode?: FirebaseDataManagerDeleteMode;
10
+ readonly readMode?: FirestoreReadMode;
11
+ readonly preventOverwriteOnCreate?: boolean;
12
+ readonly errorInterceptor?: (error: unknown, ctx: FirestoreReferenceContext | FirestoreListContext) => void;
13
+ readonly snapshotOptions?: FirestoreTypes.SnapshotOptions;
14
+ readonly Reference?: typeof FirestoreReference;
15
+ readonly List?: typeof FirestoreList;
16
+ readonly listCache?: Cache;
17
+ readonly refCache?: Cache;
18
+ }
19
+ export interface QueryParams<T extends FirestoreTypes.DocumentData> {
20
+ readonly filters?: Array<FilterBy<T & FirestoreSerializedMetadata>>;
21
+ readonly orderBy?: Array<OrderBy<T & FirestoreSerializedMetadata>>;
22
+ }
23
+ export declare class FirestoreDataManager<T extends FirestoreTypes.DocumentData, SerializedT extends FirestoreTypes.DocumentData = T> implements DataManager<T> {
24
+ private readonly firestore;
25
+ private readonly collectionPath;
26
+ private readonly converter;
27
+ private readonly opts?;
28
+ private mergedConverter;
29
+ private collection;
30
+ private collectionQuery;
31
+ private managerOptions;
32
+ private refCache;
33
+ private listCache;
34
+ constructor(firestore: Firestore, collectionPath: string, converter: FirestoreDataConverter<T, SerializedT>, opts?: FirebaseDataManagerOptions | undefined);
35
+ read(id: string, options?: FirestoreReadOptions): Promise<WithMetadata<T> | undefined>;
36
+ create(data: WithFieldValue<WithoutId<T>>, options?: FirebaseCreateOptions): Promise<IdentifiableReference<WithMetadata<T>>>;
37
+ private _update;
38
+ update(id: string, data: WithoutId<Partial<WithFieldValue<T>>>, options?: FirestoreWriteOptions): Promise<void>;
39
+ upsert(id: string, data: WithFieldValue<WithoutId<T>>, options?: FirestoreWriteOptions): Promise<void>;
40
+ delete(id: string, options?: FirestoreWriteOptions): Promise<void>;
41
+ getRef(id: string): IdentifiableReference<WithMetadata<T>>;
42
+ private _getFilteredQuery;
43
+ getList(params?: QueryParams<SerializedT> & ListPaginationParams): List<WithMetadata<T>>;
44
+ private preventOverwriteOnCreate;
45
+ }
@@ -49,7 +49,7 @@ var __setFunctionName = (this && this.__setFunctionName) || function (f, name, p
49
49
  Object.defineProperty(exports, "__esModule", { value: true });
50
50
  exports.FirestoreDataManager = void 0;
51
51
  const inversify_1 = require("inversify");
52
- const Cache_1 = require("@data-weave/datamanager/src/Cache");
52
+ const datamanager_1 = require("@data-weave/datamanager");
53
53
  const FirestoreList_1 = require("./FirestoreList");
54
54
  const FirestoreMetadata_1 = require("./FirestoreMetadata");
55
55
  const FirestoreReference_1 = require("./FirestoreReference");
@@ -75,8 +75,8 @@ let FirestoreDataManager = (() => {
75
75
  // @ts-expect-error - Force merge FirestoreDataConverter and InternalFirestoreDataConverter
76
76
  this.mergedConverter = new utils_1.MergeConverters(this.converter, new FirestoreMetadata_1.FirestoreMetadataConverter());
77
77
  this.managerOptions = Object.assign(defaultFirebaseDataManagerOptions, this.opts);
78
- this.refCache = this.managerOptions.refCache || new Cache_1.MapCache(100);
79
- this.listCache = this.managerOptions.listCache || new Cache_1.MapCache(100);
78
+ this.refCache = this.managerOptions.refCache || new datamanager_1.MapCache(100);
79
+ this.listCache = this.managerOptions.listCache || new datamanager_1.MapCache(100);
80
80
  this.collection = this.firestore
81
81
  .collection(this.firestore.app, this.collectionPath)
82
82
  .withConverter(this.mergedConverter);
@@ -0,0 +1,23 @@
1
+ import { ListPaginationParams, LiveList, LiveListOptions } from '@data-weave/datamanager';
2
+ import { DocumentData, Firestore, FirestoreReadMode, FirestoreTypes } from './firestoreTypes';
3
+ export interface FirestoreListContext {
4
+ query: FirestoreTypes.Query<unknown>;
5
+ readMode?: FirestoreReadMode;
6
+ type: 'list';
7
+ }
8
+ export interface FirestoreListOptions<T> extends LiveListOptions<T> {
9
+ readMode?: FirestoreReadMode;
10
+ errorInterceptor?: (error: unknown, ctx: FirestoreListContext) => void;
11
+ }
12
+ export declare class FirestoreList<T extends DocumentData, S extends DocumentData> extends LiveList<T> {
13
+ private readonly firestore;
14
+ private readonly query;
15
+ private readonly options;
16
+ private unsubscribeFromSnapshot;
17
+ constructor(firestore: Firestore, query: FirestoreTypes.Query<T, S>, options: FirestoreListOptions<T> & ListPaginationParams);
18
+ resolve(): Promise<T[]>;
19
+ protected handleInitialDataChange(values: FirestoreTypes.QueryDocumentSnapshot<T, S>[]): void;
20
+ protected handleSubsequentDataChanges(changes: FirestoreTypes.DocumentChange<T, S>[]): void;
21
+ unSubscribe(): void;
22
+ protected onError(error: unknown): void;
23
+ }
@@ -10,8 +10,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.FirestoreList = void 0;
13
- const src_1 = require("@data-weave/datamanager/src");
14
- class FirestoreList extends src_1.LiveList {
13
+ const datamanager_1 = require("@data-weave/datamanager");
14
+ class FirestoreList extends datamanager_1.LiveList {
15
15
  constructor(firestore, query, options) {
16
16
  super(options);
17
17
  this.firestore = firestore;
@@ -0,0 +1,32 @@
1
+ import { Metadata, WithoutId } from '@data-weave/datamanager';
2
+ import { DocumentData, FirestoreQuery, FirestoreTypes, FirestoreWhere, InternalFirestoreDataConverter, WithFieldValue } from './firestoreTypes';
3
+ declare enum FIRESTORE_INTERAL_KEYS {
4
+ DELETED = "__deleted",
5
+ CREATED_AT = "__createdAt",
6
+ UPDATED_AT = "__updatedAt"
7
+ }
8
+ export declare enum FIRESTORE_KEYS {
9
+ DELETED = "deleted",
10
+ CREATED_AT = "createdAt",
11
+ UPDATED_AT = "updatedAt"
12
+ }
13
+ export type FirestoreSerializedMetadata = {
14
+ [FIRESTORE_INTERAL_KEYS.DELETED]: boolean;
15
+ [FIRESTORE_INTERAL_KEYS.CREATED_AT]: FirestoreTypes.Timestamp;
16
+ [FIRESTORE_INTERAL_KEYS.UPDATED_AT]: FirestoreTypes.Timestamp;
17
+ };
18
+ export declare class FirestoreMetadataConverter implements InternalFirestoreDataConverter<Metadata, FirestoreSerializedMetadata> {
19
+ toFirestore(data: WithFieldValue<WithoutId<Metadata>>): {
20
+ __deleted: FirestoreTypes.FieldValue | FirestoreTypes.WithFieldValue<boolean>;
21
+ __createdAt: FirestoreTypes.Timestamp;
22
+ __updatedAt: FirestoreTypes.Timestamp;
23
+ };
24
+ fromFirestore(snapshot: FirestoreTypes.QueryDocumentSnapshot<DocumentData, DocumentData>, options: FirestoreTypes.SnapshotOptions): {
25
+ id: string;
26
+ createdAt: Date;
27
+ updatedAt: Date;
28
+ deleted: boolean;
29
+ };
30
+ }
31
+ export declare const queryNotDeleted: <T extends DocumentData, SerializedT extends DocumentData>(query: FirestoreTypes.Query<T, SerializedT>, firestoreQuery: FirestoreQuery<T, SerializedT>, firestoreWhere: FirestoreWhere) => FirestoreTypes.Query<T, SerializedT>;
32
+ export {};
@@ -0,0 +1,27 @@
1
+ import { LiveReference, LiveReferenceOptions } from '@data-weave/datamanager';
2
+ import { DocumentData, Firestore, FirestoreReadMode, FirestoreTypes } from './firestoreTypes';
3
+ export interface FirestoreReferenceContext {
4
+ path: string;
5
+ id: string;
6
+ readMode?: FirestoreReadMode;
7
+ snapshotOptions?: FirestoreTypes.SnapshotOptions;
8
+ type: 'reference';
9
+ }
10
+ export interface FirestoreReferenceOptions<T> extends LiveReferenceOptions<T> {
11
+ readMode?: FirestoreReadMode;
12
+ snapshotOptions?: FirestoreTypes.SnapshotOptions;
13
+ errorInterceptor?: (error: unknown, ctx: FirestoreReferenceContext) => void;
14
+ }
15
+ export declare class FirestoreReference<T extends DocumentData, S extends DocumentData> extends LiveReference<T> {
16
+ private readonly firestore;
17
+ private readonly docRef;
18
+ readonly options: FirestoreReferenceOptions<T>;
19
+ private unsubscribeFromSnapshot;
20
+ constructor(firestore: Firestore, docRef: FirestoreTypes.DocumentReference<T, S>, options: FirestoreReferenceOptions<T>);
21
+ resolve(): Promise<T | undefined>;
22
+ get id(): string;
23
+ get path(): string;
24
+ protected onError(error: unknown): void;
25
+ unSubscribe(): void;
26
+ private parseDocumentSnapshot;
27
+ }
@@ -10,9 +10,9 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
12
  exports.FirestoreReference = void 0;
13
- const src_1 = require("@data-weave/datamanager/src");
13
+ const datamanager_1 = require("@data-weave/datamanager");
14
14
  const utils_1 = require("./utils");
15
- class FirestoreReference extends src_1.LiveReference {
15
+ class FirestoreReference extends datamanager_1.LiveReference {
16
16
  constructor(firestore, docRef, options) {
17
17
  super(options);
18
18
  this.firestore = firestore;
@@ -0,0 +1,117 @@
1
+ import { WithoutId } from '@data-weave/datamanager';
2
+ import type * as FirestoreTypes from '@firebase/firestore';
3
+ import type { FieldPath, WithFieldValue as FirestoreWithFieldValue, QueryConstraint } from '@firebase/firestore';
4
+ import type { HttpsCallable, HttpsCallableOptions } from '@firebase/functions-types';
5
+ import { FieldValue, Transaction } from '@google-cloud/firestore';
6
+ export type DocumentData = FirestoreTypes.DocumentData;
7
+ export { FieldValue, FirestoreTypes, Transaction };
8
+ /**
9
+ * Same as Partial but all fields are required to be included
10
+ */
11
+ type OptionallyUndefined<T> = {
12
+ [P in keyof T]: T[P] | undefined;
13
+ };
14
+ export declare interface InternalFirestoreDataConverter<T extends DocumentData, SerializedT extends DocumentData = DocumentData> {
15
+ toFirestore(modelObject: Partial<WithFieldValue<WithoutId<T>>>, options?: FirestoreTypes.SetOptions): WithFieldValue<WithoutId<SerializedT>>;
16
+ fromFirestore(snapshot: FirestoreTypes.QueryDocumentSnapshot<T, SerializedT>, options?: FirestoreTypes.SnapshotOptions): T;
17
+ }
18
+ export type WithTimestamps<T> = {
19
+ [K in keyof T]: T[K] extends Date ? FirestoreTypes.Timestamp : T[K] extends Date | null ? FirestoreTypes.Timestamp | null : T[K] extends Date | undefined ? FirestoreTypes.Timestamp | undefined : T[K] extends Date | null | undefined ? FirestoreTypes.Timestamp | null | undefined : T[K] extends object ? T[K] extends any[] ? T[K] extends (infer U)[] ? WithTimestamps<U>[] : T[K] : WithTimestamps<T[K]> : T[K];
20
+ };
21
+ /**
22
+ * Converts data between model and serialized data. Differs from InternalFirestoreDataConverter
23
+ * by using `OptionallyUndefined` and `Required` to ensure that all fields are included in de/serialization
24
+ * even if some model defined properties are optional.
25
+ */
26
+ export declare interface FirestoreDataConverter<ModelObject, SerializedModelObject = ModelObject> {
27
+ toFirestore(modelObject: WithoutId<ModelObject>, options?: FirestoreTypes.SetOptions): OptionallyUndefined<Required<WithoutId<WithFieldValue<SerializedModelObject>>>>;
28
+ fromFirestore(snapshot: FirestoreTypes.QueryDocumentSnapshot<WithTimestamps<SerializedModelObject>>, options?: FirestoreTypes.SnapshotOptions): ModelObject;
29
+ }
30
+ export type FirestoreQuery<AppModelType = DocumentData, DbModelType extends DocumentData = DocumentData> = (reference: FirestoreTypes.Query<AppModelType, DbModelType>, filter: any) => FirestoreTypes.Query<AppModelType, DbModelType>;
31
+ export type FirestoreWhere = (field: string | FieldPath, op: string, value: unknown) => any;
32
+ export type FirestoreReadMode = 'realtime' | 'static';
33
+ export interface FirestoreReadOptions {
34
+ readonly transaction?: FirestoreTypes.Transaction;
35
+ }
36
+ export interface FirestoreWriteOptions {
37
+ readonly transaction?: FirestoreTypes.Transaction;
38
+ readonly batcher?: FirestoreTypes.WriteBatch;
39
+ }
40
+ export interface FirebaseCreateOptions extends FirestoreWriteOptions {
41
+ id?: string;
42
+ merge?: boolean;
43
+ }
44
+ export declare type WithFieldValue<T> = {
45
+ [K in keyof T]: FirestoreWithFieldValue<T[K]> | FirestoreTypes.FieldValue;
46
+ };
47
+ type GenNode<K extends string, IsRoot extends boolean> = IsRoot extends true ? `${K}` : `.${K}`;
48
+ export type FilterableFields<T extends object, IsRoot extends boolean = true, K extends keyof T = keyof T> = K extends string ? T[K] extends FirestoreTypes.Timestamp ? `${K}` : T[K] extends Date ? `${K}` : T[K] extends any[] ? GenNode<K, IsRoot> : T[K] extends object ? `${GenNode<K, IsRoot>}${FilterableFields<T[K], false>}` : GenNode<K, IsRoot> : never;
49
+ type GetValue<T, K extends string> = K extends `${infer L}.${infer R}` ? L extends keyof T ? GetValue<T[L], R> : never : K extends keyof T ? T[K] extends Date ? Date | FirestoreTypes.Timestamp : T[K] : K extends string ? string | number | boolean : never;
50
+ export type PrimitiveFilterOp = '<' | '<=' | '==' | '!=' | '>=' | '>';
51
+ export type FilterBy<T extends object, Field extends string = FilterableFields<T>> = Field extends string ? GetValue<T, Field> extends any[] ? [Field, 'array-contains', string] | [Field, 'array-contains-any', string[]] : [Field, PrimitiveFilterOp, GetValue<T, Field>] | [Field, 'in', string[]] : never;
52
+ export type OrderBy<T extends DocumentData, Fields extends string = FilterableFields<T>> = [
53
+ Fields,
54
+ FirestoreTypes.OrderByDirection
55
+ ];
56
+ export declare abstract class FieldValues {
57
+ abstract serverTimestamp(): FirestoreTypes.FieldValue;
58
+ abstract delete(): FirestoreTypes.FieldValue;
59
+ abstract increment(n: number): FirestoreTypes.FieldValue;
60
+ abstract arrayUnion(...elements: any[]): FirestoreTypes.FieldValue;
61
+ abstract arrayRemove(...elements: any[]): FirestoreTypes.FieldValue;
62
+ }
63
+ /**********
64
+ *
65
+ *
66
+ * INJECTABLES
67
+ *
68
+ *
69
+ * **********/
70
+ export interface FirestoreAppSettings {
71
+ persistence?: boolean;
72
+ cacheSizeBytes?: number;
73
+ host?: string;
74
+ ssl?: boolean;
75
+ ignoreUndefinedProperties?: boolean;
76
+ serverTimestampBehavior?: 'estimate' | 'previous' | 'none';
77
+ }
78
+ export declare abstract class FirestoreApp {
79
+ abstract type?: string;
80
+ abstract toJSON?(): object;
81
+ abstract terminate?(): Promise<void>;
82
+ abstract settings?(settings: FirestoreAppSettings): void;
83
+ abstract useEmulator?(host: string, port: number): void;
84
+ abstract runTransaction?<T>(updateFunction: (transaction: Transaction) => Promise<T>, options?: FirestoreTypes.TransactionOptions): Promise<T>;
85
+ }
86
+ export declare abstract class Firestore {
87
+ abstract app: FirestoreApp;
88
+ abstract collection(reference: FirestoreTypes.CollectionReference | FirestoreApp, path: string): any;
89
+ abstract getDocs<AppModelType = DocumentData, DbModelType extends DocumentData = DocumentData>(reference: FirestoreTypes.Query<AppModelType, DbModelType>): Promise<FirestoreTypes.QuerySnapshot<AppModelType, DbModelType>>;
90
+ abstract getDoc<AppModelType = DocumentData, DbModelType extends DocumentData = DocumentData>(reference: FirestoreTypes.DocumentReference<AppModelType, DbModelType>, path?: string): Promise<FirestoreTypes.DocumentSnapshot<AppModelType, DbModelType>>;
91
+ abstract serverTimestamp(): FirestoreTypes.FieldValue;
92
+ abstract increment(n: number): FirestoreTypes.FieldValue;
93
+ abstract query<AppModelType = DocumentData, DbModelType extends DocumentData = DocumentData>(reference: FirestoreTypes.Query<AppModelType, DbModelType>, filter: any): FirestoreTypes.Query<AppModelType, DbModelType>;
94
+ abstract where(field: string | FieldPath, op: string, value: unknown): QueryConstraint;
95
+ abstract limit(limit: number): any;
96
+ abstract orderBy(orderBy: string, direction: FirestoreTypes.OrderByDirection): any;
97
+ abstract setDoc<AppModelType = DocumentData, DbModelType extends DocumentData = DocumentData>(reference: FirestoreTypes.DocumentReference<AppModelType, DbModelType>, data: any, options?: FirestoreTypes.SetOptions): Promise<void>;
98
+ abstract updateDoc<AppModelType = DocumentData, DbModelType extends DocumentData = DocumentData>(reference: FirestoreTypes.DocumentReference<AppModelType, DbModelType>, data: any): Promise<void>;
99
+ abstract doc<AppModelType = DocumentData, DbModelType extends DocumentData = DocumentData>(reference: FirestoreTypes.Query<AppModelType, DbModelType>, path?: string): FirestoreTypes.DocumentReference<AppModelType, DbModelType>;
100
+ abstract deleteDoc<AppModelType = DocumentData, DbModelType extends DocumentData = DocumentData>(reference: FirestoreTypes.DocumentReference<AppModelType, DbModelType>): Promise<void>;
101
+ abstract onSnapshot<AppModelType = DocumentData, DbModelType extends DocumentData = DocumentData>(reference: FirestoreTypes.DocumentReference<AppModelType, DbModelType>, onNext: (snapshot: FirestoreTypes.DocumentSnapshot<AppModelType, DbModelType>) => void, onError?: (error: Error) => void): () => void;
102
+ abstract onSnapshot<AppModelType = DocumentData, DbModelType extends DocumentData = DocumentData>(reference: FirestoreTypes.Query<AppModelType, DbModelType>, onNext: (snapshot: FirestoreTypes.QuerySnapshot<AppModelType, DbModelType>) => void, onError?: (error: Error) => void): () => void;
103
+ abstract runTransaction<T>(firestore: FirestoreApp, transaction: (transaction: Transaction) => Promise<T>, options?: FirestoreTypes.TransactionOptions): Promise<T>;
104
+ }
105
+ export declare abstract class FirestoreSettings {
106
+ abstract readMode: FirestoreReadMode;
107
+ }
108
+ export declare abstract class FirestoreFunctions {
109
+ abstract httpsCallable(name: string, options?: HttpsCallableOptions): HttpsCallable;
110
+ abstract useEmulator(host: string, port: number): void;
111
+ abstract useFunctionsEmulator(origin: string): void;
112
+ }
113
+ export declare class DummyFirestoreFunctions implements FirestoreFunctions {
114
+ httpsCallable(): HttpsCallable;
115
+ useEmulator(): void;
116
+ useFunctionsEmulator(): void;
117
+ }
@@ -0,0 +1,6 @@
1
+ export * from './FirestoreDataManager';
2
+ export * from './FirestoreList';
3
+ export * from './FirestoreMetadata';
4
+ export * from './FirestoreReference';
5
+ export * from './firestoreTypes';
6
+ export * from './utils';
@@ -0,0 +1,14 @@
1
+ import { WithoutId } from '@data-weave/datamanager';
2
+ import { DocumentData, Firestore, FirestoreTypes, InternalFirestoreDataConverter, Transaction, WithFieldValue } from './firestoreTypes';
3
+ import { Firestore as FirebaseFirestore } from 'firebase/firestore';
4
+ export declare class MergeConverters<T extends DocumentData, SerializedT extends DocumentData, G extends DocumentData, SerializedG extends DocumentData> implements InternalFirestoreDataConverter<T & G, SerializedT & SerializedG> {
5
+ private converter1;
6
+ private converter2;
7
+ constructor(converter1: InternalFirestoreDataConverter<T, SerializedT>, converter2: InternalFirestoreDataConverter<G, SerializedG>);
8
+ toFirestore(modelObject: WithoutId<Partial<WithFieldValue<T>>> & WithoutId<Partial<WithFieldValue<G>>>, options?: FirestoreTypes.SetOptions): WithFieldValue<WithoutId<SerializedT>> & WithFieldValue<WithoutId<SerializedG>>;
9
+ fromFirestore(snapshot: FirestoreTypes.QueryDocumentSnapshot<T & G, SerializedT & SerializedG>, options: FirestoreTypes.SnapshotOptions): T & G;
10
+ }
11
+ export declare function createModularFirestoreAdapter(firestore: FirebaseFirestore): Firestore;
12
+ export declare const isFieldValue: (value: any) => value is FirestoreTypes.FieldValue;
13
+ export declare const checkIfReferenceExists: (value: any) => boolean;
14
+ export declare const withTransaction: (firestore: Firestore, transaction: (transaction: Transaction) => Promise<void>, options?: FirestoreTypes.TransactionOptions) => Promise<void>;
@@ -0,0 +1,2 @@
1
+ declare const _exports: string;
2
+ export = _exports;
@@ -1,3 +1,3 @@
1
1
  "use strict";
2
2
  // Generated by genversion.
3
- module.exports = '0.4.5';
3
+ module.exports = '0.4.7';
@@ -0,0 +1,15 @@
1
+ export interface Cache<K = any, V = any> {
2
+ get(key: K): V | undefined;
3
+ set(key: K, value: V): void;
4
+ has(key: K): boolean;
5
+ }
6
+ export declare class MapCache<K, V> implements Cache<K, V> {
7
+ private cache;
8
+ private maxSize?;
9
+ constructor(maxSize?: number);
10
+ get(key: K): V | undefined;
11
+ set(key: K, value: V): void;
12
+ has(key: K): boolean;
13
+ delete(key: K): boolean;
14
+ clear(): void;
15
+ }
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MapCache = void 0;
4
+ class MapCache {
5
+ constructor(maxSize) {
6
+ this.cache = new Map();
7
+ this.maxSize = maxSize;
8
+ }
9
+ get(key) {
10
+ return this.cache.get(key);
11
+ }
12
+ set(key, value) {
13
+ if (this.maxSize && this.cache.size >= this.maxSize && !this.cache.has(key)) {
14
+ // Remove the first entry (oldest) when cache is full
15
+ const firstKey = this.cache.keys().next().value;
16
+ if (firstKey) {
17
+ this.cache.delete(firstKey);
18
+ }
19
+ }
20
+ this.cache.set(key, value);
21
+ }
22
+ has(key) {
23
+ return this.cache.has(key);
24
+ }
25
+ delete(key) {
26
+ return this.cache.delete(key);
27
+ }
28
+ clear() {
29
+ this.cache.clear();
30
+ }
31
+ }
32
+ exports.MapCache = MapCache;
@@ -0,0 +1,42 @@
1
+ import { List } from './List';
2
+ import { IdentifiableReference, WithoutId } from './Reference';
3
+ export interface ReadOptions {
4
+ readonly transaction?: unknown;
5
+ }
6
+ export interface WriteOptions {
7
+ readonly transaction?: unknown;
8
+ readonly batcher?: unknown;
9
+ }
10
+ export interface CreateOptions extends WriteOptions {
11
+ id?: string;
12
+ merge?: boolean;
13
+ }
14
+ export type OrderByOption = 'asc' | 'desc';
15
+ export interface GetListOptions {
16
+ readonly filterBy?: unknown;
17
+ readonly orderBy?: unknown;
18
+ readonly limit?: number;
19
+ }
20
+ export interface Metadata {
21
+ readonly id: string;
22
+ readonly createdAt: Date;
23
+ readonly updatedAt: Date;
24
+ readonly deleted: boolean;
25
+ }
26
+ export type WithMetadata<T> = T & Metadata;
27
+ /**
28
+ * DataManager is the base class for all data managers.
29
+ * It is responsible for reading, creating, deleting, and updating data.
30
+ * It is also responsible for returning references and lists.
31
+ * It is generic and can be used for any type of data.
32
+ * @template T - The type of the data to be managed.
33
+ */
34
+ export declare abstract class DataManager<T> {
35
+ abstract read(id: string): Promise<T | undefined>;
36
+ abstract create(data: WithoutId<T>, options?: CreateOptions): Promise<IdentifiableReference<WithMetadata<T>>>;
37
+ abstract delete(id: string): Promise<void>;
38
+ abstract update(id: string, data: Partial<WithoutId<T>>): Promise<void>;
39
+ abstract upsert(id: string, data: WithoutId<T>): Promise<void>;
40
+ abstract getRef(id: string): IdentifiableReference<WithMetadata<T>>;
41
+ abstract getList(params?: GetListOptions): List<WithMetadata<T>>;
42
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DataManager = void 0;
4
+ /**
5
+ * DataManager is the base class for all data managers.
6
+ * It is responsible for reading, creating, deleting, and updating data.
7
+ * It is also responsible for returning references and lists.
8
+ * It is generic and can be used for any type of data.
9
+ * @template T - The type of the data to be managed.
10
+ */
11
+ class DataManager {
12
+ }
13
+ exports.DataManager = DataManager;
@@ -0,0 +1,11 @@
1
+ import { Resolvable } from './Reference';
2
+ export interface ListPaginationParams {
3
+ readonly pageSize?: number;
4
+ readonly append?: boolean;
5
+ readonly loadFirstPageManually?: boolean;
6
+ }
7
+ export interface List<T> extends Resolvable<readonly T[]> {
8
+ readonly values: readonly T[];
9
+ }
10
+ export declare function createInitializedList<T>(values: ReadonlyArray<T>): List<T>;
11
+ export declare function createEmptyList<T>(): List<T>;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.createInitializedList = createInitializedList;
13
+ exports.createEmptyList = createEmptyList;
14
+ function createInitializedList(values) {
15
+ return {
16
+ values,
17
+ resolved: true,
18
+ hasError: false,
19
+ resolve: () => __awaiter(this, void 0, void 0, function* () { return values; }),
20
+ };
21
+ }
22
+ function createEmptyList() {
23
+ return createInitializedList([]);
24
+ }
@@ -0,0 +1,24 @@
1
+ import { List } from './List';
2
+ export interface LiveListOptions<T> {
3
+ onUpdate?: (newValues: T[]) => void;
4
+ onError?: (error: unknown) => void;
5
+ }
6
+ export declare class LiveList<T> implements List<T> {
7
+ private _values;
8
+ private _resolved;
9
+ private _hasError;
10
+ private _options;
11
+ constructor(options: LiveListOptions<T>);
12
+ resolve(): Promise<readonly T[]>;
13
+ get values(): T[];
14
+ get hasError(): boolean;
15
+ get resolved(): boolean;
16
+ protected setStale(): void;
17
+ protected onValuesChange(): void;
18
+ protected onUpdate(): void;
19
+ protected onUpdateAll(values: T[]): void;
20
+ protected onUpdateAtIndex(index: number, value: T): void;
21
+ protected onAddAtIndex(index: number, value: T): void;
22
+ protected onRemoveAtIndex(index: number): void;
23
+ protected onError(error: unknown): void;
24
+ }
@@ -0,0 +1,55 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LiveList = void 0;
4
+ class LiveList {
5
+ constructor(options) {
6
+ this._values = [];
7
+ this._resolved = false;
8
+ this._hasError = false;
9
+ this._options = options;
10
+ }
11
+ resolve() {
12
+ throw new Error('Method not implemented.');
13
+ }
14
+ get values() {
15
+ return this._values;
16
+ }
17
+ get hasError() {
18
+ return this._hasError;
19
+ }
20
+ get resolved() {
21
+ return this._resolved;
22
+ }
23
+ setStale() {
24
+ this._resolved = false;
25
+ }
26
+ onValuesChange() { }
27
+ onUpdate() {
28
+ var _a, _b;
29
+ this._resolved = true;
30
+ this.onValuesChange();
31
+ (_b = (_a = this._options).onUpdate) === null || _b === void 0 ? void 0 : _b.call(_a, this._values);
32
+ }
33
+ onUpdateAll(values) {
34
+ this._values = values;
35
+ this.onUpdate();
36
+ }
37
+ onUpdateAtIndex(index, value) {
38
+ this._values[index] = value;
39
+ }
40
+ onAddAtIndex(index, value) {
41
+ this._values.splice(index, 0, value);
42
+ }
43
+ onRemoveAtIndex(index) {
44
+ this._values.splice(index, 1);
45
+ }
46
+ onError(error) {
47
+ var _a, _b;
48
+ this._hasError = true;
49
+ this._values = [];
50
+ this._resolved = true;
51
+ (_b = (_a = this._options).onError) === null || _b === void 0 ? void 0 : _b.call(_a, error);
52
+ this.onValuesChange();
53
+ }
54
+ }
55
+ exports.LiveList = LiveList;
@@ -0,0 +1,21 @@
1
+ import { Reference } from './Reference';
2
+ export interface LiveReferenceOptions<T> {
3
+ onUpdate?: (newValue: T | undefined) => void;
4
+ onError?: (error: unknown) => void;
5
+ }
6
+ export declare class LiveReference<T> implements Reference<T> {
7
+ readonly options: LiveReferenceOptions<T>;
8
+ private _value;
9
+ private _resolved;
10
+ private _hasError;
11
+ private _options;
12
+ resolve(): Promise<T | undefined>;
13
+ constructor(options: LiveReferenceOptions<T>);
14
+ get value(): T | undefined;
15
+ get resolved(): boolean;
16
+ get hasError(): boolean;
17
+ protected setStale(): void;
18
+ protected onUpdate(data: T | undefined): void;
19
+ protected onError(error: unknown): void;
20
+ protected onValueChange(): void;
21
+ }
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LiveReference = void 0;
4
+ class LiveReference {
5
+ resolve() {
6
+ throw new Error('Method not implemented.');
7
+ }
8
+ constructor(options) {
9
+ this.options = options;
10
+ this._resolved = false;
11
+ this._hasError = false;
12
+ this._value = undefined;
13
+ this._resolved = false;
14
+ this._hasError = false;
15
+ this._options = options;
16
+ }
17
+ get value() {
18
+ return this._value;
19
+ }
20
+ get resolved() {
21
+ return this._resolved;
22
+ }
23
+ get hasError() {
24
+ return this._hasError;
25
+ }
26
+ setStale() {
27
+ this._resolved = false;
28
+ }
29
+ onUpdate(data) {
30
+ var _a, _b;
31
+ this._value = data;
32
+ this._resolved = true;
33
+ this.onValueChange();
34
+ (_b = (_a = this._options).onUpdate) === null || _b === void 0 ? void 0 : _b.call(_a, this._value);
35
+ }
36
+ onError(error) {
37
+ var _a, _b;
38
+ this._hasError = true;
39
+ this._value = undefined;
40
+ this._resolved = true;
41
+ this.onValueChange();
42
+ (_b = (_a = this._options).onError) === null || _b === void 0 ? void 0 : _b.call(_a, error);
43
+ }
44
+ onValueChange() { }
45
+ }
46
+ exports.LiveReference = LiveReference;
@@ -0,0 +1,15 @@
1
+ export interface Identifiable {
2
+ readonly id: string;
3
+ }
4
+ export type WithoutId<T> = Omit<T, 'id'>;
5
+ export interface Resolvable<T> {
6
+ readonly resolved: boolean;
7
+ readonly hasError: boolean;
8
+ resolve(): Promise<T>;
9
+ }
10
+ export interface Reference<T> extends Resolvable<T | undefined> {
11
+ readonly value: T | undefined;
12
+ }
13
+ export type IdentifiableReference<T> = Reference<T> & Identifiable;
14
+ export declare function createInitializedIdentifiableReference<T>(value: T | undefined, id: string): Reference<T> & Identifiable;
15
+ export declare function createEmptyIdentifiableReference<T>(id: string): Reference<T>;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.createInitializedIdentifiableReference = createInitializedIdentifiableReference;
13
+ exports.createEmptyIdentifiableReference = createEmptyIdentifiableReference;
14
+ function createInitializedIdentifiableReference(value, id) {
15
+ return {
16
+ id,
17
+ value,
18
+ resolved: true,
19
+ hasError: false,
20
+ resolve: () => __awaiter(this, void 0, void 0, function* () { return value; }),
21
+ };
22
+ }
23
+ function createEmptyIdentifiableReference(id) {
24
+ return createInitializedIdentifiableReference(undefined, id);
25
+ }
@@ -0,0 +1,6 @@
1
+ export * from './Cache';
2
+ export * from './DataManager';
3
+ export * from './List';
4
+ export * from './LiveList';
5
+ export * from './LiveReference';
6
+ export * from './Reference';
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./Cache"), exports);
18
+ __exportStar(require("./DataManager"), exports);
19
+ __exportStar(require("./List"), exports);
20
+ __exportStar(require("./LiveList"), exports);
21
+ __exportStar(require("./LiveReference"), exports);
22
+ __exportStar(require("./Reference"), exports);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@data-weave/backend-firestore",
3
- "version": "0.4.5",
3
+ "version": "0.4.7",
4
4
  "author": "",
5
5
  "main": "lib/index.js",
6
6
  "types": "lib/index.d.ts",
@@ -23,8 +23,8 @@
23
23
  "registry": "https://registry.npmjs.org/"
24
24
  },
25
25
  "peerDependencies": {
26
- "@data-weave/datamanager": "0.4.3",
26
+ "@data-weave/datamanager": "0.4.6",
27
27
  "firebase": ">=11.0.0"
28
28
  },
29
- "gitHead": "e78bab6280bc98003ab4dc48a4fda336b5c0f80f"
29
+ "gitHead": "09a715b9694113e389eedab5787a559c6e522a3a"
30
30
  }