Last active
March 18, 2021 03:24
-
-
Save jesusgoku/1c074fb69f5969d6013bfe310b7fa6bf to your computer and use it in GitHub Desktop.
Joi Extensions
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* eslint-disable consistent-return */ | |
function joiExtensionJson(joi) { | |
return { | |
type: 'json', | |
base: joi.any(), | |
messages: { | |
'json.base': '{{#label}} is not a valid json', | |
'json.schema': '{{#label}} does not meet schema. ({{#error}})', | |
}, | |
coerce(value, helpers) { | |
const rule = helpers.schema.$_getRule('parse'); | |
if (!rule) { | |
return; | |
} | |
return { value: JSON.parse(value) }; | |
}, | |
validate(value, helpers) { | |
try { | |
if (typeof value === 'string') JSON.parse(value); | |
} catch (err) { | |
return { value, errors: helpers.error('json.base') }; | |
} | |
}, | |
rules: { | |
schema: { | |
convert: false, | |
method(schema) { | |
return this.$_addRule({ name: 'schema', args: { schema } }); | |
}, | |
validate(value, helpers, args) { | |
let data; | |
try { | |
data = typeof value === 'string' ? JSON.parse(value) : value; | |
} catch (err) { | |
return helpers.error('json.schema', { error: 'Parse error' }); | |
} | |
const { error } = args.schema.validate(data); | |
if (error) { | |
return helpers.error('json.schema', { error }); | |
} | |
return value; | |
}, | |
}, | |
parse: { | |
convert: true, | |
// eslint-disable-next-line no-shadow | |
method() { | |
return this.$_addRule({ name: 'parse' }); | |
}, | |
}, | |
}, | |
}; | |
} | |
module.exports = { | |
extension: joiExtensionJson, | |
}; |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* eslint-disable consistent-return */ | |
const { validate, format, clean } = require('rut.js'); | |
const RUT_FORMAT = { | |
CLEAN: 'CLEAN', | |
ONLY_DASH: 'DASH', | |
DOTS_AND_DASH: 'DOTS_AND_DASH', | |
}; | |
function joiExtensionRut(joi) { | |
return { | |
type: 'rut', | |
base: joi.string(), | |
messages: { | |
'rut.base': '{{#label}} is not a valid rut', | |
}, | |
coerce(value, helpers) { | |
const rule = helpers.schema.$_getRule('format'); | |
if (!rule) { | |
return; | |
} | |
let formattedRut; | |
switch (rule.args.format) { | |
case RUT_FORMAT.CLEAN: | |
formattedRut = clean(value); | |
break; | |
case RUT_FORMAT.DOTS_AND_DASH: | |
formattedRut = format(value); | |
break; | |
case RUT_FORMAT.ONLY_DASH: | |
formattedRut = format(value).replace(/\./g, ''); | |
break; | |
default: | |
formattedRut = format(value); | |
} | |
return { value: formattedRut }; | |
}, | |
validate(value, helpers) { | |
if (!validate(value)) { | |
return { value, errors: helpers.error('rut.base') }; | |
} | |
}, | |
rules: { | |
format: { | |
convert: true, | |
// eslint-disable-next-line no-shadow | |
method(format) { | |
return this.$_addRule({ name: 'format', args: { format } }); | |
}, | |
}, | |
}, | |
}; | |
} | |
module.exports = { | |
extension: joiExtensionRut, | |
RUT_FORMAT, | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment