import { Validator } from "../Validator" import { Translation } from "../../i18n/Translation" import Translations from "../../i18n/Translations" export default class FediverseValidator extends Validator { public static readonly usernameAtServer: RegExp = /^@?(\w+)@((\w|\.)+)$/ constructor() { super( "fediverse", "Validates fediverse addresses and normalizes them into `@username@server`-format" ) } /** * Returns an `@username@host` * @param s */ reformat(s: string): string { if (!s.startsWith("@")) { s = "@" + s } if (s.match(FediverseValidator.usernameAtServer)) { return s } try { const url = new URL(s) const path = url.pathname if (path.match(/^\/\w+$/)) { return `@${path.substring(1)}@${url.hostname}` } } catch (e) { // Nothing to do here } return undefined } getFeedback(s: string): Translation | undefined { const match = s.match(FediverseValidator.usernameAtServer) console.log("Match:", match) if (match) { const host = match[2] try { const url = new URL("https://" + host) return undefined } catch (e) { return Translations.t.validation.fediverse.invalidHost.Subs({ host }) } } try { const url = new URL(s) const path = url.pathname if (path.match(/^\/\w+$/)) { return undefined } } catch (e) { // Nothing to do here } return Translations.t.validation.fediverse.feedback } isValid(s): boolean { return this.getFeedback(s) === undefined } }