{"version":3,"sources":["../../../src/fields/config/sanitize.spec.ts"],"sourcesContent":["import type { Config } from '../../config/types.js'\nimport type {\n  ArrayField,\n  Block,\n  BlocksField,\n  CheckboxField,\n  Field,\n  NumberField,\n  TextField,\n} from './types.js'\n\nimport {\n  DuplicateFieldName,\n  InvalidFieldName,\n  InvalidFieldRelationship,\n  MissingFieldType,\n} from '../../errors/index.js'\nimport { sanitizeFields } from './sanitize.js'\nimport { CollectionConfig } from '../../index.js'\nimport { describe, it, expect } from 'vitest'\n\ndescribe('sanitizeFields', () => {\n  const config = {} as Config\n  const collectionConfig = {} as CollectionConfig\n\n  it('should throw on missing type field', async () => {\n    const fields: Field[] = [\n      // @ts-expect-error\n      {\n        name: 'Some Collection',\n        label: 'some-collection',\n      },\n    ]\n\n    await expect(async () => {\n      await sanitizeFields({\n        config,\n        collectionConfig,\n        fields,\n        validRelationships: [],\n      })\n    }).rejects.toThrow(MissingFieldType)\n  })\n\n  it('should throw on invalid field name', async () => {\n    const fields: Field[] = [\n      {\n        name: 'some.collection',\n        type: 'text',\n        label: 'some.collection',\n      },\n    ]\n\n    await expect(async () => {\n      await sanitizeFields({\n        config,\n        collectionConfig,\n        fields,\n        validRelationships: [],\n      })\n    }).rejects.toThrow(InvalidFieldName)\n  })\n\n  it('should throw on duplicate field name', async () => {\n    const fields: Field[] = [\n      {\n        name: 'someField',\n        type: 'text',\n        label: 'someField',\n      },\n      {\n        name: 'someField',\n        type: 'text',\n        label: 'someField',\n      },\n    ]\n\n    await expect(async () => {\n      await sanitizeFields({\n        config,\n        collectionConfig,\n        fields,\n        validRelationships: [],\n      })\n    }).rejects.toThrow(DuplicateFieldName)\n  })\n\n  it('should throw on duplicate block slug', async () => {\n    const fields: Field[] = [\n      {\n        name: 'blocks',\n        type: 'blocks',\n        blocks: [\n          {\n            slug: 'block',\n            fields: [\n              {\n                name: 'blockField',\n                type: 'text',\n              },\n            ],\n          },\n          {\n            slug: 'block',\n            fields: [\n              {\n                name: 'blockField',\n                type: 'text',\n              },\n            ],\n          },\n        ],\n      },\n    ]\n\n    await expect(async () => {\n      await sanitizeFields({\n        config,\n        collectionConfig,\n        fields,\n        validRelationships: [],\n      })\n    }).rejects.toThrow(DuplicateFieldName)\n  })\n\n  describe('auto-labeling', () => {\n    it('should populate label if missing', async () => {\n      const fields: Field[] = [\n        {\n          name: 'someField',\n          type: 'text',\n        },\n      ]\n\n      const sanitizedField = (\n        await sanitizeFields({\n          config,\n          collectionConfig,\n          fields,\n          validRelationships: [],\n        })\n      )[0] as TextField\n\n      expect(sanitizedField.name).toStrictEqual('someField')\n      expect(sanitizedField.label).toStrictEqual('Some Field')\n      expect(sanitizedField.type).toStrictEqual('text')\n    })\n\n    it('should allow auto-label override', async () => {\n      const fields: Field[] = [\n        {\n          name: 'someField',\n          type: 'text',\n          label: 'Do not label',\n        },\n      ]\n\n      const sanitizedField = (\n        await sanitizeFields({\n          config,\n          collectionConfig,\n          fields,\n          validRelationships: [],\n        })\n      )[0] as TextField\n\n      expect(sanitizedField.name).toStrictEqual('someField')\n      expect(sanitizedField.label).toStrictEqual('Do not label')\n      expect(sanitizedField.type).toStrictEqual('text')\n    })\n\n    describe('opt-out', () => {\n      it('should allow label opt-out', async () => {\n        const fields: Field[] = [\n          {\n            name: 'someField',\n            type: 'text',\n            label: false,\n          },\n        ]\n\n        const sanitizedField = (\n          await sanitizeFields({\n            config,\n            collectionConfig,\n            fields,\n            validRelationships: [],\n          })\n        )[0] as TextField\n\n        expect(sanitizedField.name).toStrictEqual('someField')\n        expect(sanitizedField.label).toStrictEqual(false)\n        expect(sanitizedField.type).toStrictEqual('text')\n      })\n\n      it('should allow label opt-out for arrays', async () => {\n        const arrayField: ArrayField = {\n          name: 'items',\n          type: 'array',\n          fields: [\n            {\n              name: 'itemName',\n              type: 'text',\n            },\n          ],\n          label: false,\n        }\n\n        const sanitizedField = (\n          await sanitizeFields({\n            config,\n            collectionConfig,\n            fields: [arrayField],\n            validRelationships: [],\n          })\n        )[0] as ArrayField\n\n        expect(sanitizedField.name).toStrictEqual('items')\n        expect(sanitizedField.label).toStrictEqual(false)\n        expect(sanitizedField.type).toStrictEqual('array')\n        expect(sanitizedField.labels).toBeUndefined()\n      })\n\n      it('should allow label opt-out for blocks', async () => {\n        const fields: Field[] = [\n          {\n            name: 'noLabelBlock',\n            type: 'blocks',\n            blocks: [\n              {\n                slug: 'number',\n                fields: [\n                  {\n                    name: 'testNumber',\n                    type: 'number',\n                  },\n                ],\n              },\n            ],\n            label: false,\n          },\n        ]\n\n        const sanitizedField = (\n          await sanitizeFields({\n            config,\n            collectionConfig,\n            fields,\n            validRelationships: [],\n          })\n        )[0] as BlocksField\n\n        expect(sanitizedField.name).toStrictEqual('noLabelBlock')\n        expect(sanitizedField.label).toStrictEqual(false)\n        expect(sanitizedField.type).toStrictEqual('blocks')\n        expect(sanitizedField.labels).toBeUndefined()\n      })\n    })\n\n    it('should label arrays with plural and singular', async () => {\n      const fields: Field[] = [\n        {\n          name: 'items',\n          type: 'array',\n          fields: [\n            {\n              name: 'itemName',\n              type: 'text',\n            },\n          ],\n        },\n      ]\n\n      const sanitizedField = (\n        await sanitizeFields({\n          config,\n          collectionConfig,\n          fields,\n          validRelationships: [],\n        })\n      )[0] as ArrayField\n\n      expect(sanitizedField.name).toStrictEqual('items')\n      expect(sanitizedField.label).toStrictEqual('Items')\n      expect(sanitizedField.type).toStrictEqual('array')\n      expect(sanitizedField.labels).toMatchObject({ plural: 'Items', singular: 'Item' })\n    })\n\n    it('should label blocks with plural and singular', async () => {\n      const fields: Field[] = [\n        {\n          name: 'specialBlock',\n          type: 'blocks',\n          blocks: [\n            {\n              slug: 'number',\n              fields: [{ name: 'testNumber', type: 'number' }],\n            },\n          ],\n        },\n      ]\n\n      const sanitizedField = (\n        await sanitizeFields({\n          config,\n          collectionConfig,\n          fields,\n          validRelationships: [],\n        })\n      )[0] as BlocksField\n\n      expect(sanitizedField.name).toStrictEqual('specialBlock')\n      expect(sanitizedField.label).toStrictEqual('Special Block')\n      expect(sanitizedField.type).toStrictEqual('blocks')\n      expect(sanitizedField.labels).toMatchObject({\n        plural: 'Special Blocks',\n        singular: 'Special Block',\n      })\n\n      expect((sanitizedField.blocks[0].fields[0] as NumberField).label).toStrictEqual('Test Number')\n    })\n  })\n\n  describe('relationships', () => {\n    it('should not throw on valid relationship', async () => {\n      const validRelationships = ['some-collection']\n      const fields: Field[] = [\n        {\n          name: 'My Relationship',\n          type: 'relationship',\n          label: 'my-relationship',\n          relationTo: 'some-collection',\n        },\n      ]\n\n      await expect(async () => {\n        await sanitizeFields({ config, collectionConfig, fields, validRelationships })\n      }).not.toThrow()\n    })\n\n    it('should not throw on valid relationship - multiple', async () => {\n      const validRelationships = ['some-collection', 'another-collection']\n      const fields: Field[] = [\n        {\n          name: 'My Relationship',\n          type: 'relationship',\n          label: 'my-relationship',\n          relationTo: ['some-collection', 'another-collection'],\n        },\n      ]\n\n      await expect(async () => {\n        await sanitizeFields({ config, collectionConfig, fields, validRelationships })\n      }).not.toThrow()\n    })\n\n    it('should not throw on valid relationship inside blocks', async () => {\n      const validRelationships = ['some-collection']\n      const relationshipBlock: Block = {\n        slug: 'relationshipBlock',\n        fields: [\n          {\n            name: 'My Relationship',\n            type: 'relationship',\n            label: 'my-relationship',\n            relationTo: 'some-collection',\n          },\n        ],\n      }\n\n      const fields: Field[] = [\n        {\n          name: 'layout',\n          type: 'blocks',\n          blocks: [relationshipBlock],\n          label: 'Layout Blocks',\n        },\n      ]\n\n      await expect(async () => {\n        await sanitizeFields({ config, collectionConfig, fields, validRelationships })\n      }).not.toThrow()\n    })\n\n    it('should throw on invalid relationship', async () => {\n      const validRelationships = ['some-collection']\n      const fields: Field[] = [\n        {\n          name: 'My Relationship',\n          type: 'relationship',\n          label: 'my-relationship',\n          relationTo: 'not-valid',\n        },\n      ]\n\n      await expect(async () => {\n        await sanitizeFields({ config, collectionConfig, fields, validRelationships })\n      }).rejects.toThrow(InvalidFieldRelationship)\n    })\n\n    it('should throw on invalid relationship - multiple', async () => {\n      const validRelationships = ['some-collection', 'another-collection']\n      const fields: Field[] = [\n        {\n          name: 'My Relationship',\n          type: 'relationship',\n          label: 'my-relationship',\n          relationTo: ['some-collection', 'not-valid'],\n        },\n      ]\n\n      await expect(async () => {\n        await sanitizeFields({ config, collectionConfig, fields, validRelationships })\n      }).rejects.toThrow(InvalidFieldRelationship)\n    })\n\n    it('should throw on invalid relationship inside blocks', async () => {\n      const validRelationships = ['some-collection']\n      const relationshipBlock: Block = {\n        slug: 'relationshipBlock',\n        fields: [\n          {\n            name: 'My Relationship',\n            type: 'relationship',\n            label: 'my-relationship',\n            relationTo: 'not-valid',\n          },\n        ],\n      }\n\n      const fields: Field[] = [\n        {\n          name: 'layout',\n          type: 'blocks',\n          blocks: [relationshipBlock],\n          label: 'Layout Blocks',\n        },\n      ]\n\n      await expect(async () => {\n        await sanitizeFields({ config, collectionConfig, fields, validRelationships })\n      }).rejects.toThrow(InvalidFieldRelationship)\n    })\n\n    it('should throw on empty relationTo array', async () => {\n      const validRelationships = ['some-collection']\n      const fields: Field[] = [\n        {\n          name: 'My Relationship',\n          type: 'relationship',\n          label: 'my-relationship',\n          relationTo: [],\n        },\n      ]\n\n      await expect(async () => {\n        await sanitizeFields({ config, collectionConfig, fields, validRelationships })\n      }).rejects.toThrow('has an empty relationTo array')\n    })\n\n    it('should throw on empty relationTo array for upload field', async () => {\n      const validRelationships = ['some-collection']\n      const fields: Field[] = [\n        {\n          name: 'My Upload',\n          type: 'upload',\n          label: 'my-upload',\n          relationTo: [],\n        },\n      ]\n\n      await expect(async () => {\n        await sanitizeFields({ config, collectionConfig, fields, validRelationships })\n      }).rejects.toThrow('has an empty relationTo array')\n    })\n\n    it('should throw on empty relationTo array inside blocks', async () => {\n      const validRelationships = ['some-collection']\n      const relationshipBlock: Block = {\n        slug: 'relationshipBlock',\n        fields: [\n          {\n            name: 'My Relationship',\n            type: 'relationship',\n            label: 'my-relationship',\n            relationTo: [],\n          },\n        ],\n      }\n\n      const fields: Field[] = [\n        {\n          name: 'layout',\n          type: 'blocks',\n          blocks: [relationshipBlock],\n          label: 'Layout Blocks',\n        },\n      ]\n\n      await expect(async () => {\n        await sanitizeFields({ config, collectionConfig, fields, validRelationships })\n      }).rejects.toThrow('has an empty relationTo array')\n    })\n\n    it('should defaultValue of checkbox to false if required and undefined', async () => {\n      const fields: Field[] = [\n        {\n          name: 'My Checkbox',\n          type: 'checkbox',\n          required: true,\n        },\n      ]\n\n      const sanitizedField = (\n        await sanitizeFields({\n          config,\n          collectionConfig,\n          fields,\n          validRelationships: [],\n        })\n      )[0] as CheckboxField\n\n      expect(sanitizedField.defaultValue).toStrictEqual(false)\n    })\n\n    it('should return empty field array if no fields', async () => {\n      const sanitizedFields = await sanitizeFields({\n        config,\n        collectionConfig,\n        fields: [],\n        validRelationships: [],\n      })\n\n      expect(sanitizedFields).toStrictEqual([])\n    })\n  })\n  describe('blocks', () => {\n    it('should maintain admin.blockName true after sanitization', async () => {\n      const fields: Field[] = [\n        {\n          name: 'noLabelBlock',\n          type: 'blocks',\n          blocks: [\n            {\n              slug: 'number',\n              admin: {\n                disableBlockName: true,\n              },\n              fields: [\n                {\n                  name: 'testNumber',\n                  type: 'number',\n                },\n              ],\n            },\n          ],\n          label: false,\n        },\n      ]\n\n      const sanitizedField = (\n        await sanitizeFields({\n          config,\n          collectionConfig,\n          fields,\n          validRelationships: [],\n        })\n      )[0] as BlocksField\n\n      const sanitizedBlock = sanitizedField.blocks[0]\n\n      expect(sanitizedBlock.admin?.disableBlockName).toStrictEqual(true)\n    })\n    it('should default admin.disableBlockName to true after sanitization', async () => {\n      const fields: Field[] = [\n        {\n          name: 'noLabelBlock',\n          type: 'blocks',\n          blocks: [\n            {\n              slug: 'number',\n              fields: [\n                {\n                  name: 'testNumber',\n                  type: 'number',\n                },\n              ],\n            },\n          ],\n          label: false,\n        },\n      ]\n\n      const sanitizedField = (\n        await sanitizeFields({\n          config,\n          collectionConfig,\n          fields,\n          validRelationships: [],\n        })\n      )[0] as BlocksField\n\n      const sanitizedBlock = sanitizedField.blocks[0]\n\n      expect(sanitizedBlock.admin?.disableBlockName).toStrictEqual(undefined)\n    })\n  })\n\n  describe('virtual fields', () => {\n    it('should assign a noop validate for virtual: true fields', async () => {\n      const fields: Field[] = [\n        {\n          name: 'virtualText',\n          type: 'text',\n          virtual: true,\n        },\n      ]\n\n      const sanitizedField = (\n        await sanitizeFields({\n          config,\n          collectionConfig,\n          fields,\n          validRelationships: [],\n        })\n      )[0] as TextField\n\n      expect(sanitizedField.validate).toBeDefined()\n      expect(sanitizedField.validate!('', {} as any)).toBe(true)\n      expect(sanitizedField.validate!(undefined as any, {} as any)).toBe(true)\n    })\n\n    it('should assign a noop validate for virtual: \"string\" fields', async () => {\n      const fields: Field[] = [\n        {\n          name: 'virtualRef',\n          type: 'text',\n          virtual: 'post.title',\n        },\n      ]\n\n      const sanitizedField = (\n        await sanitizeFields({\n          config,\n          collectionConfig,\n          fields,\n          validRelationships: [],\n        })\n      )[0] as TextField\n\n      expect(sanitizedField.validate).toBeDefined()\n      expect(sanitizedField.validate!(undefined as any, {} as any)).toBe(true)\n    })\n\n    it('should not override an explicit validate on a virtual field', async () => {\n      const customValidate = () => true as const\n      const fields: Field[] = [\n        {\n          name: 'virtualText',\n          type: 'text',\n          virtual: true,\n          validate: customValidate,\n        },\n      ]\n\n      const sanitizedField = (\n        await sanitizeFields({\n          config,\n          collectionConfig,\n          fields,\n          validRelationships: [],\n        })\n      )[0] as TextField\n\n      expect(sanitizedField.validate).toBe(customValidate)\n    })\n\n    it('should assign default type-based validate for non-virtual fields', async () => {\n      const fields: Field[] = [\n        {\n          name: 'normalText',\n          type: 'text',\n        },\n      ]\n\n      const sanitizedField = (\n        await sanitizeFields({\n          config,\n          collectionConfig,\n          fields,\n          validRelationships: [],\n        })\n      )[0] as TextField\n\n      expect(sanitizedField.validate).toBeDefined()\n      // Non-virtual text field should use the text validator which checks required/minLength/etc.\n      // Passing undefined with required should fail\n      const result = sanitizedField.validate!(\n        undefined as any,\n        { required: true, req: { payload: { config: {} }, t: ((v: string) => v) as any } } as any,\n      )\n      expect(result).not.toBe(true)\n    })\n\n    it('should default readOnly to true for virtual: true fields', async () => {\n      const fields: Field[] = [\n        {\n          name: 'virtualText',\n          type: 'text',\n          virtual: true,\n        },\n      ]\n\n      const sanitizedField = (\n        await sanitizeFields({\n          config,\n          collectionConfig,\n          fields,\n          validRelationships: [],\n        })\n      )[0] as TextField\n\n      expect(sanitizedField.admin?.readOnly).toBe(true)\n    })\n\n    it('should default readOnly to true for virtual: \"string\" fields', async () => {\n      const fields: Field[] = [\n        {\n          name: 'virtualRef',\n          type: 'text',\n          virtual: 'post.title',\n        },\n      ]\n\n      const sanitizedField = (\n        await sanitizeFields({\n          config,\n          collectionConfig,\n          fields,\n          validRelationships: [],\n        })\n      )[0] as TextField\n\n      expect(sanitizedField.admin?.readOnly).toBe(true)\n    })\n\n    it('should not override readOnly: false on virtual fields', async () => {\n      const fields: Field[] = [\n        {\n          name: 'virtualText',\n          type: 'text',\n          virtual: true,\n          admin: { readOnly: false },\n        },\n      ]\n\n      const sanitizedField = (\n        await sanitizeFields({\n          config,\n          collectionConfig,\n          fields,\n          validRelationships: [],\n        })\n      )[0] as TextField\n\n      expect(sanitizedField.admin?.readOnly).toBe(false)\n    })\n\n    it('should not set readOnly on non-virtual fields', async () => {\n      const fields: Field[] = [\n        {\n          name: 'normalText',\n          type: 'text',\n        },\n      ]\n\n      const sanitizedField = (\n        await sanitizeFields({\n          config,\n          collectionConfig,\n          fields,\n          validRelationships: [],\n        })\n      )[0] as TextField\n\n      expect(sanitizedField.admin?.readOnly).toBeUndefined()\n    })\n  })\n})\n"],"names":["DuplicateFieldName","InvalidFieldName","InvalidFieldRelationship","MissingFieldType","sanitizeFields","describe","it","expect","config","collectionConfig","fields","name","label","validRelationships","rejects","toThrow","type","blocks","slug","sanitizedField","toStrictEqual","arrayField","labels","toBeUndefined","toMatchObject","plural","singular","relationTo","not","relationshipBlock","required","defaultValue","sanitizedFields","admin","disableBlockName","sanitizedBlock","undefined","virtual","validate","toBeDefined","toBe","customValidate","result","req","payload","t","v","readOnly"],"mappings":"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"}