@beabee/beabee-common 1.7.4 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -17,7 +17,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
17
17
  return (mod && mod.__esModule) ? mod : { "default": mod };
18
18
  };
19
19
  Object.defineProperty(exports, "__esModule", { value: true });
20
- exports.convertFiltersToRuleGroup = exports.convertRuleGroupToFilters = exports.validateRuleGroup = exports.validateRule = exports.isRuleGroup = exports.operatorsByType = exports.nullableOperators = exports.ruleOperators = void 0;
20
+ exports.convertFiltersToRuleGroup = exports.convertRuleGroupToFilters = exports.validateRuleGroup = exports.validateRule = exports.InvalidRule = exports.isRuleGroup = exports.operatorsByType = exports.nullableOperators = exports.ruleOperators = void 0;
21
21
  const isValid_1 = __importDefault(require("date-fns/isValid"));
22
22
  const parseISO_1 = __importDefault(require("date-fns/parseISO"));
23
23
  // *** Definitions for rules ***
@@ -84,37 +84,47 @@ function isRuleGroup(ruleOrGroup) {
84
84
  return "condition" in ruleOrGroup;
85
85
  }
86
86
  exports.isRuleGroup = isRuleGroup;
87
+ class InvalidRule extends Error {
88
+ constructor(rule, message) {
89
+ super();
90
+ this.rule = rule;
91
+ this.message = message;
92
+ Object.setPrototypeOf(this, InvalidRule.prototype);
93
+ }
94
+ }
95
+ exports.InvalidRule = InvalidRule;
87
96
  function validateRule(filters, rule) {
88
97
  const filter = filters[rule.field];
89
98
  if (!filter) {
90
- return false; // Invalid field
99
+ throw new InvalidRule(rule, `Invalid field: ${rule.field}`);
91
100
  }
92
101
  if (rule.operator in exports.nullableOperators) {
102
+ // Field cannot be empty (except text which can always be empty)
93
103
  if (!filter.nullable && filter.type !== "text") {
94
- return false; // Field cannot be empty (text can always be empty)
104
+ throw new InvalidRule(rule, `Invalid nullable operator: field is not nullable`);
95
105
  }
96
106
  if (rule.value.length !== 0) {
97
- return false; // Should have no args
107
+ throw new InvalidRule(rule, `Invalid operator argument count: ${rule.operator} needs 0, ${rule.value.length} given`);
98
108
  }
99
109
  }
100
110
  else {
101
111
  const operator = operatorsByTypeMap[filter.type][rule.operator];
102
112
  if (!operator) {
103
- return false; // Invalid operator
113
+ throw new InvalidRule(rule, `Invalid operator for type: ${filter.type} type doesn't define ${rule.operator}`);
104
114
  }
105
115
  if (operator.args !== rule.value.length) {
106
- return false; // Invalid number of args
116
+ throw new InvalidRule(rule, `Invalid operator argument count: ${rule.operator} needs ${operator.args}, ${rule.value.length} given`);
107
117
  }
108
118
  }
109
119
  const expectedType = filter.type === "boolean" || filter.type === "number"
110
120
  ? filter.type
111
121
  : "string";
112
122
  if (rule.value.some((v) => typeof v !== expectedType)) {
113
- return false; // Invalid value type
123
+ throw new InvalidRule(rule, `Invalid operator argument type: ${rule.operator} needs ${expectedType}, ${rule.value.map((v) => typeof v)} given`);
114
124
  }
115
125
  if (filter.type === "date" &&
116
126
  rule.value.some((v) => !(0, isValid_1.default)((0, parseISO_1.default)(v)))) {
117
- return false; // Invalid date
127
+ throw new InvalidRule(rule, `Invalid operator argument: date type needs valid absolute or relative date, ${rule.value} given`);
118
128
  }
119
129
  return {
120
130
  ...rule,
@@ -131,9 +141,6 @@ function validateRuleGroup(filters, ruleGroup) {
131
141
  const valid = isRuleGroup(rule)
132
142
  ? validateRuleGroup(filters, rule)
133
143
  : validateRule(filters, rule);
134
- if (!valid) {
135
- return false;
136
- }
137
144
  validatedRuleGroup.rules.push(valid);
138
145
  }
139
146
  return validatedRuleGroup;
@@ -63,37 +63,46 @@ const operatorsByTypeMap = operatorsByType;
63
63
  export function isRuleGroup(ruleOrGroup) {
64
64
  return "condition" in ruleOrGroup;
65
65
  }
66
+ export class InvalidRule extends Error {
67
+ constructor(rule, message) {
68
+ super();
69
+ this.rule = rule;
70
+ this.message = message;
71
+ Object.setPrototypeOf(this, InvalidRule.prototype);
72
+ }
73
+ }
66
74
  export function validateRule(filters, rule) {
67
75
  const filter = filters[rule.field];
68
76
  if (!filter) {
69
- return false; // Invalid field
77
+ throw new InvalidRule(rule, `Invalid field: ${rule.field}`);
70
78
  }
71
79
  if (rule.operator in nullableOperators) {
80
+ // Field cannot be empty (except text which can always be empty)
72
81
  if (!filter.nullable && filter.type !== "text") {
73
- return false; // Field cannot be empty (text can always be empty)
82
+ throw new InvalidRule(rule, `Invalid nullable operator: field is not nullable`);
74
83
  }
75
84
  if (rule.value.length !== 0) {
76
- return false; // Should have no args
85
+ throw new InvalidRule(rule, `Invalid operator argument count: ${rule.operator} needs 0, ${rule.value.length} given`);
77
86
  }
78
87
  }
79
88
  else {
80
89
  const operator = operatorsByTypeMap[filter.type][rule.operator];
81
90
  if (!operator) {
82
- return false; // Invalid operator
91
+ throw new InvalidRule(rule, `Invalid operator for type: ${filter.type} type doesn't define ${rule.operator}`);
83
92
  }
84
93
  if (operator.args !== rule.value.length) {
85
- return false; // Invalid number of args
94
+ throw new InvalidRule(rule, `Invalid operator argument count: ${rule.operator} needs ${operator.args}, ${rule.value.length} given`);
86
95
  }
87
96
  }
88
97
  const expectedType = filter.type === "boolean" || filter.type === "number"
89
98
  ? filter.type
90
99
  : "string";
91
100
  if (rule.value.some((v) => typeof v !== expectedType)) {
92
- return false; // Invalid value type
101
+ throw new InvalidRule(rule, `Invalid operator argument type: ${rule.operator} needs ${expectedType}, ${rule.value.map((v) => typeof v)} given`);
93
102
  }
94
103
  if (filter.type === "date" &&
95
104
  rule.value.some((v) => !isValid(parseISO(v)))) {
96
- return false; // Invalid date
105
+ throw new InvalidRule(rule, `Invalid operator argument: date type needs valid absolute or relative date, ${rule.value} given`);
97
106
  }
98
107
  return {
99
108
  ...rule,
@@ -109,9 +118,6 @@ export function validateRuleGroup(filters, ruleGroup) {
109
118
  const valid = isRuleGroup(rule)
110
119
  ? validateRuleGroup(filters, rule)
111
120
  : validateRule(filters, rule);
112
- if (!valid) {
113
- return false;
114
- }
115
121
  validatedRuleGroup.rules.push(valid);
116
122
  }
117
123
  return validatedRuleGroup;
@@ -179,8 +179,13 @@ export interface PaginatedQuery {
179
179
  rules?: RuleGroup;
180
180
  }
181
181
  export declare function isRuleGroup(ruleOrGroup: Rule | RuleGroup): ruleOrGroup is RuleGroup;
182
- export declare function validateRule<Field extends string>(filters: Filters<Field>, rule: Rule): ValidatedRule<Field> | false;
183
- export declare function validateRuleGroup<Field extends string>(filters: Filters<Field>, ruleGroup: RuleGroup): ValidatedRuleGroup<Field> | false;
182
+ export declare class InvalidRule extends Error {
183
+ readonly rule: Rule;
184
+ readonly message: string;
185
+ constructor(rule: Rule, message: string);
186
+ }
187
+ export declare function validateRule<Field extends string>(filters: Filters<Field>, rule: Rule): ValidatedRule<Field>;
188
+ export declare function validateRuleGroup<Field extends string>(filters: Filters<Field>, ruleGroup: RuleGroup): ValidatedRuleGroup<Field>;
184
189
  export declare function convertRuleGroupToFilters(ruleGroup?: RuleGroup): Filter[] | null;
185
190
  export declare function convertFiltersToRuleGroup(matchType: "all" | "any", filters: Filter[]): RuleGroup;
186
191
  export * from "./callouts";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@beabee/beabee-common",
3
- "version": "1.7.4",
3
+ "version": "1.8.1",
4
4
  "description": "",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "module": "./dist/esm/index.js",