UNPKG

1.23 kBPlain TextView Raw
1import * as Joi from 'joi'
2import { Extension, NumberSchema } from 'joi'
3import { AnySchemaTyped } from './joi.model'
4
5export interface ExtendedNumberSchema extends NumberSchema, AnySchemaTyped<number> {
6 dividable(q: number): this
7}
8
9export function numberExtensions(joi: typeof Joi): Extension {
10 return {
11 base: joi.number(),
12 type: 'number',
13 messages: {
14 'number.dividable': `"{{#label}}" must be dividable by {{#q}}`,
15 },
16 // validate (v, helpers) {
17 // console.log('number validate called', {v})
18 // },
19 rules: {
20 // Based on: https://github.com/hapijs/joi/blob/master/API.md#extensions
21 dividable: {
22 multi: true,
23 method(q: number) {
24 return this.$_addRule({
25 name: 'dividable',
26 args: { q },
27 })
28 },
29 args: [
30 {
31 name: 'q',
32 ref: true,
33 assert: v => typeof v === 'number' && !Number.isNaN(v),
34 message: 'must be a number',
35 },
36 ],
37 validate(v: number, helpers, args) {
38 if (v % args['q'] === 0) {
39 return v
40 }
41
42 return helpers.error('number.dividable', args)
43 },
44 },
45 },
46 }
47}