@defra/forms-model 3.0.253 → 3.0.255

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 (60) hide show
  1. package/dist/module/components/helpers.js +4 -1
  2. package/dist/module/components/helpers.js.map +1 -1
  3. package/dist/module/components/index.js +1 -1
  4. package/dist/module/components/index.js.map +1 -1
  5. package/dist/module/conditions/condition-field.js +6 -0
  6. package/dist/module/conditions/condition-field.js.map +1 -1
  7. package/dist/module/conditions/condition-group.js +15 -1
  8. package/dist/module/conditions/condition-group.js.map +1 -1
  9. package/dist/module/conditions/condition-model.js +9 -11
  10. package/dist/module/conditions/condition-model.js.map +1 -1
  11. package/dist/module/conditions/condition-operators.js +11 -8
  12. package/dist/module/conditions/condition-operators.js.map +1 -1
  13. package/dist/module/conditions/condition-ref.js +7 -1
  14. package/dist/module/conditions/condition-ref.js.map +1 -1
  15. package/dist/module/conditions/condition-values.js +16 -7
  16. package/dist/module/conditions/condition-values.js.map +1 -1
  17. package/dist/module/conditions/condition.js +8 -1
  18. package/dist/module/conditions/condition.js.map +1 -1
  19. package/dist/module/conditions/helpers.js +15 -0
  20. package/dist/module/conditions/helpers.js.map +1 -1
  21. package/dist/module/conditions/index.js +2 -2
  22. package/dist/module/conditions/index.js.map +1 -1
  23. package/dist/module/conditions/types.js.map +1 -1
  24. package/dist/types/components/helpers.d.ts +1 -0
  25. package/dist/types/components/helpers.d.ts.map +1 -1
  26. package/dist/types/components/index.d.ts +1 -1
  27. package/dist/types/components/index.d.ts.map +1 -1
  28. package/dist/types/conditions/condition-field.d.ts +2 -0
  29. package/dist/types/conditions/condition-field.d.ts.map +1 -1
  30. package/dist/types/conditions/condition-group.d.ts +3 -0
  31. package/dist/types/conditions/condition-group.d.ts.map +1 -1
  32. package/dist/types/conditions/condition-model.d.ts +8 -4
  33. package/dist/types/conditions/condition-model.d.ts.map +1 -1
  34. package/dist/types/conditions/condition-operators.d.ts +15 -15
  35. package/dist/types/conditions/condition-operators.d.ts.map +1 -1
  36. package/dist/types/conditions/condition-ref.d.ts +3 -0
  37. package/dist/types/conditions/condition-ref.d.ts.map +1 -1
  38. package/dist/types/conditions/condition-values.d.ts +4 -2
  39. package/dist/types/conditions/condition-values.d.ts.map +1 -1
  40. package/dist/types/conditions/condition.d.ts +3 -0
  41. package/dist/types/conditions/condition.d.ts.map +1 -1
  42. package/dist/types/conditions/helpers.d.ts +7 -0
  43. package/dist/types/conditions/helpers.d.ts.map +1 -1
  44. package/dist/types/conditions/index.d.ts +2 -2
  45. package/dist/types/conditions/index.d.ts.map +1 -1
  46. package/dist/types/conditions/types.d.ts +2 -2
  47. package/dist/types/conditions/types.d.ts.map +1 -1
  48. package/package.json +1 -1
  49. package/src/components/helpers.ts +7 -1
  50. package/src/components/index.ts +3 -1
  51. package/src/conditions/condition-field.ts +8 -0
  52. package/src/conditions/condition-group.ts +19 -1
  53. package/src/conditions/condition-model.ts +17 -27
  54. package/src/conditions/condition-operators.ts +14 -11
  55. package/src/conditions/condition-ref.ts +12 -3
  56. package/src/conditions/condition-values.ts +21 -9
  57. package/src/conditions/condition.ts +14 -4
  58. package/src/conditions/helpers.ts +35 -0
  59. package/src/conditions/index.ts +9 -2
  60. package/src/conditions/types.ts +2 -5
