@coveo/thermidor-schema 0.0.0 → 1.0.0-beta.1

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 (33) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +34 -0
  3. package/dist/generated/schemas.d.ts +1823 -0
  4. package/dist/generated/schemas.js +539 -0
  5. package/dist/index.d.ts +3 -0
  6. package/dist/index.js +2 -0
  7. package/package.json +46 -8
  8. package/schema/base/action.schema.json +12 -0
  9. package/schema/base/catalog.schema.json +37 -0
  10. package/schema/base/component.schema.json +41 -0
  11. package/schema/components/bundle-display.schema.json +47 -0
  12. package/schema/components/cart.schema.json +108 -0
  13. package/schema/components/category-facet.schema.json +292 -0
  14. package/schema/components/comparison-table.schema.json +54 -0
  15. package/schema/components/component-contracts.schema.json +55 -0
  16. package/schema/components/date-facet.schema.json +281 -0
  17. package/schema/components/facet-manager.schema.json +47 -0
  18. package/schema/components/next-actions-bar.schema.json +87 -0
  19. package/schema/components/numeric-facet.schema.json +303 -0
  20. package/schema/components/pagination.schema.json +123 -0
  21. package/schema/components/product-carousel.schema.json +52 -0
  22. package/schema/components/product-list.schema.json +46 -0
  23. package/schema/components/regular-facet.schema.json +385 -0
  24. package/schema/components/search-box.schema.json +74 -0
  25. package/schema/components/sort.schema.json +107 -0
  26. package/schema/definitions/action-item.schema.json +20 -0
  27. package/schema/definitions/bundle-tier.schema.json +44 -0
  28. package/schema/definitions/cart-item.schema.json +29 -0
  29. package/schema/definitions/comparison-attribute.schema.json +19 -0
  30. package/schema/definitions/comparison-product.schema.json +39 -0
  31. package/schema/definitions/facet-value-state.schema.json +8 -0
  32. package/schema/definitions/product.schema.json +92 -0
  33. package/schema/definitions/selectable-facet-value-state.schema.json +8 -0
@@ -0,0 +1,385 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schema.thermidor.coveo.com/components/regular-facet.schema.json",
4
+ "title": "RegularFacet",
5
+ "description": "Provides a string/specific-value facet for a commerce search surface. Renders selectable facet values, supports facet search, and dispatches value-selection, facet-search, and show-more/less actions.",
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": "regular-facet"
15
+ },
16
+ "state": {
17
+ "$ref": "#/$defs/RegularFacetState"
18
+ },
19
+ "actions": {
20
+ "type": "object",
21
+ "required": [
22
+ "toggleSelect",
23
+ "toggleExclude",
24
+ "toggleSingleSelect",
25
+ "toggleSingleExclude",
26
+ "clearAllActiveValues",
27
+ "search",
28
+ "showMoreSearchResults",
29
+ "clearSearch",
30
+ "showMoreValues",
31
+ "showLessValues"
32
+ ],
33
+ "properties": {
34
+ "toggleSelect": {
35
+ "$ref": "#/$defs/RegularFacetToggleSelectAction"
36
+ },
37
+ "toggleExclude": {
38
+ "$ref": "#/$defs/RegularFacetToggleExcludeAction"
39
+ },
40
+ "toggleSingleSelect": {
41
+ "$ref": "#/$defs/RegularFacetToggleSingleSelectAction"
42
+ },
43
+ "toggleSingleExclude": {
44
+ "$ref": "#/$defs/RegularFacetToggleSingleExcludeAction"
45
+ },
46
+ "clearAllActiveValues": {
47
+ "$ref": "#/$defs/RegularFacetClearAllActiveValuesAction"
48
+ },
49
+ "search": {
50
+ "$ref": "#/$defs/RegularFacetSearchAction"
51
+ },
52
+ "showMoreSearchResults": {
53
+ "$ref": "#/$defs/RegularFacetShowMoreSearchResultsAction"
54
+ },
55
+ "clearSearch": {
56
+ "$ref": "#/$defs/RegularFacetClearSearchAction"
57
+ },
58
+ "showMoreValues": {
59
+ "$ref": "#/$defs/RegularFacetShowMoreValuesAction"
60
+ },
61
+ "showLessValues": {
62
+ "$ref": "#/$defs/RegularFacetShowLessValuesAction"
63
+ }
64
+ },
65
+ "additionalProperties": false
66
+ }
67
+ },
68
+ "additionalProperties": false,
69
+ "$defs": {
70
+ "RegularFacetState": {
71
+ "title": "RegularFacetState",
72
+ "description": "The current regular facet state. Owned exclusively by the backend.",
73
+ "type": "object",
74
+ "required": [
75
+ "field",
76
+ "displayName",
77
+ "values",
78
+ "hasActiveValues",
79
+ "canShowMoreValues",
80
+ "canShowLessValues",
81
+ "facetSearch"
82
+ ],
83
+ "properties": {
84
+ "field": {
85
+ "type": "string",
86
+ "minLength": 1,
87
+ "maxLength": 255,
88
+ "description": "The index field the facet is built on."
89
+ },
90
+ "displayName": {
91
+ "type": "string",
92
+ "minLength": 1,
93
+ "maxLength": 255,
94
+ "description": "Human-readable name for the facet."
95
+ },
96
+ "values": {
97
+ "type": "array",
98
+ "minItems": 0,
99
+ "maxItems": 1000,
100
+ "description": "The facet values available for selection.",
101
+ "items": {
102
+ "$ref": "#/$defs/RegularFacetValue"
103
+ }
104
+ },
105
+ "hasActiveValues": {
106
+ "type": "boolean",
107
+ "description": "Whether at least one facet value is not in the idle state (i.e. selected or excluded)."
108
+ },
109
+ "canShowMoreValues": {
110
+ "type": "boolean",
111
+ "description": "Whether more facet values can be shown."
112
+ },
113
+ "canShowLessValues": {
114
+ "type": "boolean",
115
+ "description": "Whether fewer facet values can be shown."
116
+ },
117
+ "facetSearch": {
118
+ "$ref": "#/$defs/RegularFacetSearch",
119
+ "description": "The current facet search state."
120
+ }
121
+ },
122
+ "additionalProperties": false
123
+ },
124
+ "RegularFacetValue": {
125
+ "title": "RegularFacetValue",
126
+ "description": "A single selectable value within a regular facet.",
127
+ "type": "object",
128
+ "required": [
129
+ "value",
130
+ "numberOfResults",
131
+ "state"
132
+ ],
133
+ "properties": {
134
+ "value": {
135
+ "type": "string",
136
+ "minLength": 1,
137
+ "maxLength": 1024,
138
+ "description": "The raw facet value."
139
+ },
140
+ "numberOfResults": {
141
+ "type": "integer",
142
+ "minimum": 0,
143
+ "maximum": 999999999,
144
+ "description": "The number of results matching this facet value."
145
+ },
146
+ "state": {
147
+ "$ref": "https://schema.thermidor.coveo.com/definitions/facet-value-state.schema.json",
148
+ "description": "The selection state of this facet value."
149
+ }
150
+ },
151
+ "additionalProperties": false
152
+ },
153
+ "RegularFacetSearch": {
154
+ "title": "RegularFacetSearch",
155
+ "description": "The facet search state for a regular facet.",
156
+ "type": "object",
157
+ "required": [
158
+ "query",
159
+ "canShowMoreResults",
160
+ "results"
161
+ ],
162
+ "properties": {
163
+ "query": {
164
+ "type": "string",
165
+ "minLength": 0,
166
+ "maxLength": 1024,
167
+ "description": "The current facet search query."
168
+ },
169
+ "canShowMoreResults": {
170
+ "type": "boolean",
171
+ "description": "Whether more facet search results can be shown for the current query."
172
+ },
173
+ "results": {
174
+ "type": "array",
175
+ "minItems": 0,
176
+ "maxItems": 1000,
177
+ "description": "The current facet search results.",
178
+ "items": {
179
+ "$ref": "#/$defs/RegularFacetSearchResult"
180
+ }
181
+ }
182
+ },
183
+ "additionalProperties": false
184
+ },
185
+ "RegularFacetSearchResult": {
186
+ "title": "RegularFacetSearchResult",
187
+ "description": "A single result returned by a regular facet search. Facet search only returns idle (unselected) values, so it carries no selection state.",
188
+ "type": "object",
189
+ "required": [
190
+ "value",
191
+ "numberOfResults"
192
+ ],
193
+ "properties": {
194
+ "value": {
195
+ "type": "string",
196
+ "minLength": 1,
197
+ "maxLength": 1024,
198
+ "description": "The raw facet value. Pass this to toggleSelect/toggleExclude to act on it."
199
+ },
200
+ "numberOfResults": {
201
+ "type": "integer",
202
+ "minimum": 0,
203
+ "maximum": 999999999,
204
+ "description": "The number of results matching this facet search value."
205
+ }
206
+ },
207
+ "additionalProperties": false
208
+ },
209
+ "RegularFacetToggleSelectAction": {
210
+ "title": "regularFacetToggleSelect",
211
+ "description": "Toggles the selected state of a facet value.",
212
+ "allOf": [
213
+ {
214
+ "$ref": "https://schema.thermidor.coveo.com/base/action.schema.json"
215
+ }
216
+ ],
217
+ "properties": {
218
+ "payload": {
219
+ "type": "object",
220
+ "required": [
221
+ "value"
222
+ ],
223
+ "properties": {
224
+ "value": {
225
+ "type": "string",
226
+ "minLength": 1,
227
+ "maxLength": 1024,
228
+ "description": "The raw facet value to toggle selection for."
229
+ }
230
+ },
231
+ "additionalProperties": false
232
+ }
233
+ }
234
+ },
235
+ "RegularFacetToggleExcludeAction": {
236
+ "title": "regularFacetToggleExclude",
237
+ "description": "Toggles the excluded state of a facet value.",
238
+ "allOf": [
239
+ {
240
+ "$ref": "https://schema.thermidor.coveo.com/base/action.schema.json"
241
+ }
242
+ ],
243
+ "properties": {
244
+ "payload": {
245
+ "type": "object",
246
+ "required": [
247
+ "value"
248
+ ],
249
+ "properties": {
250
+ "value": {
251
+ "type": "string",
252
+ "minLength": 1,
253
+ "maxLength": 1024,
254
+ "description": "The raw facet value to toggle exclusion for."
255
+ }
256
+ },
257
+ "additionalProperties": false
258
+ }
259
+ }
260
+ },
261
+ "RegularFacetToggleSingleSelectAction": {
262
+ "title": "regularFacetToggleSingleSelect",
263
+ "description": "Toggles the selected state of a facet value, deselecting all other values (single-select behavior).",
264
+ "allOf": [
265
+ {
266
+ "$ref": "https://schema.thermidor.coveo.com/base/action.schema.json"
267
+ }
268
+ ],
269
+ "properties": {
270
+ "payload": {
271
+ "type": "object",
272
+ "required": [
273
+ "value"
274
+ ],
275
+ "properties": {
276
+ "value": {
277
+ "type": "string",
278
+ "minLength": 1,
279
+ "maxLength": 1024,
280
+ "description": "The raw facet value to single-select."
281
+ }
282
+ },
283
+ "additionalProperties": false
284
+ }
285
+ }
286
+ },
287
+ "RegularFacetToggleSingleExcludeAction": {
288
+ "title": "regularFacetToggleSingleExclude",
289
+ "description": "Toggles the excluded state of a facet value, clearing all other selections/exclusions (single-exclude behavior).",
290
+ "allOf": [
291
+ {
292
+ "$ref": "https://schema.thermidor.coveo.com/base/action.schema.json"
293
+ }
294
+ ],
295
+ "properties": {
296
+ "payload": {
297
+ "type": "object",
298
+ "required": [
299
+ "value"
300
+ ],
301
+ "properties": {
302
+ "value": {
303
+ "type": "string",
304
+ "minLength": 1,
305
+ "maxLength": 1024,
306
+ "description": "The raw facet value to single-exclude."
307
+ }
308
+ },
309
+ "additionalProperties": false
310
+ }
311
+ }
312
+ },
313
+ "RegularFacetClearAllActiveValuesAction": {
314
+ "title": "regularFacetClearAllActiveValues",
315
+ "description": "Resets all facet values to the idle state, clearing every selection and exclusion.",
316
+ "allOf": [
317
+ {
318
+ "$ref": "https://schema.thermidor.coveo.com/base/action.schema.json"
319
+ }
320
+ ]
321
+ },
322
+ "RegularFacetSearchAction": {
323
+ "title": "search",
324
+ "description": "Runs a facet search with the given query.",
325
+ "allOf": [
326
+ {
327
+ "$ref": "https://schema.thermidor.coveo.com/base/action.schema.json"
328
+ }
329
+ ],
330
+ "properties": {
331
+ "payload": {
332
+ "type": "object",
333
+ "required": [
334
+ "query"
335
+ ],
336
+ "properties": {
337
+ "query": {
338
+ "type": "string",
339
+ "minLength": 0,
340
+ "maxLength": 1024,
341
+ "description": "The facet search query to run."
342
+ }
343
+ },
344
+ "additionalProperties": false
345
+ }
346
+ }
347
+ },
348
+ "RegularFacetShowMoreSearchResultsAction": {
349
+ "title": "regularFacetShowMoreSearchResults",
350
+ "description": "Requests the next page of facet search results for the current query.",
351
+ "allOf": [
352
+ {
353
+ "$ref": "https://schema.thermidor.coveo.com/base/action.schema.json"
354
+ }
355
+ ]
356
+ },
357
+ "RegularFacetClearSearchAction": {
358
+ "title": "regularFacetClearSearch",
359
+ "description": "Clears the facet search query and results.",
360
+ "allOf": [
361
+ {
362
+ "$ref": "https://schema.thermidor.coveo.com/base/action.schema.json"
363
+ }
364
+ ]
365
+ },
366
+ "RegularFacetShowMoreValuesAction": {
367
+ "title": "showMoreValues",
368
+ "description": "Increases the number of facet values shown.",
369
+ "allOf": [
370
+ {
371
+ "$ref": "https://schema.thermidor.coveo.com/base/action.schema.json"
372
+ }
373
+ ]
374
+ },
375
+ "RegularFacetShowLessValuesAction": {
376
+ "title": "showLessValues",
377
+ "description": "Decreases the number of facet values shown.",
378
+ "allOf": [
379
+ {
380
+ "$ref": "https://schema.thermidor.coveo.com/base/action.schema.json"
381
+ }
382
+ ]
383
+ }
384
+ }
385
+ }
@@ -0,0 +1,74 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schema.thermidor.coveo.com/components/search-box.schema.json",
4
+ "title": "SearchBox",
5
+ "description": "Provides a search input for a commerce search surface. Renders the current query and dispatches submitQuery when the user submits a new query.",
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": "search-box"
15
+ },
16
+ "state": {
17
+ "$ref": "#/$defs/SearchBoxState"
18
+ },
19
+ "actions": {
20
+ "type": "object",
21
+ "required": [
22
+ "submitQuery"
23
+ ],
24
+ "properties": {
25
+ "submitQuery": {
26
+ "$ref": "#/$defs/SubmitQueryAction"
27
+ }
28
+ },
29
+ "additionalProperties": false
30
+ }
31
+ },
32
+ "additionalProperties": false,
33
+ "$defs": {
34
+ "SearchBoxState": {
35
+ "title": "SearchBoxState",
36
+ "description": "The current search box state. Owned exclusively by the backend.",
37
+ "type": "object",
38
+ "required": [
39
+ "query"
40
+ ],
41
+ "properties": {
42
+ "query": {
43
+ "type": "string",
44
+ "description": "The current search query string."
45
+ }
46
+ },
47
+ "additionalProperties": false
48
+ },
49
+ "SubmitQueryAction": {
50
+ "title": "submitQuery",
51
+ "description": "Submits a new search query.",
52
+ "allOf": [
53
+ {
54
+ "$ref": "https://schema.thermidor.coveo.com/base/action.schema.json"
55
+ }
56
+ ],
57
+ "properties": {
58
+ "payload": {
59
+ "type": "object",
60
+ "required": [
61
+ "query"
62
+ ],
63
+ "properties": {
64
+ "query": {
65
+ "type": "string",
66
+ "description": "The query string to submit."
67
+ }
68
+ },
69
+ "additionalProperties": false
70
+ }
71
+ }
72
+ }
73
+ }
74
+ }
@@ -0,0 +1,107 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schema.thermidor.coveo.com/components/sort.schema.json",
4
+ "title": "Sort",
5
+ "description": "Provides sort controls for a commerce search surface. Renders available sort options and dispatches selectSort when the user changes the sort order.",
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": "sort"
15
+ },
16
+ "state": {
17
+ "$ref": "#/$defs/SortState"
18
+ },
19
+ "actions": {
20
+ "type": "object",
21
+ "required": [
22
+ "selectSort"
23
+ ],
24
+ "properties": {
25
+ "selectSort": {
26
+ "$ref": "#/$defs/SelectSortAction"
27
+ }
28
+ },
29
+ "additionalProperties": false
30
+ }
31
+ },
32
+ "additionalProperties": false,
33
+ "$defs": {
34
+ "SortState": {
35
+ "title": "SortState",
36
+ "description": "The current sort state. Owned exclusively by the backend.",
37
+ "type": "object",
38
+ "required": [
39
+ "appliedSort",
40
+ "availableSorts"
41
+ ],
42
+ "properties": {
43
+ "appliedSort": {
44
+ "$ref": "#/$defs/SortCriterion",
45
+ "description": "The currently applied sort criterion."
46
+ },
47
+ "availableSorts": {
48
+ "type": "array",
49
+ "description": "All available sort options.",
50
+ "items": {
51
+ "$ref": "#/$defs/SortCriterion"
52
+ }
53
+ }
54
+ },
55
+ "additionalProperties": false
56
+ },
57
+ "SortCriterion": {
58
+ "title": "SortCriterion",
59
+ "description": "A sort criterion consisting of a named criteria and field definitions.",
60
+ "type": "object",
61
+ "required": [
62
+ "sortCriteria",
63
+ "fields"
64
+ ],
65
+ "properties": {
66
+ "sortCriteria": {
67
+ "type": "string",
68
+ "description": "The name of the sort criterion (e.g. 'relevance', 'price asc')."
69
+ },
70
+ "fields": {
71
+ "type": "array",
72
+ "description": "The fields involved in this sort criterion."
73
+ }
74
+ },
75
+ "additionalProperties": false
76
+ },
77
+ "SelectSortAction": {
78
+ "title": "selectSort",
79
+ "description": "Applies a new sort criterion.",
80
+ "allOf": [
81
+ {
82
+ "$ref": "https://schema.thermidor.coveo.com/base/action.schema.json"
83
+ }
84
+ ],
85
+ "properties": {
86
+ "payload": {
87
+ "type": "object",
88
+ "required": [
89
+ "sortCriteria",
90
+ "fields"
91
+ ],
92
+ "properties": {
93
+ "sortCriteria": {
94
+ "type": "string",
95
+ "description": "The sort criterion to apply."
96
+ },
97
+ "fields": {
98
+ "type": "array",
99
+ "description": "The fields involved in the sort criterion."
100
+ }
101
+ },
102
+ "additionalProperties": false
103
+ }
104
+ }
105
+ }
106
+ }
107
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schema.thermidor.coveo.com/definitions/action-item.schema.json",
4
+ "title": "ActionItem",
5
+ "description": "A suggested action the assistant offers the user, such as a follow-up question or a search query.",
6
+ "type": "object",
7
+ "required": ["text", "type"],
8
+ "properties": {
9
+ "text": {
10
+ "type": "string",
11
+ "description": "The display text of the action shown to the user."
12
+ },
13
+ "type": {
14
+ "type": "string",
15
+ "enum": ["followup", "search"],
16
+ "description": "The kind of action: \"followup\" triggers a conversational follow-up, \"search\" triggers a standalone search."
17
+ }
18
+ },
19
+ "additionalProperties": false
20
+ }
@@ -0,0 +1,44 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schema.thermidor.coveo.com/definitions/bundle-tier.schema.json",
4
+ "title": "BundleTier",
5
+ "description": "A tier in a product bundle, grouping product slots by price/quality level.",
6
+ "type": "object",
7
+ "required": ["label", "description", "slots"],
8
+ "properties": {
9
+ "label": {
10
+ "type": "string",
11
+ "description": "Display label for the tier (e.g. 'Budget')."
12
+ },
13
+ "description": {
14
+ "type": "string",
15
+ "description": "Brief description of what the tier includes."
16
+ },
17
+ "slots": {
18
+ "type": "array",
19
+ "description": "Product category slots within this tier.",
20
+ "items": {
21
+ "$ref": "#/$defs/BundleSlot"
22
+ }
23
+ }
24
+ },
25
+ "additionalProperties": false,
26
+ "$defs": {
27
+ "BundleSlot": {
28
+ "title": "BundleSlot",
29
+ "type": "object",
30
+ "required": ["categoryLabel", "surfaceRef"],
31
+ "properties": {
32
+ "categoryLabel": {
33
+ "type": "string",
34
+ "description": "Display name of the product category for this slot."
35
+ },
36
+ "surfaceRef": {
37
+ "type": "string",
38
+ "description": "Surface ID where this slot's products are rendered via a ProductCarousel."
39
+ }
40
+ },
41
+ "additionalProperties": false
42
+ }
43
+ }
44
+ }
@@ -0,0 +1,29 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schema.thermidor.coveo.com/definitions/cart-item.schema.json",
4
+ "title": "CartItem",
5
+ "description": "A single line item in the cart, as exposed by the CartController state and used in cart action payloads.",
6
+ "type": "object",
7
+ "required": ["productId", "name", "price", "quantity"],
8
+ "properties": {
9
+ "productId": {
10
+ "type": "string",
11
+ "description": "The unique product identifier. Corresponds to the Product's permanentid field."
12
+ },
13
+ "name": {
14
+ "type": "string",
15
+ "description": "The display name of the product at the time it was added to the cart."
16
+ },
17
+ "price": {
18
+ "type": "number",
19
+ "minimum": 0,
20
+ "description": "The non-negative unit price at the time the item was added, in the session currency."
21
+ },
22
+ "quantity": {
23
+ "type": "integer",
24
+ "minimum": 1,
25
+ "description": "The number of units of this product in the cart."
26
+ }
27
+ },
28
+ "additionalProperties": false
29
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schema.thermidor.coveo.com/definitions/comparison-attribute.schema.json",
4
+ "title": "ComparisonAttribute",
5
+ "description": "Defines an attribute (column) used in a ComparisonTable. The key is the programmatic identifier that maps to values in ComparisonProduct.values, and label is the human-readable column heading.",
6
+ "type": "object",
7
+ "required": ["key", "label"],
8
+ "properties": {
9
+ "key": {
10
+ "type": "string",
11
+ "description": "The programmatic identifier for this attribute, used as a key in ComparisonProduct.values."
12
+ },
13
+ "label": {
14
+ "type": "string",
15
+ "description": "The human-readable column heading displayed in the comparison table."
16
+ }
17
+ },
18
+ "additionalProperties": false
19
+ }