2025-04-20 15:32:57 +02:00
|
|
|
import ms from "ms";
|
|
|
|
|
|
|
|
export abstract class TypeConverter<T> {
|
|
|
|
abstract fromString(value: string): T;
|
|
|
|
abstract toString(value: T): string;
|
|
|
|
abstract validate(value: string): boolean;
|
|
|
|
}
|
|
|
|
|
|
|
|
export abstract class StringTypeConverter extends TypeConverter<string> {
|
|
|
|
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<number> {
|
|
|
|
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<boolean> {
|
|
|
|
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<ms.StringValue> {
|
|
|
|
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;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-04-25 12:13:26 +02:00
|
|
|
export abstract class EmailTypeConverter extends TypeConverter<string> {
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-04-20 15:32:57 +02:00
|
|
|
// 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 {}
|
2025-04-25 12:13:26 +02:00
|
|
|
export class EmailConverter extends EmailTypeConverter {}
|