@coveo/thermidor-schema 1.0.0-beta.2 → 1.0.0-beta.3

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 (31) hide show
  1. package/dist/generated/schemas.d.ts +282 -207
  2. package/dist/generated/schemas.js +168 -62
  3. package/dist/index.d.ts +2 -2
  4. package/dist/index.js +1 -1
  5. package/package.json +1 -1
  6. package/schema/base/component.schema.json +14 -1
  7. package/schema/components/bundle-display.schema.json +13 -4
  8. package/schema/components/category-facet.schema.json +17 -22
  9. package/schema/components/commerce-search.schema.json +45 -0
  10. package/schema/components/comparison-table.schema.json +25 -9
  11. package/schema/components/component-contracts.schema.json +15 -6
  12. package/schema/components/date-facet.schema.json +17 -24
  13. package/schema/components/facet-manager.schema.json +15 -15
  14. package/schema/components/layout-stack.schema.json +47 -0
  15. package/schema/components/next-actions-bar.schema.json +16 -15
  16. package/schema/components/numeric-facet.schema.json +17 -24
  17. package/schema/components/page-size.schema.json +81 -0
  18. package/schema/components/pagination.schema.json +16 -17
  19. package/schema/components/product-carousel.schema.json +13 -5
  20. package/schema/components/product-list.schema.json +13 -4
  21. package/schema/components/product-summary.schema.json +63 -0
  22. package/schema/components/query-summary.schema.json +67 -0
  23. package/schema/components/regular-facet.schema.json +20 -30
  24. package/schema/components/sort.schema.json +16 -16
  25. package/schema/definitions/bundle-tier.schema.json +3 -3
  26. package/schema/definitions/child-ref.schema.json +8 -0
  27. package/schema/definitions/comparison-attribute.schema.json +2 -2
  28. package/schema/definitions/comparison-product.schema.json +2 -2
  29. package/schema/components/cart.schema.json +0 -108
  30. package/schema/components/search-box.schema.json +0 -74
  31. package/schema/definitions/cart-item.schema.json +0 -29
@@ -2,7 +2,7 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://schema.thermidor.coveo.com/components/comparison-table.schema.json",
4
4
  "title": "ComparisonTable",
5
- "description": "Renders a tabular product comparison with attribute columns. Read-only: the product set and attributes are owned by the backend.",
5
+ "description": "Renders a tabular product comparison. A leaf component that owns its framing (heading and AI summary), the compared products, and the ordered attribute descriptors defining the comparison rows. Read-only: the product set, attributes, and framing are owned by the backend.",
6
6
  "allOf": [
7
7
  {
8
8
  "$ref": "https://schema.thermidor.coveo.com/base/component.schema.json"
@@ -20,29 +20,45 @@
20
20
  "type": "object",
21
21
  "properties": {},
22
22
  "additionalProperties": false
23
+ },
24
+ "children": {
25
+ "type": "array",
26
+ "items": {
27
+ "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
28
+ },
29
+ "maxItems": 1000,
30
+ "default": []
31
+ },
32
+ "child": {
33
+ "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
23
34
  }
24
35
  },
25
36
  "additionalProperties": false,
