joi icon indicating copy to clipboard operation
joi copied to clipboard

feat: implement standard schema spec

Open xballoy opened this issue 11 months ago • 5 comments

Implements standard-schema.

Fixes #3078

xballoy avatar May 29 '25 21:05 xballoy

Hi, thanks for that great PR, this seems properly implemented, I just have some doubts about async validation. It seems they advise against it, but only because of zod constraints if I got it right? I guess that'll lead to a few surprises for users.

Marsup avatar Jun 18 '25 13:06 Marsup

Hi, thanks for that great PR, this seems properly implemented, I just have some doubts about async validation. It seems they advise against it, but only because of zod constraints if I got it right? I guess that'll lead to a few surprises for users.

@Marsup from the type definition '~standard'.validate returns Result<Output> | Promise<Result<Output>> so in theory it would be possible to handle async validation. However in '~standard'.validate how should I decide to call validate() or validateAsync()? 🤔

Would it make sense to check if there are external async and do an async validation only in that case?

xballoy avatar Jun 18 '25 15:06 xballoy

That's usually up to the schema creator to decide, but an error will be thrown if an async schema is called with the sync method. Since the advent of async/await, I've honestly been thinking of sunsetting the sync api, as it's now so easy to use promises, but it seems to go against their recommendations. I guess joi could have an api that surfaces externals if that helps.

Marsup avatar Jun 18 '25 16:06 Marsup

zod seems to support async validation with the standard schema: https://github.com/colinhacks/zod/pull/3850/files#diff-f025de6d5c2512a8f3d95968437eb61a2bb34c012ca364ee2ed65adcef828b86R53

We could always use the async validation, that would:

  • simplify the implem
  • allow you to deprecate the sync validation

Or if we have an easy way to check if the schema contains an external with an async method we could call the async validation only in that case.

What do you think?

xballoy avatar Jun 18 '25 16:06 xballoy

@Marsup I updated the logic + added tests to support externals and async validation. Tell me what you think but I think it covers all cases.

xballoy avatar Jun 18 '25 21:06 xballoy

Sorry, took me a while to find some time. Is #3084 a good fit to help you with this PR?

Marsup avatar Jul 30 '25 18:07 Marsup

Sorry, took me a while to find some time. Is #3084 a good fit to help you with this PR?

@Marsup yes that would help, I'll be able to pass a flag isAsync to Validator.standard(value, this) to validate only once.

xballoy avatar Jul 30 '25 23:07 xballoy

@Marsup I rebased on master and everything works now 🎉

xballoy avatar Jul 31 '25 15:07 xballoy

Thanks a lot for your work, I'll try to release the next major soon!

Marsup avatar Jul 31 '25 16:07 Marsup