lib/config/config-schema.js
import Joi from 'joi';
const middlewareOrLifecycleSchema = Joi.alternatives()
.try(Joi.string(), Joi.func(), Joi.array().items(Joi.string(), Joi.func()))
.default([]);
const regExpSchema = Joi.object().type(RegExp);
export default Joi.object({
site: Joi.object().default(),
path: Joi.object({
source: Joi.string().default('./'),
destination: Joi.string().default('./_site'),
templates: Joi.string().default('./_templates'),
data: Joi.string().default('./_data'),
}).default(),
file: Joi.object({
urlKey: Joi.string().default('url'),
dateFormat: Joi.string().default('YYYY-M-D'),
defaults: Joi.array()
.items(
Joi.object({
scope: Joi.object({
path: Joi.string().allow(''),
metadata: Joi.object(),
}),
values: Joi.object(),
})
)
.default([]),
filters: Joi.object({
metadata: Joi.object(),
futureDate: Joi.object({
key: Joi.string().default('date'),
}),
}).default({}),
}).default(),
collections: Joi.object().pattern(
/\w/,
Joi.object({
path: Joi.string(),
metadata: Joi.string(),
template: Joi.string().default('index'),
pageSize: Joi.number().default(6),
sort: Joi.object({
key: Joi.string().default('date'),
order: Joi.string().default('descending'),
}),
permalink: Joi.object({
index: Joi.string().default('/'),
page: Joi.string().default('/page/:page/'),
}),
}).without('path', 'metadata')
),
assets: Joi.array()
.items(
Joi.object({
test: Joi.alternatives().try(Joi.string(), Joi.func(), regExpSchema),
use: Joi.alternatives().try(
Joi.string(),
Joi.object({
calculateDestination: Joi.func().required(),
render: Joi.func().required(),
})
),
})
)
.default([
{ test: /\.less$/, use: 'less' },
{ test: /\.js$/, use: 'browserify' },
{ test: /\.s[ac]ss$/, use: 'sass' },
]),
cleanDestination: Joi.boolean().default(false),
slug: Joi.object({
lower: Joi.boolean().default(true),
}).default(),
markdown: Joi.object({
extensions: Joi.array().default([
'markdown',
'mkdown',
'mkdn',
'mkd',
'md',
]),
options: Joi.object({
preset: Joi.string().default('commonmark'),
highlight: Joi.any()
.valid('prism', 'highlightjs', true, false)
.default(true),
})
.unknown(true)
.default(),
}).default(),
server: Joi.object({
port: Joi.number().default(8080),
host: Joi.string().default('127.0.0.1'),
baseurl: Joi.string()
.allow('')
.default(''),
}).default(),
ignore: Joi.array()
.items(Joi.string(), Joi.func(), regExpSchema)
.default([]),
incremental: Joi.boolean().default(true),
newFilePermalink: Joi.string().default(
'/_posts/:date|YYYY-:date|MM-:date|D-:title.md'
),
middlewares: middlewareOrLifecycleSchema,
lifecycle: Joi.object({
willUpdate: middlewareOrLifecycleSchema,
didUpdate: middlewareOrLifecycleSchema,
willBuild: middlewareOrLifecycleSchema,
didBuild: middlewareOrLifecycleSchema,
}).default(),
}).default();