Контекст для MetaFor - v1.0.3
    Preparing search index...

    Type Alias Update<C>

    Update: (values: Partial<Values<C>>) => Partial<Values<C>>

    Обновляет значения в контексте

    Обновляет только существующие ключи. Игнорирует undefined.

    it("игнорирует undefined значения", () => {
    const { context, update } = new Context((types) => ({
    name: types.string.required("Гость"),
    }))
    // @ts-expect-error - TypeScript запрещает undefined
    update({ name: undefined })
    expect(context.name, 'Поле name осталось "Гость"').toBe("Гость")
    })

    Для optional полей поддерживается установка null

    it("позволяет устанавливать null для optional полей", () => {
    const { context, update } = new Context((types) => ({
    nickname: types.string(""),
    age: types.number.optional(4),
    isActive: types.boolean.optional(false),
    tags: types.array.optional([]),
    role: types.enum("user", "admin").optional("user"),
    }))

    update({ nickname: null })
    expect(context.nickname, "Поле nickname должно обновиться на null").toBe(null)

    update({ age: null })
    expect(context.age, "Поле age должно обновиться на null").toBe(null)

    update({ isActive: null })
    expect(context.isActive, "Поле isActive должно обновиться на null").toBe(null)

    update({ tags: null })
    expect(context.tags, "Поле tags должно обновиться на null").toBe(null)

    update({ role: null })
    expect(context.role, "Поле role должно обновиться на null").toBe(null)
    })

    Type Parameters

    Type Declaration

      • (values: Partial<Values<C>>): Partial<Values<C>>
      • Parameters

        • values: Partial<Values<C>>

          Значения для обновления

        Returns Partial<Values<C>>

        Значения, которые были обновлены

    [Context.update] "{field}": поле не может быть null - при попытке установить null для required поля

    describe("не позволяет устанавливать null для required полей", () => {
    const { context, update } = new Context((types) => ({
    name: types.string.required("Гость"),
    age: types.number.required(18),
    isActive: types.boolean.required(true),
    tags: types.array.required([]),
    role: types.enum("user", "admin").required("user"),
    }))
    it("null для required string", () => {
    // @ts-expect-error - TypeScript запрещает null
    expect(() => update({ name: null })).toThrow('[Context.update] "name": поле не может быть null')
    expect(context.name, "Поле name осталось 'Гость'").toBe("Гость")
    })
    it("null для required number", () => {
    // @ts-expect-error - TypeScript запрещает null
    expect(() => update({ age: null })).toThrow('[Context.update] "age": поле не может быть null')
    expect(context.age, "Поле age осталось 18").toBe(18)
    })
    it("null для required boolean", () => {
    // @ts-expect-error - TypeScript запрещает null
    expect(() => update({ isActive: null })).toThrow('[Context.update] "isActive": поле не может быть null')
    expect(context.isActive, "Поле isActive осталось true").toBe(true)
    })
    it("null для required array", () => {
    // @ts-expect-error - TypeScript запрещает null
    expect(() => update({ tags: null })).toThrow('[Context.update] "tags": поле не может быть null')
    expect(context.tags, "Поле tags осталось []").toEqual([])
    })
    it("null для required enum", () => {
    // @ts-expect-error - TypeScript запрещает null
    expect(() => update({ role: null })).toThrow('[Context.update] "role": поле не может быть null')
    expect(context.role, "Поле role осталось 'user'").toBe("user")
    })
    })

    [Context.update] "{field}": ожидается плоский массив примитивов - при попытке установить nested массив или массив с объектами

    describe("валидация массивов", () => {
    const { context, update } = new Context((types) => ({
    tags: types.array.required([]),
    items: types.array.optional([]),
    }))
    it("nested массив", () => {
    // @ts-expect-error - TypeScript запрещает nested массив
    expect(() => update({ tags: [["nested"]] })).toThrow(
    '[Context.update] "tags": ожидается плоский массив примитивов'
    )
    expect(context.tags, "Поле tags осталось []").toEqual([])
    })
    it("массив с объектами", () => {
    // @ts-expect-error - TypeScript запрещает массив с объектами
    expect(() => update({ tags: [{ x: 1 }] })).toThrow('[Context.update] "tags": ожидается плоский массив примитивов')
    expect(context.tags, "Поле tags осталось []").toEqual([])
    })
    it("массив с функциями", () => {
    // @ts-expect-error - TypeScript запрещает массив с функциями
    expect(() => update({ tags: [function () {}] })).toThrow(
    '[Context.update] "tags": ожидается плоский массив примитивов'
    )
    expect(context.tags, "Поле tags осталось []").toEqual([])
    })
    })

    [Context.update] "{field}": объекты и функции запрещены - при попытке установить объект или функцию в примитивное поле

    describe("валидация примитивных полей", () => {
    const { context, update } = new Context((types) => ({
    name: types.string.required("test"),
    age: types.number.required(18),
    active: types.boolean.required(true),
    }))
    it("объект в string поле", () => {
    // @ts-expect-error - TypeScript запрещает объект в string поле
    expect(() => update({ name: { x: 1 } })).toThrow('[Context.update] "name": объекты и функции запрещены')
    expect(context.name, "Поле name осталось 'test'").toBe("test")
    })
    it("функция в number поле", () => {
    // @ts-expect-error - TypeScript запрещает функции в number поле
    expect(() => update({ age: function () {} })).toThrow('[Context.update] "age": объекты и функции запрещены')
    expect(context.age, "Поле age осталось 18").toBe(18)
    })
    it("массив в boolean поле", () => {
    // @ts-expect-error - TypeScript запрещает массив в boolean поле
    expect(() => update({ active: [true] })).toThrow('[Context.update] "active": объекты и функции запрещены')
    expect(context.active, "Поле active осталось true").toBe(true)
    })
    })

    [Context.update] "{field}": должно быть '{values}', получено '{value}' - при попытке установить недопустимое значение для enum поля

    describe("валидация enum полей", () => {
    const { context, update } = new Context((types) => ({
    role: types.enum("user", "admin").required("user"),
    status: types.enum("active", "inactive").optional("active"),
    }))
    it("недопустимое значение в required enum", () => {
    // @ts-expect-error - TypeScript запрещает значения, не входящие в enum
    expect(() => update({ role: "guest" })).toThrow(
    "[Context.update] \"role\": должно быть 'user' или 'admin', получено 'guest'"
    )
    expect(context.role, "Поле role осталось 'user'").toBe("user")
    })
    it("недопустимое значение в optional enum", () => {
    // @ts-expect-error - TypeScript запрещает значения, не входящие в enum
    expect(() => update({ status: "pending" })).toThrow(
    "[Context.update] \"status\": должно быть 'active' или 'inactive', получено 'pending'"
    )
    expect(context.status, "Поле status осталось 'active'").toBe("active")
    })
    })