apollo-datasource-firestore
Version:
An Apollo DataSource for Firestore
58 lines • 2.17 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.FirestoreConverter = exports.isFirestoreCollection = void 0;
exports.reviverFactory = reviverFactory;
exports.replacer = replacer;
const firestore_1 = require("@google-cloud/firestore");
const isFirestoreCollection = (maybeCollection) => {
return (maybeCollection.id &&
maybeCollection.path &&
maybeCollection.firestore &&
maybeCollection.doc);
};
exports.isFirestoreCollection = isFirestoreCollection;
const FirestoreConverter = () => ({
toFirestore: ({ id, collection, createdAt, updatedAt, ...data }) => data,
fromFirestore: (snap) => ({
...snap.data(),
id: snap.id,
collection: snap.ref.parent.id,
createdAt: snap.createTime,
updatedAt: snap.updateTime,
}),
});
exports.FirestoreConverter = FirestoreConverter;
const symbolMatch = /^\$\$(Timestamp|GeoPoint|DocumentReference)\$\$:/;
function reviverFactory(collection) {
return function reviver(key, value) {
if (typeof value === 'string' && symbolMatch.test(value)) {
const split = value.split(':');
switch (split[0]) {
case '$$Timestamp$$':
return new firestore_1.Timestamp(parseInt(split[1], 10), parseInt(split[2], 10));
case '$$DocumentReference$$':
return collection.firestore.doc(split[1]);
case '$$GeoPoint$$':
return new firestore_1.GeoPoint(parseFloat(split[1]), parseFloat(split[2]));
default:
return value;
}
}
else
return value;
};
}
function replacer(key, value) {
if (value instanceof firestore_1.Timestamp) {
return `$$Timestamp$$:${value.seconds}:${value.nanoseconds}`;
}
else if (value instanceof firestore_1.DocumentReference) {
return `$$DocumentReference$$:${value.path}`;
}
else if (value instanceof firestore_1.GeoPoint) {
return `$$GeoPoint$$:${value.latitude}:${value.longitude}`;
}
else
return value;
}
//# sourceMappingURL=helpers.js.map
;