import ms from "ms"; export abstract class TypeConverter { abstract fromString(value: string): T; abstract toString(value: T): string; abstract validate(value: string): boolean; } export abstract class StringTypeConverter extends TypeConverter { fromString(value: string): string { return value; } toString(value: string): string { return value; } validate(value: string): boolean { return typeof value === "string"; } } export abstract class NumberTypeConverter extends TypeConverter { fromString(value: string): number { return Number(value); } toString(value: number): string { return String(value); } validate(value: string): boolean { const num = Number(value); return !isNaN(num); } } export abstract class BooleanTypeConverter extends TypeConverter { fromString(value: string): boolean { return value === "true"; } toString(value: boolean): string { return value ? "true" : "false"; } validate(value: string): boolean { return value === "true" || value === "false"; } } export abstract class MsTypeConverter extends TypeConverter { fromString(value: string): ms.StringValue { return value as ms.StringValue; } toString(value: ms.StringValue): string { return String(value); } validate(value: string): boolean { try { const result = ms(value as ms.StringValue); return result !== undefined; } catch (e) { return false; } } } export abstract class EmailTypeConverter extends TypeConverter { fromString(value: string): string { return value; } toString(value: string): string { return value; } validate(value: string): boolean { var tester = /^[-!#$%&'*+\/0-9=?A-Z^_a-z`{|}~](\.?[-!#$%&'*+\/0-9=?A-Z^_a-z`{|}~])*@[a-zA-Z0-9](-*\.?[a-zA-Z0-9])*\.[a-zA-Z](-?[a-zA-Z0-9])+$/; if (!value) return false; var emailParts = value.split("@"); if (emailParts.length !== 2) return false; var account = emailParts[0]; var address = emailParts[1]; if (account.length > 64) return false; else if (address.length > 255) return false; var domainParts = address.split("."); if ( domainParts.some(function (part) { return part.length > 63; }) ) return false; return tester.test(value); } } // Konkrete Implementierungen der Converter export class StringConverter extends StringTypeConverter {} export class LongStringConverter extends StringTypeConverter {} export class UrlConverter extends StringTypeConverter {} export class NumberConverter extends NumberTypeConverter {} export class BooleanConverter extends BooleanTypeConverter {} export class MsConverter extends MsTypeConverter {} export class EmailConverter extends EmailTypeConverter {}