Files
payload/packages/graphql/src/schema/recursivelyBuildNestedPaths.ts
2024-08-29 03:51:03 +00:00

81 lines
2.1 KiB
TypeScript

import type { FieldWithSubFields, TabsField } from 'payload'
import { fieldAffectsData, fieldIsPresentationalOnly } from 'payload/shared'
import { fieldToSchemaMap } from './fieldToWhereInputSchemaMap.js'
type Args = {
field: FieldWithSubFields | TabsField
nestedFieldName2: string
parentName: string
}
export const recursivelyBuildNestedPaths = ({ field, nestedFieldName2, parentName }: Args) => {
const fieldName = fieldAffectsData(field) ? field.name : undefined
const nestedFieldName = fieldName || nestedFieldName2
if (field.type === 'tabs') {
// if the tab has a name, treat it as a group
// otherwise, treat it as a row
return field.tabs.reduce((tabSchema, tab: any) => {
tabSchema.push(
...recursivelyBuildNestedPaths({
field: {
...tab,
type: 'name' in tab ? 'group' : 'row',
},
nestedFieldName2: nestedFieldName,
parentName,
}),
)
return tabSchema
}, [])
}
const nestedPaths = field.fields.reduce((nestedFields, nestedField) => {
if (!fieldIsPresentationalOnly(nestedField)) {
if (!fieldAffectsData(nestedField)) {
return [
...nestedFields,
...recursivelyBuildNestedPaths({
field: nestedField,
nestedFieldName2: nestedFieldName,
parentName,
}),
]
}
const nestedPathName = fieldAffectsData(nestedField)
? `${nestedFieldName ? `${nestedFieldName}__` : ''}${nestedField.name}`
: undefined
const getFieldSchema = fieldToSchemaMap({
nestedFieldName,
parentName,
})[nestedField.type]
if (getFieldSchema) {
const fieldSchema = getFieldSchema({
...nestedField,
name: nestedPathName,
})
if (Array.isArray(fieldSchema)) {
return [...nestedFields, ...fieldSchema]
}
return [
...nestedFields,
{
type: fieldSchema,
key: nestedPathName,
},
]
}
}
return nestedFields
}, [])
return nestedPaths
}