@beabee/beabee-common 1.6.1 → 1.7.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.
@@ -86,10 +86,27 @@ function validateRule(filters, rule) {
86
86
  if (operator.args !== rule.value.length) {
87
87
  return false; // Invalid number of args
88
88
  }
89
- return true;
89
+ const expectedType = filter.type === "boolean" || filter.type === "number"
90
+ ? filter.type
91
+ : "string";
92
+ if (rule.value.some((v) => typeof v !== expectedType)) {
93
+ return false; // Invalid value type
94
+ }
95
+ if (filter.type === "date" &&
96
+ rule.value.some((v) => isNaN(+new Date(v)))) {
97
+ return false; // Invalid date
98
+ }
99
+ return {
100
+ ...rule,
101
+ type: filter.type,
102
+ };
90
103
  }
91
104
  exports.validateRule = validateRule;
92
105
  function validateRuleGroup(filters, ruleGroup) {
106
+ const validatedRuleGroup = {
107
+ condition: ruleGroup.condition,
108
+ rules: [],
109
+ };
93
110
  for (const rule of ruleGroup.rules) {
94
111
  const valid = isRuleGroup(rule)
95
112
  ? validateRuleGroup(filters, rule)
@@ -97,8 +114,9 @@ function validateRuleGroup(filters, ruleGroup) {
97
114
  if (!valid) {
98
115
  return false;
99
116
  }
117
+ validatedRuleGroup.rules.push(valid);
100
118
  }
101
- return true;
119
+ return validatedRuleGroup;
102
120
  }
103
121
  exports.validateRuleGroup = validateRuleGroup;
104
122
  function convertRuleGroupToFilters(ruleGroup) {
@@ -68,9 +68,26 @@ export function validateRule(filters, rule) {
68
68
  if (operator.args !== rule.value.length) {
69
69
  return false; // Invalid number of args
70
70
  }
71
- return true;
71
+ const expectedType = filter.type === "boolean" || filter.type === "number"
72
+ ? filter.type
73
+ : "string";
74
+ if (rule.value.some((v) => typeof v !== expectedType)) {
75
+ return false; // Invalid value type
76
+ }
77
+ if (filter.type === "date" &&
78
+ rule.value.some((v) => isNaN(+new Date(v)))) {
79
+ return false; // Invalid date
80
+ }
81
+ return {
82
+ ...rule,
83
+ type: filter.type,
84
+ };
72
85
  }
73
86
  export function validateRuleGroup(filters, ruleGroup) {
87
+ const validatedRuleGroup = {
88
+ condition: ruleGroup.condition,
89
+ rules: [],
90
+ };
74
91
  for (const rule of ruleGroup.rules) {
75
92
  const valid = isRuleGroup(rule)
76
93
  ? validateRuleGroup(filters, rule)
@@ -78,8 +95,9 @@ export function validateRuleGroup(filters, ruleGroup) {
78
95
  if (!valid) {
79
96
  return false;
80
97
  }
98
+ validatedRuleGroup.rules.push(valid);
81
99
  }
82
- return true;
100
+ return validatedRuleGroup;
83
101
  }
84
102
  export function convertRuleGroupToFilters(ruleGroup) {
85
103
  if (!ruleGroup) {
@@ -1,14 +1,28 @@
1
1
  export declare const ruleOperators: readonly ["equal", "not_equal", "less", "less_or_equal", "greater", "greater_or_equal", "between", "not_between", "begins_with", "not_begins_with", "contains", "not_contains", "ends_with", "not_ends_with", "is_empty", "is_not_empty"];
2
2
  export declare type RuleOperator = typeof ruleOperators[number];
3
3
  export declare type RuleValue = string | number | boolean;
4
- export interface Rule<Field extends string> {
5
- field: Field;
4
+ export interface Rule {
5
+ field: string;
6
6
  operator: RuleOperator;
7
7
  value: RuleValue[];
8
8
  }
9
- export interface RuleGroup<Field extends string> {
9
+ export interface RuleGroup {
10
10
  condition: "AND" | "OR";
11
- rules: (RuleGroup<Field> | Rule<Field>)[];
11
+ rules: (RuleGroup | Rule)[];
12
+ }
13
+ interface BaseValidatedRule<T extends FilterType, F extends string, V> {
14
+ type: T;
15
+ field: F;
16
+ operator: keyof typeof operatorsByType[T];
17
+ value: V[];
18
+ }
19
+ declare type ValidatedNumberRule<Field extends string> = BaseValidatedRule<"number", Field, number>;
20
+ declare type ValidatedStringRule<Field extends string> = BaseValidatedRule<Exclude<FilterType, "number" | "boolean">, Field, string>;
21
+ declare type ValidatedBooleanRule<Field extends string> = BaseValidatedRule<"boolean", Field, boolean>;
22
+ export declare type ValidatedRule<Field extends string> = ValidatedNumberRule<Field> | ValidatedStringRule<Field> | ValidatedBooleanRule<Field>;
23
+ export interface ValidatedRuleGroup<Field extends string> {
24
+ condition: "AND" | "OR";
25
+ rules: (ValidatedRuleGroup<Field> | ValidatedRule<Field>)[];
12
26
  }
13
27
  export declare type FilterType = "text" | "date" | "number" | "boolean" | "array" | "enum" | "contact";
14
28
  export declare type FilterValue = RuleValue;
@@ -24,7 +38,115 @@ export declare const nullableOperators: {
24
38
  args: number;
25
39
  };
26
40
  };
27
- export declare const operatorsByType: Record<FilterType, Partial<Record<FilterOperator, FilterOperatorParams>>>;
41
+ export declare const operatorsByType: {
42
+ readonly text: {
43
+ readonly begins_with: {
44
+ readonly args: 1;
45
+ };
46
+ readonly ends_with: {
47
+ readonly args: 1;
48
+ };
49
+ readonly not_begins_with: {
50
+ readonly args: 1;
51
+ };
52
+ readonly not_ends_with: {
53
+ readonly args: 1;
54
+ };
55
+ readonly contains: {
56
+ args: number;
57
+ };
58
+ readonly not_contains: {
59
+ args: number;
60
+ };
61
+ readonly equal: {
62
+ args: number;
63
+ };
64
+ readonly not_equal: {
65
+ args: number;
66
+ };
67
+ };
68
+ readonly date: {
69
+ between: {
70
+ args: number;
71
+ };
72
+ not_between: {
73
+ args: number;
74
+ };
75
+ less: {
76
+ args: number;
77
+ };
78
+ greater: {
79
+ args: number;
80
+ };
81
+ less_or_equal: {
82
+ args: number;
83
+ };
84
+ greater_or_equal: {
85
+ args: number;
86
+ };
87
+ equal: {
88
+ args: number;
89
+ };
90
+ not_equal: {
91
+ args: number;
92
+ };
93
+ };
94
+ readonly number: {
95
+ between: {
96
+ args: number;
97
+ };
98
+ not_between: {
99
+ args: number;
100
+ };
101
+ less: {
102
+ args: number;
103
+ };
104
+ greater: {
105
+ args: number;
106
+ };
107
+ less_or_equal: {
108
+ args: number;
109
+ };
110
+ greater_or_equal: {
111
+ args: number;
112
+ };
113
+ equal: {
114
+ args: number;
115
+ };
116
+ not_equal: {
117
+ args: number;
118
+ };
119
+ };
120
+ readonly boolean: {
121
+ readonly equal: {
122
+ args: number;
123
+ };
124
+ };
125
+ readonly array: {
126
+ contains: {
127
+ args: number;
128
+ };
129
+ not_contains: {
130
+ args: number;
131
+ };
132
+ };
133
+ readonly enum: {
134
+ equal: {
135
+ args: number;
136
+ };
137
+ not_equal: {
138
+ args: number;
139
+ };
140
+ };
141
+ readonly contact: {
142
+ equal: {
143
+ args: number;
144
+ };
145
+ not_equal: {
146
+ args: number;
147
+ };
148
+ };
149
+ };
28
150
  interface BaseFilterArgs {
29
151
  type: FilterType;
30
152
  nullable?: boolean;
@@ -49,18 +171,18 @@ export interface Paginated<T> {
49
171
  count: number;
50
172
  total: number;
51
173
  }
52
- export interface PaginatedQuery<Field extends string> {
174
+ export interface PaginatedQuery {
53
175
  limit?: number;
54
176
  offset?: number;
55
177
  sort?: string;
56
178
  order?: "ASC" | "DESC";
57
- rules?: RuleGroup<Field>;
179
+ rules?: RuleGroup;
58
180
  }
59
- export declare function isRuleGroup<Field extends string>(ruleOrGroup: Rule<Field> | RuleGroup<Field>): ruleOrGroup is RuleGroup<Field>;
60
- export declare function validateRule<Field extends string>(filters: Filters<Field>, rule: Rule<string>): rule is Rule<Field>;
61
- export declare function validateRuleGroup<Field extends string>(filters: Filters<Field>, ruleGroup: RuleGroup<string>): ruleGroup is RuleGroup<Field>;
62
- export declare function convertRuleGroupToFilters(ruleGroup?: RuleGroup<string>): Filter[] | null;
63
- export declare function convertFiltersToRuleGroup(matchType: "all" | "any", filters: Filter[]): RuleGroup<string>;
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;
184
+ export declare function convertRuleGroupToFilters(ruleGroup?: RuleGroup): Filter[] | null;
185
+ export declare function convertFiltersToRuleGroup(matchType: "all" | "any", filters: Filter[]): RuleGroup;
64
186
  export * from "./callouts";
65
187
  export * from "./contacts";
66
188
  export * from "./notices";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@beabee/beabee-common",
3
- "version": "1.6.1",
3
+ "version": "1.7.0",
4
4
  "description": "",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "module": "./dist/esm/index.js",