Skip to content

Unexpected behaviour while making use of fork() and id() #2736

@wwaaijer

Description

@wwaaijer

Context

  • node version: 16.13.2
  • module version with issue: 17.6.0
  • last module version without issue: n/a
  • environment (e.g. node, browser, native): node
  • used with (e.g. hapi application, another framework, standalone, ...): standalone
  • any other relevant information: n/a

What are you trying to achieve or the steps to reproduce?

While using any.fork(paths, adjuster) on an object schema I was expecting to be able to use the key name to adjust the key schema.
Even if the schema of the key had an id assigned to it by any.id(id).

Minimal example:

const schema = Joi.object({
  myField: Joi.string().id('myId'),
})
  .fork('myField', keySchema => keySchema.required());

// Expecting `myField` to be marked as required, resulting in an error here, but validation passes.
schema.validate({});
// -> { value: {} }

Replacing myField with myId does work. That was however not what I was expecting. It seemed logical to me that fork is being applied to the object schema and therefore being able to supply the key by its name, not the id of the key schema.

More elaborate example closer to the actual use case:

// Schema definition of a recursive object. Reused in multiple other schemas.
const recursiveObjectSchema = Joi.object({
  /* complex properties with references back to this object using `Joi.link('#myId')` */
})
  .id('myId');

// A base schema for one of the models using the recursive object. Extended and forked in other places.
const baseSchema = Joi.object({
  myField: recursiveObjectSchema,
});

// Creating a more strict schema by forking the base.
const requiredKeys = ['myField'];
// Expecting to be able to use the key mentioned in the baseSchema here, not the id set in recursive schema definition 2 levels up.
const strictSchema = baseSchema.fork(requiredKeys, keySchema => keySchema.required());

const emptyObject = {};

// Expecting an error here, but not getting one
strictSchema.validate(emptyObject);
// -> { value: {} }

What was the result you got?

Not able to use fork on an object to mark a key by its name as required, where the key schema had an id assigned to it.

What result did you expect?

As mentioned in the documentation, use any.fork(paths, adjuster) to adjust the keys by their name not (just) their id.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions