1688-product-master/src/scrape.ts

64 lines
1.7 KiB
TypeScript
Raw Normal View History

2026-03-11 23:36:59 +00:00
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<string, unknown>;
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);
}