firebase-tools
Version:
Command-Line Interface for Firebase
60 lines (59 loc) • 1.82 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.encodeFirestoreValue = void 0;
const _ = require("lodash");
const error_1 = require("../error");
function isPlainObject(input) {
return (typeof input === "object" &&
input !== null &&
_.isEqual(Object.getPrototypeOf(input), Object.prototype));
}
function encodeHelper(val) {
if (typeof val === "string") {
return { stringValue: val };
}
if (val === !!val) {
return { booleanValue: val };
}
if (Number.isInteger(val)) {
return { integerValue: val };
}
if (typeof val === "number") {
return { doubleValue: val };
}
if (val instanceof Date && !Number.isNaN(val)) {
return { timestampValue: val.toISOString() };
}
if (Array.isArray(val)) {
const encodedElements = [];
for (const v of val) {
const enc = encodeHelper(v);
if (enc) {
encodedElements.push(enc);
}
}
return {
arrayValue: { values: encodedElements },
};
}
if (val === null) {
return { nullValue: "NULL_VALUE" };
}
if (val instanceof Buffer || val instanceof Uint8Array) {
return { bytesValue: val };
}
if (isPlainObject(val)) {
return {
mapValue: { fields: encodeFirestoreValue(val) },
};
}
throw new error_1.FirebaseError(`Cannot encode ${val} to a Firestore Value. ` +
"The emulator does not yet support Firestore document reference values or geo points.");
}
function encodeFirestoreValue(data) {
return Object.entries(data).reduce((acc, [key, val]) => {
acc[key] = encodeHelper(val);
return acc;
}, {});
}
exports.encodeFirestoreValue = encodeFirestoreValue;
;