UNPKG

1.28 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 // tslint:disable-next-line:no-invalid-this
25 return this.$_addRule({
26 name: 'dividable',
27 args: { q },
28 })
29 },
30 args: [
31 {
32 name: 'q',
33 ref: true,
34 assert: v => typeof v === 'number' && !Number.isNaN(v),
35 message: 'must be a number',
36 },
37 ],
38 validate(v: number, helpers, args) {
39 if (v % args['q'] === 0) {
40 return v
41 }
42
43 return helpers.error('number.dividable', args)
44 },
45 },
46 },
47 }
48}