64 lines
1.7 KiB
TypeScript
64 lines
1.7 KiB
TypeScript
|
|
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);
|
||
|
|
}
|