Skip to content

Instantly share code, notes, and snippets.

@jesusgoku
Last active March 18, 2021 03:24
Show Gist options
  • Save jesusgoku/1c074fb69f5969d6013bfe310b7fa6bf to your computer and use it in GitHub Desktop.
Save jesusgoku/1c074fb69f5969d6013bfe310b7fa6bf to your computer and use it in GitHub Desktop.
Joi Extensions
/* 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,
};
/* 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