UNPKG

@sanity/schema

Version:
75 lines (67 loc) 2.19 kB
import {traverseSanitySchema} from './traverseSchema' import {type _FIXME_} from './typedefs' import array from './validation/types/array' import block from './validation/types/block' import common from './validation/types/common' import crossDatasetReference from './validation/types/crossDatasetReference' import documentVisitor from './validation/types/document' import file from './validation/types/file' import globalDocumentReference from './validation/types/globalDocumentReference' import image from './validation/types/image' import object from './validation/types/object' import reference from './validation/types/reference' import rootType from './validation/types/rootType' import slug from './validation/types/slug' const typeVisitors = { array, object, slug, file, image, block, document: documentVisitor, reference: reference, crossDatasetReference: crossDatasetReference, globalDocumentReference, } const getNoopVisitor = (visitorContext: any) => (schemaDef: any) => ({ name: `<unnamed_type_@_index_${visitorContext.index}>`, ...schemaDef, _problems: [], }) function combine(...visitors: any) { return (schemaType: any, visitorContext: any) => { return visitors.reduce( (result: any, visitor: any) => { const res = visitor(result, visitorContext) return { ...res, _problems: result._problems.concat(res._problems), } }, {_problems: [], ...schemaType}, ) } } interface Options { transformTypeVisitors?: (visitors: typeof typeVisitors) => Partial<typeof typeVisitors> } /** * @internal */ export function validateSchema( schemaTypes: _FIXME_, {transformTypeVisitors = (visitors) => visitors}: Options = {}, ) { return traverseSanitySchema(schemaTypes, (schemaDef, visitorContext) => { const typeVisitor = (schemaDef && schemaDef.type && (transformTypeVisitors(typeVisitors) as any)[schemaDef.type]) || getNoopVisitor(visitorContext) if (visitorContext.isRoot) { return combine(rootType, common, typeVisitor)(schemaDef, visitorContext) } return combine(common, typeVisitor)(schemaDef, visitorContext) }) }