{"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"],"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"],"mappings":"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"}