π Frequently Asked Questions (FAQ)
π Welcome to
tdv-monorepo, the future of model validation in TypeScript.Leveraging TypeScript decorators,
tdv-monorepooffers a declarative way to manage model validation. Suitable for both client-side and server-side projects, it comes with built-in extensibility and localization support.
- powered by TypeScript's stage-3 decorators (type-safety included)
 - small in bundle size with no dependencies
 - built-in i18n localization support to supply the messages in the user's native language
 - well-documented code and extensive guides for making it easy to get started
 - designed to play nice with popular testing frameworks like Jest
 - integrates seamlessly within any native TypeScript v5+ project
 - provides a clean and declarative way of validating form fields
 - exports Reflection namespace containing useful reflection-related methods
 
- Features
 - Content
 - Installation
 - Quick start
 - Supported Frameworks
 - Documentation
 - Contribution
 - Future goals
 - Examples
 - Repository architecture
 
npm install -d typescript@latest
npm install tdv-core
npm install tdv-react # when using in framework-specific environmentimport {
  validate,
  collection,
  ValidationEngine,
  Localization,
  TdvCore,
} from "tdv-core";
function MinSize(min: number, groups: TdvCore.Validation.Groups = []) {
  return validate<string>({
    groups,
    isValid: (value: string, _parent: Foo, _locale: Localization.Locale) => ({
      key: "MinSize",
      valid: value.length >= min,
      message: `Input must contain at least ${min} characters`,
    }),
  });
}
class Foo {
  @collection.string.Email() // predefined
  @MinSize(10) // custom
  email!: string;
}
const engine = new ValidationEngine(Foo);
const result = engine.validate({ email: "invalid" });
console.log(result.errors.email);
// [ 'Input must contain at least 10 characters', 'Value is not a valid email' ]- view React implementation
 - Angular
 - Svelte
 - Vue
 
To contribute, simply clone the main branch, commit changes to a local branch and open pull request.
Branch will be ready for merge after all CI tests pass and a review has been made.
- Implement strict type checking
 - Implement predefined decorator validators
 - Provide source code documentation
 - Implement concise tests for various scenarios
 - Build implementation packages for popular front-end frameworks
 
A basic TypeScript form can look something like
import { decorate, ValidationEngine } from "tdv-core";
/**
 *  This is an optional layer of abstraction if the class contains complex
 *  validation evaluations which shouldn't be registered as properties.
 *  In this example the "passwordsMatch" field isn't a settable property.
 */
export type UserFormFields = {
  confirmPassword: string;
  firstName: string;
  lastName: string;
  password: string;
  url: string;
  age: number;
};
export default class UserForm implements UserFormFields {
  @collection.string.MinLength(5)
  @collection.string.Required()
  firstName!: string;
  @collection.string.Required()
  lastName!: string;
  @collection.string.Required()
  @collection.string.Password()
  password!: string;
  confirmPassword!: string;
  @collection.string.URL()
  url!: string;
  @collection.number.ValueRange({ min: 18, max: 100 })
  age!: number;
  @collection.boolean.Truthy("Passwords must match")
  get passwordsMatch(): boolean {
    return this.password === this.confirmPassword;
  }
}And a sample value of type UserForm may look something like
const dummy: Partial<UserFormFields> = {
  firstName: "",
  lastName: "",
  password: "12345",
  confirmPassword: "",
  url: "",
  age: 10,
};Now we can inspect the errors of the given sample value
const engine = new ValidationEngine(UserForm);
const { errors } = engine.validate(dummy);
console.log(errors);And the result is
{
  firstName: [
    "Field is mandatory",
    "Field must contain at least 5 characters"
  ],
  lastName: [
    "Field is mandatory"
  ],
  password: [
    "Password must be at least 8 characters long"
  ],
  url: [
    // EMPTY
  ],
  age: [
    "Value must be greater than or equal to 18 and less than or equal to 100 but is 10"
  ],
  passwordsMatch: [
    "Passwords must match"
  ]
}The tdv-core package is the backbone, providing core validation logic that's framework-agnostic. Features include:
- A decorator factory for easy integration with TypeScript
 - Metadata management for dynamic behavior
 - Localization support
 - Built-in validators like 
Email,Required, etc. 
The core package serves as the foundation for implementation libraries like tdv-react, with future extensions planned for Angular, Vue, and Svelte. This modular design ensures that the core logic remains framework-agnostic, allowing for easy adaptability.