MetaFor - v0.3.1
    Preparing search index...

    Variable typesConst

    types: {
        string: (
            defaultValue?: string,
        ) => (
            options?: { title?: string },
        ) => {
            type: "string";
            required: false;
            default: undefined | string;
            title?: string;
        } & { type: "string"; required: false; default: undefined
        | string } & {
            required: (
                defaultValue?: string,
            ) => (
                options?: { title?: string },
            ) => {
                type: "string";
                required: true;
                default: undefined | string;
                title?: string;
            } & { type: "string"; required: true; default: undefined
            | string };
            optional: (
                defaultValue?: string,
            ) => (
                options?: { title?: string },
            ) => {
                type: "string";
                required: false;
                default: undefined | string;
                title?: string;
            } & { type: "string"; required: false; default: undefined
            | string };
        };
        number: (
            defaultValue?: number,
        ) => (
            options?: { title?: string },
        ) => {
            type: "number";
            required: false;
            default: undefined | number;
            title?: string;
        } & { type: "number"; required: false; default: undefined
        | number } & {
            required: (
                defaultValue?: number,
            ) => (
                options?: { title?: string },
            ) => {
                type: "number";
                required: true;
                default: undefined | number;
                title?: string;
            } & { type: "number"; required: true; default: undefined
            | number };
            optional: (
                defaultValue?: number,
            ) => (
                options?: { title?: string },
            ) => {
                type: "number";
                required: false;
                default: undefined | number;
                title?: string;
            } & { type: "number"; required: false; default: undefined
            | number };
        };
        boolean: (
            defaultValue?: boolean,
        ) => (
            options?: { title?: string },
        ) => {
            type: "boolean";
            required: false;
            default: undefined | boolean;
            title?: string;
        } & { type: "boolean"; required: false; default: undefined
        | boolean } & {
            required: (
                defaultValue?: boolean,
            ) => (
                options?: { title?: string },
            ) => {
                type: "boolean";
                required: true;
                default: undefined | boolean;
                title?: string;
            } & { type: "boolean"; required: true; default: undefined
            | boolean };
            optional: (
                defaultValue?: boolean,
            ) => (
                options?: { title?: string },
            ) => {
                type: "boolean";
                required: false;
                default: undefined | boolean;
                title?: string;
            } & { type: "boolean"; required: false; default: undefined
            | boolean };
        };
        array: (
            defaultValue?: any[],
        ) => (
            options?: { title?: string },
        ) => {
            type: "array";
            required: false;
            default: undefined | any[];
            title?: string;
        } & { type: "array"; required: false; default: undefined
        | any[] } & {
            required: (
                defaultValue?: any[],
            ) => (
                options?: { title?: string },
            ) => {
                type: "array";
                required: true;
                default: undefined | any[];
                title?: string;
            } & { type: "array"; required: true; default: undefined
            | any[] };
            optional: (
                defaultValue?: any[],
            ) => (
                options?: { title?: string },
            ) => {
                type: "array";
                required: false;
                default: undefined | any[];
                title?: string;
            } & { type: "array"; required: false; default: undefined
            | any[] };
        };
        enum: <const T extends readonly (string | number)[]>(
            ...values: T,
        ) => (
            defaultValue?: T[number],
        ) => (
            options?: { title?: string },
        ) => {
            type: "enum";
            required: false;
            values: T;
            default: undefined | T[number];
            title?: string;
        } & {
            type: "enum";
            required: false;
            values: T;
            default: undefined
            | T[number];
        } & {
            required: (
                defaultValue?: T[number],
            ) => (
                options?: { title?: string },
            ) => {
                type: "enum";
                required: true;
                values: T;
                default: undefined | T[number];
                title?: string;
            } & {
                type: "enum";
                required: true;
                values: T;
                default: undefined
                | T[number];
            };
            optional: (
                defaultValue?: T[number],
            ) => (
                options?: { title?: string },
            ) => {
                type: "enum";
                required: false;
                values: T;
                default: undefined | T[number];
                title?: string;
            } & {
                type: "enum";
                required: false;
                values: T;
                default: undefined
                | T[number];
            };
        };
    } = ...

    Фабрика типов для создания схемы контекста

    Предоставляет методы для создания типизированных полей контекста:

    • string - строковые значения
    • number - числовые значения
    • boolean - булевы значения
    • array - массивы (рекомендуется хранить только ID)
    • enum - перечисления

    Каждый тип поддерживает методы .required() и .optional() для указания обязательности поля.

    import { test, expect } from "bun:test"
    import { types, createContext } from "../index"

    test("Создание контекста с базовыми типами", () => {
    const { context } = createContext({
    name: types.string.required("Гость")({ title: "Имя пользователя" }),
    age: types.number.optional()({ title: "Возраст" }),
    isActive: types.boolean.required(true)({ title: "Активен" }),
    role: types.enum("user", "admin", "moderator").required("user")({ title: "Роль" }),
    tags: types.array.optional()({ title: "Теги" }),
    description: types.string.optional(), // без title
    })

    // Проверяем значения
    expect(context.name, "Поле name должно быть 'Гость'").toBe("Гость")
    expect(context.age, "Поле age должно быть null").toBe(null)
    expect(context.isActive, "Поле isActive должно быть true").toBe(true)
    expect(context.role, "Поле role должно быть 'user'").toBe("user")
    expect(context.tags, "Поле tags должно быть null").toBe(null)
    expect(context.description, "Поле description должно быть null").toBe(null)

    // Проверяем метаданные
    expect(context._title.name, "Метаданные name должны быть доступны").toBe("Имя пользователя")
    expect(context._title.age, "Метаданные age должны быть доступны").toBe("Возраст")
    expect(context._title.isActive, "Метаданные isActive должны быть доступны").toBe("Активен")
    expect(context._title.role, "Метаданные role должны быть доступны").toBe("Роль")
    expect(context._title.tags, "Метаданные tags должны быть доступны").toBe("Теги")
    expect(context._title.description, "Метаданные description должны быть пустой строкой").toBe("")
    })

    Type declaration

    • string: (
          defaultValue?: string,
      ) => (
          options?: { title?: string },
      ) => {
          type: "string";
          required: false;
          default: undefined | string;
          title?: string;
      } & { type: "string"; required: false; default: undefined
      | string } & {
          required: (
              defaultValue?: string,
          ) => (
              options?: { title?: string },
          ) => {
              type: "string";
              required: true;
              default: undefined | string;
              title?: string;
          } & { type: "string"; required: true; default: undefined
          | string };
          optional: (
              defaultValue?: string,
          ) => (
              options?: { title?: string },
          ) => {
              type: "string";
              required: false;
              default: undefined | string;
              title?: string;
          } & { type: "string"; required: false; default: undefined
          | string };
      }

      Создает строковый тип

      Значение по умолчанию (создает optional тип)

      Объект с методами required() и optional()

      // Обязательное поле
      name: types.string.required("Anonymous")

      // Опциональное поле
      email: types.string.optional()

      // С дефолтным значением
      title: types.string("Default Title")
    • number: (
          defaultValue?: number,
      ) => (
          options?: { title?: string },
      ) => {
          type: "number";
          required: false;
          default: undefined | number;
          title?: string;
      } & { type: "number"; required: false; default: undefined
      | number } & {
          required: (
              defaultValue?: number,
          ) => (
              options?: { title?: string },
          ) => {
              type: "number";
              required: true;
              default: undefined | number;
              title?: string;
          } & { type: "number"; required: true; default: undefined
          | number };
          optional: (
              defaultValue?: number,
          ) => (
              options?: { title?: string },
          ) => {
              type: "number";
              required: false;
              default: undefined | number;
              title?: string;
          } & { type: "number"; required: false; default: undefined
          | number };
      }

      Создает числовой тип

      Значение по умолчанию (создает optional тип)

      Объект с методами required() и optional()

      // Обязательное поле
      age: types.number.required(18)

      // Опциональное поле
      score: types.number.optional()

      // С дефолтным значением
      count: types.number(0)
    • boolean: (
          defaultValue?: boolean,
      ) => (
          options?: { title?: string },
      ) => {
          type: "boolean";
          required: false;
          default: undefined | boolean;
          title?: string;
      } & { type: "boolean"; required: false; default: undefined
      | boolean } & {
          required: (
              defaultValue?: boolean,
          ) => (
              options?: { title?: string },
          ) => {
              type: "boolean";
              required: true;
              default: undefined | boolean;
              title?: string;
          } & { type: "boolean"; required: true; default: undefined
          | boolean };
          optional: (
              defaultValue?: boolean,
          ) => (
              options?: { title?: string },
          ) => {
              type: "boolean";
              required: false;
              default: undefined | boolean;
              title?: string;
          } & { type: "boolean"; required: false; default: undefined
          | boolean };
      }

      Создает булевый тип

      Значение по умолчанию (создает optional тип)

      Объект с методами required() и optional()

      // Обязательное поле
      isActive: types.boolean.required(false)

      // Опциональное поле
      isVerified: types.boolean.optional()

      // С дефолтным значением
      enabled: types.boolean(true)
    • array: (
          defaultValue?: any[],
      ) => (
          options?: { title?: string },
      ) => {
          type: "array";
          required: false;
          default: undefined | any[];
          title?: string;
      } & { type: "array"; required: false; default: undefined
      | any[] } & {
          required: (
              defaultValue?: any[],
          ) => (
              options?: { title?: string },
          ) => {
              type: "array";
              required: true;
              default: undefined | any[];
              title?: string;
          } & { type: "array"; required: true; default: undefined
          | any[] };
          optional: (
              defaultValue?: any[],
          ) => (
              options?: { title?: string },
          ) => {
              type: "array";
              required: false;
              default: undefined | any[];
              title?: string;
          } & { type: "array"; required: false; default: undefined
          | any[] };
      }

      Создает тип массива

      Значение по умолчанию (создает optional тип)

      Объект с методами required() и optional()

      // Обязательное поле
      userIds: types.array.required([])

      // Опциональное поле
      tags: types.array.optional()

      // С дефолтным значением
      items: types.array(["default"])
    • enum: <const T extends readonly (string | number)[]>(
          ...values: T,
      ) => (
          defaultValue?: T[number],
      ) => (
          options?: { title?: string },
      ) => {
          type: "enum";
          required: false;
          values: T;
          default: undefined | T[number];
          title?: string;
      } & {
          type: "enum";
          required: false;
          values: T;
          default: undefined
          | T[number];
      } & {
          required: (
              defaultValue?: T[number],
          ) => (
              options?: { title?: string },
          ) => {
              type: "enum";
              required: true;
              values: T;
              default: undefined | T[number];
              title?: string;
          } & {
              type: "enum";
              required: true;
              values: T;
              default: undefined
              | T[number];
          };
          optional: (
              defaultValue?: T[number],
          ) => (
              options?: { title?: string },
          ) => {
              type: "enum";
              required: false;
              values: T;
              default: undefined | T[number];
              title?: string;
          } & {
              type: "enum";
              required: false;
              values: T;
              default: undefined
              | T[number];
          };
      }

      Создает тип перечисления

      // Обязательное поле
      status: types.enum("pending", "active", "blocked").required("pending")

      // Опциональное поле
      theme: types.enum("light", "dark").optional()

      // С дефолтным значением
      role: types.enum("user", "admin")("user")
    .context((types) => ({
    // Обязательные поля
    name: types.string.required("Anonymous"),
    age: types.number.required(18),
    isActive: types.boolean.required(false),

    // Опциональные поля
    email: types.string.optional(),
    avatar: types.string.optional(),

    // Массивы (храним только ID)
    userIds: types.array.required([]),

    // Enum
    status: types.enum.required(["pending", "active", "blocked"]),
    }))