soustack 0.3.0 → 0.4.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 (148) hide show
  1. package/README.md +44 -27
  2. package/dist/cli/index.js +5225 -992
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/index.d.mts +163 -91
  5. package/dist/index.d.ts +163 -91
  6. package/dist/index.js +5077 -1007
  7. package/dist/index.js.map +1 -1
  8. package/dist/index.mjs +5076 -1007
  9. package/dist/index.mjs.map +1 -1
  10. package/dist/{scrape.d.mts → scrape/index.d.mts} +88 -74
  11. package/dist/{scrape.d.ts → scrape/index.d.ts} +88 -74
  12. package/dist/{scrape.js → scrape/index.js} +255 -124
  13. package/dist/scrape/index.js.map +1 -0
  14. package/dist/{scrape.mjs → scrape/index.mjs} +255 -124
  15. package/dist/scrape/index.mjs.map +1 -0
  16. package/package.json +21 -9
  17. package/spec/.sync-meta.json +149 -0
  18. package/spec/SOUSTACK_SPEC_VERSION +1 -0
  19. package/spec/defs/common.schema.json +46 -0
  20. package/spec/defs/duration.schema.json +33 -0
  21. package/spec/defs/entities.schema.json +111 -0
  22. package/spec/defs/ingredientQuantified.schema.json +9 -0
  23. package/spec/defs/quantity.schema.json +16 -0
  24. package/spec/defs/scalingRule.schema.json +127 -0
  25. package/spec/defs/temperature.schema.json +63 -0
  26. package/spec/fixtures/content/illustrated-step.valid.json +24 -0
  27. package/spec/fixtures/invalid/equipment-unknown-reference.invalid.json +38 -0
  28. package/spec/fixtures/invalid/mise-en-place-unknown-equipment.invalid.json +37 -0
  29. package/spec/fixtures/invalid/mise-en-place-unknown-input.invalid.json +41 -0
  30. package/spec/fixtures/invalid/storage-leftovers-missing-method.invalid.json +31 -0
  31. package/spec/fixtures/invalid/storage-leftovers-wrong-type.invalid.json +23 -0
  32. package/spec/fixtures/level/base-full.valid.json +162 -0
  33. package/spec/fixtures/level/base-missing-yield.invalid.json +12 -0
  34. package/spec/fixtures/level/lite-min.valid.json +14 -0
  35. package/spec/fixtures/profile/profile-base.valid.json +20 -0
  36. package/spec/fixtures/profile/profile-equipped.valid.json +28 -0
  37. package/spec/fixtures/profile/profile-illustrated.valid.json +28 -0
  38. package/spec/fixtures/profile/profile-lite.valid.json +13 -0
  39. package/spec/fixtures/profile/profile-prepped.valid.json +31 -0
  40. package/spec/fixtures/profile/profile-scalable-missing-scaling.invalid.json +29 -0
  41. package/spec/fixtures/profile/profile-scalable.valid.json +49 -0
  42. package/spec/fixtures/profile/profile-timed-missing-structured.invalid.json +30 -0
  43. package/spec/fixtures/scaling/bakers-percent-missing-ref.invalid.json +41 -0
  44. package/spec/fixtures/scaling/bakers-percent.valid.json +51 -0
  45. package/spec/fixtures/scaling/discrete-range.invalid.json +36 -0
  46. package/spec/fixtures/scaling/missing-quantified.invalid.json +40 -0
  47. package/spec/fixtures/scaling/reject-bakersPercentage.invalid.json +50 -0
  48. package/spec/fixtures/stacks/compute-missing-timed.invalid.json +32 -0
  49. package/spec/fixtures/stacks/dietary-no-signal.invalid.json +16 -0
  50. package/spec/fixtures/stacks/illustrated-empty.invalid.json +13 -0
  51. package/spec/fixtures/stacks/quantified-string.invalid.json +22 -0
  52. package/spec/fixtures/stacks/referenced-missing-input.invalid.json +32 -0
  53. package/spec/fixtures/stacks/storage-min.valid.json +20 -0
  54. package/spec/fixtures/stacks/storage-no-duration.invalid.json +16 -0
  55. package/spec/fixtures/stacks/timed-implies-structured.valid.json +50 -0
  56. package/spec/fixtures/stacks/timed-range.invalid.json +33 -0
  57. package/spec/fixtures/valid/equipment-scaling-rules.valid.json +76 -0
  58. package/spec/fixtures/valid/equipment-strings.valid.json +31 -0
  59. package/spec/fixtures/valid/equipment-structured-uses.valid.json +47 -0
  60. package/spec/fixtures/valid/mise-en-place-basic.valid.json +31 -0
  61. package/spec/fixtures/valid/mise-en-place-referenced-equipment.valid.json +51 -0
  62. package/spec/fixtures/valid/prep-ingredient-strings.valid.json +48 -0
  63. package/spec/fixtures/valid/prep-ingredient-structured.valid.json +45 -0
  64. package/spec/fixtures/valid/profile-equipped.valid.json +29 -0
  65. package/spec/fixtures/valid/profile-prepped.valid.json +32 -0
  66. package/spec/fixtures/valid/quantified-nested-ingredient-sections.valid.json +61 -0
  67. package/spec/fixtures/valid/referenced-scaling.valid.json +67 -0
  68. package/spec/fixtures/valid/storage-leftovers-simple.valid.json +27 -0
  69. package/spec/fixtures/valid/storage-leftovers-structured.valid.json +43 -0
  70. package/spec/fixtures/valid/structured-nested-step-sections.valid.json +84 -0
  71. package/spec/schemas/stacks-registry.schema.json +108 -0
  72. package/spec/soustack.schema.json +2379 -0
  73. package/spec/stacks/compute.schema.json +7 -0
  74. package/spec/stacks/compute@1.md +22 -0
  75. package/spec/stacks/dietary.schema.json +45 -0
  76. package/spec/stacks/dietary@1.md +24 -0
  77. package/spec/stacks/equipment.schema.json +98 -0
  78. package/spec/stacks/equipment@1.md +244 -0
  79. package/spec/stacks/illustrated.schema.json +54 -0
  80. package/spec/stacks/illustrated@1.md +24 -0
  81. package/spec/stacks/prep.schema.json +76 -0
  82. package/spec/stacks/prep@1.md +276 -0
  83. package/spec/stacks/quantified.schema.json +74 -0
  84. package/spec/stacks/quantified@1.md +24 -0
  85. package/spec/stacks/referenced.schema.json +96 -0
  86. package/spec/stacks/referenced@1.md +23 -0
  87. package/spec/stacks/registry.json +112 -0
  88. package/spec/stacks/scaling.schema.json +99 -0
  89. package/spec/stacks/scaling@1.md +238 -0
  90. package/spec/stacks/storage.schema.json +132 -0
  91. package/spec/stacks/storage@1.md +256 -0
  92. package/spec/stacks/structured.schema.json +48 -0
  93. package/spec/stacks/structured@1.md +24 -0
  94. package/spec/stacks/substitutions.schema.json +43 -0
  95. package/spec/stacks/substitutions@1.md +24 -0
  96. package/spec/stacks/techniques.schema.json +28 -0
  97. package/spec/stacks/techniques@1.md +23 -0
  98. package/spec/stacks/timed.schema.json +60 -0
  99. package/spec/stacks/timed@1.md +23 -0
  100. package/src/defs/common.schema.json +46 -0
  101. package/src/defs/duration.schema.json +33 -0
  102. package/src/defs/entities.schema.json +111 -0
  103. package/src/defs/ingredientQuantified.schema.json +9 -0
  104. package/src/defs/quantity.schema.json +16 -0
  105. package/src/defs/scalingRule.schema.json +127 -0
  106. package/src/defs/temperature.schema.json +63 -0
  107. package/src/profiles/base.schema.json +2 -2
  108. package/src/profiles/equipped.schema.json +10 -0
  109. package/src/profiles/illustrated.schema.json +4 -4
  110. package/src/profiles/lite.schema.json +10 -0
  111. package/src/profiles/prepped.schema.json +10 -0
  112. package/src/profiles/scalable.schema.json +6 -6
  113. package/src/profiles/timed.schema.json +10 -0
  114. package/src/schema.json +2271 -248
  115. package/src/schemas/stacks-registry.schema.json +108 -0
  116. package/src/soustack.schema.json +2271 -248
  117. package/src/stacks/compute.schema.json +7 -0
  118. package/src/stacks/compute@1.md +22 -0
  119. package/src/stacks/dietary.schema.json +45 -0
  120. package/src/stacks/dietary@1.md +24 -0
  121. package/src/stacks/equipment.schema.json +98 -0
  122. package/src/stacks/equipment@1.md +244 -0
  123. package/src/stacks/illustrated.schema.json +54 -0
  124. package/src/stacks/illustrated@1.md +24 -0
  125. package/src/stacks/prep.schema.json +76 -0
  126. package/src/stacks/prep@1.md +276 -0
  127. package/src/stacks/quantified.schema.json +74 -0
  128. package/src/stacks/quantified@1.md +24 -0
  129. package/src/stacks/referenced.schema.json +96 -0
  130. package/src/stacks/referenced@1.md +23 -0
  131. package/src/stacks/registry.json +112 -0
  132. package/src/stacks/scaling.schema.json +99 -0
  133. package/src/stacks/scaling@1.md +238 -0
  134. package/src/stacks/storage.schema.json +132 -0
  135. package/src/stacks/storage@1.md +256 -0
  136. package/src/stacks/structured.schema.json +48 -0
  137. package/src/stacks/structured@1.md +24 -0
  138. package/src/stacks/substitutions.schema.json +43 -0
  139. package/src/stacks/substitutions@1.md +24 -0
  140. package/src/stacks/techniques.schema.json +28 -0
  141. package/src/stacks/techniques@1.md +23 -0
  142. package/src/stacks/timed.schema.json +60 -0
  143. package/src/stacks/timed@1.md +23 -0
  144. package/dist/scrape.js.map +0 -1
  145. package/dist/scrape.mjs.map +0 -1
  146. package/src/profiles/cookable.schema.json +0 -18
  147. package/src/profiles/quantified.schema.json +0 -43
  148. package/src/profiles/schedulable.schema.json +0 -43
