@r1tsu/payload
Version:
483 lines (482 loc) • 18.2 kB
JavaScript
import joi from 'joi';
import { componentSchema } from '../../config/shared/componentSchema.js';
export const baseAdminComponentFields = joi.object().keys({
Cell: componentSchema,
Field: componentSchema,
Filter: componentSchema
}).default({});
export const baseAdminFields = joi.object().keys({
className: joi.string(),
components: baseAdminComponentFields,
condition: joi.func(),
custom: joi.object().pattern(joi.string(), joi.any()),
description: joi.alternatives().try(joi.string(), joi.object().pattern(joi.string(), [
joi.string()
]), componentSchema),
disableBulkEdit: joi.boolean().default(false),
disabled: joi.boolean().default(false),
hidden: joi.boolean().default(false),
initCollapsed: joi.boolean().default(false),
position: joi.string().valid('sidebar'),
readOnly: joi.boolean().default(false),
style: joi.object().unknown(),
width: joi.string()
});
export const baseField = joi.object().keys({
access: joi.object().keys({
create: joi.func(),
read: joi.func(),
update: joi.func()
}),
admin: baseAdminFields.default(),
custom: joi.object().pattern(joi.string(), joi.any()),
hidden: joi.boolean().default(false),
hooks: joi.object().keys({
afterChange: joi.array().items(joi.func()).default([]),
afterRead: joi.array().items(joi.func()).default([]),
beforeChange: joi.array().items(joi.func()).default([]),
beforeDuplicate: joi.array().items(joi.func()).default([]),
beforeValidate: joi.array().items(joi.func()).default([])
}).default(),
index: joi.boolean().default(false),
label: joi.alternatives().try(joi.func(), joi.object().pattern(joi.string(), [
joi.string()
]), joi.string(), joi.valid(false)),
localized: joi.boolean().default(false),
required: joi.boolean().default(false),
saveToJWT: joi.alternatives().try(joi.boolean(), joi.string()).default(false),
unique: joi.boolean().default(false),
validate: joi.func()
}).default();
export const idField = baseField.keys({
name: joi.string().valid('id'),
type: joi.string().valid('text', 'number'),
localized: joi.invalid(true),
required: joi.not(false, 0).default(true)
});
export const text = baseField.keys({
name: joi.string().required(),
type: joi.string().valid('text').required(),
admin: baseAdminFields.keys({
autoComplete: joi.string(),
components: baseAdminComponentFields.keys({
Error: componentSchema,
Label: componentSchema,
afterInput: joi.array().items(componentSchema),
beforeInput: joi.array().items(componentSchema)
}),
placeholder: joi.alternatives().try(joi.object().pattern(joi.string(), [
joi.string()
]), joi.string()),
rtl: joi.boolean()
}),
defaultValue: joi.alternatives().try(joi.string(), joi.func()),
hasMany: joi.boolean().default(false),
maxLength: joi.number(),
maxRows: joi.number().when('hasMany', {
is: joi.not(true),
then: joi.forbidden()
}),
minLength: joi.number(),
minRows: joi.number().when('hasMany', {
is: joi.not(true),
then: joi.forbidden()
})
});
export const number = baseField.keys({
name: joi.string().required(),
type: joi.string().valid('number').required(),
admin: baseAdminFields.keys({
autoComplete: joi.string(),
components: baseAdminComponentFields.keys({
Error: componentSchema,
Label: componentSchema,
afterInput: joi.array().items(componentSchema).when('hasMany', {
not: true,
otherwise: joi.forbidden()
}),
beforeInput: joi.array().items(componentSchema).when('hasMany', {
not: true,
otherwise: joi.forbidden()
})
}),
placeholder: joi.string(),
step: joi.number()
}),
defaultValue: joi.alternatives().try(joi.number(), joi.func(), joi.array().when('hasMany', {
not: true,
then: joi.forbidden()
})),
hasMany: joi.boolean().default(false),
max: joi.number(),
maxRows: joi.number().when('hasMany', {
is: joi.not(true),
then: joi.forbidden()
}),
min: joi.number(),
minRows: joi.number().when('hasMany', {
is: joi.not(true),
then: joi.forbidden()
})
});
export const textarea = baseField.keys({
name: joi.string().required(),
type: joi.string().valid('textarea').required(),
admin: baseAdminFields.keys({
components: baseAdminComponentFields.keys({
Error: componentSchema,
Label: componentSchema,
afterInput: joi.array().items(componentSchema),
beforeInput: joi.array().items(componentSchema)
}),
placeholder: joi.string(),
rows: joi.number(),
rtl: joi.boolean()
}),
defaultValue: joi.alternatives().try(joi.string(), joi.func()),
maxLength: joi.number(),
minLength: joi.number()
});
export const email = baseField.keys({
name: joi.string().required(),
type: joi.string().valid('email').required(),
admin: baseAdminFields.keys({
autoComplete: joi.string(),
components: baseAdminComponentFields.keys({
Error: componentSchema,
Label: componentSchema,
afterInput: joi.array().items(componentSchema),
beforeInput: joi.array().items(componentSchema)
}),
placeholder: joi.string()
}),
defaultValue: joi.alternatives().try(joi.string(), joi.func()),
maxLength: joi.number(),
minLength: joi.number()
});
export const code = baseField.keys({
name: joi.string().required(),
type: joi.string().valid('code').required(),
admin: baseAdminFields.keys({
components: baseAdminComponentFields.keys({
Error: componentSchema,
Label: componentSchema
}),
editorOptions: joi.object().unknown(),
language: joi.string()
}),
defaultValue: joi.alternatives().try(joi.string(), joi.func())
});
export const json = baseField.keys({
name: joi.string().required(),
type: joi.string().valid('json').required(),
admin: baseAdminFields.keys({
components: baseAdminComponentFields.keys({
Error: componentSchema,
Label: componentSchema
}),
editorOptions: joi.object().unknown()
}),
defaultValue: joi.alternatives().try(joi.array(), joi.object()),
jsonSchema: joi.object().unknown()
});
export const select = baseField.keys({
name: joi.string().required(),
type: joi.string().valid('select').required(),
admin: baseAdminFields.keys({
components: baseAdminComponentFields.keys({
Error: componentSchema,
Label: componentSchema
}),
isClearable: joi.boolean().default(false),
isSortable: joi.boolean().default(false)
}),
dbName: joi.alternatives().try(joi.string(), joi.func()),
defaultValue: joi.alternatives().try(joi.string().allow(''), joi.array().items(joi.string().allow('')), joi.func()),
enumName: joi.alternatives().try(joi.string(), joi.func()),
hasMany: joi.boolean().default(false),
options: joi.array().min(1).items(joi.alternatives().try(joi.string(), joi.object({
label: joi.alternatives().try(joi.func(), joi.string(), joi.object().pattern(joi.string(), [
joi.string()
])),
value: joi.string().required().allow('')
}))).required()
});
export const radio = baseField.keys({
name: joi.string().required(),
type: joi.string().valid('radio').required(),
admin: baseAdminFields.keys({
components: baseAdminComponentFields.keys({
Error: componentSchema,
Label: componentSchema
}),
layout: joi.string().valid('vertical', 'horizontal')
}),
defaultValue: joi.alternatives().try(joi.string().allow(''), joi.func()),
enumName: joi.alternatives().try(joi.string(), joi.func()),
options: joi.array().min(1).items(joi.alternatives().try(joi.string(), joi.object({
label: joi.alternatives().try(joi.func(), joi.string(), joi.object().pattern(joi.string(), [
joi.string()
])).required(),
value: joi.string().required().allow('')
}))).required()
});
export const row = baseField.keys({
type: joi.string().valid('row').required(),
admin: baseAdminFields.default(),
fields: joi.array().items(joi.link('#field'))
});
export const collapsible = baseField.keys({
type: joi.string().valid('collapsible').required(),
admin: baseAdminFields.default(),
fields: joi.array().items(joi.link('#field')),
label: joi.alternatives().try(joi.string(), componentSchema)
});
const tab = baseField.keys({
name: joi.string().when('localized', {
is: joi.exist(),
then: joi.required()
}),
description: joi.alternatives().try(joi.string(), componentSchema),
fields: joi.array().items(joi.link('#field')).required(),
interfaceName: joi.string().when('name', {
not: joi.exist(),
then: joi.forbidden()
}),
label: joi.alternatives().try(joi.string(), joi.object().pattern(joi.string(), [
joi.string()
])).when('name', {
is: joi.not(),
then: joi.required()
}),
localized: joi.boolean(),
saveToJWT: joi.alternatives().try(joi.boolean(), joi.string())
});
export const tabs = baseField.keys({
type: joi.string().valid('tabs').required(),
admin: baseAdminFields.keys({
description: joi.forbidden()
}),
fields: joi.forbidden(),
localized: joi.forbidden(),
tabs: joi.array().items(tab).required()
});
export const group = baseField.keys({
name: joi.string().required(),
type: joi.string().valid('group').required(),
admin: baseAdminFields.keys({
hideGutter: joi.boolean().default(true)
}),
defaultValue: joi.alternatives().try(joi.object(), joi.func()),
fields: joi.array().items(joi.link('#field')),
interfaceName: joi.string()
});
export const array = baseField.keys({
name: joi.string().required(),
type: joi.string().valid('array').required(),
admin: baseAdminFields.keys({
components: baseAdminComponentFields.keys({
RowLabel: componentSchema
}).default({})
}).default({}),
dbName: joi.alternatives().try(joi.string(), joi.func()),
defaultValue: joi.alternatives().try(joi.array().items(joi.object()), joi.func()),
fields: joi.array().items(joi.link('#field')).required(),
interfaceName: joi.string(),
labels: joi.object({
plural: joi.alternatives().try(joi.string(), joi.object().pattern(joi.string(), [
joi.string()
])),
singular: joi.alternatives().try(joi.string(), joi.object().pattern(joi.string(), [
joi.string()
]))
}),
maxRows: joi.number(),
minRows: joi.number()
});
export const upload = baseField.keys({
name: joi.string().required(),
type: joi.string().valid('upload').required(),
admin: baseAdminFields.keys({
components: baseAdminComponentFields.keys({
Error: componentSchema,
Label: componentSchema
})
}),
defaultValue: joi.alternatives().try(joi.object(), joi.func()),
filterOptions: joi.alternatives().try(joi.object(), joi.func()),
maxDepth: joi.number(),
relationTo: joi.string().required()
});
export const checkbox = baseField.keys({
name: joi.string().required(),
type: joi.string().valid('checkbox').required(),
admin: baseAdminFields.keys({
components: baseAdminComponentFields.keys({
Error: componentSchema,
Label: componentSchema,
afterInput: joi.array().items(componentSchema),
beforeInput: joi.array().items(componentSchema)
})
}),
defaultValue: joi.alternatives().try(joi.boolean(), joi.func())
});
export const point = baseField.keys({
name: joi.string().required(),
type: joi.string().valid('point').required(),
admin: baseAdminFields.keys({
components: baseAdminComponentFields.keys({
Error: componentSchema,
Label: componentSchema,
afterInput: joi.array().items(componentSchema),
beforeInput: joi.array().items(componentSchema)
})
}),
defaultValue: joi.alternatives().try(joi.array().items(joi.number()).max(2).min(2), joi.func())
});
export const relationship = baseField.keys({
name: joi.string().required(),
type: joi.string().valid('relationship').required(),
admin: baseAdminFields.keys({
allowCreate: joi.boolean().default(true),
components: baseAdminComponentFields.keys({
Error: componentSchema,
Label: componentSchema
}),
isSortable: joi.boolean().default(false),
sortOptions: joi.alternatives().conditional(joi.ref('...relationTo'), {
is: joi.string(),
otherwise: joi.object().pattern(joi.string(), joi.string()),
then: joi.string()
})
}),
defaultValue: joi.alternatives().try(joi.func()),
filterOptions: joi.alternatives().try(joi.object(), joi.func()),
hasMany: joi.boolean().default(false),
max: joi.number().when('hasMany', {
is: joi.not(true),
then: joi.forbidden()
}).warning('deprecated', {
message: 'Use maxRows instead.'
}),
maxDepth: joi.number(),
maxRows: joi.number().when('hasMany', {
is: joi.not(true),
then: joi.forbidden()
}),
min: joi.number().when('hasMany', {
is: joi.not(true),
then: joi.forbidden()
}).warning('deprecated', {
message: 'Use minRows instead.'
}),
minRows: joi.number().when('hasMany', {
is: joi.not(true),
then: joi.forbidden()
}),
relationTo: joi.alternatives().try(joi.string().required(), joi.array().items(joi.string()))
});
export const blocks = baseField.keys({
name: joi.string().required(),
type: joi.string().valid('blocks').required(),
blocks: joi.array().items(joi.object({
slug: joi.string().required(),
admin: joi.object().keys({
custom: joi.object().pattern(joi.string(), joi.any())
}),
custom: joi.object().pattern(joi.string(), joi.any()),
dbName: joi.alternatives().try(joi.string(), joi.func()),
fields: joi.array().items(joi.link('#field')),
graphQL: joi.object().keys({
singularName: joi.string()
}),
imageAltText: joi.string(),
imageURL: joi.string(),
interfaceName: joi.string(),
labels: joi.object({
plural: joi.alternatives().try(joi.string(), joi.object().pattern(joi.string(), [
joi.string()
])),
singular: joi.alternatives().try(joi.string(), joi.object().pattern(joi.string(), [
joi.string()
]))
})
})).required(),
defaultValue: joi.alternatives().try(joi.array().items(joi.object()), joi.func()),
labels: joi.object({
plural: joi.alternatives().try(joi.string(), joi.object().pattern(joi.string(), [
joi.string()
])),
singular: joi.alternatives().try(joi.string(), joi.object().pattern(joi.string(), [
joi.string()
]))
}),
maxRows: joi.number(),
minRows: joi.number()
});
export const richText = baseField.keys({
name: joi.string().required(),
type: joi.string().valid('richText').required(),
admin: baseAdminFields.keys({
components: baseAdminComponentFields.keys({
Error: componentSchema,
Label: componentSchema
})
}),
defaultValue: joi.alternatives().try(joi.array().items(joi.object()), joi.func(), joi.object()),
editor: joi.object().keys({
CellComponent: componentSchema.optional(),
FieldComponent: componentSchema.optional(),
afterReadPromise: joi.func().optional(),
outputSchema: joi.func().optional(),
populationPromise: joi.func().optional(),
validate: joi.func().required()
}).unknown()
});
export const date = baseField.keys({
name: joi.string().required(),
type: joi.string().valid('date').required(),
admin: baseAdminFields.keys({
components: baseAdminComponentFields.keys({
Error: componentSchema,
Label: componentSchema,
afterInput: joi.array().items(componentSchema),
beforeInput: joi.array().items(componentSchema)
}),
date: joi.object({
displayFormat: joi.string(),
maxDate: joi.date(),
maxTime: joi.date(),
minDate: joi.date(),
minTime: joi.date(),
monthsToShow: joi.number(),
overrides: joi.object().unknown(),
pickerAppearance: joi.string(),
timeFormat: joi.string(),
timeIntervals: joi.number()
}),
placeholder: joi.string()
}),
defaultValue: joi.alternatives().try(joi.string(), joi.func())
});
export const ui = joi.object().keys({
name: joi.string().required(),
type: joi.string().valid('ui').required(),
admin: joi.object().keys({
components: joi.object().keys({
Cell: componentSchema,
Field: componentSchema
}).default({}),
condition: joi.func(),
custom: joi.object().pattern(joi.string(), joi.any()),
position: joi.string().valid('sidebar'),
width: joi.string()
}).default(),
custom: joi.object().pattern(joi.string(), joi.any()),
label: joi.alternatives().try(joi.string(), joi.object().pattern(joi.string(), [
joi.string()
]))
});
const fieldSchema = joi.alternatives().try(text, number, textarea, email, code, json, select, group, array, row, collapsible, tabs, radio, relationship, checkbox, upload, richText, blocks, date, point, ui).id('field');
export default fieldSchema;
//# sourceMappingURL=schema.js.map