validation.js•1.89 kB
export const SUPPORTED_CATEGORIES = ['programming', 'general', 'pun', 'spooky', 'christmas'];
export const SUPPORTED_LANGS = ['en', 'zh'];
export const ALLOWED_BLACKLIST_FLAGS = ['nsfw', 'religious', 'political', 'racist', 'sexist', 'explicit'];
export function normalizeCategory(category, fallback = 'programming') {
if (!category) return fallback;
const normalized = toKey(category);
if (!SUPPORTED_CATEGORIES.includes(normalized)) {
throw new Error(`Unsupported category: ${category}`);
}
return normalized;
}
export function normalizeLang(lang, fallback = 'en') {
if (!lang) return fallback;
const normalized = toKey(lang);
if (!SUPPORTED_LANGS.includes(normalized)) {
throw new Error(`Unsupported language: ${lang}`);
}
return normalized;
}
export function sanitizeBlacklist(value) {
if (!value) return [];
const list = Array.isArray(value) ? value : [value];
const seen = new Set();
const filtered = [];
for (const entry of list) {
if (typeof entry !== 'string') continue;
const key = toKey(entry);
if (!ALLOWED_BLACKLIST_FLAGS.includes(key)) continue;
if (seen.has(key)) continue;
seen.add(key);
filtered.push(key);
}
return filtered;
}
export function validateGetJokeInput(input, defaults) {
if (input == null) {
return {
category: normalizeCategory(undefined, defaults.defaultCategory),
lang: normalizeLang(undefined, defaults.lang),
blacklist: [],
};
}
if (typeof input !== 'object' || Array.isArray(input)) {
throw new Error('getJoke input must be an object');
}
const category = normalizeCategory(input.category, defaults.defaultCategory);
const lang = normalizeLang(input.lang, defaults.lang);
const blacklist = sanitizeBlacklist(input.blacklist);
return { category, lang, blacklist };
}
function toKey(value) {
return String(value).trim().toLowerCase();
}