@jahed/firebase-rules
Version:
A type-safe Firebase Real-time Database Security Rules builder.
132 lines • 3.82 kB
JavaScript
import { createRuleBoolean, createRuleNumber } from "./primitive.js";
import { toJSONString } from "./serialise.js";
import { createRuleString } from "./string.js";
/**
* Does an equality check between `a` and `b`.
*
* `equal(a, b)` is equivalent to `a === b`
*/
export const equal = (a, b) => {
return createRuleBoolean(`(${toJSONString(a)} === ${toJSONString(b)})`);
};
/**
* Does an inequality check between `a` and `b`.
*
* `notEqual(a, b)` is equivalent to `a !== b`
*/
export const notEqual = (a, b) => {
return createRuleBoolean(`(${toJSONString(a)} !== ${toJSONString(b)})`);
};
/**
* Requires all of its expressions to be `true`.
*
* `allOf(a, b, c)` is equivalent to `a && b && c`.
*/
export const allOf = (...expressions) => {
if (expressions.length < 2) {
const error = new Error(`unnecessary allOf called with ${expressions.length} arguments`);
console.warn(error);
}
return createRuleBoolean(`(${expressions.map((v) => v()).join(" && ")})`);
};
/**
* Requires at least one of its expressions to be `true`.
*
* `oneOf(a, b, c)` is equivalent to `a || b || c`.
*/
export const oneOf = (...expressions) => {
if (expressions.length < 2) {
const error = new Error(`unnecessary oneOf called with ${expressions.length} arguments`);
console.warn(error);
}
return createRuleBoolean(`(${expressions.map((v) => v()).join(" || ")})`);
};
/**
* Negates an expression.
*
* `not(a)` is equivalent to `!a`.
*/
export const not = (expression) => {
return createRuleBoolean("!" + expression());
};
/**
* Checks if `a` is greater than `b`.
*
* `greaterThan(a, b)` is equivalent to `a > b`.
*/
export const greaterThan = (a, b) => {
return createRuleBoolean(`(${toJSONString(a)} > ${toJSONString(b)})`);
};
/**
* Checks if `a` is less than `b`.
*
* `lessThan(a, b)` is equivalent to `a < b`.
*/
export const lessThan = (a, b) => {
return createRuleBoolean(`(${toJSONString(a)} < ${toJSONString(b)})`);
};
/**
* Calculates `b` added to `a` and so on.
*
* `add(a, b, c, ...)` is equivalent to `a + b + c ...`.
*/
export const add = (...args) => {
return createRuleNumber(`(${args.map((s) => toJSONString(s)).join(" + ")})`);
};
/**
* Calculates `b` subtracted from `a` and so on.
*
* `subtract(a, b, c, ...)` is equivalent to `a - b - c ...`.
*/
export const subtract = (...args) => {
return () => `(${args.map((s) => toJSONString(s)).join(" - ")})`;
};
/**
* Negates `a`.
*
* `negate(a)` is equivalent to `-a`.
*/
export const negate = (a) => {
return () => `(-(${toJSONString(a)}))`;
};
/**
* Calculates `b` multiplied by `a` and so on.
*
* `multiply(a, b, c, ...)` is equivalent to `a * b * c ...`.
*/
export const multiply = (...args) => {
return () => `(${args.map((s) => toJSONString(s)).join(" - ")})`;
};
/**
* Calculates `b` divided by `a` and so on.
*
* `divide(a, b, c, ...)` is equivalent to `a / b / c ...`.
*/
export const divide = (...args) => {
return () => `(${args.map((s) => toJSONString(s)).join(" / ")})`;
};
/**
* Calculates `a` modulus `b` and so on.
*
* `modulus(a, b, c, ...)` is equivalent to `a % b % c ...`.
*/
export const modulus = (...args) => {
return () => `(${args.map((s) => toJSONString(s)).join(" % ")})`;
};
/**
* Checks if `a` is between `lower` and `upper`, exclusive.
*
* `between(a, b, c)` is equivalent to `a > b && a < c`.
*/
export const between = (value, lower, upper) => {
return allOf(greaterThan(value, lower), lessThan(value, upper));
};
/**
* Calculates `b` concatenated to `a` and so on.
*
* `concat(a, b, ...)` is equivalent to `a + b + c + ...`.
*/
export const concat = (...args) => {
return createRuleString(`(${args.map((s) => toJSONString(s)).join(" + ")})`);
};
//# sourceMappingURL=operator.js.map