soustack 0.2.3 → 0.4.0
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 +128 -18
- package/dist/cli/index.js +1706 -665
- package/dist/cli/index.js.map +1 -1
- package/dist/index.d.mts +172 -28
- package/dist/index.d.ts +172 -28
- package/dist/index.js +2028 -662
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2022 -662
- package/dist/index.mjs.map +1 -1
- package/dist/{scrape.d.mts → scrape/index.d.mts} +38 -10
- package/dist/{scrape.d.ts → scrape/index.d.ts} +38 -10
- package/dist/{scrape.js → scrape/index.js} +268 -62
- package/dist/scrape/index.js.map +1 -0
- package/dist/{scrape.mjs → scrape/index.mjs} +268 -62
- package/dist/scrape/index.mjs.map +1 -0
- package/package.json +15 -9
- package/src/profiles/base.schema.json +2 -2
- package/src/profiles/cookable.schema.json +4 -4
- package/src/profiles/illustrated.schema.json +4 -4
- package/src/profiles/quantified.schema.json +4 -4
- package/src/profiles/scalable.schema.json +6 -6
- package/src/profiles/schedulable.schema.json +4 -4
- package/src/schema.json +15 -3
- package/src/soustack.schema.json +15 -3
- package/dist/scrape.js.map +0 -1
- package/dist/scrape.mjs.map +0 -1
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/parsers/duration.ts","../../src/parser.ts","../../src/converters/yield.ts","../../src/utils/image.ts","../../src/fromSchemaOrg.ts","../../src/converters/toSchemaOrg.ts","../../src/scraper/fetch.ts","../../src/scraper/extractors/utils.ts","../../src/scraper/extractors/jsonld.ts","../../src/scraper/extractors/microdata.ts","../../src/scraper/extractors/browser.ts","../../src/scraper/extractors/index.ts","../../src/scraper/index.ts","../../src/schema.json","../../src/soustack.schema.json","../../src/profiles/base.schema.json","../../src/profiles/cookable.schema.json","../../src/profiles/quantified.schema.json","../../src/profiles/illustrated.schema.json","../../src/profiles/schedulable.schema.json","../../src/validator.ts","../../bin/cli.ts"],"names":["convertIngredients","value","convertInstructions","trimmed","convertTime","result","resolve","isBrowser","load","SIMPLE_PROPS","collectCandidates","findPropertyValue","Ajv","addFormats","path","globSync","fs"],"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 { 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 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} from './types/schemaOrg';\nimport { normalizeImage } from './utils/image';\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 nutrition =\n recipeNode.nutrition && typeof recipeNode.nutrition === 'object'\n ? recipeNode.nutrition\n : undefined;\n\n return {\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 dateModified: recipeNode.dateModified || undefined,\n yield: recipeYield,\n time,\n ingredients,\n instructions,\n nutrition\n };\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}","import {\n IngredientItem,\n Instruction,\n InstructionItem,\n Recipe,\n StructuredTime,\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';\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 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 return {\n ...nutrition,\n '@type': 'NutritionInformation'\n };\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\nexport function toSchemaOrg(recipe: Recipe): SchemaOrgRecipe {\n const base = convertBasicMetadata(recipe);\n const ingredients = convertIngredients(recipe.ingredients);\n const instructions = convertInstructions(recipe.instructions);\n const nutrition = convertNutrition(recipe.nutrition);\n\n return cleanOutput({\n ...base,\n recipeIngredient: ingredients.length ? ingredients : undefined,\n recipeInstructions: instructions.length ? instructions : undefined,\n recipeYield: convertYield(recipe.yield),\n ...convertTime(recipe.time),\n ...convertAuthor(recipe.source),\n ...convertCategoryTags(recipe.category, recipe.tags),\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 { FetchImplementation, FetchOptions, FetchRequestInit } from './types';\n\nconst DEFAULT_USER_AGENTS = [\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',\n 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0'\n];\n\nfunction chooseUserAgent(provided?: string): string {\n if (provided) return provided;\n const index = Math.floor(Math.random() * DEFAULT_USER_AGENTS.length);\n return DEFAULT_USER_AGENTS[index];\n}\n\nfunction resolveFetch(fetchFn?: FetchImplementation): FetchImplementation {\n if (fetchFn) {\n return fetchFn;\n }\n\n const globalFetch = (globalThis as { fetch?: FetchImplementation }).fetch;\n if (!globalFetch) {\n throw new Error(\n 'A global fetch implementation is not available. Provide window.fetch in browsers or upgrade to Node 18+.'\n );\n }\n\n return globalFetch;\n}\n\nfunction isBrowserEnvironment(): boolean {\n return typeof (globalThis as { document?: unknown }).document !== 'undefined';\n}\n\nfunction isClientError(error: Error & { status?: number }): boolean {\n if (typeof error.status === 'number') {\n return error.status >= 400 && error.status < 500;\n }\n return error.message.includes('HTTP 4');\n}\n\nasync function wait(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\nexport async function fetchPage(url: string, options: FetchOptions = {}): Promise<string> {\n const {\n timeout = 10_000,\n userAgent,\n maxRetries = 2,\n fetchFn\n } = options;\n\n let lastError: Error | null = null;\n const resolvedFetch = resolveFetch(fetchFn);\n const isBrowser = isBrowserEnvironment();\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const headers: Record<string, string> = {\n Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',\n 'Accept-Language': 'en-US,en;q=0.5'\n };\n\n if (!isBrowser) {\n headers['User-Agent'] = chooseUserAgent(userAgent);\n }\n\n const requestInit: FetchRequestInit = {\n headers,\n signal: controller.signal,\n redirect: 'follow'\n };\n\n const response = await resolvedFetch(url, requestInit);\n\n clearTimeout(timeoutId);\n // #region agent log\n if (response && typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') {\n try {\n const globalFetch = typeof globalThis !== 'undefined' && typeof globalThis.fetch !== 'undefined' ? globalThis.fetch : null;\n if (globalFetch) {\n globalFetch('http://127.0.0.1:7243/ingest/7225c3b5-9ac2-4c94-b561-807ca9003b66',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'scraper/fetch.ts:63',message:'fetch response',data:{url,status:response.status,statusText:response.statusText,ok:response.ok,isNYTimes:url.includes('nytimes.com')},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'B'})}).catch(()=>{});\n }\n } catch {}\n }\n // #endregion\n\n if (!response.ok) {\n const error: Error & { status?: number } = new Error(\n `HTTP ${response.status}: ${response.statusText}`\n );\n error.status = response.status;\n throw error;\n }\n\n const html = await response.text();\n // #region agent log\n if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') {\n try {\n const globalFetch = typeof globalThis !== 'undefined' && typeof globalThis.fetch !== 'undefined' ? globalThis.fetch : null;\n if (globalFetch) {\n globalFetch('http://127.0.0.1:7243/ingest/7225c3b5-9ac2-4c94-b561-807ca9003b66',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'scraper/fetch.ts:75',message:'HTML received',data:{htmlLength:html.length,hasLoginPage:html.toLowerCase().includes('login')||html.toLowerCase().includes('sign in'),hasRecipeData:html.includes('application/ld+json')||html.includes('schema.org/Recipe')},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'B,D'})}).catch(()=>{});\n }\n } catch {}\n }\n // #endregion\n return html;\n } catch (err) {\n clearTimeout(timeoutId);\n\n lastError = err instanceof Error ? err : new Error(String(err));\n\n if (isClientError(lastError)) {\n throw lastError;\n }\n\n if (attempt < maxRetries) {\n await wait(1000 * (attempt + 1));\n continue;\n }\n }\n }\n\n throw lastError ?? new Error('Failed to fetch page');\n}\n\nexport { FetchOptions };\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 // #region agent log\n fetch('http://127.0.0.1:7243/ingest/7225c3b5-9ac2-4c94-b561-807ca9003b66',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'scraper/extractors/utils.ts:14',message:'isRecipeNode check',data:{type,typeLower:typeof type==='string'?type.toLowerCase():Array.isArray(type)?type.map(t=>typeof t==='string'?t.toLowerCase():t):undefined,isMatch:typeof type==='string'?RECIPE_TYPES.has(type.toLowerCase()):Array.isArray(type)?type.some(e=>typeof e==='string'&&RECIPE_TYPES.has(e.toLowerCase())):false},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A'})}).catch(()=>{});\n // #endregion\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 { load } from 'cheerio';\nimport type { SchemaOrgRecipe } from '../types';\nimport { isRecipeNode, safeJsonParse } from './utils';\n\ntype JsonLdPayload = Record<string, unknown> | Array<Record<string, unknown>>;\n\nexport function extractJsonLd(html: string): SchemaOrgRecipe | null {\n const $ = load(html);\n const scripts = $('script[type=\"application/ld+json\"]');\n // #region agent log\n fetch('http://127.0.0.1:7243/ingest/7225c3b5-9ac2-4c94-b561-807ca9003b66',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'scraper/extractors/jsonld.ts:8',message:'JSON-LD scripts found',data:{scriptCount:scripts.length},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'C,D'})}).catch(()=>{});\n // #endregion\n const candidates: SchemaOrgRecipe[] = [];\n\n scripts.each((_, element) => {\n const content = $(element).html();\n if (!content) return;\n\n const parsed = safeJsonParse<JsonLdPayload>(content);\n if (!parsed) return;\n // #region agent log\n fetch('http://127.0.0.1:7243/ingest/7225c3b5-9ac2-4c94-b561-807ca9003b66',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'scraper/extractors/jsonld.ts:18',message:'JSON-LD parsed',data:{hasGraph:!!(parsed&&typeof parsed==='object'&&'@graph' in parsed),type:(parsed&&typeof parsed==='object'&&'@type' in parsed)?(parsed as any)['@type']:undefined},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A,C'})}).catch(()=>{});\n // #endregion\n\n collectCandidates(parsed, candidates);\n });\n // #region agent log\n fetch('http://127.0.0.1:7243/ingest/7225c3b5-9ac2-4c94-b561-807ca9003b66',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'scraper/extractors/jsonld.ts:22',message:'JSON-LD candidates',data:{candidateCount:candidates.length,candidateTypes:candidates.map(c=>c['@type'])},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A,C'})}).catch(()=>{});\n // #endregion\n\n return candidates[0] ?? null;\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","import { load, type CheerioAPI, type Cheerio } from 'cheerio';\nimport type { SchemaOrgRecipe } from '../types';\nimport { normalizeText } from './utils';\n\nconst SIMPLE_PROPS = [\n 'name',\n 'description',\n 'image',\n 'recipeYield',\n 'prepTime',\n 'cookTime',\n 'totalTime'\n] as const;\n\nexport function extractMicrodata(html: string): SchemaOrgRecipe | null {\n const $ = load(html);\n const recipeEl = $('[itemscope][itemtype*=\"schema.org/Recipe\"]').first();\n\n if (!recipeEl.length) {\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.find('[itemprop=\"recipeIngredient\"]').each((_, el) => {\n const text = normalizeText($(el).attr('content') || $(el).text());\n if (text) ingredients.push(text);\n });\n\n if (ingredients.length) {\n recipe.recipeIngredient = ingredients;\n }\n\n const instructions: string[] = [];\n recipeEl.find('[itemprop=\"recipeInstructions\"]').each((_, el) => {\n const text =\n normalizeText($(el).attr('content')) ||\n normalizeText($(el).find('[itemprop=\"text\"]').first().text()) ||\n normalizeText($(el).text());\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($: CheerioAPI, context: Cheerio<any>, prop: string): string | undefined {\n const node = context.find(`[itemprop=\"${prop}\"]`).first();\n if (!node.length) return undefined;\n\n return (\n normalizeText(node.attr('content')) ||\n normalizeText(node.attr('href')) ||\n normalizeText(node.attr('src')) ||\n normalizeText(node.text())\n );\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 type { ExtractionResult } from '../types';\nimport { extractJsonLd } from './jsonld';\nimport { extractMicrodata } from './microdata';\nimport { extractRecipeBrowser } from './browser';\n\nfunction isBrowser(): boolean {\n try {\n // Check if we're in a browser environment with DOMParser\n return typeof (globalThis as any).DOMParser !== 'undefined';\n } catch {\n return false;\n }\n}\n\nexport function extractRecipe(html: string): ExtractionResult {\n // Use browser-compatible extraction if DOMParser is available\n if (isBrowser()) {\n return extractRecipeBrowser(html);\n }\n \n // Fallback to cheerio-based extraction for Node.js\n const jsonLdRecipe = extractJsonLd(html);\n // #region agent log\n if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') {\n try {\n const globalFetch = typeof globalThis !== 'undefined' && typeof globalThis.fetch !== 'undefined' ? globalThis.fetch : null;\n if (globalFetch) {\n globalFetch('http://127.0.0.1:7243/ingest/7225c3b5-9ac2-4c94-b561-807ca9003b66',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'scraper/extractors/index.ts:6',message:'JSON-LD extraction result',data:{hasJsonLd:!!jsonLdRecipe},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'C,D'})}).catch(()=>{});\n }\n } catch {}\n }\n // #endregion\n if (jsonLdRecipe) {\n return { recipe: jsonLdRecipe, source: 'jsonld' };\n }\n\n const microdataRecipe = extractMicrodata(html);\n // #region agent log\n if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') {\n try {\n const globalFetch = typeof globalThis !== 'undefined' && typeof globalThis.fetch !== 'undefined' ? globalThis.fetch : null;\n if (globalFetch) {\n globalFetch('http://127.0.0.1:7243/ingest/7225c3b5-9ac2-4c94-b561-807ca9003b66',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'scraper/extractors/index.ts:12',message:'Microdata extraction result',data:{hasMicrodata:!!microdataRecipe},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'D'})}).catch(()=>{});\n }\n } catch {}\n }\n // #endregion\n if (microdataRecipe) {\n return { recipe: microdataRecipe, source: 'microdata' };\n }\n\n return { recipe: null, source: null };\n}\n","import { fromSchemaOrg } from '../fromSchemaOrg';\nimport type { Recipe } from '../types';\nimport { fetchPage } from './fetch';\nimport { extractRecipe } from './extractors';\nimport type { ScrapeRecipeOptions, SchemaOrgRecipe } from './types';\n\n/**\n * Scrapes a recipe from a URL (Node.js only).\n * \n * ⚠️ Not available in browser environments due to CORS restrictions.\n * For browser usage, fetch the HTML yourself and use extractRecipeFromHTML().\n * \n * @param url - The URL of the recipe page to scrape\n * @param options - Fetch options (timeout, userAgent, maxRetries)\n * @returns A Soustack recipe object\n * @throws Error if no recipe is found\n */\nexport async function scrapeRecipe(url: string, options: ScrapeRecipeOptions = {}): Promise<Recipe> {\n // #region agent log\n if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') {\n try {\n const globalFetch = typeof globalThis !== 'undefined' && typeof globalThis.fetch !== 'undefined' ? globalThis.fetch : null;\n if (globalFetch) {\n globalFetch('http://127.0.0.1:7243/ingest/7225c3b5-9ac2-4c94-b561-807ca9003b66',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'scraper/index.ts:7',message:'scrapeRecipe entry',data:{url,hasOptions:!!options},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A,B,C,D,E'})}).catch(()=>{});\n }\n } catch {}\n }\n // #endregion\n const html = await fetchPage(url, options);\n // #region agent log\n if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') {\n try {\n const globalFetch = typeof globalThis !== 'undefined' && typeof globalThis.fetch !== 'undefined' ? globalThis.fetch : null;\n if (globalFetch) {\n globalFetch('http://127.0.0.1:7243/ingest/7225c3b5-9ac2-4c94-b561-807ca9003b66',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'scraper/index.ts:9',message:'HTML fetched',data:{htmlLength:html?.length,htmlPreview:html?.substring(0,200)},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'B'})}).catch(()=>{});\n }\n } catch {}\n }\n // #endregion\n const { recipe } = extractRecipe(html);\n // #region agent log\n if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') {\n try {\n const globalFetch = typeof globalThis !== 'undefined' && typeof globalThis.fetch !== 'undefined' ? globalThis.fetch : null;\n if (globalFetch) {\n globalFetch('http://127.0.0.1:7243/ingest/7225c3b5-9ac2-4c94-b561-807ca9003b66',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'scraper/index.ts:11',message:'extractRecipe result',data:{hasRecipe:!!recipe,recipeType:recipe?.['@type'],recipeName:recipe?.name},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A,C,D'})}).catch(()=>{});\n }\n } catch {}\n }\n // #endregion\n\n if (!recipe) {\n throw new Error('No Schema.org recipe data found in page');\n }\n\n const soustackRecipe = fromSchemaOrg(recipe);\n // #region agent log\n if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') {\n try {\n const globalFetch = typeof globalThis !== 'undefined' && typeof globalThis.fetch !== 'undefined' ? globalThis.fetch : null;\n if (globalFetch) {\n globalFetch('http://127.0.0.1:7243/ingest/7225c3b5-9ac2-4c94-b561-807ca9003b66',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'scraper/index.ts:17',message:'fromSchemaOrg result',data:{hasSoustackRecipe:!!soustackRecipe,soustackRecipeName:soustackRecipe?.name},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A'})}).catch(()=>{});\n }\n } catch {}\n }\n // #endregion\n if (!soustackRecipe) {\n throw new Error('Schema.org data did not include a valid recipe');\n }\n\n return soustackRecipe;\n}\n\n/**\n * Extracts a recipe from HTML string (browser and Node.js compatible).\n * \n * This function works in both environments and doesn't require network access.\n * Perfect for browser usage where you fetch HTML yourself (with cookies/session).\n * \n * @example\n * ```ts\n * // In browser:\n * const response = await fetch('https://example.com/recipe');\n * const html = await response.text();\n * const recipe = extractRecipeFromHTML(html);\n * ```\n * \n * @param html - The HTML string containing Schema.org recipe data\n * @returns A Soustack recipe object\n * @throws Error if no recipe is found\n */\nexport function extractRecipeFromHTML(html: string): Recipe {\n const { recipe } = extractRecipe(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 if (!soustackRecipe) {\n throw new Error('Schema.org data did not include a valid recipe');\n }\n\n return soustackRecipe;\n}\n\n/**\n * Extract Schema.org recipe data from HTML string (browser-compatible).\n * \n * Returns the raw Schema.org recipe object, which can then be converted\n * to Soustack format using fromSchemaOrg(). This gives you access to the\n * original Schema.org data for inspection, debugging, or custom transformations.\n * \n * @param html - HTML string containing Schema.org recipe data\n * @returns Schema.org recipe object, or null if not found\n * \n * @example\n * ```ts\n * // In browser:\n * const response = await fetch('https://example.com/recipe');\n * const html = await response.text();\n * const schemaOrgRecipe = extractSchemaOrgRecipeFromHTML(html);\n * \n * if (schemaOrgRecipe) {\n * // Inspect or modify Schema.org data before converting\n * console.log('Found recipe:', schemaOrgRecipe.name);\n * \n * // Convert to Soustack format\n * const soustackRecipe = fromSchemaOrg(schemaOrgRecipe);\n * }\n * ```\n */\nexport function extractSchemaOrgRecipeFromHTML(html: string): SchemaOrgRecipe | null {\n const { recipe } = extractRecipe(html);\n return recipe;\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/v0.2.1\",\n \"title\": \"Soustack Recipe Schema v0.2.1\",\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\": { \"type\": [\"string\", \"null\"] }\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 \"prepTime\": { \"type\": \"number\" },\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/v0.2.1\",\n \"title\": \"Soustack Recipe Schema v0.2.1\",\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\": { \"type\": [\"string\", \"null\"] }\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 \"prepTime\": { \"type\": \"number\" },\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/v0.2.1/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.2.1\" }\n ]\n}\n","{\n \"$schema\": \"http://json-schema.org/draft-07/schema#\",\n \"$id\": \"http://soustack.org/schema/v0.2.1/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.2.1\" },\n {\n \"required\": [\"yield\", \"time\", \"ingredients\", \"instructions\"],\n \"properties\": {\n \"yield\": { \"$ref\": \"http://soustack.org/schema/v0.2.1#/definitions/yield\" },\n \"time\": { \"$ref\": \"http://soustack.org/schema/v0.2.1#/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.2.1/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.2.1\" },\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.2.1#/definitions/ingredient\" },\n { \"required\": [\"item\", \"quantity\"] }\n ]\n },\n \"quantifiedIngredientSubsection\": {\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.2.1#/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.2.1/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.2.1\" },\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.2.1#/definitions/instruction\" },\n { \"required\": [\"image\"] }\n ]\n },\n \"instructionSubsectionWithImage\": {\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.2.1#/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.2.1/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.2.1\" },\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.2.1#/definitions/instruction\" },\n { \"required\": [\"id\", \"timing\"] }\n ]\n },\n \"schedulableInstructionSubsection\": {\n \"allOf\": [\n { \"$ref\": \"http://soustack.org/schema/v0.2.1#/definitions/instructionSubsection\" },\n {\n \"properties\": {\n \"items\": {\n \"type\": \"array\",\n \"items\": { \"$ref\": \"#/definitions/schedulableInstruction\" }\n }\n }\n }\n ]\n }\n }\n}\n","import Ajv, { ErrorObject, ValidateFunction } from \"ajv\";\nimport addFormats from \"ajv-formats\";\nimport baseSchema from \"./schema.json\";\nimport soustackSchema from \"./soustack.schema.json\";\nimport baseProfileSchema from \"./profiles/base.schema.json\";\nimport cookableProfileSchema from \"./profiles/cookable.schema.json\";\nimport quantifiedProfileSchema from \"./profiles/quantified.schema.json\";\nimport illustratedProfileSchema from \"./profiles/illustrated.schema.json\";\nimport schedulableProfileSchema from \"./profiles/schedulable.schema.json\";\nimport { Recipe } from \"./types\";\nimport { parseDuration } from \"./parsers/duration\";\n\ntype ProfileName =\n | \"base\"\n | \"cookable\"\n | \"scalable\"\n | \"quantified\"\n | \"illustrated\"\n | \"schedulable\";\n\nexport interface NormalizedError {\n path: string;\n message: string;\n keyword?: string;\n}\n\nexport interface NormalizedWarning {\n path: string;\n message: string;\n}\n\nexport interface ValidateOptions {\n profile?: ProfileName;\n schema?: string;\n collectAllErrors?: boolean;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: NormalizedError[];\n warnings: NormalizedWarning[];\n normalized?: Recipe;\n}\n\ninterface ValidationContext {\n ajv: Ajv;\n validators: Partial<Record<ProfileName, ValidateFunction>>;\n}\n\nconst profileSchemas: Partial<Record<ProfileName, any>> = {\n base: baseProfileSchema,\n cookable: cookableProfileSchema,\n scalable: baseProfileSchema,\n quantified: quantifiedProfileSchema,\n illustrated: illustratedProfileSchema,\n schedulable: schedulableProfileSchema,\n};\n\nconst validationContexts: Map<boolean, ValidationContext> = new Map();\n\nfunction createContext(collectAllErrors: boolean): ValidationContext {\n const ajv = new Ajv({ strict: false, allErrors: collectAllErrors });\n addFormats(ajv);\n\n const loadedIds = new Set<string>();\n const addSchemaIfNew = (schema: any) => {\n if (!schema) return;\n const schemaId = (schema as any)?.$id;\n if (schemaId && loadedIds.has(schemaId)) return;\n ajv.addSchema(schema);\n if (schemaId) loadedIds.add(schemaId);\n };\n\n addSchemaIfNew(baseSchema);\n addSchemaIfNew(soustackSchema);\n Object.values(profileSchemas).forEach(addSchemaIfNew);\n\n return { ajv, validators: {} };\n}\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 detectProfileFromSchema(schemaRef?: string): ProfileName | undefined {\n if (!schemaRef) return undefined;\n const match = schemaRef.match(/\\/profiles\\/([a-z]+)\\.schema\\.json$/i);\n if (match) {\n const profile = match[1].toLowerCase() as ProfileName;\n if (profile in profileSchemas) return profile;\n }\n return undefined;\n}\n\nfunction getValidator(profile: ProfileName, context: ValidationContext): ValidateFunction {\n if (!profileSchemas[profile]) {\n throw new Error(`Unknown Soustack profile: ${profile}`);\n }\n\n if (!context.validators[profile]) {\n context.validators[profile] = context.ajv.compile(profileSchemas[profile]!);\n }\n return context.validators[profile]!;\n}\n\nfunction normalizeRecipe(recipe: Recipe): { normalized: Recipe; warnings: NormalizedWarning[] } {\n const normalized = cloneRecipe(recipe);\n const warnings: NormalizedWarning[] = [];\n\n normalizeTime(normalized);\n\n if (\n normalized &&\n typeof normalized === \"object\" &&\n \"version\" in normalized &&\n !(normalized as any).recipeVersion &&\n typeof (normalized as any).version === \"string\"\n ) {\n (normalized as any).recipeVersion = (normalized as any).version;\n warnings.push({ path: \"/version\", message: \"'version' is deprecated; mapped to 'recipeVersion'.\" });\n }\n\n return { normalized, warnings };\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\nconst allowedTopLevelProps = new Set<string>([\n ...Object.keys((soustackSchema as any)?.properties ?? {}),\n \"metadata\",\n \"$schema\",\n]);\n\nfunction detectUnknownTopLevelKeys(recipe: any): NormalizedError[] {\n if (!recipe || typeof recipe !== \"object\") return [];\n const disallowedKeys = Object.keys(recipe).filter(\n (key) => !allowedTopLevelProps.has(key) && !key.startsWith(\"x-\"),\n );\n\n return disallowedKeys.map((key) => ({\n path: `/${key}`,\n keyword: \"additionalProperties\",\n message: `Unknown top-level property '${key}' is not allowed by the Soustack spec`,\n }));\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 runAjvValidation(\n data: any,\n profile: ProfileName,\n context: ValidationContext,\n schemaRef?: string,\n): NormalizedError[] {\n const validator = schemaRef ? context.ajv.getSchema(schemaRef) : undefined;\n const validateFn = (validator as ValidateFunction | undefined) ?? getValidator(profile, context);\n\n const isValid = validateFn(data);\n return !isValid && validateFn.errors ? validateFn.errors.map(formatAjvError) : [];\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\nexport function validateRecipe(input: any, options: ValidateOptions = {}): ValidationResult {\n const collectAllErrors = options.collectAllErrors ?? true;\n const context = getContext(collectAllErrors);\n const schemaRef = options.schema ?? (typeof input?.$schema === \"string\" ? input.$schema : undefined);\n const profile: ProfileName =\n options.profile ?? detectProfileFromSchema(schemaRef) ?? \"base\";\n\n const { normalized, warnings } = normalizeRecipe(input as Recipe);\n\n const unknownKeyErrors = detectUnknownTopLevelKeys(normalized);\n const validationErrors = runAjvValidation(normalized, profile, context, schemaRef);\n const graphErrors =\n profile === \"schedulable\" && validationErrors.length === 0 ? checkInstructionGraph(normalized) : [];\n const errors = [...unknownKeyErrors, ...validationErrors, ...graphErrors];\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n normalized: errors.length === 0 ? normalized : undefined,\n };\n}\n\nexport function validateRecipeWithProfile(data: any, profile: ProfileName): data is Recipe {\n return validateRecipe(data, { profile }).valid;\n}\n\nexport function detectProfiles(recipe: any): ProfileName[] {\n const result = validateRecipe(recipe, { profile: \"base\", collectAllErrors: false });\n if (!result.valid) return [];\n\n const normalizedRecipe = result.normalized ?? recipe;\n const profiles: ProfileName[] = [\"base\"];\n const context = getContext(false);\n\n (Object.keys(profileSchemas) as ProfileName[]).forEach((profile) => {\n if (profile === \"base\") return;\n if (!profileSchemas[profile]) return;\n const errors = runAjvValidation(normalizedRecipe, profile, context);\n if (errors.length === 0) {\n profiles.push(profile);\n }\n });\n\n return profiles;\n}\n","import * as fs from 'fs';\nimport * as path from 'path';\nimport { globSync } from 'glob';\nimport { scaleRecipe } from '../src/parser';\nimport { fromSchemaOrg } from '../src/fromSchemaOrg';\nimport { toSchemaOrg } from '../src/toSchemaOrg';\nimport { scrapeRecipe } from '../src/scraper/index';\nimport {\n validateRecipe,\n type NormalizedError,\n type NormalizedWarning,\n type ValidateOptions,\n} from '../src/validator';\n\ninterface ValidationOutcome {\n file: string;\n profile?: ProfileName;\n valid: boolean;\n warnings: NormalizedWarning[];\n errors: NormalizedError[];\n}\n\ninterface ValidationFlags {\n profile?: ProfileName;\n strict: boolean;\n json: boolean;\n}\n\ninterface ValidationSummary {\n strict: boolean;\n total: number;\n passed: number;\n failed: number;\n}\n\ntype ConvertDirection = 'schemaorg-to-soustack' | 'soustack-to-schemaorg';\ntype ProfileName = NonNullable<ValidateOptions['profile']>;\n\ntype KnownCommand =\n | 'validate'\n | 'convert'\n | 'import'\n | 'scale'\n | 'scrape'\n | 'test';\n\nconst supportedProfiles: ProfileName[] = ['base', 'cookable', 'scalable', 'quantified', 'illustrated', 'schedulable'];\n\nexport async function runCli(argv: string[]): Promise<void> {\n const [command, ...args] = argv;\n\n try {\n switch (command as KnownCommand) {\n case 'validate':\n await handleValidate(args);\n return;\n case 'convert':\n await handleConvert(args);\n return;\n case 'import':\n await handleImport(args);\n return;\n case 'scale':\n await handleScale(args);\n return;\n case 'scrape':\n await handleScrape(args);\n return;\n case 'test':\n await handleTest(args);\n return;\n default:\n printUsage();\n process.exitCode = 1;\n }\n } catch (error: any) {\n console.error(`❌ ${error?.message ?? error}`);\n process.exit(1);\n }\n}\n\nfunction printUsage() {\n console.log('Usage:');\n console.log(' soustack validate <fileOrGlob> [--profile <name>] [--strict] [--json]');\n console.log(' soustack convert --from <schemaorg|soustack> --to <schemaorg|soustack> <input> [-o <output>]');\n console.log(' soustack import --url <url> [-o <soustack.json>]');\n console.log(' soustack test [--profile <name>] [--strict] [--json]');\n console.log(' soustack scale <soustack.json> <multiplier>');\n console.log(' soustack scrape <url> -o <soustack.json>');\n}\n\nasync function handleValidate(args: string[]) {\n const { target, profile, strict, json } = parseValidateArgs(args);\n if (!target) throw new Error('Path or glob to Soustack recipe JSON is required');\n\n const files = expandTargets(target);\n if (files.length === 0) throw new Error(`No files matched pattern: ${target}`);\n\n const results = files.map((file) => validateFile(file, profile));\n reportValidation(results, { profile, strict, json });\n}\n\nasync function handleTest(args: string[]) {\n const { profile, strict, json } = parseValidationFlags(args);\n const cwd = process.cwd();\n const files = globSync('**/*.soustack.json', {\n cwd,\n absolute: true,\n nodir: true,\n ignore: ['**/node_modules/**', '**/dist/**', '**/build/**', '**/.git/**'],\n }).map((file) => path.resolve(cwd, file));\n\n if (files.length === 0) {\n console.log('No *.soustack.json files found in the current repository.');\n return;\n }\n\n const results = files.map((file) => validateFile(file, profile));\n reportValidation(results, { profile, strict, json, context: 'test' });\n}\n\nasync function handleConvert(args: string[]) {\n const { from, to, inputPath, outputPath } = parseConvertArgs(args);\n const fromKey = from?.toLowerCase();\n const toKey = to?.toLowerCase();\n\n if (!inputPath || !fromKey || !toKey) {\n throw new Error('Convert usage: convert --from <schemaorg|soustack> --to <schemaorg|soustack> <input> [-o <output>]');\n }\n\n const direction = resolveConvertDirection(fromKey, toKey);\n if (!direction) {\n throw new Error(`Unsupported conversion from \"${from}\" to \"${to}\"`);\n }\n\n const input = readJsonFile(inputPath);\n const result = direction === 'schemaorg-to-soustack' ? fromSchemaOrg(input) : toSchemaOrg(input as any);\n\n if (!result) {\n throw new Error('Unable to convert input with the provided formats.');\n }\n\n writeOutput(result, outputPath);\n console.log(`✅ Converted ${fromKey} → ${toKey}${outputPath ? ` (${outputPath})` : ''}`);\n}\n\nasync function handleImport(args: string[]) {\n const { url, outputPath } = parseImportArgs(args);\n if (!url) throw new Error('Import usage: import --url <url> [-o <soustack.json>]');\n\n const recipe = await scrapeRecipe(url);\n writeOutput(recipe, outputPath);\n console.log(`✅ Imported recipe from ${url}${outputPath ? ` (${outputPath})` : ''}`);\n}\n\nasync function handleScale(args: string[]) {\n const filePath = args[0];\n const multiplier = args[1] ? parseFloat(args[1]) : 1;\n if (!filePath || Number.isNaN(multiplier)) {\n throw new Error('Scale usage: scale <soustack.json> <multiplier>');\n }\n\n const recipe = readJsonFile(filePath);\n console.log(`\\n⚖️ Scaling \"${(recipe as any)?.name ?? filePath}\" by ${multiplier}x...\\n`);\n const result = scaleRecipe(recipe as any, { multiplier });\n\n console.log(JSON.stringify(result, null, 2));\n}\n\nasync function handleScrape(args: string[]) {\n const url = args[0];\n const outputPath = resolveOutputPath(args.slice(1));\n if (!url) throw new Error('Scrape usage: scrape <url> -o <soustack.json>');\n\n const recipe = await scrapeRecipe(url);\n writeOutput(recipe, outputPath);\n console.log(`✅ Scraped recipe from ${url}${outputPath ? ` (${outputPath})` : ''}`);\n}\n\nfunction parseValidateArgs(args: string[]): { target?: string } & ValidationFlags {\n let profile: ProfileName | undefined;\n let strict = false;\n let json = false;\n let target: string | undefined;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n switch (arg) {\n case '--profile':\n profile = normalizeProfile(args[i + 1]);\n i++;\n break;\n case '--strict':\n strict = true;\n break;\n case '--json':\n json = true;\n break;\n default:\n if (!arg.startsWith('--') && !target) {\n target = arg;\n }\n break;\n }\n }\n\n return { profile, strict, json, target };\n}\n\nfunction parseValidationFlags(args: string[]): ValidationFlags {\n const { profile, strict, json } = parseValidateArgs(args);\n return { profile, strict, json };\n}\n\nfunction normalizeProfile(value?: string): ProfileName | undefined {\n if (!value) return undefined;\n const normalized = value.toLowerCase() as ProfileName;\n if (supportedProfiles.includes(normalized)) {\n return normalized;\n }\n throw new Error(`Unknown Soustack profile: ${value}`);\n}\n\nfunction parseConvertArgs(args: string[]): { from?: string; to?: string; inputPath?: string; outputPath?: string } {\n let from: string | undefined;\n let to: string | undefined;\n let outputPath: string | undefined;\n let inputPath: string | undefined;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n switch (arg) {\n case '--from':\n from = args[i + 1];\n if (!from) throw new Error('Missing value for --from');\n i++;\n break;\n case '--to':\n to = args[i + 1];\n if (!to) throw new Error('Missing value for --to');\n i++;\n break;\n case '-o':\n case '--output':\n outputPath = args[i + 1];\n if (!outputPath) throw new Error('Missing value for output');\n i++;\n break;\n default:\n if (!inputPath && !arg.startsWith('--')) {\n inputPath = arg;\n }\n break;\n }\n }\n\n return { from, to, inputPath, outputPath };\n}\n\nfunction parseImportArgs(args: string[]): { url?: string; outputPath?: string } {\n let url: string | undefined;\n let outputPath: string | undefined;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === '--url') {\n url = args[i + 1];\n if (!url) {\n throw new Error('URL flag provided without a value');\n }\n i++;\n } else if (arg === '-o' || arg === '--output') {\n outputPath = args[i + 1];\n if (!outputPath) {\n throw new Error('Output flag provided without a path');\n }\n i++;\n }\n }\n\n return { url, outputPath };\n}\n\nfunction resolveConvertDirection(from: string, to: string): ConvertDirection | null {\n if (from === 'schemaorg' && to === 'soustack') return 'schemaorg-to-soustack';\n if (from === 'soustack' && to === 'schemaorg') return 'soustack-to-schemaorg';\n return null;\n}\n\nfunction expandTargets(target: string): string[] {\n const matches = globSync(target, { absolute: true, nodir: true });\n const unique = Array.from(new Set(matches.map((match) => path.resolve(match))));\n return unique;\n}\n\nfunction validateFile(file: string, profile?: ProfileName): ValidationOutcome {\n const recipe = readJsonFile(file);\n const result = validateRecipe(recipe, profile ? { profile } : {});\n return {\n file,\n profile,\n valid: result.valid,\n warnings: result.warnings,\n errors: result.errors,\n };\n}\n\nfunction reportValidation(\n results: ValidationOutcome[],\n options: ValidationFlags & { profile?: ProfileName; context?: 'test' | 'validate' },\n) {\n const summary: ValidationSummary = {\n strict: options.strict,\n total: results.length,\n passed: 0,\n failed: 0,\n };\n\n const serializable = results.map((result) => {\n const passed = isEffectivelyValid(result, options.strict);\n if (passed) summary.passed += 1;\n else summary.failed += 1;\n\n return {\n file: path.relative(process.cwd(), result.file),\n profile: result.profile,\n valid: result.valid,\n warnings: result.warnings,\n errors: result.errors,\n passed,\n };\n });\n\n if (options.json) {\n console.log(JSON.stringify({ summary, results: serializable }, null, 2));\n } else {\n serializable.forEach((entry) => {\n const prefix = entry.passed ? '✅' : '❌';\n console.log(`${prefix} ${entry.file}`);\n if (!entry.passed && entry.errors.length) {\n entry.errors.forEach((error) => {\n console.log(` • [${error.path}] ${error.message}`);\n });\n }\n if (!entry.passed && options.strict && entry.warnings.length) {\n entry.warnings.forEach((warning) => {\n console.log(` • [${warning.path}] ${warning.message} (warning)`);\n });\n }\n });\n\n const contextLabel = options.context === 'test' ? 'Test summary' : 'Validation summary';\n console.log(`${contextLabel}: ${summary.passed}/${summary.total} files valid${options.strict ? ' (strict)' : ''}`);\n }\n\n if (summary.failed > 0) {\n process.exitCode = 1;\n }\n}\n\nfunction isEffectivelyValid(result: ValidationOutcome, strict: boolean): boolean {\n return result.valid && (!strict || result.warnings.length === 0);\n}\n\nfunction readJsonFile(relativePath: string) {\n const absolutePath = path.resolve(relativePath);\n if (!fs.existsSync(absolutePath)) {\n throw new Error(`File not found: ${absolutePath}`);\n }\n\n const content = fs.readFileSync(absolutePath, 'utf-8');\n try {\n return JSON.parse(content);\n } catch {\n throw new Error(`Unable to parse JSON in ${absolutePath}`);\n }\n}\n\nfunction resolveOutputPath(args: string[]): string | undefined {\n const index = args.findIndex((arg) => arg === '-o' || arg === '--output');\n if (index === -1) return undefined;\n const target = args[index + 1];\n if (!target) {\n throw new Error('Output flag provided without a path');\n }\n return target;\n}\n\nfunction writeOutput(data: unknown, outputPath?: string) {\n const serialized = JSON.stringify(data, null, 2);\n if (!outputPath) {\n console.log(serialized);\n return;\n }\n\n const absolutePath = path.resolve(outputPath);\n fs.writeFileSync(absolutePath, serialized, 'utf-8');\n}\n\nif (require.main === module) {\n runCli(process.argv.slice(2)).catch((error) => {\n console.error(`❌ ${error?.message ?? error}`);\n process.exit(1);\n });\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/parsers/duration.ts","../../src/parser.ts","../../src/converters/yield.ts","../../src/utils/image.ts","../../src/normalize.ts","../../src/fromSchemaOrg.ts","../../src/schemas/registry/stacks.json","../../src/converters/toSchemaOrg.ts","../../src/scraper/fetch.ts","../../src/scraper/extractors/utils.ts","../../src/scraper/extractors/jsonld.ts","../../src/scraper/extractors/microdata.ts","../../src/scraper/extractors/browser.ts","../../src/scraper/extractors/index.ts","../../src/scraper/index.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","../../bin/cli.ts"],"names":["convertIngredients","value","convertInstructions","trimmed","convertTime","result","convertNutrition","resolve","isBrowser","load","SIMPLE_PROPS","collectCandidates","findPropertyValue","path","base_schema_default","schema_default","Ajv2020","addFormats","globSync","fs"],"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 { 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 { 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 {\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 { FetchImplementation, FetchOptions, FetchRequestInit } from './types';\n\nconst DEFAULT_USER_AGENTS = [\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',\n 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:121.0) Gecko/20100101 Firefox/121.0'\n];\n\nfunction chooseUserAgent(provided?: string): string {\n if (provided) return provided;\n const index = Math.floor(Math.random() * DEFAULT_USER_AGENTS.length);\n return DEFAULT_USER_AGENTS[index];\n}\n\nfunction resolveFetch(fetchFn?: FetchImplementation): FetchImplementation {\n if (fetchFn) {\n return fetchFn;\n }\n\n const globalFetch = (globalThis as { fetch?: FetchImplementation }).fetch;\n if (!globalFetch) {\n throw new Error(\n 'A global fetch implementation is not available. Provide window.fetch in browsers or upgrade to Node 18+.'\n );\n }\n\n return globalFetch;\n}\n\nfunction isBrowserEnvironment(): boolean {\n return typeof (globalThis as { document?: unknown }).document !== 'undefined';\n}\n\nfunction isClientError(error: Error & { status?: number }): boolean {\n if (typeof error.status === 'number') {\n return error.status >= 400 && error.status < 500;\n }\n return error.message.includes('HTTP 4');\n}\n\nasync function wait(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms));\n}\n\nexport async function fetchPage(url: string, options: FetchOptions = {}): Promise<string> {\n const {\n timeout = 10_000,\n userAgent,\n maxRetries = 2,\n fetchFn\n } = options;\n\n let lastError: Error | null = null;\n const resolvedFetch = resolveFetch(fetchFn);\n const isBrowser = isBrowserEnvironment();\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const headers: Record<string, string> = {\n Accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',\n 'Accept-Language': 'en-US,en;q=0.5'\n };\n\n if (!isBrowser) {\n headers['User-Agent'] = chooseUserAgent(userAgent);\n }\n\n const requestInit: FetchRequestInit = {\n headers,\n signal: controller.signal,\n redirect: 'follow'\n };\n\n const response = await resolvedFetch(url, requestInit);\n\n clearTimeout(timeoutId);\n if (response && typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') {\n const ingestUrl = process.env.SOUSTACK_DEBUG_INGEST_URL;\n if (ingestUrl) {\n try {\n const globalFetch = typeof globalThis !== 'undefined' && typeof globalThis.fetch !== 'undefined' ? globalThis.fetch : null;\n if (globalFetch) {\n globalFetch(ingestUrl,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'scraper/fetch.ts:63',message:'fetch response',data:{url,status:response.status,statusText:response.statusText,ok:response.ok,isNYTimes:url.includes('nytimes.com')},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'B'})}).catch(()=>{});\n }\n } catch {}\n }\n }\n\n if (!response.ok) {\n const error: Error & { status?: number } = new Error(\n `HTTP ${response.status}: ${response.statusText}`\n );\n error.status = response.status;\n throw error;\n }\n\n const html = await response.text();\n if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') {\n const ingestUrl = process.env.SOUSTACK_DEBUG_INGEST_URL;\n if (ingestUrl) {\n try {\n const globalFetch = typeof globalThis !== 'undefined' && typeof globalThis.fetch !== 'undefined' ? globalThis.fetch : null;\n if (globalFetch) {\n globalFetch(ingestUrl,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'scraper/fetch.ts:75',message:'HTML received',data:{htmlLength:html.length,hasLoginPage:html.toLowerCase().includes('login')||html.toLowerCase().includes('sign in'),hasRecipeData:html.includes('application/ld+json')||html.includes('schema.org/Recipe')},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'B,D'})}).catch(()=>{});\n }\n } catch {}\n }\n }\n return html;\n } catch (err) {\n clearTimeout(timeoutId);\n\n lastError = err instanceof Error ? err : new Error(String(err));\n\n if (isClientError(lastError)) {\n throw lastError;\n }\n\n if (attempt < maxRetries) {\n await wait(1000 * (attempt + 1));\n continue;\n }\n }\n }\n\n throw lastError ?? new Error('Failed to fetch page');\n}\n\nexport { FetchOptions };\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 { load } from 'cheerio';\nimport type { SchemaOrgRecipe } from '../types';\nimport { isRecipeNode, safeJsonParse } from './utils';\n\ntype JsonLdPayload = Record<string, unknown> | Array<Record<string, unknown>>;\n\nexport function extractJsonLd(html: string): SchemaOrgRecipe | null {\n const $ = load(html);\n const scripts = $('script[type=\"application/ld+json\"]');\n const candidates: SchemaOrgRecipe[] = [];\n\n scripts.each((_, element) => {\n const content = $(element).html();\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 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","import { load, type CheerioAPI, type Cheerio } from 'cheerio';\nimport type { SchemaOrgRecipe } from '../types';\nimport { normalizeText } from './utils';\n\nconst SIMPLE_PROPS = [\n 'name',\n 'description',\n 'image',\n 'recipeYield',\n 'prepTime',\n 'cookTime',\n 'totalTime'\n] as const;\n\nexport function extractMicrodata(html: string): SchemaOrgRecipe | null {\n const $ = load(html);\n const recipeEl = $('[itemscope][itemtype*=\"schema.org/Recipe\"]').first();\n\n if (!recipeEl.length) {\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.find('[itemprop=\"recipeIngredient\"]').each((_, el) => {\n const text = normalizeText($(el).attr('content') || $(el).text());\n if (text) ingredients.push(text);\n });\n\n if (ingredients.length) {\n recipe.recipeIngredient = ingredients;\n }\n\n const instructions: string[] = [];\n recipeEl.find('[itemprop=\"recipeInstructions\"]').each((_, el) => {\n const text =\n normalizeText($(el).attr('content')) ||\n normalizeText($(el).find('[itemprop=\"text\"]').first().text()) ||\n normalizeText($(el).text());\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($: CheerioAPI, context: Cheerio<any>, prop: string): string | undefined {\n const node = context.find(`[itemprop=\"${prop}\"]`).first();\n if (!node.length) return undefined;\n\n return (\n normalizeText(node.attr('content')) ||\n normalizeText(node.attr('href')) ||\n normalizeText(node.attr('src')) ||\n normalizeText(node.text())\n );\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 type { ExtractionResult } from '../types';\nimport { extractJsonLd } from './jsonld';\nimport { extractMicrodata } from './microdata';\nimport { extractRecipeBrowser } from './browser';\n\nfunction isBrowser(): boolean {\n try {\n // Check if we're in a browser environment with DOMParser\n return typeof (globalThis as any).DOMParser !== 'undefined';\n } catch {\n return false;\n }\n}\n\nexport function extractRecipe(html: string): ExtractionResult {\n // Use browser-compatible extraction if DOMParser is available\n if (isBrowser()) {\n return extractRecipeBrowser(html);\n }\n \n // Fallback to cheerio-based extraction for Node.js\n const jsonLdRecipe = extractJsonLd(html);\n if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') {\n const ingestUrl = process.env.SOUSTACK_DEBUG_INGEST_URL;\n if (ingestUrl) {\n try {\n const globalFetch = typeof globalThis !== 'undefined' && typeof globalThis.fetch !== 'undefined' ? globalThis.fetch : null;\n if (globalFetch) {\n globalFetch(ingestUrl,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'scraper/extractors/index.ts:6',message:'JSON-LD extraction result',data:{hasJsonLd:!!jsonLdRecipe},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'C,D'})}).catch(()=>{});\n }\n } catch {}\n }\n }\n if (jsonLdRecipe) {\n return { recipe: jsonLdRecipe, source: 'jsonld' };\n }\n\n const microdataRecipe = extractMicrodata(html);\n if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') {\n const ingestUrl = process.env.SOUSTACK_DEBUG_INGEST_URL;\n if (ingestUrl) {\n try {\n const globalFetch = typeof globalThis !== 'undefined' && typeof globalThis.fetch !== 'undefined' ? globalThis.fetch : null;\n if (globalFetch) {\n globalFetch(ingestUrl,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'scraper/extractors/index.ts:12',message:'Microdata extraction result',data:{hasMicrodata:!!microdataRecipe},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'D'})}).catch(()=>{});\n }\n } catch {}\n }\n }\n if (microdataRecipe) {\n return { recipe: microdataRecipe, source: 'microdata' };\n }\n\n return { recipe: null, source: null };\n}\n","import { fromSchemaOrg } from '../fromSchemaOrg';\nimport type { Recipe } from '../types';\nimport { fetchPage } from './fetch';\nimport { extractRecipe } from './extractors';\nimport type { ScrapeRecipeOptions, SchemaOrgRecipe } from './types';\n\n/**\n * Scrapes a recipe from a URL (Node.js only).\n * \n * ⚠️ Not available in browser environments due to CORS restrictions.\n * For browser usage, fetch the HTML yourself and use extractRecipeFromHTML().\n * \n * @param url - The URL of the recipe page to scrape\n * @param options - Fetch options (timeout, userAgent, maxRetries)\n * @returns A Soustack recipe object\n * @throws Error if no recipe is found\n */\nexport async function scrapeRecipe(url: string, options: ScrapeRecipeOptions = {}): Promise<Recipe> {\n if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') {\n const ingestUrl = process.env.SOUSTACK_DEBUG_INGEST_URL;\n if (ingestUrl) {\n try {\n const globalFetch = typeof globalThis !== 'undefined' && typeof globalThis.fetch !== 'undefined' ? globalThis.fetch : null;\n if (globalFetch) {\n globalFetch(ingestUrl,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'scraper/index.ts:7',message:'scrapeRecipe entry',data:{url,hasOptions:!!options},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A,B,C,D,E'})}).catch(()=>{});\n }\n } catch {}\n }\n }\n const html = await fetchPage(url, options);\n if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') {\n const ingestUrl = process.env.SOUSTACK_DEBUG_INGEST_URL;\n if (ingestUrl) {\n try {\n const globalFetch = typeof globalThis !== 'undefined' && typeof globalThis.fetch !== 'undefined' ? globalThis.fetch : null;\n if (globalFetch) {\n globalFetch(ingestUrl,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'scraper/index.ts:9',message:'HTML fetched',data:{htmlLength:html?.length,htmlPreview:html?.substring(0,200)},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'B'})}).catch(()=>{});\n }\n } catch {}\n }\n }\n const { recipe } = extractRecipe(html);\n if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') {\n const ingestUrl = process.env.SOUSTACK_DEBUG_INGEST_URL;\n if (ingestUrl) {\n try {\n const globalFetch = typeof globalThis !== 'undefined' && typeof globalThis.fetch !== 'undefined' ? globalThis.fetch : null;\n if (globalFetch) {\n globalFetch(ingestUrl,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'scraper/index.ts:11',message:'extractRecipe result',data:{hasRecipe:!!recipe,recipeType:recipe?.['@type'],recipeName:recipe?.name},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A,C,D'})}).catch(()=>{});\n }\n } catch {}\n }\n }\n\n if (!recipe) {\n throw new Error('No Schema.org recipe data found in page');\n }\n\n const soustackRecipe = fromSchemaOrg(recipe);\n if (typeof process !== 'undefined' && process.env.NODE_ENV !== 'test') {\n const ingestUrl = process.env.SOUSTACK_DEBUG_INGEST_URL;\n if (ingestUrl) {\n try {\n const globalFetch = typeof globalThis !== 'undefined' && typeof globalThis.fetch !== 'undefined' ? globalThis.fetch : null;\n if (globalFetch) {\n globalFetch(ingestUrl,{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({location:'scraper/index.ts:17',message:'fromSchemaOrg result',data:{hasSoustackRecipe:!!soustackRecipe,soustackRecipeName:soustackRecipe?.name},timestamp:Date.now(),sessionId:'debug-session',runId:'run1',hypothesisId:'A'})}).catch(()=>{});\n }\n } catch {}\n }\n }\n if (!soustackRecipe) {\n throw new Error('Schema.org data did not include a valid recipe');\n }\n\n return soustackRecipe;\n}\n\n/**\n * Extracts a recipe from HTML string (browser and Node.js compatible).\n * \n * This function works in both environments and doesn't require network access.\n * Perfect for browser usage where you fetch HTML yourself (with cookies/session).\n * \n * @example\n * ```ts\n * // In browser:\n * const response = await fetch('https://example.com/recipe');\n * const html = await response.text();\n * const recipe = extractRecipeFromHTML(html);\n * ```\n * \n * @param html - The HTML string containing Schema.org recipe data\n * @returns A Soustack recipe object\n * @throws Error if no recipe is found\n */\nexport function extractRecipeFromHTML(html: string): Recipe {\n const { recipe } = extractRecipe(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 if (!soustackRecipe) {\n throw new Error('Schema.org data did not include a valid recipe');\n }\n\n return soustackRecipe;\n}\n\n/**\n * Extract Schema.org recipe data from HTML string (browser-compatible).\n * \n * Returns the raw Schema.org recipe object, which can then be converted\n * to Soustack format using fromSchemaOrg(). This gives you access to the\n * original Schema.org data for inspection, debugging, or custom transformations.\n * \n * @param html - HTML string containing Schema.org recipe data\n * @returns Schema.org recipe object, or null if not found\n * \n * @example\n * ```ts\n * // In browser:\n * const response = await fetch('https://example.com/recipe');\n * const html = await response.text();\n * const schemaOrgRecipe = extractSchemaOrgRecipeFromHTML(html);\n * \n * if (schemaOrgRecipe) {\n * // Inspect or modify Schema.org data before converting\n * console.log('Found recipe:', schemaOrgRecipe.name);\n * \n * // Convert to Soustack format\n * const soustackRecipe = fromSchemaOrg(schemaOrgRecipe);\n * }\n * ```\n */\nexport function extractSchemaOrgRecipeFromHTML(html: string): SchemaOrgRecipe | null {\n const { recipe } = extractRecipe(html);\n return recipe;\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 * as fs from 'fs';\nimport * as path from 'path';\nimport { globSync } from 'glob';\nimport { scaleRecipe } from '../src/parser';\nimport { fromSchemaOrg } from '../src/fromSchemaOrg';\nimport { toSchemaOrg } from '../src/toSchemaOrg';\nimport { scrapeRecipe } from '../src/scraper/index';\nimport {\n validateRecipe,\n type NormalizedError,\n type ValidateOptions,\n type ValidateMode,\n type ValidateResult,\n} from '../src/validator';\n\ninterface ValidationOutcome {\n file: string;\n profile?: ProfileName;\n ok: boolean;\n warnings: string[];\n schemaErrors: NormalizedError[];\n conformanceIssues: ValidateResult['conformanceIssues'];\n}\n\ninterface ValidationFlags {\n profile?: ProfileName;\n forceProfile: boolean;\n strict: boolean;\n json: boolean;\n mode: ValidateMode;\n}\n\ninterface ValidationSummary {\n strict: boolean;\n total: number;\n passed: number;\n failed: number;\n}\n\ntype ConvertDirection = 'schemaorg-to-soustack' | 'soustack-to-schemaorg';\ntype ProfileName = NonNullable<ValidateOptions['profile']>;\n\ntype KnownCommand =\n | 'check'\n | 'validate'\n | 'convert'\n | 'import'\n | 'scale'\n | 'scrape'\n | 'test';\n\nconst supportedProfiles: ProfileName[] = [\n 'base',\n 'equipped',\n 'illustrated',\n 'lite',\n 'prepped',\n 'scalable',\n 'timed',\n];\n\nexport async function runCli(argv: string[]): Promise<void> {\n const [command, ...args] = argv;\n\n try {\n switch (command as KnownCommand) {\n case 'check':\n await handleCheck(args);\n return;\n case 'validate':\n await handleValidate(args);\n return;\n case 'convert':\n await handleConvert(args);\n return;\n case 'import':\n await handleImport(args);\n return;\n case 'scale':\n await handleScale(args);\n return;\n case 'scrape':\n await handleScrape(args);\n return;\n case 'test':\n await handleTest(args);\n return;\n default:\n printUsage();\n process.exitCode = 1;\n }\n } catch (error: any) {\n console.error(`❌ ${error?.message ?? error}`);\n process.exit(1);\n }\n}\n\nfunction printUsage() {\n console.log('Usage:');\n console.log(' soustack check <file> --json');\n console.log(\n ' soustack validate <fileOrGlob> [--profile <name>] [--force-profile] [--schema-only] [--strict] [--json]',\n );\n console.log(' soustack convert --from <schemaorg|soustack> --to <schemaorg|soustack> <input> [-o <output>]');\n console.log(' soustack import --url <url> [-o <soustack.json>]');\n console.log(' soustack test [--profile <name>] [--force-profile] [--schema-only] [--strict] [--json]');\n console.log(' soustack scale <soustack.json> <multiplier>');\n console.log(' soustack scrape <url> -o <soustack.json>');\n console.log(`\\nProfiles: ${supportedProfiles.join(', ')}`);\n}\n\nasync function handleCheck(args: string[]) {\n const { target, json } = parseCheckArgs(args);\n if (!target) throw new Error('Path to Soustack recipe JSON is required');\n if (!json) throw new Error('Check usage: check <file> --json');\n\n try {\n const input = readJsonFile(target);\n const result = validateRecipe(input, { mode: 'full', includeNormalized: true });\n const report = buildConformanceReport(result);\n console.log(JSON.stringify(report, null, 2));\n if (!report.ok) process.exitCode = 1;\n } catch (error: any) {\n const report = buildConformanceReport({\n ok: false,\n warnings: [],\n schemaErrors: [{ path: '/', message: error?.message || 'Validation failed' }],\n conformanceIssues: [],\n normalizedRecipe: undefined,\n });\n console.log(JSON.stringify(report, null, 2));\n process.exitCode = 1;\n }\n}\n\nasync function handleValidate(args: string[]) {\n const { target, profile, forceProfile, strict, json, mode } = parseValidateArgs(args);\n if (!target) throw new Error('Path or glob to Soustack recipe JSON is required');\n\n const files = expandTargets(target);\n if (files.length === 0) throw new Error(`No files matched pattern: ${target}`);\n\n const results = files.map((file) => validateFile(file, profile, mode, forceProfile));\n reportValidation(results, { profile, forceProfile, strict, json, mode });\n}\n\nasync function handleTest(args: string[]) {\n const { profile, forceProfile, strict, json, mode } = parseValidationFlags(args);\n const cwd = process.cwd();\n const files = globSync('**/*.soustack.json', {\n cwd,\n absolute: true,\n nodir: true,\n ignore: ['**/node_modules/**', '**/dist/**', '**/build/**', '**/.git/**'],\n }).map((file) => path.resolve(cwd, file));\n\n if (files.length === 0) {\n console.log('No *.soustack.json files found in the current repository.');\n return;\n }\n\n const results = files.map((file) => validateFile(file, profile, mode, forceProfile));\n reportValidation(results, { profile, forceProfile, strict, json, mode, context: 'test' });\n}\n\nasync function handleConvert(args: string[]) {\n const { from, to, inputPath, outputPath } = parseConvertArgs(args);\n const fromKey = from?.toLowerCase();\n const toKey = to?.toLowerCase();\n\n if (!inputPath || !fromKey || !toKey) {\n throw new Error('Convert usage: convert --from <schemaorg|soustack> --to <schemaorg|soustack> <input> [-o <output>]');\n }\n\n const direction = resolveConvertDirection(fromKey, toKey);\n if (!direction) {\n throw new Error(`Unsupported conversion from \"${from}\" to \"${to}\"`);\n }\n\n const input = readJsonFile(inputPath);\n const result = direction === 'schemaorg-to-soustack' ? fromSchemaOrg(input) : toSchemaOrg(input as any);\n\n if (!result) {\n throw new Error('Unable to convert input with the provided formats.');\n }\n\n writeOutput(result, outputPath);\n console.log(`✅ Converted ${fromKey} → ${toKey}${outputPath ? ` (${outputPath})` : ''}`);\n}\n\nasync function handleImport(args: string[]) {\n const { url, outputPath } = parseImportArgs(args);\n if (!url) throw new Error('Import usage: import --url <url> [-o <soustack.json>]');\n\n const recipe = await scrapeRecipe(url);\n writeOutput(recipe, outputPath);\n console.log(`✅ Imported recipe from ${url}${outputPath ? ` (${outputPath})` : ''}`);\n}\n\nasync function handleScale(args: string[]) {\n const filePath = args[0];\n const multiplier = args[1] ? parseFloat(args[1]) : 1;\n if (!filePath || Number.isNaN(multiplier)) {\n throw new Error('Scale usage: scale <soustack.json> <multiplier>');\n }\n\n const recipe = readJsonFile(filePath);\n console.log(`\\n⚖️ Scaling \"${(recipe as any)?.name ?? filePath}\" by ${multiplier}x...\\n`);\n const result = scaleRecipe(recipe as any, { multiplier });\n\n console.log(JSON.stringify(result, null, 2));\n}\n\nasync function handleScrape(args: string[]) {\n const url = args[0];\n const outputPath = resolveOutputPath(args.slice(1));\n if (!url) throw new Error('Scrape usage: scrape <url> -o <soustack.json>');\n\n const recipe = await scrapeRecipe(url);\n writeOutput(recipe, outputPath);\n console.log(`✅ Scraped recipe from ${url}${outputPath ? ` (${outputPath})` : ''}`);\n}\n\nfunction parseValidateArgs(args: string[]): { target?: string } & ValidationFlags {\n let profile: ProfileName | undefined;\n let forceProfile = false;\n let strict = false;\n let json = false;\n let mode: ValidateMode = 'full';\n let target: string | undefined;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n switch (arg) {\n case '--profile':\n profile = normalizeProfile(args[i + 1]);\n i++;\n break;\n case '--force-profile':\n forceProfile = true;\n break;\n case '--schema-only':\n mode = 'schema';\n break;\n case '--strict':\n strict = true;\n break;\n case '--json':\n json = true;\n break;\n default:\n if (!arg.startsWith('--') && !target) {\n target = arg;\n }\n break;\n }\n }\n\n return { profile, forceProfile, strict, json, mode, target };\n}\n\nfunction parseCheckArgs(args: string[]): { target?: string; json: boolean } {\n let json = false;\n let target: string | undefined;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === '--json') {\n json = true;\n continue;\n }\n\n if (!arg.startsWith('--') && !target) {\n target = arg;\n }\n }\n\n return { target, json };\n}\n\nfunction parseValidationFlags(args: string[]): ValidationFlags {\n const { profile, forceProfile, strict, json, mode } = parseValidateArgs(args);\n return { profile, forceProfile, strict, json, mode };\n}\n\nfunction normalizeProfile(value?: string): ProfileName | undefined {\n if (!value) return undefined;\n const normalized = value.toLowerCase() as ProfileName;\n if (supportedProfiles.includes(normalized)) {\n return normalized;\n }\n throw new Error(`Unknown Soustack profile: ${value}. Supported profiles: ${supportedProfiles.join(', ')}`);\n}\n\nfunction parseConvertArgs(args: string[]): { from?: string; to?: string; inputPath?: string; outputPath?: string } {\n let from: string | undefined;\n let to: string | undefined;\n let outputPath: string | undefined;\n let inputPath: string | undefined;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n switch (arg) {\n case '--from':\n from = args[i + 1];\n if (!from) throw new Error('Missing value for --from');\n i++;\n break;\n case '--to':\n to = args[i + 1];\n if (!to) throw new Error('Missing value for --to');\n i++;\n break;\n case '-o':\n case '--output':\n outputPath = args[i + 1];\n if (!outputPath) throw new Error('Missing value for output');\n i++;\n break;\n default:\n if (!inputPath && !arg.startsWith('--')) {\n inputPath = arg;\n }\n break;\n }\n }\n\n return { from, to, inputPath, outputPath };\n}\n\nfunction parseImportArgs(args: string[]): { url?: string; outputPath?: string } {\n let url: string | undefined;\n let outputPath: string | undefined;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg === '--url') {\n url = args[i + 1];\n if (!url) {\n throw new Error('URL flag provided without a value');\n }\n i++;\n } else if (arg === '-o' || arg === '--output') {\n outputPath = args[i + 1];\n if (!outputPath) {\n throw new Error('Output flag provided without a path');\n }\n i++;\n }\n }\n\n return { url, outputPath };\n}\n\nfunction resolveConvertDirection(from: string, to: string): ConvertDirection | null {\n if (from === 'schemaorg' && to === 'soustack') return 'schemaorg-to-soustack';\n if (from === 'soustack' && to === 'schemaorg') return 'soustack-to-schemaorg';\n return null;\n}\n\nfunction expandTargets(target: string): string[] {\n const matches = globSync(target, { absolute: true, nodir: true });\n const unique = Array.from(new Set(matches.map((match) => path.resolve(match))));\n return unique;\n}\n\nfunction validateFile(\n file: string,\n profile?: ProfileName,\n mode: ValidateMode = 'full',\n forceProfile = false,\n): ValidationOutcome {\n try {\n const recipe = readJsonFile(file);\n const { recipe: validationRecipe, mismatchError } = resolveProfileForValidation(recipe, profile, forceProfile);\n if (mismatchError) {\n return {\n file,\n profile,\n ok: false,\n warnings: [],\n schemaErrors: [mismatchError],\n conformanceIssues: [],\n };\n }\n const result = validateRecipe(validationRecipe, profile ? { profile, mode } : { mode });\n return {\n file,\n profile,\n ok: result.ok,\n warnings: result.warnings,\n schemaErrors: result.schemaErrors,\n conformanceIssues: result.conformanceIssues,\n };\n } catch (error: any) {\n // Return validation outcome with error instead of throwing\n return {\n file,\n profile,\n ok: false,\n warnings: [],\n schemaErrors: [{ path: \"/\", message: error?.message || \"Validation failed\", keyword: \"error\" }],\n conformanceIssues: [],\n };\n }\n}\n\nfunction resolveProfileForValidation(\n recipe: unknown,\n profile?: ProfileName,\n forceProfile = false,\n): { recipe: unknown; mismatchError?: NormalizedError } {\n if (!profile) return { recipe };\n if (!recipe || typeof recipe !== 'object' || Array.isArray(recipe)) {\n return { recipe };\n }\n\n const recipeProfileRaw = (recipe as { profile?: unknown }).profile;\n const recipeProfile = typeof recipeProfileRaw === 'string' ? recipeProfileRaw.toLowerCase() : undefined;\n\n if (!recipeProfile) {\n return { recipe: { ...(recipe as object), profile } };\n }\n\n if (recipeProfile !== profile) {\n if (!forceProfile) {\n return {\n recipe,\n mismatchError: {\n path: '/profile',\n keyword: 'profile',\n message: `Recipe profile \"${recipeProfile}\" does not match --profile \"${profile}\". Use --force-profile to override.`,\n },\n };\n }\n\n return { recipe: { ...(recipe as object), profile } };\n }\n\n return { recipe };\n}\n\nfunction reportValidation(\n results: ValidationOutcome[],\n options: ValidationFlags & { profile?: ProfileName; context?: 'test' | 'validate' },\n) {\n const summary: ValidationSummary = {\n strict: options.strict,\n total: results.length,\n passed: 0,\n failed: 0,\n };\n\n const serializable = results.map((result) => {\n const passed = isEffectivelyValid(result, options.strict);\n if (passed) summary.passed += 1;\n else summary.failed += 1;\n\n return {\n file: path.relative(process.cwd(), result.file),\n profile: result.profile,\n ok: result.ok,\n warnings: result.warnings,\n schemaErrors: result.schemaErrors,\n conformanceIssues: result.conformanceIssues,\n passed,\n };\n });\n\n if (options.json) {\n console.log(JSON.stringify({ summary, results: serializable }, null, 2));\n } else {\n serializable.forEach((entry) => {\n const prefix = entry.passed ? '✅' : '❌';\n console.log(`${prefix} ${entry.file}`);\n if (!entry.passed && entry.schemaErrors.length) {\n console.log(' Schema errors:');\n entry.schemaErrors.forEach((error) => {\n console.log(` • [${error.path}] ${error.message}`);\n });\n }\n if (!entry.passed && entry.conformanceIssues.length) {\n console.log(' Conformance issues:');\n entry.conformanceIssues.forEach((issue) => {\n console.log(` • [${issue.path}] ${issue.message} (${issue.code})`);\n });\n }\n if (!entry.passed && options.strict && entry.warnings.length) {\n console.log(' Warnings:');\n entry.warnings.forEach((warning) => {\n console.log(` • ${warning} (warning)`);\n });\n }\n });\n\n const contextLabel = options.context === 'test' ? 'Test summary' : 'Validation summary';\n console.log(`${contextLabel}: ${summary.passed}/${summary.total} files valid${options.strict ? ' (strict)' : ''}`);\n }\n\n if (summary.failed > 0) {\n process.exitCode = 1;\n }\n}\n\nfunction isEffectivelyValid(result: ValidationOutcome, strict: boolean): boolean {\n return result.ok && (!strict || result.warnings.length === 0);\n}\n\nfunction readJsonFile(relativePath: string) {\n const absolutePath = path.resolve(relativePath);\n if (!fs.existsSync(absolutePath)) {\n throw new Error(`File not found: ${absolutePath}`);\n }\n\n const content = fs.readFileSync(absolutePath, 'utf-8');\n try {\n return JSON.parse(content);\n } catch {\n throw new Error(`Unable to parse JSON in ${absolutePath}`);\n }\n}\n\nfunction resolveOutputPath(args: string[]): string | undefined {\n const index = args.findIndex((arg) => arg === '-o' || arg === '--output');\n if (index === -1) return undefined;\n const target = args[index + 1];\n if (!target) {\n throw new Error('Output flag provided without a path');\n }\n return target;\n}\n\nfunction writeOutput(data: unknown, outputPath?: string) {\n const serialized = JSON.stringify(data, null, 2);\n if (!outputPath) {\n console.log(serialized);\n return;\n }\n\n const absolutePath = path.resolve(outputPath);\n fs.writeFileSync(absolutePath, serialized, 'utf-8');\n}\n\nfunction buildConformanceReport(result: ValidateResult) {\n const recipe = result.normalizedRecipe;\n const level = typeof recipe?.level === 'string' ? recipe.level : null;\n const stacks = normalizeStacksForReport(recipe?.stacks);\n const schemaErrors = sortSchemaErrors(result.schemaErrors).map((error) => ({\n path: error.path,\n keyword: error.keyword ?? null,\n message: error.message,\n }));\n const conformanceIssues = sortConformanceIssues(result.conformanceIssues).map((issue) => ({\n code: issue.code,\n path: issue.path,\n severity: issue.severity === 'warning' ? 'warn' : 'error',\n message: issue.message,\n }));\n\n return {\n ok: result.ok,\n level,\n stacks,\n warnings: result.warnings,\n schemaErrors,\n conformanceIssues,\n };\n}\n\nfunction normalizeStacksForReport(stacks: unknown): Record<string, number> {\n if (!stacks || typeof stacks !== 'object' || Array.isArray(stacks)) return {};\n const entries = Object.entries(stacks).filter(([, value]) => typeof value === 'number');\n entries.sort(([a], [b]) => a.localeCompare(b));\n return Object.fromEntries(entries);\n}\n\nfunction sortSchemaErrors(errors: NormalizedError[]): NormalizedError[] {\n return [...errors].sort((left, right) => {\n const pathCompare = left.path.localeCompare(right.path);\n if (pathCompare !== 0) return pathCompare;\n const leftKeyword = left.keyword ?? '';\n const rightKeyword = right.keyword ?? '';\n return leftKeyword.localeCompare(rightKeyword);\n });\n}\n\nfunction sortConformanceIssues(issues: ValidateResult['conformanceIssues']): ValidateResult['conformanceIssues'] {\n return [...issues].sort((left, right) => {\n const pathCompare = left.path.localeCompare(right.path);\n if (pathCompare !== 0) return pathCompare;\n return left.code.localeCompare(right.code);\n });\n}\n\nif (require.main === module) {\n runCli(process.argv.slice(2)).catch((error) => {\n console.error(`❌ ${error?.message ?? error}`);\n process.exit(1);\n });\n}\n"]}
|