You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
303 lines
7.9 KiB
303 lines
7.9 KiB
'use strict';
|
|
|
|
const Joi = require('./index');
|
|
|
|
|
|
const internals = {};
|
|
|
|
|
|
// Preferences
|
|
|
|
internals.wrap = Joi.string()
|
|
.min(1)
|
|
.max(2)
|
|
.allow(false);
|
|
|
|
|
|
exports.preferences = Joi.object({
|
|
allowUnknown: Joi.boolean(),
|
|
abortEarly: Joi.boolean(),
|
|
artifacts: Joi.boolean(),
|
|
cache: Joi.boolean(),
|
|
context: Joi.object(),
|
|
convert: Joi.boolean(),
|
|
dateFormat: Joi.valid('date', 'iso', 'string', 'time', 'utc'),
|
|
debug: Joi.boolean(),
|
|
errors: {
|
|
escapeHtml: Joi.boolean(),
|
|
label: Joi.valid('path', 'key', false),
|
|
language: [
|
|
Joi.string(),
|
|
Joi.object().ref()
|
|
],
|
|
render: Joi.boolean(),
|
|
stack: Joi.boolean(),
|
|
wrap: {
|
|
label: internals.wrap,
|
|
array: internals.wrap,
|
|
string: internals.wrap
|
|
}
|
|
},
|
|
externals: Joi.boolean(),
|
|
messages: Joi.object(),
|
|
noDefaults: Joi.boolean(),
|
|
nonEnumerables: Joi.boolean(),
|
|
presence: Joi.valid('required', 'optional', 'forbidden'),
|
|
skipFunctions: Joi.boolean(),
|
|
stripUnknown: Joi.object({
|
|
arrays: Joi.boolean(),
|
|
objects: Joi.boolean()
|
|
})
|
|
.or('arrays', 'objects')
|
|
.allow(true, false),
|
|
warnings: Joi.boolean()
|
|
})
|
|
.strict();
|
|
|
|
|
|
// Extensions
|
|
|
|
internals.nameRx = /^[a-zA-Z0-9]\w*$/;
|
|
|
|
|
|
internals.rule = Joi.object({
|
|
alias: Joi.array().items(Joi.string().pattern(internals.nameRx)).single(),
|
|
args: Joi.array().items(
|
|
Joi.string(),
|
|
Joi.object({
|
|
name: Joi.string().pattern(internals.nameRx).required(),
|
|
ref: Joi.boolean(),
|
|
assert: Joi.alternatives([
|
|
Joi.function(),
|
|
Joi.object().schema()
|
|
])
|
|
.conditional('ref', { is: true, then: Joi.required() }),
|
|
normalize: Joi.function(),
|
|
message: Joi.string().when('assert', { is: Joi.function(), then: Joi.required() })
|
|
})
|
|
),
|
|
convert: Joi.boolean(),
|
|
manifest: Joi.boolean(),
|
|
method: Joi.function().allow(false),
|
|
multi: Joi.boolean(),
|
|
validate: Joi.function()
|
|
});
|
|
|
|
|
|
exports.extension = Joi.object({
|
|
type: Joi.alternatives([
|
|
Joi.string(),
|
|
Joi.object().regex()
|
|
])
|
|
.required(),
|
|
args: Joi.function(),
|
|
cast: Joi.object().pattern(internals.nameRx, Joi.object({
|
|
from: Joi.function().maxArity(1).required(),
|
|
to: Joi.function().minArity(1).maxArity(2).required()
|
|
})),
|
|
base: Joi.object().schema()
|
|
.when('type', { is: Joi.object().regex(), then: Joi.forbidden() }),
|
|
coerce: [
|
|
Joi.function().maxArity(3),
|
|
Joi.object({ method: Joi.function().maxArity(3).required(), from: Joi.array().items(Joi.string()).single() })
|
|
],
|
|
flags: Joi.object().pattern(internals.nameRx, Joi.object({
|
|
setter: Joi.string(),
|
|
default: Joi.any()
|
|
})),
|
|
manifest: {
|
|
build: Joi.function().arity(2)
|
|
},
|
|
messages: [Joi.object(), Joi.string()],
|
|
modifiers: Joi.object().pattern(internals.nameRx, Joi.function().minArity(1).maxArity(2)),
|
|
overrides: Joi.object().pattern(internals.nameRx, Joi.function()),
|
|
prepare: Joi.function().maxArity(3),
|
|
rebuild: Joi.function().arity(1),
|
|
rules: Joi.object().pattern(internals.nameRx, internals.rule),
|
|
terms: Joi.object().pattern(internals.nameRx, Joi.object({
|
|
init: Joi.array().allow(null).required(),
|
|
manifest: Joi.object().pattern(/.+/, [
|
|
Joi.valid('schema', 'single'),
|
|
Joi.object({
|
|
mapped: Joi.object({
|
|
from: Joi.string().required(),
|
|
to: Joi.string().required()
|
|
})
|
|
.required()
|
|
})
|
|
])
|
|
})),
|
|
validate: Joi.function().maxArity(3)
|
|
})
|
|
.strict();
|
|
|
|
|
|
exports.extensions = Joi.array().items(Joi.object(), Joi.function().arity(1)).strict();
|
|
|
|
|
|
// Manifest
|
|
|
|
internals.desc = {
|
|
|
|
buffer: Joi.object({
|
|
buffer: Joi.string()
|
|
}),
|
|
|
|
func: Joi.object({
|
|
function: Joi.function().required(),
|
|
options: {
|
|
literal: true
|
|
}
|
|
}),
|
|
|
|
override: Joi.object({
|
|
override: true
|
|
}),
|
|
|
|
ref: Joi.object({
|
|
ref: Joi.object({
|
|
type: Joi.valid('value', 'global', 'local'),
|
|
path: Joi.array().required(),
|
|
separator: Joi.string().length(1).allow(false),
|
|
ancestor: Joi.number().min(0).integer().allow('root'),
|
|
map: Joi.array().items(Joi.array().length(2)).min(1),
|
|
adjust: Joi.function(),
|
|
iterables: Joi.boolean(),
|
|
in: Joi.boolean(),
|
|
render: Joi.boolean()
|
|
})
|
|
.required()
|
|
}),
|
|
|
|
regex: Joi.object({
|
|
regex: Joi.string().min(3)
|
|
}),
|
|
|
|
special: Joi.object({
|
|
special: Joi.valid('deep').required()
|
|
}),
|
|
|
|
template: Joi.object({
|
|
template: Joi.string().required(),
|
|
options: Joi.object()
|
|
}),
|
|
|
|
value: Joi.object({
|
|
value: Joi.alternatives([Joi.object(), Joi.array()]).required()
|
|
})
|
|
};
|
|
|
|
|
|
internals.desc.entity = Joi.alternatives([
|
|
Joi.array().items(Joi.link('...')),
|
|
Joi.boolean(),
|
|
Joi.function(),
|
|
Joi.number(),
|
|
Joi.string(),
|
|
internals.desc.buffer,
|
|
internals.desc.func,
|
|
internals.desc.ref,
|
|
internals.desc.regex,
|
|
internals.desc.special,
|
|
internals.desc.template,
|
|
internals.desc.value,
|
|
Joi.link('/')
|
|
]);
|
|
|
|
|
|
internals.desc.values = Joi.array()
|
|
.items(
|
|
null,
|
|
Joi.boolean(),
|
|
Joi.function(),
|
|
Joi.number().allow(Infinity, -Infinity),
|
|
Joi.string().allow(''),
|
|
Joi.symbol(),
|
|
internals.desc.buffer,
|
|
internals.desc.func,
|
|
internals.desc.override,
|
|
internals.desc.ref,
|
|
internals.desc.regex,
|
|
internals.desc.template,
|
|
internals.desc.value
|
|
);
|
|
|
|
|
|
internals.desc.messages = Joi.object()
|
|
.pattern(/.+/, [
|
|
Joi.string(),
|
|
internals.desc.template,
|
|
Joi.object().pattern(/.+/, [Joi.string(), internals.desc.template])
|
|
]);
|
|
|
|
|
|
exports.description = Joi.object({
|
|
type: Joi.string().required(),
|
|
flags: Joi.object({
|
|
cast: Joi.string(),
|
|
default: Joi.any(),
|
|
description: Joi.string(),
|
|
empty: Joi.link('/'),
|
|
failover: internals.desc.entity,
|
|
id: Joi.string(),
|
|
label: Joi.string(),
|
|
only: true,
|
|
presence: ['optional', 'required', 'forbidden'],
|
|
result: ['raw', 'strip'],
|
|
strip: Joi.boolean(),
|
|
unit: Joi.string()
|
|
})
|
|
.unknown(),
|
|
preferences: {
|
|
allowUnknown: Joi.boolean(),
|
|
abortEarly: Joi.boolean(),
|
|
artifacts: Joi.boolean(),
|
|
cache: Joi.boolean(),
|
|
convert: Joi.boolean(),
|
|
dateFormat: ['date', 'iso', 'string', 'time', 'utc'],
|
|
errors: {
|
|
escapeHtml: Joi.boolean(),
|
|
label: ['path', 'key'],
|
|
language: [
|
|
Joi.string(),
|
|
internals.desc.ref
|
|
],
|
|
wrap: {
|
|
label: internals.wrap,
|
|
array: internals.wrap
|
|
}
|
|
},
|
|
externals: Joi.boolean(),
|
|
messages: internals.desc.messages,
|
|
noDefaults: Joi.boolean(),
|
|
nonEnumerables: Joi.boolean(),
|
|
presence: ['required', 'optional', 'forbidden'],
|
|
skipFunctions: Joi.boolean(),
|
|
stripUnknown: Joi.object({
|
|
arrays: Joi.boolean(),
|
|
objects: Joi.boolean()
|
|
})
|
|
.or('arrays', 'objects')
|
|
.allow(true, false),
|
|
warnings: Joi.boolean()
|
|
},
|
|
allow: internals.desc.values,
|
|
invalid: internals.desc.values,
|
|
rules: Joi.array().min(1).items({
|
|
name: Joi.string().required(),
|
|
args: Joi.object().min(1),
|
|
keep: Joi.boolean(),
|
|
message: [
|
|
Joi.string(),
|
|
internals.desc.messages
|
|
],
|
|
warn: Joi.boolean()
|
|
}),
|
|
|
|
// Terms
|
|
|
|
keys: Joi.object().pattern(/.*/, Joi.link('/')),
|
|
link: internals.desc.ref
|
|
})
|
|
.pattern(/^[a-z]\w*$/, Joi.any());
|