@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
JavaScript
// 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