Files
payloadcms/packages/payload/src/config/schema.ts
2023-10-06 11:30:18 +02:00

177 lines
4.9 KiB
TypeScript

import joi from 'joi'
import { routeSchema } from './shared/routeSchema'
const component = joi.alternatives().try(joi.object().unknown(), joi.func())
export const endpointsSchema = joi.alternatives().try(
joi.array().items(
joi.object({
custom: joi.object().pattern(joi.string(), joi.any()),
handler: joi.alternatives().try(joi.array().items(joi.func()), joi.func()),
method: joi
.string()
.valid('get', 'head', 'post', 'put', 'patch', 'delete', 'connect', 'options'),
path: joi.string(),
root: joi.bool(),
}),
),
joi.boolean(),
)
export default joi.object({
admin: joi.object({
autoLogin: joi.alternatives().try(
joi.object().keys({
email: joi.string(),
password: joi.string(),
prefillOnly: joi.boolean(),
}),
joi.boolean(),
),
avatar: joi.alternatives().try(joi.string(), component),
buildPath: joi.string(),
bundler: {
build: joi.func(),
dev: joi.func(),
serve: joi.func(),
},
components: joi.object().keys({
Nav: component,
afterDashboard: joi.array().items(component),
afterLogin: joi.array().items(component),
afterNavLinks: joi.array().items(component),
beforeDashboard: joi.array().items(component),
beforeLogin: joi.array().items(component),
beforeNavLinks: joi.array().items(component),
graphics: joi.object({
Icon: component,
Logo: component,
}),
logout: joi.object({
Button: component,
}),
providers: joi.array().items(component),
routes: routeSchema,
views: joi.object({
Account: component,
Dashboard: component,
}),
}),
css: joi.string(),
dateFormat: joi.string(),
disable: joi.bool(),
inactivityRoute: joi.string(),
indexHTML: joi.string(),
logoutRoute: joi.string(),
meta: joi.object().keys({
favicon: joi.string(),
ogImage: joi.string(),
titleSuffix: joi.string(),
}),
user: joi.string(),
vite: joi.func(),
webpack: joi.func(),
}),
collections: joi.array(),
cookiePrefix: joi.string(),
cors: [joi.string().valid('*'), joi.array().items(joi.string())],
csrf: joi.array().items(joi.string().allow('')).sparse(),
custom: joi.object().pattern(joi.string(), joi.any()),
db: joi.any(),
debug: joi.boolean(),
defaultDepth: joi.number().min(0).max(30),
defaultMaxTextLength: joi.number(),
editor: joi.object().required().keys({
CellComponent: component.required(),
FieldComponent: component.required(),
afterReadPromise: joi.func().required(),
validate: joi.func().required(),
}),
email: joi.object(),
endpoints: endpointsSchema,
express: joi.object().keys({
compression: joi.object(),
json: joi.object(),
middleware: joi.array().items(joi.func()),
postMiddleware: joi.array().items(joi.func()),
preMiddleware: joi.array().items(joi.func()),
}),
globals: joi.array(),
graphQL: joi.object().keys({
disable: joi.boolean(),
disablePlaygroundInProduction: joi.boolean(),
maxComplexity: joi.number(),
mutations: joi.function(),
queries: joi.function(),
schemaOutputFile: joi.string(),
}),
hooks: joi.object().keys({
afterError: joi.func(),
}),
i18n: joi.object(),
indexSortableFields: joi.boolean(),
local: joi.boolean(),
localization: joi.alternatives().try(
joi.object().keys({
defaultLocale: joi.string(),
fallback: joi.boolean(),
localeCodes: joi.array().items(joi.string()),
locales: joi.alternatives().try(
joi.array().items(
joi.object().keys({
code: joi.string(),
label: joi.string(),
rtl: joi.boolean(),
toString: joi.func(),
}),
),
joi.array().items(joi.string()),
),
}),
joi.boolean(),
),
maxDepth: joi.number().min(0).max(100),
onInit: joi.func(),
plugins: joi.array().items(joi.func()),
rateLimit: joi.object().keys({
max: joi.number(),
skip: joi.func(),
trustProxy: joi.boolean(),
window: joi.number(),
}),
routes: joi.object({
admin: joi.string(),
api: joi.string(),
graphQL: joi.string(),
graphQLPlayground: joi.string(),
}),
serverURL: joi
.string()
.uri()
.allow('')
.custom((value, helper) => {
const urlWithoutProtocol = value.split('//')[1]
if (!urlWithoutProtocol) {
return helper.message({
custom: 'You need to include either "https://" or "http://" in your serverURL.',
})
}
if (urlWithoutProtocol.indexOf('/') > -1) {
return helper.message({
custom:
'Your serverURL cannot have a path. It can only contain a protocol, a domain, and an optional port.',
})
}
return value
}),
telemetry: joi.boolean(),
typescript: joi.object({
outputFile: joi.string(),
}),
upload: joi.object(),
})