Firebase provides a variety of tools that are amazing. This wraps various aspects of the api.
- Types on returned documents
- Types on various CRUD functions
- Types for query construction
- Ability group queries/doc fetches
- Metrics that track doc read/writes for various collections
- Firestore caching is always disabled
- Sub collections are not supported
- Server timestamps are not supported
- Array filters are currently not supported
- Only supports basic types string, number, array, maps. No support for geo data, timestamps, etc.
- Increment is limited to a single number increment (no jumping by multiple numbers, or decrementing)
- startAt, startAfter, endAt, endBefore are supported for values but not for firestore docs or query docs. In other words you must use a value and not a firestore document when using those filters.
- Add some types for objects/primitives
- Only covers part of the API. You can access the raw refs to do everything normally without types.
import {
createRtdbLift,
createFirestoreLift,
FirestoreLiftCollection,
TypedFirebaseObjectOrPrimitiveRefGenerator,
} from 'firebase-lift';
import firebase from 'firebase';
interface Person {
id: string;
createdAtMS: number;
updatedAtMS: number;
name: string;
age: number;
}
interface Book {
id: string;
createdAtMS: number;
updatedAtMS: number;
title: string;
year: number;
}
interface Heartbeat {
dateMs: number;
msg: string;
}
interface DeviceInfo {
dateMs: number;
dId: string;
}
const app = firebase.initializeApp({} as any);
const firestoreLiftExample = createFirestoreLift<{
Person: FirestoreLiftCollection<Person>;
Book: FirestoreLiftCollection<Book>;
}>({
collections: {
Person: {
collection: 'person'
},
Book: {
collection: 'book'
}
},
firebaseApp: app,
firestoreModule: firebase.firestore
});
const rtdbLiftExample = createRtdbLift({
firebaseApp: app,
nodes: {
Heartbeat: (null as unknown) as TypedFirebaseObjectOrPrimitiveRefGenerator<Heartbeat>,
DeviceInfo: (null as unknown) as TypedFirebaseObjectOrPrimitiveRefGenerator<DeviceInfo>
}
});
- Overload signatures so we no longer need EmptyTask. Things should be able to return sync.
- Example of transaction input (when you need to read something, write something, and then conditionally apply the change if the original item hasn't updated)
- Test