26
37
  "$defs": {
27
38
  "ComparisonTableState": {
28
39
  "title": "ComparisonTableState",
29
- "description": "The comparison data to render. Contains a list of products with their attribute values and the attribute descriptors defining the columns.",
40
+ "description": "The comparison content owned by the backend: the table heading, the AI summary text, the compared products, and the ordered attribute descriptors defining the comparison rows.",
30
41
  "type": "object",
31
- "required": [
32
- "products",
33
- "attributes"
34
- ],
42
+ "required": ["products", "attributes", "heading", "summary"],
35
43
  "properties": {
44
+ "heading": {
45
+ "type": "string",
46
+ "description": "Title displayed above the comparison table."
47
+ },
48
+ "summary": {
49
+ "type": "string",
50
+ "description": "AI-generated summary text displayed below the comparison table."
51
+ },
36
52
  "products": {
37
53
  "type": "array",
38
- "description": "Products to compare, each with attribute values keyed by attribute key.",
54
+ "description": "The compared products shown as columns of the comparison table.",
39
55
  "items": {
40
56
  "$ref": "https://schema.thermidor.coveo.com/definitions/comparison-product.schema.json"
41
57
  }
42
58
  },
43
59
  "attributes": {
44
60
  "type": "array",
45
- "description": "Attribute descriptors defining the comparison columns.",
61
+ "description": "Attribute descriptors defining the comparison rows.",
46
62
  "items": {
47
63
  "$ref": "https://schema.thermidor.coveo.com/definitions/comparison-attribute.schema.json"
48
64
  }
@@ -51,4 +67,4 @@
51
67
  "additionalProperties": false
52
68
  }
53
69
  }
54
- }
70
+ }
@@ -10,9 +10,6 @@
10
10
  {
11
11
  "$ref": "https://schema.thermidor.coveo.com/components/product-carousel.schema.json"
12
12
  },
13
- {
14
- "$ref": "https://schema.thermidor.coveo.com/components/cart.schema.json"
15
- },
16
13
  {
17
14
  "$ref": "https://schema.thermidor.coveo.com/components/next-actions-bar.schema.json"
18
15
  },
@@ -26,13 +23,13 @@
26
23
  "$ref": "https://schema.thermidor.coveo.com/components/product-list.schema.json"
27
24
  },
28
25
  {
29
- "$ref": "https://schema.thermidor.coveo.com/components/pagination.schema.json"
26
+ "$ref": "https://schema.thermidor.coveo.com/components/product-summary.schema.json"
30
27
  },
31
28
  {
32
- "$ref": "https://schema.thermidor.coveo.com/components/sort.schema.json"
29
+ "$ref": "https://schema.thermidor.coveo.com/components/pagination.schema.json"
33
30
  },
34
31
  {
35
- "$ref": "https://schema.thermidor.coveo.com/components/search-box.schema.json"
32
+ "$ref": "https://schema.thermidor.coveo.com/components/sort.schema.json"
36
33
  },
37
34
  {
38
35
  "$ref": "https://schema.thermidor.coveo.com/components/regular-facet.schema.json"
@@ -48,6 +45,18 @@
48
45
  },
49
46
  {
50
47
  "$ref": "https://schema.thermidor.coveo.com/components/facet-manager.schema.json"
48
+ },
49
+ {
50
+ "$ref": "https://schema.thermidor.coveo.com/components/commerce-search.schema.json"
51
+ },
52
+ {
53
+ "$ref": "https://schema.thermidor.coveo.com/components/layout-stack.schema.json"
54
+ },
55
+ {
56
+ "$ref": "https://schema.thermidor.coveo.com/components/query-summary.schema.json"
57
+ },
58
+ {
59
+ "$ref": "https://schema.thermidor.coveo.com/components/page-size.schema.json"
51
60
  }
52
61
  ]
53
62
  }
@@ -47,6 +47,17 @@
47
47
  }
48
48
  },
49
49
  "additionalProperties": false
50
+ },
51
+ "children": {
52
+ "type": "array",
53
+ "items": {
54
+ "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
55
+ },
56
+ "maxItems": 1000,
57
+ "default": []
58
+ },
59
+ "child": {
60
+ "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
50
61
  }
51
62
  },
52
63
  "additionalProperties": false,
@@ -110,12 +121,7 @@
110
121
  "title": "DateFacetValue",
111
122
  "description": "A single selectable date range within a date facet.",
112
123
  "type": "object",
