#3070·joi

Problem serializing URL classes when stringifying a value

Author: damusixCreated Mar 10, 2025Updated Mar 30, 2026
Labelsbug

Runtime

nodejs

Runtime version

22.14 and 20.15

Module version

17.13.3

Last module version without issue

No response

Used with

hapi application

Any other relevant information

When validating something with a class, the JSON validator throws an error whenever a URL instance is present.

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

const Joi = require('joi');

const someSchema = Joi.object({
    type: Joi.string().required(),
}).unknown(false);

const configs = [
    {
        someUrl: new URL('https://some-url.com')
    }
]

Joi.assert(
    configs,
    Joi.array().items(someSchema)
);

What was the result you got?


TypeError: Receiver must be an instance of class URL
    at URL.toJSON (node:internal/url:1136:10)
    at JSON.stringify (<anonymous>)
    at internals.safeStringify (/repos/joibug/node_modules/joi/lib/annotate.js:93:17)
    at exports.error [as annotate] (/repos/joibug/node_modules/joi/lib/annotate.js:70:29)
    at internals.assert (/repos/joibug/node_modules/joi/lib/index.js:236:78)
    at Object.assert (/repos/joibug/node_modules/joi/lib/index.js:102:19)
    at Object.<anonymous> (/repos/joibug/index.js:14:5)
    at Module._compile (node:internal/modules/cjs/loader:1554:14)
    at Object..js (node:internal/modules/cjs/loader:1706:10)
    at Module.load (node:internal/modules/cjs/loader:1289:32)

Node.js v22.14.0

What result did you expect?

/repos/joibug/node_modules/joi/lib/index.js:243
    throw error;
    ^

Error [ValidationError]: [
  {
    "someUrl": "...",
    "type" [1]: -- missing --
  }
]

[1] "[0].type" is required
    at exports.process (/repos/joibug/node_modules/joi/lib/errors.js:193:16)
    at internals.entry (/repos/joibug/node_modules/joi/lib/validator.js:250:26)
    at exports.entry (/repos/joibug/node_modules/joi/lib/validator.js:27:30)
    at internals.Base.validate (/repos/joibug/node_modules/joi/lib/base.js:548:26)
    at internals.assert (/repos/joibug/node_modules/joi/lib/index.js:225:27)
    at Object.assert (/repos/joibug/node_modules/joi/lib/index.js:102:19)
    at Object.<anonymous> (/repos/joibug/index.js:14:5)
    at Module._compile (node:internal/modules/cjs/loader:1554:14)
    at Object..js (node:internal/modules/cjs/loader:1706:10)
    at Module.load (node:internal/modules/cjs/loader:1289:32) {
  _original: [ { someUrl: '...' } ],
  details: [
    {
      message: '"[0].type" is required',
      path: [ 0, 'type' ],
      type: 'any.required',
      context: { label: '[0].type', key: 'type' }
    }
  ]
}

Node.js v22.14.0