@@ -0,0 +1,2379 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://soustack.spec/soustack.schema.json",
4
+ "title": "Soustack Specification",
5
+ "type": "object",
6
+ "properties": {
7
+ "$schema": {
8
+ "type": "string",
9
+ "const": "https://soustack.spec/soustack.schema.json"
10
+ },
11
+ "profile": {
12
+ "type": "string",
13
+ "anyOf": [
14
+ {
15
+ "enum": [
16
+ "base",
17
+ "equipped",
18
+ "illustrated",
19
+ "lite",
20
+ "prepped",
21
+ "scalable",
22
+ "timed"
23
+ ]
24
+ },
25
+ {
26
+ "pattern": "^x-[a-z0-9-]+(?:\\.[a-z0-9-]+)*$"
27
+ }
28
+ ]
29
+ },
30
+ "stacks": {
31
+ "$ref": "#/$defs/stacksMap"
32
+ },
33
+ "name": {
34
+ "type": "string"
35
+ },
36
+ "yield": {
37
+ "type": "object",
38
+ "properties": {
39
+ "amount": {
40
+ "type": "number",
41
+ "exclusiveMinimum": 0
42
+ },
43
+ "unit": {
44
+ "type": "string",
45
+ "minLength": 1
46
+ },
47
+ "metadata": {
48
+ "type": "object",
49
+ "additionalProperties": true
50
+ }
51
+ },
52
+ "required": [
53
+ "amount",
54
+ "unit"
55
+ ],
56
+ "additionalProperties": false,
57
+ "patternProperties": {
58
+ "^x-": {
59
+ "$ref": "./defs/common.schema.json#/properties/extensionLaneValue"
60
+ }
61
+ }
62
+ },
63
+ "time": {
64
+ "type": "object",
65
+ "properties": {
66
+ "total": {
67
+ "$ref": "./defs/duration.schema.json#/properties/DurationMinutes"
68
+ },
69
+ "metadata": {
70
+ "type": "object",
71
+ "additionalProperties": true
72
+ }
73
+ },
74
+ "required": [
75
+ "total"
76
+ ],
77
+ "additionalProperties": false,
78
+ "patternProperties": {
79
+ "^x-": {
80
+ "$ref": "./defs/common.schema.json#/properties/extensionLaneValue"
81
+ }
82
+ }
83
+ },
84
+ "ingredients": {
85
+ "type": "array",
86
+ "items": {
87
+ "anyOf": [
88
+ {
89
+ "type": "string"
90
+ },
91
+ {
92
+ "$ref": "#/$defs/ingredient"
93
+ },
94
+ {
95
+ "$ref": "#/$defs/ingredientSection"
96
+ }
97
+ ]
98
+ }
99
+ },
100
+ "instructions": {
101
+ "type": "array",
102
+ "items": {
103
+ "anyOf": [
104
+ {
105
+ "type": "string"
106
+ },
107
+ {
108
+ "$ref": "#/$defs/step"
109
+ },
110
+ {
111
+ "$ref": "#/$defs/stepSection"
112
+ }
113
+ ]
114
+ }
115
+ },
116
+ "metadata": {
117
+ "type": "object",
118
+ "additionalProperties": true
119
+ },
120
+ "images": {
121
+ "type": "array",
122
+ "items": {
123
+ "$ref": "./defs/common.schema.json#/properties/uri"
124
+ }
125
+ },
126
+ "videos": {
127
+ "type": "array",
128
+ "items": {
129
+ "$ref": "./defs/common.schema.json#/properties/uri"
130
+ }
131
+ },
132
+ "dietary": {
133
+ "$ref": "./stacks/dietary.schema.json#/properties/dietary"
134
+ },
135
+ "storage": {
136
+ "$ref": "./stacks/storage.schema.json#/properties/storage"
137
+ },
138
+ "substitutions": {
139
+ "$ref": "./stacks/substitutions.schema.json#/properties/substitutions"
140
+ },
141
+ "techniques": {
142
+ "$ref": "./stacks/techniques.schema.json#/properties/techniques"
143
+ },
144
+ "scaling": {
145
+ "$ref": "./stacks/scaling.schema.json#/properties/scaling"
146
+ }
147
+ },
148
+ "patternProperties": {
149
+ "^x-": {
150
+ "$ref": "./defs/common.schema.json#/properties/extensionLaneValue"
151
+ }
152
+ },
153
+ "required": [
154
+ "stacks",
155
+ "name",
156
+ "ingredients",
157
+ "instructions"
158
+ ],
159
+ "allOf": [
160
+ {
161
+ "if": {
162
+ "required": [
163
+ "profile"
164
+ ],
165
+ "properties": {
166
+ "profile": {
167
+ "enum": [
168
+ "base",
169
+ "equipped",
170
+ "illustrated",
171
+ "prepped",
172
+ "scalable",
173
+ "timed"
174
+ ]
175
+ }
176
+ }
177
+ },
178
+ "then": {
179
+ "required": [
180
+ "yield",
181
+ "time"
182
+ ]
183
+ }
184
+ },
185
+ {
186
+ "$comment": "BEGIN GENERATED STACK GATING"
187
+ },
188
+ {
189
+ "if": {
190
+ "required": [
191
+ "profile"
192
+ ],
193
+ "properties": {
194
+ "profile": {
195
+ "const": "equipped"
196
+ }
197
+ }
198
+ },
199
+ "then": {
200
+ "required": [
201
+ "stacks"
202
+ ],
203
+ "properties": {
204
+ "stacks": {
205
+ "required": [
206
+ "equipment"
207
+ ],
208
+ "properties": {
209
+ "equipment": {
210
+ "type": "integer",
211
+ "enum": [
212
+ 1
213
+ ]
214
+ }
215
+ }
216
+ }
217
+ }
218
+ }
219
+ },
220
+ {
221
+ "if": {
222
+ "required": [
223
+ "profile"
224
+ ],
225
+ "properties": {
226
+ "profile": {
227
+ "const": "illustrated"
228
+ }
229
+ }
230
+ },
231
+ "then": {
232
+ "required": [
233
+ "stacks"
234
+ ],
235
+ "properties": {
236
+ "stacks": {
237
+ "required": [
238
+ "illustrated"
239
+ ],
240
+ "properties": {
241
+ "illustrated": {
242
+ "type": "integer",
243
+ "enum": [
244
+ 1
245
+ ]
246
+ }
247
+ }
248
+ }
249
+ }
250
+ }
251
+ },
252
+ {
253
+ "if": {
254
+ "required": [
255
+ "profile"
256
+ ],
257
+ "properties": {
258
+ "profile": {
259
+ "const": "prepped"
260
+ }
261
+ }
262
+ },
263
+ "then": {
264
+ "required": [
265
+ "stacks"
266
+ ],
267
+ "properties": {
268
+ "stacks": {
269
+ "required": [
270
+ "prep"
271
+ ],
272
+ "properties": {
273
+ "prep": {
274
+ "type": "integer",
275
+ "enum": [
276
+ 1
277
+ ]
278
+ }
279
+ }
280
+ }
281
+ }
282
+ }
283
+ },
284
+ {
285
+ "if": {
286
+ "required": [
287
+ "profile"
288
+ ],
289
+ "properties": {
290
+ "profile": {
291
+ "const": "scalable"
292
+ }
293
+ }
294
+ },
295
+ "then": {
296
+ "required": [
297
+ "stacks"
298
+ ],
299
+ "properties": {
300
+ "stacks": {
301
+ "required": [
302
+ "quantified",
303
+ "scaling"
304
+ ],
305
+ "properties": {
306
+ "quantified": {
307
+ "type": "integer",
308
+ "enum": [
309
+ 1
310
+ ]
311
+ },
312
+ "scaling": {
313
+ "type": "integer",
314
+ "enum": [
315
+ 1
316
+ ]
317
+ }
318
+ }
319
+ }
320
+ }
321
+ }
322
+ },
323
+ {
324
+ "if": {
325
+ "required": [
326
+ "profile"
327
+ ],
328
+ "properties": {
329
+ "profile": {
330
+ "const": "timed"
331
+ }
332
+ }
333
+ },
334
+ "then": {
335
+ "required": [
336
+ "stacks"
337
+ ],
338
+ "properties": {
339
+ "stacks": {
340
+ "required": [
341
+ "structured",
342
+ "timed"
343
+ ],
344
+ "properties": {
345
+ "structured": {
346
+ "type": "integer",
347
+ "enum": [
348
+ 1
349
+ ]
350
+ },
351
+ "timed": {
352
+ "type": "integer",
353
+ "enum": [
354
+ 1
355
+ ]
356
+ }
357
+ }
358
+ }
359
+ }
360
+ }
361
+ },
362
+ {
363
+ "allOf": [
364
+ {
365
+ "if": {
366
+ "required": [
367
+ "stacks"
368
+ ],
369
+ "properties": {
370
+ "stacks": {
371
+ "required": [
372
+ "compute"
373
+ ]
374
+ }
375
+ }
376
+ },
377
+ "then": {
378
+ "properties": {
379
+ "stacks": {
380
+ "properties": {
381
+ "compute": {
382
+ "enum": [
383
+ 1
384
+ ]
385
+ }
386
+ }
387
+ }
388
+ }
389
+ }
390
+ },
391
+ {
392
+ "if": {
393
+ "required": [
394
+ "stacks"
395
+ ],
396
+ "properties": {
397
+ "stacks": {
398
+ "required": [
399
+ "compute"
400
+ ],
401
+ "properties": {
402
+ "compute": {
403
+ "const": 1
404
+ }
405
+ }
406
+ }
407
+ }
408
+ },
409
+ "then": {
410
+ "allOf": [
411
+ {
412
+ "properties": {
413
+ "stacks": {
414
+ "required": [
415
+ "quantified"
416
+ ],
417
+ "properties": {
418
+ "quantified": {
419
+ "enum": [
420
+ 1
421
+ ]
422
+ }
423
+ }
424
+ }
425
+ }
426
+ },
427
+ {
428
+ "properties": {
429
+ "stacks": {
430
+ "required": [
431
+ "timed"
432
+ ],
433
+ "properties": {
434
+ "timed": {
435
+ "enum": [
436
+ 1
437
+ ]
438
+ }
439
+ }
440
+ }
441
+ }
442
+ }
443
+ ]
444
+ }
445
+ }
446
+ ]
447
+ },
448
+ {
449
+ "allOf": [
450
+ {
451
+ "if": {
452
+ "required": [
453
+ "stacks"
454
+ ],
455
+ "properties": {
456
+ "stacks": {
457
+ "required": [
458
+ "dietary"
459
+ ]
460
+ }
461
+ }
462
+ },
463
+ "then": {
464
+ "properties": {
465
+ "stacks": {
466
+ "properties": {
467
+ "dietary": {
468
+ "enum": [
469
+ 1
470
+ ]
471
+ }
472
+ }
473
+ }
474
+ }
475
+ }
476
+ },
477
+ {
478
+ "if": {
479
+ "required": [
480
+ "stacks"
481
+ ],
482
+ "properties": {
483
+ "stacks": {
484
+ "required": [
485
+ "dietary"
486
+ ],
487
+ "properties": {
488
+ "dietary": {
489
+ "const": 1
490
+ }
491
+ }
492
+ }
493
+ }
494
+ },
495
+ "then": {
496
+ "properties": {
497
+ "dietary": {
498
+ "type": "object",
499
+ "properties": {
500
+ "basis": {
501
+ "type": "string",
502
+ "enum": [
503
+ "perServing",
504
+ "perRecipe"
505
+ ]
506
+ },
507
+ "calories": {
508
+ "type": "number",
509
+ "minimum": 0
510
+ },
511
+ "macros": {
512
+ "type": "object",
513
+ "properties": {
514
+ "protein": {
515
+ "type": "number",
516
+ "minimum": 0
517
+ },
518
+ "fat": {
519
+ "type": "number",
520
+ "minimum": 0
521
+ },
522
+ "carbohydrates": {
523
+ "type": "number",
524
+ "minimum": 0
525
+ },
526
+ "metadata": {
527
+ "type": "object",
528
+ "additionalProperties": true
529
+ }
530
+ },
531
+ "minProperties": 1,
532
+ "additionalProperties": false,
533
+ "patternProperties": {
534
+ "^x-": {
535
+ "$ref": "https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue"
536
+ }
537
+ }
538
+ },
539
+ "diets": {
540
+ "type": "array",
541
+ "items": {
542
+ "type": "string"
543
+ }
544
+ },
545
+ "allergens": {
546
+ "type": "array",
547
+ "items": {
548
+ "type": "string"
549
+ }
550
+ },
551
+ "metadata": {
552
+ "type": "object",
553
+ "additionalProperties": true
554
+ }
555
+ },
556
+ "required": [
557
+ "basis"
558
+ ],
559
+ "additionalProperties": false,
560
+ "anyOf": [
561
+ {
562
+ "required": [
563
+ "calories"
564
+ ]
565
+ },
566
+ {
567
+ "required": [
568
+ "macros"
569
+ ]
570
+ },
571
+ {
572
+ "required": [
573
+ "diets"
574
+ ]
575
+ },
576
+ {
577
+ "required": [
578
+ "allergens"
579
+ ]
580
+ }
581
+ ],
582
+ "patternProperties": {
583
+ "^x-": {
584
+ "$ref": "https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue"
585
+ }
586
+ }
587
+ }
588
+ },
589
+ "required": [
590
+ "dietary"
591
+ ]
592
+ }
593
+ }
594
+ ]
595
+ },
596
+ {
597
+ "allOf": [
598
+ {
599
+ "if": {
600
+ "required": [
601
+ "stacks"
602
+ ],
603
+ "properties": {
604
+ "stacks": {
605
+ "required": [
606
+ "equipment"
607
+ ]
608
+ }
609
+ }
610
+ },
611
+ "then": {
612
+ "properties": {
613
+ "stacks": {
614
+ "properties": {
615
+ "equipment": {
616
+ "enum": [
617
+ 1
618
+ ]
619
+ }
620
+ }
621
+ }
622
+ }
623
+ }
624
+ },
625
+ {
626
+ "if": {
627
+ "required": [
628
+ "stacks"
629
+ ],
630
+ "properties": {
631
+ "stacks": {
632
+ "required": [
633
+ "equipment"
634
+ ],
635
+ "properties": {
636
+ "equipment": {
637
+ "const": 1
638
+ }
639
+ }
640
+ }
641
+ }
642
+ },
643
+ "then": {
644
+ "properties": {
645
+ "equipment": {
646
+ "type": "array",
647
+ "minItems": 1,
648
+ "items": {
649
+ "anyOf": [
650
+ {
651
+ "type": "string",
652
+ "minLength": 1
653
+ },
654
+ {
655
+ "$ref": "#/$defs/equipment@1_equipmentItem"
656
+ }
657
+ ]
658
+ }
659
+ }
660
+ },
661
+ "required": [
662
+ "equipment"
663
+ ]
664
+ }
665
+ }
666
+ ]
667
+ },
668
+ {
669
+ "allOf": [
670
+ {
671
+ "if": {
672
+ "required": [
673
+ "stacks"
674
+ ],
675
+ "properties": {
676
+ "stacks": {
677
+ "required": [
678
+ "illustrated"
679
+ ]
680
+ }
681
+ }
682
+ },
683
+ "then": {
684
+ "properties": {
685
+ "stacks": {
686
+ "properties": {
687
+ "illustrated": {
688
+ "enum": [
689
+ 1
690
+ ]
691
+ }
692
+ }
693
+ }
694
+ }
695
+ }
696
+ },
697
+ {
698
+ "if": {
699
+ "required": [
700
+ "stacks"
701
+ ],
702
+ "properties": {
703
+ "stacks": {
704
+ "required": [
705
+ "illustrated"
706
+ ],
707
+ "properties": {
708
+ "illustrated": {
709
+ "const": 1
710
+ }
711
+ }
712
+ }
713
+ }
714
+ },
715
+ "then": {
716
+ "properties": {
717
+ "images": {
718
+ "type": "array",
719
+ "items": {
720
+ "$ref": "https://soustack.spec/defs/common.schema.json#/properties/uri"
721
+ }
722
+ },
723
+ "videos": {
724
+ "type": "array",
725
+ "items": {
726
+ "$ref": "https://soustack.spec/defs/common.schema.json#/properties/uri"
727
+ }
728
+ },
729
+ "instructions": {
730
+ "type": "array",
731
+ "items": {
732
+ "anyOf": [
733
+ {
734
+ "$ref": "#/$defs/illustrated@1_illustratedStep"
735
+ },
736
+ {
737
+ "$ref": "#/$defs/illustrated@1_illustratedSection"
738
+ }
739
+ ]
740
+ }
741
+ }
742
+ }
743
+ }
744
+ }
745
+ ]
746
+ },
747
+ {
748
+ "allOf": [
749
+ {
750
+ "if": {
751
+ "required": [
752
+ "stacks"
753
+ ],
754
+ "properties": {
755
+ "stacks": {
756
+ "required": [
757
+ "prep"
758
+ ]
759
+ }
760
+ }
761
+ },
762
+ "then": {
763
+ "properties": {
764
+ "stacks": {
765
+ "properties": {
766
+ "prep": {
767
+ "enum": [
768
+ 1
769
+ ]
770
+ }
771
+ }
772
+ }
773
+ }
774
+ }
775
+ },
776
+ {
777
+ "if": {
778
+ "required": [
779
+ "stacks"
780
+ ],
781
+ "properties": {
782
+ "stacks": {
783
+ "required": [
784
+ "prep"
785
+ ],
786
+ "properties": {
787
+ "prep": {
788
+ "const": 1
789
+ }
790
+ }
791
+ }
792
+ }
793
+ },
794
+ "then": {
795
+ "properties": {
796
+ "miseEnPlace": {
797
+ "type": "array",
798
+ "minItems": 1,
799
+ "items": {
800
+ "$ref": "#/$defs/prep@1_miseEnPlaceTask"
801
+ }
802
+ }
803
+ },
804
+ "required": [
805
+ "miseEnPlace"
806
+ ]
807
+ }
808
+ }
809
+ ]
810
+ },
811
+ {
812
+ "allOf": [
813
+ {
814
+ "if": {
815
+ "required": [
816
+ "stacks"
817
+ ],
818
+ "properties": {
819
+ "stacks": {
820
+ "required": [
821
+ "quantified"
822
+ ]
823
+ }
824
+ }
825
+ },
826
+ "then": {
827
+ "properties": {
828
+ "stacks": {
829
+ "properties": {
830
+ "quantified": {
831
+ "enum": [
832
+ 1
833
+ ]
834
+ }
835
+ }
836
+ }
837
+ }
838
+ }
839
+ },
840
+ {
841
+ "if": {
842
+ "required": [
843
+ "stacks"
844
+ ],
845
+ "properties": {
846
+ "stacks": {
847
+ "required": [
848
+ "quantified"
849
+ ],
850
+ "properties": {
851
+ "quantified": {
852
+ "const": 1
853
+ }
854
+ }
855
+ }
856
+ }
857
+ },
858
+ "then": {
859
+ "properties": {
860
+ "ingredients": {
861
+ "type": "array",
862
+ "items": {
863
+ "anyOf": [
864
+ {
865
+ "$ref": "#/$defs/quantified@1_ingredient"
866
+ },
867
+ {
868
+ "$ref": "#/$defs/quantified@1_ingredientSection"
869
+ }
870
+ ]
871
+ }
872
+ }
873
+ },
874
+ "required": [
875
+ "ingredients"
876
+ ]
877
+ }
878
+ }
879
+ ]
880
+ },
881
+ {
882
+ "allOf": [
883
+ {
884
+ "if": {
885
+ "required": [
886
+ "stacks"
887
+ ],
888
+ "properties": {
889
+ "stacks": {
890
+ "required": [
891
+ "referenced"
892
+ ]
893
+ }
894
+ }
895
+ },
896
+ "then": {
897
+ "properties": {
898
+ "stacks": {
899
+ "properties": {
900
+ "referenced": {
901
+ "enum": [
902
+ 1
903
+ ]
904
+ }
905
+ }
906
+ }
907
+ }
908
+ }
909
+ },
910
+ {
911
+ "if": {
912
+ "required": [
913
+ "stacks"
914
+ ],
915
+ "properties": {
916
+ "stacks": {
917
+ "required": [
918
+ "referenced"
919
+ ],
920
+ "properties": {
921
+ "referenced": {
922
+ "const": 1
923
+ }
924
+ }
925
+ }
926
+ }
927
+ },
928
+ "then": {
929
+ "allOf": [
930
+ {
931
+ "properties": {
932
+ "stacks": {
933
+ "required": [
934
+ "structured"
935
+ ],
936
+ "properties": {
937
+ "structured": {
938
+ "enum": [
939
+ 1
940
+ ]
941
+ }
942
+ }
943
+ }
944
+ }
945
+ },
946
+ {
947
+ "properties": {
948
+ "ingredients": {
949
+ "type": "array",
950
+ "items": {
951
+ "anyOf": [
952
+ {
953
+ "$ref": "#/$defs/referenced@1_ingredient"
954
+ },
955
+ {
956
+ "$ref": "#/$defs/referenced@1_ingredientSection"
957
+ }
958
+ ]
959
+ }
960
+ },
961
+ "instructions": {
962
+ "type": "array",
963
+ "items": {
964
+ "anyOf": [
965
+ {
966
+ "$ref": "#/$defs/referenced@1_referencedStep"
967
+ },
968
+ {
969
+ "$ref": "#/$defs/referenced@1_referencedSection"
970
+ }
971
+ ]
972
+ }
973
+ }
974
+ },
975
+ "required": [
976
+ "ingredients",
977
+ "instructions"
978
+ ]
979
+ }
980
+ ]
981
+ }
982
+ }
983
+ ]
984
+ },
985
+ {
986
+ "allOf": [
987
+ {
988
+ "if": {
989
+ "required": [
990
+ "stacks"
991
+ ],
992
+ "properties": {
993
+ "stacks": {
994
+ "required": [
995
+ "scaling"
996
+ ]
997
+ }
998
+ }
999
+ },
1000
+ "then": {
1001
+ "properties": {
1002
+ "stacks": {
1003
+ "properties": {
1004
+ "scaling": {
1005
+ "enum": [
1006
+ 1
1007
+ ]
1008
+ }
1009
+ }
1010
+ }
1011
+ }
1012
+ }
1013
+ },
1014
+ {
1015
+ "if": {
1016
+ "required": [
1017
+ "stacks"
1018
+ ],
1019
+ "properties": {
1020
+ "stacks": {
1021
+ "required": [
1022
+ "scaling"
1023
+ ],
1024
+ "properties": {
1025
+ "scaling": {
1026
+ "const": 1
1027
+ }
1028
+ }
1029
+ }
1030
+ }
1031
+ },
1032
+ "then": {
1033
+ "allOf": [
1034
+ {
1035
+ "properties": {
1036
+ "stacks": {
1037
+ "required": [
1038
+ "quantified"
1039
+ ],
1040
+ "properties": {
1041
+ "quantified": {
1042
+ "enum": [
1043
+ 1
1044
+ ]
1045
+ }
1046
+ }
1047
+ }
1048
+ }
1049
+ },
1050
+ {
1051
+ "properties": {
1052
+ "ingredients": {
1053
+ "type": "array",
1054
+ "items": {
1055
+ "anyOf": [
1056
+ {
1057
+ "$ref": "#/$defs/scaling@1_ingredient"
1058
+ },
1059
+ {
1060
+ "$ref": "#/$defs/scaling@1_ingredientSection"
1061
+ }
1062
+ ]
1063
+ }
1064
+ },
1065
+ "scaling": {
1066
+ "type": "object",
1067
+ "properties": {
1068
+ "discrete": {
1069
+ "type": "object",
1070
+ "properties": {
1071
+ "min": {
1072
+ "type": "integer",
1073
+ "minimum": 1
1074
+ },
1075
+ "max": {
1076
+ "type": "integer",
1077
+ "minimum": 1
1078
+ },
1079
+ "step": {
1080
+ "type": "integer",
1081
+ "minimum": 1
1082
+ },
1083
+ "metadata": {
1084
+ "type": "object",
1085
+ "additionalProperties": true
1086
+ }
1087
+ },
1088
+ "required": [
1089
+ "min",
1090
+ "max"
1091
+ ],
1092
+ "additionalProperties": false,
1093
+ "patternProperties": {
1094
+ "^x-": {
1095
+ "$ref": "https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue"
1096
+ }
1097
+ }
1098
+ },
1099
+ "metadata": {
1100
+ "type": "object",
1101
+ "additionalProperties": true
1102
+ }
1103
+ },
1104
+ "required": [
1105
+ "discrete"
1106
+ ],
1107
+ "additionalProperties": false,
1108
+ "patternProperties": {
1109
+ "^x-": {
1110
+ "$ref": "https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue"
1111
+ }
1112
+ }
1113
+ }
1114
+ },
1115
+ "required": [
1116
+ "ingredients",
1117
+ "scaling"
1118
+ ]
1119
+ }
1120
+ ]
1121
+ }
1122
+ }
1123
+ ]
1124
+ },
1125
+ {
1126
+ "allOf": [
1127
+ {
1128
+ "if": {
1129
+ "required": [
1130
+ "stacks"
1131
+ ],
1132
+ "properties": {
1133
+ "stacks": {
1134
+ "required": [
1135
+ "storage"
1136
+ ]
1137
+ }
1138
+ }
1139
+ },
1140
+ "then": {
1141
+ "properties": {
1142
+ "stacks": {
1143
+ "properties": {
1144
+ "storage": {
1145
+ "enum": [
1146
+ 1
1147
+ ]
1148
+ }
1149
+ }
1150
+ }
1151
+ }
1152
+ }
1153
+ },
1154
+ {
1155
+ "if": {
1156
+ "required": [
1157
+ "stacks"
1158
+ ],
1159
+ "properties": {
1160
+ "stacks": {
1161
+ "required": [
1162
+ "storage"
1163
+ ],
1164
+ "properties": {
1165
+ "storage": {
1166
+ "const": 1
1167
+ }
1168
+ }
1169
+ }
1170
+ }
1171
+ },
1172
+ "then": {
1173
+ "properties": {
1174
+ "storage": {
1175
+ "type": "object",
1176
+ "properties": {
1177
+ "roomTemp": {
1178
+ "$ref": "#/$defs/storage@1_storageMethod"
1179
+ },
1180
+ "refrigerated": {
1181
+ "$ref": "#/$defs/storage@1_storageMethod"
1182
+ },
1183
+ "frozen": {
1184
+ "$ref": "#/$defs/storage@1_storageMethod"
1185
+ },
1186
+ "leftovers": {
1187
+ "$ref": "#/$defs/storage@1_leftovers"
1188
+ },
1189
+ "metadata": {
1190
+ "type": "object",
1191
+ "additionalProperties": true
1192
+ }
1193
+ },
1194
+ "anyOf": [
1195
+ {
1196
+ "required": [
1197
+ "roomTemp"
1198
+ ]
1199
+ },
1200
+ {
1201
+ "required": [
1202
+ "refrigerated"
1203
+ ]
1204
+ },
1205
+ {
1206
+ "required": [
1207
+ "frozen"
1208
+ ]
1209
+ }
1210
+ ],
1211
+ "additionalProperties": false,
1212
+ "patternProperties": {
1213
+ "^x-": {
1214
+ "$ref": "https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue"
1215
+ }
1216
+ }
1217
+ }
1218
+ },
1219
+ "required": [
1220
+ "storage"
1221
+ ]
1222
+ }
1223
+ }
1224
+ ]
1225
+ },
1226
+ {
1227
+ "allOf": [
1228
+ {
1229
+ "if": {
1230
+ "required": [
1231
+ "stacks"
1232
+ ],
1233
+ "properties": {
1234
+ "stacks": {
1235
+ "required": [
1236
+ "structured"
1237
+ ]
1238
+ }
1239
+ }
1240
+ },
1241
+ "then": {
1242
+ "properties": {
1243
+ "stacks": {
1244
+ "properties": {
1245
+ "structured": {
1246
+ "enum": [
1247
+ 1
1248
+ ]
1249
+ }
1250
+ }
1251
+ }
1252
+ }
1253
+ }
1254
+ },
1255
+ {
1256
+ "if": {
1257
+ "required": [
1258
+ "stacks"
1259
+ ],
1260
+ "properties": {
1261
+ "stacks": {
1262
+ "required": [
1263
+ "structured"
1264
+ ],
1265
+ "properties": {
1266
+ "structured": {
1267
+ "const": 1
1268
+ }
1269
+ }
1270
+ }
1271
+ }
1272
+ },
1273
+ "then": {
1274
+ "properties": {
1275
+ "instructions": {
1276
+ "type": "array",
1277
+ "items": {
1278
+ "anyOf": [
1279
+ {
1280
+ "$ref": "#/$defs/structured@1_step"
1281
+ },
1282
+ {
1283
+ "$ref": "#/$defs/structured@1_stepSection"
1284
+ }
1285
+ ]
1286
+ }
1287
+ }
1288
+ },
1289
+ "required": [
1290
+ "instructions"
1291
+ ]
1292
+ }
1293
+ }
1294
+ ]
1295
+ },
1296
+ {
1297
+ "allOf": [
1298
+ {
1299
+ "if": {
1300
+ "required": [
1301
+ "stacks"
1302
+ ],
1303
+ "properties": {
1304
+ "stacks": {
1305
+ "required": [
1306
+ "substitutions"
1307
+ ]
1308
+ }
1309
+ }
1310
+ },
1311
+ "then": {
1312
+ "properties": {
1313
+ "stacks": {
1314
+ "properties": {
1315
+ "substitutions": {
1316
+ "enum": [
1317
+ 1
1318
+ ]
1319
+ }
1320
+ }
1321
+ }
1322
+ }
1323
+ }
1324
+ },
1325
+ {
1326
+ "if": {
1327
+ "required": [
1328
+ "stacks"
1329
+ ],
1330
+ "properties": {
1331
+ "stacks": {
1332
+ "required": [
1333
+ "substitutions"
1334
+ ],
1335
+ "properties": {
1336
+ "substitutions": {
1337
+ "const": 1
1338
+ }
1339
+ }
1340
+ }
1341
+ }
1342
+ },
1343
+ "then": {
1344
+ "allOf": [
1345
+ {
1346
+ "properties": {
1347
+ "stacks": {
1348
+ "required": [
1349
+ "referenced"
1350
+ ],
1351
+ "properties": {
1352
+ "referenced": {
1353
+ "enum": [
1354
+ 1
1355
+ ]
1356
+ }
1357
+ }
1358
+ }
1359
+ }
1360
+ },
1361
+ {
1362
+ "properties": {
1363
+ "substitutions": {
1364
+ "type": "array",
1365
+ "items": {
1366
+ "type": "object",
1367
+ "properties": {
1368
+ "for": {
1369
+ "type": "string"
1370
+ },
1371
+ "alternatives": {
1372
+ "type": "array",
1373
+ "items": {
1374
+ "type": "object",
1375
+ "properties": {
1376
+ "name": {
1377
+ "type": "string"
1378
+ },
1379
+ "ratio": {
1380
+ "type": "string"
1381
+ },
1382
+ "metadata": {
1383
+ "type": "object",
1384
+ "additionalProperties": true
1385
+ }
1386
+ },
1387
+ "required": [
1388
+ "name",
1389
+ "ratio"
1390
+ ],
1391
+ "additionalProperties": false,
1392
+ "patternProperties": {
1393
+ "^x-": {
1394
+ "$ref": "https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue"
1395
+ }
1396
+ }
1397
+ },
1398
+ "minItems": 1
1399
+ },
1400
+ "metadata": {
1401
+ "type": "object",
1402
+ "additionalProperties": true
1403
+ }
1404
+ },
1405
+ "required": [
1406
+ "for",
1407
+ "alternatives"
1408
+ ],
1409
+ "additionalProperties": false,
1410
+ "patternProperties": {
1411
+ "^x-": {
1412
+ "$ref": "https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue"
1413
+ }
1414
+ }
1415
+ },
1416
+ "minItems": 1
1417
+ }
1418
+ },
1419
+ "required": [
1420
+ "substitutions"
1421
+ ]
1422
+ }
1423
+ ]
1424
+ }
1425
+ }
1426
+ ]
1427
+ },
1428
+ {
1429
+ "allOf": [
1430
+ {
1431
+ "if": {
1432
+ "required": [
1433
+ "stacks"
1434
+ ],
1435
+ "properties": {
1436
+ "stacks": {
1437
+ "required": [
1438
+ "techniques"
1439
+ ]
1440
+ }
1441
+ }
1442
+ },
1443
+ "then": {
1444
+ "properties": {
1445
+ "stacks": {
1446
+ "properties": {
1447
+ "techniques": {
1448
+ "enum": [
1449
+ 1
1450
+ ]
1451
+ }
1452
+ }
1453
+ }
1454
+ }
1455
+ }
1456
+ },
1457
+ {
1458
+ "if": {
1459
+ "required": [
1460
+ "stacks"
1461
+ ],
1462
+ "properties": {
1463
+ "stacks": {
1464
+ "required": [
1465
+ "techniques"
1466
+ ],
1467
+ "properties": {
1468
+ "techniques": {
1469
+ "const": 1
1470
+ }
1471
+ }
1472
+ }
1473
+ }
1474
+ },
1475
+ "then": {
1476
+ "properties": {
1477
+ "techniques": {
1478
+ "type": "array",
1479
+ "items": {
1480
+ "type": "object",
1481
+ "properties": {
1482
+ "id": {
1483
+ "type": "string"
1484
+ },
1485
+ "name": {
1486
+ "type": "string"
1487
+ },
1488
+ "description": {
1489
+ "type": "string"
1490
+ },
1491
+ "metadata": {
1492
+ "type": "object",
1493
+ "additionalProperties": true
1494
+ }
1495
+ },
1496
+ "required": [
1497
+ "id",
1498
+ "name"
1499
+ ],
1500
+ "additionalProperties": false,
1501
+ "patternProperties": {
1502
+ "^x-": {
1503
+ "$ref": "https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue"
1504
+ }
1505
+ }
1506
+ },
1507
+ "minItems": 1
1508
+ }
1509
+ },
1510
+ "required": [
1511
+ "techniques"
1512
+ ]
1513
+ }
1514
+ }
1515
+ ]
1516
+ },
1517
+ {
1518
+ "allOf": [
1519
+ {
1520
+ "if": {
1521
+ "required": [
1522
+ "stacks"
1523
+ ],
1524
+ "properties": {
1525
+ "stacks": {
1526
+ "required": [
1527
+ "timed"
1528
+ ]
1529
+ }
1530
+ }
1531
+ },
1532
+ "then": {
1533
+ "properties": {
1534
+ "stacks": {
1535
+ "properties": {
1536
+ "timed": {
1537
+ "enum": [
1538
+ 1
1539
+ ]
1540
+ }
1541
+ }
1542
+ }
1543
+ }
1544
+ }
1545
+ },
1546
+ {
1547
+ "if": {
1548
+ "required": [
1549
+ "stacks"
1550
+ ],
1551
+ "properties": {
1552
+ "stacks": {
1553
+ "required": [
1554
+ "timed"
1555
+ ],
1556
+ "properties": {
1557
+ "timed": {
1558
+ "const": 1
1559
+ }
1560
+ }
1561
+ }
1562
+ }
1563
+ },
1564
+ "then": {
1565
+ "allOf": [
1566
+ {
1567
+ "properties": {
1568
+ "stacks": {
1569
+ "required": [
1570
+ "structured"
1571
+ ],
1572
+ "properties": {
1573
+ "structured": {
1574
+ "enum": [
1575
+ 1
1576
+ ]
1577
+ }
1578
+ }
1579
+ }
1580
+ }
1581
+ },
1582
+ {
1583
+ "properties": {
1584
+ "instructions": {
1585
+ "type": "array",
1586
+ "items": {
1587
+ "anyOf": [
1588
+ {
1589
+ "$ref": "#/$defs/timed@1_timedStep"
1590
+ },
1591
+ {
1592
+ "$ref": "#/$defs/timed@1_timedStepSection"
1593
+ }
1594
+ ]
1595
+ }
1596
+ }
1597
+ },
1598
+ "required": [
1599
+ "instructions"
1600
+ ]
1601
+ }
1602
+ ]
1603
+ }
1604
+ }
1605
+ ]
1606
+ },
1607
+ {
1608
+ "$comment": "END GENERATED STACK GATING"
1609
+ }
1610
+ ],
1611
+ "unevaluatedProperties": false,
1612
+ "$defs": {
1613
+ "stackName": {
1614
+ "type": "string",
1615
+ "pattern": "^(?:[a-z][a-z0-9-]*|x-[a-z0-9-]+(?:\\.[a-z0-9-]+)*)$"
1616
+ },
1617
+ "stackMajor": {
1618
+ "type": "integer",
1619
+ "minimum": 1
1620
+ },
1621
+ "stacksMap": {
1622
+ "type": "object",
1623
+ "propertyNames": {
1624
+ "$ref": "#/$defs/stackName"
1625
+ },
1626
+ "additionalProperties": {
1627
+ "$ref": "#/$defs/stackMajor"
1628
+ }
1629
+ },
1630
+ "ingredient": {
1631
+ "allOf": [
1632
+ {
1633
+ "$ref": "./defs/entities.schema.json#/$defs/IngredientBase"
1634
+ }
1635
+ ]
1636
+ },
1637
+ "ingredientSection": {
1638
+ "type": "object",
1639
+ "properties": {
1640
+ "section": {
1641
+ "type": "string"
1642
+ },
1643
+ "ingredients": {
1644
+ "type": "array",
1645
+ "items": {
1646
+ "anyOf": [
1647
+ {
1648
+ "type": "string"
1649
+ },
1650
+ {
1651
+ "$ref": "#/$defs/ingredient"
1652
+ },
1653
+ {
1654
+ "$ref": "#/$defs/ingredientSection"
1655
+ }
1656
+ ]
1657
+ }
1658
+ },
1659
+ "metadata": {
1660
+ "type": "object",
1661
+ "additionalProperties": true
1662
+ }
1663
+ },
1664
+ "required": [
1665
+ "section",
1666
+ "ingredients"
1667
+ ],
1668
+ "additionalProperties": false,
1669
+ "patternProperties": {
1670
+ "^x-": {
1671
+ "$ref": "./defs/common.schema.json#/properties/extensionLaneValue"
1672
+ }
1673
+ }
1674
+ },
1675
+ "step": {
1676
+ "$ref": "./defs/entities.schema.json#/$defs/StepBase"
1677
+ },
1678
+ "stepSection": {
1679
+ "type": "object",
1680
+ "properties": {
1681
+ "section": {
1682
+ "type": "string"
1683
+ },
1684
+ "steps": {
1685
+ "type": "array",
1686
+ "items": {
1687
+ "anyOf": [
1688
+ {
1689
+ "type": "string"
1690
+ },
1691
+ {
1692
+ "$ref": "#/$defs/step"
1693
+ },
1694
+ {
1695
+ "$ref": "#/$defs/stepSection"
1696
+ }
1697
+ ]
1698
+ }
1699
+ },
1700
+ "metadata": {
1701
+ "type": "object",
1702
+ "additionalProperties": true
1703
+ }
1704
+ },
1705
+ "required": [
1706
+ "section",
1707
+ "steps"
1708
+ ],
1709
+ "additionalProperties": false,
1710
+ "patternProperties": {
1711
+ "^x-": {
1712
+ "$ref": "./defs/common.schema.json#/properties/extensionLaneValue"
1713
+ }
1714
+ }
1715
+ },
1716
+ "illustrated@1_illustratedStep": {
1717
+ "allOf": [
1718
+ {
1719
+ "$ref": "https://soustack.spec/defs/entities.schema.json#/$defs/StepBase"
1720
+ },
1721
+ {
1722
+ "required": [
1723
+ "id"
1724
+ ]
1725
+ }
1726
+ ]
1727
+ },
1728
+ "illustrated@1_illustratedSection": {
1729
+ "type": "object",
1730
+ "properties": {
1731
+ "section": {
1732
+ "type": "string"
1733
+ },
1734
+ "steps": {
1735
+ "type": "array",
1736
+ "items": {
1737
+ "anyOf": [
1738
+ {
1739
+ "$ref": "https://soustack.spec/stacks/illustrated.schema.json#/$defs/illustratedStep"
1740
+ },
1741
+ {
1742
+ "$ref": "https://soustack.spec/stacks/illustrated.schema.json#/$defs/illustratedSection"
1743
+ }
1744
+ ]
1745
+ }
1746
+ },
1747
+ "metadata": {
1748
+ "type": "object",
1749
+ "additionalProperties": true
1750
+ }
1751
+ },
1752
+ "required": [
1753
+ "section",
1754
+ "steps"
1755
+ ],
1756
+ "additionalProperties": false,
1757
+ "patternProperties": {
1758
+ "^x-": {
1759
+ "$ref": "https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue"
1760
+ }
1761
+ }
1762
+ },
1763
+ "quantified@1_ingredient": {
1764
+ "type": "object",
1765
+ "properties": {
1766
+ "id": {
1767
+ "type": "string"
1768
+ },
1769
+ "name": {
1770
+ "type": "string"
1771
+ },
1772
+ "quantity": {
1773
+ "$ref": "https://soustack.spec/defs/quantity.schema.json"
1774
+ },
1775
+ "temperature": {
1776
+ "$ref": "https://soustack.spec/defs/temperature.schema.json"
1777
+ },
1778
+ "notes": {
1779
+ "type": "string"
1780
+ },
1781
+ "prep": {
1782
+ "oneOf": [
1783
+ {
1784
+ "type": "string",
1785
+ "minLength": 1
1786
+ },
1787
+ {
1788
+ "type": "array",
1789
+ "minItems": 1,
1790
+ "items": {
1791
+ "anyOf": [
1792
+ {
1793
+ "type": "string",
1794
+ "minLength": 1
1795
+ },
1796
+ {
1797
+ "$ref": "https://soustack.spec/stacks/prep.schema.json#/$defs/prepItem"
1798
+ }
1799
+ ]
1800
+ }
1801
+ }
1802
+ ]
1803
+ },
1804
+ "metadata": {
1805
+ "type": "object",
1806
+ "additionalProperties": true
1807
+ },
1808
+ "scaling": {
1809
+ "$ref": "https://soustack.spec/defs/scalingRule.schema.json"
1810
+ }
1811
+ },
1812
+ "required": [
1813
+ "id",
1814
+ "name",
1815
+ "quantity"
1816
+ ],
1817
+ "additionalProperties": false,
1818
+ "patternProperties": {
1819
+ "^x-": {
1820
+ "$ref": "https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue"
1821
+ }
1822
+ }
1823
+ },
1824
+ "quantified@1_ingredientSection": {
1825
+ "type": "object",
1826
+ "properties": {
1827
+ "section": {
1828
+ "type": "string"
1829
+ },
1830
+ "ingredients": {
1831
+ "type": "array",
1832
+ "items": {
1833
+ "anyOf": [
1834
+ {
1835
+ "$ref": "https://soustack.spec/stacks/quantified.schema.json#/$defs/ingredient"
1836
+ },
1837
+ {
1838
+ "$ref": "https://soustack.spec/stacks/quantified.schema.json#/$defs/ingredientSection"
1839
+ }
1840
+ ]
1841
+ }
1842
+ },
1843
+ "metadata": {
1844
+ "type": "object",
1845
+ "additionalProperties": true
1846
+ }
1847
+ },
1848
+ "required": [
1849
+ "section",
1850
+ "ingredients"
1851
+ ],
1852
+ "additionalProperties": false,
1853
+ "patternProperties": {
1854
+ "^x-": {
1855
+ "$ref": "https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue"
1856
+ }
1857
+ }
1858
+ },
1859
+ "referenced@1_ingredient": {
1860
+ "allOf": [
1861
+ {
1862
+ "$ref": "https://soustack.spec/defs/entities.schema.json#/$defs/IngredientBase"
1863
+ },
1864
+ {
1865
+ "required": [
1866
+ "id"
1867
+ ]
1868
+ }
1869
+ ]
1870
+ },
1871
+ "referenced@1_ingredientSection": {
1872
+ "type": "object",
1873
+ "properties": {
1874
+ "section": {
1875
+ "type": "string"
1876
+ },
1877
+ "ingredients": {
1878
+ "type": "array",
1879
+ "items": {
1880
+ "anyOf": [
1881
+ {
1882
+ "$ref": "https://soustack.spec/stacks/referenced.schema.json#/$defs/ingredient"
1883
+ },
1884
+ {
1885
+ "$ref": "https://soustack.spec/stacks/referenced.schema.json#/$defs/ingredientSection"
1886
+ }
1887
+ ]
1888
+ }
1889
+ },
1890
+ "metadata": {
1891
+ "type": "object",
1892
+ "additionalProperties": true
1893
+ }
1894
+ },
1895
+ "required": [
1896
+ "section",
1897
+ "ingredients"
1898
+ ],
1899
+ "additionalProperties": false,
1900
+ "patternProperties": {
1901
+ "^x-": {
1902
+ "$ref": "https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue"
1903
+ }
1904
+ }
1905
+ },
1906
+ "referenced@1_referencedStep": {
1907
+ "allOf": [
1908
+ {
1909
+ "$ref": "https://soustack.spec/defs/entities.schema.json#/$defs/StepBase"
1910
+ },
1911
+ {
1912
+ "properties": {
1913
+ "inputs": {
1914
+ "allOf": [
1915
+ {
1916
+ "$ref": "https://soustack.spec/defs/entities.schema.json#/$defs/StepBase/properties/inputs"
1917
+ },
1918
+ {
1919
+ "minItems": 1
1920
+ }
1921
+ ]
1922
+ }
1923
+ },
1924
+ "required": [
1925
+ "id",
1926
+ "inputs"
1927
+ ]
1928
+ }
1929
+ ]
1930
+ },
1931
+ "referenced@1_referencedSection": {
1932
+ "type": "object",
1933
+ "properties": {
1934
+ "section": {
1935
+ "type": "string"
1936
+ },
1937
+ "steps": {
1938
+ "type": "array",
1939
+ "items": {
1940
+ "anyOf": [
1941
+ {
1942
+ "$ref": "https://soustack.spec/stacks/referenced.schema.json#/$defs/referencedStep"
1943
+ },
1944
+ {
1945
+ "$ref": "https://soustack.spec/stacks/referenced.schema.json#/$defs/referencedSection"
1946
+ }
1947
+ ]
1948
+ }
1949
+ },
1950
+ "metadata": {
1951
+ "type": "object",
1952
+ "additionalProperties": true
1953
+ }
1954
+ },
1955
+ "required": [
1956
+ "section",
1957
+ "steps"
1958
+ ],
1959
+ "additionalProperties": false,
1960
+ "patternProperties": {
1961
+ "^x-": {
1962
+ "$ref": "https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue"
1963
+ }
1964
+ }
1965
+ },
1966
+ "scaling@1_ingredient": {
1967
+ "type": "object",
1968
+ "properties": {
1969
+ "id": {
1970
+ "type": "string"
1971
+ },
1972
+ "name": {
1973
+ "type": "string"
1974
+ },
1975
+ "quantity": {
1976
+ "$ref": "https://soustack.spec/defs/quantity.schema.json"
1977
+ },
1978
+ "temperature": {
1979
+ "$ref": "https://soustack.spec/defs/temperature.schema.json"
1980
+ },
1981
+ "notes": {
1982
+ "type": "string"
1983
+ },
1984
+ "prep": {
1985
+ "oneOf": [
1986
+ {
1987
+ "type": "string",
1988
+ "minLength": 1
1989
+ },
1990
+ {
1991
+ "type": "array",
1992
+ "minItems": 1,
1993
+ "items": {
1994
+ "anyOf": [
1995
+ {
1996
+ "type": "string",
1997
+ "minLength": 1
1998
+ },
1999
+ {
2000
+ "$ref": "https://soustack.spec/stacks/prep.schema.json#/$defs/prepItem"
2001
+ }
2002
+ ]
2003
+ }
2004
+ }
2005
+ ]
2006
+ },
2007
+ "metadata": {
2008
+ "type": "object",
2009
+ "additionalProperties": true
2010
+ },
2011
+ "scaling": {
2012
+ "$ref": "https://soustack.spec/defs/scalingRule.schema.json"
2013
+ }
2014
+ },
2015
+ "required": [
2016
+ "id",
2017
+ "name",
2018
+ "quantity"
2019
+ ],
2020
+ "additionalProperties": false,
2021
+ "patternProperties": {
2022
+ "^x-": {
2023
+ "$ref": "https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue"
2024
+ }
2025
+ }
2026
+ },
2027
+ "scaling@1_ingredientSection": {
2028
+ "type": "object",
2029
+ "properties": {
2030
+ "section": {
2031
+ "type": "string"
2032
+ },
2033
+ "ingredients": {
2034
+ "type": "array",
2035
+ "items": {
2036
+ "anyOf": [
2037
+ {
2038
+ "$ref": "https://soustack.spec/stacks/scaling.schema.json#/$defs/ingredient"
2039
+ },
2040
+ {
2041
+ "$ref": "https://soustack.spec/stacks/scaling.schema.json#/$defs/ingredientSection"
2042
+ }
2043
+ ]
2044
+ }
2045
+ },
2046
+ "metadata": {
2047
+ "type": "object",
2048
+ "additionalProperties": true
2049
+ }
2050
+ },
2051
+ "required": [
2052
+ "section",
2053
+ "ingredients"
2054
+ ],
2055
+ "additionalProperties": false,
2056
+ "patternProperties": {
2057
+ "^x-": {
2058
+ "$ref": "https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue"
2059
+ }
2060
+ }
2061
+ },
2062
+ "storage@1_storageMethod": {
2063
+ "type": "object",
2064
+ "properties": {
2065
+ "duration": {
2066
+ "$ref": "https://soustack.spec/defs/duration.schema.json#/properties/StorageDuration"
2067
+ },
2068
+ "notes": {
2069
+ "type": "string"
2070
+ },
2071
+ "metadata": {
2072
+ "type": "object",
2073
+ "additionalProperties": true
2074
+ }
2075
+ },
2076
+ "required": [
2077
+ "duration"
2078
+ ],
2079
+ "additionalProperties": false,
2080
+ "patternProperties": {
2081
+ "^x-": {
2082
+ "$ref": "https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue"
2083
+ }
2084
+ }
2085
+ },
2086
+ "structured@1_step": {
2087
+ "allOf": [
2088
+ {
2089
+ "$ref": "https://soustack.spec/defs/entities.schema.json#/$defs/StepBase"
2090
+ },
2091
+ {
2092
+ "required": [
2093
+ "id"
2094
+ ]
2095
+ }
2096
+ ]
2097
+ },
2098
+ "structured@1_stepSection": {
2099
+ "type": "object",
2100
+ "properties": {
2101
+ "section": {
2102
+ "type": "string"
2103
+ },
2104
+ "steps": {
2105
+ "type": "array",
2106
+ "items": {
2107
+ "anyOf": [
2108
+ {
2109
+ "$ref": "https://soustack.spec/stacks/structured.schema.json#/$defs/step"
2110
+ },
2111
+ {
2112
+ "$ref": "https://soustack.spec/stacks/structured.schema.json#/$defs/stepSection"
2113
+ }
2114
+ ]
2115
+ }
2116
+ },
2117
+ "metadata": {
2118
+ "type": "object",
2119
+ "additionalProperties": true
2120
+ }
2121
+ },
2122
+ "required": [
2123
+ "section",
2124
+ "steps"
2125
+ ],
2126
+ "additionalProperties": false,
2127
+ "patternProperties": {
2128
+ "^x-": {
2129
+ "$ref": "https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue"
2130
+ }
2131
+ }
2132
+ },
2133
+ "timed@1_timedStep": {
2134
+ "allOf": [
2135
+ {
2136
+ "$ref": "https://soustack.spec/defs/entities.schema.json#/$defs/StepBase"
2137
+ },
2138
+ {
2139
+ "properties": {
2140
+ "timing": {
2141
+ "allOf": [
2142
+ {
2143
+ "$ref": "https://soustack.spec/defs/entities.schema.json#/$defs/StepBase/properties/timing"
2144
+ },
2145
+ {
2146
+ "required": [
2147
+ "activity"
2148
+ ],
2149
+ "anyOf": [
2150
+ {
2151
+ "required": [
2152
+ "duration"
2153
+ ]
2154
+ },
2155
+ {
2156
+ "required": [
2157
+ "completionCue"
2158
+ ]
2159
+ }
2160
+ ]
2161
+ }
2162
+ ]
2163
+ }
2164
+ },
2165
+ "required": [
2166
+ "id",
2167
+ "timing"
2168
+ ]
2169
+ }
2170
+ ]
2171
+ },
2172
+ "timed@1_timedStepSection": {
2173
+ "type": "object",
2174
+ "properties": {
2175
+ "section": {
2176
+ "type": "string"
2177
+ },
2178
+ "steps": {
2179
+ "type": "array",
2180
+ "items": {
2181
+ "anyOf": [
2182
+ {
2183
+ "$ref": "https://soustack.spec/stacks/timed.schema.json#/$defs/timedStep"
2184
+ },
2185
+ {
2186
+ "$ref": "https://soustack.spec/stacks/timed.schema.json#/$defs/timedStepSection"
2187
+ }
2188
+ ]
2189
+ }
2190
+ },
2191
+ "metadata": {
2192
+ "type": "object",
2193
+ "additionalProperties": true
2194
+ }
2195
+ },
2196
+ "required": [
2197
+ "section",
2198
+ "steps"
2199
+ ],
2200
+ "additionalProperties": false,
2201
+ "patternProperties": {
2202
+ "^x-": {
2203
+ "$ref": "https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue"
2204
+ }
2205
+ }
2206
+ },
2207
+ "equipment@1_equipmentItem": {
2208
+ "type": "object",
2209
+ "properties": {
2210
+ "id": {
2211
+ "type": "string",
2212
+ "pattern": "^[A-Za-z0-9._-]+$",
2213
+ "minLength": 1
2214
+ },
2215
+ "name": {
2216
+ "type": "string",
2217
+ "minLength": 1
2218
+ },
2219
+ "count": {
2220
+ "type": "integer",
2221
+ "minimum": 1
2222
+ },
2223
+ "countScaling": {
2224
+ "oneOf": [
2225
+ {
2226
+ "type": "string",
2227
+ "enum": [
2228
+ "fixed",
2229
+ "linear"
2230
+ ]
2231
+ },
2232
+ {
2233
+ "type": "object",
2234
+ "properties": {
2235
+ "mode": {
2236
+ "const": "threshold"
2237
+ },
2238
+ "steps": {
2239
+ "type": "array",
2240
+ "minItems": 1,
2241
+ "items": {
2242
+ "type": "object",
2243
+ "properties": {
2244
+ "maxFactor": {
2245
+ "type": "number",
2246
+ "exclusiveMinimum": 0
2247
+ },
2248
+ "count": {
2249
+ "type": "integer",
2250
+ "minimum": 1
2251
+ }
2252
+ },
2253
+ "required": [
2254
+ "maxFactor",
2255
+ "count"
2256
+ ],
2257
+ "additionalProperties": false
2258
+ }
2259
+ }
2260
+ },
2261
+ "required": [
2262
+ "mode",
2263
+ "steps"
2264
+ ],
2265
+ "additionalProperties": false
2266
+ }
2267
+ ]
2268
+ },
2269
+ "upgrades": {
2270
+ "type": "array",
2271
+ "minItems": 1,
2272
+ "items": {
2273
+ "type": "object",
2274
+ "properties": {
2275
+ "minFactor": {
2276
+ "type": "number",
2277
+ "exclusiveMinimum": 0
2278
+ },
2279
+ "use": {
2280
+ "type": "string",
2281
+ "pattern": "^[A-Za-z0-9._-]+$",
2282
+ "minLength": 1
2283
+ }
2284
+ },
2285
+ "required": [
2286
+ "minFactor",
2287
+ "use"
2288
+ ],
2289
+ "additionalProperties": false
2290
+ }
2291
+ }
2292
+ },
2293
+ "required": [
2294
+ "id",
2295
+ "name"
2296
+ ],
2297
+ "additionalProperties": false,
2298
+ "patternProperties": {
2299
+ "^x-": {
2300
+ "$ref": "https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue"
2301
+ }
2302
+ }
2303
+ },
2304
+ "prep@1_miseEnPlaceTask": {
2305
+ "type": "object",
2306
+ "properties": {
2307
+ "id": {
2308
+ "type": "string",
2309
+ "pattern": "^[A-Za-z0-9._-]+$"
2310
+ },
2311
+ "text": {
2312
+ "type": "string",
2313
+ "minLength": 1
2314
+ },
2315
+ "inputs": {
2316
+ "type": "array",
2317
+ "items": {
2318
+ "type": "string"
2319
+ },
2320
+ "uniqueItems": true,
2321
+ "minItems": 1
2322
+ },
2323
+ "usesEquipment": {
2324
+ "type": "array",
2325
+ "items": {
2326
+ "type": "string",
2327
+ "pattern": "^[A-Za-z0-9._-]+$"
2328
+ },
2329
+ "uniqueItems": true,
2330
+ "minItems": 1
2331
+ }
2332
+ },
2333
+ "required": [
2334
+ "text"
2335
+ ],
2336
+ "additionalProperties": false,
2337
+ "patternProperties": {
2338
+ "^x-": {
2339
+ "$ref": "https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue"
2340
+ }
2341
+ }
2342
+ },
2343
+ "storage@1_leftovers": {
2344
+ "type": "object",
2345
+ "properties": {
2346
+ "notes": {
2347
+ "type": "string"
2348
+ },
2349
+ "reheat": {
2350
+ "oneOf": [
2351
+ {
2352
+ "type": "array",
2353
+ "items": {
2354
+ "type": "string"
2355
+ },
2356
+ "minItems": 1
2357
+ },
2358
+ {
2359
+ "type": "array",
2360
+ "items": {
2361
+ "$ref": "https://soustack.spec/stacks/storage.schema.json#/$defs/reheatInstruction"
2362
+ },
2363
+ "minItems": 1
2364
+ }
2365
+ ]
2366
+ },
2367
+ "portioning": {
2368
+ "$ref": "https://soustack.spec/stacks/storage.schema.json#/$defs/portioning"
2369
+ }
2370
+ },
2371
+ "additionalProperties": false,
2372
+ "patternProperties": {
2373
+ "^x-": {
2374
+ "$ref": "https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue"
2375
+ }
2376
+ }
2377
+ }
2378
+ }
2379
+ }