@jahed/firebase-rules
Version:
A type-safe Firebase Real-time Database Security Rules builder.
49 lines • 1.97 kB
JavaScript
import { createRuleObject } from "./object.js";
import { allOf } from "./operator.js";
import { createRuleBoolean, createRuleNumber } from "./primitive.js";
import { toJSONString } from "./serialise.js";
import { createRuleString } from "./string.js";
/**
* Creates a representation of a Firebase RuleDataSnapshots for use in rules.
*
* Note that `val()` is not type-specific so it's not available. Use `isString`,
* `isNumber`, etc. to apply rules to `val()`.
*
* `data.isString(val => lessThan(val.length, 100))` is the same as
* `data.isString() && data.val().length < 100`.
*
* https://firebase.google.com/docs/reference/security/database#ruledatasnapshot_methods
*/
export const createRuleDataSnapshot = (name) => {
return createRuleObject(name, {
isString: (valRule) => {
const baseRule = createRuleBoolean(`${name}.isString()`);
return valRule
? allOf(baseRule, valRule(createRuleString(`${name}.val()`)))
: baseRule;
},
isBoolean: (valRule) => {
const baseRule = createRuleBoolean(`${name}.isBoolean()`);
return valRule
? allOf(baseRule, valRule(createRuleBoolean(`${name}.val()`)))
: baseRule;
},
isNumber: (valRule) => {
const baseRule = createRuleBoolean(`${name}.isNumber()`);
return valRule
? allOf(baseRule, valRule(createRuleNumber(`${name}.val()`)))
: baseRule;
},
exists: () => {
return createRuleBoolean(`${name}.exists()`);
},
hasChildren: (keys) => {
return createRuleBoolean(`${name}.hasChildren(${toJSONString(keys)})`);
},
child: (...parts) => {
const key = parts.map((part) => toJSONString(part)).join(" + ");
return createRuleDataSnapshot(`${name}.child(${key})`);
},
});
};
//# sourceMappingURL=dataSnapshot.js.map