mirror of https://github.com/Seich/Beau.git
78 lines
2.5 KiB
JavaScript
78 lines
2.5 KiB
JavaScript
const Joi = require('joi');
|
|
const { requestRegex } = require('./shared.js');
|
|
|
|
const pluginSchema = [
|
|
Joi.string(),
|
|
Joi.object()
|
|
.keys(null)
|
|
.max(1)
|
|
];
|
|
|
|
const requestSchema = [
|
|
Joi.object()
|
|
.keys({
|
|
HEADERS: Joi.object().keys(null),
|
|
PAYLOAD: [Joi.object().keys(null), Joi.string()],
|
|
PARAMS: Joi.object().keys(null),
|
|
FORM: Joi.object().keys(null),
|
|
ALIAS: Joi.string().required(),
|
|
FORMDATA: Joi.object().keys(null)
|
|
})
|
|
.without('FORM', ['PAYLOAD', 'FORMDATA'])
|
|
.without('PAYLOAD', ['FORM', 'FORMDATA'])
|
|
.without('FORMDATA', ['FORM', 'PAYLOAD'])
|
|
.rename(/headers/i, 'HEADERS', { override: true })
|
|
.rename(/payload/i, 'PAYLOAD', { override: true })
|
|
.rename(/params/i, 'PARAMS', { override: true })
|
|
.rename(/form/i, 'FORM', { override: true })
|
|
.rename(/alias/i, 'ALIAS', { override: true }),
|
|
|
|
Joi.string()
|
|
];
|
|
|
|
const hostSchema = Joi.object()
|
|
.keys({
|
|
HOST: Joi.string().required(),
|
|
ENDPOINT: Joi.string(),
|
|
DEFAULTS: Joi.object().keys(null)
|
|
})
|
|
.pattern(requestRegex, requestSchema)
|
|
.rename(/host/i, 'HOST', { override: true })
|
|
.rename(/defaults/i, 'DEFAULTS', { override: true })
|
|
.rename(/endpoint/i, 'ENDPOINT', { override: true });
|
|
|
|
const schema = Joi.object()
|
|
.keys({
|
|
VERSION: Joi.number().integer(),
|
|
ENDPOINT: Joi.string().uri(),
|
|
PLUGINS: Joi.array().items(pluginSchema),
|
|
DEFAULTS: Joi.object(),
|
|
ENVIRONMENT: Joi.object(),
|
|
HOSTS: Joi.array().items(hostSchema),
|
|
COOKIEJAR: Joi.boolean()
|
|
})
|
|
.pattern(requestRegex, requestSchema)
|
|
.rename(/version/i, 'VERSION', { override: true })
|
|
.rename(/endpoint/i, 'ENDPOINT', { override: true })
|
|
.rename(/hosts/i, 'HOSTS', { override: true })
|
|
.rename(/plugins/i, 'PLUGINS', { override: true })
|
|
.rename(/defaults/i, 'DEFAULTS', { override: true })
|
|
.rename(/environment/i, 'ENVIRONMENT', { override: true })
|
|
.rename(/cookiejar/i, 'COOKIEJAR', { override: true });
|
|
|
|
const validate = async function(config) {
|
|
try {
|
|
await Joi.validate(config, schema, { allowUnknown: true });
|
|
return { valid: true };
|
|
} catch ({ name, details }) {
|
|
return {
|
|
valid: false,
|
|
message: `${name}: \n ${details
|
|
.map(d => d.message + ' @ ' + d.path)
|
|
.join(' \n ')}`
|
|
};
|
|
}
|
|
};
|
|
|
|
module.exports = { schema, validate };
|