@@ -6,7 +6,9 @@ import {
6
6
  ConditionValue,
7
7
  RelativeDateValue
8
8
  } from '~/src/conditions/condition-values.js'
9
+ import { type Condition } from '~/src/conditions/condition.js'
9
10
  import {
11
+ ConditionType,
10
12
  DateDirections,
11
13
  Operator,
12
14
  OperatorName
@@ -21,8 +23,8 @@ const defaultOperators = {
21
23
  [OperatorName.IsNot]: inline(Operator.IsNot)
22
24
  }
23
25
 
24
- function withDefaults<T>(param: T) {
25
- return Object.assign({}, param, defaultOperators)
26
+ function withDefaults<T>(operators: T) {
27
+ return { ...defaultOperators, ...operators }
26
28
  }
27
29
 
28
30
  const textFieldOperators = {
@@ -80,14 +82,14 @@ export function getOperatorNames(fieldType?: ComponentType) {
80
82
  return []
81
83
  }
82
84
 
83
- return Object.keys(conditionals).sort()
85
+ return Object.keys(conditionals) as OperatorName[]
84
86
  }
85
87
 
86
88
  export function getExpression(
87
89
  fieldType: ComponentType,
88
90
  fieldName: string,
89
91
  operator: OperatorName,
90
- value: ConditionValue | RelativeDateValue
92
+ value: Condition['value']
91
93
  ) {
92
94
  const conditionals = getConditionals(fieldType)
93
95
  if (!conditionals) {
@@ -153,14 +155,15 @@ function not(operatorDefinition: OperatorDefinition): OperatorDefinition {
153
155
 
154
156
  function formatValue(
155
157
  field: Pick<ComponentDef, 'type'>,
156
- value: ConditionValue | RelativeDateValue
158
+ value: Condition['value']
157
159
  ) {
158
160
  if (
159
- 'value' in value &&
160
- (field.type === ComponentType.YesNoField ||
161
- field.type === ComponentType.NumberField)
161
+ (field.type === ComponentType.DatePartsField &&
162
+ value.type === ConditionType.RelativeDate) ||
163
+ field.type === ComponentType.NumberField ||
164
+ field.type === ComponentType.YesNoField
162
165
  ) {
163
- return value.value
166
+ return value.toExpression()
164
167
  }
165
168
 
166
169
  return `'${value.toExpression()}'`
@@ -183,7 +186,7 @@ function absoluteDate(operator: Operator): OperatorDefinition {
183
186
  )
184
187
  }
185
188
 
186
- return `${field.name} ${operator} '${formatValue(field, value)}'`
189
+ return `${field.name} ${operator} ${formatValue(field, value)}`
187
190
  }
188
191
  }
189
192
  }
@@ -201,7 +204,7 @@ function relativeDate(
201
204
  }
202
205
 
203
206
  const isPast = value.direction === DateDirections.PAST
204
- return `${field.name} ${isPast ? pastOperator : futureOperator} ${value.toExpression()}`
207
+ return `${field.name} ${isPast ? pastOperator : futureOperator} ${formatValue(field, value)}`
205
208
  }
206
209
  }
207
210
  }
@@ -1,5 +1,6 @@
1
1
  import { ConditionAbstract } from '~/src/conditions/condition-abstract.js'
2
2
  import { type Coordinator } from '~/src/conditions/enums.js'
3
+ import { type ConditionRefData } from '~/src/conditions/types.js'
3
4
 
4
5
  export class ConditionRef extends ConditionAbstract {
5
6
  conditionName: string
@@ -40,10 +41,18 @@ export class ConditionRef extends ConditionAbstract {
40
41
  }
41
42
 
42
43
  clone() {
44
+ return ConditionRef.from(this)
45
+ }
46
+
47
+ toJSON(): ConditionRefData {
48
+ return structuredClone(this.clone())
49
+ }
50
+
51
+ static from(obj: ConditionRefData | ConditionRef) {
43
52
  return new ConditionRef(
44
- this.conditionName,
45
- this.conditionDisplayName,
46
- this.coordinator
53
+ obj.conditionName,
54
+ obj.conditionDisplayName,
55
+ obj.coordinator
47
56
  )
48
57
  }
49
58
  }
@@ -12,7 +12,7 @@ export class ConditionValue extends ConditionValueAbstract {
12
12
  display: string
13
13
 
14
14
  constructor(value: string, display?: string) {
15
- if (!value || typeof value !== 'string') {
15
+ if (typeof value !== 'string') {
16
16
  throw new Error("ConditionValue param 'value' must be a string")
17
17
  }
18
18
 
@@ -35,13 +35,17 @@ export class ConditionValue extends ConditionValueAbstract {
35
35
  return this.value
36
36
  }
37
37
 
38
- static from(obj: ConditionValue | ConditionValueData) {
39
- return new ConditionValue(obj.value, obj.display)
40
- }
41
-
42
38
  clone() {
43
39
  return ConditionValue.from(this)
44
40
  }
41
+
42
+ toJSON(): ConditionValueData {
43
+ return structuredClone(this.clone())
44
+ }
45
+
46
+ static from(obj: ConditionValue | ConditionValueData) {
47
+ return new ConditionValue(obj.value, obj.display)
48
+ }
45
49
  }
46
50
 
47
51
  export class RelativeDateValue extends ConditionValueAbstract {
@@ -82,13 +86,17 @@ export class RelativeDateValue extends ConditionValueAbstract {
82
86
  return `dateForComparison(${period}, '${this.unit}')`
83
87
  }
84
88
 
85
- static from(obj: RelativeDateValue | RelativeDateValueData) {
86
- return new RelativeDateValue(obj.period, obj.unit, obj.direction)
87
- }
88
-
89
89
  clone() {
90
90
  return RelativeDateValue.from(this)
91
91
  }
92
+
93
+ toJSON(): RelativeDateValueData {
94
+ return structuredClone(this.clone())
95
+ }
96
+
97
+ static from(obj: RelativeDateValue | RelativeDateValueData) {
98
+ return new RelativeDateValue(obj.period, obj.unit, obj.direction)
99
+ }
92
100
  }
93
101
 
94
102
  export function conditionValueFrom(
@@ -98,6 +106,10 @@ export function conditionValueFrom(
98
106
  | RelativeDateValue
99
107
  | RelativeDateValueData
100
108
  ) {
109
+ if ('clone' in obj) {
110
+ return obj.clone()
111
+ }
112
+
101
113
  switch (obj.type) {
102
114
  case ConditionType.Value:
103
115
  return ConditionValue.from(obj)
@@ -3,10 +3,12 @@ import { ConditionField } from '~/src/conditions/condition-field.js'
3
3
  import { getExpression } from '~/src/conditions/condition-operators.js'
4
4
  import { ConditionValueAbstract } from '~/src/conditions/condition-value-abstract.js'
5
5
  import {
6
+ conditionValueFrom,
6
7
  type ConditionValue,
7
8
  type RelativeDateValue
8
9
  } from '~/src/conditions/condition-values.js'
9
10
  import { type Coordinator, type OperatorName } from '~/src/conditions/enums.js'
11
+ import { type ConditionData } from '~/src/conditions/types.js'
10
12
 
11
13
  export class Condition extends ConditionAbstract {
12
14
  field: ConditionField
@@ -59,11 +61,19 @@ export class Condition extends ConditionAbstract {
59
61
  }
60
62
 
61
63
  clone() {
64
+ return Condition.from(this)
65
+ }
66
+
67
+ toJSON(): ConditionData {
68
+ return structuredClone(this.clone())
69
+ }
70
+
71
+ static from(obj: ConditionData | Condition) {
62
72
  return new Condition(
63
- ConditionField.from(this.field),
64
- this.operator,
65
- this.value.clone(),
66
- this.coordinator
73
+ ConditionField.from(obj.field),
74
+ obj.operator,
75
+ conditionValueFrom(obj.value),
76
+ obj.coordinator
67
77
  )
68
78
  }
69
79
  }
@@ -1,6 +1,12 @@
1
1
  import { type ConditionGroup } from '~/src/conditions/condition-group.js'
2
2
  import { type ConditionRef } from '~/src/conditions/condition-ref.js'
3
3
  import { type Condition } from '~/src/conditions/condition.js'
4
+ import {
5
+ type ConditionData,
6
+ type ConditionGroupData,
7
+ type ConditionRefData
8
+ } from '~/src/conditions/types.js'
9
+ import { type ConditionWrapper } from '~/src/form/form-definition/types.js'
4
10
 
5
11
  export function toPresentationString(
6
12
  condition: Condition | ConditionRef | ConditionGroup
@@ -13,3 +19,32 @@ export function toExpression(
13
19
  ) {
14
20
  return `${condition.coordinatorString()}${condition.conditionExpression()}`
15
21
  }
22
+
23
+ export const hasConditionField = (
24
+ condition?: ConditionGroupData | ConditionData | ConditionRefData
25
+ ): condition is ConditionData => {
26
+ return !!condition && 'field' in condition
27
+ }
28
+
29
+ export const hasConditionGroup = (
30
+ condition?: ConditionGroupData | ConditionData | ConditionRefData
31
+ ): condition is ConditionGroupData => {
32
+ return !!condition && 'conditions' in condition
33
+ }
34
+
35
+ export const hasConditionName = (
36
+ condition?: ConditionGroupData | ConditionData | ConditionRefData
37
+ ): condition is ConditionRefData => {
38
+ return !!condition && 'conditionName' in condition
39
+ }
40
+
41
+ export const hasNestedCondition = (condition?: ConditionWrapper) => {
42
+ return !!condition?.value.conditions.some(hasConditionName)
43
+ }
44
+
45
+ export const isDuplicateCondition = (
46
+ conditions: ConditionWrapper[],
47
+ conditionName: string
48
+ ) => {
49
+ return conditions.some((condition) => condition.name === conditionName)
50
+ }
@@ -1,6 +1,5 @@
1
1
  export {
2
2
  getExpression,
3
- getOperatorConfig,
4
3
  getOperatorNames,
5
4
  absoluteDateOperatorNames,
6
5
  relativeDateOperatorNames
@@ -18,7 +17,15 @@ export { ConditionRef } from '~/src/conditions/condition-ref.js'
18
17
  export { ConditionGroup } from '~/src/conditions/condition-group.js'
19
18
  export { ConditionsModel } from '~/src/conditions/condition-model.js'
20
19
  export { ConditionGroupDef } from '~/src/conditions/condition-group-def.js'
21
- export { toExpression, toPresentationString } from '~/src/conditions/helpers.js'
20
+ export {
21
+ hasConditionField,
22
+ hasConditionGroup,
23
+ hasConditionName,
24
+ hasNestedCondition,
25
+ isDuplicateCondition,
26
+ toExpression,
27
+ toPresentationString
28
+ } from '~/src/conditions/helpers.js'
22
29
 
23
30
  export {
24
31
  ConditionType,
@@ -2,10 +2,7 @@ import {
2
2
  type ComponentDef,
3
3
  type ConditionalComponentType
4
4
  } from '~/src/components/types.js'
5
- import {
6
- type ConditionValue,
7
- type RelativeDateValue
8
- } from '~/src/conditions/condition-values.js'
5
+ import { type Condition } from '~/src/conditions/condition.js'
9
6
  import {
10
7
  type ConditionType,
11
8
  type Coordinator,
@@ -57,7 +54,7 @@ export interface ConditionsModelData extends ConditionGroupData {
57
54
  export interface OperatorDefinition {
58
55
  expression: (
59
56
  component: Pick<ComponentDef, 'type' | 'name'>,
60
- conditionValue: ConditionValue | RelativeDateValue
57
+ conditionValue: Condition['value']
61
58
  ) => string
62
59
  }
63
60