113
- "required": [
114
- "start",
115
- "end",
116
- "numberOfResults",
117
- "state"
118
- ],
124
+ "required": ["start", "end", "numberOfResults", "state"],
119
125
  "properties": {
120
126
  "start": {
121
127
  "type": "string",
@@ -141,11 +147,7 @@
141
147
  "title": "DateFacetCustomRange",
142
148
  "description": "A custom date range applied by the user, with its result count.",
143
149
  "type": "object",
144
- "required": [
145
- "start",
146
- "end",
147
- "numberOfResults"
148
- ],
150
+ "required": ["start", "end", "numberOfResults"],
149
151
  "properties": {
150
152
  "start": {
151
153
  "type": "string",
@@ -174,10 +176,7 @@
174
176
  "properties": {
175
177
  "payload": {
176
178
  "type": "object",
177
- "required": [
178
- "start",
179
- "end"
180
- ],
179
+ "required": ["start", "end"],
181
180
  "properties": {
182
181
  "start": {
183
182
  "type": "string",
@@ -203,10 +202,7 @@
203
202
  "properties": {
204
203
  "payload": {
205
204
  "type": "object",
206
- "required": [
207
- "start",
208
- "end"
209
- ],
205
+ "required": ["start", "end"],
210
206
  "properties": {
211
207
  "start": {
212
208
  "type": "string",
@@ -241,10 +237,7 @@
241
237
  "properties": {
242
238
  "payload": {
243
239
  "type": "object",
244
- "required": [
245
- "start",
246
- "end"
247
- ],
240
+ "required": ["start", "end"],
248
241
  "properties": {
249
242
  "start": {
250
243
  "type": "string",
@@ -278,4 +271,4 @@
278
271
  ]
279
272
  }
280
273
  }
281
- }
274
+ }
@@ -20,28 +20,28 @@
20
20
  "type": "object",
21
21
  "properties": {},
22
22
  "additionalProperties": false
23
+ },
24
+ "children": {
25
+ "type": "array",
26
+ "items": {
27
+ "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
28
+ },
29
+ "maxItems": 1000,
30
+ "default": []
31
+ },
32
+ "child": {
33
+ "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
23
34
  }
24
35
  },
25
36
  "additionalProperties": false,
26
37
  "$defs": {
27
38
  "FacetManagerState": {
28
39
  "title": "FacetManagerState",
29
- "description": "The facet manager state. Holds the ordered list of facet component identifiers. Owned exclusively by the backend.",
40
+ "description": "The facet manager state. Facet ordering is expressed via the facet-manager A2-UI component node's 'children'; this state carries no facet-ordering data.",
30
41
  "type": "object",
31
- "required": [
32
- "facetIds"
33
- ],
34
- "properties": {
35
- "facetIds": {
36
- "type": "array",
37
- "description": "Ordered facet component identifiers. Position (indexed from 0) determines the facet's rendering rank. Each identifier is expected to match the 'componentId' of a facet component registered in the catalog; referential integrity is enforced outside JSON Schema.",
38
- "items": {
39
- "type": "string",
40
- "pattern": "^[a-z][a-z0-9-]*$"
41
- }
42
- }
43
- },
42
+ "required": [],
43
+ "properties": {},
44
44
  "additionalProperties": false
45
45
  }
46
46
  }
47
- }
47
+ }
@@ -0,0 +1,47 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schema.thermidor.coveo.com/components/layout-stack.schema.json",
4
+ "title": "LayoutStack",
5
+ "description": "Generic layout container that stacks its children along a single axis. It carries no business data: its AG-UI state is empty. Layout is a presentation concern and travels as an A2-UI node prop ('direction': 'column' | 'row'), never as AG-UI state. Reused across surfaces (commerce search, knowledge search) to compose columns and rows from the A2-UI composition plane rather than hardcoding layout per parent renderer.",
6
+ "allOf": [
7
+ {
8
+ "$ref": "https://schema.thermidor.coveo.com/base/component.schema.json"
9
+ }
10
+ ],
11
+ "properties": {
12
+ "componentType": {
13
+ "type": "string",
14
+ "const": "layout-stack"
15
+ },
16
+ "state": {
17
+ "$ref": "#/$defs/LayoutStackState"
18
+ },
19
+ "actions": {
20
+ "type": "object",
21
+ "properties": {},
22
+ "additionalProperties": false
23
+ },
24
+ "children": {
25
+ "type": "array",
26
+ "items": {
27
+ "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
28
+ },
29
+ "maxItems": 1000,
30
+ "default": []
31
+ },
32
+ "child": {
33
+ "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
34
+ }
35
+ },
36
+ "additionalProperties": false,
37
+ "$defs": {
38
+ "LayoutStackState": {
39
+ "title": "LayoutStackState",
40
+ "description": "The layout-stack state. A layout container holds no business data, so its state is always the empty object. The stacking direction is presentation and travels as an A2-UI node prop, never as AG-UI state.",
41
+ "type": "object",
42
+ "required": [],
43
+ "properties": {},
44
+ "additionalProperties": false
45
+ }
46
+ }
47
+ }
@@ -18,15 +18,24 @@
18
18
  },
19
19
  "actions": {
20
20
  "type": "object",
21
- "required": [
22
- "selectAction"
23
- ],
21
+ "required": ["selectAction"],
24
22
  "properties": {
25
23
  "selectAction": {
26
24
  "$ref": "#/$defs/SelectActionAction"
27
25
  }
28
26
  },
29
27
  "additionalProperties": false
28
+ },
29
+ "children": {
30
+ "type": "array",
31
+ "items": {
32
+ "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
33
+ },
34
+ "maxItems": 1000,
35
+ "default": []
36
+ },
37
+ "child": {
38
+ "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
30
39
  }
31
40
  },
32
41
  "additionalProperties": false,
@@ -36,9 +45,7 @@
36
45
  "description": "The list of suggested actions to render. Owned exclusively by the backend; the frontend must not mutate this directly.",
37
46
  "$comment": "This schema validates the runtime state value the backend pushes to the frontend.",
38
47
  "type": "object",
39
- "required": [
40
- "actions"
41
- ],
48
+ "required": ["actions"],
42
49
  "properties": {
43
50
  "actions": {
44
51
  "type": "array",
@@ -61,10 +68,7 @@
61
68
  "properties": {
62
69
  "payload": {
63
70
  "type": "object",
64
- "required": [
65
- "text",
66
- "type"
67
- ],
71
+ "required": ["text", "type"],
68
72
  "properties": {
69
73
  "text": {
70
74
  "type": "string",
@@ -72,10 +76,7 @@
72
76
  },
73
77
  "type": {
74
78
  "type": "string",
75
- "enum": [
76
- "followup",
77
- "search"
78
- ],
79
+ "enum": ["followup", "search"],
79
80
  "description": "The kind of action selected: \"followup\" or \"search\"."
80
81
  }
81
82
  },
@@ -84,4 +85,4 @@
84
85
  }
85
86
  }
86
87
  }
87
- }
88
+ }
@@ -47,6 +47,17 @@
47
47
  }
48
48
  },
49
49
  "additionalProperties": false
50
+ },
51
+ "children": {
52
+ "type": "array",
53
+ "items": {
54
+ "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
55
+ },
56
+ "maxItems": 1000,
57
+ "default": []
58
+ },
59
+ "child": {
60
+ "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
50
61
  }
