UNPKG

@firestore-emulator/server

Version:

This package is the implementation of the Firestore emulator. It is a Node.js

78 lines (76 loc) 2.23 kB
// src/FirestoreState/mask.ts import { produce } from "immer"; // src/FirestoreState/field.ts import { NullValue } from "@firestore-emulator/proto/dist/google/protobuf/struct"; var FirestoreStateDocumentMapField = class _FirestoreStateDocumentMapField { constructor(value) { this.value = value; } type = "map_value"; toJSON() { return { type: this.type, value: Object.fromEntries( Object.entries(this.value).map(([k, v]) => [k, v.toJSON()]) ) }; } toV1ValueObject() { return { map_value: { fields: Object.fromEntries( Object.entries(this.value).map(([k, v]) => [k, v.toV1ValueObject()]) ) } }; } eq(other) { return other instanceof _FirestoreStateDocumentMapField && Object.keys(this.value).length === Object.keys(other.value).length && Object.entries(this.value).every(([k, v]) => { const item = other.value[k]; if (!item) return false; return item.eq(v); }); } lt(_other) { return false; } lte(_other) { return false; } gt(_other) { return false; } gte(_other) { return false; } }; // src/FirestoreState/mask.ts function escapeKey(key) { return key.includes(".") ? `\`${key}\`` : key; } function getNestedUpdateMask(updateMask, key) { const escapedKey = escapeKey(key); return updateMask.filter((m) => m.startsWith(`${escapedKey}.`)).map((m) => m.substring(escapedKey.length + 1)); } function isUpdatable(updateMask, key) { return updateMask.length === 0 || updateMask.includes(escapeKey(key)); } function updateFields(current, fields, updateMask) { return produce(current, (draft) => { for (const [key, field] of Object.entries(fields)) { const updatable = isUpdatable(updateMask, key); const nestedUpdateMask = getNestedUpdateMask(updateMask, key); if (updatable) { draft[key] = field; } else if (field.type === "map_value" && (draft[key] == null || draft[key].type === "map_value")) { draft[key] = new FirestoreStateDocumentMapField( updateFields(draft[key]?.value ?? {}, field.value, nestedUpdateMask) ); } } }); } export { updateFields }; //# sourceMappingURL=mask.mjs.map