Core
AField<T>
Core abstract class for all possible fields. Configs present in its initialization context can be applied to any field and will work the same.
const field: AField<number> = new NumberField({
/* Marks field as getter which should not be expected in data during conversion */
isCalculated: false,
/* Marks that field can have null or undefined as value
and this should NOT be considered as corruption*/
isNullable: false,
/* Validates provided value based on field validation settings */
validators: [
value => {
if (value % 2 === 0) return; // #Return#
return { code: 666, message: `Odd number`, value };
}
]
});
Calculated
Marks that value is calculated by getter and will NOT be present in data.
class User {
public id: number;
public name: string;
public get formatted() { return `${this.id} | ${this.name}`; }
}
const formattedField = new StringField({ isCalculated: true });
const USER_META = new ObjectMeta({
builder: User,
fields: {
id: new NumberField(),
name: new StringField(),
formatted: formattedField,
}
});
const users = [
{
id: 1,
name: `Masha`,
}
];
const result = JTC.convert({
id: `Calculated`,
meta: new ObjectArrayMeta({ meta: USER_META }),
values: users
});
/* true */
console.log(formattedField.isCalculated);
/* false */
console.log(result.isCorrupted);
/* 1 | Masha */
console.log(result.converted.all[0].formatted);
Nullable
Marks that value can be null or undefined and this should NOT be considered as corruption.
enum ERole {
user = `user`,
admin = `admin`,
}
class User {
public id: number;
public name?: string;
public age?: number = null;
public role: ERole = ERole.user;
}
const roleField = new StringField({ isNullable: true });
const USER_META = new ObjectMeta({
builder: User,
fields: {
id: new NumberField(),
name: new StringField({ isNullable: true }),
age: new NumberField({ isNullable: true }),
role: roleField,
}
});
const users = [
{
id: 1,
name: `Masha`,
},
{
id: 2,
age: 21
},
{
id: 3,
name: null,
role: ERole.admin,
},
];
const result = JTC.convert({
id: `Nullable`,
meta: new ObjectArrayMeta({ meta: USER_META }),
values: users
});
/* true */
console.log(roleField.isNullable);
/* false */
console.log(result.isCorrupted);
/* { id: 1, name: 'Masha', age: null, role: 'user' } */
console.log(result.converted.all[0]);
/* { id: 2, age: 21, role: 'user' } */
console.log(result.converted.all[1]);
/* { id: 3, age: null, role: 'admin' } */
console.log(result.converted.all[2]);
Validators
Array of functions which check incoming value and returns nothing if it is valid or object with info describing invalidity.
class User {
public id: number;
public name: string;
}
const digitsCountValidator: (count: number) => TValidator<number> =
(count: number) => (value: number) => {
if (`${value}`.length != count) {
return {
code: 666,
message: `Should consist of ${count} digits`,
value,
}
}
};
const wordsCountValidator: (count: number) => TValidator<string> =
(count: number) => (value: string) => {
if (value.split(` `).length != count) {
return {
code: 333,
message: `Should consist of ${count} words`,
value,
}
}
};
const idField = new NumberField({
validators: [
digitsCountValidator(6)
]
});
const nameField = new StringField({
validators: [
wordsCountValidator(3),
]
});
const USER_META = new ObjectMeta({
builder: User,
fields: {
id: idField,
name: nameField,
}
});
const users = [
{
id: 1,
name: `Masha`,
},
{
id: 222222,
name: `Petya`,
},
{
id: 3333,
name: `Petrov Eugene Vasilievich`,
},
{
id: 444444,
name: `Holubiev Andrii Mykolayovych`,
}
];
const result = JTC.convert({
id: `Calculated`,
meta: new ObjectArrayMeta({ meta: USER_META }),
values: users
});
const log = JTC.log.asString(result.tree);
/* true */
console.log(result.isCorrupted);
/* 0 -> id -> 1 | Should consist of 6 digits
0 -> name -> Masha | Should consist of 3 words
1 -> name -> Petya | Should consist of 3 words
2 -> id -> 3333 | Should consist of 6 digits
*/
console.log(log);
const idErrors = idField.validate({ value: 1 }).errors;
const nameErrors = nameField.validate({ value: `Masha` }).errors;
/* [ { code: 666, message: 'Should consist of 6 digits', value: 1 } ] */
console.log(idErrors);
/* [ { code: 333, message: 'Should consist of 3 words', value: 'Masha' } ] */
console.log(nameErrors);
Last updated
Was this helpful?