51
62
  },
52
63
  "additionalProperties": false,
@@ -116,12 +127,7 @@
116
127
  "title": "NumericFacetValue",
117
128
  "description": "A single numeric range value within a numeric facet.",
118
129
  "type": "object",
119
- "required": [
120
- "start",
121
- "end",
122
- "numberOfResults",
123
- "state"
124
- ],
130
+ "required": ["start", "end", "numberOfResults", "state"],
125
131
  "properties": {
126
132
  "start": {
127
133
  "type": "number",
@@ -147,11 +153,7 @@
147
153
  "title": "NumericFacetCustomRange",
148
154
  "description": "A custom numeric range applied by the user, with its result count.",
149
155
  "type": "object",
150
- "required": [
151
- "start",
152
- "end",
153
- "numberOfResults"
154
- ],
156
+ "required": ["start", "end", "numberOfResults"],
155
157
  "properties": {
156
158
  "start": {
157
159
  "type": "number",
@@ -196,10 +198,7 @@
196
198
  "properties": {
197
199
  "payload": {
198
200
  "type": "object",
199
- "required": [
200
- "start",
201
- "end"
202
- ],
201
+ "required": ["start", "end"],
203
202
  "properties": {
204
203
  "start": {
205
204
  "type": "number",
@@ -225,10 +224,7 @@
225
224
  "properties": {
226
225
  "payload": {
227
226
  "type": "object",
228
- "required": [
229
- "start",
230
- "end"
231
- ],
227
+ "required": ["start", "end"],
232
228
  "properties": {
233
229
  "start": {
234
230
  "type": "number",
@@ -263,10 +259,7 @@
263
259
  "properties": {
264
260
  "payload": {
265
261
  "type": "object",
266
- "required": [
267
- "start",
268
- "end"
269
- ],
262
+ "required": ["start", "end"],
270
263
  "properties": {
271
264
  "start": {
272
265
  "type": "number",
@@ -300,4 +293,4 @@
300
293
  ]
301
294
  }
302
295
  }
303
- }
296
+ }
@@ -0,0 +1,81 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schema.thermidor.coveo.com/components/page-size.schema.json",
4
+ "title": "PageSize",
5
+ "description": "A 'Products per page' selector for a search surface. Its own componentType lets it be mounted through the A2-UI tree (one renderer per componentType). It owns the current pageSize in its state and dispatches setPageSize; the backend applies the change to the surface's paging so the pagination component re-renders from the shared view.",
6
+ "allOf": [
7
+ {
8
+ "$ref": "https://schema.thermidor.coveo.com/base/component.schema.json"
9
+ }
10
+ ],
11
+ "properties": {
12
+ "componentType": {
13
+ "type": "string",
14
+ "const": "page-size"
15
+ },
16
+ "state": {
17
+ "$ref": "#/$defs/PageSizeState"
18
+ },
19
+ "actions": {
20
+ "type": "object",
21
+ "required": ["setPageSize"],
22
+ "properties": {
23
+ "setPageSize": {
24
+ "$ref": "#/$defs/SetPageSizeAction"
25
+ }
26
+ },
27
+ "additionalProperties": false
28
+ },
29
+ "children": {
30
+ "type": "array",
31
+ "items": {
32
+ "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
33
+ },
34
+ "maxItems": 1000,
35
+ "default": []
36
+ },
37
+ "child": {
38
+ "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
39
+ }
40
+ },
41
+ "additionalProperties": false,
42
+ "$defs": {
43
+ "PageSizeState": {
44
+ "title": "PageSizeState",
45
+ "description": "The current page size. Owned exclusively by the backend. Kept as its own entry (keyed by this component's id) so the selector reads exactly the field it needs without depending on the pagination component's state shape.",
46
+ "type": "object",
47
+ "required": ["pageSize"],
48
+ "properties": {
49
+ "pageSize": {
50
+ "type": "integer",
51
+ "minimum": 1,
52
+ "description": "The number of items displayed per page."
53
+ }
54
+ },
55
+ "additionalProperties": false
56
+ },
57
+ "SetPageSizeAction": {
58
+ "title": "setPageSize",
59
+ "description": "Changes the number of items displayed per page.",
60
+ "allOf": [
61
+ {
62
+ "$ref": "https://schema.thermidor.coveo.com/base/action.schema.json"
63
+ }
64
+ ],
65
+ "properties": {
66
+ "payload": {
67
+ "type": "object",
68
+ "required": ["pageSize"],
69
+ "properties": {
70
+ "pageSize": {
71
+ "type": "integer",
72
+ "minimum": 1,
73
+ "description": "The number of items to display per page."
74
+ }
75
+ },
76
+ "additionalProperties": false
77
+ }
78
+ }
79
+ }
80
+ }
81
+ }
@@ -18,10 +18,7 @@
18
18
  },
19
19
  "actions": {
20
20
  "type": "object",
21
- "required": [
22
- "selectPage",
23
- "setPageSize"
24
- ],
21
+ "required": ["selectPage", "setPageSize"],
25
22
  "properties": {
26
23
  "selectPage": {
27
24
  "$ref": "#/$defs/SelectPageAction"
@@ -31,6 +28,17 @@
31
28
  }
32
29
  },
33
30
  "additionalProperties": false
31
+ },
32
+ "children": {
33
+ "type": "array",
34
+ "items": {
35
+ "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
36
+ },
37
+ "maxItems": 1000,
38
+ "default": []
39
+ },
40
+ "child": {
41
+ "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
34
42
  }
35
43
  },
36
44
  "additionalProperties": false,
@@ -39,12 +47,7 @@
39
47
  "title": "PaginationState",
40
48
  "description": "The current pagination state. Owned exclusively by the backend.",
41
49
  "type": "object",
42
- "required": [
43
- "page",
44
- "pageSize",
45
- "totalEntries",
46
- "totalPages"
47
- ],
50
+ "required": ["page", "pageSize", "totalEntries", "totalPages"],
48
51
  "properties": {
49
52
  "page": {
50
53
  "type": "integer",
@@ -80,9 +83,7 @@
80
83
  "properties": {
81
84
  "payload": {
82
85
  "type": "object",
83
- "required": [
84
- "page"
85
- ],
86
+ "required": ["page"],
86
87
  "properties": {
87
88
  "page": {
88
89
  "type": "integer",
@@ -105,9 +106,7 @@
105
106
  "properties": {
106
107
  "payload": {
107
108
  "type": "object",
108
- "required": [
109
- "pageSize"
110
- ],
109
+ "required": ["pageSize"],
111
110
  "properties": {
112
111
  "pageSize": {
113
112
  "type": "integer",
@@ -120,4 +119,4 @@
120
119
  }
121
120
  }
122
121
  }
123
- }
122
+ }
@@ -20,6 +20,17 @@
20
20
  "type": "object",
21
21
  "properties": {},
22
22
  "additionalProperties": false
23
+ },
24
+ "children": {
25
+ "type": "array",
26
+ "items": {
27
+ "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
28
+ },
29
+ "maxItems": 1000,
30
+ "default": []
31
+ },
32
+ "child": {
33
+ "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
23
34
  }
24
35
  },
25
36
  "additionalProperties": false,
@@ -29,10 +40,7 @@
29
40
  "description": "The ordered list of products to render. Owned exclusively by the backend; the frontend must not mutate this directly.",
30
41
  "$comment": "This schema validates the runtime state value the backend pushes to the frontend.",
31
42
  "type": "object",
32
- "required": [
33
- "heading",
34
- "products"
35
- ],
43
+ "required": ["heading", "products"],
36
44
  "properties": {
37
45
  "heading": {
38
46
  "type": "string",
@@ -49,4 +57,4 @@
49
57
  "additionalProperties": false
50
58
  }
51
59
  }
52
- }
60
+ }
@@ -20,6 +20,17 @@
20
20
  "type": "object",
21
21
  "properties": {},
22
22
  "additionalProperties": false
23
+ },
24
+ "children": {
25
+ "type": "array",
26
+ "items": {
27
+ "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
28
+ },
29
+ "maxItems": 1000,
30
+ "default": []
31
+ },
32
+ "child": {
33
+ "$ref": "https://schema.thermidor.coveo.com/definitions/child-ref.schema.json"
23
34
  }
24
35
  },
25
36
  "additionalProperties": false,
@@ -28,9 +39,7 @@
28
39
  "title": "ProductListState",
29
40
  "description": "The ordered list of products to render. Owned exclusively by the backend; the frontend must not mutate this directly.",
30
41
  "type": "object",
31
- "required": [
32
- "products"
33
- ],
42
+ "required": ["products"],
34
43
  "properties": {
35
44
  "products": {
36
45
  "type": "array",
@@ -43,4 +52,4 @@
43
52
  "additionalProperties": false
44
53
  }
45
54
  }
46
- }
55
+ }