#3068·joi

String uri domain option does not allow Unicode when option is enabled

Author: danillouzCreated Feb 27, 2025Updated Aug 5, 2026
Labelsbug

Runtime

node.js

Runtime version

v23.7.0

Module version

17.13.3

Last module version without issue

No response

Used with

express

Any other relevant information

I found this issue: https://github.com/hapijs/joi/issues/2889

Which introduced encodeUri. But this option can't be used (while it is documented).

Is this a regression?

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

From what I understand, I should be able to use the domain option to validate URIs that contain Unicode characters (IDN): https://joi.dev/api/?v=17.13.3#stringurioptions

For example:

typescript
Joi.object({
  url: Joi.string().uri({
    allowRelative: false,
    domain: {
      allowUnicode: true,
      tlds: false,
    }
  })
})

But that does not work. Am I doing something wrong, or is this indeed a bug?

What was the result you got?

Schema:

typescript
Joi.object({
  url: Joi.string().uri({
    allowRelative: false,
    domain: {
      allowUnicode: true,
      tlds: false,
    }
  })
})

Data to validate:

{
  url: "https://ëxample.com"
}

Output:

{
  "url" /* "url" must be a valid uri */: "https://ëxample.com"
}

Sandbox reproduction:

Image

What result did you expect?

For it to validate URIs that contain IDN, when the allowUnicode domain option is enabled.

IOW: for it to behave like domain (which does work as expected)