firestore-schema-validator
Version:
Interface for creating models, schemas and validate data for Google Cloud Firestore.
69 lines (53 loc) • 1.51 kB
JavaScript
const Field = require('./Field')
const { isObject, markAsChanged } = require('./helpers')
const isPrivate = (key) => {
return key[0] === '_'
}
const isData = (target, key) => {
const fields = target.constructor._schema._fields
return fields.hasOwnProperty(key)
&& fields[key] instanceof Field
}
const nestedHandler = (model, path = []) => {
return {
get(target, key) {
if (isObject(target[key]))
return new Proxy(
target[key],
nestedHandler(model, [
...path,
key,
])
)
return target[key]
},
set(target, key, value) {
markAsChanged(model._changedKeys, value, [ ...path, key ])
return Reflect.set(target, key, value)
}
}
}
const ModelProxy = function (model) {
return new Proxy(model, {
get(target, key) {
if (isPrivate(key))
return target[key]
if (isData(target, key) && isObject(target._data[key]))
return new Proxy(target._data[key], nestedHandler(target, [key]))
if (isData(target, key))
return target._data[key]
return target[key]
},
set(target, key, value) {
if (isPrivate(key))
return Reflect.set(target, key, value)
if (isData(target, key)) {
markAsChanged(target._changedKeys, value, [ key ])
target._data[key] = value
return Reflect.set(target._data, key, value)
}
return Reflect.set(target, key, value)
},
})
}
module.exports = ModelProxy