init commit

This commit is contained in:
Виктор Батищев 2023-10-11 15:13:40 +03:00
commit 222077f6c2
4 changed files with 119 additions and 0 deletions

68
fieldChecks.ts Normal file
View File

@ -0,0 +1,68 @@
export class FieldCheck {
error = "";
constructor(error: string) {
this.error = error;
}
check(val: string) {
throw new Error("check() not implemented");
return "";
}
}
class FieldCheckRegex extends FieldCheck {
regex = /none/;
constructor(regex: RegExp, error: string) {
super(error);
this.regex = regex;
}
check(val: string) {
if (!this.regex.test(val)) return this.error;
return "";
}
}
class FieldCheckMaxLength extends FieldCheck {
maxLength = 0;
constructor(maxLength: number) {
super(`Максимальная длина равна ${maxLength}.`);
this.maxLength = maxLength;
}
check(val: string) {
if (val.length > this.maxLength) return this.error;
return "";
}
}
class FieldCheckMinLength extends FieldCheck {
minLength = 0;
constructor(minLength: number) {
super(`Минимальная длина равна ${minLength}.`);
this.minLength = minLength;
}
check(val: string) {
if (val.length < this.minLength) return this.error;
return "";
}
}
export class FieldChecks {
static nonEmpty = new FieldCheckRegex(/\S+/, "Поле не может быть пустым.");
static onlyLatinLettersWhitespaces = new FieldCheckRegex(/^[A-Za-z\s]+$/, "Разрешены только Латинские буквы и пробелы.");
static onlyLettersWhitespaces = new FieldCheckRegex(/^[A-Za-zА-Яа-я\s]+$/, "Разрешены только буквы и пробелы.");
static onlyLatinLettersNumbersUnderscores = new FieldCheckRegex(
/^[A-Za-z0-9_\s]+$/,
"Разрешены только Латинские буквы, цифры и нижнее подчёркивание."
);
static email = new FieldCheckRegex(/^[^\s@]+@[^\s@]+\.[^\s@]+$/, "Проверьте почтовый адрес.");
static noSpecialChars = new FieldCheckRegex(/^[A-Za-z0-9\s.,()!%]+$/, "Специальные символы не разрешены.");
static maxLength = (maxLength: number) => new FieldCheckMaxLength(maxLength);
static minLength = (minLength: number) => new FieldCheckMinLength(minLength);
}

45
formFields.ts Normal file
View File

@ -0,0 +1,45 @@
import { FieldCheck } from "./fieldChecks";
export class FieldsContainer {
fields = new Map<string, Field>();
/**
* Add field to container.
* @param {string} name - The field name.
* @param {string} value - The field value.
* @param {Array} checks - Array of necessary FieldCheck objects.
*/
addField(name: string, value: string, checks: FieldCheck[]) {
this.fields.set(name, new Field(value, checks));
}
}
export class Field {
value: string;
checks: FieldCheck[];
constructor(value: string, checks: FieldCheck[]) {
this.value = value;
this.checks = checks;
}
tryGetFirstError() {
let result = "";
this.checks.every((fieldCheck) => {
result = fieldCheck.check(this.value);
return result === ""; //break or continue every()
});
return result;
}
tryGetAllErrors() {
const result = this.checks.flatMap((fieldCheck) => {
const err = fieldCheck.check(this.value);
return err === "" ? [] : [err];
});
return result.join(", ");
}
}

4
index.d.ts vendored Normal file
View File

@ -0,0 +1,4 @@
import { FieldChecks } from "./fieldChecks";
import { Field, FieldsContainer } from "./formFields";
export { FieldChecks, Field, FieldsContainer };

2
index.ts Normal file
View File

@ -0,0 +1,2 @@
export { FieldChecks } from "./fieldChecks";
export { Field, FieldsContainer } from "./formFields";