soustack 0.4.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.
- package/README.md +4 -4
- package/dist/cli/index.js +4412 -1275
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.mts +106 -80
- package/dist/index.d.ts +106 -80
- package/dist/index.js +4527 -1360
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +4527 -1360
- package/dist/index.mjs.map +1 -1
- package/dist/scrape/index.d.mts +86 -74
- package/dist/scrape/index.d.ts +86 -74
- package/dist/scrape/index.js +91 -64
- package/dist/scrape/index.js.map +1 -1
- package/dist/scrape/index.mjs +91 -64
- package/dist/scrape/index.mjs.map +1 -1
- package/package.json +15 -6
- package/spec/.sync-meta.json +149 -0
- package/spec/SOUSTACK_SPEC_VERSION +1 -0
- package/spec/defs/common.schema.json +46 -0
- package/spec/defs/duration.schema.json +33 -0
- package/spec/defs/entities.schema.json +111 -0
- package/spec/defs/ingredientQuantified.schema.json +9 -0
- package/spec/defs/quantity.schema.json +16 -0
- package/spec/defs/scalingRule.schema.json +127 -0
- package/spec/defs/temperature.schema.json +63 -0
- package/spec/fixtures/content/illustrated-step.valid.json +24 -0
- package/spec/fixtures/invalid/equipment-unknown-reference.invalid.json +38 -0
- package/spec/fixtures/invalid/mise-en-place-unknown-equipment.invalid.json +37 -0
- package/spec/fixtures/invalid/mise-en-place-unknown-input.invalid.json +41 -0
- package/spec/fixtures/invalid/storage-leftovers-missing-method.invalid.json +31 -0
- package/spec/fixtures/invalid/storage-leftovers-wrong-type.invalid.json +23 -0
- package/spec/fixtures/level/base-full.valid.json +162 -0
- package/spec/fixtures/level/base-missing-yield.invalid.json +12 -0
- package/spec/fixtures/level/lite-min.valid.json +14 -0
- package/spec/fixtures/profile/profile-base.valid.json +20 -0
- package/spec/fixtures/profile/profile-equipped.valid.json +28 -0
- package/spec/fixtures/profile/profile-illustrated.valid.json +28 -0
- package/spec/fixtures/profile/profile-lite.valid.json +13 -0
- package/spec/fixtures/profile/profile-prepped.valid.json +31 -0
- package/spec/fixtures/profile/profile-scalable-missing-scaling.invalid.json +29 -0
- package/spec/fixtures/profile/profile-scalable.valid.json +49 -0
- package/spec/fixtures/profile/profile-timed-missing-structured.invalid.json +30 -0
- package/spec/fixtures/scaling/bakers-percent-missing-ref.invalid.json +41 -0
- package/spec/fixtures/scaling/bakers-percent.valid.json +51 -0
- package/spec/fixtures/scaling/discrete-range.invalid.json +36 -0
- package/spec/fixtures/scaling/missing-quantified.invalid.json +40 -0
- package/spec/fixtures/scaling/reject-bakersPercentage.invalid.json +50 -0
- package/spec/fixtures/stacks/compute-missing-timed.invalid.json +32 -0
- package/spec/fixtures/stacks/dietary-no-signal.invalid.json +16 -0
- package/spec/fixtures/stacks/illustrated-empty.invalid.json +13 -0
- package/spec/fixtures/stacks/quantified-string.invalid.json +22 -0
- package/spec/fixtures/stacks/referenced-missing-input.invalid.json +32 -0
- package/spec/fixtures/stacks/storage-min.valid.json +20 -0
- package/spec/fixtures/stacks/storage-no-duration.invalid.json +16 -0
- package/spec/fixtures/stacks/timed-implies-structured.valid.json +50 -0
- package/spec/fixtures/stacks/timed-range.invalid.json +33 -0
- package/spec/fixtures/valid/equipment-scaling-rules.valid.json +76 -0
- package/spec/fixtures/valid/equipment-strings.valid.json +31 -0
- package/spec/fixtures/valid/equipment-structured-uses.valid.json +47 -0
- package/spec/fixtures/valid/mise-en-place-basic.valid.json +31 -0
- package/spec/fixtures/valid/mise-en-place-referenced-equipment.valid.json +51 -0
- package/spec/fixtures/valid/prep-ingredient-strings.valid.json +48 -0
- package/spec/fixtures/valid/prep-ingredient-structured.valid.json +45 -0
- package/spec/fixtures/valid/profile-equipped.valid.json +29 -0
- package/spec/fixtures/valid/profile-prepped.valid.json +32 -0
- package/spec/fixtures/valid/quantified-nested-ingredient-sections.valid.json +61 -0
- package/spec/fixtures/valid/referenced-scaling.valid.json +67 -0
- package/spec/fixtures/valid/storage-leftovers-simple.valid.json +27 -0
- package/spec/fixtures/valid/storage-leftovers-structured.valid.json +43 -0
- package/spec/fixtures/valid/structured-nested-step-sections.valid.json +84 -0
- package/spec/schemas/stacks-registry.schema.json +108 -0
- package/spec/soustack.schema.json +2379 -0
- package/spec/stacks/compute.schema.json +7 -0
- package/spec/stacks/compute@1.md +22 -0
- package/spec/stacks/dietary.schema.json +45 -0
- package/spec/stacks/dietary@1.md +24 -0
- package/spec/stacks/equipment.schema.json +98 -0
- package/spec/stacks/equipment@1.md +244 -0
- package/spec/stacks/illustrated.schema.json +54 -0
- package/spec/stacks/illustrated@1.md +24 -0
- package/spec/stacks/prep.schema.json +76 -0
- package/spec/stacks/prep@1.md +276 -0
- package/spec/stacks/quantified.schema.json +74 -0
- package/spec/stacks/quantified@1.md +24 -0
- package/spec/stacks/referenced.schema.json +96 -0
- package/spec/stacks/referenced@1.md +23 -0
- package/spec/stacks/registry.json +112 -0
- package/spec/stacks/scaling.schema.json +99 -0
- package/spec/stacks/scaling@1.md +238 -0
- package/spec/stacks/storage.schema.json +132 -0
- package/spec/stacks/storage@1.md +256 -0
- package/spec/stacks/structured.schema.json +48 -0
- package/spec/stacks/structured@1.md +24 -0
- package/spec/stacks/substitutions.schema.json +43 -0
- package/spec/stacks/substitutions@1.md +24 -0
- package/spec/stacks/techniques.schema.json +28 -0
- package/spec/stacks/techniques@1.md +23 -0
- package/spec/stacks/timed.schema.json +60 -0
- package/spec/stacks/timed@1.md +23 -0
- package/src/defs/common.schema.json +46 -0
- package/src/defs/duration.schema.json +33 -0
- package/src/defs/entities.schema.json +111 -0
- package/src/defs/ingredientQuantified.schema.json +9 -0
- package/src/defs/quantity.schema.json +16 -0
- package/src/defs/scalingRule.schema.json +127 -0
- package/src/defs/temperature.schema.json +63 -0
- package/src/profiles/base.schema.json +2 -2
- package/src/profiles/equipped.schema.json +10 -0
- package/src/profiles/illustrated.schema.json +4 -4
- package/src/profiles/lite.schema.json +10 -0
- package/src/profiles/prepped.schema.json +10 -0
- package/src/profiles/scalable.schema.json +6 -6
- package/src/profiles/timed.schema.json +10 -0
- package/src/schema.json +2271 -248
- package/src/schemas/stacks-registry.schema.json +108 -0
- package/src/soustack.schema.json +2271 -248
- package/src/stacks/compute.schema.json +7 -0
- package/src/stacks/compute@1.md +22 -0
- package/src/stacks/dietary.schema.json +45 -0
- package/src/stacks/dietary@1.md +24 -0
- package/src/stacks/equipment.schema.json +98 -0
- package/src/stacks/equipment@1.md +244 -0
- package/src/stacks/illustrated.schema.json +54 -0
- package/src/stacks/illustrated@1.md +24 -0
- package/src/stacks/prep.schema.json +76 -0
- package/src/stacks/prep@1.md +276 -0
- package/src/stacks/quantified.schema.json +74 -0
- package/src/stacks/quantified@1.md +24 -0
- package/src/stacks/referenced.schema.json +96 -0
- package/src/stacks/referenced@1.md +23 -0
- package/src/stacks/registry.json +112 -0
- package/src/stacks/scaling.schema.json +99 -0
- package/src/stacks/scaling@1.md +238 -0
- package/src/stacks/storage.schema.json +132 -0
- package/src/stacks/storage@1.md +256 -0
- package/src/stacks/structured.schema.json +48 -0
- package/src/stacks/structured@1.md +24 -0
- package/src/stacks/substitutions.schema.json +43 -0
- package/src/stacks/substitutions@1.md +24 -0
- package/src/stacks/techniques.schema.json +28 -0
- package/src/stacks/techniques@1.md +23 -0
- package/src/stacks/timed.schema.json +60 -0
- package/src/stacks/timed@1.md +23 -0
- package/src/profiles/cookable.schema.json +0 -18
- package/src/profiles/quantified.schema.json +0 -43
- package/src/profiles/schedulable.schema.json +0 -43
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/parsers/duration.ts","../src/parser.ts","../src/normalize.ts","../src/conformance/index.ts","../src/soustack.schema.json","../src/schemas/recipe/base.schema.json","../src/schemas/recipe/profiles/minimal.schema.json","../src/schemas/recipe/profiles/core.schema.json","../spec/profiles/base.schema.json","../spec/profiles/cookable.schema.json","../spec/profiles/illustrated.schema.json","../spec/profiles/quantified.schema.json","../spec/profiles/scalable.schema.json","../spec/profiles/schedulable.schema.json","../src/schemas/recipe/stacks/attribution/1.schema.json","../src/schemas/recipe/stacks/media/1.schema.json","../src/schemas/recipe/stacks/nutrition/1.schema.json","../src/schemas/recipe/stacks/schedule/1.schema.json","../src/schemas/recipe/stacks/taxonomy/1.schema.json","../src/schemas/recipe/stacks/times/1.schema.json","../src/validator.ts","../src/converters/yield.ts","../src/utils/image.ts","../src/fromSchemaOrg.ts","../src/schemas/registry/stacks.json","../src/converters/toSchemaOrg.ts","../src/scraper/extractors/utils.ts","../src/scraper/extractors/browser.ts","../src/scraper/browser.ts","../src/specVersion.ts","../src/conversion/units.ts","../src/conversion/convertLineItem.ts","../src/mise-en-place/index.ts"],"names":["base_schema_default","schema_default","Ajv2020","addFormats","convertIngredients","value","convertInstructions","trimmed","convertTime","result","convertNutrition"],"mappings":"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","file":"index.js","sourcesContent":["const ISO_DURATION_REGEX =\n /^P(?:(\\d+(?:\\.\\d+)?)D)?(?:T(?:(\\d+(?:\\.\\d+)?)H)?(?:(\\d+(?:\\.\\d+)?)M)?(?:(\\d+(?:\\.\\d+)?)S)?)?$/i;\n\nconst HUMAN_OVERNIGHT = 8 * 60; // 8 hours\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\n\nexport function parseDuration(iso: string | number): number | null;\nexport function parseDuration(iso: string | number | null | undefined): number | null;\nexport function parseDuration(iso: string | number | null | undefined): number | null {\n if (typeof iso === 'number' && Number.isFinite(iso)) {\n return iso;\n }\n\n if (!iso || typeof iso !== 'string') return null;\n\n const trimmed = iso.trim();\n if (!trimmed) return null;\n\n const match = trimmed.match(ISO_DURATION_REGEX);\n if (!match) return null;\n\n const [, daysRaw, hoursRaw, minutesRaw, secondsRaw] = match;\n\n if (!daysRaw && !hoursRaw && !minutesRaw && !secondsRaw) {\n return null;\n }\n\n let total = 0;\n if (daysRaw) total += parseFloat(daysRaw) * 24 * 60;\n if (hoursRaw) total += parseFloat(hoursRaw) * 60;\n if (minutesRaw) total += parseFloat(minutesRaw);\n if (secondsRaw) total += Math.ceil(parseFloat(secondsRaw) / 60);\n\n return Math.round(total);\n}\n\nexport function formatDuration(minutes: number): string;\nexport function formatDuration(minutes: number | null | undefined): string;\nexport function formatDuration(minutes: number | null | undefined): string {\n if (!isFiniteNumber(minutes) || minutes <= 0) {\n return 'PT0M';\n }\n\n const rounded = Math.round(minutes);\n const days = Math.floor(rounded / (24 * 60));\n const afterDays = rounded % (24 * 60);\n const hours = Math.floor(afterDays / 60);\n const mins = afterDays % 60;\n\n let result = 'P';\n\n if (days > 0) {\n result += `${days}D`;\n }\n\n if (hours > 0 || mins > 0) {\n result += 'T';\n if (hours > 0) {\n result += `${hours}H`;\n }\n if (mins > 0) {\n result += `${mins}M`;\n }\n }\n\n if (result === 'P') {\n return 'PT0M';\n }\n\n return result;\n}\n\nexport function parseHumanDuration(text: string): number | null;\nexport function parseHumanDuration(text: string | null | undefined): number | null;\nexport function parseHumanDuration(text: string | null | undefined): number | null {\n if (!text || typeof text !== 'string') return null;\n\n const normalized = text.toLowerCase().trim();\n if (!normalized) return null;\n\n if (normalized === 'overnight') {\n return HUMAN_OVERNIGHT;\n }\n\n let total = 0;\n\n const hourRegex = /(\\d+(?:\\.\\d+)?)\\s*(?:hours?|hrs?|hr|h)\\b/g;\n let hourMatch: RegExpExecArray | null;\n while ((hourMatch = hourRegex.exec(normalized)) !== null) {\n total += parseFloat(hourMatch[1]) * 60;\n }\n\n const minuteRegex = /(\\d+(?:\\.\\d+)?)\\s*(?:minutes?|mins?|min|m)\\b/g;\n let minuteMatch: RegExpExecArray | null;\n while ((minuteMatch = minuteRegex.exec(normalized)) !== null) {\n total += parseFloat(minuteMatch[1]);\n }\n\n if (total <= 0) {\n return null;\n }\n\n return Math.round(total);\n}\n\nexport function smartParseDuration(input: string): number | null;\nexport function smartParseDuration(input: string | null | undefined): number | null;\nexport function smartParseDuration(input: string | null | undefined): number | null {\n const iso = parseDuration(input);\n if (iso !== null) {\n return iso;\n }\n return parseHumanDuration(input);\n}\n","import {\n Recipe,\n Ingredient,\n IngredientItem,\n Instruction,\n InstructionItem\n} from './types';\nimport { parseDuration } from './parsers/duration';\n\n// --- Output Types ---\n\nexport interface ScaleRecipeOptions {\n multiplier?: number;\n targetYield?: {\n amount: number;\n unit?: string;\n };\n}\n\n// --- Main Logic ---\n\nexport function scaleRecipe(recipe: Recipe, options: ScaleRecipeOptions = {}): Recipe {\n const multiplier = resolveMultiplier(recipe, options);\n const scaled: Recipe = deepClone(recipe);\n\n applyYieldScaling(scaled, options, multiplier);\n\n const baseAmounts = collectBaseIngredientAmounts(scaled.ingredients || []);\n const scaledAmounts = new Map<string, number>();\n const orderedIngredients: Ingredient[] = [];\n\n collectIngredients(scaled.ingredients || [], orderedIngredients);\n\n orderedIngredients\n .filter(ing => (ing.scaling?.type || 'linear') !== 'bakers_percentage')\n .forEach(ing => {\n const key = getIngredientKey(ing);\n scaledAmounts.set(key, calculateIndependentIngredient(ing, multiplier));\n });\n\n orderedIngredients\n .filter(ing => ing.scaling?.type === 'bakers_percentage')\n .forEach(ing => {\n const key = getIngredientKey(ing);\n const scaling = ing.scaling as { referenceId?: string; factor?: number } | undefined;\n\n if (!scaling?.referenceId) {\n throw new Error(`Baker's percentage ingredient \"${key}\" is missing a referenceId`);\n }\n\n const referenceAmount = scaledAmounts.get(scaling.referenceId);\n if (referenceAmount === undefined) {\n throw new Error(`Reference ingredient \"${scaling.referenceId}\" not found for baker's percentage item \"${key}\"`);\n }\n\n const baseAmount = ing.quantity?.amount || 0;\n const referenceBase = baseAmounts.get(scaling.referenceId);\n const factor = scaling.factor ?? (referenceBase ? baseAmount / referenceBase : undefined);\n if (factor === undefined) {\n throw new Error(`Unable to determine factor for baker's percentage ingredient \"${key}\"`);\n }\n\n scaledAmounts.set(key, referenceAmount * factor);\n });\n\n orderedIngredients.forEach(ing => {\n const key = getIngredientKey(ing);\n const amount = scaledAmounts.get(key);\n if (amount === undefined) return;\n\n if (!ing.quantity) {\n ing.quantity = { amount, unit: null };\n } else {\n ing.quantity.amount = amount;\n }\n });\n\n scaleInstructionItems(scaled.instructions || [], multiplier);\n\n return scaled;\n}\n\n// --- Helper Functions ---\n\nfunction resolveMultiplier(recipe: Recipe, options: ScaleRecipeOptions): number {\n if (options.multiplier && options.multiplier > 0) {\n return options.multiplier;\n }\n\n if (options.targetYield?.amount) {\n const base = recipe.yield?.amount || 1;\n return options.targetYield.amount / base;\n }\n\n return 1;\n}\n\nfunction applyYieldScaling(recipe: Recipe, options: ScaleRecipeOptions, multiplier: number) {\n const baseAmount = recipe.yield?.amount ?? 1;\n const targetAmount = options.targetYield?.amount ?? baseAmount * multiplier;\n const unit = options.targetYield?.unit ?? recipe.yield?.unit;\n\n if (!recipe.yield && !options.targetYield) return;\n\n recipe.yield = {\n amount: targetAmount,\n unit: unit ?? ''\n } as any;\n}\n\nfunction getIngredientKey(ing: Ingredient): string {\n return ing.id || ing.item;\n}\n\nfunction calculateIndependentIngredient(ing: Ingredient, multiplier: number): number {\n const baseAmount = ing.quantity?.amount || 0;\n const type = ing.scaling?.type || 'linear';\n\n switch (type) {\n case 'fixed':\n return baseAmount;\n case 'discrete': {\n const scaled = baseAmount * multiplier;\n const step = (ing.scaling as any)?.roundTo ?? 1;\n const rounded = Math.round(scaled / step) * step;\n return Math.round(rounded);\n }\n case 'proportional': {\n const factor = (ing.scaling as any)?.factor ?? 1;\n return baseAmount * multiplier * factor;\n }\n default:\n return baseAmount * multiplier;\n }\n}\n\nfunction collectIngredients(items: IngredientItem[], bucket: Ingredient[]) {\n items.forEach(item => {\n if (typeof item === 'string') return;\n if ('subsection' in item) {\n collectIngredients(item.items, bucket);\n } else {\n bucket.push(item);\n }\n });\n}\n\nfunction collectBaseIngredientAmounts(items: IngredientItem[], map = new Map<string, number>()) {\n items.forEach(item => {\n if (typeof item === 'string') return;\n if ('subsection' in item) {\n collectBaseIngredientAmounts(item.items, map);\n } else {\n map.set(getIngredientKey(item), item.quantity?.amount ?? 0);\n }\n });\n return map;\n}\n\nfunction scaleInstructionItems(items: InstructionItem[], multiplier: number) {\n items.forEach(item => {\n if (typeof item === 'string') return;\n\n if ('subsection' in item) {\n scaleInstructionItems(item.items, multiplier);\n return;\n }\n\n const timing = item.timing;\n if (!timing) return;\n\n const baseDuration = toDurationMinutes(timing.duration);\n const scalingType = timing.scaling || 'fixed';\n let newDuration = baseDuration;\n\n if (scalingType === 'linear') {\n newDuration = baseDuration * multiplier;\n } else if (scalingType === 'sqrt') {\n newDuration = baseDuration * Math.sqrt(multiplier);\n }\n\n timing.duration = Math.ceil(newDuration);\n });\n}\n\nfunction deepClone<T>(value: T): T {\n return JSON.parse(JSON.stringify(value));\n}\n\nfunction toDurationMinutes(duration?: number | string): number {\n if (typeof duration === 'number' && Number.isFinite(duration)) {\n return duration;\n }\n\n if (typeof duration === 'string' && duration.trim().startsWith('P')) {\n const parsed = parseDuration(duration.trim());\n if (parsed !== null) {\n return parsed;\n }\n }\n\n return 0;\n}","import { parseDuration } from './parsers/duration';\nimport { Recipe } from './types';\n\nexport interface NormalizationResult {\n recipe: Recipe;\n warnings: string[];\n}\n\n/**\n * Normalizes a recipe input to the current spec format:\n * - Rejects inputs with legacy field (unsupported)\n * - Converts legacy `stacks` array format to map format\n * - Ensures `stacks` exists even if empty\n * - Preserves existing `stacks` map format\n * \n * @param input - Raw recipe input (may have legacy formats)\n * @returns Normalized recipe with warnings for any issues encountered\n * @throws Error if input contains legacy field\n */\nexport function normalizeRecipe(input: unknown): NormalizationResult {\n if (!input || typeof input !== 'object') {\n throw new Error('Recipe input must be an object');\n }\n\n const recipe = JSON.parse(JSON.stringify(input)) as any;\n const warnings: string[] = [];\n\n // Reject inputs with legacy field\n const legacyField = [\"mod\", \"ules\"].join(\"\");\n if (legacyField in recipe) {\n throw new Error('The legacy field is no longer supported. Use `stacks` instead.');\n }\n\n // Normalize stacks from legacy array format\n normalizeStacks(recipe, warnings);\n\n // Ensure stacks exists (even if empty)\n if (!recipe.stacks) {\n recipe.stacks = {};\n }\n\n // Normalize deprecated version field\n if (\n recipe &&\n typeof recipe === 'object' &&\n 'version' in recipe &&\n !(recipe as any).recipeVersion &&\n typeof (recipe as any).version === 'string'\n ) {\n (recipe as any).recipeVersion = (recipe as any).version;\n warnings.push(\"'version' is deprecated; mapped to 'recipeVersion'.\");\n }\n\n // Normalize time\n normalizeTime(recipe);\n\n return {\n recipe: recipe as Recipe,\n warnings,\n };\n}\n\n/**\n * Normalizes the stacks field from legacy formats to the map format.\n * Handles:\n * - Legacy `stacks` array: [\"scaling@1\"] -> { scaling: 1 }\n * - Existing `stacks` map: { scaling: 1 } -> preserved as-is\n */\nfunction normalizeStacks(recipe: any, warnings: string[]): void {\n // Start with existing stacks map if valid\n let stacks: Record<string, number> = {};\n if (recipe.stacks && typeof recipe.stacks === 'object' && !Array.isArray(recipe.stacks)) {\n // Validate that all values are numbers and copy valid entries\n for (const [key, value] of Object.entries(recipe.stacks)) {\n if (typeof value === 'number' && Number.isInteger(value) && value >= 1) {\n stacks[key] = value;\n } else {\n warnings.push(`Invalid stack version for '${key}': expected positive integer, got ${value}`);\n }\n }\n }\n\n // Check legacy stacks array format (only if stacks wasn't already a map)\n if (Array.isArray(recipe.stacks)) {\n const stackIdentifiers: string[] = recipe.stacks.filter((s: any) => typeof s === 'string');\n\n // Parse stack identifiers into stacks map and merge with existing stacks\n for (const identifier of stackIdentifiers) {\n const parsed = parseStackIdentifier(identifier);\n if (parsed) {\n const { name, version } = parsed;\n // If the same stack appears multiple times, keep the highest version\n if (!stacks[name] || stacks[name] < version) {\n stacks[name] = version;\n }\n } else {\n warnings.push(`Invalid stack identifier '${identifier}': expected format 'name@version' (e.g., 'scaling@1')`);\n }\n }\n }\n\n // Set the normalized stacks\n recipe.stacks = stacks;\n}\n\n/**\n * Parses a stack identifier string like \"scaling@1\" into { name: \"scaling\", version: 1 }\n * Returns null if the format is invalid.\n */\nfunction parseStackIdentifier(identifier: string): { name: string; version: number } | null {\n if (typeof identifier !== 'string' || !identifier.trim()) {\n return null;\n }\n\n const match = identifier.trim().match(/^([a-z0-9_-]+)@(\\d+)$/i);\n if (!match) {\n return null;\n }\n\n const [, name, versionStr] = match;\n const version = parseInt(versionStr, 10);\n\n if (isNaN(version) || version < 1) {\n return null;\n }\n\n return { name, version };\n}\n\nfunction normalizeTime(recipe: Recipe): void {\n const time = (recipe as any)?.time;\n if (!time || typeof time !== 'object' || Array.isArray(time)) return;\n\n const structuredKeys: Array<'prep' | 'active' | 'passive' | 'total'> = [\n 'prep',\n 'active',\n 'passive',\n 'total',\n ];\n\n structuredKeys.forEach((key) => {\n const value = (time as any)[key];\n if (typeof value === 'number') return;\n\n const parsed = parseDuration(value as any);\n if (parsed !== null) {\n (time as any)[key] = parsed;\n }\n });\n}\n","import { Recipe, Instruction, Ingredient, IngredientItem, InstructionItem } from \"../types\";\n\nexport type ConformanceSeverity = \"error\" | \"warning\";\n\nexport interface ConformanceIssue {\n code: string;\n path: string;\n message: string;\n severity: ConformanceSeverity;\n}\n\nexport interface ConformanceResult {\n ok: boolean;\n issues: ConformanceIssue[];\n}\n\n/**\n * Validates semantic conformance rules that cannot be expressed in JSON Schema.\n * This includes DAG validity, timing schedulability, and scaling sanity checks.\n */\nexport function validateConformance(recipe: Recipe): ConformanceResult {\n const issues: ConformanceIssue[] = [];\n\n // Check DAG validity for step dependencies\n issues.push(...checkDAGValidity(recipe));\n\n // Check timing schedulability if schedulable profile is present\n if (hasSchedulableProfile(recipe)) {\n issues.push(...checkTimingSchedulability(recipe));\n }\n\n // Check scaling sanity (baker's percentage references)\n issues.push(...checkScalingSanity(recipe));\n\n const ok = issues.filter((i) => i.severity === \"error\").length === 0;\n\n return { ok, issues };\n}\n\n/**\n * Checks if recipe uses the schedulable profile.\n * This is detected via $schema field pointing to the schedulable profile schema.\n */\nfunction hasSchedulableProfile(recipe: Recipe): boolean {\n const schema = (recipe as any).$schema;\n if (typeof schema === \"string\") {\n // Check for schedulable profile schema ID\n return (\n schema.includes(\"schedulable\") ||\n schema === \"http://soustack.org/schema/v0.3.0/profiles/schedulable\"\n );\n }\n return false;\n}\n\n/**\n * Validates DAG (Directed Acyclic Graph) properties of step dependencies:\n * - dependsOn references must point to valid step IDs\n * - No cycles in the dependency graph\n * - No orphaned referenced IDs (all referenced IDs must exist)\n */\nfunction checkDAGValidity(recipe: Recipe): ConformanceIssue[] {\n const issues: ConformanceIssue[] = [];\n const instructions = recipe.instructions;\n if (!Array.isArray(instructions)) {\n return issues;\n }\n\n const instructionIds = new Set<string>();\n const dependencyRefs: { fromId?: string; toId: string; path: string }[] = [];\n\n // Collect all instruction IDs and dependencies\n const collect = (items: InstructionItem[], basePath: string) => {\n items.forEach((item, index) => {\n const currentPath = `${basePath}/${index}`;\n\n if (isInstructionSubsection(item)) {\n if (Array.isArray(item.items)) {\n collect(item.items, `${currentPath}/items`);\n }\n return;\n }\n\n if (isInstruction(item)) {\n const id = typeof item.id === \"string\" ? item.id : undefined;\n if (id) {\n instructionIds.add(id);\n }\n\n if (Array.isArray(item.dependsOn)) {\n item.dependsOn.forEach((depId, depIndex) => {\n if (typeof depId === \"string\") {\n dependencyRefs.push({\n fromId: id,\n toId: depId,\n path: `${currentPath}/dependsOn/${depIndex}`,\n });\n }\n });\n }\n }\n });\n };\n\n collect(instructions, \"/instructions\");\n\n // Check for missing referenced IDs\n dependencyRefs.forEach((ref) => {\n if (!instructionIds.has(ref.toId)) {\n issues.push({\n code: \"DAG_MISSING_NODE\",\n path: ref.path,\n message: `Instruction dependency references missing step id '${ref.toId}'.`,\n severity: \"error\",\n });\n }\n });\n\n // Check for cycles using DFS\n const adjacency = new Map<string, { toId: string; path: string }[]>();\n dependencyRefs.forEach((ref) => {\n if (ref.fromId && instructionIds.has(ref.fromId) && instructionIds.has(ref.toId)) {\n const list = adjacency.get(ref.fromId) ?? [];\n list.push({ toId: ref.toId, path: ref.path });\n adjacency.set(ref.fromId, list);\n }\n });\n\n const visiting = new Set<string>();\n const visited = new Set<string>();\n\n const detectCycles = (nodeId: string) => {\n if (visiting.has(nodeId)) {\n // Cycle detected - find the edge that completes the cycle\n return;\n }\n if (visited.has(nodeId)) {\n return;\n }\n\n visiting.add(nodeId);\n const neighbors = adjacency.get(nodeId) ?? [];\n neighbors.forEach((edge) => {\n if (visiting.has(edge.toId)) {\n issues.push({\n code: \"DAG_CYCLE\",\n path: edge.path,\n message: `Circular dependency detected involving step id '${edge.toId}'.`,\n severity: \"error\",\n });\n return;\n }\n detectCycles(edge.toId);\n });\n visiting.delete(nodeId);\n visited.add(nodeId);\n };\n\n instructionIds.forEach((id) => detectCycles(id));\n\n return issues;\n}\n\n/**\n * Validates timing schedulability rules for schedulable profile:\n * - Each step must be placeable on a timeline\n * - Either timing.duration exists OR completionCue includes an estimated duration\n * For now, we check that timing.duration exists (completionCue is not in the spec yet)\n */\nfunction checkTimingSchedulability(recipe: Recipe): ConformanceIssue[] {\n const issues: ConformanceIssue[] = [];\n const instructions = recipe.instructions;\n if (!Array.isArray(instructions)) {\n return issues;\n }\n\n const checkInstruction = (item: InstructionItem, path: string): void => {\n if (isInstructionSubsection(item)) {\n if (Array.isArray(item.items)) {\n item.items.forEach((subItem, index) => {\n checkInstruction(subItem, `${path}/items/${index}`);\n });\n }\n return;\n }\n\n if (isInstruction(item)) {\n // Schedulable profile requires id and timing\n if (!item.id) {\n issues.push({\n code: \"SCHEDULABLE_MISSING_ID\",\n path: path,\n message: \"Schedulable profile requires all instructions to have an id.\",\n severity: \"error\",\n });\n }\n\n if (!item.timing) {\n issues.push({\n code: \"SCHEDULABLE_MISSING_TIMING\",\n path: path,\n message: \"Schedulable profile requires all instructions to have timing information.\",\n severity: \"error\",\n });\n } else if (!item.timing.duration) {\n issues.push({\n code: \"SCHEDULABLE_MISSING_DURATION\",\n path: `${path}/timing`,\n message: \"Schedulable profile requires timing.duration for all instructions.\",\n severity: \"error\",\n });\n }\n }\n };\n\n instructions.forEach((item, index) => {\n checkInstruction(item, `/instructions/${index}`);\n });\n\n return issues;\n}\n\n/**\n * Validates scaling sanity:\n * - Any baker's percentage references must resolve to an ingredient present in recipe\n */\nfunction checkScalingSanity(recipe: Recipe): ConformanceIssue[] {\n const issues: ConformanceIssue[] = [];\n const ingredients = recipe.ingredients;\n if (!Array.isArray(ingredients)) {\n return issues;\n }\n\n // Collect all ingredient IDs\n const ingredientIds = new Set<string>();\n const collectIngredientIds = (items: IngredientItem[], basePath: string) => {\n items.forEach((item, index) => {\n const currentPath = `${basePath}/${index}`;\n\n if (isIngredientSubsection(item)) {\n if (Array.isArray(item.items)) {\n collectIngredientIds(item.items, `${currentPath}/items`);\n }\n return;\n }\n\n if (isIngredient(item)) {\n if (typeof item.id === \"string\") {\n ingredientIds.add(item.id);\n }\n }\n });\n };\n\n collectIngredientIds(ingredients, \"/ingredients\");\n\n // Check baker's percentage references\n const checkIngredient = (item: IngredientItem, path: string): void => {\n if (isIngredientSubsection(item)) {\n if (Array.isArray(item.items)) {\n item.items.forEach((subItem, index) => {\n checkIngredient(subItem, `${path}/items/${index}`);\n });\n }\n return;\n }\n\n if (isIngredient(item)) {\n const scaling = item.scaling;\n if (\n scaling &&\n typeof scaling === \"object\" &&\n \"type\" in scaling &&\n scaling.type === \"bakers_percentage\"\n ) {\n const bakersScaling = scaling as { referenceId?: string };\n if (bakersScaling.referenceId) {\n if (!ingredientIds.has(bakersScaling.referenceId)) {\n issues.push({\n code: \"SCALING_INVALID_REFERENCE\",\n path: `${path}/scaling/referenceId`,\n message: `Baker's percentage references missing ingredient id '${bakersScaling.referenceId}'.`,\n severity: \"error\",\n });\n }\n } else {\n issues.push({\n code: \"SCALING_MISSING_REFERENCE\",\n path: `${path}/scaling`,\n message: \"Baker's percentage scaling requires a referenceId.\",\n severity: \"error\",\n });\n }\n }\n }\n };\n\n ingredients.forEach((item, index) => {\n checkIngredient(item, `/ingredients/${index}`);\n });\n\n return issues;\n}\n\n// Type guards\nfunction isInstruction(item: any): item is Instruction {\n return item && typeof item === \"object\" && !Array.isArray(item) && \"text\" in item;\n}\n\nfunction isInstructionSubsection(item: any): item is { items: any[]; subsection: string } {\n return (\n item &&\n typeof item === \"object\" &&\n !Array.isArray(item) &&\n \"items\" in item &&\n \"subsection\" in item\n );\n}\n\nfunction isIngredient(item: any): item is Ingredient {\n return item && typeof item === \"object\" && !Array.isArray(item) && \"item\" in item;\n}\n\nfunction isIngredientSubsection(item: any): item is { items: any[]; subsection: string } {\n return (\n item &&\n typeof item === \"object\" &&\n !Array.isArray(item) &&\n \"items\" in item &&\n \"subsection\" in item\n );\n}\n\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/v0.3.0\",\n \"title\": \"Soustack Recipe Schema v0.3.0\",\n \"description\": \"A portable, scalable, interoperable recipe format.\",\n \"type\": \"object\",\n \"required\": [\"name\", \"ingredients\", \"instructions\"],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": {}\n },\n \"properties\": {\n \"$schema\": {\n \"type\": \"string\",\n \"format\": \"uri\",\n \"description\": \"Optional schema hint for tooling compatibility\"\n },\n \"id\": {\n \"type\": \"string\",\n \"description\": \"Unique identifier (slug or UUID)\"\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"The title of the recipe\"\n },\n \"title\": {\n \"type\": \"string\",\n \"description\": \"Optional display title; alias for name\"\n },\n \"version\": {\n \"type\": \"string\",\n \"pattern\": \"^\\\\d+\\\\.\\\\d+\\\\.\\\\d+$\",\n \"description\": \"DEPRECATED: use recipeVersion for authoring revisions\"\n },\n \"recipeVersion\": {\n \"type\": \"string\",\n \"pattern\": \"^\\\\d+\\\\.\\\\d+\\\\.\\\\d+$\",\n \"description\": \"Recipe content revision (semantic versioning, e.g., 1.0.0)\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"category\": {\n \"type\": \"string\",\n \"examples\": [\"Main Course\", \"Dessert\"]\n },\n \"tags\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" }\n },\n \"image\": {\n \"description\": \"Recipe-level hero image(s)\",\n \"anyOf\": [\n {\n \"type\": \"string\",\n \"format\": \"uri\"\n },\n {\n \"type\": \"array\",\n \"minItems\": 1,\n \"items\": {\n \"type\": \"string\",\n \"format\": \"uri\"\n }\n }\n ]\n },\n \"dateAdded\": {\n \"type\": \"string\",\n \"format\": \"date-time\"\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true,\n \"description\": \"Free-form vendor metadata\"\n },\n \"source\": {\n \"type\": \"object\",\n \"properties\": {\n \"author\": { \"type\": \"string\" },\n \"url\": { \"type\": \"string\", \"format\": \"uri\" },\n \"name\": { \"type\": \"string\" },\n \"adapted\": { \"type\": \"boolean\" }\n }\n },\n \"yield\": {\n \"$ref\": \"#/definitions/yield\"\n },\n \"time\": {\n \"$ref\": \"#/definitions/time\"\n },\n \"equipment\": {\n \"type\": \"array\",\n \"items\": { \"$ref\": \"#/definitions/equipment\" }\n },\n \"ingredients\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n { \"type\": \"string\" },\n { \"$ref\": \"#/definitions/ingredient\" },\n { \"$ref\": \"#/definitions/ingredientSubsection\" }\n ]\n }\n },\n \"instructions\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n { \"type\": \"string\" },\n { \"$ref\": \"#/definitions/instruction\" },\n { \"$ref\": \"#/definitions/instructionSubsection\" }\n ]\n }\n },\n \"storage\": {\n \"$ref\": \"#/definitions/storage\"\n },\n \"substitutions\": {\n \"type\": \"array\",\n \"items\": { \"$ref\": \"#/definitions/substitution\" }\n }\n },\n \"definitions\": {\n \"yield\": {\n \"type\": \"object\",\n \"required\": [\"amount\", \"unit\"],\n \"properties\": {\n \"amount\": { \"type\": \"number\" },\n \"unit\": { \"type\": \"string\" },\n \"servings\": { \"type\": \"number\" },\n \"description\": { \"type\": \"string\" }\n }\n },\n \"time\": {\n \"type\": \"object\",\n \"properties\": {\n \"prep\": { \"type\": \"number\" },\n \"active\": { \"type\": \"number\" },\n \"passive\": { \"type\": \"number\" },\n \"total\": { \"type\": \"number\" },\n \"prepTime\": { \"type\": \"string\", \"format\": \"duration\" },\n \"cookTime\": { \"type\": \"string\", \"format\": \"duration\" }\n },\n \"minProperties\": 1\n },\n \"quantity\": {\n \"type\": \"object\",\n \"required\": [\"amount\"],\n \"properties\": {\n \"amount\": { \"type\": \"number\" },\n \"unit\": {\n \"type\": [\"string\", \"null\"],\n \"description\": \"Display-friendly unit text; implementations may normalize or canonicalize units separately.\"\n }\n }\n },\n \"scaling\": {\n \"type\": \"object\",\n \"required\": [\"type\"],\n \"properties\": {\n \"type\": {\n \"type\": \"string\",\n \"enum\": [\"linear\", \"discrete\", \"proportional\", \"fixed\", \"bakers_percentage\"]\n },\n \"factor\": { \"type\": \"number\" },\n \"referenceId\": { \"type\": \"string\" },\n \"roundTo\": { \"type\": \"number\" },\n \"min\": { \"type\": \"number\" },\n \"max\": { \"type\": \"number\" }\n },\n \"if\": {\n \"properties\": { \"type\": { \"const\": \"bakers_percentage\" } }\n },\n \"then\": {\n \"required\": [\"referenceId\"]\n }\n },\n \"ingredient\": {\n \"type\": \"object\",\n \"required\": [\"item\"],\n \"properties\": {\n \"id\": { \"type\": \"string\" },\n \"item\": { \"type\": \"string\" },\n \"quantity\": { \"$ref\": \"#/definitions/quantity\" },\n \"name\": { \"type\": \"string\" },\n \"aisle\": { \"type\": \"string\" },\n \"prep\": { \"type\": \"string\" },\n \"prepAction\": { \"type\": \"string\" },\n \"prepActions\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" },\n \"description\": \"Structured prep verbs (e.g., peel, dice) for mise en place workflows.\"\n },\n \"prepTime\": { \"type\": \"number\" },\n \"form\": {\n \"type\": \"string\",\n \"description\": \"State of the ingredient as used (packed, sifted, melted, room_temperature, etc.).\"\n },\n \"destination\": { \"type\": \"string\" },\n \"scaling\": { \"$ref\": \"#/definitions/scaling\" },\n \"critical\": { \"type\": \"boolean\" },\n \"optional\": { \"type\": \"boolean\" },\n \"notes\": { \"type\": \"string\" }\n }\n },\n \"ingredientSubsection\": {\n \"type\": \"object\",\n \"required\": [\"subsection\", \"items\"],\n \"properties\": {\n \"subsection\": { \"type\": \"string\" },\n \"items\": {\n \"type\": \"array\",\n \"items\": { \"$ref\": \"#/definitions/ingredient\" }\n }\n }\n },\n \"equipment\": {\n \"type\": \"object\",\n \"required\": [\"name\"],\n \"properties\": {\n \"id\": { \"type\": \"string\" },\n \"name\": { \"type\": \"string\" },\n \"required\": { \"type\": \"boolean\" },\n \"label\": { \"type\": \"string\" },\n \"capacity\": { \"$ref\": \"#/definitions/quantity\" },\n \"scalingLimit\": { \"type\": \"number\" },\n \"alternatives\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" }\n }\n }\n },\n \"instruction\": {\n \"type\": \"object\",\n \"required\": [\"text\"],\n \"properties\": {\n \"id\": { \"type\": \"string\" },\n \"text\": { \"type\": \"string\" },\n \"image\": {\n \"type\": \"string\",\n \"format\": \"uri\",\n \"description\": \"Optional image that illustrates this instruction\"\n },\n \"destination\": { \"type\": \"string\" },\n \"dependsOn\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" }\n },\n \"inputs\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" }\n },\n \"timing\": {\n \"type\": \"object\",\n \"required\": [\"duration\", \"type\"],\n \"properties\": {\n \"duration\": {\n \"anyOf\": [\n { \"type\": \"number\" },\n { \"type\": \"string\", \"pattern\": \"^P\" }\n ],\n \"description\": \"Minutes as a number or ISO8601 duration string\"\n },\n \"type\": { \"type\": \"string\", \"enum\": [\"active\", \"passive\"] },\n \"scaling\": { \"type\": \"string\", \"enum\": [\"linear\", \"fixed\", \"sqrt\"] }\n }\n }\n }\n },\n \"instructionSubsection\": {\n \"type\": \"object\",\n \"required\": [\"subsection\", \"items\"],\n \"properties\": {\n \"subsection\": { \"type\": \"string\" },\n \"items\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n { \"type\": \"string\" },\n { \"$ref\": \"#/definitions/instruction\" }\n ]\n }\n }\n }\n },\n \"storage\": {\n \"type\": \"object\",\n \"properties\": {\n \"roomTemp\": { \"$ref\": \"#/definitions/storageMethod\" },\n \"refrigerated\": { \"$ref\": \"#/definitions/storageMethod\" },\n \"frozen\": {\n \"allOf\": [\n { \"$ref\": \"#/definitions/storageMethod\" },\n {\n \"type\": \"object\",\n \"properties\": { \"thawing\": { \"type\": \"string\" } }\n }\n ]\n },\n \"reheating\": { \"type\": \"string\" },\n \"makeAhead\": {\n \"type\": \"array\",\n \"items\": {\n \"allOf\": [\n { \"$ref\": \"#/definitions/storageMethod\" },\n {\n \"type\": \"object\",\n \"required\": [\"component\", \"storage\"],\n \"properties\": {\n \"component\": { \"type\": \"string\" },\n \"storage\": { \"type\": \"string\", \"enum\": [\"roomTemp\", \"refrigerated\", \"frozen\"] }\n }\n }\n ]\n }\n }\n }\n },\n \"storageMethod\": {\n \"type\": \"object\",\n \"required\": [\"duration\"],\n \"properties\": {\n \"duration\": { \"type\": \"string\", \"pattern\": \"^P\" },\n \"method\": { \"type\": \"string\" },\n \"notes\": { \"type\": \"string\" }\n }\n },\n \"substitution\": {\n \"type\": \"object\",\n \"required\": [\"ingredient\"],\n \"properties\": {\n \"ingredient\": { \"type\": \"string\" },\n \"critical\": { \"type\": \"boolean\" },\n \"notes\": { \"type\": \"string\" },\n \"alternatives\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"required\": [\"name\", \"ratio\"],\n \"properties\": {\n \"name\": { \"type\": \"string\" },\n \"ratio\": { \"type\": \"string\" },\n \"notes\": { \"type\": \"string\" },\n \"impact\": { \"type\": \"string\" },\n \"dietary\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" }\n }\n }\n }\n }\n }\n }\n }\n}","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/recipe/base.schema.json\",\n \"title\": \"Soustack Recipe Base Schema\",\n \"description\": \"Base document shape for Soustack recipe documents. Profiles and stacks build on this baseline.\",\n \"type\": \"object\",\n \"additionalProperties\": true,\n \"properties\": {\n \"@type\": {\n \"const\": \"Recipe\",\n \"description\": \"Document marker for Soustack recipes\"\n },\n \"profile\": {\n \"type\": \"string\",\n \"description\": \"Profile identifier applied to this recipe\"\n },\n \"stacks\": {\n \"type\": \"object\",\n \"description\": \"Stack declarations as a map: Record<stackName, versionNumber>\",\n \"additionalProperties\": {\n \"type\": \"integer\",\n \"minimum\": 1\n }\n },\n \"name\": {\n \"type\": \"string\",\n \"description\": \"Human-readable recipe name\"\n },\n \"ingredients\": {\n \"type\": \"array\",\n \"description\": \"Ingredients payload; content is validated by profiles/stacks\"\n },\n \"instructions\": {\n \"type\": \"array\",\n \"description\": \"Instruction payload; content is validated by profiles/stacks\"\n }\n },\n \"required\": [\"@type\"]\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/recipe/profiles/minimal.schema.json\",\n \"title\": \"Soustack Recipe Minimal Profile\",\n \"description\": \"Minimal profile that ensures the basic Recipe structure is present while allowing stacks to extend it.\",\n \"allOf\": [\n {\n \"$ref\": \"http://soustack.org/schema/recipe/base.schema.json\"\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"profile\": {\n \"const\": \"minimal\"\n },\n \"stacks\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"integer\",\n \"minimum\": 1\n },\n \"properties\": {\n \"attribution\": { \"type\": \"integer\", \"minimum\": 1 },\n \"taxonomy\": { \"type\": \"integer\", \"minimum\": 1 },\n \"media\": { \"type\": \"integer\", \"minimum\": 1 },\n \"nutrition\": { \"type\": \"integer\", \"minimum\": 1 },\n \"times\": { \"type\": \"integer\", \"minimum\": 1 }\n }\n },\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"ingredients\": {\n \"type\": \"array\",\n \"minItems\": 1\n },\n \"instructions\": {\n \"type\": \"array\",\n \"minItems\": 1\n }\n },\n \"required\": [\n \"profile\",\n \"name\",\n \"ingredients\",\n \"instructions\"\n ],\n \"additionalProperties\": true\n }\n ]\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/recipe/profiles/core.schema.json\",\n \"title\": \"Soustack Recipe Core Profile\",\n \"description\": \"Core profile that builds on the minimal profile and is intended to be combined with recipe stacks.\",\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/recipe/base.schema.json\" },\n {\n \"type\": \"object\",\n \"properties\": {\n \"profile\": { \"const\": \"core\" },\n \"stacks\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"integer\",\n \"minimum\": 1\n }\n },\n \"name\": { \"type\": \"string\", \"minLength\": 1 },\n \"ingredients\": { \"type\": \"array\", \"minItems\": 1 },\n \"instructions\": { \"type\": \"array\", \"minItems\": 1 }\n },\n \"required\": [\"profile\", \"name\", \"ingredients\", \"instructions\"],\n \"additionalProperties\": true\n }\n ]\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/v0.3.0/profiles/base\",\n \"title\": \"Soustack Base Profile Schema\",\n \"description\": \"Wrapper schema that exposes the unmodified Soustack base schema.\",\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.3.0\" }\n ]\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/v0.3.0/profiles/cookable\",\n \"title\": \"Soustack Cookable Profile Schema\",\n \"description\": \"Extends the base schema to require structured yield + time metadata and non-empty ingredient/instruction lists.\",\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.3.0\" },\n {\n \"required\": [\"yield\", \"time\", \"ingredients\", \"instructions\"],\n \"properties\": {\n \"yield\": { \"$ref\": \"http://soustack.org/schema/v0.3.0#/definitions/yield\" },\n \"time\": { \"$ref\": \"http://soustack.org/schema/v0.3.0#/definitions/time\" },\n \"ingredients\": { \"type\": \"array\", \"minItems\": 1 },\n \"instructions\": { \"type\": \"array\", \"minItems\": 1 }\n }\n }\n ]\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/v0.3.0/profiles/illustrated\",\n \"title\": \"Soustack Illustrated Profile Schema\",\n \"description\": \"Extends the base schema to guarantee at least one illustrative image.\",\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.3.0\" },\n {\n \"anyOf\": [\n { \"required\": [\"image\"] },\n {\n \"properties\": {\n \"instructions\": {\n \"type\": \"array\",\n \"contains\": {\n \"anyOf\": [\n { \"$ref\": \"#/definitions/imageInstruction\" },\n { \"$ref\": \"#/definitions/instructionSubsectionWithImage\" }\n ]\n }\n }\n }\n }\n ]\n }\n ],\n \"definitions\": {\n \"imageInstruction\": {\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.3.0#/definitions/instruction\" },\n { \"required\": [\"image\"] }\n ]\n },\n \"instructionSubsectionWithImage\": {\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.3.0#/definitions/instructionSubsection\" },\n {\n \"properties\": {\n \"items\": {\n \"type\": \"array\",\n \"contains\": { \"$ref\": \"#/definitions/imageInstruction\" }\n }\n }\n }\n ]\n }\n }\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/v0.3.0/profiles/quantified\",\n \"title\": \"Soustack Quantified Profile Schema\",\n \"description\": \"Extends the base schema to require quantified ingredient entries.\",\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.3.0\" },\n {\n \"properties\": {\n \"ingredients\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n { \"$ref\": \"#/definitions/quantifiedIngredient\" },\n { \"$ref\": \"#/definitions/quantifiedIngredientSubsection\" }\n ]\n }\n }\n }\n }\n ],\n \"definitions\": {\n \"quantifiedIngredient\": {\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.3.0#/definitions/ingredient\" },\n { \"required\": [\"item\", \"quantity\"] }\n ]\n },\n \"quantifiedIngredientSubsection\": {\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.3.0#/definitions/ingredientSubsection\" },\n {\n \"properties\": {\n \"items\": {\n \"type\": \"array\",\n \"items\": { \"$ref\": \"#/definitions/quantifiedIngredient\" }\n }\n }\n }\n ]\n }\n }\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/v0.3.0/profiles/scalable\",\n \"title\": \"Soustack Scalable Profile Schema\",\n \"description\": \"Extends the base schema to guarantee quantified ingredients plus a structured yield for deterministic scaling.\",\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.3.0\" },\n {\n \"required\": [\"yield\", \"ingredients\"],\n \"properties\": {\n \"yield\": {\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.3.0#/definitions/yield\" },\n { \"properties\": { \"amount\": { \"type\": \"number\", \"exclusiveMinimum\": 0 } } }\n ]\n },\n \"ingredients\": {\n \"type\": \"array\",\n \"minItems\": 1,\n \"items\": {\n \"anyOf\": [\n { \"$ref\": \"#/definitions/scalableIngredient\" },\n { \"$ref\": \"#/definitions/scalableIngredientSubsection\" }\n ]\n }\n }\n }\n }\n ],\n \"definitions\": {\n \"scalableIngredient\": {\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.3.0#/definitions/ingredient\" },\n { \"required\": [\"item\", \"quantity\"] },\n {\n \"properties\": {\n \"quantity\": {\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.3.0#/definitions/quantity\" },\n { \"properties\": { \"amount\": { \"type\": \"number\", \"exclusiveMinimum\": 0 } } }\n ]\n }\n }\n },\n {\n \"if\": {\n \"properties\": {\n \"scaling\": {\n \"type\": \"object\",\n \"properties\": { \"type\": { \"const\": \"bakers_percentage\" } },\n \"required\": [\"type\"]\n }\n },\n \"required\": [\"scaling\"]\n },\n \"then\": { \"required\": [\"id\"] }\n }\n ]\n },\n \"scalableIngredientSubsection\": {\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.3.0#/definitions/ingredientSubsection\" },\n {\n \"properties\": {\n \"items\": {\n \"type\": \"array\",\n \"minItems\": 1,\n \"items\": { \"$ref\": \"#/definitions/scalableIngredient\" }\n }\n }\n }\n ]\n }\n }\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/v0.3.0/profiles/schedulable\",\n \"title\": \"Soustack Schedulable Profile Schema\",\n \"description\": \"Extends the base schema to ensure every instruction is fully scheduled.\",\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.3.0\" },\n {\n \"properties\": {\n \"instructions\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n { \"$ref\": \"#/definitions/schedulableInstruction\" },\n { \"$ref\": \"#/definitions/schedulableInstructionSubsection\" }\n ]\n }\n }\n }\n }\n ],\n \"definitions\": {\n \"schedulableInstruction\": {\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.3.0#/definitions/instruction\" },\n { \"required\": [\"id\", \"timing\"] }\n ]\n },\n \"schedulableInstructionSubsection\": {\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.3.0#/definitions/instructionSubsection\" },\n {\n \"properties\": {\n \"items\": {\n \"type\": \"array\",\n \"items\": { \"$ref\": \"#/definitions/schedulableInstruction\" }\n }\n }\n }\n ]\n }\n }\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://soustack.org/schemas/recipe/stacks/attribution/1.schema.json\",\n \"title\": \"Soustack Recipe Stack: attribution v1\",\n \"description\": \"Schema for the attribution stack. Ensures namespace data is present when the stack is enabled and vice versa.\",\n \"type\": \"object\",\n \"properties\": {\n \"stacks\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"integer\",\n \"minimum\": 1\n }\n },\n \"attribution\": {\n \"type\": \"object\",\n \"properties\": {\n \"url\": { \"type\": \"string\" },\n \"author\": { \"type\": \"string\" },\n \"datePublished\": { \"type\": \"string\" }\n },\n \"additionalProperties\": false\n }\n },\n \"allOf\": [\n {\n \"if\": {\n \"properties\": {\n \"stacks\": {\n \"type\": \"object\",\n \"properties\": {\n \"attribution\": { \"const\": 1 }\n },\n \"required\": [\"attribution\"]\n }\n }\n },\n \"then\": {\n \"required\": [\"attribution\"]\n }\n },\n {\n \"if\": {\n \"required\": [\"attribution\"]\n },\n \"then\": {\n \"required\": [\"stacks\"],\n \"properties\": {\n \"stacks\": {\n \"type\": \"object\",\n \"properties\": {\n \"attribution\": { \"const\": 1 }\n },\n \"required\": [\"attribution\"]\n }\n }\n }\n }\n ],\n \"additionalProperties\": true\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://soustack.org/schemas/recipe/stacks/media/1.schema.json\",\n \"title\": \"Soustack Recipe Stack: media v1\",\n \"description\": \"Schema for the media stack. Guards media blocks based on stack activation and ensures declarations accompany payloads.\",\n \"type\": \"object\",\n \"properties\": {\n \"stacks\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"integer\",\n \"minimum\": 1\n }\n },\n \"media\": {\n \"type\": \"object\",\n \"properties\": {\n \"images\": { \"type\": \"array\", \"items\": { \"type\": \"string\" } },\n \"videos\": { \"type\": \"array\", \"items\": { \"type\": \"string\" } }\n },\n \"additionalProperties\": false\n }\n },\n \"allOf\": [\n {\n \"if\": {\n \"properties\": {\n \"stacks\": {\n \"type\": \"object\",\n \"properties\": {\n \"media\": { \"const\": 1 }\n },\n \"required\": [\"media\"]\n }\n }\n },\n \"then\": {\n \"required\": [\"media\"]\n }\n },\n {\n \"if\": {\n \"required\": [\"media\"]\n },\n \"then\": {\n \"required\": [\"stacks\"],\n \"properties\": {\n \"stacks\": {\n \"type\": \"object\",\n \"properties\": {\n \"media\": { \"const\": 1 }\n },\n \"required\": [\"media\"]\n }\n }\n }\n }\n ],\n \"additionalProperties\": true\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://soustack.org/schemas/recipe/stacks/nutrition/1.schema.json\",\n \"title\": \"Soustack Recipe Stack: nutrition v1\",\n \"description\": \"Schema for the nutrition stack. Keeps nutrition data aligned with stack declarations and vice versa.\",\n \"type\": \"object\",\n \"properties\": {\n \"stacks\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"integer\",\n \"minimum\": 1\n }\n },\n \"nutrition\": {\n \"type\": \"object\",\n \"properties\": {\n \"calories\": { \"type\": \"number\" },\n \"protein_g\": { \"type\": \"number\" }\n },\n \"additionalProperties\": false\n }\n },\n \"allOf\": [\n {\n \"if\": {\n \"properties\": {\n \"stacks\": {\n \"type\": \"object\",\n \"properties\": {\n \"nutrition\": { \"const\": 1 }\n },\n \"required\": [\"nutrition\"]\n }\n }\n },\n \"then\": {\n \"required\": [\"nutrition\"]\n }\n },\n {\n \"if\": {\n \"required\": [\"nutrition\"]\n },\n \"then\": {\n \"required\": [\"stacks\"],\n \"properties\": {\n \"stacks\": {\n \"type\": \"object\",\n \"properties\": {\n \"nutrition\": { \"const\": 1 }\n },\n \"required\": [\"nutrition\"]\n }\n }\n }\n }\n ],\n \"additionalProperties\": true\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://soustack.org/schemas/recipe/stacks/schedule/1.schema.json\",\n \"title\": \"Soustack Recipe Stack: schedule v1\",\n \"description\": \"Schema for the schedule stack. Enforces bidirectional stack gating and restricts usage to the core profile.\",\n \"type\": \"object\",\n \"properties\": {\n \"profile\": { \"type\": \"string\" },\n \"stacks\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"integer\",\n \"minimum\": 1\n }\n },\n \"schedule\": {\n \"type\": \"object\",\n \"properties\": {\n \"tasks\": { \"type\": \"array\" }\n },\n \"additionalProperties\": false\n }\n },\n \"allOf\": [\n {\n \"if\": {\n \"properties\": {\n \"stacks\": {\n \"type\": \"object\",\n \"properties\": {\n \"schedule\": { \"const\": 1 }\n },\n \"required\": [\"schedule\"]\n }\n }\n },\n \"then\": {\n \"required\": [\"schedule\", \"profile\"],\n \"properties\": {\n \"profile\": { \"const\": \"core\" }\n }\n }\n },\n {\n \"if\": {\n \"required\": [\"schedule\"]\n },\n \"then\": {\n \"required\": [\"stacks\", \"profile\"],\n \"properties\": {\n \"stacks\": {\n \"type\": \"object\",\n \"properties\": {\n \"schedule\": { \"const\": 1 }\n },\n \"required\": [\"schedule\"]\n },\n \"profile\": { \"const\": \"core\" }\n }\n }\n }\n ],\n \"additionalProperties\": true\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://soustack.org/schemas/recipe/stacks/taxonomy/1.schema.json\",\n \"title\": \"Soustack Recipe Stack: taxonomy v1\",\n \"description\": \"Schema for the taxonomy stack. Enforces keyword and categorization data when enabled and ensures stack declaration accompanies the namespace block.\",\n \"type\": \"object\",\n \"properties\": {\n \"stacks\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"integer\",\n \"minimum\": 1\n }\n },\n \"taxonomy\": {\n \"type\": \"object\",\n \"properties\": {\n \"keywords\": { \"type\": \"array\", \"items\": { \"type\": \"string\" } },\n \"category\": { \"type\": \"string\" },\n \"cuisine\": { \"type\": \"string\" }\n },\n \"additionalProperties\": false\n }\n },\n \"allOf\": [\n {\n \"if\": {\n \"properties\": {\n \"stacks\": {\n \"type\": \"object\",\n \"properties\": {\n \"taxonomy\": { \"const\": 1 }\n },\n \"required\": [\"taxonomy\"]\n }\n }\n },\n \"then\": {\n \"required\": [\"taxonomy\"]\n }\n },\n {\n \"if\": {\n \"required\": [\"taxonomy\"]\n },\n \"then\": {\n \"required\": [\"stacks\"],\n \"properties\": {\n \"stacks\": {\n \"type\": \"object\",\n \"properties\": {\n \"taxonomy\": { \"const\": 1 }\n },\n \"required\": [\"taxonomy\"]\n }\n }\n }\n }\n ],\n \"additionalProperties\": true\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"https://soustack.org/schemas/recipe/stacks/times/1.schema.json\",\n \"title\": \"Soustack Recipe Stack: times v1\",\n \"description\": \"Schema for the times stack. Maintains alignment between stack declarations and timing payloads.\",\n \"type\": \"object\",\n \"properties\": {\n \"stacks\": {\n \"type\": \"object\",\n \"additionalProperties\": {\n \"type\": \"integer\",\n \"minimum\": 1\n }\n },\n \"times\": {\n \"type\": \"object\",\n \"properties\": {\n \"prepMinutes\": { \"type\": \"number\" },\n \"cookMinutes\": { \"type\": \"number\" },\n \"totalMinutes\": { \"type\": \"number\" }\n },\n \"additionalProperties\": false\n }\n },\n \"allOf\": [\n {\n \"if\": {\n \"properties\": {\n \"stacks\": {\n \"type\": \"object\",\n \"properties\": {\n \"times\": { \"const\": 1 }\n },\n \"required\": [\"times\"]\n }\n }\n },\n \"then\": {\n \"required\": [\"times\"]\n }\n },\n {\n \"if\": {\n \"required\": [\"times\"]\n },\n \"then\": {\n \"required\": [\"stacks\"],\n \"properties\": {\n \"stacks\": {\n \"type\": \"object\",\n \"properties\": {\n \"times\": { \"const\": 1 }\n },\n \"required\": [\"times\"]\n }\n }\n }\n }\n ],\n \"additionalProperties\": true\n}\n","import Ajv2020, { ErrorObject, ValidateFunction } from \"ajv/dist/2020\";\nimport addFormats from \"ajv-formats\";\nimport { Recipe } from \"./types\";\nimport { normalizeRecipe } from \"./normalize\";\nimport { validateConformance, ConformanceIssue } from \"./conformance\";\nimport rootSchema from \"./soustack.schema.json\";\nimport baseSchema from \"./schemas/recipe/base.schema.json\";\nimport minimalProfileSchema from \"./schemas/recipe/profiles/minimal.schema.json\";\nimport coreProfileSchema from \"./schemas/recipe/profiles/core.schema.json\";\nimport baseProfileSchema from \"../spec/profiles/base.schema.json\";\nimport cookableProfileSchema from \"../spec/profiles/cookable.schema.json\";\nimport illustratedProfileSchema from \"../spec/profiles/illustrated.schema.json\";\nimport quantifiedProfileSchema from \"../spec/profiles/quantified.schema.json\";\nimport scalableProfileSchema from \"../spec/profiles/scalable.schema.json\";\nimport schedulableProfileSchema from \"../spec/profiles/schedulable.schema.json\";\nimport attributionStackSchema from \"./schemas/recipe/stacks/attribution/1.schema.json\";\nimport mediaStackSchema from \"./schemas/recipe/stacks/media/1.schema.json\";\nimport nutritionStackSchema from \"./schemas/recipe/stacks/nutrition/1.schema.json\";\nimport scheduleStackSchema from \"./schemas/recipe/stacks/schedule/1.schema.json\";\nimport taxonomyStackSchema from \"./schemas/recipe/stacks/taxonomy/1.schema.json\";\nimport timesStackSchema from \"./schemas/recipe/stacks/times/1.schema.json\";\n\ntype ProfileName =\n | \"base\"\n | \"equipped\"\n | \"illustrated\"\n | \"lite\"\n | \"prepped\"\n | \"scalable\"\n | \"timed\"\n | \"minimal\"\n | \"core\";\n\n// Schema IDs from the vendored spec\nconst LEGACY_ROOT_SCHEMA_ID = \"http://soustack.org/schema/v0.3.0\";\nconst DEFAULT_ROOT_SCHEMA_ID = \"https://soustack.spec/soustack.schema.json\";\nconst BASE_SCHEMA_ID = \"http://soustack.org/schema/recipe/base.schema.json\";\nconst PROFILE_SCHEMA_PREFIX = \"http://soustack.org/schema/recipe/profiles/\";\n\nexport interface NormalizedError {\n path: string;\n message: string;\n keyword?: string;\n}\n\n/**\n * Validation modes for recipe validation.\n * - \"schema\": JSON Schema only\n * - \"full\": JSON Schema + semantic conformance checks\n */\nexport type ValidateMode = \"schema\" | \"full\";\n\nexport interface ValidateOptions {\n profile?: ProfileName;\n schema?: string;\n collectAllErrors?: boolean;\n mode?: ValidateMode;\n includeNormalized?: boolean;\n}\n\n/**\n * Result payload for recipe validation. Schema validation always runs first;\n * conformance issues are only included when running in full mode.\n */\nexport interface ValidateResult {\n ok: boolean;\n schemaErrors: NormalizedError[];\n conformanceIssues: ConformanceIssue[];\n warnings: string[];\n normalizedRecipe?: Recipe;\n}\n\ninterface ValidationContext {\n ajv: Ajv2020;\n rootValidator?: ValidateFunction;\n baseValidator?: ValidateFunction;\n validators: Map<string, ValidateFunction>;\n}\n\n// Cache for validation contexts\nconst validationContexts: Map<boolean, ValidationContext> = new Map();\n\n/**\n * Loads all bundled schema files and registers them with Ajv.\n */\nfunction loadAllSchemas(ajv: Ajv2020): void {\n const schemas = [\n rootSchema,\n baseSchema,\n minimalProfileSchema,\n coreProfileSchema,\n baseProfileSchema,\n cookableProfileSchema,\n illustratedProfileSchema,\n quantifiedProfileSchema,\n scalableProfileSchema,\n schedulableProfileSchema,\n attributionStackSchema,\n mediaStackSchema,\n nutritionStackSchema,\n scheduleStackSchema,\n taxonomyStackSchema,\n timesStackSchema,\n ];\n\n for (const schema of schemas) {\n if (schema && typeof schema === \"object\" && \"$id\" in schema) {\n const schemaWithId = schema as { $id?: string };\n if (schemaWithId.$id) {\n ajv.addSchema(schemaWithId, schemaWithId.$id);\n }\n }\n }\n\n ajv.addSchema(\n {\n $id: DEFAULT_ROOT_SCHEMA_ID,\n allOf: [\n { $ref: LEGACY_ROOT_SCHEMA_ID },\n {\n type: \"object\",\n properties: {\n $schema: { const: DEFAULT_ROOT_SCHEMA_ID },\n },\n },\n ],\n },\n DEFAULT_ROOT_SCHEMA_ID,\n );\n}\n\n/**\n * Creates a new validation context with all schemas loaded\n */\nfunction createContext(collectAllErrors: boolean): ValidationContext {\n const ajv = new Ajv2020({\n strict: false,\n allErrors: collectAllErrors,\n validateSchema: false, // Don't validate schemas themselves\n });\n addFormats(ajv);\n\n // Load all schemas from the spec directory\n loadAllSchemas(ajv);\n\n // Get validators for root and base schemas\n const rootValidator = ajv.getSchema(DEFAULT_ROOT_SCHEMA_ID) || ajv.getSchema(LEGACY_ROOT_SCHEMA_ID);\n const baseValidator = ajv.getSchema(BASE_SCHEMA_ID);\n\n return {\n ajv,\n rootValidator: rootValidator || undefined,\n baseValidator: baseValidator || undefined,\n validators: new Map(),\n };\n}\n\n/**\n * Gets or creates a validation context\n */\nfunction getContext(collectAllErrors: boolean): ValidationContext {\n if (!validationContexts.has(collectAllErrors)) {\n validationContexts.set(collectAllErrors, createContext(collectAllErrors));\n }\n return validationContexts.get(collectAllErrors)!;\n}\n\nfunction cloneRecipe<T>(recipe: T): T {\n if (typeof structuredClone === \"function\") {\n return structuredClone(recipe);\n }\n return JSON.parse(JSON.stringify(recipe));\n}\n\nfunction formatAjvError(error: ErrorObject): NormalizedError {\n let path = error.instancePath || \"/\";\n if (error.keyword === \"additionalProperties\" && (error.params as any)?.additionalProperty) {\n const extra = (error.params as any).additionalProperty;\n path = `${error.instancePath || \"\"}/${extra}`.replace(/\\/+/g, \"/\") || \"/\";\n }\n\n return {\n path,\n keyword: error.keyword,\n message: error.message || \"Validation error\",\n };\n}\n\nfunction isSoustackSchemaId(schemaId: string): boolean {\n return (\n schemaId.startsWith(\"http://soustack.org/schema\") ||\n schemaId.startsWith(\"https://soustack.org/schema\") ||\n schemaId.startsWith(\"https://soustack.spec/\") ||\n schemaId.startsWith(\"https://soustack.org/schemas/\")\n );\n}\n\n/**\n * Infers stacks from payload fields in the recipe.\n * Returns a stacks map (e.g., { times: 1, nutrition: 1 }).\n * Uses version 1 as default, but can be enhanced to use registry \"latest\" if available.\n */\nfunction inferStacksFromPayload(recipe: any): Record<string, number> {\n const inferred: Record<string, number> = {};\n\n // Map payload field names to stack names\n const payloadToStack: Record<string, string> = {\n attribution: \"attribution\",\n taxonomy: \"taxonomy\",\n media: \"media\",\n times: \"times\",\n nutrition: \"nutrition\",\n schedule: \"schedule\",\n };\n\n for (const [field, stackName] of Object.entries(payloadToStack)) {\n if (recipe && typeof recipe === \"object\" && field in recipe && recipe[field] !== undefined) {\n inferred[stackName] = 1; // Default to version 1, can be enhanced with registry lookup\n }\n }\n\n return inferred;\n}\n\n/**\n * Gets a composed validator for a profile and stacks using vendored schemas\n */\nfunction getComposedValidator(\n profile: ProfileName,\n stacks: Record<string, number>,\n context: ValidationContext,\n): ValidateFunction {\n // Create cache key from profile + sorted stack identifiers (e.g., \"attribution@1,times@1\")\n const stackIdentifiers = Object.entries(stacks)\n .map(([name, version]) => `${name}@${version}`)\n .sort();\n const cacheKey = `${profile}::${stackIdentifiers.join(\",\")}`;\n const cached = context.validators.get(cacheKey);\n if (cached) return cached;\n\n // Build composed schema: base + profile + stacks\n const allOf: any[] = [{ $ref: BASE_SCHEMA_ID }];\n\n // Verify base schema is loaded\n if (!context.ajv.getSchema(BASE_SCHEMA_ID)) {\n throw new Error(`Base schema not loaded: ${BASE_SCHEMA_ID}. Ensure schemas are loaded before creating validators.`);\n }\n\n // Add profile schema\n const profileSchemaId = `${PROFILE_SCHEMA_PREFIX}${profile}.schema.json`;\n if (!context.ajv.getSchema(profileSchemaId)) {\n throw new Error(`Profile schema not loaded: ${profileSchemaId}`);\n }\n allOf.push({ $ref: profileSchemaId });\n\n // Add stack schemas\n for (const [name, version] of Object.entries(stacks)) {\n if (typeof version === \"number\" && version >= 1) {\n // Stack schemas use https:// prefix\n const stackSchemaId = `https://soustack.org/schemas/recipe/stacks/${name}/${version}.schema.json`;\n if (!context.ajv.getSchema(stackSchemaId)) {\n throw new Error(`Stack schema not loaded: ${stackSchemaId}`);\n }\n allOf.push({ $ref: stackSchemaId });\n }\n }\n\n const composedSchema = {\n $id: `urn:soustack:composed:${cacheKey}`,\n allOf,\n };\n const validateFn = context.ajv.compile(composedSchema);\n context.validators.set(cacheKey, validateFn);\n return validateFn;\n}\n\n/**\n * Validates a recipe against the root schema from the vendored spec.\n * This is the new primary validation function.\n * For recipes with profile/stacks, uses composed validation (base + profile + stacks).\n * For recipes without profile/stacks, validates against root schema directly.\n */\nexport function validateRecipeSchema(\n input: unknown,\n options: { collectAllErrors?: boolean; schema?: string } = {},\n): {\n ok: boolean;\n errors: NormalizedError[];\n warnings: string[];\n} {\n const inputHasStacks =\n !!input && typeof input === \"object\" && !Array.isArray(input) && \"stacks\" in (input as any);\n // Normalize the input first\n const { recipe: normalizedInput, warnings: inputWarnings } = normalizeRecipe(input);\n const warnings: string[] = [...inputWarnings];\n\n const { ok, errors } = validateRecipeSchemaNormalized(\n normalizedInput,\n inputHasStacks,\n options.collectAllErrors ?? true,\n options.schema,\n );\n\n return {\n ok,\n errors,\n warnings,\n };\n}\n\nfunction validateRecipeSchemaNormalized(\n normalizedInput: Recipe,\n inputHasStacks: boolean,\n collectAllErrors: boolean,\n schemaOverride?: string,\n): { ok: boolean; errors: NormalizedError[] } {\n const normalized = cloneRecipe(normalizedInput);\n\n // Get validation context\n const context = getContext(collectAllErrors);\n\n const schemaId = typeof schemaOverride === \"string\" ? schemaOverride : typeof normalized.$schema === \"string\" ? normalized.$schema : undefined;\n const hasSchemaOverride = typeof schemaOverride === \"string\";\n const isSoustackSchema = schemaId ? isSoustackSchemaId(schemaId) : false;\n if (schemaId && isSoustackSchema) {\n const schemaValidator = context.ajv.getSchema(schemaId);\n if (!schemaValidator) {\n return {\n ok: false,\n errors: [\n {\n path: \"/$schema\",\n message: `Unknown schema: ${schemaId}`,\n },\n ],\n };\n }\n\n const schemaInput = cloneRecipe(normalized);\n if (hasSchemaOverride && \"$schema\" in schemaInput && schemaInput.$schema !== schemaId) {\n delete (schemaInput as any).$schema;\n }\n const isLegacySchema = schemaId.startsWith(LEGACY_ROOT_SCHEMA_ID);\n const shouldRemoveStacks = (isLegacySchema || schemaId === DEFAULT_ROOT_SCHEMA_ID) && !inputHasStacks;\n if (isLegacySchema && \"@type\" in schemaInput) {\n delete (schemaInput as any)[\"@type\"];\n }\n if (shouldRemoveStacks && \"stacks\" in schemaInput) {\n delete (schemaInput as any).stacks;\n }\n const schemaValid = schemaValidator(schemaInput);\n const schemaErrors = schemaValidator.errors || [];\n return {\n ok: !!schemaValid,\n errors: schemaErrors.map(formatAjvError),\n };\n }\n\n // Determine if we should use composed validation or root schema\n const hasProfile = normalized.profile && typeof normalized.profile === \"string\";\n \n // Get declared stacks from recipe\n let declaredStacks: Record<string, number> = {};\n if (normalized.stacks && typeof normalized.stacks === \"object\" && !Array.isArray(normalized.stacks)) {\n for (const [name, version] of Object.entries(normalized.stacks)) {\n if (typeof version === \"number\" && version >= 1) {\n declaredStacks[name] = version;\n }\n }\n }\n\n // Infer stacks from payloads (for stack contract enforcement)\n // We include inferred stacks in the validation schema to enforce that stacks must be declared\n const inferredStacks = inferStacksFromPayload(normalized);\n \n // Merge declared and inferred stacks, using max(version) per stack name\n const allStacks: Record<string, number> = { ...declaredStacks };\n for (const [name, version] of Object.entries(inferredStacks)) {\n if (!allStacks[name] || allStacks[name] < version) {\n allStacks[name] = version;\n }\n }\n\n let isValid: boolean;\n let errors: ErrorObject[] = [];\n\n // Default to core profile if no profile specified\n // Always use composed validation (base + profile + stacks) instead of root schema\n const profile: ProfileName = hasProfile\n ? ((normalized.profile as string).toLowerCase() as ProfileName)\n : \"core\";\n\n // Always use composed validation for recipes (base + profile + stacks)\n // Root schema validation is only for standalone validation without profiles\n const profileSchemaId = `${PROFILE_SCHEMA_PREFIX}${profile}.schema.json`;\n if (!context.ajv.getSchema(profileSchemaId)) {\n return {\n ok: false,\n errors: [\n {\n path: \"/profile\",\n message: `Profile schema not loaded: ${profileSchemaId}`,\n },\n ],\n };\n }\n {\n // Use composed validation (base + profile + stacks)\n // Include both declared and inferred stacks in schema to enforce contract\n // The schema will enforce that stacks must be declared if payload exists\n\n // Ensure stacks map exists for validation\n const validationCopy = cloneRecipe(normalized);\n if (!validationCopy.stacks || typeof validationCopy.stacks !== \"object\" || Array.isArray(validationCopy.stacks)) {\n (validationCopy as any).stacks = declaredStacks;\n }\n // Ensure profile exists\n if (!validationCopy.profile) {\n (validationCopy as any).profile = profile;\n }\n\n // Use allStacks (declared + inferred) in the validator to enforce contract\n const validator = getComposedValidator(profile, allStacks, context);\n isValid = validator(validationCopy);\n errors = validator.errors || [];\n\n // Check for unknown top-level keys using root schema (which has additionalProperties: false)\n // The composed validation uses base schema with additionalProperties: true, so we need this check\n if (isValid && context.rootValidator) {\n const rootCheckCopy = cloneRecipe(normalized);\n // Remove fields that root schema doesn't have but are valid in composed validation\n // Root schema doesn't include: @type, profile, stacks, or stack payloads\n if (\"@type\" in rootCheckCopy) {\n delete (rootCheckCopy as any)[\"@type\"];\n }\n if (\"stacks\" in rootCheckCopy) {\n delete (rootCheckCopy as any).stacks;\n }\n if (\"profile\" in rootCheckCopy) {\n delete (rootCheckCopy as any).profile;\n }\n // Also remove stack payload fields that root schema doesn't have\n const stackPayloadFields = [\"attribution\", \"taxonomy\", \"media\", \"times\", \"nutrition\", \"schedule\"];\n for (const field of stackPayloadFields) {\n if (field in rootCheckCopy) {\n delete (rootCheckCopy as any)[field];\n }\n }\n const rootValid = context.rootValidator(rootCheckCopy);\n if (!rootValid && context.rootValidator.errors) {\n // Filter for additionalProperties errors at root level only (unknown top-level keys)\n const unknownKeyErrors = context.rootValidator.errors.filter(\n (e) => e.keyword === \"additionalProperties\" && (e.instancePath === \"\" || e.instancePath === \"/\")\n );\n const schemaConstErrors = context.rootValidator.errors.filter(\n (e) => e.keyword === \"const\" && e.instancePath === \"/$schema\"\n );\n const relevantErrors = [...unknownKeyErrors, ...schemaConstErrors];\n if (relevantErrors.length > 0) {\n errors.push(...relevantErrors);\n isValid = false;\n }\n }\n }\n }\n\n return {\n ok: isValid,\n errors: errors.map(formatAjvError),\n };\n}\n\nfunction isInstruction(item: any): item is { id?: string; dependsOn?: string[] } {\n return item && typeof item === \"object\" && !Array.isArray(item) && \"text\" in item;\n}\n\nfunction isInstructionSubsection(item: any): item is { items: any[] } {\n return item && typeof item === \"object\" && !Array.isArray(item) && \"items\" in item && \"subsection\" in item;\n}\n\nexport function checkInstructionGraph(recipe: Recipe): NormalizedError[] {\n const instructions = (recipe as any)?.instructions;\n if (!Array.isArray(instructions)) return [];\n\n const instructionIds = new Set<string>();\n const dependencyRefs: { fromId?: string; toId: string; path: string }[] = [];\n\n const collect = (items: any[], basePath: string) => {\n items.forEach((item, index) => {\n const currentPath = `${basePath}/${index}`;\n\n if (isInstructionSubsection(item) && Array.isArray(item.items)) {\n collect(item.items, `${currentPath}/items`);\n return;\n }\n\n if (isInstruction(item)) {\n const id = typeof item.id === \"string\" ? item.id : undefined;\n if (id) instructionIds.add(id);\n\n if (Array.isArray(item.dependsOn)) {\n item.dependsOn.forEach((depId, depIndex) => {\n if (typeof depId === \"string\") {\n dependencyRefs.push({\n fromId: id,\n toId: depId,\n path: `${currentPath}/dependsOn/${depIndex}`,\n });\n }\n });\n }\n }\n });\n };\n\n collect(instructions, \"/instructions\");\n\n const errors: NormalizedError[] = [];\n\n dependencyRefs.forEach((ref) => {\n if (!instructionIds.has(ref.toId)) {\n errors.push({\n path: ref.path,\n message: `Instruction dependency references missing id '${ref.toId}'.`,\n });\n }\n });\n\n const adjacency = new Map<string, { toId: string; path: string }[]>();\n dependencyRefs.forEach((ref) => {\n if (ref.fromId && instructionIds.has(ref.fromId) && instructionIds.has(ref.toId)) {\n const list = adjacency.get(ref.fromId) ?? [];\n list.push({ toId: ref.toId, path: ref.path });\n adjacency.set(ref.fromId, list);\n }\n });\n\n const visiting = new Set<string>();\n const visited = new Set<string>();\n\n const detectCycles = (nodeId: string) => {\n if (visiting.has(nodeId)) return;\n if (visited.has(nodeId)) return;\n\n visiting.add(nodeId);\n const neighbors = adjacency.get(nodeId) ?? [];\n neighbors.forEach((edge) => {\n if (visiting.has(edge.toId)) {\n errors.push({\n path: edge.path,\n message: `Circular dependency detected involving instruction id '${edge.toId}'.`,\n });\n return;\n }\n detectCycles(edge.toId);\n });\n visiting.delete(nodeId);\n visited.add(nodeId);\n };\n\n instructionIds.forEach((id) => detectCycles(id));\n\n return errors;\n}\n\n/**\n * Legacy validateRecipe function - now uses the new validateRecipeSchema internally\n * but maintains backward compatibility with profile/stack-based validation\n * Also includes semantic conformance validation.\n */\n/**\n * Validates a recipe with explicit validation modes.\n * - mode=\"schema\": JSON Schema only\n * - mode=\"full\": schema + semantic conformance (only if schema passes)\n */\nexport function validateRecipe(input: any, options: ValidateOptions = {}): ValidateResult {\n const { recipe: normalized, warnings } = normalizeRecipe(input);\n if (options.profile) {\n (normalized as any).profile = options.profile;\n }\n\n const inputHasStacks =\n !!input && typeof input === \"object\" && !Array.isArray(input) && \"stacks\" in (input as any);\n const { ok: schemaOk, errors: schemaErrors } = validateRecipeSchemaNormalized(\n normalized,\n inputHasStacks,\n options.collectAllErrors ?? true,\n options.schema,\n );\n\n const mode: ValidateMode = options.mode ?? \"full\";\n let conformanceIssues: ConformanceIssue[] = [];\n let conformanceOk = true;\n\n if (mode === \"full\") {\n if (schemaOk) {\n const conformanceResult = validateConformance(normalized);\n conformanceIssues = conformanceResult.issues;\n conformanceOk = conformanceResult.ok;\n } else {\n conformanceOk = false;\n }\n }\n\n const ok = schemaOk && (mode === \"schema\" ? true : conformanceOk);\n const normalizedRecipe = ok || options.includeNormalized ? normalized : undefined;\n\n return {\n ok,\n schemaErrors,\n conformanceIssues,\n warnings,\n normalizedRecipe,\n };\n}\n\nexport function validateRecipeWithProfile(data: any, profile: ProfileName): data is Recipe {\n return validateRecipe(data, { profile }).ok;\n}\n\nexport function detectProfiles(recipe: any): ProfileName[] {\n const result = validateRecipe(recipe, { collectAllErrors: false });\n if (!result.ok) return [];\n\n // For now, return core as default since we're using root schema validation\n // This can be enhanced later to check against specific profile schemas\n return [\"core\"];\n}\n","import { Yield } from '../types';\n\nexport function parseYield(value: unknown): Yield | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (typeof value === 'number') {\n return {\n amount: value,\n unit: 'servings'\n };\n }\n\n if (Array.isArray(value)) {\n return parseYield(value[0]);\n }\n\n if (typeof value === 'object') {\n const maybeYield = value as Record<string, any>;\n if (typeof maybeYield.amount === 'number') {\n return {\n amount: maybeYield.amount,\n unit: typeof maybeYield.unit === 'string' ? maybeYield.unit : 'servings',\n description:\n typeof maybeYield.description === 'string'\n ? maybeYield.description\n : undefined\n };\n }\n }\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n const match = trimmed.match(/(\\d+(?:\\.\\d+)?)/);\n if (match) {\n const amount = parseFloat(match[1]);\n const unit = trimmed.slice(match.index! + match[1].length).trim();\n return {\n amount,\n unit: unit || 'servings',\n description: trimmed\n };\n }\n }\n\n return undefined;\n}\n\nexport function formatYield(yieldValue?: Yield): string | undefined {\n if (!yieldValue) return undefined;\n if (!yieldValue.amount && !yieldValue.unit) {\n return undefined;\n }\n\n const amount = yieldValue.amount ?? '';\n const unit = yieldValue.unit ? ` ${yieldValue.unit}` : '';\n return `${amount}${unit}`.trim() || yieldValue.description;\n}\n","import { SchemaOrgImage } from '../types/schemaOrg';\n\n/**\n * Normalize Schema.org image formats to Soustack format.\n * - String values pass through\n * - Arrays collapse to string or string[] after URL extraction\n * - ImageObjects extract their url/contentUrl\n */\nexport function normalizeImage(\n image: SchemaOrgImage | undefined | null\n): string | string[] | undefined {\n if (!image) {\n return undefined;\n }\n\n if (typeof image === 'string') {\n const trimmed = image.trim();\n return trimmed || undefined;\n }\n\n if (Array.isArray(image)) {\n const urls = image\n .map(entry => (typeof entry === 'string' ? entry.trim() : extractUrl(entry)))\n .filter((url): url is string => typeof url === 'string' && Boolean(url));\n\n if (urls.length === 0) {\n return undefined;\n }\n if (urls.length === 1) {\n return urls[0];\n }\n return urls;\n }\n\n return extractUrl(image);\n}\n\nfunction extractUrl(\n value: Exclude<SchemaOrgImage, string | string[] | undefined | null>\n): string | undefined {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n\n const record = value as { url?: unknown; contentUrl?: unknown };\n const candidate =\n typeof record.url === 'string'\n ? record.url\n : typeof record.contentUrl === 'string'\n ? record.contentUrl\n : undefined;\n\n if (!candidate) {\n return undefined;\n }\n\n const trimmed = candidate.trim();\n return trimmed || undefined;\n}\n","import {\n IngredientItem,\n Instruction,\n InstructionItem,\n Recipe,\n Source,\n AttributionModule,\n TaxonomyModule,\n MediaModule,\n TimesModule,\n NutritionFacts,\n StepTiming,\n StructuredTime\n} from './types';\nimport { parseYield } from './converters/yield';\nimport { smartParseDuration } from './parsers/duration';\nimport {\n HowToSection,\n HowToStep,\n SchemaOrgPersonOrOrganization,\n SchemaOrgRecipe,\n SchemaOrgImage\n} from './types/schemaOrg';\nimport { normalizeImage } from './utils/image';\nimport { normalizeRecipe } from './normalize';\n\nexport function fromSchemaOrg(input: unknown): Recipe | null {\n const recipeNode = extractRecipeNode(input);\n if (!recipeNode) {\n return null;\n }\n\n const ingredients = convertIngredients(recipeNode.recipeIngredient);\n const instructions = convertInstructions(recipeNode.recipeInstructions);\n const time = convertTime(recipeNode);\n const recipeYield = parseYield(recipeNode.recipeYield);\n const tags = collectTags(recipeNode.recipeCuisine, recipeNode.keywords);\n const category = extractFirst(recipeNode.recipeCategory);\n const source = convertSource(recipeNode);\n const dateModified = recipeNode.dateModified || undefined;\n const nutrition = convertNutrition(recipeNode.nutrition);\n\n const attribution = convertAttribution(recipeNode);\n const taxonomy = convertTaxonomy(tags, category, extractFirst(recipeNode.recipeCuisine));\n const media = convertMedia(recipeNode.image, recipeNode.video);\n const times = convertTimes(time);\n\n // Build stacks map from payloads\n const stacks: Record<string, number> = {};\n if (attribution) stacks.attribution = 1;\n if (taxonomy) stacks.taxonomy = 1;\n if (media) stacks.media = 1;\n if (nutrition) stacks.nutrition = 1;\n if (times) stacks.times = 1;\n\n const rawRecipe = {\n '@type': 'Recipe',\n profile: 'minimal',\n stacks,\n name: recipeNode.name.trim(),\n description: recipeNode.description?.trim() || undefined,\n image: normalizeImage(recipeNode.image),\n category,\n tags: tags.length ? tags : undefined,\n source,\n dateAdded: recipeNode.datePublished || undefined,\n yield: recipeYield,\n time,\n ingredients,\n instructions,\n ...(dateModified ? { dateModified } : {}),\n ...(nutrition ? { nutrition } : {}),\n ...(attribution ? { attribution } : {}),\n ...(taxonomy ? { taxonomy } : {}),\n ...(media ? { media } : {}),\n ...(times ? { times } : {})\n };\n\n // Normalize the recipe to ensure it's in the correct format\n const { recipe } = normalizeRecipe(rawRecipe);\n \n return recipe;\n}\n\nfunction extractRecipeNode(input: unknown): SchemaOrgRecipe | null {\n if (!input) return null;\n\n if (Array.isArray(input)) {\n for (const entry of input) {\n const found = extractRecipeNode(entry);\n if (found) {\n return found;\n }\n }\n return null;\n }\n\n if (typeof input !== 'object') {\n return null;\n }\n\n const record = input as Partial<SchemaOrgRecipe> & { [key: string]: unknown };\n\n if (record['@graph']) {\n const fromGraph = extractRecipeNode(record['@graph']);\n if (fromGraph) {\n return fromGraph;\n }\n }\n\n if (!hasRecipeType(record['@type'])) {\n return null;\n }\n\n if (!isValidName(record.name)) {\n return null;\n }\n\n return record as SchemaOrgRecipe;\n}\n\nfunction hasRecipeType(value: SchemaOrgRecipe['@type']): boolean {\n if (!value) return false;\n const types = Array.isArray(value) ? value : [value];\n return types.some(\n entry => typeof entry === 'string' && entry.toLowerCase() === 'recipe'\n );\n}\n\nfunction isValidName(name: unknown): name is string {\n return typeof name === 'string' && Boolean(name.trim());\n}\n\nfunction convertIngredients(\n value: SchemaOrgRecipe['recipeIngredient']\n): IngredientItem[] {\n if (!value) return [];\n const normalized = Array.isArray(value) ? value : [value];\n return normalized\n .map(item => (typeof item === 'string' ? item.trim() : ''))\n .filter(Boolean);\n}\n\nfunction convertInstructions(\n value: SchemaOrgRecipe['recipeInstructions']\n): InstructionItem[] {\n if (!value) return [];\n const normalized = Array.isArray(value) ? value : [value];\n const result: InstructionItem[] = [];\n\n for (const entry of normalized) {\n if (!entry) continue;\n\n if (typeof entry === 'string') {\n const text = entry.trim();\n if (text) {\n result.push(text);\n }\n continue;\n }\n\n if (isHowToSection(entry)) {\n const subsectionItems = extractSectionItems(entry.itemListElement);\n if (subsectionItems.length) {\n result.push({\n subsection: entry.name?.trim() || 'Section',\n items: subsectionItems\n });\n }\n continue;\n }\n\n if (isHowToStep(entry)) {\n const parsed = convertHowToStep(entry);\n if (parsed) {\n result.push(parsed);\n }\n }\n }\n\n return result;\n}\n\nfunction extractSectionItems(\n items: Array<string | HowToStep | HowToSection> = []\n): Array<string | Instruction> {\n const result: Array<string | Instruction> = [];\n\n for (const item of items) {\n if (!item) continue;\n\n if (typeof item === 'string') {\n const text = item.trim();\n if (text) {\n result.push(text);\n }\n continue;\n }\n\n if (isHowToStep(item)) {\n const parsed = convertHowToStep(item);\n if (parsed) {\n result.push(parsed);\n }\n continue;\n }\n\n if (isHowToSection(item)) {\n result.push(...extractSectionItems(item.itemListElement));\n }\n }\n\n return result;\n}\n\nfunction extractInstructionText(value: HowToStep): string | undefined {\n const text = typeof value.text === 'string' ? value.text : value.name;\n return typeof text === 'string' ? text.trim() || undefined : undefined;\n}\n\nfunction convertHowToStep(step: HowToStep): string | Instruction | undefined {\n const text = extractInstructionText(step);\n if (!text) {\n return undefined;\n }\n\n const normalizedImage = normalizeImage(step.image);\n const image = Array.isArray(normalizedImage)\n ? normalizedImage[0]\n : normalizedImage;\n const id = extractInstructionId(step);\n const timing = extractInstructionTiming(step);\n\n if (!image && !id && !timing) {\n return text;\n }\n\n const instruction: Instruction = { text };\n if (id) instruction.id = id;\n if (image) instruction.image = image;\n if (timing) instruction.timing = timing;\n\n return instruction;\n}\n\nfunction extractInstructionTiming(step: HowToStep): StepTiming | undefined {\n const duration =\n step.totalTime || step.performTime || step.prepTime || (step as any).duration;\n\n if (!duration || typeof duration !== 'string') {\n return undefined;\n }\n\n const parsed = smartParseDuration(duration);\n return { duration: parsed ?? duration, type: 'active' };\n}\n\nfunction extractInstructionId(step: HowToStep): string | undefined {\n const raw = (step as any)['@id'] || (step as any).id || step.url;\n if (typeof raw !== 'string') {\n return undefined;\n }\n const trimmed = raw.trim();\n return trimmed || undefined;\n}\n\nfunction isHowToStep(value: unknown): value is HowToStep {\n return (\n Boolean(value) &&\n typeof value === 'object' &&\n (value as HowToStep)['@type'] === 'HowToStep'\n );\n}\n\nfunction isHowToSection(value: unknown): value is HowToSection {\n return (\n Boolean(value) &&\n typeof value === 'object' &&\n (value as HowToSection)['@type'] === 'HowToSection' &&\n Array.isArray((value as HowToSection).itemListElement)\n );\n}\n\nfunction convertTime(recipe: SchemaOrgRecipe): StructuredTime | undefined {\n const prep = smartParseDuration(recipe.prepTime ?? '');\n const cook = smartParseDuration(recipe.cookTime ?? '');\n const total = smartParseDuration(recipe.totalTime ?? '');\n\n const structured: StructuredTime = {};\n if (prep !== null && prep !== undefined) structured.prep = prep;\n if (cook !== null && cook !== undefined) structured.active = cook;\n if (total !== null && total !== undefined) structured.total = total;\n\n return Object.keys(structured).length ? structured : undefined;\n}\n\nfunction collectTags(cuisine: unknown, keywords: unknown): string[] {\n const tags = new Set<string>();\n flattenStrings(cuisine).forEach(tag => tags.add(tag));\n if (typeof keywords === 'string') {\n splitKeywords(keywords).forEach(tag => tags.add(tag));\n } else {\n flattenStrings(keywords).forEach(tag => tags.add(tag));\n }\n return Array.from(tags);\n}\n\nfunction splitKeywords(value: string): string[] {\n return value\n .split(/[,|]/)\n .map(part => part.trim())\n .filter(Boolean);\n}\n\nfunction flattenStrings(value: unknown): string[] {\n if (!value) return [];\n if (typeof value === 'string') return [value.trim()].filter(Boolean);\n if (Array.isArray(value)) {\n return value\n .map(item => (typeof item === 'string' ? item.trim() : ''))\n .filter(Boolean);\n }\n return [];\n}\n\nfunction extractFirst(value: unknown): string | undefined {\n const arr = flattenStrings(value);\n return arr.length ? arr[0] : undefined;\n}\n\nfunction convertSource(recipe: SchemaOrgRecipe): Source | undefined {\n const author = extractEntityName(recipe.author);\n const publisher = extractEntityName(recipe.publisher);\n const url = (recipe.url || recipe.mainEntityOfPage)?.trim();\n\n const source: Source = {};\n if (author) source.author = author;\n if (publisher) source.name = publisher;\n if (url) source.url = url;\n\n return Object.keys(source).length ? source : undefined;\n}\n\nfunction extractEntityName(\n value:\n | SchemaOrgPersonOrOrganization\n | SchemaOrgPersonOrOrganization[]\n | string\n | string[]\n | undefined\n): string | undefined {\n if (!value) return undefined;\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed || undefined;\n }\n\n if (Array.isArray(value)) {\n for (const entry of value) {\n const name = extractEntityName(entry as any);\n if (name) {\n return name;\n }\n }\n return undefined;\n }\n\n if (typeof value === 'object' && typeof value.name === 'string') {\n const trimmed = value.name.trim();\n return trimmed || undefined;\n }\n\n return undefined;\n}\n\nfunction convertAttribution(recipe: SchemaOrgRecipe): AttributionModule | undefined {\n const attribution: AttributionModule = {};\n const url = (recipe.url || recipe.mainEntityOfPage)?.trim();\n const author = extractEntityName(recipe.author);\n const datePublished = recipe.datePublished?.trim();\n\n if (url) attribution.url = url;\n if (author) attribution.author = author;\n if (datePublished) attribution.datePublished = datePublished;\n\n return Object.keys(attribution).length ? attribution : undefined;\n}\n\nfunction convertTaxonomy(\n keywords: string[],\n category?: string,\n cuisine?: string\n): TaxonomyModule | undefined {\n const taxonomy: TaxonomyModule = {};\n if (keywords.length) taxonomy.keywords = keywords;\n if (category) taxonomy.category = category;\n if (cuisine) taxonomy.cuisine = cuisine;\n\n return Object.keys(taxonomy).length ? taxonomy : undefined;\n}\n\nfunction normalizeMediaList(value: SchemaOrgImage | undefined): string[] {\n if (!value) return [];\n if (typeof value === 'string') return [value.trim()].filter(Boolean);\n if (Array.isArray(value)) {\n return value\n .map(item => (typeof item === 'string' ? item.trim() : extractMediaUrl(item)))\n .filter((entry): entry is string => Boolean(entry?.length));\n }\n\n const url = extractMediaUrl(value);\n return url ? [url] : [];\n}\n\nfunction extractMediaUrl(value: unknown): string | undefined {\n if (value && typeof value === 'object' && 'url' in value && typeof (value as any).url === 'string') {\n const trimmed = (value as any).url.trim();\n return trimmed || undefined;\n }\n return undefined;\n}\n\nfunction convertMedia(\n image: SchemaOrgImage | undefined,\n video: SchemaOrgImage | undefined\n): MediaModule | undefined {\n const normalizedImage = normalizeImage(image);\n const images = normalizedImage\n ? Array.isArray(normalizedImage)\n ? normalizedImage\n : [normalizedImage]\n : [];\n const videos = normalizeMediaList(video);\n\n const media: MediaModule = {};\n if (images.length) media.images = images;\n if (videos.length) media.videos = videos;\n\n return Object.keys(media).length ? media : undefined;\n}\n\nfunction convertTimes(time?: StructuredTime): TimesModule | undefined {\n if (!time) return undefined;\n const times: TimesModule = {};\n\n if (typeof time.prep === 'number') times.prepMinutes = time.prep;\n if (typeof time.active === 'number') times.cookMinutes = time.active;\n if (typeof time.total === 'number') times.totalMinutes = time.total;\n\n return Object.keys(times).length ? times : undefined;\n}\n\nfunction convertNutrition(\n nutrition: SchemaOrgRecipe['nutrition']\n): NutritionFacts | undefined {\n if (!nutrition || typeof nutrition !== 'object') {\n return undefined;\n }\n\n const result: NutritionFacts = {};\n let hasData = false;\n\n // Parse calories - can be string or number in Schema.org\n if ('calories' in nutrition) {\n const calories = nutrition.calories;\n if (typeof calories === 'number') {\n result.calories = calories;\n hasData = true;\n } else if (typeof calories === 'string') {\n // Try to parse string like \"200 cal\" or \"200\"\n const parsed = parseFloat(calories.replace(/[^\\d.-]/g, ''));\n if (!isNaN(parsed)) {\n result.calories = parsed;\n hasData = true;\n }\n }\n }\n\n // Parse protein - Schema.org uses \"proteinContent\", we need \"protein_g\"\n if ('proteinContent' in nutrition || 'protein_g' in nutrition) {\n const protein = nutrition.proteinContent || nutrition.protein_g;\n if (typeof protein === 'number') {\n result.protein_g = protein;\n hasData = true;\n } else if (typeof protein === 'string') {\n // Try to parse string like \"10 g\" or \"10\"\n const parsed = parseFloat(protein.replace(/[^\\d.-]/g, ''));\n if (!isNaN(parsed)) {\n result.protein_g = parsed;\n hasData = true;\n }\n }\n }\n\n return hasData ? result : undefined;\n}\n","{\n \"stacks\": [\n {\n \"id\": \"attribution\",\n \"versions\": [1],\n \"latest\": 1,\n \"namespace\": \"http://soustack.org/schema/v0.3.0/stacks/attribution\",\n \"schema\": \"http://soustack.org/schema/v0.3.0/stacks/attribution\",\n \"schemaOrgMappable\": true,\n \"schemaOrgConfidence\": \"medium\",\n \"minProfile\": \"minimal\",\n \"allowedOnMinimal\": true\n },\n {\n \"id\": \"taxonomy\",\n \"versions\": [1],\n \"latest\": 1,\n \"namespace\": \"http://soustack.org/schema/v0.3.0/stacks/taxonomy\",\n \"schema\": \"http://soustack.org/schema/v0.3.0/stacks/taxonomy\",\n \"schemaOrgMappable\": true,\n \"schemaOrgConfidence\": \"high\",\n \"minProfile\": \"minimal\",\n \"allowedOnMinimal\": true\n },\n {\n \"id\": \"media\",\n \"versions\": [1],\n \"latest\": 1,\n \"namespace\": \"http://soustack.org/schema/v0.3.0/stacks/media\",\n \"schema\": \"http://soustack.org/schema/v0.3.0/stacks/media\",\n \"schemaOrgMappable\": true,\n \"schemaOrgConfidence\": \"medium\",\n \"minProfile\": \"minimal\",\n \"allowedOnMinimal\": true\n },\n {\n \"id\": \"nutrition\",\n \"versions\": [1],\n \"latest\": 1,\n \"namespace\": \"http://soustack.org/schema/v0.3.0/stacks/nutrition\",\n \"schema\": \"http://soustack.org/schema/v0.3.0/stacks/nutrition\",\n \"schemaOrgMappable\": false,\n \"schemaOrgConfidence\": \"low\",\n \"minProfile\": \"minimal\",\n \"allowedOnMinimal\": true\n },\n {\n \"id\": \"times\",\n \"versions\": [1],\n \"latest\": 1,\n \"namespace\": \"http://soustack.org/schema/v0.3.0/stacks/times\",\n \"schema\": \"http://soustack.org/schema/v0.3.0/stacks/times\",\n \"schemaOrgMappable\": true,\n \"schemaOrgConfidence\": \"medium\",\n \"minProfile\": \"minimal\",\n \"allowedOnMinimal\": true\n },\n {\n \"id\": \"schedule\",\n \"versions\": [1],\n \"latest\": 1,\n \"namespace\": \"http://soustack.org/schema/v0.3.0/stacks/schedule\",\n \"schema\": \"http://soustack.org/schema/v0.3.0/stacks/schedule\",\n \"schemaOrgMappable\": false,\n \"schemaOrgConfidence\": \"low\",\n \"minProfile\": \"core\",\n \"allowedOnMinimal\": false\n }\n ]\n}\n","import {\n IngredientItem,\n Instruction,\n InstructionItem,\n Recipe,\n StructuredTime,\n Time,\n TimesModule\n} from '../types';\nimport { formatDuration } from '../parsers/duration';\nimport { formatYield } from './yield';\nimport {\n HowToSection,\n HowToStep,\n SchemaOrgInstruction,\n SchemaOrgRecipe\n} from '../types/schemaOrg';\nimport stacksRegistry from '../schemas/registry/stacks.json';\n\nexport function convertBasicMetadata(recipe: Recipe): Partial<SchemaOrgRecipe> {\n return cleanOutput({\n '@context': 'https://schema.org',\n '@type': 'Recipe',\n name: recipe.name,\n description: recipe.description,\n image: recipe.image,\n url: recipe.source?.url,\n datePublished: recipe.dateAdded,\n dateModified: recipe.dateModified\n });\n}\n\nexport function convertIngredients(ingredients: IngredientItem[] = []): string[] {\n const result: string[] = [];\n\n ingredients.forEach(ingredient => {\n if (!ingredient) {\n return;\n }\n\n if (typeof ingredient === 'string') {\n const value = ingredient.trim();\n if (value) {\n result.push(value);\n }\n return;\n }\n\n if ('subsection' in ingredient) {\n ingredient.items.forEach(item => {\n if (!item) {\n return;\n }\n if (typeof item === 'string') {\n const value = item.trim();\n if (value) {\n result.push(value);\n }\n } else if (item.item) {\n const value = item.item.trim();\n if (value) {\n result.push(value);\n }\n }\n });\n return;\n }\n\n const value = ingredient.item?.trim();\n if (value) {\n result.push(value);\n }\n });\n\n return result;\n}\n\nexport function convertInstructions(\n instructions: InstructionItem[] = []\n): SchemaOrgInstruction[] {\n return instructions\n .map(entry => convertInstruction(entry))\n .filter((value): value is SchemaOrgInstruction => Boolean(value));\n}\n\nfunction convertInstruction(entry: InstructionItem): SchemaOrgInstruction | null {\n if (!entry) {\n return null;\n }\n\n if (typeof entry === 'string') {\n const value = entry.trim();\n return value || null;\n }\n\n if ('subsection' in entry) {\n const steps = entry.items\n .map(item => convertInstruction(item))\n .filter((step): step is SchemaOrgInstruction => Boolean(step));\n\n if (!steps.length) {\n return null;\n }\n\n return {\n '@type': 'HowToSection',\n name: entry.subsection,\n itemListElement: steps\n };\n }\n\n if ('text' in entry) {\n return createHowToStep(entry);\n }\n\n return createHowToStep(String(entry));\n}\n\nfunction createHowToStep(\n entry: string | Instruction | undefined\n): SchemaOrgInstruction | null {\n if (!entry) return null;\n\n if (typeof entry === 'string') {\n const trimmed = entry.trim();\n return trimmed || null;\n }\n\n const trimmed = entry.text?.trim();\n if (!trimmed) {\n return null;\n }\n\n const step: HowToStep = {\n '@type': 'HowToStep',\n text: trimmed\n };\n\n if (entry.id) {\n step['@id'] = entry.id;\n }\n\n if (entry.timing) {\n if (typeof entry.timing.duration === 'number') {\n step.performTime = formatDuration(entry.timing.duration);\n } else if (entry.timing.duration) {\n step.performTime = entry.timing.duration;\n }\n }\n\n if (entry.image) {\n step.image = entry.image;\n }\n\n if (step['@id'] || step.performTime || step.image) {\n return step;\n }\n\n return trimmed;\n}\n\nexport function convertTime(time?: Time): Partial<SchemaOrgRecipe> {\n if (!time) {\n return {};\n }\n\n if (isStructuredTime(time)) {\n const result: Partial<SchemaOrgRecipe> = {};\n if (time.prep !== undefined) {\n result.prepTime = formatDuration(time.prep);\n }\n if (time.active !== undefined) {\n result.cookTime = formatDuration(time.active);\n }\n if (time.total !== undefined) {\n result.totalTime = formatDuration(time.total);\n }\n return result;\n }\n\n const result: Partial<SchemaOrgRecipe> = {};\n if (time.prepTime) {\n result.prepTime = time.prepTime;\n }\n if (time.cookTime) {\n result.cookTime = time.cookTime;\n }\n return result;\n}\n\nexport function convertTimesModule(times?: TimesModule): Partial<SchemaOrgRecipe> {\n if (!times) {\n return {};\n }\n\n const result: Partial<SchemaOrgRecipe> = {};\n if (times.prepMinutes !== undefined) {\n result.prepTime = formatDuration(times.prepMinutes);\n }\n if (times.cookMinutes !== undefined) {\n result.cookTime = formatDuration(times.cookMinutes);\n }\n if (times.totalMinutes !== undefined) {\n result.totalTime = formatDuration(times.totalMinutes);\n }\n return result;\n}\n\nexport function convertYield(yld?: Recipe['yield']): string | undefined {\n if (!yld) {\n return undefined;\n }\n return formatYield(yld);\n}\n\nexport function convertAuthor(\n source?: Recipe['source']\n): Partial<SchemaOrgRecipe> {\n if (!source) {\n return {};\n }\n\n const result: Partial<SchemaOrgRecipe> = {};\n\n if (source.author) {\n result.author = {\n '@type': 'Person',\n name: source.author\n };\n }\n\n if (source.name) {\n result.publisher = {\n '@type': 'Organization',\n name: source.name\n };\n }\n\n if (source.url) {\n result.url = source.url;\n }\n\n return result;\n}\n\nexport function convertCategoryTags(\n category?: string,\n tags?: string[]\n): Partial<SchemaOrgRecipe> {\n const result: Partial<SchemaOrgRecipe> = {};\n\n if (category) {\n result.recipeCategory = category;\n }\n\n if (tags && tags.length > 0) {\n result.keywords = tags.filter(Boolean).join(', ');\n }\n\n return result;\n}\n\nexport function convertNutrition(\n nutrition?: Recipe['nutrition']\n): SchemaOrgRecipe['nutrition'] {\n if (!nutrition) {\n return undefined;\n }\n\n const result: SchemaOrgRecipe['nutrition'] = {\n '@type': 'NutritionInformation'\n };\n\n // Convert numeric calories to Schema.org string format\n if (nutrition.calories !== undefined) {\n if (typeof nutrition.calories === 'number') {\n result.calories = `${nutrition.calories} calories`;\n } else {\n result.calories = nutrition.calories;\n }\n }\n\n // Preserve other nutrition fields as-is (excluding @type which we override)\n Object.keys(nutrition).forEach(key => {\n if (key !== 'calories' && key !== '@type') {\n (result as any)[key] = (nutrition as any)[key];\n }\n });\n\n return result;\n}\n\nexport function cleanOutput<T extends Record<string, unknown>>(obj: T): T {\n return Object.fromEntries(\n Object.entries(obj).filter(([, value]) => value !== undefined)\n ) as T;\n}\n\n/**\n * Get schemaOrgMappable stacks from the recipe's stacks map.\n * Only stacks that are marked as schemaOrgMappable in the registry are included.\n * Returns a set of stack identifiers (e.g., [\"attribution@1\", \"times@1\"]).\n */\nfunction getSchemaOrgMappableStacks(stacks: Record<string, number> = {}): Set<string> {\n const mappableStackIds = new Set<string>();\n \n // Get list of mappable stack identifiers from registry\n const mappableFromRegistry = stacksRegistry.stacks\n .filter((stack) => stack.schemaOrgMappable)\n .map((stack) => `${stack.id}@${stack.latest}`);\n \n // Check which stacks in the recipe are mappable\n for (const [name, version] of Object.entries(stacks)) {\n const stackId = `${name}@${version}`;\n if (mappableFromRegistry.includes(stackId)) {\n mappableStackIds.add(stackId);\n }\n }\n \n return mappableStackIds;\n}\n\n/**\n * Convert a Soustack recipe to Schema.org JSON-LD format.\n * \n * BREAKING CHANGE in v0.3.0: This function now targets the \"minimal\" profile\n * and only includes stacks that are schemaOrgMappable (as defined in the\n * stacks registry). Non-mappable stacks (e.g., nutrition@1, schedule@1)\n * are excluded from the conversion.\n */\nexport function toSchemaOrg(recipe: Recipe): SchemaOrgRecipe {\n const base = convertBasicMetadata(recipe);\n const ingredients = convertIngredients(recipe.ingredients);\n const instructions = convertInstructions(recipe.instructions);\n \n // Get mappable stacks from recipe.stacks\n const recipeStacks = (recipe.stacks && typeof recipe.stacks === 'object' && !Array.isArray(recipe.stacks))\n ? recipe.stacks\n : {};\n const mappableStacks = getSchemaOrgMappableStacks(recipeStacks);\n \n // Only include nutrition if the nutrition stack is schemaOrgMappable\n // (Currently nutrition@1 is NOT mappable, so this will be undefined)\n const hasMappableNutrition = mappableStacks.has('nutrition@1');\n const nutrition = hasMappableNutrition ? convertNutrition(recipe.nutrition) : undefined;\n\n // Convert time if times stack is mappable (times@1 is mappable)\n // Prefer recipe.times (TimesModule) over recipe.time (legacy Time)\n const hasMappableTimes = mappableStacks.has('times@1');\n const timeData = hasMappableTimes\n ? (recipe.times ? convertTimesModule(recipe.times) : convertTime(recipe.time))\n : {};\n\n // Convert attribution if attribution stack is mappable (attribution@1 is mappable)\n const hasMappableAttribution = mappableStacks.has('attribution@1');\n const attributionData = hasMappableAttribution ? convertAuthor(recipe.source) : {};\n\n // Convert taxonomy if taxonomy stack is mappable (taxonomy@1 is mappable)\n const hasMappableTaxonomy = mappableStacks.has('taxonomy@1');\n const taxonomyData = hasMappableTaxonomy\n ? convertCategoryTags(recipe.category, recipe.tags)\n : {};\n\n return cleanOutput({\n ...base,\n recipeIngredient: ingredients.length ? ingredients : undefined,\n recipeInstructions: instructions.length ? instructions : undefined,\n recipeYield: convertYield(recipe.yield),\n ...timeData,\n ...attributionData,\n ...taxonomyData,\n nutrition\n }) as SchemaOrgRecipe;\n}\n\nfunction isStructuredTime(time: Time): time is StructuredTime {\n return (\n typeof (time as StructuredTime).prep !== 'undefined' ||\n typeof (time as StructuredTime).active !== 'undefined' ||\n typeof (time as StructuredTime).passive !== 'undefined' ||\n typeof (time as StructuredTime).total !== 'undefined'\n );\n}\n","import type { SchemaOrgRecipe } from '../types';\n\nconst RECIPE_TYPES = new Set([\n 'recipe',\n 'https://schema.org/recipe',\n 'http://schema.org/recipe'\n]);\n\nexport function isRecipeNode(value: unknown): value is SchemaOrgRecipe {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const type = (value as Record<string, unknown>)['@type'];\n\n if (typeof type === 'string') {\n return RECIPE_TYPES.has(type.toLowerCase());\n }\n\n if (Array.isArray(type)) {\n return type.some(\n entry => typeof entry === 'string' && RECIPE_TYPES.has(entry.toLowerCase())\n );\n }\n\n return false;\n}\n\nexport function safeJsonParse<T = unknown>(content: string): T | null {\n try {\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\nexport function normalizeText(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n const trimmed = value.replace(/\\s+/g, ' ').trim();\n return trimmed || undefined;\n}\n","import type { ExtractionResult, SchemaOrgRecipe } from '../types';\nimport { isRecipeNode, safeJsonParse, normalizeText } from './utils';\n\ntype JsonLdPayload = Record<string, unknown> | Array<Record<string, unknown>>;\n\nconst SIMPLE_PROPS = ['name', 'description', 'image', 'recipeYield', 'prepTime', 'cookTime', 'totalTime'] as const;\n\nexport function extractRecipeBrowser(html: string): ExtractionResult {\n // Extract JSON-LD\n const jsonLdRecipe = extractJsonLdBrowser(html);\n if (jsonLdRecipe) {\n return { recipe: jsonLdRecipe, source: 'jsonld' };\n }\n\n // Extract Microdata\n const microdataRecipe = extractMicrodataBrowser(html);\n if (microdataRecipe) {\n return { recipe: microdataRecipe, source: 'microdata' };\n }\n\n return { recipe: null, source: null };\n}\n\nfunction extractJsonLdBrowser(html: string): SchemaOrgRecipe | null {\n if (typeof (globalThis as any).DOMParser === 'undefined') {\n return null;\n }\n\n const parser = new (globalThis as any).DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const scripts = doc.querySelectorAll('script[type=\"application/ld+json\"]');\n const candidates: SchemaOrgRecipe[] = [];\n\n scripts.forEach((script: Element) => {\n const content = script.textContent;\n if (!content) return;\n\n const parsed = safeJsonParse<JsonLdPayload>(content);\n if (!parsed) return;\n\n collectCandidates(parsed, candidates);\n });\n\n return candidates[0] ?? null;\n}\n\nfunction extractMicrodataBrowser(html: string): SchemaOrgRecipe | null {\n if (typeof (globalThis as any).DOMParser === 'undefined') {\n return null;\n }\n\n const parser = new (globalThis as any).DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const recipeEl = doc.querySelector('[itemscope][itemtype*=\"schema.org/Recipe\"]');\n\n if (!recipeEl) {\n return null;\n }\n\n const recipe: SchemaOrgRecipe = {\n '@type': 'Recipe'\n };\n\n SIMPLE_PROPS.forEach(prop => {\n const value = findPropertyValue(recipeEl, prop);\n if (value) {\n recipe[prop] = value;\n }\n });\n\n const ingredients: string[] = [];\n recipeEl.querySelectorAll('[itemprop=\"recipeIngredient\"]').forEach((el: Element) => {\n const text = normalizeText(\n (el as any).getAttribute('content') || el.textContent || undefined\n );\n if (text) ingredients.push(text);\n });\n\n if (ingredients.length) {\n recipe.recipeIngredient = ingredients;\n }\n\n const instructions: string[] = [];\n recipeEl.querySelectorAll('[itemprop=\"recipeInstructions\"]').forEach((el: Element) => {\n const text =\n normalizeText((el as any).getAttribute('content')) ||\n normalizeText(el.querySelector('[itemprop=\"text\"]')?.textContent || undefined) ||\n normalizeText(el.textContent || undefined);\n if (text) instructions.push(text);\n });\n\n if (instructions.length) {\n recipe.recipeInstructions = instructions;\n }\n\n if (recipe.name || ingredients.length) {\n return recipe;\n }\n\n return null;\n}\n\nfunction findPropertyValue(context: Element, prop: string): string | undefined {\n const node = context.querySelector(`[itemprop=\"${prop}\"]`);\n if (!node) return undefined;\n\n return (\n normalizeText((node as any).getAttribute('content')) ||\n normalizeText((node as any).getAttribute('href')) ||\n normalizeText((node as any).getAttribute('src')) ||\n normalizeText(node.textContent || undefined)\n );\n}\n\nfunction collectCandidates(payload: unknown, bucket: SchemaOrgRecipe[]) {\n if (!payload) return;\n\n if (Array.isArray(payload)) {\n payload.forEach(entry => collectCandidates(entry, bucket));\n return;\n }\n\n if (typeof payload !== 'object') {\n return;\n }\n\n if (isRecipeNode(payload)) {\n bucket.push(payload);\n return;\n }\n\n const graph = (payload as Record<string, unknown>)['@graph'];\n if (Array.isArray(graph)) {\n graph.forEach(entry => collectCandidates(entry, bucket));\n }\n}\n\n","import { fromSchemaOrg } from '../fromSchemaOrg';\nimport type { Recipe } from '../types';\nimport type { SchemaOrgRecipe } from './types';\nimport { extractRecipeBrowser } from './extractors/browser';\n\nexport function extractSchemaOrgRecipeFromHTML(html: string): SchemaOrgRecipe | null {\n const { recipe } = extractRecipeBrowser(html);\n return recipe;\n}\n\nexport function extractRecipeFromHTML(html: string): Recipe {\n const recipe = extractSchemaOrgRecipeFromHTML(html);\n\n if (!recipe) {\n throw new Error('No Schema.org recipe data found in HTML');\n }\n\n const soustackRecipe = fromSchemaOrg(recipe);\n\n if (!soustackRecipe) {\n throw new Error('Schema.org data did not include a valid recipe');\n }\n\n return soustackRecipe;\n}\n","export const SOUSTACK_SPEC_VERSION = '0.3.0';\n","export type UnitDimension = 'mass' | 'volume' | 'count';\n\nexport type MassUnit = 'g' | 'kg' | 'oz' | 'lb';\nexport type VolumeUnit =\n | 'ml'\n | 'l'\n | 'tsp'\n | 'tbsp'\n | 'fl_oz'\n | 'cup'\n | 'pint'\n | 'quart'\n | 'gallon';\nexport type CountUnit = 'clove' | 'sprig' | 'leaf' | 'pinch' | 'bottle' | 'count';\n\nexport type Unit = MassUnit | VolumeUnit | CountUnit;\n\nexport type MetricMassUnit = 'g' | 'kg';\nexport type MetricVolumeUnit = 'ml' | 'l';\nexport type MetricCountUnit = 'count';\nexport type MetricUnit = MetricMassUnit | MetricVolumeUnit | MetricCountUnit;\n\nexport interface UnitDefinition {\n dimension: UnitDimension;\n /**\n * Multiplier that converts from the unit into metric base units (g or ml).\n */\n toMetricBase: number;\n metricBaseUnit: MetricUnit;\n isMetric: boolean;\n}\n\nconst MASS_UNITS: Record<MassUnit, UnitDefinition> = {\n g: {\n dimension: 'mass',\n toMetricBase: 1,\n metricBaseUnit: 'g',\n isMetric: true\n },\n kg: {\n dimension: 'mass',\n toMetricBase: 1000,\n metricBaseUnit: 'g',\n isMetric: true\n },\n oz: {\n dimension: 'mass',\n toMetricBase: 28.349523125,\n metricBaseUnit: 'g',\n isMetric: false\n },\n lb: {\n dimension: 'mass',\n toMetricBase: 453.59237,\n metricBaseUnit: 'g',\n isMetric: false\n }\n};\n\nconst VOLUME_UNITS: Record<VolumeUnit, UnitDefinition> = {\n ml: {\n dimension: 'volume',\n toMetricBase: 1,\n metricBaseUnit: 'ml',\n isMetric: true\n },\n l: {\n dimension: 'volume',\n toMetricBase: 1000,\n metricBaseUnit: 'ml',\n isMetric: true\n },\n tsp: {\n dimension: 'volume',\n toMetricBase: 4.92892159375,\n metricBaseUnit: 'ml',\n isMetric: false\n },\n tbsp: {\n dimension: 'volume',\n toMetricBase: 14.78676478125,\n metricBaseUnit: 'ml',\n isMetric: false\n },\n fl_oz: {\n dimension: 'volume',\n toMetricBase: 29.5735295625,\n metricBaseUnit: 'ml',\n isMetric: false\n },\n cup: {\n dimension: 'volume',\n toMetricBase: 236.5882365,\n metricBaseUnit: 'ml',\n isMetric: false\n },\n pint: {\n dimension: 'volume',\n toMetricBase: 473.176473,\n metricBaseUnit: 'ml',\n isMetric: false\n },\n quart: {\n dimension: 'volume',\n toMetricBase: 946.352946,\n metricBaseUnit: 'ml',\n isMetric: false\n },\n gallon: {\n dimension: 'volume',\n toMetricBase: 3785.411784,\n metricBaseUnit: 'ml',\n isMetric: false\n }\n};\n\nconst COUNT_UNITS: Record<CountUnit, UnitDefinition> = {\n clove: {\n dimension: 'count',\n toMetricBase: 1,\n metricBaseUnit: 'count',\n isMetric: true\n },\n sprig: {\n dimension: 'count',\n toMetricBase: 1,\n metricBaseUnit: 'count',\n isMetric: true\n },\n leaf: {\n dimension: 'count',\n toMetricBase: 1,\n metricBaseUnit: 'count',\n isMetric: true\n },\n pinch: {\n dimension: 'count',\n toMetricBase: 1,\n metricBaseUnit: 'count',\n isMetric: true\n },\n bottle: {\n dimension: 'count',\n toMetricBase: 1,\n metricBaseUnit: 'count',\n isMetric: true\n },\n count: {\n dimension: 'count',\n toMetricBase: 1,\n metricBaseUnit: 'count',\n isMetric: true\n }\n};\n\nexport const UNIT_DEFINITIONS: Record<Unit, UnitDefinition> = {\n ...MASS_UNITS,\n ...VOLUME_UNITS,\n ...COUNT_UNITS\n};\n\nexport type NormalizedUnit = keyof typeof UNIT_DEFINITIONS;\n\nexport function normalizeUnitToken(\n unit?: string | null\n): NormalizedUnit | null {\n if (!unit) {\n return null;\n }\n\n const token = unit.trim().toLowerCase().replace(/[\\s-]+/g, '_');\n const canonical = UNIT_SYNONYMS[token] ?? token;\n\n return (canonical as NormalizedUnit) in UNIT_DEFINITIONS\n ? (canonical as NormalizedUnit)\n : null;\n}\n\nconst UNIT_SYNONYMS: Partial<Record<string, NormalizedUnit>> = {\n teaspoons: 'tsp',\n teaspoon: 'tsp',\n tsps: 'tsp',\n tbsp: 'tbsp',\n tbsps: 'tbsp',\n tablespoon: 'tbsp',\n tablespoons: 'tbsp',\n cup: 'cup',\n cups: 'cup',\n pint: 'pint',\n pints: 'pint',\n quart: 'quart',\n quarts: 'quart',\n gallon: 'gallon',\n gallons: 'gallon',\n ml: 'ml',\n milliliter: 'ml',\n milliliters: 'ml',\n millilitre: 'ml',\n millilitres: 'ml',\n l: 'l',\n liter: 'l',\n liters: 'l',\n litre: 'l',\n litres: 'l',\n fl_oz: 'fl_oz',\n 'fl.oz': 'fl_oz',\n 'fl.oz.': 'fl_oz',\n 'fl_oz.': 'fl_oz',\n 'fl oz': 'fl_oz',\n 'fl oz.': 'fl_oz',\n fluid_ounce: 'fl_oz',\n fluid_ounces: 'fl_oz',\n oz: 'oz',\n ounce: 'oz',\n ounces: 'oz',\n lb: 'lb',\n lbs: 'lb',\n pound: 'lb',\n pounds: 'lb',\n g: 'g',\n gram: 'g',\n grams: 'g',\n kg: 'kg',\n kilogram: 'kg',\n kilograms: 'kg',\n clove: 'clove',\n cloves: 'clove',\n sprig: 'sprig',\n sprigs: 'sprig',\n leaf: 'leaf',\n leaves: 'leaf',\n pinch: 'pinch',\n pinches: 'pinch',\n bottle: 'bottle',\n bottles: 'bottle',\n count: 'count',\n counts: 'count'\n};\n\nexport function convertToMetricBase(\n quantity: number,\n unit: Unit\n): {\n quantity: number;\n baseUnit: MetricUnit;\n definition: UnitDefinition;\n} {\n const definition = UNIT_DEFINITIONS[unit];\n const quantityInMetricBase = quantity * definition.toMetricBase;\n return {\n quantity: quantityInMetricBase,\n baseUnit: definition.metricBaseUnit,\n definition\n };\n}\n","import {\n MetricMassUnit,\n MetricVolumeUnit,\n NormalizedUnit,\n convertToMetricBase,\n normalizeUnitToken,\n UNIT_DEFINITIONS\n} from './units';\n\nexport type ConvertTarget = 'metric';\nexport type ConvertMode = 'volume' | 'mass';\nexport type RoundMode = 'none' | 'sane';\n\nexport interface LineItem {\n ingredient: string;\n quantity: number;\n unit: string | null;\n}\n\nexport interface ConvertedLineItem extends LineItem {\n notes?: string;\n}\n\nexport class UnknownUnitError extends Error {\n constructor(public readonly unit: string) {\n super(`Unknown unit \"${unit}\".`);\n this.name = 'UnknownUnitError';\n }\n}\n\nexport class UnsupportedConversionError extends Error {\n constructor(\n public readonly unit: string,\n public readonly mode: ConvertMode\n ) {\n super(`Cannot convert unit \"${unit}\" in ${mode} mode.`);\n this.name = 'UnsupportedConversionError';\n }\n}\n\nexport class MissingEquivalencyError extends Error {\n constructor(\n public readonly ingredient: string,\n public readonly unit: string\n ) {\n super(\n `No volume to mass equivalency for \"${ingredient}\" (${unit}).`\n );\n this.name = 'MissingEquivalencyError';\n }\n}\n\ntype EquivalencyMap = Record<\n string,\n Partial<Record<NormalizedUnit, number>>\n>;\n\nconst VOLUME_TO_MASS_EQUIV_G_PER_UNIT: EquivalencyMap = {\n flour: {\n cup: 120\n }\n};\n\nconst DEFAULT_ROUND_MODE: RoundMode = 'sane';\n\nexport function convertLineItemToMetric(\n item: LineItem,\n mode: ConvertMode,\n opts?: { round?: RoundMode }\n): ConvertedLineItem {\n const roundMode = opts?.round ?? DEFAULT_ROUND_MODE;\n const normalizedUnit = normalizeUnitToken(item.unit);\n\n if (!normalizedUnit) {\n if (!item.unit || item.unit.trim() === '') {\n return item;\n }\n\n throw new UnknownUnitError(item.unit);\n }\n\n const definition = UNIT_DEFINITIONS[normalizedUnit];\n\n if (definition.dimension === 'count') {\n return item;\n }\n\n if (mode === 'volume') {\n if (definition.dimension !== 'volume') {\n throw new UnsupportedConversionError(item.unit ?? '', mode);\n }\n\n const { quantity, unit } = finalizeMetricVolume(\n convertToMetricBase(item.quantity, normalizedUnit).quantity,\n roundMode\n );\n\n return {\n ...item,\n quantity,\n unit\n };\n }\n\n // mode === 'mass'\n if (definition.dimension === 'mass') {\n const { quantity, unit } = finalizeMetricMass(\n convertToMetricBase(item.quantity, normalizedUnit).quantity,\n roundMode\n );\n\n return {\n ...item,\n quantity,\n unit\n };\n }\n\n if (definition.dimension !== 'volume') {\n throw new UnsupportedConversionError(item.unit ?? '', mode);\n }\n\n const gramsPerUnit = lookupEquivalency(\n item.ingredient,\n normalizedUnit\n );\n\n if (!gramsPerUnit) {\n throw new MissingEquivalencyError(item.ingredient, item.unit ?? '');\n }\n\n const grams = item.quantity * gramsPerUnit;\n const massResult = finalizeMetricMass(grams, roundMode);\n\n return {\n ...item,\n quantity: massResult.quantity,\n unit: massResult.unit,\n notes: `Converted using ${gramsPerUnit}g per ${normalizedUnit} for ${item.ingredient}.`\n };\n}\n\nfunction finalizeMetricVolume(\n milliliters: number,\n roundMode: RoundMode\n): { quantity: number; unit: MetricVolumeUnit } {\n if (roundMode === 'none') {\n return milliliters >= 1000\n ? { quantity: milliliters / 1000, unit: 'l' }\n : { quantity: milliliters, unit: 'ml' };\n }\n\n const roundedMl = roundMilliliters(milliliters);\n\n if (roundedMl >= 1000) {\n const liters = roundedMl / 1000;\n return {\n quantity: roundLargeMetric(liters),\n unit: 'l'\n };\n }\n\n return { quantity: roundedMl, unit: 'ml' };\n}\n\nfunction finalizeMetricMass(\n grams: number,\n roundMode: RoundMode\n): { quantity: number; unit: MetricMassUnit } {\n if (roundMode === 'none') {\n return grams >= 1000\n ? { quantity: grams / 1000, unit: 'kg' }\n : { quantity: grams, unit: 'g' };\n }\n\n const roundedGrams = roundGrams(grams);\n\n if (roundedGrams >= 1000) {\n const kilograms = roundedGrams / 1000;\n return {\n quantity: roundLargeMetric(kilograms),\n unit: 'kg'\n };\n }\n\n return { quantity: roundedGrams, unit: 'g' };\n}\n\nfunction roundGrams(value: number): number {\n if (value < 1000) {\n return Math.round(value);\n }\n\n return Math.round(value / 5) * 5;\n}\n\nfunction roundMilliliters(value: number): number {\n if (value < 1000) {\n return Math.round(value);\n }\n\n return Math.round(value / 10) * 10;\n}\n\nfunction roundLargeMetric(value: number): number {\n return Math.round(value * 100) / 100;\n}\n\nfunction lookupEquivalency(\n ingredient: string,\n unit: NormalizedUnit\n): number | undefined {\n const key = ingredient.trim().toLowerCase();\n return VOLUME_TO_MASS_EQUIV_G_PER_UNIT[key]?.[unit];\n}\n","export interface Quantity {\n amount: number;\n unit?: string | null;\n}\n\nexport interface Ingredient {\n id?: string;\n item: string;\n quantity?: Quantity;\n name?: string;\n prep?: string;\n prepAction?: string;\n prepActions?: string[];\n form?: string;\n prepTime?: number;\n optional?: boolean;\n notes?: string;\n}\n\nexport interface MiseEnPlaceTask {\n category: 'prep' | 'state' | 'measure' | 'other';\n action?: string;\n form?: string;\n items: Array<{\n ingredient: string;\n quantity?: Quantity;\n optional?: boolean;\n notes?: string;\n }>;\n}\n\nexport interface MiseEnPlacePlan {\n tasks: MiseEnPlaceTask[];\n ungrouped: Ingredient[];\n}\n\nexport function miseEnPlace(ingredients: Ingredient[]): MiseEnPlacePlan {\n const list = Array.isArray(ingredients) ? ingredients : [];\n\n const prepGroups = new Map<string, MiseEnPlaceTask>();\n const stateGroups = new Map<string, MiseEnPlaceTask>();\n let measureTask: MiseEnPlaceTask | undefined;\n let otherTask: MiseEnPlaceTask | undefined;\n const ungrouped: Ingredient[] = [];\n\n for (const ingredient of list) {\n if (!ingredient || typeof ingredient !== 'object') continue;\n\n const label = deriveIngredientLabel(ingredient);\n const quantity = normalizeQuantity(ingredient.quantity);\n const baseNotes = toDisplayString(ingredient.notes);\n const prepNotes = toDisplayString(ingredient.prep);\n const isOptional = typeof ingredient.optional === 'boolean' ? ingredient.optional : undefined;\n\n const buildItem = (extraNotes?: string) => {\n const item: MiseEnPlaceTask['items'][number] = {\n ingredient: label\n };\n\n if (quantity) {\n item.quantity = { ...quantity };\n }\n\n if (typeof isOptional === 'boolean') {\n item.optional = isOptional;\n }\n\n const notes = combineNotes(extraNotes, baseNotes);\n if (notes) {\n item.notes = notes;\n }\n\n return item;\n };\n\n let addedToTask = false;\n let hasPrepGrouping = false;\n\n const prepActionKeys = extractNormalizedList(ingredient.prepActions);\n if (prepActionKeys.length > 0) {\n hasPrepGrouping = true;\n for (const actionKey of prepActionKeys) {\n const task = ensureGroup(prepGroups, actionKey, () => ({\n category: 'prep',\n action: actionKey,\n items: []\n }));\n task.items.push(buildItem());\n addedToTask = true;\n }\n } else {\n const singleActionKey = normalizeKey(ingredient.prepAction);\n if (singleActionKey) {\n hasPrepGrouping = true;\n const task = ensureGroup(prepGroups, singleActionKey, () => ({\n category: 'prep',\n action: singleActionKey,\n items: []\n }));\n task.items.push(buildItem());\n addedToTask = true;\n } else if (prepNotes) {\n otherTask = otherTask ?? { category: 'other', items: [] };\n otherTask.items.push(buildItem(prepNotes));\n addedToTask = true;\n }\n }\n\n const formKey = normalizeKey(ingredient.form);\n const hasStateGrouping = Boolean(formKey);\n if (formKey) {\n const task = ensureGroup(stateGroups, formKey, () => ({\n category: 'state',\n form: formKey,\n items: []\n }));\n task.items.push(buildItem());\n addedToTask = true;\n }\n\n const shouldMeasure = Boolean(quantity) && !hasPrepGrouping && !hasStateGrouping;\n if (shouldMeasure) {\n measureTask = measureTask ?? { category: 'measure', items: [] };\n measureTask.items.push(buildItem());\n addedToTask = true;\n }\n\n if (!addedToTask) {\n ungrouped.push(ingredient);\n }\n }\n\n const tasks: MiseEnPlaceTask[] = [\n ...Array.from(prepGroups.values()).sort((a, b) => localeCompare(a.action, b.action)),\n ...Array.from(stateGroups.values()).sort((a, b) => localeCompare(a.form, b.form))\n ];\n\n if (measureTask) {\n tasks.push(measureTask);\n }\n\n if (otherTask) {\n tasks.push(otherTask);\n }\n\n return { tasks, ungrouped };\n}\n\nfunction deriveIngredientLabel(ingredient: Ingredient): string {\n return (\n toDisplayString(ingredient.name) ??\n toDisplayString(ingredient.item) ??\n toDisplayString(ingredient.id) ??\n 'ingredient'\n );\n}\n\nfunction extractNormalizedList(values?: string[]): string[] {\n if (!Array.isArray(values)) {\n return [];\n }\n const seen = new Set<string>();\n const result: string[] = [];\n for (const value of values) {\n const key = normalizeKey(value);\n if (key && !seen.has(key)) {\n seen.add(key);\n result.push(key);\n }\n }\n return result;\n}\n\nfunction normalizeKey(value?: string | null): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n const trimmed = value.trim().toLowerCase();\n return trimmed || null;\n}\n\nfunction toDisplayString(value?: string | null): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed || undefined;\n}\n\nfunction combineNotes(...notes: Array<string | undefined>): string | undefined {\n const cleaned = notes.map((note) => toDisplayString(note ?? undefined)).filter(Boolean) as string[];\n if (cleaned.length === 0) {\n return undefined;\n }\n return cleaned.join(' | ');\n}\n\nfunction normalizeQuantity(quantity?: Quantity | null): Quantity | undefined {\n if (!quantity || typeof quantity !== 'object') {\n return undefined;\n }\n const amount = (quantity as Quantity).amount;\n if (typeof amount !== 'number' || Number.isNaN(amount)) {\n return undefined;\n }\n const normalized: Quantity = { amount };\n if ('unit' in quantity) {\n const unit = (quantity as Quantity).unit;\n if (typeof unit === 'string') {\n const trimmed = unit.trim();\n if (trimmed) {\n normalized.unit = trimmed;\n }\n } else if (unit === null) {\n normalized.unit = null;\n }\n }\n return normalized;\n}\n\nfunction ensureGroup(\n map: Map<string, MiseEnPlaceTask>,\n key: string,\n factory: () => MiseEnPlaceTask\n): MiseEnPlaceTask {\n let task = map.get(key);\n if (!task) {\n task = factory();\n map.set(key, task);\n }\n return task;\n}\n\nfunction localeCompare(left?: string, right?: string): number {\n return (left ?? '').localeCompare(right ?? '');\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/defs/common.schema.json","../src/defs/duration.schema.json","../src/defs/entities.schema.json","../src/defs/ingredientQuantified.schema.json","../src/defs/quantity.schema.json","../src/defs/scalingRule.schema.json","../src/defs/temperature.schema.json","../src/profiles/lite.schema.json","../src/profiles/equipped.schema.json","../src/profiles/prepped.schema.json","../src/profiles/timed.schema.json","../src/parsers/duration.ts","../src/parser.ts","../src/normalize.ts","../src/specVersion.ts","../src/conformance/index.ts","../src/soustack.schema.json","../src/profiles/base.schema.json","../src/profiles/illustrated.schema.json","../src/profiles/scalable.schema.json","../src/stacks/registry.json","../src/schemaMetadata.ts","../src/validator.ts","../src/converters/yield.ts","../src/utils/image.ts","../src/fromSchemaOrg.ts","../src/converters/toSchemaOrg.ts","../src/scraper/extractors/utils.ts","../src/scraper/extractors/browser.ts","../src/scraper/browser.ts","../src/conversion/units.ts","../src/conversion/convertLineItem.ts","../src/mise-en-place/index.ts"],"names":["exports","_a","Ajv2020","addFormats","convertIngredients","value","convertInstructions","trimmed","convertTime","convertNutrition"],"mappings":"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","file":"index.js","sourcesContent":["{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://soustack.spec/defs/common.schema.json\",\n \"title\": \"Common definitions for Soustack\",\n \"type\": \"object\",\n \"properties\": {\n \"stackId\": {\n \"type\": \"string\",\n \"anyOf\": [\n {\n \"enum\": [\n \"quantified@1\",\n \"structured@1\",\n \"timed@1\",\n \"referenced@1\",\n \"compute@1\",\n \"storage@1\",\n \"dietary@1\",\n \"substitutions@1\",\n \"techniques@1\",\n \"illustrated@1\",\n \"scaling@1\",\n \"nutrition@1\"\n ]\n },\n {\n \"pattern\": \"^x-[A-Za-z0-9_-]+@[0-9]+$\",\n \"description\": \"Extension stacks must use x- prefix and include a major version\"\n }\n ]\n },\n \"extensionLane\": {\n \"type\": \"string\",\n \"pattern\": \"^x-[A-Za-z0-9_-]+$\"\n },\n \"extensionLaneValue\": {\n \"description\": \"Accept any JSON value for extension lanes while keeping the top-level property name constrained.\",\n \"type\": [\"object\", \"array\", \"string\", \"number\", \"boolean\", \"null\"]\n },\n \"uri\": {\n \"type\": \"string\",\n \"format\": \"uri\"\n }\n },\n \"additionalProperties\": false\n}\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://soustack.spec/defs/duration.schema.json\",\n \"title\": \"Durations\",\n \"type\": \"object\",\n \"properties\": {\n \"DurationMinutes\": {\n \"type\": \"object\",\n \"properties\": {\n \"minutes\": { \"type\": \"number\", \"exclusiveMinimum\": 0 },\n \"metadata\": { \"type\": \"object\", \"additionalProperties\": true }\n },\n \"required\": [\"minutes\"],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": { \"$ref\": \"./common.schema.json#/properties/extensionLaneValue\" }\n }\n },\n \"StorageDuration\": {\n \"type\": \"object\",\n \"properties\": {\n \"iso8601\": { \"type\": \"string\", \"pattern\": \"^P\" },\n \"metadata\": { \"type\": \"object\", \"additionalProperties\": true }\n },\n \"required\": [\"iso8601\"],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": { \"$ref\": \"./common.schema.json#/properties/extensionLaneValue\" }\n }\n }\n },\n \"additionalProperties\": false\n}\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://soustack.spec/defs/entities.schema.json\",\n \"title\": \"Soustack entity bases\",\n \"type\": \"object\",\n \"$defs\": {\n \"IngredientBase\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": { \"type\": \"string\" },\n \"name\": { \"type\": \"string\" },\n \"quantity\": { \"$ref\": \"./quantity.schema.json\" },\n \"temperature\": { \"$ref\": \"./temperature.schema.json\" },\n \"notes\": { \"type\": \"string\" },\n \"prep\": {\n \"oneOf\": [\n { \"type\": \"string\", \"minLength\": 1 },\n {\n \"type\": \"array\",\n \"minItems\": 1,\n \"items\": {\n \"anyOf\": [\n { \"type\": \"string\", \"minLength\": 1 },\n { \"$ref\": \"../stacks/prep.schema.json#/$defs/prepItem\" }\n ]\n }\n }\n ]\n },\n \"metadata\": { \"type\": \"object\", \"additionalProperties\": true },\n \"scaling\": { \"$ref\": \"./scalingRule.schema.json\" }\n },\n \"required\": [\"name\"],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": { \"$ref\": \"./common.schema.json#/properties/extensionLaneValue\" }\n }\n },\n \"StepBase\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": { \"type\": \"string\" },\n \"text\": { \"type\": \"string\" },\n \"dependsOn\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" },\n \"uniqueItems\": true\n },\n \"inputs\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" },\n \"uniqueItems\": true\n },\n \"techniqueIds\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" },\n \"uniqueItems\": true\n },\n \"usesEquipment\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"pattern\": \"^[A-Za-z0-9._-]+$\"\n },\n \"uniqueItems\": true\n },\n \"temperature\": { \"$ref\": \"./temperature.schema.json\" },\n \"timing\": {\n \"type\": \"object\",\n \"properties\": {\n \"activity\": { \"type\": \"string\", \"enum\": [\"active\", \"passive\"] },\n \"duration\": {\n \"type\": \"object\",\n \"oneOf\": [\n { \"$ref\": \"./duration.schema.json#/properties/DurationMinutes\" },\n {\n \"type\": \"object\",\n \"properties\": {\n \"minMinutes\": { \"type\": \"number\", \"exclusiveMinimum\": 0 },\n \"maxMinutes\": { \"type\": \"number\", \"exclusiveMinimum\": 0 }\n },\n \"required\": [\"minMinutes\", \"maxMinutes\"],\n \"additionalProperties\": false\n }\n ]\n },\n \"completionCue\": { \"type\": \"string\" },\n \"metadata\": { \"type\": \"object\", \"additionalProperties\": true }\n },\n \"anyOf\": [\n { \"required\": [\"duration\"] },\n { \"required\": [\"completionCue\"] }\n ],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": { \"$ref\": \"./common.schema.json#/properties/extensionLaneValue\" }\n }\n },\n \"images\": { \"type\": \"array\", \"items\": { \"$ref\": \"./common.schema.json#/properties/uri\" } },\n \"videos\": { \"type\": \"array\", \"items\": { \"$ref\": \"./common.schema.json#/properties/uri\" } },\n \"metadata\": { \"type\": \"object\", \"additionalProperties\": true }\n },\n \"required\": [\"text\"],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": { \"$ref\": \"./common.schema.json#/properties/extensionLaneValue\" }\n }\n }\n },\n \"additionalProperties\": false\n}\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://soustack.spec/defs/ingredientQuantified.schema.json\",\n \"title\": \"Quantified Ingredient\",\n \"allOf\": [\n { \"$ref\": \"./entities.schema.json#/$defs/IngredientBase\" },\n { \"required\": [\"id\", \"quantity\"] }\n ]\n}\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://soustack.spec/defs/quantity.schema.json\",\n \"title\": \"Quantity\",\n \"type\": \"object\",\n \"properties\": {\n \"amount\": { \"type\": \"number\" },\n \"unit\": { \"type\": \"string\", \"minLength\": 1 },\n \"metadata\": { \"type\": \"object\", \"additionalProperties\": true }\n },\n \"required\": [\"amount\", \"unit\"],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": { \"$ref\": \"./common.schema.json#/properties/extensionLaneValue\" }\n }\n}\n","{\n\"$id\": \"https://soustack.spec/defs/scalingRule.schema.json\",\n\"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n\"title\": \"Soustack ScalingRule\",\n\"type\": \"object\",\n\"additionalProperties\": false,\n\"required\": [\"mode\"],\n\"properties\": {\n\"mode\": {\n\"type\": \"string\",\n\"enum\": [\"linear\", \"fixed\", \"discrete\", \"toTaste\", \"bakersPercent\"]\n},\n\n\"step\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0\n},\n\"rounding\": {\n \"type\": \"string\",\n \"enum\": [\"nearest\", \"ceil\", \"floor\"]\n},\n\"min\": {\n \"type\": \"number\"\n},\n\"max\": {\n \"type\": \"number\"\n},\n\n\"percent\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0\n},\n\"of\": {\n \"type\": \"string\",\n \"minLength\": 1\n}\n\n},\n\n\"allOf\": [\n{\n\"if\": {\n\"properties\": { \"mode\": { \"const\": \"linear\" } },\n\"required\": [\"mode\"]\n},\n\"then\": {\n\"not\": {\n\"anyOf\": [\n{ \"required\": [\"step\"] },\n{ \"required\": [\"rounding\"] },\n{ \"required\": [\"min\"] },\n{ \"required\": [\"max\"] },\n{ \"required\": [\"percent\"] },\n{ \"required\": [\"of\"] }\n]\n}\n}\n},\n{\n\"if\": {\n\"properties\": { \"mode\": { \"const\": \"fixed\" } },\n\"required\": [\"mode\"]\n},\n\"then\": {\n\"not\": {\n\"anyOf\": [\n{ \"required\": [\"step\"] },\n{ \"required\": [\"rounding\"] },\n{ \"required\": [\"min\"] },\n{ \"required\": [\"max\"] },\n{ \"required\": [\"percent\"] },\n{ \"required\": [\"of\"] }\n]\n}\n}\n},\n{\n\"if\": {\n\"properties\": { \"mode\": { \"const\": \"toTaste\" } },\n\"required\": [\"mode\"]\n},\n\"then\": {\n\"not\": {\n\"anyOf\": [\n{ \"required\": [\"step\"] },\n{ \"required\": [\"rounding\"] },\n{ \"required\": [\"min\"] },\n{ \"required\": [\"max\"] },\n{ \"required\": [\"percent\"] },\n{ \"required\": [\"of\"] }\n]\n}\n}\n},\n{\n\"if\": {\n\"properties\": { \"mode\": { \"const\": \"discrete\" } },\n\"required\": [\"mode\"]\n},\n\"then\": {\n\"not\": {\n\"anyOf\": [\n{ \"required\": [\"percent\"] },\n{ \"required\": [\"of\"] }\n]\n}\n}\n},\n{\n\"if\": {\n\"properties\": { \"mode\": { \"const\": \"bakersPercent\" } },\n\"required\": [\"mode\"]\n},\n\"then\": {\n\"required\": [\"percent\", \"of\"],\n\"not\": {\n\"anyOf\": [\n{ \"required\": [\"step\"] },\n{ \"required\": [\"rounding\"] },\n{ \"required\": [\"min\"] },\n{ \"required\": [\"max\"] }\n]\n}\n}\n}\n]\n}","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://soustack.spec/defs/temperature.schema.json\",\n \"title\": \"Temperature\",\n \"type\": \"object\",\n \"oneOf\": [\n {\n \"type\": \"object\",\n \"properties\": {\n \"target\": {\n \"type\": \"string\",\n \"enum\": [\"oven\", \"stovetop\", \"pan\", \"oil\", \"water\", \"grill\", \"broiler\", \"internal\", \"ambient\", \"surface\"]\n },\n \"level\": {\n \"type\": \"string\",\n \"enum\": [\"veryLow\", \"low\", \"medium\", \"mediumHigh\", \"high\", \"veryHigh\"]\n },\n \"metadata\": { \"type\": \"object\", \"additionalProperties\": true }\n },\n \"required\": [\"target\", \"level\"],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": { \"$ref\": \"./common.schema.json#/properties/extensionLaneValue\" }\n }\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"target\": {\n \"type\": \"string\",\n \"enum\": [\"oven\", \"stovetop\", \"pan\", \"oil\", \"water\", \"grill\", \"broiler\", \"internal\", \"ambient\", \"surface\"]\n },\n \"unit\": { \"type\": \"string\", \"enum\": [\"celsius\", \"fahrenheit\"] },\n \"value\": { \"type\": \"number\" },\n \"approximate\": { \"type\": \"boolean\" },\n \"metadata\": { \"type\": \"object\", \"additionalProperties\": true }\n },\n \"required\": [\"target\", \"unit\", \"value\"],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": { \"$ref\": \"./common.schema.json#/properties/extensionLaneValue\" }\n }\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"target\": {\n \"type\": \"string\",\n \"enum\": [\"oven\", \"stovetop\", \"pan\", \"oil\", \"water\", \"grill\", \"broiler\", \"internal\", \"ambient\", \"surface\"]\n },\n \"unit\": { \"type\": \"string\", \"enum\": [\"celsius\", \"fahrenheit\"] },\n \"minValue\": { \"type\": \"number\" },\n \"maxValue\": { \"type\": \"number\" },\n \"metadata\": { \"type\": \"object\", \"additionalProperties\": true }\n },\n \"required\": [\"target\", \"unit\", \"minValue\", \"maxValue\"],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": { \"$ref\": \"./common.schema.json#/properties/extensionLaneValue\" }\n }\n }\n ]\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/v0.0.2/profiles/lite\",\n \"title\": \"Soustack Lite Profile Schema\",\n \"description\": \"Wrapper schema that exposes the unmodified Soustack base schema.\",\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.0.2\" }\n ]\n}\n\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/v0.0.2/profiles/equipped\",\n \"title\": \"Soustack Equipped Profile Schema\",\n \"description\": \"Profile for recipes that declare required tools/equipment.\",\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.0.2/profiles/base\" }\n ]\n}\n\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/v0.0.2/profiles/prepped\",\n \"title\": \"Soustack Prepped Profile Schema\",\n \"description\": \"Profile for recipes that include prep guidance and/or mise en place tasks.\",\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.0.2/profiles/base\" }\n ]\n}\n\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/v0.0.2/profiles/timed\",\n \"title\": \"Soustack Timed Profile Schema\",\n \"description\": \"Extends the base schema to guarantee structured instructions with timing metadata.\",\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.0.2\" }\n ]\n}\n\n","const ISO_DURATION_REGEX =\n /^P(?:(\\d+(?:\\.\\d+)?)D)?(?:T(?:(\\d+(?:\\.\\d+)?)H)?(?:(\\d+(?:\\.\\d+)?)M)?(?:(\\d+(?:\\.\\d+)?)S)?)?$/i;\n\nconst HUMAN_OVERNIGHT = 8 * 60; // 8 hours\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\n\nexport function parseDuration(iso: string | number): number | null;\nexport function parseDuration(iso: string | number | null | undefined): number | null;\nexport function parseDuration(iso: string | number | null | undefined): number | null {\n if (typeof iso === 'number' && Number.isFinite(iso)) {\n return iso;\n }\n\n if (!iso || typeof iso !== 'string') return null;\n\n const trimmed = iso.trim();\n if (!trimmed) return null;\n\n const match = trimmed.match(ISO_DURATION_REGEX);\n if (!match) return null;\n\n const [, daysRaw, hoursRaw, minutesRaw, secondsRaw] = match;\n\n if (!daysRaw && !hoursRaw && !minutesRaw && !secondsRaw) {\n return null;\n }\n\n let total = 0;\n if (daysRaw) total += parseFloat(daysRaw) * 24 * 60;\n if (hoursRaw) total += parseFloat(hoursRaw) * 60;\n if (minutesRaw) total += parseFloat(minutesRaw);\n if (secondsRaw) total += Math.ceil(parseFloat(secondsRaw) / 60);\n\n return Math.round(total);\n}\n\nexport function formatDuration(minutes: number): string;\nexport function formatDuration(minutes: number | null | undefined): string;\nexport function formatDuration(minutes: number | null | undefined): string {\n if (!isFiniteNumber(minutes) || minutes <= 0) {\n return 'PT0M';\n }\n\n const rounded = Math.round(minutes);\n const days = Math.floor(rounded / (24 * 60));\n const afterDays = rounded % (24 * 60);\n const hours = Math.floor(afterDays / 60);\n const mins = afterDays % 60;\n\n let result = 'P';\n\n if (days > 0) {\n result += `${days}D`;\n }\n\n if (hours > 0 || mins > 0) {\n result += 'T';\n if (hours > 0) {\n result += `${hours}H`;\n }\n if (mins > 0) {\n result += `${mins}M`;\n }\n }\n\n if (result === 'P') {\n return 'PT0M';\n }\n\n return result;\n}\n\nexport function parseHumanDuration(text: string): number | null;\nexport function parseHumanDuration(text: string | null | undefined): number | null;\nexport function parseHumanDuration(text: string | null | undefined): number | null {\n if (!text || typeof text !== 'string') return null;\n\n const normalized = text.toLowerCase().trim();\n if (!normalized) return null;\n\n if (normalized === 'overnight') {\n return HUMAN_OVERNIGHT;\n }\n\n let total = 0;\n\n const hourRegex = /(\\d+(?:\\.\\d+)?)\\s*(?:hours?|hrs?|hr|h)\\b/g;\n let hourMatch: RegExpExecArray | null;\n while ((hourMatch = hourRegex.exec(normalized)) !== null) {\n total += parseFloat(hourMatch[1]) * 60;\n }\n\n const minuteRegex = /(\\d+(?:\\.\\d+)?)\\s*(?:minutes?|mins?|min|m)\\b/g;\n let minuteMatch: RegExpExecArray | null;\n while ((minuteMatch = minuteRegex.exec(normalized)) !== null) {\n total += parseFloat(minuteMatch[1]);\n }\n\n if (total <= 0) {\n return null;\n }\n\n return Math.round(total);\n}\n\nexport function smartParseDuration(input: string): number | null;\nexport function smartParseDuration(input: string | null | undefined): number | null;\nexport function smartParseDuration(input: string | null | undefined): number | null {\n const iso = parseDuration(input);\n if (iso !== null) {\n return iso;\n }\n return parseHumanDuration(input);\n}\n","import {\n Recipe,\n Ingredient,\n IngredientItem,\n Instruction,\n InstructionItem,\n Equipment,\n ScaledRecipe,\n EquipmentUpgradeRecommendation\n} from './types';\nimport { parseDuration } from './parsers/duration';\n\n// --- Output Types ---\n\nexport interface ScaleRecipeOptions {\n multiplier?: number;\n targetYield?: {\n amount: number;\n unit?: string;\n };\n}\n\n// --- Main Logic ---\n\nexport function scaleRecipe(recipe: Recipe, options: ScaleRecipeOptions = {}): Recipe {\n const multiplier = resolveMultiplier(recipe, options);\n const scaled: ScaledRecipe = deepClone(recipe);\n\n applyYieldScaling(scaled, options, multiplier);\n const equipmentUpgrades = scaleEquipment(scaled.equipment || [], multiplier);\n\n const baseAmounts = collectBaseIngredientAmounts(scaled.ingredients || []);\n const scaledAmounts = new Map<string, number>();\n const orderedIngredients: Ingredient[] = [];\n\n collectIngredients(scaled.ingredients || [], orderedIngredients);\n\n orderedIngredients\n .filter(ing => {\n const mode = (ing.scaling as any)?.mode || (ing.scaling as any)?.type || 'linear';\n return mode !== 'bakersPercent' && mode !== 'bakers_percentage';\n })\n .forEach(ing => {\n const key = getIngredientKey(ing);\n scaledAmounts.set(key, calculateIndependentIngredient(ing, multiplier));\n });\n\n orderedIngredients\n .filter(ing => {\n const mode = (ing.scaling as any)?.mode || (ing.scaling as any)?.type;\n return mode === 'bakersPercent' || mode === 'bakers_percentage';\n })\n .forEach(ing => {\n const key = getIngredientKey(ing);\n const scaling = ing.scaling as any;\n const referenceId = scaling?.of || scaling?.referenceId;\n const percent = scaling?.percent || scaling?.factor;\n\n if (!referenceId) {\n throw new Error(`Baker's percentage ingredient \"${key}\" is missing a reference (of/referenceId)`);\n }\n\n const referenceAmount = scaledAmounts.get(referenceId);\n if (referenceAmount === undefined) {\n throw new Error(`Reference ingredient \"${referenceId}\" not found for baker's percentage item \"${key}\"`);\n }\n\n const baseAmount = ing.quantity?.amount || 0;\n const referenceBase = baseAmounts.get(referenceId);\n const calculatedPercent = percent ?? (referenceBase ? (baseAmount / referenceBase) * 100 : undefined);\n if (calculatedPercent === undefined) {\n throw new Error(`Unable to determine percentage for baker's percentage ingredient \"${key}\"`);\n }\n\n scaledAmounts.set(key, referenceAmount * (calculatedPercent / 100));\n });\n\n orderedIngredients.forEach(ing => {\n const key = getIngredientKey(ing);\n const amount = scaledAmounts.get(key);\n if (amount === undefined) return;\n\n if (!ing.quantity) {\n ing.quantity = { amount, unit: null };\n } else {\n ing.quantity.amount = amount;\n }\n });\n\n scaleInstructionItems(scaled.instructions || [], multiplier);\n\n scaled.scaling = {\n ...(scaled.scaling ?? {}),\n multiplier,\n equipment: {\n upgrades: equipmentUpgrades\n }\n };\n\n return scaled;\n}\n\n// --- Helper Functions ---\n\nfunction resolveMultiplier(recipe: Recipe, options: ScaleRecipeOptions): number {\n if (options.multiplier && options.multiplier > 0) {\n return options.multiplier;\n }\n\n if (options.targetYield?.amount) {\n const base = recipe.yield?.amount || 1;\n return options.targetYield.amount / base;\n }\n\n return 1;\n}\n\nfunction applyYieldScaling(recipe: Recipe, options: ScaleRecipeOptions, multiplier: number) {\n const baseAmount = recipe.yield?.amount ?? 1;\n const targetAmount = options.targetYield?.amount ?? baseAmount * multiplier;\n const unit = options.targetYield?.unit ?? recipe.yield?.unit;\n\n if (!recipe.yield && !options.targetYield) return;\n\n recipe.yield = {\n amount: targetAmount,\n unit: unit ?? ''\n } as any;\n}\n\nfunction getIngredientKey(ing: Ingredient): string {\n return ing.id || ing.name;\n}\n\nfunction calculateIndependentIngredient(ing: Ingredient, multiplier: number): number {\n const baseAmount = ing.quantity?.amount || 0;\n const scaling = ing.scaling as any;\n const mode = scaling?.mode || scaling?.type || 'linear';\n\n switch (mode) {\n case 'fixed':\n return baseAmount;\n case 'discrete': {\n const scaled = baseAmount * multiplier;\n const step = (ing.scaling as any)?.roundTo ?? 1;\n const rounded = Math.round(scaled / step) * step;\n return Math.round(rounded);\n }\n case 'proportional': {\n const factor = (ing.scaling as any)?.factor ?? 1;\n return baseAmount * multiplier * factor;\n }\n default:\n return baseAmount * multiplier;\n }\n}\n\nfunction collectIngredients(items: IngredientItem[], bucket: Ingredient[]) {\n items.forEach(item => {\n if (typeof item === 'string') return;\n if ('section' in item) {\n collectIngredients(item.ingredients, bucket);\n } else {\n bucket.push(item);\n }\n });\n}\n\nfunction collectBaseIngredientAmounts(items: IngredientItem[], map = new Map<string, number>()) {\n items.forEach(item => {\n if (typeof item === 'string') return;\n if ('section' in item) {\n collectBaseIngredientAmounts(item.ingredients, map);\n } else {\n map.set(getIngredientKey(item), item.quantity?.amount ?? 0);\n }\n });\n return map;\n}\n\nfunction scaleInstructionItems(items: InstructionItem[], multiplier: number) {\n items.forEach(item => {\n if (typeof item === 'string') return;\n\n if ('section' in item) {\n scaleInstructionItems(item.steps, multiplier);\n return;\n }\n\n const timing = item.timing;\n if (!timing || !timing.duration) return;\n\n // Handle DurationMinutes format: { minutes: number }\n const baseDuration = typeof timing.duration === 'object' && 'minutes' in timing.duration\n ? timing.duration.minutes\n : toDurationMinutes(timing.duration as any);\n \n // Default to linear scaling for timing (vNext doesn't have scaling property)\n const newDuration = Math.ceil(baseDuration * multiplier);\n\n if (typeof timing.duration === 'object' && 'minutes' in timing.duration) {\n timing.duration.minutes = newDuration;\n } else {\n // Fallback for legacy format\n (timing as any).duration = newDuration;\n }\n });\n}\n\nfunction scaleEquipment(items: (Equipment | string)[], multiplier: number): EquipmentUpgradeRecommendation[] {\n const upgrades: EquipmentUpgradeRecommendation[] = [];\n\n items.forEach(item => {\n if (typeof item === 'string') return;\n\n const scaledCount = calculateEquipmentCount(item, multiplier);\n if (scaledCount !== undefined) {\n item.count = scaledCount;\n }\n\n const upgrade = chooseEquipmentUpgrade(item, multiplier);\n if (upgrade) {\n upgrades.push(upgrade);\n }\n });\n\n return upgrades;\n}\n\nfunction calculateEquipmentCount(equipment: Equipment, multiplier: number): number | undefined {\n const baseCount = equipment.count ?? 1;\n const scaling = equipment.countScaling;\n\n if (!scaling) {\n return equipment.count;\n }\n\n if (scaling === 'fixed') {\n return baseCount;\n }\n\n if (scaling === 'linear') {\n return Math.ceil(baseCount * multiplier);\n }\n\n if (typeof scaling === 'object' && scaling.mode === 'threshold') {\n const steps = scaling.steps || [];\n if (steps.length === 0) {\n return equipment.count;\n }\n\n const matchedStep = steps.find(step => multiplier <= step.maxFactor);\n const selected = matchedStep ?? steps[steps.length - 1];\n return selected.count;\n }\n\n return equipment.count;\n}\n\nfunction chooseEquipmentUpgrade(equipment: Equipment, multiplier: number): EquipmentUpgradeRecommendation | null {\n if (!equipment.upgrades || equipment.upgrades.length === 0 || !equipment.id) {\n return null;\n }\n\n const eligible = equipment.upgrades.filter(rule => multiplier >= rule.minFactor);\n if (eligible.length === 0) {\n return null;\n }\n\n const selected = eligible.reduce((best, current) => current.minFactor > best.minFactor ? current : best, eligible[0]);\n\n return {\n fromId: equipment.id,\n use: selected.use,\n minFactor: selected.minFactor\n };\n}\n\nfunction deepClone<T>(value: T): T {\n return JSON.parse(JSON.stringify(value));\n}\n\nfunction toDurationMinutes(duration?: number | string): number {\n if (typeof duration === 'number' && Number.isFinite(duration)) {\n return duration;\n }\n\n if (typeof duration === 'string' && duration.trim().startsWith('P')) {\n const parsed = parseDuration(duration.trim());\n if (parsed !== null) {\n return parsed;\n }\n }\n\n return 0;\n}\n","import { parseDuration } from './parsers/duration';\nimport { Recipe } from './types';\n\nexport interface NormalizationResult {\n recipe: Recipe;\n warnings: string[];\n}\n\n/**\n * Normalizes a recipe input to the current spec format:\n * - Rejects inputs with legacy field (unsupported)\n * - Converts legacy `stacks` array format to map format\n * - Ensures `stacks` exists even if empty\n * - Preserves existing `stacks` map format\n * \n * @param input - Raw recipe input (may have legacy formats)\n * @returns Normalized recipe with warnings for any issues encountered\n * @throws Error if input contains legacy field\n */\nexport function normalizeRecipe(input: unknown): NormalizationResult {\n if (!input || typeof input !== 'object') {\n throw new Error('Recipe input must be an object');\n }\n\n const recipe = JSON.parse(JSON.stringify(input)) as any;\n const warnings: string[] = [];\n\n // Reject inputs with legacy field\n const legacyField = [\"mod\", \"ules\"].join(\"\");\n if (legacyField in recipe) {\n throw new Error('The legacy field is no longer supported. Use `stacks` instead.');\n }\n\n // Normalize stacks from legacy array format\n normalizeStacks(recipe, warnings);\n\n // Ensure stacks exists (even if empty)\n if (!recipe.stacks) {\n recipe.stacks = {};\n }\n\n // Normalize deprecated version field\n if (\n recipe &&\n typeof recipe === 'object' &&\n 'version' in recipe &&\n !(recipe as any).recipeVersion &&\n typeof (recipe as any).version === 'string'\n ) {\n (recipe as any).recipeVersion = (recipe as any).version;\n // Remove the deprecated version field after normalizing to avoid validation errors\n delete (recipe as any).version;\n warnings.push(\"'version' is deprecated; mapped to 'recipeVersion'.\");\n }\n\n // Normalize time\n normalizeTime(recipe);\n\n return {\n recipe: recipe as Recipe,\n warnings,\n };\n}\n\n/**\n * Normalizes the stacks field from legacy formats to the map format.\n * Handles:\n * - Legacy `stacks` array: [\"scaling@1\"] -> { scaling: 1 }\n * - Existing `stacks` map: { scaling: 1 } -> preserved as-is\n */\nfunction normalizeStacks(recipe: any, warnings: string[]): void {\n // Start with existing stacks map if valid\n let stacks: Record<string, number> = {};\n if (recipe.stacks && typeof recipe.stacks === 'object' && !Array.isArray(recipe.stacks)) {\n // Validate that all values are numbers and copy valid entries\n for (const [key, value] of Object.entries(recipe.stacks)) {\n if (typeof value === 'number' && Number.isInteger(value) && value >= 1) {\n stacks[key] = value;\n } else {\n warnings.push(`Invalid stack version for '${key}': expected positive integer, got ${value}`);\n }\n }\n }\n\n // Check legacy stacks array format (only if stacks wasn't already a map)\n if (Array.isArray(recipe.stacks)) {\n const stackIdentifiers: string[] = recipe.stacks.filter((s: any) => typeof s === 'string');\n\n // Parse stack identifiers into stacks map and merge with existing stacks\n for (const identifier of stackIdentifiers) {\n const parsed = parseStackIdentifier(identifier);\n if (parsed) {\n const { name, version } = parsed;\n // If the same stack appears multiple times, keep the highest version\n if (!stacks[name] || stacks[name] < version) {\n stacks[name] = version;\n }\n } else {\n warnings.push(`Invalid stack identifier '${identifier}': expected format 'name@version' (e.g., 'scaling@1')`);\n }\n }\n }\n\n // Set the normalized stacks\n recipe.stacks = stacks;\n}\n\n/**\n * Parses a stack identifier string like \"scaling@1\" into { name: \"scaling\", version: 1 }\n * Returns null if the format is invalid.\n */\nfunction parseStackIdentifier(identifier: string): { name: string; version: number } | null {\n if (typeof identifier !== 'string' || !identifier.trim()) {\n return null;\n }\n\n const match = identifier.trim().match(/^([a-z0-9_-]+)@(\\d+)$/i);\n if (!match) {\n return null;\n }\n\n const [, name, versionStr] = match;\n const version = parseInt(versionStr, 10);\n\n if (isNaN(version) || version < 1) {\n return null;\n }\n\n return { name, version };\n}\n\nfunction normalizeTime(recipe: Recipe): void {\n const time = (recipe as any)?.time;\n if (!time || typeof time !== 'object' || Array.isArray(time)) return;\n\n const structuredKeys: Array<'prep' | 'active' | 'passive' | 'total'> = [\n 'prep',\n 'active',\n 'passive',\n 'total',\n ];\n\n structuredKeys.forEach((key) => {\n const value = (time as any)[key];\n if (typeof value === 'number') return;\n\n const parsed = parseDuration(value as any);\n if (parsed !== null) {\n (time as any)[key] = parsed;\n }\n });\n}\n","export const SOUSTACK_SPEC_VERSION = '0.0.2';\n","import { Recipe, Instruction, Ingredient, IngredientItem, InstructionItem } from \"../types\";\nimport { SOUSTACK_SPEC_VERSION } from \"../specVersion\";\n\nexport type ConformanceSeverity = \"error\" | \"warning\";\n\nexport interface ConformanceIssue {\n code: string;\n path: string;\n message: string;\n severity: ConformanceSeverity;\n}\n\nexport interface ConformanceResult {\n ok: boolean;\n issues: ConformanceIssue[];\n}\n\n/**\n * Validates semantic conformance rules that cannot be expressed in JSON Schema.\n * This includes DAG validity, timing schedulability, and scaling sanity checks.\n */\nexport function validateConformance(recipe: Recipe): ConformanceResult {\n const issues: ConformanceIssue[] = [];\n\n // Check DAG validity for step dependencies\n issues.push(...checkDAGValidity(recipe));\n\n // Check timing schedulability if schedulable profile is present\n if (hasSchedulableProfile(recipe)) {\n issues.push(...checkTimingSchedulability(recipe));\n }\n\n // Check scaling sanity (baker's percentage references, discrete min/max)\n issues.push(...checkScalingSanity(recipe));\n\n // Check equipment references\n issues.push(...checkEquipmentReferences(recipe));\n\n // Check referenced stack input resolution\n issues.push(...checkReferencedInputs(recipe));\n\n // Check timed duration range sanity\n issues.push(...checkTimedDurationRanges(recipe));\n\n const ok = issues.filter((i) => i.severity === \"error\").length === 0;\n\n return { ok, issues };\n}\n\n/**\n * Checks if recipe uses the schedulable profile.\n * This is detected via $schema field pointing to the schedulable profile schema.\n */\nfunction hasSchedulableProfile(recipe: Recipe): boolean {\n const schema = (recipe as any).$schema;\n if (typeof schema === \"string\") {\n const schedulableSchema = `http://soustack.org/schema/v${SOUSTACK_SPEC_VERSION}/profiles/schedulable`;\n // Check for schedulable profile schema ID\n return (\n schema.includes(\"schedulable\") ||\n schema === schedulableSchema\n );\n }\n return false;\n}\n\n/**\n * Validates DAG (Directed Acyclic Graph) properties of step dependencies:\n * - dependsOn references must point to valid step IDs\n * - No cycles in the dependency graph\n * - No orphaned referenced IDs (all referenced IDs must exist)\n */\nfunction checkDAGValidity(recipe: Recipe): ConformanceIssue[] {\n const issues: ConformanceIssue[] = [];\n const instructions = recipe.instructions;\n if (!Array.isArray(instructions)) {\n return issues;\n }\n\n const instructionIds = new Set<string>();\n const dependencyRefs: { fromId?: string; toId: string; path: string }[] = [];\n\n // Collect all instruction IDs and dependencies\n const collect = (items: InstructionItem[], basePath: string) => {\n items.forEach((item, index) => {\n const currentPath = `${basePath}/${index}`;\n\n if (isInstructionSubsection(item)) {\n if (Array.isArray(item.items)) {\n collect(item.items, `${currentPath}/items`);\n }\n return;\n }\n\n if (isInstruction(item)) {\n const id = typeof item.id === \"string\" ? item.id : undefined;\n if (id) {\n instructionIds.add(id);\n }\n\n if (Array.isArray(item.dependsOn)) {\n item.dependsOn.forEach((depId, depIndex) => {\n if (typeof depId === \"string\") {\n dependencyRefs.push({\n fromId: id,\n toId: depId,\n path: `${currentPath}/dependsOn/${depIndex}`,\n });\n }\n });\n }\n }\n });\n };\n\n collect(instructions, \"/instructions\");\n\n // Check for missing referenced IDs\n dependencyRefs.forEach((ref) => {\n if (!instructionIds.has(ref.toId)) {\n issues.push({\n code: \"DAG_MISSING_NODE\",\n path: ref.path,\n message: `Instruction dependency references missing step id '${ref.toId}'.`,\n severity: \"error\",\n });\n }\n });\n\n // Check for cycles using DFS\n const adjacency = new Map<string, { toId: string; path: string }[]>();\n dependencyRefs.forEach((ref) => {\n if (ref.fromId && instructionIds.has(ref.fromId) && instructionIds.has(ref.toId)) {\n const list = adjacency.get(ref.fromId) ?? [];\n list.push({ toId: ref.toId, path: ref.path });\n adjacency.set(ref.fromId, list);\n }\n });\n\n const visiting = new Set<string>();\n const visited = new Set<string>();\n\n const detectCycles = (nodeId: string) => {\n if (visiting.has(nodeId)) {\n // Cycle detected - find the edge that completes the cycle\n return;\n }\n if (visited.has(nodeId)) {\n return;\n }\n\n visiting.add(nodeId);\n const neighbors = adjacency.get(nodeId) ?? [];\n neighbors.forEach((edge) => {\n if (visiting.has(edge.toId)) {\n issues.push({\n code: \"DAG_CYCLE\",\n path: edge.path,\n message: `Circular dependency detected involving step id '${edge.toId}'.`,\n severity: \"error\",\n });\n return;\n }\n detectCycles(edge.toId);\n });\n visiting.delete(nodeId);\n visited.add(nodeId);\n };\n\n instructionIds.forEach((id) => detectCycles(id));\n\n return issues;\n}\n\n/**\n * Validates timing schedulability rules for schedulable profile:\n * - Each step must be placeable on a timeline\n * - Either timing.duration exists OR completionCue includes an estimated duration\n * For now, we check that timing.duration exists (completionCue is not in the spec yet)\n */\nfunction checkTimingSchedulability(recipe: Recipe): ConformanceIssue[] {\n const issues: ConformanceIssue[] = [];\n const instructions = recipe.instructions;\n if (!Array.isArray(instructions)) {\n return issues;\n }\n\n const checkInstruction = (item: InstructionItem, path: string): void => {\n if (isInstructionSubsection(item)) {\n if (Array.isArray(item.items)) {\n item.items.forEach((subItem, index) => {\n checkInstruction(subItem, `${path}/items/${index}`);\n });\n }\n return;\n }\n\n if (isInstruction(item)) {\n // Schedulable profile requires id and timing\n if (!item.id) {\n issues.push({\n code: \"SCHEDULABLE_MISSING_ID\",\n path: path,\n message: \"Schedulable profile requires all instructions to have an id.\",\n severity: \"error\",\n });\n }\n\n if (!item.timing) {\n issues.push({\n code: \"SCHEDULABLE_MISSING_TIMING\",\n path: path,\n message: \"Schedulable profile requires all instructions to have timing information.\",\n severity: \"error\",\n });\n } else if (!item.timing.duration) {\n issues.push({\n code: \"SCHEDULABLE_MISSING_DURATION\",\n path: `${path}/timing`,\n message: \"Schedulable profile requires timing.duration for all instructions.\",\n severity: \"error\",\n });\n }\n }\n };\n\n instructions.forEach((item, index) => {\n checkInstruction(item, `/instructions/${index}`);\n });\n\n return issues;\n}\n\n/**\n * Validates scaling sanity:\n * - Any baker's percentage references must resolve to an ingredient present in recipe\n * - Discrete scaling min must be <= max\n */\nfunction checkScalingSanity(recipe: Recipe): ConformanceIssue[] {\n const issues: ConformanceIssue[] = [];\n const ingredients = recipe.ingredients;\n if (!Array.isArray(ingredients)) {\n return issues;\n }\n\n // Collect all ingredient IDs\n const ingredientIds = new Set<string>();\n const collectIngredientIds = (items: IngredientItem[], basePath: string) => {\n items.forEach((item, index) => {\n const currentPath = `${basePath}/${index}`;\n\n if (isIngredientSubsection(item)) {\n if (Array.isArray(item.items)) {\n collectIngredientIds(item.items, `${currentPath}/items`);\n }\n return;\n }\n\n // Handle both legacy format (has \"item\" property) and new format (has \"id\" property)\n if (isIngredient(item)) {\n if (typeof item.id === \"string\") {\n ingredientIds.add(item.id);\n }\n } else if (item && typeof item === \"object\" && !Array.isArray(item) && typeof item !== \"string\") {\n // Handle new format ingredients (have id/name/quantity, not item property)\n const itemAny = item as any;\n if (\"id\" in itemAny && typeof itemAny.id === \"string\") {\n ingredientIds.add(itemAny.id);\n }\n }\n });\n };\n\n collectIngredientIds(ingredients, \"/ingredients\");\n\n // Check baker's percentage references\n const checkIngredient = (item: IngredientItem, path: string): void => {\n if (isIngredientSubsection(item)) {\n if (Array.isArray(item.items)) {\n item.items.forEach((subItem, index) => {\n checkIngredient(subItem, `${path}/items/${index}`);\n });\n }\n return;\n }\n\n // Handle both legacy format (has \"item\" property) and new format (has \"id\" property)\n if (isIngredient(item) || (item && typeof item === \"object\" && !Array.isArray(item) && typeof item !== \"string\" && \"id\" in item)) {\n const itemAny = item as any;\n const scaling = itemAny.scaling;\n // Check for bakersPercent mode (new schema format) or bakers_percentage type (legacy format)\n const isBakersPercent = scaling &&\n typeof scaling === \"object\" &&\n ((\"mode\" in scaling && scaling.mode === \"bakersPercent\") ||\n (\"type\" in scaling && scaling.type === \"bakers_percentage\"));\n \n if (isBakersPercent) {\n // Handle both new format (mode: \"bakersPercent\", of: string) and legacy format (type: \"bakers_percentage\", referenceId: string)\n const bakersScaling = scaling as any;\n const referenceId = bakersScaling.of || bakersScaling.referenceId;\n \n if (referenceId) {\n if (!ingredientIds.has(referenceId)) {\n issues.push({\n code: \"SCALING_INVALID_REFERENCE\",\n path: `${path}/scaling/${bakersScaling.of ? \"of\" : \"referenceId\"}`,\n message: `Baker's percentage references missing ingredient id '${referenceId}'.`,\n severity: \"error\",\n });\n }\n } else {\n issues.push({\n code: \"SCALING_MISSING_REFERENCE\",\n path: `${path}/scaling`,\n message: \"Baker's percentage scaling requires an 'of' field (or 'referenceId' for legacy format).\",\n severity: \"error\",\n });\n }\n }\n }\n };\n\n ingredients.forEach((item, index) => {\n checkIngredient(item, `/ingredients/${index}`);\n });\n\n // Check recipe-level discrete scaling min/max sanity\n const recipeAny = recipe as any;\n if (recipeAny.scaling && typeof recipeAny.scaling === \"object\") {\n const scaling = recipeAny.scaling;\n if (scaling.discrete && typeof scaling.discrete === \"object\") {\n const discrete = scaling.discrete;\n if (typeof discrete.min === \"number\" && typeof discrete.max === \"number\") {\n if (discrete.min > discrete.max) {\n issues.push({\n code: \"SCALING_INVALID_RANGE\",\n path: \"/scaling/discrete\",\n message: `Discrete scaling min (${discrete.min}) must be <= max (${discrete.max}).`,\n severity: \"error\",\n });\n }\n }\n }\n }\n\n return issues;\n}\n\n/**\n * Validates equipment references:\n * - usesEquipment references in instructions must point to valid equipment IDs\n * - mise-en-place equipment references must point to valid equipment IDs\n * - mise-en-place input references must point to valid ingredient IDs\n */\nfunction checkEquipmentReferences(recipe: Recipe): ConformanceIssue[] {\n const issues: ConformanceIssue[] = [];\n \n // Collect all equipment IDs\n const equipmentIds = new Set<string>();\n if (Array.isArray(recipe.equipment)) {\n recipe.equipment.forEach((eq) => {\n if (eq && typeof eq === \"object\" && \"id\" in eq && typeof eq.id === \"string\") {\n equipmentIds.add(eq.id);\n }\n });\n }\n\n // Collect all ingredient IDs\n const ingredientIds = new Set<string>();\n const collectIngredientIds = (items: IngredientItem[], basePath: string) => {\n items.forEach((item, index) => {\n const currentPath = `${basePath}/${index}`;\n\n if (isIngredientSubsection(item)) {\n if (Array.isArray(item.items)) {\n collectIngredientIds(item.items, `${currentPath}/items`);\n }\n return;\n }\n\n // Handle both legacy format (has \"item\" property) and new format (has \"id\" property)\n // Referenced/quantified stacks use IngredientBase which has \"id\" and \"name\", not \"item\"\n if (isIngredient(item)) {\n if (typeof item.id === \"string\") {\n ingredientIds.add(item.id);\n }\n } else if (item && typeof item === \"object\" && !Array.isArray(item) && typeof item !== \"string\") {\n // Handle ingredient objects from referenced/quantified stacks\n // TypeScript narrows item to never after isIngredient, so we need to check again\n const itemAny = item as any;\n if (\"id\" in itemAny && typeof itemAny.id === \"string\") {\n ingredientIds.add(itemAny.id);\n }\n }\n });\n };\n\n if (Array.isArray(recipe.ingredients)) {\n collectIngredientIds(recipe.ingredients, \"/ingredients\");\n }\n\n // Check usesEquipment references in instructions\n const checkInstruction = (item: InstructionItem, path: string): void => {\n // Handle step sections (structured stack)\n if (isStepSection(item)) {\n if (Array.isArray(item.steps)) {\n item.steps.forEach((step, index) => {\n checkInstruction(step, `${path}/steps/${index}`);\n });\n }\n return;\n }\n\n // Handle instruction subsections (legacy)\n if (isInstructionSubsection(item)) {\n if (Array.isArray(item.items)) {\n item.items.forEach((step, index) => {\n checkInstruction(step, `${path}/items/${index}`);\n });\n }\n return;\n }\n\n // Handle actual instruction/step\n if (isInstruction(item)) {\n const step = item as any; // Use any to access dynamic properties\n \n if (Array.isArray(step.usesEquipment)) {\n step.usesEquipment.forEach((eqId: string, index: number) => {\n if (typeof eqId === \"string\" && !equipmentIds.has(eqId)) {\n issues.push({\n code: \"EQUIPMENT_UNKNOWN_REFERENCE\",\n path: `${path}/usesEquipment/${index}`,\n message: `Equipment reference '${eqId}' does not exist in recipe equipment.`,\n severity: \"error\",\n });\n }\n });\n }\n\n // Check mise-en-place equipment references\n if (step.miseEnPlace && typeof step.miseEnPlace === \"object\") {\n const mep = step.miseEnPlace as any;\n if (Array.isArray(mep.equipment)) {\n mep.equipment.forEach((eqId: any, index: number) => {\n if (typeof eqId === \"string\" && !equipmentIds.has(eqId)) {\n issues.push({\n code: \"EQUIPMENT_UNKNOWN_REFERENCE\",\n path: `${path}/miseEnPlace/equipment/${index}`,\n message: `Mise-en-place equipment reference '${eqId}' does not exist in recipe equipment.`,\n severity: \"error\",\n });\n }\n });\n }\n\n // Check mise-en-place input references\n if (Array.isArray(mep.inputs)) {\n mep.inputs.forEach((inputId: any, index: number) => {\n if (typeof inputId === \"string\" && !ingredientIds.has(inputId)) {\n issues.push({\n code: \"MISE_EN_PLACE_UNKNOWN_INPUT\",\n path: `${path}/miseEnPlace/inputs/${index}`,\n message: `Mise-en-place input reference '${inputId}' does not exist in recipe ingredients.`,\n severity: \"error\",\n });\n }\n });\n }\n }\n }\n };\n\n if (Array.isArray(recipe.instructions)) {\n recipe.instructions.forEach((item, index) => {\n checkInstruction(item, `/instructions/${index}`);\n });\n }\n\n // Check top-level miseEnPlace array\n const recipeAny = recipe as any;\n if (Array.isArray(recipeAny.miseEnPlace)) {\n recipeAny.miseEnPlace.forEach((mepItem: any, index: number) => {\n if (mepItem && typeof mepItem === \"object\") {\n // Check equipment references in miseEnPlace\n if (Array.isArray(mepItem.usesEquipment)) {\n mepItem.usesEquipment.forEach((eqId: string, eqIndex: number) => {\n if (typeof eqId === \"string\" && !equipmentIds.has(eqId)) {\n issues.push({\n code: \"EQUIPMENT_UNKNOWN_REFERENCE\",\n path: `/miseEnPlace/${index}/usesEquipment/${eqIndex}`,\n message: `Mise-en-place equipment reference '${eqId}' does not exist in recipe equipment.`,\n severity: \"error\",\n });\n }\n });\n }\n\n // Check input references in miseEnPlace\n if (Array.isArray(mepItem.inputs)) {\n mepItem.inputs.forEach((inputId: string, inputIndex: number) => {\n if (typeof inputId === \"string\" && !ingredientIds.has(inputId)) {\n issues.push({\n code: \"MISE_EN_PLACE_UNKNOWN_INPUT\",\n path: `/miseEnPlace/${index}/inputs/${inputIndex}`,\n message: `Mise-en-place input reference '${inputId}' does not exist in recipe ingredients.`,\n severity: \"error\",\n });\n }\n });\n }\n }\n });\n }\n\n return issues;\n}\n\n/**\n * Validates referenced stack input resolution:\n * - Steps with referenced stack must have inputs array\n * - Input IDs must resolve to valid ingredient IDs\n */\nfunction checkReferencedInputs(recipe: Recipe): ConformanceIssue[] {\n const issues: ConformanceIssue[] = [];\n const recipeAny = recipe as any;\n \n // Check if referenced stack is declared\n const stacks = recipeAny.stacks;\n if (!stacks || typeof stacks !== \"object\" || !stacks.referenced) {\n return issues; // No referenced stack, skip check\n }\n\n // Collect all ingredient IDs\n const ingredientIds = new Set<string>();\n const collectIngredientIds = (items: IngredientItem[], basePath: string) => {\n items.forEach((item, index) => {\n const currentPath = `${basePath}/${index}`;\n\n if (isIngredientSubsection(item)) {\n if (Array.isArray(item.items)) {\n collectIngredientIds(item.items, `${currentPath}/items`);\n }\n return;\n }\n\n // Handle both legacy format (has \"item\" property) and new format (has \"id\" property)\n if (isIngredient(item)) {\n if (typeof item.id === \"string\") {\n ingredientIds.add(item.id);\n }\n } else if (item && typeof item === \"object\" && !Array.isArray(item) && typeof item !== \"string\") {\n const itemAny = item as any;\n if (\"id\" in itemAny && typeof itemAny.id === \"string\") {\n ingredientIds.add(itemAny.id);\n }\n }\n });\n };\n\n if (Array.isArray(recipe.ingredients)) {\n collectIngredientIds(recipe.ingredients, \"/ingredients\");\n }\n\n // Check instructions for referenced stack requirements\n const checkInstruction = (item: InstructionItem, path: string): void => {\n if (isStepSection(item)) {\n if (Array.isArray(item.steps)) {\n item.steps.forEach((step, index) => {\n checkInstruction(step, `${path}/steps/${index}`);\n });\n }\n return;\n }\n\n if (isInstructionSubsection(item)) {\n if (Array.isArray(item.items)) {\n item.items.forEach((step, index) => {\n checkInstruction(step, `${path}/items/${index}`);\n });\n }\n return;\n }\n\n if (isInstruction(item)) {\n const step = item as any;\n \n // Referenced stack requires inputs array\n if (!Array.isArray(step.inputs)) {\n issues.push({\n code: \"REFERENCED_MISSING_INPUTS\",\n path: path,\n message: \"Referenced stack requires steps to have an 'inputs' array.\",\n severity: \"error\",\n });\n } else {\n // Check that all input IDs resolve to valid ingredient IDs\n step.inputs.forEach((inputId: any, index: number) => {\n if (typeof inputId === \"string\") {\n if (!ingredientIds.has(inputId)) {\n issues.push({\n code: \"REFERENCED_INVALID_INPUT\",\n path: `${path}/inputs/${index}`,\n message: `Referenced input '${inputId}' does not exist in recipe ingredients.`,\n severity: \"error\",\n });\n }\n }\n });\n }\n }\n };\n\n if (Array.isArray(recipe.instructions)) {\n recipe.instructions.forEach((item, index) => {\n checkInstruction(item, `/instructions/${index}`);\n });\n }\n\n return issues;\n}\n\n/**\n * Validates timed duration range sanity:\n * - DurationRange minMinutes must be <= maxMinutes\n */\nfunction checkTimedDurationRanges(recipe: Recipe): ConformanceIssue[] {\n const issues: ConformanceIssue[] = [];\n const recipeAny = recipe as any;\n \n // Check if timed stack is declared\n const stacks = recipeAny.stacks;\n if (!stacks || typeof stacks !== \"object\" || !stacks.timed) {\n return issues; // No timed stack, skip check\n }\n\n // Check instructions for timed duration ranges\n const checkInstruction = (item: InstructionItem, path: string): void => {\n if (isStepSection(item)) {\n if (Array.isArray(item.steps)) {\n item.steps.forEach((step, index) => {\n checkInstruction(step, `${path}/steps/${index}`);\n });\n }\n return;\n }\n\n if (isInstructionSubsection(item)) {\n if (Array.isArray(item.items)) {\n item.items.forEach((step, index) => {\n checkInstruction(step, `${path}/items/${index}`);\n });\n }\n return;\n }\n\n if (isInstruction(item)) {\n const step = item as any;\n const timing = step.timing;\n \n if (timing && typeof timing === \"object\" && timing.duration) {\n const duration = timing.duration;\n // Check if it's a DurationRange (has both minMinutes and maxMinutes)\n if (typeof duration === \"object\" && \"minMinutes\" in duration && \"maxMinutes\" in duration) {\n const minMinutes = duration.minMinutes;\n const maxMinutes = duration.maxMinutes;\n \n if (typeof minMinutes === \"number\" && typeof maxMinutes === \"number\") {\n if (minMinutes > maxMinutes) {\n issues.push({\n code: \"TIMED_INVALID_RANGE\",\n path: `${path}/timing/duration`,\n message: `Timed duration minMinutes (${minMinutes}) must be <= maxMinutes (${maxMinutes}).`,\n severity: \"error\",\n });\n }\n }\n }\n }\n }\n };\n\n if (Array.isArray(recipe.instructions)) {\n recipe.instructions.forEach((item, index) => {\n checkInstruction(item, `/instructions/${index}`);\n });\n }\n\n return issues;\n}\n\n// Type guards\nfunction isInstruction(item: any): item is Instruction {\n return item && typeof item === \"object\" && !Array.isArray(item) && \"text\" in item;\n}\n\nfunction isInstructionSubsection(item: any): item is { items: any[]; subsection: string } {\n return (\n item &&\n typeof item === \"object\" &&\n !Array.isArray(item) &&\n \"items\" in item &&\n \"subsection\" in item\n );\n}\n\nfunction isStepSection(item: any): item is { section: string; steps: any[] } {\n return (\n item &&\n typeof item === \"object\" &&\n !Array.isArray(item) &&\n \"section\" in item &&\n \"steps\" in item\n );\n}\n\nfunction isIngredient(item: any): item is Ingredient {\n return item && typeof item === \"object\" && !Array.isArray(item) && \"item\" in item;\n}\n\nfunction isIngredientSubsection(item: any): item is { items: any[]; subsection: string } {\n return (\n item &&\n typeof item === \"object\" &&\n !Array.isArray(item) &&\n \"items\" in item &&\n \"subsection\" in item\n );\n}\n","{\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"$id\": \"https://soustack.spec/soustack.schema.json\",\n \"title\": \"Soustack Specification\",\n \"type\": \"object\",\n \"properties\": {\n \"$schema\": {\n \"type\": \"string\",\n \"const\": \"https://soustack.spec/soustack.schema.json\"\n },\n \"profile\": {\n \"type\": \"string\",\n \"anyOf\": [\n {\n \"enum\": [\n \"base\",\n \"equipped\",\n \"illustrated\",\n \"lite\",\n \"prepped\",\n \"scalable\",\n \"timed\"\n ]\n },\n {\n \"pattern\": \"^x-[a-z0-9-]+(?:\\\\.[a-z0-9-]+)*$\"\n }\n ]\n },\n \"stacks\": {\n \"$ref\": \"#/$defs/stacksMap\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"yield\": {\n \"type\": \"object\",\n \"properties\": {\n \"amount\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0\n },\n \"unit\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n },\n \"required\": [\n \"amount\",\n \"unit\"\n ],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": {\n \"$ref\": \"./defs/common.schema.json#/properties/extensionLaneValue\"\n }\n }\n },\n \"time\": {\n \"type\": \"object\",\n \"properties\": {\n \"total\": {\n \"$ref\": \"./defs/duration.schema.json#/properties/DurationMinutes\"\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n },\n \"required\": [\n \"total\"\n ],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": {\n \"$ref\": \"./defs/common.schema.json#/properties/extensionLaneValue\"\n }\n }\n },\n \"ingredients\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"$ref\": \"#/$defs/ingredient\"\n },\n {\n \"$ref\": \"#/$defs/ingredientSection\"\n }\n ]\n }\n },\n \"instructions\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"$ref\": \"#/$defs/step\"\n },\n {\n \"$ref\": \"#/$defs/stepSection\"\n }\n ]\n }\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n },\n \"images\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"./defs/common.schema.json#/properties/uri\"\n }\n },\n \"videos\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"./defs/common.schema.json#/properties/uri\"\n }\n },\n \"dietary\": {\n \"$ref\": \"./stacks/dietary.schema.json#/properties/dietary\"\n },\n \"storage\": {\n \"$ref\": \"./stacks/storage.schema.json#/properties/storage\"\n },\n \"substitutions\": {\n \"$ref\": \"./stacks/substitutions.schema.json#/properties/substitutions\"\n },\n \"techniques\": {\n \"$ref\": \"./stacks/techniques.schema.json#/properties/techniques\"\n },\n \"scaling\": {\n \"$ref\": \"./stacks/scaling.schema.json#/properties/scaling\"\n }\n },\n \"patternProperties\": {\n \"^x-\": {\n \"$ref\": \"./defs/common.schema.json#/properties/extensionLaneValue\"\n }\n },\n \"required\": [\n \"stacks\",\n \"name\",\n \"ingredients\",\n \"instructions\"\n ],\n \"allOf\": [\n {\n \"if\": {\n \"required\": [\n \"profile\"\n ],\n \"properties\": {\n \"profile\": {\n \"enum\": [\n \"base\",\n \"equipped\",\n \"illustrated\",\n \"prepped\",\n \"scalable\",\n \"timed\"\n ]\n }\n }\n },\n \"then\": {\n \"required\": [\n \"yield\",\n \"time\"\n ]\n }\n },\n {\n \"$comment\": \"BEGIN GENERATED STACK GATING\"\n },\n {\n \"if\": {\n \"required\": [\n \"profile\"\n ],\n \"properties\": {\n \"profile\": {\n \"const\": \"equipped\"\n }\n }\n },\n \"then\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"equipment\"\n ],\n \"properties\": {\n \"equipment\": {\n \"type\": \"integer\",\n \"enum\": [\n 1\n ]\n }\n }\n }\n }\n }\n },\n {\n \"if\": {\n \"required\": [\n \"profile\"\n ],\n \"properties\": {\n \"profile\": {\n \"const\": \"illustrated\"\n }\n }\n },\n \"then\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"illustrated\"\n ],\n \"properties\": {\n \"illustrated\": {\n \"type\": \"integer\",\n \"enum\": [\n 1\n ]\n }\n }\n }\n }\n }\n },\n {\n \"if\": {\n \"required\": [\n \"profile\"\n ],\n \"properties\": {\n \"profile\": {\n \"const\": \"prepped\"\n }\n }\n },\n \"then\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"prep\"\n ],\n \"properties\": {\n \"prep\": {\n \"type\": \"integer\",\n \"enum\": [\n 1\n ]\n }\n }\n }\n }\n }\n },\n {\n \"if\": {\n \"required\": [\n \"profile\"\n ],\n \"properties\": {\n \"profile\": {\n \"const\": \"scalable\"\n }\n }\n },\n \"then\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"quantified\",\n \"scaling\"\n ],\n \"properties\": {\n \"quantified\": {\n \"type\": \"integer\",\n \"enum\": [\n 1\n ]\n },\n \"scaling\": {\n \"type\": \"integer\",\n \"enum\": [\n 1\n ]\n }\n }\n }\n }\n }\n },\n {\n \"if\": {\n \"required\": [\n \"profile\"\n ],\n \"properties\": {\n \"profile\": {\n \"const\": \"timed\"\n }\n }\n },\n \"then\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"structured\",\n \"timed\"\n ],\n \"properties\": {\n \"structured\": {\n \"type\": \"integer\",\n \"enum\": [\n 1\n ]\n },\n \"timed\": {\n \"type\": \"integer\",\n \"enum\": [\n 1\n ]\n }\n }\n }\n }\n }\n },\n {\n \"allOf\": [\n {\n \"if\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"compute\"\n ]\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"stacks\": {\n \"properties\": {\n \"compute\": {\n \"enum\": [\n 1\n ]\n }\n }\n }\n }\n }\n },\n {\n \"if\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"compute\"\n ],\n \"properties\": {\n \"compute\": {\n \"const\": 1\n }\n }\n }\n }\n },\n \"then\": {\n \"allOf\": [\n {\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"quantified\"\n ],\n \"properties\": {\n \"quantified\": {\n \"enum\": [\n 1\n ]\n }\n }\n }\n }\n },\n {\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"timed\"\n ],\n \"properties\": {\n \"timed\": {\n \"enum\": [\n 1\n ]\n }\n }\n }\n }\n }\n ]\n }\n }\n ]\n },\n {\n \"allOf\": [\n {\n \"if\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"dietary\"\n ]\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"stacks\": {\n \"properties\": {\n \"dietary\": {\n \"enum\": [\n 1\n ]\n }\n }\n }\n }\n }\n },\n {\n \"if\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"dietary\"\n ],\n \"properties\": {\n \"dietary\": {\n \"const\": 1\n }\n }\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"dietary\": {\n \"type\": \"object\",\n \"properties\": {\n \"basis\": {\n \"type\": \"string\",\n \"enum\": [\n \"perServing\",\n \"perRecipe\"\n ]\n },\n \"calories\": {\n \"type\": \"number\",\n \"minimum\": 0\n },\n \"macros\": {\n \"type\": \"object\",\n \"properties\": {\n \"protein\": {\n \"type\": \"number\",\n \"minimum\": 0\n },\n \"fat\": {\n \"type\": \"number\",\n \"minimum\": 0\n },\n \"carbohydrates\": {\n \"type\": \"number\",\n \"minimum\": 0\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n },\n \"minProperties\": 1,\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": {\n \"$ref\": \"https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue\"\n }\n }\n },\n \"diets\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"allergens\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n }\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n },\n \"required\": [\n \"basis\"\n ],\n \"additionalProperties\": false,\n \"anyOf\": [\n {\n \"required\": [\n \"calories\"\n ]\n },\n {\n \"required\": [\n \"macros\"\n ]\n },\n {\n \"required\": [\n \"diets\"\n ]\n },\n {\n \"required\": [\n \"allergens\"\n ]\n }\n ],\n \"patternProperties\": {\n \"^x-\": {\n \"$ref\": \"https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue\"\n }\n }\n }\n },\n \"required\": [\n \"dietary\"\n ]\n }\n }\n ]\n },\n {\n \"allOf\": [\n {\n \"if\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"equipment\"\n ]\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"stacks\": {\n \"properties\": {\n \"equipment\": {\n \"enum\": [\n 1\n ]\n }\n }\n }\n }\n }\n },\n {\n \"if\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"equipment\"\n ],\n \"properties\": {\n \"equipment\": {\n \"const\": 1\n }\n }\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"equipment\": {\n \"type\": \"array\",\n \"minItems\": 1,\n \"items\": {\n \"anyOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"$ref\": \"#/$defs/equipment@1_equipmentItem\"\n }\n ]\n }\n }\n },\n \"required\": [\n \"equipment\"\n ]\n }\n }\n ]\n },\n {\n \"allOf\": [\n {\n \"if\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"illustrated\"\n ]\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"stacks\": {\n \"properties\": {\n \"illustrated\": {\n \"enum\": [\n 1\n ]\n }\n }\n }\n }\n }\n },\n {\n \"if\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"illustrated\"\n ],\n \"properties\": {\n \"illustrated\": {\n \"const\": 1\n }\n }\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"images\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"https://soustack.spec/defs/common.schema.json#/properties/uri\"\n }\n },\n \"videos\": {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"https://soustack.spec/defs/common.schema.json#/properties/uri\"\n }\n },\n \"instructions\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/illustrated@1_illustratedStep\"\n },\n {\n \"$ref\": \"#/$defs/illustrated@1_illustratedSection\"\n }\n ]\n }\n }\n }\n }\n }\n ]\n },\n {\n \"allOf\": [\n {\n \"if\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"prep\"\n ]\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"stacks\": {\n \"properties\": {\n \"prep\": {\n \"enum\": [\n 1\n ]\n }\n }\n }\n }\n }\n },\n {\n \"if\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"prep\"\n ],\n \"properties\": {\n \"prep\": {\n \"const\": 1\n }\n }\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"miseEnPlace\": {\n \"type\": \"array\",\n \"minItems\": 1,\n \"items\": {\n \"$ref\": \"#/$defs/prep@1_miseEnPlaceTask\"\n }\n }\n },\n \"required\": [\n \"miseEnPlace\"\n ]\n }\n }\n ]\n },\n {\n \"allOf\": [\n {\n \"if\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"quantified\"\n ]\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"stacks\": {\n \"properties\": {\n \"quantified\": {\n \"enum\": [\n 1\n ]\n }\n }\n }\n }\n }\n },\n {\n \"if\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"quantified\"\n ],\n \"properties\": {\n \"quantified\": {\n \"const\": 1\n }\n }\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"ingredients\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/quantified@1_ingredient\"\n },\n {\n \"$ref\": \"#/$defs/quantified@1_ingredientSection\"\n }\n ]\n }\n }\n },\n \"required\": [\n \"ingredients\"\n ]\n }\n }\n ]\n },\n {\n \"allOf\": [\n {\n \"if\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"referenced\"\n ]\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"stacks\": {\n \"properties\": {\n \"referenced\": {\n \"enum\": [\n 1\n ]\n }\n }\n }\n }\n }\n },\n {\n \"if\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"referenced\"\n ],\n \"properties\": {\n \"referenced\": {\n \"const\": 1\n }\n }\n }\n }\n },\n \"then\": {\n \"allOf\": [\n {\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"structured\"\n ],\n \"properties\": {\n \"structured\": {\n \"enum\": [\n 1\n ]\n }\n }\n }\n }\n },\n {\n \"properties\": {\n \"ingredients\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/referenced@1_ingredient\"\n },\n {\n \"$ref\": \"#/$defs/referenced@1_ingredientSection\"\n }\n ]\n }\n },\n \"instructions\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/referenced@1_referencedStep\"\n },\n {\n \"$ref\": \"#/$defs/referenced@1_referencedSection\"\n }\n ]\n }\n }\n },\n \"required\": [\n \"ingredients\",\n \"instructions\"\n ]\n }\n ]\n }\n }\n ]\n },\n {\n \"allOf\": [\n {\n \"if\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"scaling\"\n ]\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"stacks\": {\n \"properties\": {\n \"scaling\": {\n \"enum\": [\n 1\n ]\n }\n }\n }\n }\n }\n },\n {\n \"if\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"scaling\"\n ],\n \"properties\": {\n \"scaling\": {\n \"const\": 1\n }\n }\n }\n }\n },\n \"then\": {\n \"allOf\": [\n {\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"quantified\"\n ],\n \"properties\": {\n \"quantified\": {\n \"enum\": [\n 1\n ]\n }\n }\n }\n }\n },\n {\n \"properties\": {\n \"ingredients\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/scaling@1_ingredient\"\n },\n {\n \"$ref\": \"#/$defs/scaling@1_ingredientSection\"\n }\n ]\n }\n },\n \"scaling\": {\n \"type\": \"object\",\n \"properties\": {\n \"discrete\": {\n \"type\": \"object\",\n \"properties\": {\n \"min\": {\n \"type\": \"integer\",\n \"minimum\": 1\n },\n \"max\": {\n \"type\": \"integer\",\n \"minimum\": 1\n },\n \"step\": {\n \"type\": \"integer\",\n \"minimum\": 1\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n },\n \"required\": [\n \"min\",\n \"max\"\n ],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": {\n \"$ref\": \"https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue\"\n }\n }\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n },\n \"required\": [\n \"discrete\"\n ],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": {\n \"$ref\": \"https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue\"\n }\n }\n }\n },\n \"required\": [\n \"ingredients\",\n \"scaling\"\n ]\n }\n ]\n }\n }\n ]\n },\n {\n \"allOf\": [\n {\n \"if\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"storage\"\n ]\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"stacks\": {\n \"properties\": {\n \"storage\": {\n \"enum\": [\n 1\n ]\n }\n }\n }\n }\n }\n },\n {\n \"if\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"storage\"\n ],\n \"properties\": {\n \"storage\": {\n \"const\": 1\n }\n }\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"storage\": {\n \"type\": \"object\",\n \"properties\": {\n \"roomTemp\": {\n \"$ref\": \"#/$defs/storage@1_storageMethod\"\n },\n \"refrigerated\": {\n \"$ref\": \"#/$defs/storage@1_storageMethod\"\n },\n \"frozen\": {\n \"$ref\": \"#/$defs/storage@1_storageMethod\"\n },\n \"leftovers\": {\n \"$ref\": \"#/$defs/storage@1_leftovers\"\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n },\n \"anyOf\": [\n {\n \"required\": [\n \"roomTemp\"\n ]\n },\n {\n \"required\": [\n \"refrigerated\"\n ]\n },\n {\n \"required\": [\n \"frozen\"\n ]\n }\n ],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": {\n \"$ref\": \"https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue\"\n }\n }\n }\n },\n \"required\": [\n \"storage\"\n ]\n }\n }\n ]\n },\n {\n \"allOf\": [\n {\n \"if\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"structured\"\n ]\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"stacks\": {\n \"properties\": {\n \"structured\": {\n \"enum\": [\n 1\n ]\n }\n }\n }\n }\n }\n },\n {\n \"if\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"structured\"\n ],\n \"properties\": {\n \"structured\": {\n \"const\": 1\n }\n }\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"instructions\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/structured@1_step\"\n },\n {\n \"$ref\": \"#/$defs/structured@1_stepSection\"\n }\n ]\n }\n }\n },\n \"required\": [\n \"instructions\"\n ]\n }\n }\n ]\n },\n {\n \"allOf\": [\n {\n \"if\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"substitutions\"\n ]\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"stacks\": {\n \"properties\": {\n \"substitutions\": {\n \"enum\": [\n 1\n ]\n }\n }\n }\n }\n }\n },\n {\n \"if\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"substitutions\"\n ],\n \"properties\": {\n \"substitutions\": {\n \"const\": 1\n }\n }\n }\n }\n },\n \"then\": {\n \"allOf\": [\n {\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"referenced\"\n ],\n \"properties\": {\n \"referenced\": {\n \"enum\": [\n 1\n ]\n }\n }\n }\n }\n },\n {\n \"properties\": {\n \"substitutions\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"for\": {\n \"type\": \"string\"\n },\n \"alternatives\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"name\": {\n \"type\": \"string\"\n },\n \"ratio\": {\n \"type\": \"string\"\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n },\n \"required\": [\n \"name\",\n \"ratio\"\n ],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": {\n \"$ref\": \"https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue\"\n }\n }\n },\n \"minItems\": 1\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n },\n \"required\": [\n \"for\",\n \"alternatives\"\n ],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": {\n \"$ref\": \"https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue\"\n }\n }\n },\n \"minItems\": 1\n }\n },\n \"required\": [\n \"substitutions\"\n ]\n }\n ]\n }\n }\n ]\n },\n {\n \"allOf\": [\n {\n \"if\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"techniques\"\n ]\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"stacks\": {\n \"properties\": {\n \"techniques\": {\n \"enum\": [\n 1\n ]\n }\n }\n }\n }\n }\n },\n {\n \"if\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"techniques\"\n ],\n \"properties\": {\n \"techniques\": {\n \"const\": 1\n }\n }\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"techniques\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n },\n \"required\": [\n \"id\",\n \"name\"\n ],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": {\n \"$ref\": \"https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue\"\n }\n }\n },\n \"minItems\": 1\n }\n },\n \"required\": [\n \"techniques\"\n ]\n }\n }\n ]\n },\n {\n \"allOf\": [\n {\n \"if\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"timed\"\n ]\n }\n }\n },\n \"then\": {\n \"properties\": {\n \"stacks\": {\n \"properties\": {\n \"timed\": {\n \"enum\": [\n 1\n ]\n }\n }\n }\n }\n }\n },\n {\n \"if\": {\n \"required\": [\n \"stacks\"\n ],\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"timed\"\n ],\n \"properties\": {\n \"timed\": {\n \"const\": 1\n }\n }\n }\n }\n },\n \"then\": {\n \"allOf\": [\n {\n \"properties\": {\n \"stacks\": {\n \"required\": [\n \"structured\"\n ],\n \"properties\": {\n \"structured\": {\n \"enum\": [\n 1\n ]\n }\n }\n }\n }\n },\n {\n \"properties\": {\n \"instructions\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n {\n \"$ref\": \"#/$defs/timed@1_timedStep\"\n },\n {\n \"$ref\": \"#/$defs/timed@1_timedStepSection\"\n }\n ]\n }\n }\n },\n \"required\": [\n \"instructions\"\n ]\n }\n ]\n }\n }\n ]\n },\n {\n \"$comment\": \"END GENERATED STACK GATING\"\n }\n ],\n \"unevaluatedProperties\": false,\n \"$defs\": {\n \"stackName\": {\n \"type\": \"string\",\n \"pattern\": \"^(?:[a-z][a-z0-9-]*|x-[a-z0-9-]+(?:\\\\.[a-z0-9-]+)*)$\"\n },\n \"stackMajor\": {\n \"type\": \"integer\",\n \"minimum\": 1\n },\n \"stacksMap\": {\n \"type\": \"object\",\n \"propertyNames\": {\n \"$ref\": \"#/$defs/stackName\"\n },\n \"additionalProperties\": {\n \"$ref\": \"#/$defs/stackMajor\"\n }\n },\n \"ingredient\": {\n \"allOf\": [\n {\n \"$ref\": \"./defs/entities.schema.json#/$defs/IngredientBase\"\n }\n ]\n },\n \"ingredientSection\": {\n \"type\": \"object\",\n \"properties\": {\n \"section\": {\n \"type\": \"string\"\n },\n \"ingredients\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"$ref\": \"#/$defs/ingredient\"\n },\n {\n \"$ref\": \"#/$defs/ingredientSection\"\n }\n ]\n }\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n },\n \"required\": [\n \"section\",\n \"ingredients\"\n ],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": {\n \"$ref\": \"./defs/common.schema.json#/properties/extensionLaneValue\"\n }\n }\n },\n \"step\": {\n \"$ref\": \"./defs/entities.schema.json#/$defs/StepBase\"\n },\n \"stepSection\": {\n \"type\": \"object\",\n \"properties\": {\n \"section\": {\n \"type\": \"string\"\n },\n \"steps\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"$ref\": \"#/$defs/step\"\n },\n {\n \"$ref\": \"#/$defs/stepSection\"\n }\n ]\n }\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n },\n \"required\": [\n \"section\",\n \"steps\"\n ],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": {\n \"$ref\": \"./defs/common.schema.json#/properties/extensionLaneValue\"\n }\n }\n },\n \"illustrated@1_illustratedStep\": {\n \"allOf\": [\n {\n \"$ref\": \"https://soustack.spec/defs/entities.schema.json#/$defs/StepBase\"\n },\n {\n \"required\": [\n \"id\"\n ]\n }\n ]\n },\n \"illustrated@1_illustratedSection\": {\n \"type\": \"object\",\n \"properties\": {\n \"section\": {\n \"type\": \"string\"\n },\n \"steps\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n {\n \"$ref\": \"https://soustack.spec/stacks/illustrated.schema.json#/$defs/illustratedStep\"\n },\n {\n \"$ref\": \"https://soustack.spec/stacks/illustrated.schema.json#/$defs/illustratedSection\"\n }\n ]\n }\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n },\n \"required\": [\n \"section\",\n \"steps\"\n ],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": {\n \"$ref\": \"https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue\"\n }\n }\n },\n \"quantified@1_ingredient\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"quantity\": {\n \"$ref\": \"https://soustack.spec/defs/quantity.schema.json\"\n },\n \"temperature\": {\n \"$ref\": \"https://soustack.spec/defs/temperature.schema.json\"\n },\n \"notes\": {\n \"type\": \"string\"\n },\n \"prep\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"array\",\n \"minItems\": 1,\n \"items\": {\n \"anyOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"$ref\": \"https://soustack.spec/stacks/prep.schema.json#/$defs/prepItem\"\n }\n ]\n }\n }\n ]\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n },\n \"scaling\": {\n \"$ref\": \"https://soustack.spec/defs/scalingRule.schema.json\"\n }\n },\n \"required\": [\n \"id\",\n \"name\",\n \"quantity\"\n ],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": {\n \"$ref\": \"https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue\"\n }\n }\n },\n \"quantified@1_ingredientSection\": {\n \"type\": \"object\",\n \"properties\": {\n \"section\": {\n \"type\": \"string\"\n },\n \"ingredients\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n {\n \"$ref\": \"https://soustack.spec/stacks/quantified.schema.json#/$defs/ingredient\"\n },\n {\n \"$ref\": \"https://soustack.spec/stacks/quantified.schema.json#/$defs/ingredientSection\"\n }\n ]\n }\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n },\n \"required\": [\n \"section\",\n \"ingredients\"\n ],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": {\n \"$ref\": \"https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue\"\n }\n }\n },\n \"referenced@1_ingredient\": {\n \"allOf\": [\n {\n \"$ref\": \"https://soustack.spec/defs/entities.schema.json#/$defs/IngredientBase\"\n },\n {\n \"required\": [\n \"id\"\n ]\n }\n ]\n },\n \"referenced@1_ingredientSection\": {\n \"type\": \"object\",\n \"properties\": {\n \"section\": {\n \"type\": \"string\"\n },\n \"ingredients\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n {\n \"$ref\": \"https://soustack.spec/stacks/referenced.schema.json#/$defs/ingredient\"\n },\n {\n \"$ref\": \"https://soustack.spec/stacks/referenced.schema.json#/$defs/ingredientSection\"\n }\n ]\n }\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n },\n \"required\": [\n \"section\",\n \"ingredients\"\n ],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": {\n \"$ref\": \"https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue\"\n }\n }\n },\n \"referenced@1_referencedStep\": {\n \"allOf\": [\n {\n \"$ref\": \"https://soustack.spec/defs/entities.schema.json#/$defs/StepBase\"\n },\n {\n \"properties\": {\n \"inputs\": {\n \"allOf\": [\n {\n \"$ref\": \"https://soustack.spec/defs/entities.schema.json#/$defs/StepBase/properties/inputs\"\n },\n {\n \"minItems\": 1\n }\n ]\n }\n },\n \"required\": [\n \"id\",\n \"inputs\"\n ]\n }\n ]\n },\n \"referenced@1_referencedSection\": {\n \"type\": \"object\",\n \"properties\": {\n \"section\": {\n \"type\": \"string\"\n },\n \"steps\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n {\n \"$ref\": \"https://soustack.spec/stacks/referenced.schema.json#/$defs/referencedStep\"\n },\n {\n \"$ref\": \"https://soustack.spec/stacks/referenced.schema.json#/$defs/referencedSection\"\n }\n ]\n }\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n },\n \"required\": [\n \"section\",\n \"steps\"\n ],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": {\n \"$ref\": \"https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue\"\n }\n }\n },\n \"scaling@1_ingredient\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"name\": {\n \"type\": \"string\"\n },\n \"quantity\": {\n \"$ref\": \"https://soustack.spec/defs/quantity.schema.json\"\n },\n \"temperature\": {\n \"$ref\": \"https://soustack.spec/defs/temperature.schema.json\"\n },\n \"notes\": {\n \"type\": \"string\"\n },\n \"prep\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"type\": \"array\",\n \"minItems\": 1,\n \"items\": {\n \"anyOf\": [\n {\n \"type\": \"string\",\n \"minLength\": 1\n },\n {\n \"$ref\": \"https://soustack.spec/stacks/prep.schema.json#/$defs/prepItem\"\n }\n ]\n }\n }\n ]\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n },\n \"scaling\": {\n \"$ref\": \"https://soustack.spec/defs/scalingRule.schema.json\"\n }\n },\n \"required\": [\n \"id\",\n \"name\",\n \"quantity\"\n ],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": {\n \"$ref\": \"https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue\"\n }\n }\n },\n \"scaling@1_ingredientSection\": {\n \"type\": \"object\",\n \"properties\": {\n \"section\": {\n \"type\": \"string\"\n },\n \"ingredients\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n {\n \"$ref\": \"https://soustack.spec/stacks/scaling.schema.json#/$defs/ingredient\"\n },\n {\n \"$ref\": \"https://soustack.spec/stacks/scaling.schema.json#/$defs/ingredientSection\"\n }\n ]\n }\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n },\n \"required\": [\n \"section\",\n \"ingredients\"\n ],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": {\n \"$ref\": \"https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue\"\n }\n }\n },\n \"storage@1_storageMethod\": {\n \"type\": \"object\",\n \"properties\": {\n \"duration\": {\n \"$ref\": \"https://soustack.spec/defs/duration.schema.json#/properties/StorageDuration\"\n },\n \"notes\": {\n \"type\": \"string\"\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n },\n \"required\": [\n \"duration\"\n ],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": {\n \"$ref\": \"https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue\"\n }\n }\n },\n \"structured@1_step\": {\n \"allOf\": [\n {\n \"$ref\": \"https://soustack.spec/defs/entities.schema.json#/$defs/StepBase\"\n },\n {\n \"required\": [\n \"id\"\n ]\n }\n ]\n },\n \"structured@1_stepSection\": {\n \"type\": \"object\",\n \"properties\": {\n \"section\": {\n \"type\": \"string\"\n },\n \"steps\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n {\n \"$ref\": \"https://soustack.spec/stacks/structured.schema.json#/$defs/step\"\n },\n {\n \"$ref\": \"https://soustack.spec/stacks/structured.schema.json#/$defs/stepSection\"\n }\n ]\n }\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n },\n \"required\": [\n \"section\",\n \"steps\"\n ],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": {\n \"$ref\": \"https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue\"\n }\n }\n },\n \"timed@1_timedStep\": {\n \"allOf\": [\n {\n \"$ref\": \"https://soustack.spec/defs/entities.schema.json#/$defs/StepBase\"\n },\n {\n \"properties\": {\n \"timing\": {\n \"allOf\": [\n {\n \"$ref\": \"https://soustack.spec/defs/entities.schema.json#/$defs/StepBase/properties/timing\"\n },\n {\n \"required\": [\n \"activity\"\n ],\n \"anyOf\": [\n {\n \"required\": [\n \"duration\"\n ]\n },\n {\n \"required\": [\n \"completionCue\"\n ]\n }\n ]\n }\n ]\n }\n },\n \"required\": [\n \"id\",\n \"timing\"\n ]\n }\n ]\n },\n \"timed@1_timedStepSection\": {\n \"type\": \"object\",\n \"properties\": {\n \"section\": {\n \"type\": \"string\"\n },\n \"steps\": {\n \"type\": \"array\",\n \"items\": {\n \"anyOf\": [\n {\n \"$ref\": \"https://soustack.spec/stacks/timed.schema.json#/$defs/timedStep\"\n },\n {\n \"$ref\": \"https://soustack.spec/stacks/timed.schema.json#/$defs/timedStepSection\"\n }\n ]\n }\n },\n \"metadata\": {\n \"type\": \"object\",\n \"additionalProperties\": true\n }\n },\n \"required\": [\n \"section\",\n \"steps\"\n ],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": {\n \"$ref\": \"https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue\"\n }\n }\n },\n \"equipment@1_equipmentItem\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"pattern\": \"^[A-Za-z0-9._-]+$\",\n \"minLength\": 1\n },\n \"name\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"count\": {\n \"type\": \"integer\",\n \"minimum\": 1\n },\n \"countScaling\": {\n \"oneOf\": [\n {\n \"type\": \"string\",\n \"enum\": [\n \"fixed\",\n \"linear\"\n ]\n },\n {\n \"type\": \"object\",\n \"properties\": {\n \"mode\": {\n \"const\": \"threshold\"\n },\n \"steps\": {\n \"type\": \"array\",\n \"minItems\": 1,\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"maxFactor\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0\n },\n \"count\": {\n \"type\": \"integer\",\n \"minimum\": 1\n }\n },\n \"required\": [\n \"maxFactor\",\n \"count\"\n ],\n \"additionalProperties\": false\n }\n }\n },\n \"required\": [\n \"mode\",\n \"steps\"\n ],\n \"additionalProperties\": false\n }\n ]\n },\n \"upgrades\": {\n \"type\": \"array\",\n \"minItems\": 1,\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"minFactor\": {\n \"type\": \"number\",\n \"exclusiveMinimum\": 0\n },\n \"use\": {\n \"type\": \"string\",\n \"pattern\": \"^[A-Za-z0-9._-]+$\",\n \"minLength\": 1\n }\n },\n \"required\": [\n \"minFactor\",\n \"use\"\n ],\n \"additionalProperties\": false\n }\n }\n },\n \"required\": [\n \"id\",\n \"name\"\n ],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": {\n \"$ref\": \"https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue\"\n }\n }\n },\n \"prep@1_miseEnPlaceTask\": {\n \"type\": \"object\",\n \"properties\": {\n \"id\": {\n \"type\": \"string\",\n \"pattern\": \"^[A-Za-z0-9._-]+$\"\n },\n \"text\": {\n \"type\": \"string\",\n \"minLength\": 1\n },\n \"inputs\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"uniqueItems\": true,\n \"minItems\": 1\n },\n \"usesEquipment\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\",\n \"pattern\": \"^[A-Za-z0-9._-]+$\"\n },\n \"uniqueItems\": true,\n \"minItems\": 1\n }\n },\n \"required\": [\n \"text\"\n ],\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": {\n \"$ref\": \"https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue\"\n }\n }\n },\n \"storage@1_leftovers\": {\n \"type\": \"object\",\n \"properties\": {\n \"notes\": {\n \"type\": \"string\"\n },\n \"reheat\": {\n \"oneOf\": [\n {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"string\"\n },\n \"minItems\": 1\n },\n {\n \"type\": \"array\",\n \"items\": {\n \"$ref\": \"https://soustack.spec/stacks/storage.schema.json#/$defs/reheatInstruction\"\n },\n \"minItems\": 1\n }\n ]\n },\n \"portioning\": {\n \"$ref\": \"https://soustack.spec/stacks/storage.schema.json#/$defs/portioning\"\n }\n },\n \"additionalProperties\": false,\n \"patternProperties\": {\n \"^x-\": {\n \"$ref\": \"https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue\"\n }\n }\n }\n }\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/v0.0.2/profiles/base\",\n \"title\": \"Soustack Base Profile Schema\",\n \"description\": \"Wrapper schema that exposes the unmodified Soustack base schema.\",\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.0.2\" }\n ]\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/v0.0.2/profiles/illustrated\",\n \"title\": \"Soustack Illustrated Profile Schema\",\n \"description\": \"Extends the base schema to guarantee at least one illustrative image.\",\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.0.2\" },\n {\n \"anyOf\": [\n { \"required\": [\"image\"] },\n {\n \"properties\": {\n \"instructions\": {\n \"type\": \"array\",\n \"contains\": {\n \"anyOf\": [\n { \"$ref\": \"#/definitions/imageInstruction\" },\n { \"$ref\": \"#/definitions/instructionSubsectionWithImage\" }\n ]\n }\n }\n }\n }\n ]\n }\n ],\n \"definitions\": {\n \"imageInstruction\": {\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.0.2#/definitions/instruction\" },\n { \"required\": [\"image\"] }\n ]\n },\n \"instructionSubsectionWithImage\": {\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.0.2#/definitions/instructionSubsection\" },\n {\n \"properties\": {\n \"items\": {\n \"type\": \"array\",\n \"contains\": { \"$ref\": \"#/definitions/imageInstruction\" }\n }\n }\n }\n ]\n }\n }\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/v0.0.2/profiles/scalable\",\n \"title\": \"Soustack Scalable Profile Schema\",\n \"description\": \"Extends the base schema to guarantee quantified ingredients plus a structured yield for deterministic scaling.\",\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.0.2\" },\n {\n \"required\": [\"yield\", \"ingredients\"],\n \"properties\": {\n \"yield\": {\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.0.2#/definitions/yield\" },\n { \"properties\": { \"amount\": { \"type\": \"number\", \"exclusiveMinimum\": 0 } } }\n ]\n },\n \"ingredients\": {\n \"type\": \"array\",\n \"minItems\": 1,\n \"items\": {\n \"anyOf\": [\n { \"$ref\": \"#/definitions/scalableIngredient\" },\n { \"$ref\": \"#/definitions/scalableIngredientSubsection\" }\n ]\n }\n }\n }\n }\n ],\n \"definitions\": {\n \"scalableIngredient\": {\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.0.2#/definitions/ingredient\" },\n { \"required\": [\"item\", \"quantity\"] },\n {\n \"properties\": {\n \"quantity\": {\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.0.2#/definitions/quantity\" },\n { \"properties\": { \"amount\": { \"type\": \"number\", \"exclusiveMinimum\": 0 } } }\n ]\n }\n }\n },\n {\n \"if\": {\n \"properties\": {\n \"scaling\": {\n \"type\": \"object\",\n \"properties\": { \"type\": { \"const\": \"bakers_percentage\" } },\n \"required\": [\"type\"]\n }\n },\n \"required\": [\"scaling\"]\n },\n \"then\": { \"required\": [\"id\"] }\n }\n ]\n },\n \"scalableIngredientSubsection\": {\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.0.2#/definitions/ingredientSubsection\" },\n {\n \"properties\": {\n \"items\": {\n \"type\": \"array\",\n \"minItems\": 1,\n \"items\": { \"$ref\": \"#/definitions/scalableIngredient\" }\n }\n }\n }\n ]\n }\n }\n}\n","{\n \"$schema\": \"../schemas/stacks-registry.schema.json\",\n \"registryVersion\": 1,\n \"spec\": {\n \"name\": \"soustack\",\n \"currentSpecVersion\": \"0.3.0\",\n \"canonicalStacksFormat\": \"map\"\n },\n \"profiles\": {\n \"lite\": { \"title\": \"Lite\", \"description\": \"Lowest-friction publishing with minimal structure\", \"requiresProfiles\": [], \"requiresStacks\": [] },\n \"base\": { \"title\": \"Base\", \"description\": \"Minimum cookable baseline with yield + time\", \"requiresProfiles\": [\"lite\"], \"requiresStacks\": [] },\n \"scalable\": { \"title\": \"Scalable\", \"description\": \"Quantified + scaling\", \"requiresProfiles\": [\"base\"], \"requiresStacks\": [\"quantified\", \"scaling\"] },\n \"timed\": { \"title\": \"Timed\", \"description\": \"Structured + timed\", \"requiresProfiles\": [\"base\"], \"requiresStacks\": [\"structured\", \"timed\"] },\n \"illustrated\": { \"title\": \"Illustrated\", \"description\": \"Media present\", \"requiresProfiles\": [\"base\"], \"requiresStacks\": [\"illustrated\"] },\n \"equipped\": { \"title\": \"Equipped\", \"description\": \"Recipe declares required tools/equipment.\", \"requiresProfiles\": [\"base\"], \"requiresStacks\": [\"equipment\"] },\n \"prepped\": { \"title\": \"Prepped\", \"description\": \"Recipe includes prep guidance and/or mise en place tasks.\", \"requiresProfiles\": [\"base\"], \"requiresStacks\": [\"prep\"] }\n },\n \"stacks\": {\n \"quantified\": {\n \"title\": \"Quantified\",\n \"latestMajor\": 1,\n \"requires\": [],\n \"schema\": { \"major\": { \"1\": \"stacks/quantified.schema.json\" } },\n \"docs\": { \"major\": { \"1\": \"stacks/quantified@1.md\" } }\n },\n \"scaling\": {\n \"title\": \"Scaling\",\n \"latestMajor\": 1,\n \"requires\": [\"quantified\"],\n \"schema\": { \"major\": { \"1\": \"stacks/scaling.schema.json\" } },\n \"docs\": { \"major\": { \"1\": \"stacks/scaling@1.md\" } }\n },\n \"structured\": {\n \"title\": \"Structured\",\n \"latestMajor\": 1,\n \"requires\": [],\n \"schema\": { \"major\": { \"1\": \"stacks/structured.schema.json\" } },\n \"docs\": { \"major\": { \"1\": \"stacks/structured@1.md\" } }\n },\n \"timed\": {\n \"title\": \"Timed\",\n \"latestMajor\": 1,\n \"requires\": [\"structured\"],\n \"schema\": { \"major\": { \"1\": \"stacks/timed.schema.json\" } },\n \"docs\": { \"major\": { \"1\": \"stacks/timed@1.md\" } }\n },\n \"referenced\": {\n \"title\": \"Referenced\",\n \"latestMajor\": 1,\n \"requires\": [\"structured\"],\n \"schema\": { \"major\": { \"1\": \"stacks/referenced.schema.json\" } },\n \"docs\": { \"major\": { \"1\": \"stacks/referenced@1.md\" } }\n },\n \"illustrated\": {\n \"title\": \"Illustrated\",\n \"latestMajor\": 1,\n \"requires\": [],\n \"schema\": { \"major\": { \"1\": \"stacks/illustrated.schema.json\" } },\n \"docs\": { \"major\": { \"1\": \"stacks/illustrated@1.md\" } }\n },\n \"dietary\": {\n \"title\": \"Dietary\",\n \"latestMajor\": 1,\n \"requires\": [],\n \"schema\": { \"major\": { \"1\": \"stacks/dietary.schema.json\" } },\n \"docs\": { \"major\": { \"1\": \"stacks/dietary@1.md\" } }\n },\n \"substitutions\": {\n \"title\": \"Substitutions\",\n \"latestMajor\": 1,\n \"requires\": [\"referenced\"],\n \"schema\": { \"major\": { \"1\": \"stacks/substitutions.schema.json\" } },\n \"docs\": { \"major\": { \"1\": \"stacks/substitutions@1.md\" } }\n },\n \"techniques\": {\n \"title\": \"Techniques\",\n \"latestMajor\": 1,\n \"requires\": [],\n \"schema\": { \"major\": { \"1\": \"stacks/techniques.schema.json\" } },\n \"docs\": { \"major\": { \"1\": \"stacks/techniques@1.md\" } }\n },\n \"storage\": {\n \"title\": \"Storage\",\n \"latestMajor\": 1,\n \"requires\": [],\n \"schema\": { \"major\": { \"1\": \"stacks/storage.schema.json\" } },\n \"docs\": { \"major\": { \"1\": \"stacks/storage@1.md\" } }\n },\n \"compute\": {\n \"title\": \"Compute\",\n \"latestMajor\": 1,\n \"requires\": [\"quantified\", \"timed\"],\n \"schema\": { \"major\": { \"1\": \"stacks/compute.schema.json\" } },\n \"docs\": { \"major\": { \"1\": \"stacks/compute@1.md\" } }\n },\n \"equipment\": {\n \"title\": \"Equipment\",\n \"latestMajor\": 1,\n \"requires\": [],\n \"schema\": { \"major\": { \"1\": \"stacks/equipment.schema.json\" } },\n \"docs\": { \"major\": { \"1\": \"stacks/equipment@1.md\" } }\n },\n \"prep\": {\n \"title\": \"Prep\",\n \"latestMajor\": 1,\n \"requires\": [],\n \"schema\": { \"major\": { \"1\": \"stacks/prep.schema.json\" } },\n \"docs\": { \"major\": { \"1\": \"stacks/prep@1.md\" } }\n }\n }\n}\n \n","import { SOUSTACK_SPEC_VERSION } from \"./specVersion\";\n\nexport const CANONICAL_SCHEMA_ID = \"https://soustack.spec/soustack.schema.json\";\nexport const LEGACY_SCHEMA_ID = `http://soustack.org/schema/v${SOUSTACK_SPEC_VERSION}`;\n\nconst RAW_SPEC_BASE = \"https://raw.githubusercontent.com/soustack/soustack-spec\";\nconst RAW_SPEC_FORK_BASE = \"https://raw.githubusercontent.com/RichardHerold/soustack-spec\";\n\nexport const SCHEMA_ALIAS_MAP = new Map<string, string>([\n [CANONICAL_SCHEMA_ID, CANONICAL_SCHEMA_ID],\n [LEGACY_SCHEMA_ID, CANONICAL_SCHEMA_ID],\n [`${LEGACY_SCHEMA_ID}/`, CANONICAL_SCHEMA_ID],\n [\"https://soustack.org/schema/v0.0.2\", CANONICAL_SCHEMA_ID],\n [\"https://soustack.org/schema/v0.0.2/\", CANONICAL_SCHEMA_ID],\n [`${RAW_SPEC_BASE}/main/soustack.schema.json`, CANONICAL_SCHEMA_ID],\n [`${RAW_SPEC_BASE}/v${SOUSTACK_SPEC_VERSION}/soustack.schema.json`, CANONICAL_SCHEMA_ID],\n [`${RAW_SPEC_FORK_BASE}/main/soustack.schema.json`, CANONICAL_SCHEMA_ID],\n [`${RAW_SPEC_FORK_BASE}/v${SOUSTACK_SPEC_VERSION}/soustack.schema.json`, CANONICAL_SCHEMA_ID],\n]);\n\nexport function resolveSchemaHint(value?: string): {\n canonicalId?: string;\n isSoustackSchema: boolean;\n wasAlias: boolean;\n} {\n if (typeof value !== \"string\" || !value) {\n return { canonicalId: undefined, isSoustackSchema: false, wasAlias: false };\n }\n\n const trimmed = value.replace(/#$/, \"\");\n const mapped = SCHEMA_ALIAS_MAP.get(trimmed) ?? trimmed;\n const isSoustackSchema =\n SCHEMA_ALIAS_MAP.has(trimmed) ||\n mapped.startsWith(\"http://soustack.org/schema\") ||\n mapped.startsWith(\"https://soustack.org/schema\") ||\n mapped.startsWith(\"https://soustack.spec/\") ||\n mapped.startsWith(\"https://soustack.org/schemas/\");\n\n return {\n canonicalId: mapped,\n isSoustackSchema,\n wasAlias: mapped !== trimmed || SCHEMA_ALIAS_MAP.has(trimmed),\n };\n}\n\nexport function withCanonicalSchema<T extends object>(value: T): T {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return value;\n }\n\n const existing = typeof (value as any).$schema === \"string\" ? (value as any).$schema : undefined;\n const resolved = resolveSchemaHint(existing);\n const schemaId = resolved.isSoustackSchema ? resolved.canonicalId : CANONICAL_SCHEMA_ID;\n\n return {\n ...(value as any),\n $schema: schemaId ?? CANONICAL_SCHEMA_ID,\n } as T;\n}\n","import Ajv2020, { ErrorObject, ValidateFunction } from \"ajv/dist/2020\";\nimport addFormats from \"ajv-formats\";\nimport { Recipe } from \"./types\";\nimport { normalizeRecipe } from \"./normalize\";\nimport { validateConformance, ConformanceIssue } from \"./conformance\";\nimport rootSchema from \"./soustack.schema.json\";\nimport { SOUSTACK_SPEC_VERSION } from \"./specVersion\";\nimport baseProfileSchema from \"./profiles/base.schema.json\";\nimport illustratedProfileSchema from \"./profiles/illustrated.schema.json\";\nimport scalableProfileSchema from \"./profiles/scalable.schema.json\";\nimport registry from \"./stacks/registry.json\";\nimport { CANONICAL_SCHEMA_ID, LEGACY_SCHEMA_ID, resolveSchemaHint, SCHEMA_ALIAS_MAP } from \"./schemaMetadata\";\n\ntype ProfileName =\n | \"base\"\n | \"equipped\"\n | \"illustrated\"\n | \"lite\"\n | \"prepped\"\n | \"scalable\"\n | \"timed\";\n\n// Schema IDs from the vendored spec\nconst LEGACY_ROOT_SCHEMA_ID = LEGACY_SCHEMA_ID;\nconst DEFAULT_ROOT_SCHEMA_ID = CANONICAL_SCHEMA_ID;\nconst BASE_SCHEMA_ID = LEGACY_ROOT_SCHEMA_ID; // Base schema is the root schema\n// Profile schemas use v0.0.2, not the spec version\nconst PROFILE_SCHEMA_PREFIX = `http://soustack.org/schema/v0.0.2/profiles/`;\n\nexport interface NormalizedError {\n path: string;\n message: string;\n keyword?: string;\n}\n\n/**\n * Validation modes for recipe validation.\n * - \"schema\": JSON Schema only\n * - \"full\": JSON Schema + semantic conformance checks\n */\nexport type ValidateMode = \"schema\" | \"full\";\n\nexport interface ValidateOptions {\n profile?: ProfileName;\n schema?: string;\n collectAllErrors?: boolean;\n mode?: ValidateMode;\n includeNormalized?: boolean;\n}\n\n/**\n * Result payload for recipe validation. Schema validation always runs first;\n * conformance issues are only included when running in full mode.\n */\nexport interface ValidateResult {\n ok: boolean;\n schemaErrors: NormalizedError[];\n conformanceIssues: ConformanceIssue[];\n warnings: string[];\n normalizedRecipe?: Recipe;\n}\n\ninterface ValidationContext {\n ajv: Ajv2020;\n rootValidator?: ValidateFunction;\n baseValidator?: ValidateFunction;\n validators: Map<string, ValidateFunction>;\n}\n\ninterface StackRegistryInfo {\n latestMajor: number;\n versions: number[];\n requires: string[];\n minProfile?: string;\n}\n\n// Cache for validation contexts\nconst validationContexts: Map<boolean, ValidationContext> = new Map();\nconst stackRegistryById = buildStackRegistryById();\nconst stackRegistryIds = Array.from(stackRegistryById.keys());\nconst profileRegistryById = buildProfileRegistryById();\nconst profileRegistryOrder = Object.keys(registry.profiles || {});\nconst profileRegistryIndex = new Map(profileRegistryOrder.map((profile, index) => [profile, index]));\nconst stackSchemaIdCache: Map<string, string> = new Map();\n\nconst optionalRequire = (id: string): any => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n return typeof require === \"function\" ? require(id) : null;\n } catch {\n return null;\n }\n};\n\ninterface StackRequirement {\n id: string;\n majors?: number[];\n}\n\ninterface ProfileRegistryInfo {\n requiresProfiles: string[];\n requiresStacks: StackRequirement[];\n}\n\n/**\n * Loads all bundled schema files and registers them with Ajv.\n */\nfunction loadAllSchemas(ajv: Ajv2020): void {\n // Load defs schemas first (root schema references them)\n const defsSchemas = [\n require(\"./defs/common.schema.json\"),\n require(\"./defs/duration.schema.json\"),\n require(\"./defs/entities.schema.json\"),\n require(\"./defs/ingredientQuantified.schema.json\"),\n require(\"./defs/quantity.schema.json\"),\n require(\"./defs/scalingRule.schema.json\"),\n require(\"./defs/temperature.schema.json\"),\n ];\n\n for (const schema of defsSchemas) {\n if (schema && typeof schema === \"object\" && \"$id\" in schema) {\n const schemaWithId = schema as { $id?: string };\n if (schemaWithId.$id) {\n // Check if schema with this ID already exists to avoid duplicates\n if (!ajv.getSchema(schemaWithId.$id)) {\n ajv.addSchema(schemaWithId, schemaWithId.$id);\n }\n }\n }\n }\n\n // Load stack schemas BEFORE root schema (root schema references them in conditional logic)\n // Stack schemas are loaded here so they're available when root schema is compiled\n const stacks = registry.stacks || {};\n const stackLoading = new Set<string>();\n for (const [id, entry] of Object.entries(stacks)) {\n if (!entry || typeof entry !== \"object\") continue;\n const majors = entry.schema?.major && typeof entry.schema.major === \"object\" ? Object.keys(entry.schema.major) : [];\n for (const majorKey of majors) {\n const major = parseInt(majorKey, 10);\n if (!Number.isInteger(major) || major < 1) continue;\n ensureStackSchemaLoaded(ajv, id, major, stackLoading);\n }\n }\n\n // Load root schema (references defs and stack schemas)\n if (rootSchema && typeof rootSchema === \"object\" && \"$id\" in rootSchema) {\n const rootSchemaId = (rootSchema as { $id?: string }).$id;\n if (rootSchemaId && !ajv.getSchema(rootSchemaId)) {\n ajv.addSchema(rootSchema, rootSchemaId);\n }\n }\n\n // Register alias IDs that should resolve to the canonical root schema\n for (const [alias, target] of SCHEMA_ALIAS_MAP.entries()) {\n if (alias === target || alias === LEGACY_ROOT_SCHEMA_ID) continue;\n if (!ajv.getSchema(alias)) {\n ajv.addSchema({ $id: alias, $ref: target }, alias);\n }\n }\n\n // Create legacy schema mappings BEFORE loading profiles (profiles reference them)\n // Profiles reference http://soustack.org/schema/v0.0.2, but root schema uses https://soustack.spec/soustack.schema.json\n // We need to create a mapping from the legacy ID to the root schema\n // Also need to map old #/definitions/ to new #/$defs/ for backward compatibility\n // Profile schemas use Draft 7 which uses \"definitions\", but they reference a Draft 2020-12 schema\n // We need to create a compatibility layer that exposes definitions in the old format\n const legacyIds = Array.from(\n new Set<string>([\n LEGACY_ROOT_SCHEMA_ID,\n `http://soustack.org/schema/v0.0.2`, // Profiles reference this version\n ]),\n );\n \n for (const legacyId of legacyIds) {\n if (!ajv.getSchema(legacyId)) {\n // Create a compatibility schema that maps old definitions to new $defs\n // Profile schemas (Draft 7) reference #/definitions/ from the legacy schema ID\n // The key insight: definitions must be at the top level and the schema must be compiled\n // before profile schemas try to reference them. Using allOf might delay compilation.\n // We create a minimal schema with just definitions for reference resolution,\n // and rely on the root schema for actual validation (via BASE_SCHEMA_ID reference)\n const compatibilitySchema: any = {\n $id: legacyId,\n $schema: \"http://json-schema.org/draft-07/schema#\",\n // Minimal schema - just provide definitions for reference resolution\n // Validation will use DEFAULT_ROOT_SCHEMA_ID directly or via BASE_SCHEMA_ID\n type: \"object\", // Required for valid schema\n // Expose definitions at top level for Draft 7 profile schema references\n // These definitions map old names to new $defs locations\n definitions: {\n instruction: { $ref: `${DEFAULT_ROOT_SCHEMA_ID}#/$defs/step` },\n instructionSubsection: { $ref: `${DEFAULT_ROOT_SCHEMA_ID}#/$defs/stepSection` },\n ingredient: { $ref: `${DEFAULT_ROOT_SCHEMA_ID}#/$defs/ingredient` },\n ingredientSection: { $ref: `${DEFAULT_ROOT_SCHEMA_ID}#/$defs/ingredientSection` },\n ingredientSubsection: { $ref: `${DEFAULT_ROOT_SCHEMA_ID}#/$defs/ingredientSection` }, // Alias for ingredientSection\n yield: {\n type: \"object\",\n properties: {\n amount: { type: \"number\", exclusiveMinimum: 0 },\n unit: { type: \"string\", minLength: 1 },\n metadata: { type: \"object\", additionalProperties: true },\n },\n required: [\"amount\", \"unit\"],\n additionalProperties: false,\n patternProperties: {\n \"^x-\": { $ref: \"https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue\" },\n },\n },\n time: {\n type: \"object\",\n properties: {\n total: { $ref: \"https://soustack.spec/defs/duration.schema.json#/properties/DurationMinutes\" },\n metadata: { type: \"object\", additionalProperties: true },\n },\n required: [\"total\"],\n additionalProperties: false,\n patternProperties: {\n \"^x-\": { $ref: \"https://soustack.spec/defs/common.schema.json#/properties/extensionLaneValue\" },\n },\n },\n quantity: { $ref: `https://soustack.spec/defs/quantity.schema.json` },\n },\n };\n ajv.addSchema(compatibilitySchema, legacyId);\n // Force compilation of the compatibility schema to ensure definitions are available\n // This ensures that when profile schemas reference #/definitions/, they can be resolved\n try {\n const compiled = ajv.getSchema(legacyId);\n } catch (e) {\n // If compilation fails, log but continue - profile schemas will fail with clearer errors\n console.warn(`Failed to compile compatibility schema ${legacyId}:`, e);\n }\n }\n }\n\n // Load profile schemas (vNext only)\n const liteProfileSchema = require(\"./profiles/lite.schema.json\");\n const equippedProfileSchema = require(\"./profiles/equipped.schema.json\");\n const preppedProfileSchema = require(\"./profiles/prepped.schema.json\");\n const timedProfileSchema = require(\"./profiles/timed.schema.json\");\n const profileSchemas = [\n liteProfileSchema,\n baseProfileSchema,\n illustratedProfileSchema,\n scalableProfileSchema,\n equippedProfileSchema,\n preppedProfileSchema,\n timedProfileSchema,\n ];\n\n for (const schema of profileSchemas) {\n if (schema && typeof schema === \"object\" && \"$id\" in schema) {\n const schemaWithId = schema as { $id?: string };\n if (schemaWithId.$id) {\n // Check if schema with this ID already exists to avoid duplicates\n if (!ajv.getSchema(schemaWithId.$id)) {\n try {\n ajv.addSchema(schemaWithId, schemaWithId.$id);\n // Force eager compilation to catch reference resolution errors early\n // This ensures that if there are reference issues, we catch them during schema loading\n // rather than during validation\n try {\n ajv.getSchema(schemaWithId.$id);\n } catch (compileError) {\n // Re-throw to fail fast during schema loading\n throw compileError;\n }\n } catch (e) {\n console.warn(`Failed to add/compile profile schema ${schemaWithId.$id}:`, e);\n // Don't throw - allow other schemas to load, but this one will fail when used\n }\n }\n }\n }\n }\n}\n\n/**\n * Creates a new validation context with all schemas loaded\n */\nfunction createContext(collectAllErrors: boolean): ValidationContext {\n const ajv = new Ajv2020({\n strict: false,\n allErrors: collectAllErrors,\n validateSchema: false, // Don't validate schemas themselves\n });\n addFormats(ajv);\n\n // Load all schemas from the spec directory\n loadAllSchemas(ajv);\n\n // Get validators for root and base schemas\n const rootValidator = ajv.getSchema(DEFAULT_ROOT_SCHEMA_ID) || ajv.getSchema(LEGACY_ROOT_SCHEMA_ID);\n const baseValidator = ajv.getSchema(BASE_SCHEMA_ID);\n\n return {\n ajv,\n rootValidator: rootValidator || undefined,\n baseValidator: baseValidator || undefined,\n validators: new Map(),\n };\n}\n\n/**\n * Gets or creates a validation context\n */\nfunction getContext(collectAllErrors: boolean): ValidationContext {\n if (!validationContexts.has(collectAllErrors)) {\n validationContexts.set(collectAllErrors, createContext(collectAllErrors));\n }\n return validationContexts.get(collectAllErrors)!;\n}\n\nfunction cloneRecipe<T>(recipe: T): T {\n if (typeof structuredClone === \"function\") {\n return structuredClone(recipe);\n }\n return JSON.parse(JSON.stringify(recipe));\n}\n\nfunction formatAjvError(error: ErrorObject): NormalizedError {\n let path = error.instancePath || \"/\";\n if (error.keyword === \"additionalProperties\" && (error.params as any)?.additionalProperty) {\n const extra = (error.params as any).additionalProperty;\n path = `${error.instancePath || \"\"}/${extra}`.replace(/\\/+/g, \"/\") || \"/\";\n }\n\n return {\n path,\n keyword: error.keyword,\n message: error.message || \"Validation error\",\n };\n}\n\nfunction isSoustackSchemaId(schemaId: string): boolean {\n return resolveSchemaHint(schemaId).isSoustackSchema;\n}\n\nfunction buildStackRegistryById(): Map<string, StackRegistryInfo> {\n const registryMap = new Map<string, StackRegistryInfo>();\n const stacks = registry.stacks || {};\n for (const [id, entry] of Object.entries(stacks)) {\n if (!entry || typeof entry !== \"object\") continue;\n const stackEntry = entry as any;\n const latestMajor = typeof stackEntry.latestMajor === \"number\" ? stackEntry.latestMajor : 1;\n const schemaMajors =\n stackEntry.schema && typeof stackEntry.schema === \"object\" && stackEntry.schema.major && typeof stackEntry.schema.major === \"object\"\n ? Object.keys(stackEntry.schema.major)\n .map((key) => parseInt(key, 10))\n .filter((value) => Number.isInteger(value) && value >= 1)\n : [];\n const requires = Array.isArray(stackEntry.requires)\n ? stackEntry.requires.filter((requirement: unknown): requirement is string => typeof requirement === \"string\")\n : [];\n\n registryMap.set(id, {\n latestMajor,\n versions: schemaMajors.length > 0 ? schemaMajors : [latestMajor], // Use declared schema majors when available\n requires,\n minProfile: typeof stackEntry.minProfile === \"string\" ? stackEntry.minProfile : undefined,\n });\n }\n return registryMap;\n}\n\nfunction parseStackRequirement(entry: unknown): StackRequirement | null {\n if (typeof entry === \"string\") {\n return { id: entry };\n }\n\n if (entry && typeof entry === \"object\" && !Array.isArray(entry)) {\n const record = entry as { id?: unknown; majors?: unknown; versions?: unknown };\n if (typeof record.id !== \"string\") {\n return null;\n }\n const majorsRaw: unknown[] = Array.isArray(record.majors)\n ? record.majors\n : Array.isArray(record.versions)\n ? record.versions\n : [];\n const majors = majorsRaw.filter(\n (value: unknown): value is number => typeof value === \"number\" && Number.isInteger(value) && value >= 1,\n );\n return {\n id: record.id,\n majors: majors.length > 0 ? majors : undefined,\n };\n }\n\n return null;\n}\n\nfunction buildProfileRegistryById(): Map<string, ProfileRegistryInfo> {\n const registryMap = new Map<string, ProfileRegistryInfo>();\n const profiles = registry.profiles || {};\n for (const [id, entry] of Object.entries(profiles)) {\n if (!entry || typeof entry !== \"object\") continue;\n const profileEntry = entry as any;\n const requiresProfiles = Array.isArray(profileEntry.requiresProfiles)\n ? profileEntry.requiresProfiles.filter((value: unknown): value is string => typeof value === \"string\")\n : [];\n const requiresStacksRaw: unknown[] = Array.isArray(profileEntry.requiresStacks)\n ? profileEntry.requiresStacks\n : [];\n const requiresStacks = requiresStacksRaw\n .map(parseStackRequirement)\n .filter((value: StackRequirement | null): value is StackRequirement => value !== null);\n registryMap.set(id, { requiresProfiles, requiresStacks });\n }\n return registryMap;\n}\n\nfunction resolveStackSchemaPath(stackId: string, major: number): { path: string; requires: string[] } | null {\n const stacks = registry.stacks || {};\n const entry = (stacks as Record<string, any>)[stackId];\n if (!entry || typeof entry !== \"object\") return null;\n\n const versionKey = String(major);\n const schemaPath = entry.schema?.major?.[versionKey];\n if (typeof schemaPath !== \"string\") return null;\n\n const requires = Array.isArray(entry.requires)\n ? entry.requires.filter((value: unknown): value is string => typeof value === \"string\")\n : [];\n\n return {\n path: schemaPath.replace(/^\\.\\//, \"\"),\n requires,\n };\n}\n\nfunction resolveStackSchemaRefs(schema: any): any {\n const resolvedSchema = JSON.parse(JSON.stringify(schema)); // Deep clone\n const resolveRefs = (obj: any): void => {\n if (Array.isArray(obj)) {\n obj.forEach(resolveRefs);\n } else if (obj && typeof obj === \"object\") {\n for (const [key, value] of Object.entries(obj)) {\n if (key === \"$ref\" && typeof value === \"string\") {\n if (value.startsWith(\"./\") || value.startsWith(\"../stacks/\")) {\n const [refPath, fragment] = value.split(\"#\");\n const refName = refPath?.replace(/^(\\.\\/|\\.{2}\\/stacks\\/)/, \"\").replace(/\\.schema\\.json$/, \"\");\n if (refName) {\n const refId = `https://soustack.spec/stacks/${refName}.schema.json${fragment ? `#${fragment}` : \"\"}`;\n obj[key] = refId;\n }\n }\n } else {\n resolveRefs(value);\n }\n }\n }\n };\n resolveRefs(resolvedSchema);\n return resolvedSchema;\n}\n\nfunction hasLegacyDefinitionsRef(obj: any): boolean {\n if (!obj || typeof obj !== \"object\") return false;\n if (obj.$ref && typeof obj.$ref === \"string\" && obj.$ref.includes(\"#/definitions/\")) {\n return true;\n }\n return Object.values(obj).some((value) => {\n if (Array.isArray(value)) {\n return value.some((item) => hasLegacyDefinitionsRef(item));\n }\n if (value && typeof value === \"object\") {\n return hasLegacyDefinitionsRef(value);\n }\n return false;\n });\n}\n\nfunction hasLegacyProfileOrModuleRef(obj: any): boolean {\n if (!obj || typeof obj !== \"object\") return false;\n if (obj.$ref && typeof obj.$ref === \"string\") {\n if (\n obj.$ref.includes(\"soustack.org/schema/v0.0.2/profiles/\") ||\n obj.$ref.includes(\"soustack.org/schema/v0.0.2/modules/\")\n ) {\n return true;\n }\n }\n return Object.values(obj).some((value) => {\n if (Array.isArray(value)) {\n return value.some((item) => hasLegacyProfileOrModuleRef(item));\n }\n if (value && typeof value === \"object\") {\n return hasLegacyProfileOrModuleRef(value);\n }\n return false;\n });\n}\n\nfunction ensureStackSchemaLoaded(\n ajv: Ajv2020,\n stackId: string,\n major: number,\n loading: Set<string>,\n): string | null {\n if (stackId.startsWith(\"x-\")) return null; // Vendor stack - no schema enforcement\n\n const stackKey = `${stackId}@${major}`;\n if (loading.has(stackKey)) {\n return stackSchemaIdCache.get(stackKey) ?? null;\n }\n\n loading.add(stackKey);\n try {\n const resolved = resolveStackSchemaPath(stackId, major);\n if (!resolved) {\n throw new Error(`Stack schema not found in registry for '${stackId}' major ${major}`);\n }\n\n const { path: schemaPath, requires } = resolved;\n const normalizedSchemaPath = schemaPath.startsWith(\"./\") ? schemaPath : `./${schemaPath}`;\n const fs = optionalRequire(\"fs\") as typeof import(\"fs\") | null;\n const path = optionalRequire(\"path\") as typeof import(\"path\") | null;\n const searchPaths: string[] = [];\n if (path) {\n searchPaths.push(\n path.join(__dirname, \"..\", \"spec\", schemaPath),\n path.join(process.cwd(), \"spec\", schemaPath),\n path.join(__dirname, schemaPath),\n path.join(__dirname, \"..\", \"src\", schemaPath),\n path.join(process.cwd(), schemaPath),\n path.join(process.cwd(), \"src\", schemaPath),\n );\n }\n const existingPath = fs && searchPaths.length > 0 ? searchPaths.find((candidate) => fs.existsSync(candidate)) : undefined;\n const requirePath = existingPath ?? normalizedSchemaPath;\n let stackSchema: any;\n try {\n stackSchema = require(requirePath);\n } catch (error) {\n console.warn(`Stack schema not found for ${stackId} (major ${major}): ${schemaPath}`);\n return null;\n }\n\n if (!stackSchema || typeof stackSchema !== \"object\" || !(\"$id\" in stackSchema)) {\n console.warn(`Stack schema for ${stackId} (major ${major}) is missing $id (path: ${schemaPath})`);\n return null;\n }\n\n const resolvedSchema = resolveStackSchemaRefs(stackSchema);\n const schemaId = (resolvedSchema as { $id?: string }).$id;\n if (!schemaId) {\n console.warn(`Stack schema for ${stackId} (major ${major}) is missing $id after resolution (path: ${schemaPath})`);\n return null;\n }\n\n if (!ajv.getSchema(schemaId)) {\n const referencedStacks = new Set<string>();\n const collectStackRefs = (obj: any): void => {\n if (Array.isArray(obj)) {\n obj.forEach(collectStackRefs);\n } else if (obj && typeof obj === \"object\") {\n const refValue = (obj as any).$ref;\n if (typeof refValue === \"string\") {\n const match = refValue.match(/^https:\\/\\/soustack\\.spec\\/stacks\\/([^.#/]+)\\.schema\\.json/);\n if (match && match[1]) {\n referencedStacks.add(match[1]);\n }\n }\n Object.values(obj).forEach(collectStackRefs);\n }\n };\n collectStackRefs(resolvedSchema);\n\n for (const dep of requires) {\n const depMajor = stackRegistryById.get(dep)?.latestMajor ?? 1;\n ensureStackSchemaLoaded(ajv, dep, depMajor, loading);\n }\n for (const refStack of referencedStacks) {\n if (refStack === stackId) continue;\n const depMajor = stackRegistryById.get(refStack)?.latestMajor ?? 1;\n ensureStackSchemaLoaded(ajv, refStack, depMajor, loading);\n }\n ajv.addSchema(resolvedSchema, schemaId);\n }\n\n stackSchemaIdCache.set(stackKey, schemaId);\n return schemaId;\n } finally {\n loading.delete(stackKey);\n }\n}\n\nfunction isProfileAtLeast(profile: string, requiredProfile: string | undefined): boolean {\n if (!requiredProfile) return true;\n const profileRank = profileRegistryIndex.get(profile);\n const requiredRank = profileRegistryIndex.get(requiredProfile);\n if (profileRank === undefined || requiredRank === undefined) {\n return false;\n }\n return profileRank >= requiredRank;\n}\n\nfunction collectRequiredProfiles(profile: string): string[] {\n const visited = new Set<string>();\n const result: string[] = [];\n\n const visit = (current: string) => {\n if (visited.has(current)) return;\n visited.add(current);\n const entry = profileRegistryById.get(current);\n if (!entry) return;\n for (const requirement of entry.requiresProfiles) {\n if (!visited.has(requirement)) {\n result.push(requirement);\n visit(requirement);\n }\n }\n };\n\n visit(profile);\n return result;\n}\n\nfunction getProfileRequirementErrors(\n profile: string,\n recipe: Recipe,\n declaredStacks: Record<string, number>,\n context: ValidationContext,\n): NormalizedError[] {\n const errors: NormalizedError[] = [];\n const entry = profileRegistryById.get(profile);\n if (!entry) {\n return [\n {\n path: \"/profile\",\n message: `Unknown profile: ${profile}`,\n },\n ];\n }\n\n for (const requirement of entry.requiresStacks) {\n const declaredVersion = declaredStacks[requirement.id];\n if (!declaredVersion) {\n errors.push({\n path: `/stacks/${requirement.id}`,\n message: `Profile '${profile}' requires stack '${requirement.id}'.`,\n });\n continue;\n }\n\n const stackEntry = stackRegistryById.get(requirement.id);\n if (!stackEntry) {\n errors.push({\n path: `/stacks/${requirement.id}`,\n message: `Profile '${profile}' requires stack '${requirement.id}', but it is not registered.`,\n });\n continue;\n }\n\n if (!stackEntry.versions.includes(declaredVersion)) {\n errors.push({\n path: `/stacks/${requirement.id}`,\n message: `Profile '${profile}' requires stack '${requirement.id}' with a supported major version. Found ${declaredVersion}.`,\n });\n continue;\n }\n\n if (requirement.majors && !requirement.majors.includes(declaredVersion)) {\n errors.push({\n path: `/stacks/${requirement.id}`,\n message: `Profile '${profile}' requires stack '${requirement.id}' with major version(s) ${requirement.majors.join(\n \", \",\n )}. Found ${declaredVersion}.`,\n });\n }\n }\n\n for (const [stackName] of Object.entries(declaredStacks)) {\n const stackEntry = stackRegistryById.get(stackName);\n if (!stackEntry?.minProfile) continue;\n if (!isProfileAtLeast(profile, stackEntry.minProfile)) {\n errors.push({\n path: `/stacks/${stackName}`,\n message: `Stack '${stackName}' requires profile '${stackEntry.minProfile}'.`,\n });\n }\n }\n\n const requiredProfiles = collectRequiredProfiles(profile);\n for (const requirement of requiredProfiles) {\n const requiredSchemaId = `${PROFILE_SCHEMA_PREFIX}${requirement}`;\n const validator = context.ajv.getSchema(requiredSchemaId);\n if (!validator) {\n errors.push({\n path: \"/profile\",\n message: `Profile schema not loaded: ${requiredSchemaId}`,\n });\n continue;\n }\n\n const validationCopy = cloneRecipe(recipe);\n (validationCopy as any).profile = requirement;\n const valid = validator(validationCopy);\n const validationErrors = validator.errors || [];\n if (!valid && validationErrors.length > 0) {\n // Filter out unevaluatedProperties and additionalProperties errors for required profile validation\n // These are false positives when the recipe has stacks - stack properties are valid\n const filteredErrors = validationErrors.filter((e) => {\n if (e.keyword === \"unevaluatedProperties\" || e.keyword === \"additionalProperties\") {\n const path = e.instancePath || \"\";\n if (path === \"\" || path === \"/\") {\n return false; // Filter out root-level property errors\n }\n }\n return true;\n });\n \n // Only report errors if there are non-property errors\n if (filteredErrors.length > 0) {\n for (const error of filteredErrors) {\n const formatted = formatAjvError(error);\n errors.push({\n path: formatted.path,\n keyword: formatted.keyword,\n message: `Profile '${profile}' requires profile '${requirement}' to be satisfied: ${formatted.message}`,\n });\n }\n }\n }\n }\n\n return errors;\n}\n\nfunction validateDeclaredStacksAgainstRegistry(declaredStacks: Record<string, number>): NormalizedError[] {\n const errors: NormalizedError[] = [];\n\n for (const [name, version] of Object.entries(declaredStacks)) {\n const registryEntry = stackRegistryById.get(name);\n \n if (!registryEntry) {\n if (name.startsWith(\"x-\")) {\n continue; // Vendor stack - allowed without registry entry\n }\n errors.push({\n path: `/stacks/${name}`,\n message: `Unknown stack: ${name}`,\n });\n continue;\n }\n\n if (!registryEntry.versions.includes(version)) {\n errors.push({\n path: `/stacks/${name}`,\n message: `Unsupported stack version for ${name}: ${version}`,\n });\n continue;\n }\n\n for (const requirement of registryEntry.requires) {\n if (!declaredStacks[requirement]) {\n errors.push({\n path: `/stacks/${name}`,\n message: `Stack '${name}' requires stack '${requirement}'.`,\n });\n }\n }\n }\n\n return errors;\n}\n\n/**\n * Infers stacks from payload fields in the recipe.\n * Returns a stacks map (e.g., { scaling: 1, storage: 1 }).\n * Uses registry-provided latest major versions.\n */\nfunction inferStacksFromPayload(recipe: any): Record<string, number> {\n const inferred: Record<string, number> = {};\n\n if (!recipe || typeof recipe !== \"object\") {\n return inferred;\n }\n\n // Check registered stacks only\n for (const stackId of stackRegistryIds) {\n if (stackId in recipe && (recipe as any)[stackId] !== undefined) {\n const entry = stackRegistryById.get(stackId);\n inferred[stackId] = entry?.latestMajor ?? 1;\n }\n }\n\n return inferred;\n}\n\nfunction getStackContractErrors(\n recipe: Recipe,\n declaredStacks: Record<string, number>,\n inferredStacks: Record<string, number>,\n): NormalizedError[] {\n const contractErrors: NormalizedError[] = [];\n\n // Check stack contract: all inferred stacks must be declared\n for (const [stackName] of Object.entries(inferredStacks)) {\n if (!declaredStacks[stackName]) {\n contractErrors.push({\n path: `/stacks/${stackName}`,\n message: `Stack contract violation: stack payload '${stackName}' exists but stack is not declared in 'stacks'. Add '${stackName}': 1 to the 'stacks' property.`,\n });\n }\n }\n\n // Structural stacks constrain existing properties and don't require payloads\n const structuralStacks = new Set([\"structured\", \"quantified\", \"referenced\", \"timed\"]);\n\n // Map stack names to their required payload property names\n const stackPayloadProperties: Record<string, string | string[]> = {\n prep: \"miseEnPlace\",\n scaling: \"scaling\",\n storage: \"storage\",\n dietary: \"dietary\",\n substitutions: \"substitutions\",\n techniques: \"techniques\",\n equipment: \"equipment\",\n illustrated: [\"images\", \"videos\"], // Either images or videos\n };\n\n for (const [stackName] of Object.entries(declaredStacks)) {\n // Skip payload check for structural stacks - they constrain existing properties\n if (structuralStacks.has(stackName)) {\n continue;\n }\n\n const payloadProps = stackPayloadProperties[stackName];\n if (!payloadProps) {\n continue;\n }\n\n const propNames = Array.isArray(payloadProps) ? payloadProps : [payloadProps];\n const hasPayload = propNames.some((prop) => prop in recipe && (recipe as any)[prop] !== undefined);\n\n if (!hasPayload) {\n const propName = Array.isArray(payloadProps) ? payloadProps.join(\" or \") : payloadProps;\n contractErrors.push({\n path: `/stacks/${stackName}`,\n message: `Stack contract violation: stack '${stackName}' is declared but payload is missing. Add a '${propName}' property to the recipe.`,\n });\n }\n }\n\n return contractErrors;\n}\n\nfunction inferProfileFromRegistry(\n recipe: Recipe,\n declaredStacks: Record<string, number>,\n allStacks: Record<string, number>,\n context: ValidationContext,\n normalizedInput: Recipe,\n originalInput: any,\n): ProfileName {\n let inferred: string | undefined;\n for (const profileId of profileRegistryOrder) {\n const validationResult = validateProfileComposition(\n profileId as ProfileName,\n recipe,\n declaredStacks,\n allStacks,\n context,\n normalizedInput,\n originalInput,\n );\n if (validationResult.ok) {\n inferred = profileId;\n }\n }\n\n if (inferred && typeof inferred === \"string\") {\n return inferred as ProfileName;\n }\n\n return \"lite\";\n}\n\nfunction getProfileWrapperSchemaId(\n context: ValidationContext,\n profileSchemaId: string,\n cacheKey: string,\n options: { removeIngredientInstructionOverrides: boolean },\n): string {\n const wrapperSuffix = options.removeIngredientInstructionOverrides ? \"with-stacks\" : \"no-stacks\";\n const profileWrapperId = `urn:soustack:profile-wrapper:${cacheKey}:${wrapperSuffix}`;\n if (context.ajv.getSchema(profileWrapperId)) {\n return profileWrapperId;\n }\n\n const ajvAny = context.ajv as any;\n const profileSchemaObj = ajvAny.schemas[profileSchemaId];\n if (!profileSchemaObj) {\n throw new Error(`Profile schema object not found: ${profileSchemaId}`);\n }\n\n const profileSchema = profileSchemaObj.schema || profileSchemaObj;\n const filteredAllOf: any[] = [];\n\n const addEntry = (entry: any): void => {\n if (!entry || typeof entry !== \"object\") return;\n if (hasLegacyDefinitionsRef(entry) || hasLegacyProfileOrModuleRef(entry)) {\n return;\n }\n\n let candidate = entry;\n if (\n options.removeIngredientInstructionOverrides &&\n entry.properties &&\n (entry.properties.ingredients || entry.properties.instructions)\n ) {\n candidate = { ...entry };\n if (candidate.properties) {\n const newProps: any = { ...candidate.properties };\n delete newProps.ingredients;\n delete newProps.instructions;\n if (Object.keys(newProps).length > 0) {\n candidate.properties = newProps;\n } else {\n delete candidate.properties;\n }\n }\n }\n\n if (Object.keys(candidate).length > 0) {\n filteredAllOf.push(candidate);\n }\n };\n\n if (Array.isArray(profileSchema.allOf)) {\n profileSchema.allOf.forEach(addEntry);\n }\n\n let wrapperAllOf = [...filteredAllOf];\n\n if (wrapperAllOf.length === 0 && Array.isArray(profileSchema.allOf) && profileSchema.allOf.length > 0) {\n const baseRef = profileSchema.allOf.find(\n (e: any) => e.$ref && !hasLegacyDefinitionsRef(e) && !hasLegacyProfileOrModuleRef(e),\n );\n if (baseRef) {\n wrapperAllOf = [baseRef];\n }\n }\n\n if (wrapperAllOf.length === 0) {\n wrapperAllOf = [{ $ref: BASE_SCHEMA_ID }];\n }\n\n const profileWrapper: any = {\n $id: profileWrapperId,\n allOf: wrapperAllOf,\n };\n\n context.ajv.addSchema(profileWrapper, profileWrapperId);\n return profileWrapperId;\n}\n\n/**\n * Gets a composed validator for a profile and stacks using vendored schemas\n */\nfunction getComposedValidator(\n profile: ProfileName,\n stacks: Record<string, number>,\n context: ValidationContext,\n): ValidateFunction {\n // Create cache key from profile + sorted stack identifiers (e.g., \"attribution@1,times@1\")\n const stackIdentifiers = Object.entries(stacks)\n .map(([name, version]) => `${name}@${version}`)\n .sort();\n const cacheKey = `${profile}::${stackIdentifiers.join(\",\")}`;\n const cached = context.validators.get(cacheKey);\n if (cached) return cached;\n\n // Build composed schema: base + profile + stacks\n // The root schema has conditionals that should override ingredient/instruction definitions when stacks are present.\n // However, with allOf composition, the base definitions are still checked. The root schema's base ingredient\n // definition references IngredientBase (id/name/quantity), which should work with stack schemas, but the error\n // suggests it's checking against a different definition. The root schema's conditionals should handle this,\n // but they might not be matching correctly when multiple stacks are present.\n // When stack schemas are present, we rely on them to define ingredients/instructions via allOf.\n // The root schema is still needed for other properties (name, yield, time, etc.) and its conditionals.\n const baseSchemaWrapperId = `urn:soustack:base-wrapper:${cacheKey}`;\n if (!context.ajv.getSchema(baseSchemaWrapperId)) {\n // Create a wrapper schema that references the root schema but allows unevaluated properties\n // The root schema has unevaluatedProperties: false, but we need to allow stack properties\n // The root schema's conditionals should override the base ingredient/instruction definitions when stacks are present\n // We need to explicitly include the required fields from the base schema, as allOf with $ref might not propagate them correctly\n const baseSchema = context.ajv.getSchema(BASE_SCHEMA_ID);\n if (!baseSchema) {\n throw new Error(`Base schema not loaded: ${BASE_SCHEMA_ID}`);\n }\n // Get the base schema's required fields\n const ajvAny = context.ajv as any;\n const baseSchemaObj = ajvAny.schemas[BASE_SCHEMA_ID];\n const baseSchemaData = baseSchemaObj?.schema || baseSchemaObj;\n const baseRequired = baseSchemaData?.required || [];\n \n const baseSchemaWrapper = {\n $id: baseSchemaWrapperId,\n allOf: [{ $ref: BASE_SCHEMA_ID }],\n // Explicitly include required fields to ensure they are checked\n required: baseRequired,\n // Override unevaluatedProperties to allow stack schema properties\n unevaluatedProperties: true,\n };\n context.ajv.addSchema(baseSchemaWrapper, baseSchemaWrapperId);\n }\n const allOf: any[] = [{ $ref: baseSchemaWrapperId }];\n\n // Verify base schema is loaded\n if (!context.ajv.getSchema(BASE_SCHEMA_ID)) {\n throw new Error(`Base schema not loaded: ${BASE_SCHEMA_ID}. Ensure schemas are loaded before creating validators.`);\n }\n\n // Add profile schema\n // Profile schemas may have legacy ingredient requirements (e.g., \"item\" property) that conflict\n // with stack schemas (which use \"id\", \"name\", \"quantity\"). When stack schemas are present,\n // we need to exclude the profile schema's ingredient/instruction property overrides.\n // Profile schemas are still needed for other requirements (yield, time, etc.).\n const profileSchemaId = `${PROFILE_SCHEMA_PREFIX}${profile}`;\n if (!context.ajv.getSchema(profileSchemaId)) {\n throw new Error(`Profile schema not loaded: ${profileSchemaId}`);\n }\n \n const hasStackSchemas = Object.keys(stacks).length > 0;\n const profileWrapperId = getProfileWrapperSchemaId(context, profileSchemaId, cacheKey, {\n removeIngredientInstructionOverrides: hasStackSchemas,\n });\n allOf.push({ $ref: profileWrapperId });\n\n // Add stack schemas using registry\n const stackSchemaLoading = new Set<string>();\n for (const [name, version] of Object.entries(stacks)) {\n if (name.startsWith(\"x-\")) {\n // Vendor stack - no schema enforcement\n continue;\n }\n\n const registryEntry = stackRegistryById.get(name);\n if (!registryEntry) {\n throw new Error(`Unknown stack: ${name}`);\n }\n if (!registryEntry.versions.includes(version)) {\n throw new Error(`Unsupported stack version for ${name}: ${version}`);\n }\n\n if (typeof version === \"number\" && version >= 1) {\n const schemaId = ensureStackSchemaLoaded(context.ajv, name, version, stackSchemaLoading);\n if (schemaId) {\n allOf.push({ $ref: schemaId });\n } else {\n throw new Error(`Stack schema for '${name}' version ${version} could not be loaded from registry.`);\n }\n }\n }\n\n // Create composed schema with allOf\n // The base wrapper already has unevaluatedProperties: true, so we don't need to set it again\n const composedSchema = {\n $id: `urn:soustack:composed:${cacheKey}`,\n allOf,\n };\n const validateFn = context.ajv.compile(composedSchema);\n context.validators.set(cacheKey, validateFn);\n return validateFn;\n}\n\nfunction filterValidationErrors(\n errors: ErrorObject[],\n validationCopy: Recipe,\n normalizedInput: Recipe,\n originalInput: any,\n allStacks: Record<string, number>,\n): ErrorObject[] {\n const hadTypeProperty =\n (normalizedInput && typeof normalizedInput === \"object\" && \"@type\" in normalizedInput) ||\n (originalInput && typeof originalInput === \"object\" && \"@type\" in originalInput);\n const hadVersionProperty =\n (normalizedInput && typeof normalizedInput === \"object\" && \"version\" in normalizedInput) ||\n (originalInput && typeof originalInput === \"object\" && \"version\" in originalInput);\n const hadSchemaProperty =\n (normalizedInput && typeof normalizedInput === \"object\" && \"$schema\" in normalizedInput) ||\n (originalInput && typeof originalInput === \"object\" && \"$schema\" in originalInput);\n\n // #region agent log\n fetch(\"http://127.0.0.1:7244/ingest/7f75dc85-5d88-41b3-a2c3-713d0c6ca7a6\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n location: \"validator.ts:1167\",\n message: \"Checking @type and version\",\n data: {\n hasOriginalInput: !!originalInput,\n originalInputKeys: originalInput ? Object.keys(originalInput).slice(0, 10) : [],\n normalizedInputKeys: Object.keys(normalizedInput).slice(0, 10),\n hadTypeProperty,\n hadVersionProperty,\n normalizedInputHasType: \"@type\" in normalizedInput,\n normalizedInputHasVersion: \"version\" in normalizedInput,\n },\n timestamp: Date.now(),\n sessionId: \"debug-session\",\n runId: \"filter-debug\",\n hypothesisId: \"B\",\n }),\n }).catch(() => {});\n // #endregion agent log\n\n const xProperties = Object.keys(validationCopy).filter((key) => key.startsWith(\"x-\"));\n\n const stackPropertyNames = new Set<string>();\n for (const [stackName] of Object.entries(allStacks)) {\n const registryEntry = stackRegistryById.get(stackName);\n if (registryEntry) {\n stackPropertyNames.add(stackName);\n }\n }\n\n const validRootProperties = new Set([\n \"$schema\",\n \"profile\",\n \"stacks\",\n \"name\",\n \"yield\",\n \"time\",\n \"ingredients\",\n \"instructions\",\n \"metadata\",\n \"images\",\n \"videos\",\n \"miseEnPlace\",\n \"scaling\",\n \"storage\",\n \"dietary\",\n \"substitutions\",\n \"techniques\",\n \"equipment\",\n ]);\n\n const filteredErrors = errors.filter((e) => {\n if (e.keyword === \"unevaluatedProperties\" || e.keyword === \"additionalProperties\") {\n const instancePath = (e as any).instancePath;\n const isRootLevel = instancePath === undefined || instancePath === \"\" || instancePath === \"/\";\n\n const params = e.params as any;\n const propertyName = params?.unevaluatedProperty || params?.additionalProperty;\n\n const formattedPath = instancePath === \"\" && propertyName ? `/${propertyName}` : instancePath;\n\n if (isRootLevel) {\n if (propertyName && typeof propertyName === \"string\") {\n if (propertyName === \"@type\" || propertyName === \"version\") {\n return false;\n }\n if (validRootProperties.has(propertyName)) {\n return false;\n }\n if (propertyName.startsWith(\"x-\")) {\n return false;\n }\n if (stackPropertyNames.has(propertyName)) {\n return false;\n }\n return true;\n }\n if (xProperties.length > 0) {\n return false;\n }\n if (\n e.keyword === \"unevaluatedProperties\" &&\n (!propertyName || propertyName === undefined || propertyName === null)\n ) {\n return false;\n }\n if ((hadTypeProperty || hadVersionProperty || hadSchemaProperty) && e.keyword === \"unevaluatedProperties\") {\n return false;\n }\n return true;\n } else {\n const pathParts = formattedPath.split(\"/\").filter((p: string) => p);\n if (pathParts.length > 0) {\n const firstPart = pathParts[0];\n if (validRootProperties.has(firstPart) || stackPropertyNames.has(firstPart)) {\n return false;\n }\n }\n if (propertyName && typeof propertyName === \"string\" && propertyName.startsWith(\"x-\")) {\n return false;\n }\n return true;\n }\n }\n return true;\n });\n\n // #region agent log\n fetch(\"http://127.0.0.1:7244/ingest/7f75dc85-5d88-41b3-a2c3-713d0c6ca7a6\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n location: \"validator.ts:1245\",\n message: \"After filtering errors\",\n data: {\n originalErrorCount: errors.length,\n filteredErrorCount: filteredErrors.length,\n willSetValid: filteredErrors.length === 0,\n filteredErrors: filteredErrors.slice(0, 3).map((error: any) => ({\n keyword: error.keyword,\n path: error.instancePath,\n message: error.message,\n })),\n },\n timestamp: Date.now(),\n sessionId: \"debug-session\",\n runId: \"filter-debug\",\n hypothesisId: \"A\",\n }),\n }).catch(() => {});\n // #endregion agent log\n\n return filteredErrors;\n}\n\nfunction validateProfileComposition(\n profile: ProfileName,\n recipe: Recipe,\n declaredStacks: Record<string, number>,\n allStacks: Record<string, number>,\n context: ValidationContext,\n normalizedInput: Recipe,\n originalInput: any,\n): { ok: boolean; errors: NormalizedError[] } {\n const requirementErrors = getProfileRequirementErrors(profile, recipe, declaredStacks, context);\n if (requirementErrors.length > 0) {\n return {\n ok: false,\n errors: requirementErrors,\n };\n }\n\n const profileSchemaId = `${PROFILE_SCHEMA_PREFIX}${profile}`;\n if (!context.ajv.getSchema(profileSchemaId)) {\n return {\n ok: false,\n errors: [\n {\n path: \"/profile\",\n message: `Profile schema not loaded: ${profileSchemaId}`,\n },\n ],\n };\n }\n\n const validationCopy = cloneRecipe(recipe);\n (validationCopy as any).stacks = allStacks;\n if (!validationCopy.profile) {\n (validationCopy as any).profile = profile;\n }\n if (\"@type\" in validationCopy) {\n delete (validationCopy as any)[\"@type\"];\n }\n if (\"$schema\" in validationCopy) {\n delete (validationCopy as any).$schema;\n }\n\n const validator = getComposedValidator(profile, allStacks, context);\n\n let isValid = validator(validationCopy);\n let errors = validator.errors || [];\n\n if (isValid && context.rootValidator) {\n const baseValid = context.rootValidator(validationCopy);\n if (!baseValid && context.rootValidator.errors) {\n const requiredErrors = context.rootValidator.errors.filter(\n (e: any) => e.keyword === \"required\" && e.params?.missingProperty,\n );\n if (requiredErrors.length > 0) {\n isValid = false;\n errors = [...errors, ...context.rootValidator.errors.filter((e: any) => e.keyword === \"required\")];\n }\n }\n }\n\n if (!isValid && errors.length > 0) {\n const filteredErrors = filterValidationErrors(errors, validationCopy, normalizedInput, originalInput, allStacks);\n if (filteredErrors.length === 0) {\n isValid = true;\n errors = [];\n } else {\n errors = filteredErrors;\n }\n }\n\n return {\n ok: isValid,\n errors: errors.map(formatAjvError),\n };\n}\n\n/**\n * Validates a recipe against the root schema from the vendored spec.\n * This is the new primary validation function.\n * For recipes with profile/stacks, uses composed validation (base + profile + stacks).\n * For recipes without profile/stacks, validates against root schema directly.\n */\nexport function validateRecipeSchema(\n input: unknown,\n options: { collectAllErrors?: boolean; schema?: string } = {},\n): {\n ok: boolean;\n errors: NormalizedError[];\n warnings: string[];\n} {\n const inputHasStacks =\n !!input && typeof input === \"object\" && !Array.isArray(input) && \"stacks\" in (input as any);\n // Normalize the input first\n const { recipe: normalizedInput, warnings: inputWarnings } = normalizeRecipe(input);\n const warnings: string[] = [...inputWarnings];\n\n const { ok, errors } = validateRecipeSchemaNormalized(\n normalizedInput,\n inputHasStacks,\n options.collectAllErrors ?? true,\n options.schema,\n input, // Pass original input to check for @type and version\n );\n\n return {\n ok,\n errors,\n warnings,\n };\n}\n\nfunction validateRecipeSchemaNormalized(\n normalizedInput: Recipe,\n inputHasStacks: boolean,\n collectAllErrors: boolean,\n schemaOverride?: string,\n originalInput?: any,\n): { ok: boolean; errors: NormalizedError[] } {\n const normalized = cloneRecipe(normalizedInput);\n\n // Get validation context\n const context = getContext(collectAllErrors);\n\n const schemaHint = typeof schemaOverride === \"string\" ? schemaOverride : typeof normalized.$schema === \"string\" ? normalized.$schema : undefined;\n const resolvedSchema = resolveSchemaHint(schemaHint);\n const schemaId = resolvedSchema.canonicalId;\n const hasSchemaOverride = typeof schemaOverride === \"string\";\n const isSoustackSchema = resolvedSchema.isSoustackSchema;\n if (isSoustackSchema && schemaId) {\n (normalized as any).$schema = schemaId;\n (normalizedInput as any).$schema = schemaId;\n }\n const isLegacySchemaHint = typeof schemaHint === \"string\" && schemaHint.startsWith(LEGACY_ROOT_SCHEMA_ID);\n \n // Check if recipe has stacks - if so, we need to use composed validation\n // even if $schema is set, because the root schema doesn't include stack properties\n const hasStacks = normalized.stacks && typeof normalized.stacks === \"object\" && !Array.isArray(normalized.stacks) && Object.keys(normalized.stacks).length > 0;\n \n // Only use direct schema validation if:\n // 1. Schema is specified AND\n // 2. It's a Soustack schema AND\n // 3. Recipe doesn't have stacks (stacks require composed validation)\n if (schemaId && isSoustackSchema && !hasStacks && hasSchemaOverride) {\n const schemaValidator = context.ajv.getSchema(schemaId) ?? context.ajv.getSchema(DEFAULT_ROOT_SCHEMA_ID);\n if (schemaValidator) {\n\n const schemaInput = cloneRecipe(normalized);\n // Remove $schema from validation copy - it's a JSON Schema property, not part of the recipe schema\n if (\"$schema\" in schemaInput) {\n delete (schemaInput as any).$schema;\n }\n if (hasSchemaOverride && \"$schema\" in schemaInput && schemaInput.$schema !== schemaId) {\n delete (schemaInput as any).$schema;\n }\n const isLegacySchema = isLegacySchemaHint || (schemaId ? schemaId.startsWith(LEGACY_ROOT_SCHEMA_ID) : false);\n const shouldRemoveStacks = (isLegacySchema || schemaId === DEFAULT_ROOT_SCHEMA_ID) && !inputHasStacks;\n if (isLegacySchema && \"@type\" in schemaInput) {\n delete (schemaInput as any)[\"@type\"];\n }\n if (shouldRemoveStacks && \"stacks\" in schemaInput) {\n delete (schemaInput as any).stacks;\n }\n const schemaValid = schemaValidator(schemaInput);\n const schemaErrors = schemaValidator.errors || [];\n \n // Filter out false positive errors for properties we remove before validation ($schema, @type, version)\n const hadSchemaProperty = (normalizedInput && typeof normalizedInput === \"object\" && \"$schema\" in normalizedInput)\n || (originalInput && typeof originalInput === \"object\" && \"$schema\" in originalInput);\n const hadTypeProperty = (normalizedInput && typeof normalizedInput === \"object\" && \"@type\" in normalizedInput) \n || (originalInput && typeof originalInput === \"object\" && \"@type\" in originalInput);\n const hadVersionProperty = (normalizedInput && typeof normalizedInput === \"object\" && \"version\" in normalizedInput)\n || (originalInput && typeof originalInput === \"object\" && \"version\" in originalInput);\n \n const filteredErrors = schemaErrors.filter((e) => {\n if (e.keyword === \"unevaluatedProperties\" || e.keyword === \"additionalProperties\") {\n const instancePath = e.instancePath;\n const isRootLevel = instancePath === undefined || instancePath === \"\" || instancePath === \"/\";\n const params = e.params as any;\n const propertyName = params?.unevaluatedProperty || params?.additionalProperty;\n \n if (isRootLevel) {\n if (propertyName && typeof propertyName === \"string\") {\n // Filter out errors for properties we remove or that are valid\n if (propertyName === \"$schema\" || propertyName === \"@type\" || propertyName === \"version\") {\n return false;\n }\n // Filter out valid root properties\n if (propertyName === \"profile\" || propertyName === \"stacks\" || propertyName === \"name\" || \n propertyName === \"yield\" || propertyName === \"time\" || propertyName === \"ingredients\" || \n propertyName === \"instructions\" || propertyName.startsWith(\"x-\")) {\n return false;\n }\n }\n // Filter out unevaluatedProperties errors without property names if we removed $schema, @type, or version\n if (e.keyword === \"unevaluatedProperties\" && (!propertyName || propertyName === undefined || propertyName === null)) {\n if (hadSchemaProperty || hadTypeProperty || hadVersionProperty) {\n return false; // Likely a false positive from removed properties\n }\n }\n }\n }\n return true;\n });\n \n // If validation passed, it's valid\n // If validation failed but all errors were filtered out (meaning they were false positives),\n // also consider it valid\n const ok = Boolean(schemaValid) || (filteredErrors.length === 0);\n \n return {\n ok,\n errors: filteredErrors.map(formatAjvError),\n };\n }\n }\n \n // If schema is specified but recipe has stacks, fall through to composed validation\n // This ensures stack properties are validated correctly\n\n // Determine if we should use composed validation or root schema\n const hasProfile = normalized.profile && typeof normalized.profile === \"string\";\n \n let profileName = hasProfile\n ? ((normalized.profile as string).toLowerCase() as string)\n : undefined;\n \n // Get declared stacks from recipe\n let declaredStacks: Record<string, number> = {};\n if (normalized.stacks && typeof normalized.stacks === \"object\" && !Array.isArray(normalized.stacks)) {\n for (const [name, version] of Object.entries(normalized.stacks)) {\n if (typeof version === \"number\" && version >= 1) {\n declaredStacks[name] = version;\n }\n }\n }\n\n const registryErrors = validateDeclaredStacksAgainstRegistry(declaredStacks);\n if (registryErrors.length > 0) {\n return {\n ok: false,\n errors: registryErrors,\n };\n }\n\n // Infer stacks from payloads (for stack contract enforcement)\n // Stack contract: if a payload exists, the stack MUST be declared in the recipe\n const inferredStacks = inferStacksFromPayload(normalized);\n const contractErrors = getStackContractErrors(normalized, declaredStacks, inferredStacks);\n if (contractErrors.length > 0) {\n return {\n ok: false,\n errors: contractErrors,\n };\n }\n \n // Merge declared and inferred stacks, using max(version) per stack name\n const allStacks: Record<string, number> = { ...inferredStacks, ...declaredStacks };\n\n // Infer profile if none specified, using declared stacks only\n // Always use composed validation (base + profile + stacks) instead of root schema\n if (!profileName) {\n profileName = inferProfileFromRegistry(normalized, declaredStacks, allStacks, context, normalizedInput, originalInput);\n }\n \n const profile = profileName as ProfileName;\n (normalized as any).profile = profile;\n (normalizedInput as any).profile = profile;\n\n const validationOutcome = validateProfileComposition(\n profile,\n normalized,\n declaredStacks,\n allStacks,\n context,\n normalizedInput,\n originalInput,\n );\n\n return validationOutcome;\n}\n\nfunction isInstruction(item: any): item is { id?: string; dependsOn?: string[] } {\n return item && typeof item === \"object\" && !Array.isArray(item) && \"text\" in item;\n}\n\nfunction isInstructionSubsection(item: any): item is { items: any[] } {\n return item && typeof item === \"object\" && !Array.isArray(item) && \"items\" in item && \"subsection\" in item;\n}\n\nexport function checkInstructionGraph(recipe: Recipe): NormalizedError[] {\n const instructions = (recipe as any)?.instructions;\n if (!Array.isArray(instructions)) return [];\n\n const instructionIds = new Set<string>();\n const dependencyRefs: { fromId?: string; toId: string; path: string }[] = [];\n\n const collect = (items: any[], basePath: string) => {\n items.forEach((item, index) => {\n const currentPath = `${basePath}/${index}`;\n\n if (isInstructionSubsection(item) && Array.isArray(item.items)) {\n collect(item.items, `${currentPath}/items`);\n return;\n }\n\n if (isInstruction(item)) {\n const id = typeof item.id === \"string\" ? item.id : undefined;\n if (id) instructionIds.add(id);\n\n if (Array.isArray(item.dependsOn)) {\n item.dependsOn.forEach((depId, depIndex) => {\n if (typeof depId === \"string\") {\n dependencyRefs.push({\n fromId: id,\n toId: depId,\n path: `${currentPath}/dependsOn/${depIndex}`,\n });\n }\n });\n }\n }\n });\n };\n\n collect(instructions, \"/instructions\");\n\n const errors: NormalizedError[] = [];\n\n dependencyRefs.forEach((ref) => {\n if (!instructionIds.has(ref.toId)) {\n errors.push({\n path: ref.path,\n message: `Instruction dependency references missing id '${ref.toId}'.`,\n });\n }\n });\n\n const adjacency = new Map<string, { toId: string; path: string }[]>();\n dependencyRefs.forEach((ref) => {\n if (ref.fromId && instructionIds.has(ref.fromId) && instructionIds.has(ref.toId)) {\n const list = adjacency.get(ref.fromId) ?? [];\n list.push({ toId: ref.toId, path: ref.path });\n adjacency.set(ref.fromId, list);\n }\n });\n\n const visiting = new Set<string>();\n const visited = new Set<string>();\n\n const detectCycles = (nodeId: string) => {\n if (visiting.has(nodeId)) return;\n if (visited.has(nodeId)) return;\n\n visiting.add(nodeId);\n const neighbors = adjacency.get(nodeId) ?? [];\n neighbors.forEach((edge) => {\n if (visiting.has(edge.toId)) {\n errors.push({\n path: edge.path,\n message: `Circular dependency detected involving instruction id '${edge.toId}'.`,\n });\n return;\n }\n detectCycles(edge.toId);\n });\n visiting.delete(nodeId);\n visited.add(nodeId);\n };\n\n instructionIds.forEach((id) => detectCycles(id));\n\n return errors;\n}\n\n/**\n * Legacy validateRecipe function - now uses the new validateRecipeSchema internally\n * but maintains backward compatibility with profile/stack-based validation\n * Also includes semantic conformance validation.\n */\n/**\n * Validates a recipe with explicit validation modes.\n * - mode=\"schema\": JSON Schema only\n * - mode=\"full\": schema + semantic conformance (only if schema passes)\n */\nexport function validateRecipe(input: any, options: ValidateOptions = {}): ValidateResult {\n const { recipe: normalized, warnings } = normalizeRecipe(input);\n if (options.profile) {\n (normalized as any).profile = options.profile;\n }\n\n const inputHasStacks =\n !!input && typeof input === \"object\" && !Array.isArray(input) && \"stacks\" in (input as any);\n const { ok: schemaOk, errors: schemaErrors } = validateRecipeSchemaNormalized(\n normalized,\n inputHasStacks,\n options.collectAllErrors ?? true,\n options.schema,\n input, // Pass original input to check for @type and version\n );\n\n const mode: ValidateMode = options.mode ?? \"full\";\n let conformanceIssues: ConformanceIssue[] = [];\n let conformanceOk = true;\n\n if (mode === \"full\") {\n if (schemaOk) {\n const conformanceResult = validateConformance(normalized);\n conformanceIssues = conformanceResult.issues;\n conformanceOk = conformanceResult.ok;\n } else {\n conformanceOk = false;\n }\n }\n\n const ok = schemaOk && (mode === \"schema\" ? true : conformanceOk);\n const normalizedRecipe = ok || options.includeNormalized ? normalized : undefined;\n\n return {\n ok,\n schemaErrors,\n conformanceIssues,\n warnings,\n normalizedRecipe,\n };\n}\n\nexport function validateRecipeWithProfile(data: any, profile: ProfileName): data is Recipe {\n return validateRecipe(data, { profile }).ok;\n}\n\nexport function __getComposedSchemaForTesting(profile: ProfileName, stacks: Record<string, number>): any {\n const context = getContext(false);\n const validator = getComposedValidator(profile, stacks, context);\n return validator.schema;\n}\n\nexport function detectProfiles(recipe: any): ProfileName[] {\n const { recipe: normalized } = normalizeRecipe(recipe);\n const context = getContext(false);\n\n const declaredStacks: Record<string, number> = {};\n if (normalized.stacks && typeof normalized.stacks === \"object\" && !Array.isArray(normalized.stacks)) {\n for (const [name, version] of Object.entries(normalized.stacks)) {\n if (typeof version === \"number\" && version >= 1) {\n declaredStacks[name] = version;\n }\n }\n }\n\n const registryErrors = validateDeclaredStacksAgainstRegistry(declaredStacks);\n if (registryErrors.length > 0) {\n return [];\n }\n\n const inferredStacks = inferStacksFromPayload(normalized);\n const contractErrors = getStackContractErrors(normalized, declaredStacks, inferredStacks);\n if (contractErrors.length > 0) {\n return [];\n }\n\n const allStacks: Record<string, number> = { ...inferredStacks, ...declaredStacks };\n const compatible: ProfileName[] = [];\n\n for (const profileId of profileRegistryOrder) {\n const outcome = validateProfileComposition(\n profileId as ProfileName,\n normalized,\n declaredStacks,\n allStacks,\n context,\n normalized,\n recipe,\n );\n if (outcome.ok) {\n compatible.push(profileId as ProfileName);\n }\n }\n\n return compatible;\n}\n","import { Yield } from '../types';\n\nexport function parseYield(value: unknown): Yield | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n\n if (typeof value === 'number') {\n return {\n amount: value,\n unit: 'servings'\n };\n }\n\n if (Array.isArray(value)) {\n return parseYield(value[0]);\n }\n\n if (typeof value === 'object') {\n const maybeYield = value as Record<string, any>;\n if (typeof maybeYield.amount === 'number') {\n return {\n amount: maybeYield.amount,\n unit: typeof maybeYield.unit === 'string' ? maybeYield.unit : 'servings',\n description:\n typeof maybeYield.description === 'string'\n ? maybeYield.description\n : undefined\n };\n }\n }\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n const match = trimmed.match(/(\\d+(?:\\.\\d+)?)/);\n if (match) {\n const amount = parseFloat(match[1]);\n const unit = trimmed.slice(match.index! + match[1].length).trim();\n return {\n amount,\n unit: unit || 'servings',\n description: trimmed\n };\n }\n }\n\n return undefined;\n}\n\nexport function formatYield(yieldValue?: Yield): string | undefined {\n if (!yieldValue) return undefined;\n if (!yieldValue.amount && !yieldValue.unit) {\n return undefined;\n }\n\n const amount = yieldValue.amount ?? '';\n const unit = yieldValue.unit ? ` ${yieldValue.unit}` : '';\n return `${amount}${unit}`.trim() || yieldValue.description;\n}\n","import { SchemaOrgImage } from '../types/schemaOrg';\n\n/**\n * Normalize Schema.org image formats to Soustack format.\n * - String values pass through\n * - Arrays collapse to string or string[] after URL extraction\n * - ImageObjects extract their url/contentUrl\n */\nexport function normalizeImage(\n image: SchemaOrgImage | undefined | null\n): string | string[] | undefined {\n if (!image) {\n return undefined;\n }\n\n if (typeof image === 'string') {\n const trimmed = image.trim();\n return trimmed || undefined;\n }\n\n if (Array.isArray(image)) {\n const urls = image\n .map(entry => (typeof entry === 'string' ? entry.trim() : extractUrl(entry)))\n .filter((url): url is string => typeof url === 'string' && Boolean(url));\n\n if (urls.length === 0) {\n return undefined;\n }\n if (urls.length === 1) {\n return urls[0];\n }\n return urls;\n }\n\n return extractUrl(image);\n}\n\nfunction extractUrl(\n value: Exclude<SchemaOrgImage, string | string[] | undefined | null>\n): string | undefined {\n if (!value || typeof value !== 'object') {\n return undefined;\n }\n\n const record = value as { url?: unknown; contentUrl?: unknown };\n const candidate =\n typeof record.url === 'string'\n ? record.url\n : typeof record.contentUrl === 'string'\n ? record.contentUrl\n : undefined;\n\n if (!candidate) {\n return undefined;\n }\n\n const trimmed = candidate.trim();\n return trimmed || undefined;\n}\n","import {\n Ingredient,\n IngredientItem,\n Instruction,\n InstructionItem,\n Recipe,\n Source,\n NutritionFacts,\n StepTiming,\n Time\n} from './types';\nimport { parseYield } from './converters/yield';\nimport { smartParseDuration } from './parsers/duration';\nimport {\n HowToSection,\n HowToStep,\n SchemaOrgPersonOrOrganization,\n SchemaOrgRecipe,\n SchemaOrgImage\n} from './types/schemaOrg';\nimport { normalizeImage } from './utils/image';\nimport { normalizeRecipe } from './normalize';\nimport { withCanonicalSchema } from './schemaMetadata';\n\nexport function fromSchemaOrg(input: unknown): Recipe | null {\n const recipeNode = extractRecipeNode(input);\n if (!recipeNode) {\n return null;\n }\n\n const ingredients = convertIngredients(recipeNode.recipeIngredient);\n const instructions = convertInstructions(recipeNode.recipeInstructions);\n const time = convertTime(recipeNode);\n const recipeYield = parseYield(recipeNode.recipeYield);\n const tags = collectTags(recipeNode.recipeCuisine, recipeNode.keywords);\n const category = extractFirst(recipeNode.recipeCategory);\n const source = convertSource(recipeNode);\n const dateModified = recipeNode.dateModified || undefined;\n const nutrition = convertNutrition(recipeNode.nutrition);\n const images = toArray(normalizeImage(recipeNode.image));\n const videos = normalizeMediaList(recipeNode.video);\n const profile: Recipe['profile'] =\n recipeYield && time ? 'base' : 'lite';\n\n // Legacy stack conversions removed - vNext doesn't support attribution/taxonomy/media/times/nutrition stacks\n // Schema.org data is mapped to vNext properties directly\n const stacks: Record<string, number> = {};\n\n const rawRecipe = {\n '@type': 'Recipe',\n profile,\n stacks,\n name: recipeNode.name.trim(),\n description: recipeNode.description?.trim() || undefined,\n images: images.length ? images : undefined,\n videos: videos.length ? videos : undefined,\n category,\n tags: tags.length ? tags : undefined,\n source,\n dateAdded: recipeNode.datePublished || undefined,\n yield: recipeYield,\n time,\n ingredients,\n instructions,\n ...(dateModified ? { dateModified } : {}),\n ...(nutrition ? { nutrition } : {})\n };\n\n // Normalize the recipe to ensure it's in the correct format\n const { recipe } = normalizeRecipe(rawRecipe);\n \n return withCanonicalSchema(recipe as Recipe);\n}\n\nfunction extractRecipeNode(input: unknown): SchemaOrgRecipe | null {\n if (!input) return null;\n\n if (Array.isArray(input)) {\n for (const entry of input) {\n const found = extractRecipeNode(entry);\n if (found) {\n return found;\n }\n }\n return null;\n }\n\n if (typeof input !== 'object') {\n return null;\n }\n\n const record = input as Partial<SchemaOrgRecipe> & { [key: string]: unknown };\n\n if (record['@graph']) {\n const fromGraph = extractRecipeNode(record['@graph']);\n if (fromGraph) {\n return fromGraph;\n }\n }\n\n if (!hasRecipeType(record['@type'])) {\n return null;\n }\n\n if (!isValidName(record.name)) {\n return null;\n }\n\n return record as SchemaOrgRecipe;\n}\n\nfunction hasRecipeType(value: SchemaOrgRecipe['@type']): boolean {\n if (!value) return false;\n const types = Array.isArray(value) ? value : [value];\n return types.some(\n entry => typeof entry === 'string' && entry.toLowerCase() === 'recipe'\n );\n}\n\nfunction isValidName(name: unknown): name is string {\n return typeof name === 'string' && Boolean(name.trim());\n}\n\nfunction convertIngredients(\n value: SchemaOrgRecipe['recipeIngredient']\n): IngredientItem[] {\n if (!value) return [];\n const normalized = Array.isArray(value) ? value : [value];\n return normalized\n .map(item => (typeof item === 'string' ? item.trim() : ''))\n .filter(Boolean)\n .map<Ingredient>(name => ({\n name,\n scaling: { mode: 'linear' }\n }));\n}\n\nfunction convertInstructions(\n value: SchemaOrgRecipe['recipeInstructions']\n): InstructionItem[] {\n if (!value) return [];\n const normalized = Array.isArray(value) ? value : [value];\n const result: InstructionItem[] = [];\n\n for (const entry of normalized) {\n if (!entry) continue;\n\n if (typeof entry === 'string') {\n const text = entry.trim();\n if (text) {\n result.push(text);\n }\n continue;\n }\n\n if (isHowToSection(entry)) {\n const subsectionItems = extractSectionItems(entry.itemListElement);\n if (subsectionItems.length) {\n result.push({\n section: entry.name?.trim() || 'Section',\n steps: subsectionItems\n });\n }\n continue;\n }\n\n if (isHowToStep(entry)) {\n const parsed = convertHowToStep(entry);\n if (parsed) {\n result.push(parsed);\n }\n }\n }\n\n return result;\n}\n\nfunction extractSectionItems(\n items: Array<string | HowToStep | HowToSection> = []\n): Array<string | Instruction> {\n const result: Array<string | Instruction> = [];\n\n for (const item of items) {\n if (!item) continue;\n\n if (typeof item === 'string') {\n const text = item.trim();\n if (text) {\n result.push(text);\n }\n continue;\n }\n\n if (isHowToStep(item)) {\n const parsed = convertHowToStep(item);\n if (parsed) {\n result.push(parsed);\n }\n continue;\n }\n\n if (isHowToSection(item)) {\n result.push(...extractSectionItems(item.itemListElement));\n }\n }\n\n return result;\n}\n\nfunction extractInstructionText(value: HowToStep): string | undefined {\n const text = typeof value.text === 'string' ? value.text : value.name;\n return typeof text === 'string' ? text.trim() || undefined : undefined;\n}\n\nfunction convertHowToStep(step: HowToStep): string | Instruction | undefined {\n const text = extractInstructionText(step);\n if (!text) {\n return undefined;\n }\n\n const normalizedImage = normalizeImage(step.image);\n const image = Array.isArray(normalizedImage)\n ? normalizedImage[0]\n : normalizedImage;\n const id = extractInstructionId(step);\n const timing = extractInstructionTiming(step);\n\n if (!image && !id && !timing) {\n return text;\n }\n\n const instruction: Instruction = { text };\n if (id) instruction.id = id;\n if (image) instruction.images = Array.isArray(image) ? image : [image];\n if (timing) instruction.timing = timing;\n\n return instruction;\n}\n\nfunction extractInstructionTiming(step: HowToStep): StepTiming | undefined {\n const duration =\n step.totalTime || step.performTime || step.prepTime || (step as any).duration;\n\n if (!duration || typeof duration !== 'string') {\n return undefined;\n }\n\n const parsed = smartParseDuration(duration);\n if (parsed === null || parsed === undefined) {\n return undefined;\n }\n \n return {\n activity: 'active',\n duration: { minutes: parsed }\n };\n}\n\nfunction extractInstructionId(step: HowToStep): string | undefined {\n const raw = (step as any)['@id'] || (step as any).id || step.url;\n if (typeof raw !== 'string') {\n return undefined;\n }\n const trimmed = raw.trim();\n return trimmed || undefined;\n}\n\nfunction isHowToStep(value: unknown): value is HowToStep {\n return (\n Boolean(value) &&\n typeof value === 'object' &&\n (value as HowToStep)['@type'] === 'HowToStep'\n );\n}\n\nfunction isHowToSection(value: unknown): value is HowToSection {\n return (\n Boolean(value) &&\n typeof value === 'object' &&\n (value as HowToSection)['@type'] === 'HowToSection' &&\n Array.isArray((value as HowToSection).itemListElement)\n );\n}\n\nfunction convertTime(recipe: SchemaOrgRecipe): Time | undefined {\n const total = smartParseDuration(recipe.totalTime ?? '');\n const prep = smartParseDuration(recipe.prepTime ?? '');\n const cook = smartParseDuration(recipe.cookTime ?? '');\n\n const minutes = isPositiveDuration(total)\n ? total\n : [prep, cook].filter(isPositiveDuration).reduce<number | null>((sum, value) => {\n if (sum === null) return value;\n return sum + value;\n }, null);\n\n if (!isPositiveDuration(minutes)) {\n return undefined;\n }\n\n return {\n total: { minutes }\n };\n}\n\nfunction isPositiveDuration(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value) && value > 0;\n}\n\nfunction collectTags(cuisine: unknown, keywords: unknown): string[] {\n const tags = new Set<string>();\n flattenStrings(cuisine).forEach(tag => tags.add(tag));\n if (typeof keywords === 'string') {\n splitKeywords(keywords).forEach(tag => tags.add(tag));\n } else {\n flattenStrings(keywords).forEach(tag => tags.add(tag));\n }\n return Array.from(tags);\n}\n\nfunction splitKeywords(value: string): string[] {\n return value\n .split(/[,|]/)\n .map(part => part.trim())\n .filter(Boolean);\n}\n\nfunction flattenStrings(value: unknown): string[] {\n if (!value) return [];\n if (typeof value === 'string') return [value.trim()].filter(Boolean);\n if (Array.isArray(value)) {\n return value\n .map(item => (typeof item === 'string' ? item.trim() : ''))\n .filter(Boolean);\n }\n return [];\n}\n\nfunction extractFirst(value: unknown): string | undefined {\n const arr = flattenStrings(value);\n return arr.length ? arr[0] : undefined;\n}\n\nfunction convertSource(recipe: SchemaOrgRecipe): Source | undefined {\n const author = extractEntityName(recipe.author);\n const publisher = extractEntityName(recipe.publisher);\n const url = (recipe.url || recipe.mainEntityOfPage)?.trim();\n\n const source: Source = {};\n if (author) source.author = author;\n if (publisher) source.name = publisher;\n if (url) source.url = url;\n\n return Object.keys(source).length ? source : undefined;\n}\n\nfunction extractEntityName(\n value:\n | SchemaOrgPersonOrOrganization\n | SchemaOrgPersonOrOrganization[]\n | string\n | string[]\n | undefined\n): string | undefined {\n if (!value) return undefined;\n\n if (typeof value === 'string') {\n const trimmed = value.trim();\n return trimmed || undefined;\n }\n\n if (Array.isArray(value)) {\n for (const entry of value) {\n const name = extractEntityName(entry as any);\n if (name) {\n return name;\n }\n }\n return undefined;\n }\n\n if (typeof value === 'object' && typeof value.name === 'string') {\n const trimmed = value.name.trim();\n return trimmed || undefined;\n }\n\n return undefined;\n}\n\n// Legacy stack conversion functions removed - vNext doesn't support attribution/taxonomy stacks\n\nfunction normalizeMediaList(value: SchemaOrgImage | undefined): string[] {\n if (!value) return [];\n if (typeof value === 'string') return [value.trim()].filter(Boolean);\n if (Array.isArray(value)) {\n return value\n .map(item => (typeof item === 'string' ? item.trim() : extractMediaUrl(item)))\n .filter((entry): entry is string => Boolean(entry?.length));\n }\n\n const url = extractMediaUrl(value);\n return url ? [url] : [];\n}\n\nfunction extractMediaUrl(value: unknown): string | undefined {\n if (value && typeof value === 'object') {\n const urlValue =\n typeof (value as any).url === 'string'\n ? (value as any).url\n : typeof (value as any).contentUrl === 'string'\n ? (value as any).contentUrl\n : undefined;\n\n if (typeof urlValue === 'string') {\n const trimmed = urlValue.trim();\n return trimmed || undefined;\n }\n }\n return undefined;\n}\n\nfunction toArray(value: string | string[] | undefined): string[] {\n if (!value) return [];\n return Array.isArray(value) ? value : [value];\n}\n\n// Legacy stack conversion functions removed - vNext doesn't support media/times stacks\n// Media is handled via image property, time via time property\n\nfunction convertNutrition(\n nutrition: SchemaOrgRecipe['nutrition']\n): NutritionFacts | undefined {\n if (!nutrition || typeof nutrition !== 'object') {\n return undefined;\n }\n\n const result: NutritionFacts = {};\n let hasData = false;\n\n // Parse calories - can be string or number in Schema.org\n if ('calories' in nutrition) {\n const calories = nutrition.calories;\n if (typeof calories === 'number') {\n result.calories = calories;\n hasData = true;\n } else if (typeof calories === 'string') {\n // Try to parse string like \"200 cal\" or \"200\"\n const parsed = parseFloat(calories.replace(/[^\\d.-]/g, ''));\n if (!isNaN(parsed)) {\n result.calories = parsed;\n hasData = true;\n }\n }\n }\n\n // Parse protein - Schema.org uses \"proteinContent\", we need \"protein_g\"\n if ('proteinContent' in nutrition || 'protein_g' in nutrition) {\n const protein = nutrition.proteinContent || nutrition.protein_g;\n if (typeof protein === 'number') {\n result.protein_g = protein;\n hasData = true;\n } else if (typeof protein === 'string') {\n // Try to parse string like \"10 g\" or \"10\"\n const parsed = parseFloat(protein.replace(/[^\\d.-]/g, ''));\n if (!isNaN(parsed)) {\n result.protein_g = parsed;\n hasData = true;\n }\n }\n }\n\n return hasData ? result : undefined;\n}\n","import {\n IngredientItem,\n Instruction,\n InstructionItem,\n Recipe,\n Time\n} from '../types';\nimport { formatDuration } from '../parsers/duration';\nimport { formatYield } from './yield';\nimport {\n HowToSection,\n HowToStep,\n SchemaOrgInstruction,\n SchemaOrgRecipe\n} from '../types/schemaOrg';\nimport stacksRegistry from '../stacks/registry.json';\nimport { withCanonicalSchema } from '../schemaMetadata';\n\nexport function convertBasicMetadata(recipe: Recipe): Partial<SchemaOrgRecipe> {\n const image = toSchemaOrgMedia(recipe.images ?? (recipe as any).image);\n const video = toSchemaOrgMedia(recipe.videos);\n\n return cleanOutput({\n '@context': 'https://schema.org',\n '@type': 'Recipe',\n name: recipe.name,\n description: recipe.description,\n image,\n video,\n url: recipe.source?.url,\n datePublished: recipe.dateAdded,\n dateModified: recipe.dateModified\n });\n}\n\nexport function convertIngredients(ingredients: IngredientItem[] = []): string[] {\n const result: string[] = [];\n\n ingredients.forEach(ingredient => {\n if (!ingredient) {\n return;\n }\n\n if (typeof ingredient === 'string') {\n const value = ingredient.trim();\n if (value) {\n result.push(value);\n }\n return;\n }\n\n if ('section' in ingredient) {\n ingredient.ingredients.forEach((item: IngredientItem) => {\n if (!item) {\n return;\n }\n if (typeof item === 'string') {\n const value = item.trim();\n if (value) {\n result.push(value);\n }\n } else if ('name' in item && item.name) {\n const value = item.name.trim();\n if (value) {\n result.push(value);\n }\n }\n });\n return;\n }\n\n const value = 'name' in ingredient ? ingredient.name?.trim() : undefined;\n if (value) {\n result.push(value);\n }\n });\n\n return result;\n}\n\nexport function convertInstructions(\n instructions: InstructionItem[] = []\n): SchemaOrgInstruction[] {\n return instructions\n .map(entry => convertInstruction(entry))\n .filter((value): value is SchemaOrgInstruction => Boolean(value));\n}\n\nfunction convertInstruction(entry: InstructionItem): SchemaOrgInstruction | null {\n if (!entry) {\n return null;\n }\n\n if (typeof entry === 'string') {\n const value = entry.trim();\n return value || null;\n }\n\n if ('section' in entry) {\n const steps = entry.steps\n .map((item: InstructionItem) => convertInstruction(item))\n .filter((step): step is SchemaOrgInstruction => Boolean(step));\n\n if (!steps.length) {\n return null;\n }\n\n return {\n '@type': 'HowToSection',\n name: entry.section,\n itemListElement: steps\n };\n }\n\n if ('text' in entry) {\n return createHowToStep(entry);\n }\n\n return createHowToStep(String(entry));\n}\n\nfunction createHowToStep(\n entry: string | Instruction | undefined\n): SchemaOrgInstruction | null {\n if (!entry) return null;\n\n if (typeof entry === 'string') {\n const trimmed = entry.trim();\n return trimmed || null;\n }\n\n const trimmed = entry.text?.trim();\n if (!trimmed) {\n return null;\n }\n\n const step: HowToStep = {\n '@type': 'HowToStep',\n text: trimmed\n };\n\n if (entry.id) {\n step['@id'] = entry.id;\n }\n\n if (entry.timing?.duration) {\n const duration = entry.timing.duration;\n if (typeof duration === 'object' && 'minutes' in duration) {\n step.performTime = formatDuration(duration.minutes);\n } else if (typeof duration === 'number') {\n step.performTime = formatDuration(duration);\n }\n }\n\n if (entry.images && entry.images.length > 0) {\n step.image = entry.images[0]; // Use first image for Schema.org\n }\n\n if (step['@id'] || step.performTime || step.image) {\n return step;\n }\n\n return trimmed;\n}\n\nexport function convertTime(time?: Time): Partial<SchemaOrgRecipe> {\n if (!time) {\n return {};\n }\n\n // vNext Time format: { total: { minutes: number } }\n const result: Partial<SchemaOrgRecipe> = {};\n if (time.total && typeof time.total === 'object' && 'minutes' in time.total) {\n result.totalTime = formatDuration(time.total.minutes);\n }\n return result;\n}\n\nexport function convertYield(yld?: Recipe['yield']): string | undefined {\n if (!yld) {\n return undefined;\n }\n return formatYield(yld);\n}\n\nexport function convertAuthor(\n source?: Recipe['source']\n): Partial<SchemaOrgRecipe> {\n if (!source) {\n return {};\n }\n\n const result: Partial<SchemaOrgRecipe> = {};\n\n if (source.author) {\n result.author = {\n '@type': 'Person',\n name: source.author\n };\n }\n\n if (source.name) {\n result.publisher = {\n '@type': 'Organization',\n name: source.name\n };\n }\n\n if (source.url) {\n result.url = source.url;\n }\n\n return result;\n}\n\nexport function convertCategoryTags(\n category?: string,\n tags?: string[]\n): Partial<SchemaOrgRecipe> {\n const result: Partial<SchemaOrgRecipe> = {};\n\n if (category) {\n result.recipeCategory = category;\n }\n\n if (tags && tags.length > 0) {\n result.keywords = tags.filter(Boolean).join(', ');\n }\n\n return result;\n}\n\nexport function convertNutrition(\n nutrition?: Recipe['nutrition']\n): SchemaOrgRecipe['nutrition'] {\n if (!nutrition) {\n return undefined;\n }\n\n const result: SchemaOrgRecipe['nutrition'] = {\n '@type': 'NutritionInformation'\n };\n\n // Convert numeric calories to Schema.org string format\n if (nutrition.calories !== undefined) {\n if (typeof nutrition.calories === 'number') {\n result.calories = `${nutrition.calories} calories`;\n } else {\n result.calories = nutrition.calories;\n }\n }\n\n // Preserve other nutrition fields as-is (excluding @type which we override)\n Object.keys(nutrition).forEach(key => {\n if (key !== 'calories' && key !== '@type') {\n (result as any)[key] = (nutrition as any)[key];\n }\n });\n\n return result;\n}\n\nfunction toSchemaOrgMedia(\n media?: string | string[] | null\n): string | string[] | undefined {\n if (!media) {\n return undefined;\n }\n\n const list = Array.isArray(media) ? media.filter(Boolean) : [media];\n if (list.length === 0) {\n return undefined;\n }\n\n return list.length === 1 ? list[0] : list;\n}\n\nexport function cleanOutput<T extends Record<string, unknown>>(obj: T): T {\n return Object.fromEntries(\n Object.entries(obj).filter(([, value]) => value !== undefined)\n ) as T;\n}\n\n/**\n * Get schemaOrgMappable stacks from the recipe's stacks map.\n * Only stacks that are marked as schemaOrgMappable in the registry are included.\n * Returns a set of stack identifiers (e.g., [\"attribution@1\", \"times@1\"]).\n */\nfunction getSchemaOrgMappableStacks(stacks: Record<string, number> = {}): Set<string> {\n const mappableStackIds = new Set<string>();\n \n // The new registry structure doesn't have schemaOrgMappable field\n // Use a hardcoded list of stacks that have Schema.org equivalents\n // These correspond to Schema.org Recipe properties\n const mappableStackNames = new Set([\n // Note: Old stack names that may still be in use\n 'attribution', // maps to author/publisher\n 'taxonomy', // maps to recipeCategory/keywords\n // Legacy times stack removed - time is now a base property\n // New stack names (if they map to Schema.org)\n // Add new mappable stacks here as they're identified\n ]);\n\n // Check which stacks in the recipe are mappable\n for (const [name, version] of Object.entries(stacks)) {\n if (mappableStackNames.has(name) && typeof version === \"number\" && version >= 1) {\n mappableStackIds.add(`${name}@${version}`);\n }\n }\n \n return mappableStackIds;\n}\n\n/**\n * Convert a Soustack recipe to Schema.org JSON-LD format.\n * \n * BREAKING CHANGE in v0.0.2: This function now targets the \"minimal\" profile\n * and only includes stacks that are schemaOrgMappable (as defined in the\n * stacks registry). Non-mappable stacks (e.g., nutrition@1, schedule@1)\n * are excluded from the conversion.\n */\nexport function toSchemaOrg(recipe: Recipe): SchemaOrgRecipe {\n const base = convertBasicMetadata(recipe);\n const ingredients = convertIngredients(recipe.ingredients);\n const instructions = convertInstructions(recipe.instructions);\n \n // Get mappable stacks from recipe.stacks\n const recipeStacks = (recipe.stacks && typeof recipe.stacks === 'object' && !Array.isArray(recipe.stacks))\n ? recipe.stacks\n : {};\n const mappableStacks = getSchemaOrgMappableStacks(recipeStacks);\n \n // Only include nutrition if the nutrition stack is schemaOrgMappable\n // (Currently nutrition@1 is NOT mappable, so this will be undefined)\n const hasMappableNutrition = mappableStacks.has('nutrition@1');\n const nutrition = hasMappableNutrition ? convertNutrition(recipe.nutrition) : undefined;\n\n // Convert time - vNext uses recipe.time (Time format)\n const timeData = convertTime(recipe.time);\n\n // Convert attribution if attribution stack is mappable (attribution@1 is mappable)\n const hasMappableAttribution = mappableStacks.has('attribution@1');\n const attributionData = hasMappableAttribution ? convertAuthor(recipe.source) : {};\n\n // Convert taxonomy if taxonomy stack is mappable (taxonomy@1 is mappable)\n const hasMappableTaxonomy = mappableStacks.has('taxonomy@1');\n const taxonomyData = hasMappableTaxonomy\n ? convertCategoryTags(recipe.category, recipe.tags)\n : {};\n\n const schemaOrgRecipe = cleanOutput({\n ...base,\n recipeIngredient: ingredients.length ? ingredients : undefined,\n recipeInstructions: instructions.length ? instructions : undefined,\n recipeYield: convertYield(recipe.yield),\n ...timeData,\n ...attributionData,\n ...taxonomyData,\n nutrition\n }) as SchemaOrgRecipe;\n\n return withCanonicalSchema(schemaOrgRecipe) as SchemaOrgRecipe;\n}\n\n// Legacy isStructuredTime removed - vNext uses Time format with DurationMinutes\n","import type { SchemaOrgRecipe } from '../types';\n\nconst RECIPE_TYPES = new Set([\n 'recipe',\n 'https://schema.org/recipe',\n 'http://schema.org/recipe'\n]);\n\nexport function isRecipeNode(value: unknown): value is SchemaOrgRecipe {\n if (!value || typeof value !== 'object') {\n return false;\n }\n\n const type = (value as Record<string, unknown>)['@type'];\n\n if (typeof type === 'string') {\n return RECIPE_TYPES.has(type.toLowerCase());\n }\n\n if (Array.isArray(type)) {\n return type.some(\n entry => typeof entry === 'string' && RECIPE_TYPES.has(entry.toLowerCase())\n );\n }\n\n return false;\n}\n\nexport function safeJsonParse<T = unknown>(content: string): T | null {\n try {\n return JSON.parse(content) as T;\n } catch {\n return null;\n }\n}\n\nexport function normalizeText(value: string | undefined | null): string | undefined {\n if (!value) return undefined;\n const trimmed = value.replace(/\\s+/g, ' ').trim();\n return trimmed || undefined;\n}\n","import type { ExtractionResult, SchemaOrgRecipe } from '../types';\nimport { isRecipeNode, safeJsonParse, normalizeText } from './utils';\n\ntype JsonLdPayload = Record<string, unknown> | Array<Record<string, unknown>>;\n\nconst SIMPLE_PROPS = ['name', 'description', 'image', 'recipeYield', 'prepTime', 'cookTime', 'totalTime'] as const;\n\nexport function extractRecipeBrowser(html: string): ExtractionResult {\n // Extract JSON-LD\n const jsonLdRecipe = extractJsonLdBrowser(html);\n if (jsonLdRecipe) {\n return { recipe: jsonLdRecipe, source: 'jsonld' };\n }\n\n // Extract Microdata\n const microdataRecipe = extractMicrodataBrowser(html);\n if (microdataRecipe) {\n return { recipe: microdataRecipe, source: 'microdata' };\n }\n\n return { recipe: null, source: null };\n}\n\nfunction extractJsonLdBrowser(html: string): SchemaOrgRecipe | null {\n if (typeof (globalThis as any).DOMParser === 'undefined') {\n return null;\n }\n\n const parser = new (globalThis as any).DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const scripts = doc.querySelectorAll('script[type=\"application/ld+json\"]');\n const candidates: SchemaOrgRecipe[] = [];\n\n scripts.forEach((script: Element) => {\n const content = script.textContent;\n if (!content) return;\n\n const parsed = safeJsonParse<JsonLdPayload>(content);\n if (!parsed) return;\n\n collectCandidates(parsed, candidates);\n });\n\n return candidates[0] ?? null;\n}\n\nfunction extractMicrodataBrowser(html: string): SchemaOrgRecipe | null {\n if (typeof (globalThis as any).DOMParser === 'undefined') {\n return null;\n }\n\n const parser = new (globalThis as any).DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n const recipeEl = doc.querySelector('[itemscope][itemtype*=\"schema.org/Recipe\"]');\n\n if (!recipeEl) {\n return null;\n }\n\n const recipe: SchemaOrgRecipe = {\n '@type': 'Recipe'\n };\n\n SIMPLE_PROPS.forEach(prop => {\n const value = findPropertyValue(recipeEl, prop);\n if (value) {\n recipe[prop] = value;\n }\n });\n\n const ingredients: string[] = [];\n recipeEl.querySelectorAll('[itemprop=\"recipeIngredient\"]').forEach((el: Element) => {\n const text = normalizeText(\n (el as any).getAttribute('content') || el.textContent || undefined\n );\n if (text) ingredients.push(text);\n });\n\n if (ingredients.length) {\n recipe.recipeIngredient = ingredients;\n }\n\n const instructions: string[] = [];\n recipeEl.querySelectorAll('[itemprop=\"recipeInstructions\"]').forEach((el: Element) => {\n const text =\n normalizeText((el as any).getAttribute('content')) ||\n normalizeText(el.querySelector('[itemprop=\"text\"]')?.textContent || undefined) ||\n normalizeText(el.textContent || undefined);\n if (text) instructions.push(text);\n });\n\n if (instructions.length) {\n recipe.recipeInstructions = instructions;\n }\n\n if (recipe.name || ingredients.length) {\n return recipe;\n }\n\n return null;\n}\n\nfunction findPropertyValue(context: Element, prop: string): string | undefined {\n const node = context.querySelector(`[itemprop=\"${prop}\"]`);\n if (!node) return undefined;\n\n return (\n normalizeText((node as any).getAttribute('content')) ||\n normalizeText((node as any).getAttribute('href')) ||\n normalizeText((node as any).getAttribute('src')) ||\n normalizeText(node.textContent || undefined)\n );\n}\n\nfunction collectCandidates(payload: unknown, bucket: SchemaOrgRecipe[]) {\n if (!payload) return;\n\n if (Array.isArray(payload)) {\n payload.forEach(entry => collectCandidates(entry, bucket));\n return;\n }\n\n if (typeof payload !== 'object') {\n return;\n }\n\n if (isRecipeNode(payload)) {\n bucket.push(payload);\n return;\n }\n\n const graph = (payload as Record<string, unknown>)['@graph'];\n if (Array.isArray(graph)) {\n graph.forEach(entry => collectCandidates(entry, bucket));\n }\n}\n\n","import { fromSchemaOrg } from '../fromSchemaOrg';\nimport type { Recipe } from '../types';\nimport type { SchemaOrgRecipe } from './types';\nimport { extractRecipeBrowser } from './extractors/browser';\n\nexport function extractSchemaOrgRecipeFromHTML(html: string): SchemaOrgRecipe | null {\n const { recipe } = extractRecipeBrowser(html);\n return recipe;\n}\n\nexport function extractRecipeFromHTML(html: string): Recipe {\n const recipe = extractSchemaOrgRecipeFromHTML(html);\n\n if (!recipe) {\n throw new Error('No Schema.org recipe data found in HTML');\n }\n\n const soustackRecipe = fromSchemaOrg(recipe);\n\n if (!soustackRecipe) {\n throw new Error('Schema.org data did not include a valid recipe');\n }\n\n return soustackRecipe;\n}\n","export type UnitDimension = 'mass' | 'volume' | 'count';\n\nexport type MassUnit = 'g' | 'kg' | 'oz' | 'lb';\nexport type VolumeUnit =\n | 'ml'\n | 'l'\n | 'tsp'\n | 'tbsp'\n | 'fl_oz'\n | 'cup'\n | 'pint'\n | 'quart'\n | 'gallon';\nexport type CountUnit = 'clove' | 'sprig' | 'leaf' | 'pinch' | 'bottle' | 'count';\n\nexport type Unit = MassUnit | VolumeUnit | CountUnit;\n\nexport type MetricMassUnit = 'g' | 'kg';\nexport type MetricVolumeUnit = 'ml' | 'l';\nexport type MetricCountUnit = 'count';\nexport type MetricUnit = MetricMassUnit | MetricVolumeUnit | MetricCountUnit;\n\nexport interface UnitDefinition {\n dimension: UnitDimension;\n /**\n * Multiplier that converts from the unit into metric base units (g or ml).\n */\n toMetricBase: number;\n metricBaseUnit: MetricUnit;\n isMetric: boolean;\n}\n\nconst MASS_UNITS: Record<MassUnit, UnitDefinition> = {\n g: {\n dimension: 'mass',\n toMetricBase: 1,\n metricBaseUnit: 'g',\n isMetric: true\n },\n kg: {\n dimension: 'mass',\n toMetricBase: 1000,\n metricBaseUnit: 'g',\n isMetric: true\n },\n oz: {\n dimension: 'mass',\n toMetricBase: 28.349523125,\n metricBaseUnit: 'g',\n isMetric: false\n },\n lb: {\n dimension: 'mass',\n toMetricBase: 453.59237,\n metricBaseUnit: 'g',\n isMetric: false\n }\n};\n\nconst VOLUME_UNITS: Record<VolumeUnit, UnitDefinition> = {\n ml: {\n dimension: 'volume',\n toMetricBase: 1,\n metricBaseUnit: 'ml',\n isMetric: true\n },\n l: {\n dimension: 'volume',\n toMetricBase: 1000,\n metricBaseUnit: 'ml',\n isMetric: true\n },\n tsp: {\n dimension: 'volume',\n toMetricBase: 4.92892159375,\n metricBaseUnit: 'ml',\n isMetric: false\n },\n tbsp: {\n dimension: 'volume',\n toMetricBase: 14.78676478125,\n metricBaseUnit: 'ml',\n isMetric: false\n },\n fl_oz: {\n dimension: 'volume',\n toMetricBase: 29.5735295625,\n metricBaseUnit: 'ml',\n isMetric: false\n },\n cup: {\n dimension: 'volume',\n toMetricBase: 236.5882365,\n metricBaseUnit: 'ml',\n isMetric: false\n },\n pint: {\n dimension: 'volume',\n toMetricBase: 473.176473,\n metricBaseUnit: 'ml',\n isMetric: false\n },\n quart: {\n dimension: 'volume',\n toMetricBase: 946.352946,\n metricBaseUnit: 'ml',\n isMetric: false\n },\n gallon: {\n dimension: 'volume',\n toMetricBase: 3785.411784,\n metricBaseUnit: 'ml',\n isMetric: false\n }\n};\n\nconst COUNT_UNITS: Record<CountUnit, UnitDefinition> = {\n clove: {\n dimension: 'count',\n toMetricBase: 1,\n metricBaseUnit: 'count',\n isMetric: true\n },\n sprig: {\n dimension: 'count',\n toMetricBase: 1,\n metricBaseUnit: 'count',\n isMetric: true\n },\n leaf: {\n dimension: 'count',\n toMetricBase: 1,\n metricBaseUnit: 'count',\n isMetric: true\n },\n pinch: {\n dimension: 'count',\n toMetricBase: 1,\n metricBaseUnit: 'count',\n isMetric: true\n },\n bottle: {\n dimension: 'count',\n toMetricBase: 1,\n metricBaseUnit: 'count',\n isMetric: true\n },\n count: {\n dimension: 'count',\n toMetricBase: 1,\n metricBaseUnit: 'count',\n isMetric: true\n }\n};\n\nexport const UNIT_DEFINITIONS: Record<Unit, UnitDefinition> = {\n ...MASS_UNITS,\n ...VOLUME_UNITS,\n ...COUNT_UNITS\n};\n\nexport type NormalizedUnit = keyof typeof UNIT_DEFINITIONS;\n\nexport function normalizeUnitToken(\n unit?: string | null\n): NormalizedUnit | null {\n if (!unit) {\n return null;\n }\n\n const token = unit.trim().toLowerCase().replace(/[\\s-]+/g, '_');\n const canonical = UNIT_SYNONYMS[token] ?? token;\n\n return (canonical as NormalizedUnit) in UNIT_DEFINITIONS\n ? (canonical as NormalizedUnit)\n : null;\n}\n\nconst UNIT_SYNONYMS: Partial<Record<string, NormalizedUnit>> = {\n teaspoons: 'tsp',\n teaspoon: 'tsp',\n tsps: 'tsp',\n tbsp: 'tbsp',\n tbsps: 'tbsp',\n tablespoon: 'tbsp',\n tablespoons: 'tbsp',\n cup: 'cup',\n cups: 'cup',\n pint: 'pint',\n pints: 'pint',\n quart: 'quart',\n quarts: 'quart',\n gallon: 'gallon',\n gallons: 'gallon',\n ml: 'ml',\n milliliter: 'ml',\n milliliters: 'ml',\n millilitre: 'ml',\n millilitres: 'ml',\n l: 'l',\n liter: 'l',\n liters: 'l',\n litre: 'l',\n litres: 'l',\n fl_oz: 'fl_oz',\n 'fl.oz': 'fl_oz',\n 'fl.oz.': 'fl_oz',\n 'fl_oz.': 'fl_oz',\n 'fl oz': 'fl_oz',\n 'fl oz.': 'fl_oz',\n fluid_ounce: 'fl_oz',\n fluid_ounces: 'fl_oz',\n oz: 'oz',\n ounce: 'oz',\n ounces: 'oz',\n lb: 'lb',\n lbs: 'lb',\n pound: 'lb',\n pounds: 'lb',\n g: 'g',\n gram: 'g',\n grams: 'g',\n kg: 'kg',\n kilogram: 'kg',\n kilograms: 'kg',\n clove: 'clove',\n cloves: 'clove',\n sprig: 'sprig',\n sprigs: 'sprig',\n leaf: 'leaf',\n leaves: 'leaf',\n pinch: 'pinch',\n pinches: 'pinch',\n bottle: 'bottle',\n bottles: 'bottle',\n count: 'count',\n counts: 'count'\n};\n\nexport function convertToMetricBase(\n quantity: number,\n unit: Unit\n): {\n quantity: number;\n baseUnit: MetricUnit;\n definition: UnitDefinition;\n} {\n const definition = UNIT_DEFINITIONS[unit];\n const quantityInMetricBase = quantity * definition.toMetricBase;\n return {\n quantity: quantityInMetricBase,\n baseUnit: definition.metricBaseUnit,\n definition\n };\n}\n","import {\n MetricMassUnit,\n MetricVolumeUnit,\n NormalizedUnit,\n convertToMetricBase,\n normalizeUnitToken,\n UNIT_DEFINITIONS\n} from './units';\n\nexport type ConvertTarget = 'metric';\nexport type ConvertMode = 'volume' | 'mass';\nexport type RoundMode = 'none' | 'sane';\n\nexport interface LineItem {\n ingredient: string;\n quantity: number;\n unit: string | null;\n}\n\nexport interface ConvertedLineItem extends LineItem {\n notes?: string;\n}\n\nexport class UnknownUnitError extends Error {\n constructor(public readonly unit: string) {\n super(`Unknown unit \"${unit}\".`);\n this.name = 'UnknownUnitError';\n }\n}\n\nexport class UnsupportedConversionError extends Error {\n constructor(\n public readonly unit: string,\n public readonly mode: ConvertMode\n ) {\n super(`Cannot convert unit \"${unit}\" in ${mode} mode.`);\n this.name = 'UnsupportedConversionError';\n }\n}\n\nexport class MissingEquivalencyError extends Error {\n constructor(\n public readonly ingredient: string,\n public readonly unit: string\n ) {\n super(\n `No volume to mass equivalency for \"${ingredient}\" (${unit}).`\n );\n this.name = 'MissingEquivalencyError';\n }\n}\n\ntype EquivalencyMap = Record<\n string,\n Partial<Record<NormalizedUnit, number>>\n>;\n\nconst VOLUME_TO_MASS_EQUIV_G_PER_UNIT: EquivalencyMap = {\n flour: {\n cup: 120\n }\n};\n\nconst DEFAULT_ROUND_MODE: RoundMode = 'sane';\n\nexport function convertLineItemToMetric(\n item: LineItem,\n mode: ConvertMode,\n opts?: { round?: RoundMode }\n): ConvertedLineItem {\n const roundMode = opts?.round ?? DEFAULT_ROUND_MODE;\n const normalizedUnit = normalizeUnitToken(item.unit);\n\n if (!normalizedUnit) {\n if (!item.unit || item.unit.trim() === '') {\n return item;\n }\n\n throw new UnknownUnitError(item.unit);\n }\n\n const definition = UNIT_DEFINITIONS[normalizedUnit];\n\n if (definition.dimension === 'count') {\n return item;\n }\n\n if (mode === 'volume') {\n if (definition.dimension !== 'volume') {\n throw new UnsupportedConversionError(item.unit ?? '', mode);\n }\n\n const { quantity, unit } = finalizeMetricVolume(\n convertToMetricBase(item.quantity, normalizedUnit).quantity,\n roundMode\n );\n\n return {\n ...item,\n quantity,\n unit\n };\n }\n\n // mode === 'mass'\n if (definition.dimension === 'mass') {\n const { quantity, unit } = finalizeMetricMass(\n convertToMetricBase(item.quantity, normalizedUnit).quantity,\n roundMode\n );\n\n return {\n ...item,\n quantity,\n unit\n };\n }\n\n if (definition.dimension !== 'volume') {\n throw new UnsupportedConversionError(item.unit ?? '', mode);\n }\n\n const gramsPerUnit = lookupEquivalency(\n item.ingredient,\n normalizedUnit\n );\n\n if (!gramsPerUnit) {\n throw new MissingEquivalencyError(item.ingredient, item.unit ?? '');\n }\n\n const grams = item.quantity * gramsPerUnit;\n const massResult = finalizeMetricMass(grams, roundMode);\n\n return {\n ...item,\n quantity: massResult.quantity,\n unit: massResult.unit,\n notes: `Converted using ${gramsPerUnit}g per ${normalizedUnit} for ${item.ingredient}.`\n };\n}\n\nfunction finalizeMetricVolume(\n milliliters: number,\n roundMode: RoundMode\n): { quantity: number; unit: MetricVolumeUnit } {\n if (roundMode === 'none') {\n return milliliters >= 1000\n ? { quantity: milliliters / 1000, unit: 'l' }\n : { quantity: milliliters, unit: 'ml' };\n }\n\n const roundedMl = roundMilliliters(milliliters);\n\n if (roundedMl >= 1000) {\n const liters = roundedMl / 1000;\n return {\n quantity: roundLargeMetric(liters),\n unit: 'l'\n };\n }\n\n return { quantity: roundedMl, unit: 'ml' };\n}\n\nfunction finalizeMetricMass(\n grams: number,\n roundMode: RoundMode\n): { quantity: number; unit: MetricMassUnit } {\n if (roundMode === 'none') {\n return grams >= 1000\n ? { quantity: grams / 1000, unit: 'kg' }\n : { quantity: grams, unit: 'g' };\n }\n\n const roundedGrams = roundGrams(grams);\n\n if (roundedGrams >= 1000) {\n const kilograms = roundedGrams / 1000;\n return {\n quantity: roundLargeMetric(kilograms),\n unit: 'kg'\n };\n }\n\n return { quantity: roundedGrams, unit: 'g' };\n}\n\nfunction roundGrams(value: number): number {\n if (value < 1000) {\n return Math.round(value);\n }\n\n return Math.round(value / 5) * 5;\n}\n\nfunction roundMilliliters(value: number): number {\n if (value < 1000) {\n return Math.round(value);\n }\n\n return Math.round(value / 10) * 10;\n}\n\nfunction roundLargeMetric(value: number): number {\n return Math.round(value * 100) / 100;\n}\n\nfunction lookupEquivalency(\n ingredient: string,\n unit: NormalizedUnit\n): number | undefined {\n const key = ingredient.trim().toLowerCase();\n return VOLUME_TO_MASS_EQUIV_G_PER_UNIT[key]?.[unit];\n}\n","export interface Quantity {\n amount: number;\n unit?: string | null;\n}\n\nexport interface Ingredient {\n id?: string;\n item: string;\n quantity?: Quantity;\n name?: string;\n prep?: string;\n prepAction?: string;\n prepActions?: string[];\n form?: string;\n prepTime?: number;\n optional?: boolean;\n notes?: string;\n}\n\nexport interface MiseEnPlaceTask {\n category: 'prep' | 'state' | 'measure' | 'other';\n action?: string;\n form?: string;\n items: Array<{\n ingredient: string;\n quantity?: Quantity;\n optional?: boolean;\n notes?: string;\n }>;\n}\n\nexport interface MiseEnPlacePlan {\n tasks: MiseEnPlaceTask[];\n ungrouped: Ingredient[];\n}\n\nexport function miseEnPlace(ingredients: Ingredient[]): MiseEnPlacePlan {\n const list = Array.isArray(ingredients) ? ingredients : [];\n\n const prepGroups = new Map<string, MiseEnPlaceTask>();\n const stateGroups = new Map<string, MiseEnPlaceTask>();\n let measureTask: MiseEnPlaceTask | undefined;\n let otherTask: MiseEnPlaceTask | undefined;\n const ungrouped: Ingredient[] = [];\n\n for (const ingredient of list) {\n if (!ingredient || typeof ingredient !== 'object') continue;\n\n const label = deriveIngredientLabel(ingredient);\n const quantity = normalizeQuantity(ingredient.quantity);\n const baseNotes = toDisplayString(ingredient.notes);\n const prepNotes = toDisplayString(ingredient.prep);\n const isOptional = typeof ingredient.optional === 'boolean' ? ingredient.optional : undefined;\n\n const buildItem = (extraNotes?: string) => {\n const item: MiseEnPlaceTask['items'][number] = {\n ingredient: label\n };\n\n if (quantity) {\n item.quantity = { ...quantity };\n }\n\n if (typeof isOptional === 'boolean') {\n item.optional = isOptional;\n }\n\n const notes = combineNotes(extraNotes, baseNotes);\n if (notes) {\n item.notes = notes;\n }\n\n return item;\n };\n\n let addedToTask = false;\n let hasPrepGrouping = false;\n\n const prepActionKeys = extractNormalizedList(ingredient.prepActions);\n if (prepActionKeys.length > 0) {\n hasPrepGrouping = true;\n for (const actionKey of prepActionKeys) {\n const task = ensureGroup(prepGroups, actionKey, () => ({\n category: 'prep',\n action: actionKey,\n items: []\n }));\n task.items.push(buildItem());\n addedToTask = true;\n }\n } else {\n const singleActionKey = normalizeKey(ingredient.prepAction);\n if (singleActionKey) {\n hasPrepGrouping = true;\n const task = ensureGroup(prepGroups, singleActionKey, () => ({\n category: 'prep',\n action: singleActionKey,\n items: []\n }));\n task.items.push(buildItem());\n addedToTask = true;\n } else if (prepNotes) {\n otherTask = otherTask ?? { category: 'other', items: [] };\n otherTask.items.push(buildItem(prepNotes));\n addedToTask = true;\n }\n }\n\n const formKey = normalizeKey(ingredient.form);\n const hasStateGrouping = Boolean(formKey);\n if (formKey) {\n const task = ensureGroup(stateGroups, formKey, () => ({\n category: 'state',\n form: formKey,\n items: []\n }));\n task.items.push(buildItem());\n addedToTask = true;\n }\n\n const shouldMeasure = Boolean(quantity) && !hasPrepGrouping && !hasStateGrouping;\n if (shouldMeasure) {\n measureTask = measureTask ?? { category: 'measure', items: [] };\n measureTask.items.push(buildItem());\n addedToTask = true;\n }\n\n if (!addedToTask) {\n ungrouped.push(ingredient);\n }\n }\n\n const tasks: MiseEnPlaceTask[] = [\n ...Array.from(prepGroups.values()).sort((a, b) => localeCompare(a.action, b.action)),\n ...Array.from(stateGroups.values()).sort((a, b) => localeCompare(a.form, b.form))\n ];\n\n if (measureTask) {\n tasks.push(measureTask);\n }\n\n if (otherTask) {\n tasks.push(otherTask);\n }\n\n return { tasks, ungrouped };\n}\n\nfunction deriveIngredientLabel(ingredient: Ingredient): string {\n return (\n toDisplayString(ingredient.name) ??\n toDisplayString(ingredient.item) ??\n toDisplayString(ingredient.id) ??\n 'ingredient'\n );\n}\n\nfunction extractNormalizedList(values?: string[]): string[] {\n if (!Array.isArray(values)) {\n return [];\n }\n const seen = new Set<string>();\n const result: string[] = [];\n for (const value of values) {\n const key = normalizeKey(value);\n if (key && !seen.has(key)) {\n seen.add(key);\n result.push(key);\n }\n }\n return result;\n}\n\nfunction normalizeKey(value?: string | null): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n const trimmed = value.trim().toLowerCase();\n return trimmed || null;\n}\n\nfunction toDisplayString(value?: string | null): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed || undefined;\n}\n\nfunction combineNotes(...notes: Array<string | undefined>): string | undefined {\n const cleaned = notes.map((note) => toDisplayString(note ?? undefined)).filter(Boolean) as string[];\n if (cleaned.length === 0) {\n return undefined;\n }\n return cleaned.join(' | ');\n}\n\nfunction normalizeQuantity(quantity?: Quantity | null): Quantity | undefined {\n if (!quantity || typeof quantity !== 'object') {\n return undefined;\n }\n const amount = (quantity as Quantity).amount;\n if (typeof amount !== 'number' || Number.isNaN(amount)) {\n return undefined;\n }\n const normalized: Quantity = { amount };\n if ('unit' in quantity) {\n const unit = (quantity as Quantity).unit;\n if (typeof unit === 'string') {\n const trimmed = unit.trim();\n if (trimmed) {\n normalized.unit = trimmed;\n }\n } else if (unit === null) {\n normalized.unit = null;\n }\n }\n return normalized;\n}\n\nfunction ensureGroup(\n map: Map<string, MiseEnPlaceTask>,\n key: string,\n factory: () => MiseEnPlaceTask\n): MiseEnPlaceTask {\n let task = map.get(key);\n if (!task) {\n task = factory();\n map.set(key, task);\n }\n return task;\n}\n\nfunction localeCompare(left?: string, right?: string): number {\n return (left ?? '').localeCompare(right ?? '');\n}\n"]}
|