@beabee/beabee-common 1.7.4 → 1.8.0
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.
- package/dist/cjs/search/index.js +17 -10
- package/dist/esm/search/index.js +16 -10
- package/dist/types/search/index.d.ts +7 -2
- package/package.json +1 -1
package/dist/cjs/search/index.js
CHANGED
|
@@ -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.default = InvalidRule;
|
|
87
96
|
function validateRule(filters, rule) {
|
|
88
97
|
const filter = filters[rule.field];
|
|
89
98
|
if (!filter) {
|
|
90
|
-
|
|
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
|
-
|
|
104
|
+
throw new InvalidRule(rule, `Invalid nullable operator: field is not nullable`);
|
|
95
105
|
}
|
|
96
106
|
if (rule.value.length !== 0) {
|
|
97
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
package/dist/esm/search/index.js
CHANGED
|
@@ -63,37 +63,46 @@ const operatorsByTypeMap = operatorsByType;
|
|
|
63
63
|
export function isRuleGroup(ruleOrGroup) {
|
|
64
64
|
return "condition" in ruleOrGroup;
|
|
65
65
|
}
|
|
66
|
+
export default 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
|
-
|
|
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
|
-
|
|
82
|
+
throw new InvalidRule(rule, `Invalid nullable operator: field is not nullable`);
|
|
74
83
|
}
|
|
75
84
|
if (rule.value.length !== 0) {
|
|
76
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
183
|
-
|
|
182
|
+
export default 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";
|