@form-flow/core 1.0.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.
Files changed (58) hide show
  1. package/README.md +281 -0
  2. package/dist/dependency-graph.d.ts +14 -0
  3. package/dist/dependency-graph.d.ts.map +1 -0
  4. package/dist/dependency-graph.js +69 -0
  5. package/dist/dependency-graph.js.map +1 -0
  6. package/dist/index.d.ts +13 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +23 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/models/field-definition.d.ts +49 -0
  11. package/dist/models/field-definition.d.ts.map +1 -0
  12. package/dist/models/field-definition.js +3 -0
  13. package/dist/models/field-definition.js.map +1 -0
  14. package/dist/models/form-definition.d.ts +16 -0
  15. package/dist/models/form-definition.d.ts.map +1 -0
  16. package/dist/models/form-definition.js +3 -0
  17. package/dist/models/form-definition.js.map +1 -0
  18. package/dist/models/group.d.ts +12 -0
  19. package/dist/models/group.d.ts.map +1 -0
  20. package/dist/models/group.js +3 -0
  21. package/dist/models/group.js.map +1 -0
  22. package/dist/models/operator-registry.d.ts +21 -0
  23. package/dist/models/operator-registry.d.ts.map +1 -0
  24. package/dist/models/operator-registry.js +31 -0
  25. package/dist/models/operator-registry.js.map +1 -0
  26. package/dist/models/operators.d.ts +43 -0
  27. package/dist/models/operators.d.ts.map +1 -0
  28. package/dist/models/operators.js +29 -0
  29. package/dist/models/operators.js.map +1 -0
  30. package/dist/models/rule.d.ts +10 -0
  31. package/dist/models/rule.d.ts.map +1 -0
  32. package/dist/models/rule.js +3 -0
  33. package/dist/models/rule.js.map +1 -0
  34. package/dist/modern-rule-builder-engine.d.ts +46 -0
  35. package/dist/modern-rule-builder-engine.d.ts.map +1 -0
  36. package/dist/modern-rule-builder-engine.js +198 -0
  37. package/dist/modern-rule-builder-engine.js.map +1 -0
  38. package/dist/rule-builder.d.ts +30 -0
  39. package/dist/rule-builder.d.ts.map +1 -0
  40. package/dist/rule-builder.js +75 -0
  41. package/dist/rule-builder.js.map +1 -0
  42. package/dist/rule-evaluator.d.ts +11 -0
  43. package/dist/rule-evaluator.d.ts.map +1 -0
  44. package/dist/rule-evaluator.js +90 -0
  45. package/dist/rule-evaluator.js.map +1 -0
  46. package/dist/utility/field-helper.d.ts +5 -0
  47. package/dist/utility/field-helper.d.ts.map +1 -0
  48. package/dist/utility/field-helper.js +11 -0
  49. package/dist/utility/field-helper.js.map +1 -0
  50. package/dist/utility/rule-helper.d.ts +10 -0
  51. package/dist/utility/rule-helper.d.ts.map +1 -0
  52. package/dist/utility/rule-helper.js +45 -0
  53. package/dist/utility/rule-helper.js.map +1 -0
  54. package/dist/utility/rule-mapper.d.ts +11 -0
  55. package/dist/utility/rule-mapper.d.ts.map +1 -0
  56. package/dist/utility/rule-mapper.js +88 -0
  57. package/dist/utility/rule-mapper.js.map +1 -0
  58. package/package.json +47 -0
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FORM_FLOW_OPERATORS_MAP = void 0;
4
+ /**
5
+ * Default operator map shipped with `@form-flow/core`.
6
+ * Consumers may override or extend this map at runtime.
7
+ */
8
+ exports.FORM_FLOW_OPERATORS_MAP = {
9
+ eq: { label: 'Equals', allowedTypes: "all", valueType: "single" },
10
+ neq: { label: 'Not equal to', allowedTypes: "all", valueType: "single" },
11
+ gt: { label: 'Greater than', allowedTypes: ['number', 'date'], valueType: "single" },
12
+ gte: { label: 'Greater than or equal to', allowedTypes: ['number', 'date'], valueType: "single" },
13
+ lt: { label: 'Less than', allowedTypes: ['number', 'date'], valueType: "single" },
14
+ lte: { label: 'Less than or equal to', allowedTypes: ['number', 'date'], valueType: "single" },
15
+ in: { label: 'Is in', allowedTypes: "all", valueType: "list" },
16
+ var: { label: 'Variable', allowedTypes: "all", valueType: "field", hideFromPicker: true },
17
+ isEmpty: { label: 'Is empty', allowedTypes: "all", valueType: "none" },
18
+ isNotEmpty: { label: 'Is not empty', allowedTypes: "all", valueType: "none" },
19
+ isTrue: { label: 'Is true', allowedTypes: ['checkbox'], valueType: "none" },
20
+ isFalse: { label: 'Is false', allowedTypes: ['checkbox'], valueType: "none" },
21
+ contains: { label: 'Contains', allowedTypes: ['text'], valueType: "single" },
22
+ startsWith: { label: 'Starts with', allowedTypes: ['text'], valueType: "single" },
23
+ endsWith: { label: 'Ends with', allowedTypes: ['text'], valueType: "single" },
24
+ dateAfter: { label: 'Date is after', allowedTypes: ['date'], valueType: "single" },
25
+ dateBefore: { label: 'Date is before', allowedTypes: ['date'], valueType: "single" },
26
+ lengthEquals: { label: 'Length equals', allowedTypes: ['text'], valueType: "single" },
27
+ truthy: { label: 'Is truthy', allowedTypes: ['checkbox'], valueType: "none" },
28
+ };
29
+ //# sourceMappingURL=operators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operators.js","sourceRoot":"","sources":["../../src/models/operators.ts"],"names":[],"mappings":";;;AAiDA;;;GAGG;AACU,QAAA,uBAAuB,GACmB;IACrD,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE;IACjE,GAAG,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE;IACxE,EAAE,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE;IACpF,GAAG,EAAE,EAAE,KAAK,EAAE,0BAA0B,EAAE,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE;IACjG,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE;IACjF,GAAG,EAAE,EAAE,KAAK,EAAE,uBAAuB,EAAE,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE;IAC9F,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE;IAC9D,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE;IACzF,OAAO,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE;IACtE,UAAU,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE;IAC7E,MAAM,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE;IAC3E,OAAO,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE;IAC7E,QAAQ,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE;IAC5E,UAAU,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE;IACjF,QAAQ,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE;IAC7E,SAAS,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE;IAClF,UAAU,EAAE,EAAE,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE;IACpF,YAAY,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,QAAQ,EAAE;IACrF,MAAM,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,CAAC,UAAU,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE;CAC9E,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { RuleOperatorKey } from "./operators";
2
+ export interface FieldRuleDefinition {
3
+ readonly ruleId: string;
4
+ groupId?: string;
5
+ conditionFieldId: string;
6
+ not?: boolean;
7
+ operator: RuleOperatorKey;
8
+ value?: any;
9
+ }
10
+ //# sourceMappingURL=rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule.d.ts","sourceRoot":"","sources":["../../src/models/rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE9C,MAAM,WAAW,mBAAmB;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,EAAE,MAAM,CAAC;IACzB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,eAAe,CAAC;IAC1B,KAAK,CAAC,EAAE,GAAG,CAAC;CACf"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule.js","sourceRoot":"","sources":["../../src/models/rule.ts"],"names":[],"mappings":""}
@@ -0,0 +1,46 @@
1
+ import { RulesLogic } from "json-logic-js";
2
+ interface ConditionMethods {
3
+ eq(value: any): RuleChain;
4
+ neq(value: any): RuleChain;
5
+ gt(value: any): RuleChain;
6
+ gte(value: any): RuleChain;
7
+ lt(value: any): RuleChain;
8
+ lte(value: any): RuleChain;
9
+ in(array: any[]): RuleChain;
10
+ isEmpty(): RuleChain;
11
+ isNotEmpty(): RuleChain;
12
+ isTrue(): RuleChain;
13
+ isFalse(): RuleChain;
14
+ startsWith(prefix: string): RuleChain;
15
+ contains(value: string): RuleChain;
16
+ endsWith(suffix: string): RuleChain;
17
+ dateAfter(date: string): RuleChain;
18
+ dateBefore(date: string): RuleChain;
19
+ lengthEquals(length: number): RuleChain;
20
+ truthy(): RuleChain;
21
+ }
22
+ interface ChainMethods {
23
+ and(field: string): ConditionMethods;
24
+ or(field: string): ConditionMethods;
25
+ build(): RulesLogic;
26
+ }
27
+ type RuleChain = ConditionMethods & ChainMethods;
28
+ export declare class Rule {
29
+ static when(field: string): ConditionMethods;
30
+ }
31
+ export declare class RuleGroupBuilder {
32
+ private operator;
33
+ private rules;
34
+ constructor(operator?: 'and' | 'or');
35
+ static and(): RuleGroupBuilder;
36
+ static or(): RuleGroupBuilder;
37
+ add(rule: RulesLogic): this;
38
+ addRule(builder: (rule: typeof Rule) => RulesLogic): this;
39
+ addGroup(group: RulesLogic): this;
40
+ addWhen(field: string): ConditionMethods & {
41
+ then: (condition: RulesLogic) => RuleGroupBuilder;
42
+ };
43
+ build(): RulesLogic;
44
+ }
45
+ export {};
46
+ //# sourceMappingURL=modern-rule-builder-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modern-rule-builder-engine.d.ts","sourceRoot":"","sources":["../src/modern-rule-builder-engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAI3C,UAAU,gBAAgB;IACtB,EAAE,CAAC,KAAK,EAAE,GAAG,GAAG,SAAS,CAAC;IAC1B,GAAG,CAAC,KAAK,EAAE,GAAG,GAAG,SAAS,CAAC;IAC3B,EAAE,CAAC,KAAK,EAAE,GAAG,GAAG,SAAS,CAAC;IAC1B,GAAG,CAAC,KAAK,EAAE,GAAG,GAAG,SAAS,CAAC;IAC3B,EAAE,CAAC,KAAK,EAAE,GAAG,GAAG,SAAS,CAAC;IAC1B,GAAG,CAAC,KAAK,EAAE,GAAG,GAAG,SAAS,CAAC;IAC3B,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,SAAS,CAAC;IAC5B,OAAO,IAAI,SAAS,CAAC;IACrB,UAAU,IAAI,SAAS,CAAC;IACxB,MAAM,IAAI,SAAS,CAAC;IACpB,OAAO,IAAI,SAAS,CAAC;IACrB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,MAAM,IAAI,SAAS,CAAC;CACvB;AAGD,UAAU,YAAY;IAClB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACrC,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACpC,KAAK,IAAI,UAAU,CAAC;CACvB;AAGD,KAAK,SAAS,GAAG,gBAAgB,GAAG,YAAY,CAAC;AAkIjD,qBAAa,IAAI;IACb,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB;CAG/C;AAGD,qBAAa,gBAAgB;IAGb,OAAO,CAAC,QAAQ;IAF5B,OAAO,CAAC,KAAK,CAAoB;gBAEb,QAAQ,GAAE,KAAK,GAAG,IAAY;IAElD,MAAM,CAAC,GAAG;IAIV,MAAM,CAAC,EAAE;IAIT,GAAG,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAK3B,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,OAAO,IAAI,KAAK,UAAU,GAAG,IAAI;IAKzD,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAKjC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,GAAG;QACvC,IAAI,EAAE,CAAC,SAAS,EAAE,UAAU,KAAK,gBAAgB,CAAA;KACpD;IASD,KAAK,IAAI,UAAU;CAetB"}
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RuleGroupBuilder = exports.Rule = void 0;
4
+ const rule_builder_1 = require("./rule-builder"); // Il tuo codice esistente
5
+ class RuleCondition {
6
+ constructor(field) {
7
+ this.field = field;
8
+ this.rules = [];
9
+ this.currentOperator = 'and';
10
+ }
11
+ // Metodi di condizione
12
+ eq(value) {
13
+ this.rules.push(rule_builder_1.RuleBuilder.value.eq(this.field, value));
14
+ return this;
15
+ }
16
+ neq(value) {
17
+ this.rules.push(rule_builder_1.RuleBuilder.value.neq(this.field, value));
18
+ return this;
19
+ }
20
+ gt(value) {
21
+ this.rules.push(rule_builder_1.RuleBuilder.value.gt(this.field, value));
22
+ return this;
23
+ }
24
+ gte(value) {
25
+ this.rules.push(rule_builder_1.RuleBuilder.value.gte(this.field, value));
26
+ return this;
27
+ }
28
+ lt(value) {
29
+ this.rules.push(rule_builder_1.RuleBuilder.value.lt(this.field, value));
30
+ return this;
31
+ }
32
+ lte(value) {
33
+ this.rules.push(rule_builder_1.RuleBuilder.value.lte(this.field, value));
34
+ return this;
35
+ }
36
+ in(array) {
37
+ this.rules.push(rule_builder_1.RuleBuilder.value.in(this.field, array));
38
+ return this;
39
+ }
40
+ isEmpty() {
41
+ this.rules.push(rule_builder_1.RuleBuilder.value.isEmpty(this.field));
42
+ return this;
43
+ }
44
+ isNotEmpty() {
45
+ this.rules.push(rule_builder_1.RuleBuilder.value.isNotEmpty(this.field));
46
+ return this;
47
+ }
48
+ isTrue() {
49
+ this.rules.push(rule_builder_1.RuleBuilder.value.isTrue(this.field));
50
+ return this;
51
+ }
52
+ isFalse() {
53
+ this.rules.push(rule_builder_1.RuleBuilder.value.isFalse(this.field));
54
+ return this;
55
+ }
56
+ startsWith(prefix) {
57
+ this.rules.push(rule_builder_1.RuleBuilder.value.startsWith(this.field, prefix));
58
+ return this;
59
+ }
60
+ contains(value) {
61
+ this.rules.push(rule_builder_1.RuleBuilder.value.contains(this.field, value));
62
+ return this;
63
+ }
64
+ endsWith(suffix) {
65
+ this.rules.push(rule_builder_1.RuleBuilder.value.endsWith(this.field, suffix));
66
+ return this;
67
+ }
68
+ dateAfter(date) {
69
+ this.rules.push(rule_builder_1.RuleBuilder.value.dateAfter(this.field, date));
70
+ return this;
71
+ }
72
+ dateBefore(date) {
73
+ this.rules.push(rule_builder_1.RuleBuilder.value.dateBefore(this.field, date));
74
+ return this;
75
+ }
76
+ lengthEquals(length) {
77
+ this.rules.push(rule_builder_1.RuleBuilder.value.lengthEquals(this.field, length));
78
+ return this;
79
+ }
80
+ truthy() {
81
+ this.rules.push(rule_builder_1.RuleBuilder.value.truthy(this.field));
82
+ return this;
83
+ }
84
+ // Metodi di chain
85
+ and(field) {
86
+ this.currentOperator = 'and';
87
+ return new RuleCondition(field).copyState(this);
88
+ }
89
+ or(field) {
90
+ this.currentOperator = 'or';
91
+ return new RuleCondition(field).copyState(this);
92
+ }
93
+ build() {
94
+ if (this.rules.length === 1) {
95
+ return this.rules[0];
96
+ }
97
+ if (this.currentOperator === 'and') {
98
+ return rule_builder_1.RuleBuilder.group.and(...this.rules);
99
+ }
100
+ else {
101
+ return rule_builder_1.RuleBuilder.group.or(...this.rules);
102
+ }
103
+ }
104
+ copyState(other) {
105
+ this.rules = [...other.rules];
106
+ this.currentOperator = other.currentOperator;
107
+ return this;
108
+ }
109
+ }
110
+ // Classe principale per iniziare la costruzione di regole
111
+ class Rule {
112
+ static when(field) {
113
+ return new RuleCondition(field);
114
+ }
115
+ }
116
+ exports.Rule = Rule;
117
+ // Builder per gruppi di regole
118
+ class RuleGroupBuilder {
119
+ constructor(operator = 'and') {
120
+ this.operator = operator;
121
+ this.rules = [];
122
+ }
123
+ static and() {
124
+ return new RuleGroupBuilder("and");
125
+ }
126
+ static or() {
127
+ return new RuleGroupBuilder("or");
128
+ }
129
+ add(rule) {
130
+ this.rules.push(rule);
131
+ return this;
132
+ }
133
+ addRule(builder) {
134
+ this.rules.push(builder(Rule));
135
+ return this;
136
+ }
137
+ addGroup(group) {
138
+ this.rules.push(group);
139
+ return this;
140
+ }
141
+ addWhen(field) {
142
+ const condition = Rule.when(field);
143
+ condition.then = (rule) => {
144
+ this.rules.push(rule);
145
+ return this;
146
+ };
147
+ return condition;
148
+ }
149
+ build() {
150
+ if (this.rules.length === 0) {
151
+ throw new Error("Cannot build empty rule group");
152
+ }
153
+ if (this.rules.length === 1) {
154
+ return this.rules[0];
155
+ }
156
+ if (this.operator === 'and') {
157
+ return rule_builder_1.RuleBuilder.group.and(...this.rules);
158
+ }
159
+ else {
160
+ return rule_builder_1.RuleBuilder.group.or(...this.rules);
161
+ }
162
+ }
163
+ }
164
+ exports.RuleGroupBuilder = RuleGroupBuilder;
165
+ // // Esempi di utilizzo:
166
+ // // Esempio 1: Regola semplice
167
+ // const simpleRule = Rule.when("age").gte(18).build();
168
+ // // Esempio 2: Regola con AND
169
+ // const andRule = Rule.when("age").gte(18).and("email").isNotEmpty().build();
170
+ // // Esempio 3: Regola con OR
171
+ // const orRule = Rule.when("email").isNotEmpty().or("phone").isNotEmpty().build();
172
+ // // Esempio 4: Gruppo di regole
173
+ // const group1 = RuleGroupBuilder.and()
174
+ // .add(Rule.when("age").gte(18).build())
175
+ // .addGroup(
176
+ // new RuleGroupBuilder("or")
177
+ // .add(Rule.when("email").isNotEmpty().build())
178
+ // .add(Rule.when("phone").isNotEmpty().build())
179
+ // .build()
180
+ // )
181
+ // .build();
182
+ // // Esempio 5: Utilizzo alternativo con addRule
183
+ // const group2 = new RuleGroupBuilder("and")
184
+ // .addRule(Rule => Rule.when("age").gte(18).build())
185
+ // .addRule(Rule => Rule.when("status").eq("active").build())
186
+ // .build();
187
+ // // Esempio 6: Regole complesse
188
+ // const complexRule = Rule.when("user.role").eq("admin")
189
+ // .or("user.permissions").contains("read")
190
+ // .and("user.status").eq("active")
191
+ // .and("user.lastLogin").dateAfter("2024-01-01")
192
+ // .build();
193
+ // console.log("Simple rule:", JSON.stringify(simpleRule, null, 2));
194
+ // console.log("AND rule:", JSON.stringify(andRule, null, 2));
195
+ // console.log("OR rule:", JSON.stringify(orRule, null, 2));
196
+ // console.log("Group 1:", JSON.stringify(group1, null, 2));
197
+ // console.log("Complex rule:", JSON.stringify(complexRule, null, 2));
198
+ //# sourceMappingURL=modern-rule-builder-engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modern-rule-builder-engine.js","sourceRoot":"","sources":["../src/modern-rule-builder-engine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { RulesLogic } from "json-logic-js";
2
+ export declare class RuleBuilder {
3
+ static group: {
4
+ and: (...args: RulesLogic[]) => RulesLogic;
5
+ or: (...args: RulesLogic[]) => RulesLogic;
6
+ not: (arg: RulesLogic) => RulesLogic;
7
+ };
8
+ static value: {
9
+ var: (key: string) => RulesLogic;
10
+ eq: (key: string, b: any) => RulesLogic;
11
+ neq: (key: string, b: any) => RulesLogic;
12
+ gt: (key: string, b: any) => RulesLogic;
13
+ gte: (key: string, b: any) => RulesLogic;
14
+ lt: (key: string, b: any) => RulesLogic;
15
+ lte: (key: string, b: any) => RulesLogic;
16
+ in: (key: string, array: any[]) => RulesLogic;
17
+ lengthEquals: (key: string, length: number) => RulesLogic;
18
+ isEmpty: (key: string) => RulesLogic;
19
+ isNotEmpty: (key: string) => RulesLogic;
20
+ isTrue: (key: string) => RulesLogic;
21
+ isFalse: (key: string) => RulesLogic;
22
+ startsWith: (key: string, prefix: string) => RulesLogic;
23
+ contains: (key: string, value: string) => RulesLogic;
24
+ endsWith: (key: string, suffix: string) => RulesLogic;
25
+ dateAfter: (key: string, date: string) => RulesLogic;
26
+ dateBefore: (key: string, date: string) => RulesLogic;
27
+ truthy: (key: string) => RulesLogic;
28
+ };
29
+ }
30
+ //# sourceMappingURL=rule-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-builder.d.ts","sourceRoot":"","sources":["../src/rule-builder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,UAAU,EAAE,MAAM,eAAe,CAAA;AASzD,qBAAa,WAAW;IACpB,MAAM,CAAC,KAAK;uBACO,UAAU,EAAE,KAAG,UAAU;sBAC1B,UAAU,EAAE,KAAG,UAAU;mBAC5B,UAAU,KAAG,UAAU;MACrC;IAED,MAAM,CAAC,KAAK;mBAEG,MAAM,KAAG,UAAU;kBAGpB,MAAM,KAAK,GAAG,KAAG,UAAU;mBAC1B,MAAM,KAAK,GAAG,KAAG,UAAU;kBAC5B,MAAM,KAAK,GAAG,KAAG,UAAU;mBAC1B,MAAM,KAAK,GAAG,KAAG,UAAU;kBAC5B,MAAM,KAAK,GAAG,KAAG,UAAU;mBAC1B,MAAM,KAAK,GAAG,KAAG,UAAU;kBAG5B,MAAM,SAAS,GAAG,EAAE,KAAG,UAAU;4BACvB,MAAM,UAAU,MAAM,KAAG,UAAU;uBAKxC,MAAM,KAAG,UAAU;0BAOhB,MAAM,KAAG,UAAU;sBAQvB,MAAM,KAAG,UAAU;uBAClB,MAAM,KAAG,UAAU;0BAGhB,MAAM,UAAU,MAAM,KAAG,UAAU;wBAGrC,MAAM,SAAS,MAAM,KAAG,UAAU;wBAGlC,MAAM,UAAU,MAAM,KAAG,UAAU;yBAQlC,MAAM,QAAQ,MAAM,KAAG,UAAU;0BAMhC,MAAM,QAAQ,MAAM,KAAG,UAAU;sBAKrC,MAAM,KAAG,UAAU;MACpC;CACJ"}
@@ -0,0 +1,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RuleBuilder = void 0;
4
+ const json_logic_js_1 = require("json-logic-js");
5
+ const startsWith = (text, prefix) => text.startsWith(prefix);
6
+ const endsWith = (text, suffix) => text.endsWith(suffix);
7
+ (0, json_logic_js_1.add_operation)("startsWith", startsWith);
8
+ (0, json_logic_js_1.add_operation)("endsWith", endsWith);
9
+ class RuleBuilder {
10
+ }
11
+ exports.RuleBuilder = RuleBuilder;
12
+ RuleBuilder.group = {
13
+ and: (...args) => ({ and: args }),
14
+ or: (...args) => ({ or: args }),
15
+ not: (arg) => ({ '!': arg }),
16
+ };
17
+ RuleBuilder.value = {
18
+ // Variabili
19
+ var: (key) => ({ var: key }),
20
+ // Condizioni base
21
+ eq: (key, b) => ({ '===': [{ var: key }, b] }),
22
+ neq: (key, b) => ({ '!==': [{ var: key }, b] }),
23
+ gt: (key, b) => ({ '>': [{ var: key }, b] }),
24
+ gte: (key, b) => ({ '>=': [{ var: key }, b] }),
25
+ lt: (key, b) => ({ '<': [{ var: key }, b] }),
26
+ lte: (key, b) => ({ '<=': [{ var: key }, b] }),
27
+ // Array
28
+ in: (key, array) => ({ in: [{ var: key }, array] }),
29
+ lengthEquals: (key, length) => ({
30
+ '===': [{ 'var': key + '.length' }, length]
31
+ }),
32
+ // Valori
33
+ isEmpty: (key) => ({
34
+ or: [
35
+ { '==': [{ var: key }, null] },
36
+ { '==': [{ var: key }, undefined] },
37
+ { '==': [{ var: key }, ''] }
38
+ ]
39
+ }),
40
+ isNotEmpty: (key) => ({
41
+ and: [
42
+ { '!==': [{ var: key }, null] },
43
+ { '!==': [{ var: key }, undefined] },
44
+ { '!==': [{ var: key }, ''] }
45
+ ]
46
+ }),
47
+ isTrue: (key) => ({ '===': [{ var: key }, true] }),
48
+ isFalse: (key) => ({ '===': [{ var: key }, false] }),
49
+ // Stringhe
50
+ startsWith: (key, prefix) => ({
51
+ 'startsWith': [{ var: key }, prefix]
52
+ }),
53
+ contains: (key, value) => ({
54
+ in: [value, { var: key }]
55
+ }),
56
+ endsWith: (key, suffix) => ({
57
+ 'endsWith': [{ var: key }, suffix]
58
+ }),
59
+ // Date (richiede valori ISO o timestamp)
60
+ /// <param @date>
61
+ /// ISO / timestamp format
62
+ /// </param>
63
+ dateAfter: (key, date) => ({
64
+ '>': [{ var: key }, date]
65
+ }),
66
+ /// <param @date>
67
+ /// ISO / timestamp format
68
+ /// </param>
69
+ dateBefore: (key, date) => ({
70
+ '<': [{ var: key }, date]
71
+ }),
72
+ // Alias
73
+ truthy: (key) => ({ var: key }),
74
+ };
75
+ //# sourceMappingURL=rule-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-builder.js","sourceRoot":"","sources":["../src/rule-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { FieldControlState, FieldDefinition, FormControlState } from './models/field-definition';
2
+ import { DependencyGraph } from './dependency-graph';
3
+ import { RulesLogic } from 'json-logic-js';
4
+ export declare class RuleEvaluator {
5
+ static evaluate(rule: RulesLogic | undefined, data: Record<string, any>): boolean;
6
+ static evaluateField: (field: FieldDefinition, formData: Record<string, any>) => FieldControlState;
7
+ static evaluateFields(fields: FieldDefinition[], formData: Record<string, any>): FormControlState;
8
+ static evaluateDependentsFields(sourceFieldId: string, otherFields: FieldDefinition[], formData: Record<string, any>, dependencyGraph: DependencyGraph): FormControlState;
9
+ static extractVarsFromRule(rule: RulesLogic): string[];
10
+ }
11
+ //# sourceMappingURL=rule-evaluator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-evaluator.d.ts","sourceRoot":"","sources":["../src/rule-evaluator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACjG,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAkB,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAGtD,qBAAa,aAAa;IAExB,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO;IAYjF,MAAM,CAAC,aAAa,GAClB,OAAO,eAAe,EACtB,UAAU,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAC5B,iBAAiB,CAoBnB;IAED,MAAM,CAAC,cAAc,CACnB,MAAM,EAAE,eAAe,EAAE,EACzB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC5B,gBAAgB;IAQnB,MAAM,CAAC,wBAAwB,CAC7B,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,eAAe,EAAE,EAC9B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC7B,eAAe,EAAE,eAAe,GAC/B,gBAAgB;IAMnB,MAAM,CAAC,mBAAmB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,EAAE;CA+BvD"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ var _a;
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.RuleEvaluator = void 0;
8
+ const json_logic_js_1 = __importDefault(require("json-logic-js"));
9
+ const rule_mapper_1 = require("./utility/rule-mapper");
10
+ class RuleEvaluator {
11
+ static evaluate(rule, data) {
12
+ if (!rule)
13
+ return true; // Se la regola è indefinita, ritorna true (o false, a seconda della logica desiderata)
14
+ try {
15
+ // Valida la regola con jsonLogic, se non è valida, restituirà undefined
16
+ const result = json_logic_js_1.default.apply(rule, data);
17
+ return result !== undefined ? !!result : false;
18
+ }
19
+ catch (err) {
20
+ console.warn('Rule evaluation error:', err);
21
+ return false; // Restituisce false in caso di errore nell'applicazione della regola
22
+ }
23
+ }
24
+ static evaluateFields(fields, formData) {
25
+ const evaluated = {};
26
+ fields.forEach((field) => {
27
+ evaluated[field.id] = this.evaluateField(field, formData);
28
+ });
29
+ return evaluated;
30
+ }
31
+ static evaluateDependentsFields(sourceFieldId, otherFields, formData, dependencyGraph) {
32
+ const affectedFieldIds = dependencyGraph.getDependentFields(sourceFieldId);
33
+ return this.evaluateFields(otherFields.filter(field => affectedFieldIds.has(field.id)), formData);
34
+ }
35
+ static extractVarsFromRule(rule) {
36
+ const vars = [];
37
+ // Funzione ricorsiva che attraversa la regola JSON
38
+ const walk = (r) => {
39
+ if (typeof r !== 'object' || r === null)
40
+ return;
41
+ if (Array.isArray(r)) {
42
+ // Se è un array, esplora ogni elemento
43
+ r.forEach(walk);
44
+ }
45
+ else {
46
+ for (const key in r) {
47
+ if (key === 'var') {
48
+ // Se trova una variabile 'var', la aggiunge all'elenco
49
+ if (typeof r[key] === 'string') {
50
+ vars.push(r[key]);
51
+ }
52
+ else if (Array.isArray(r[key]) && typeof r[key][0] === 'string') {
53
+ vars.push(r[key][0]);
54
+ }
55
+ }
56
+ else {
57
+ // Se la chiave non è 'var', continua a esplorare il valore
58
+ walk(r[key]);
59
+ }
60
+ }
61
+ }
62
+ };
63
+ // Iniziamo l'esplorazione dalla regola
64
+ walk(rule);
65
+ return vars;
66
+ }
67
+ }
68
+ exports.RuleEvaluator = RuleEvaluator;
69
+ _a = RuleEvaluator;
70
+ RuleEvaluator.evaluateField = (field, formData) => {
71
+ const visible = field.visibleIf
72
+ ? _a.evaluate(rule_mapper_1.RuleMapper.mapGroupToEngine(field.visibleIf), formData)
73
+ : true;
74
+ const required = field.requiredIf
75
+ ? _a.evaluate(rule_mapper_1.RuleMapper.mapGroupToEngine(field.requiredIf), formData)
76
+ : false;
77
+ const disabled = field.disabledIf
78
+ ? _a.evaluate(rule_mapper_1.RuleMapper.mapGroupToEngine(field.disabledIf), formData)
79
+ : false;
80
+ const readonly = field.readonlyIf
81
+ ? _a.evaluate(rule_mapper_1.RuleMapper.mapGroupToEngine(field.readonlyIf), formData)
82
+ : false;
83
+ return {
84
+ visible,
85
+ disabled,
86
+ readonly,
87
+ required
88
+ };
89
+ };
90
+ //# sourceMappingURL=rule-evaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-evaluator.js","sourceRoot":"","sources":["../src/rule-evaluator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { FieldDefinition, ConditionalFieldProperty } from "@/models/field-definition";
2
+ export declare class FieldHelper {
3
+ static getAvailableRuleTypes(field: FieldDefinition): ConditionalFieldProperty[];
4
+ }
5
+ //# sourceMappingURL=field-helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-helper.d.ts","sourceRoot":"","sources":["../../src/utility/field-helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,2BAA2B,CAAC;AAEtF,qBAAa,WAAW;IACpB,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,eAAe,GAAG,wBAAwB,EAAE;CAInF"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FieldHelper = void 0;
4
+ class FieldHelper {
5
+ static getAvailableRuleTypes(field) {
6
+ var types = ["visibleIf", "disabledIf", "requiredIf", "readonlyIf"];
7
+ return types.filter(k => field[k] == undefined);
8
+ }
9
+ }
10
+ exports.FieldHelper = FieldHelper;
11
+ //# sourceMappingURL=field-helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-helper.js","sourceRoot":"","sources":["../../src/utility/field-helper.ts"],"names":[],"mappings":";;;AAEA,MAAa,WAAW;IACpB,MAAM,CAAC,qBAAqB,CAAC,KAAsB;QAC/C,IAAI,KAAK,GAA+B,CAAC,WAAW,EAAE,YAAY,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;QAChG,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC;IACpD,CAAC;CACJ;AALD,kCAKC"}
@@ -0,0 +1,10 @@
1
+ import { FieldRuleGroupDefinition, FieldRuleNode } from "../models/group";
2
+ import { FieldRuleDefinition } from "../models/rule";
3
+ export declare class RuleHelper {
4
+ static isGroup(rule: FieldRuleNode): rule is FieldRuleGroupDefinition;
5
+ static getGroups(group: FieldRuleGroupDefinition): FieldRuleGroupDefinition[];
6
+ static getRules(group: FieldRuleGroupDefinition): FieldRuleDefinition[];
7
+ static findGroup(groupId: string, group: FieldRuleGroupDefinition): FieldRuleGroupDefinition | undefined;
8
+ static findRule(ruleId: string, group: FieldRuleGroupDefinition): FieldRuleDefinition | undefined;
9
+ }
10
+ //# sourceMappingURL=rule-helper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rule-helper.d.ts","sourceRoot":"","sources":["../../src/utility/rule-helper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAErD,qBAAa,UAAU;IAEnB,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,IAAI,wBAAwB;IAIrE,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,wBAAwB,GAAG,wBAAwB,EAAE;IAI7E,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,wBAAwB,GAAG,mBAAmB,EAAE;IAIvE,MAAM,CAAC,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,wBAAwB,GAAG,wBAAwB,GAAG,SAAS;IAaxG,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,wBAAwB,GAAG,mBAAmB,GAAG,SAAS;CAgBpG"}
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RuleHelper = void 0;
4
+ class RuleHelper {
5
+ // Funzione privata per verificare se l'elemento è un gruppo
6
+ static isGroup(rule) {
7
+ return rule.rules !== undefined;
8
+ }
9
+ static getGroups(group) {
10
+ return group.rules.filter(r => this.isGroup(r));
11
+ }
12
+ static getRules(group) {
13
+ return group.rules.filter(r => !this.isGroup(r));
14
+ }
15
+ static findGroup(groupId, group) {
16
+ if (group.groupId === groupId)
17
+ return group;
18
+ for (const rule of group.rules) {
19
+ if (this.isGroup(rule)) {
20
+ const found = this.findGroup(groupId, rule);
21
+ if (found)
22
+ return found;
23
+ }
24
+ }
25
+ return undefined;
26
+ }
27
+ ;
28
+ static findRule(ruleId, group) {
29
+ // Verifica se qualche regola di questo gruppo ha l'ID richiesto
30
+ for (const rule of group.rules) {
31
+ if (!this.isGroup(rule) && rule.ruleId === ruleId) {
32
+ return rule;
33
+ }
34
+ // Se è un gruppo, eseguiamo la ricerca ricorsiva nelle sue regole
35
+ if (this.isGroup(rule)) {
36
+ const found = this.findRule(ruleId, rule);
37
+ if (found)
38
+ return found;
39
+ }
40
+ }
41
+ return undefined;
42
+ }
43
+ }
44
+ exports.RuleHelper = RuleHelper;
45
+ //# sourceMappingURL=rule-helper.js.map