import type { ScrapePayload } from './types.js'; type Defaults = { optimizeImages: boolean; optimizeTitles: boolean; optimizeVariants: boolean; needTranslate: boolean; }; export function buildPayloadFromUrl( url: string, needTranslateOverride: string, defaults: Defaults, ): ScrapePayload { if (!url || url.trim() === '') { throw new Error('url is required'); } const payload: ScrapePayload = { url: url.trim(), optimizeImages: defaults.optimizeImages, optimizeTitles: defaults.optimizeTitles, optimizeVariants: defaults.optimizeVariants, needTranslate: defaults.needTranslate, }; if (needTranslateOverride && needTranslateOverride.trim() !== '') { payload.needTranslate = parseBoolean(needTranslateOverride); } return payload; } export function validatePayloadJson(raw: string): ScrapePayload { let data: unknown; try { data = JSON.parse(raw); } catch (error) { throw new Error(`invalid payload json: ${(error as SyntaxError).message}`); } if (typeof data !== 'object' || data === null || Array.isArray(data)) { throw new Error('payload must be a JSON object'); } const obj = data as Record; if (!obj.url) { throw new Error('payload.url is required'); } return { url: obj.url as string, optimizeImages: parseBoolean(obj.optimizeImages ?? true), optimizeTitles: parseBoolean(obj.optimizeTitles ?? true), optimizeVariants: parseBoolean(obj.optimizeVariants ?? true), needTranslate: parseBoolean(obj.needTranslate ?? false), }; } function parseBoolean(value: unknown): boolean { const str = String(value).trim().toLowerCase(); return ['1', 'true', 'yes', 'y'].includes(str); }