From cc1a01870e287a756633e43b6f6d437434c4af32 Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Thu, 11 Jun 2026 16:35:30 -0300 Subject: validators, yaml: URL OK!! --- src/data/yaml.js | 12 +++++++++++- src/validators.js | 33 +++++++++++++++++++++++++++++++-- 2 files changed, 42 insertions(+), 3 deletions(-) diff --git a/src/data/yaml.js b/src/data/yaml.js index 15d7b0ba..f8591311 100644 --- a/src/data/yaml.js +++ b/src/data/yaml.js @@ -751,12 +751,22 @@ export function parseURLs(entries) { if (typeof item !== 'string') return item; - const match = item.match(extractAccentRegex); + let bypassValidation, restOfItem; + if (item.endsWith(' (URL OK!!)')) { + bypassValidation = true; + restOfItem = item.slice(0, -' (URL OK!!)'.length); + } else { + bypassValidation = false; + restOfItem = item; + } + + const match = restOfItem.match(extractAccentRegex); if (!match) return item; return { url: match.groups.main, annotation: match.groups.accent, + bypassValidation, }; }); } diff --git a/src/validators.js b/src/validators.js index 28f3cef7..8f32e669 100644 --- a/src/validators.js +++ b/src/validators.js @@ -839,10 +839,39 @@ export const validateURLEntry = (isURL) => }); export const isURLEntry = - validateURLEntry(isURL); + validateProperties({ + url: isURL, + annotation: optional(isStringNonEmpty), + }); export const isCuratedURLEntry = - validateURLEntry(isCuratedURL); + (() => { + const commonProperties = { + annotation: optional(isStringNonEmpty), + }; + + const pickyValidator = + validateProperties({ + url: isCuratedURL, + ...commonProperties, + bypassValidation: optional(is(false)), + }); + + const niceysValidator = + validateProperties({ + url: isURL, + ...commonProperties, + bypassValidation: is(true), + }); + + return value => { + if (typeof value === 'object' && value.bypassValidation) { + return niceysValidator(value); + } else { + return pickyValidator(value); + } + }; + })(); export const isURLList = validateArrayItems(isURLEntry); -- cgit 1.3.0-6-gf8a5