diff --git a/packages/compass-data-modeling/src/utils/schema-traversal.spec.tsx b/packages/compass-data-modeling/src/utils/schema-traversal.spec.tsx index 252869cf8d5..9b7a0e59a8e 100644 --- a/packages/compass-data-modeling/src/utils/schema-traversal.spec.tsx +++ b/packages/compass-data-modeling/src/utils/schema-traversal.spec.tsx @@ -518,6 +518,23 @@ describe('removeField', function () { }, }); }); + + it('clean up required', function () { + const schema = { + bsonType: 'object', + properties: { + name: { bsonType: 'string' }, + age: { bsonType: ['string', 'int'] }, + }, + required: ['name', 'age'], + }; + const result = updateSchema({ + fieldPath: ['name'], + jsonSchema: schema, + update: 'removeField', + }); + expect(result.required).to.deep.equal(['age']); + }); }); describe('nested schema', function () { @@ -797,6 +814,24 @@ describe('renameField', function () { }, }); }); + + it('update required', function () { + const schema = { + bsonType: 'object', + properties: { + name: { bsonType: 'string' }, + age: { bsonType: ['string', 'int'] }, + }, + required: ['name', 'age'], + }; + const result = updateSchema({ + fieldPath: ['name'], + jsonSchema: schema, + update: 'renameField', + newFieldName: 'newName', + }); + expect(result.required).to.deep.equal(['newName', 'age']); + }); }); describe('nested schema', function () { diff --git a/packages/compass-data-modeling/src/utils/schema-traversal.tsx b/packages/compass-data-modeling/src/utils/schema-traversal.tsx index 80358124260..8a8afb793eb 100644 --- a/packages/compass-data-modeling/src/utils/schema-traversal.tsx +++ b/packages/compass-data-modeling/src/utils/schema-traversal.tsx @@ -184,19 +184,26 @@ const applySchemaUpdate = ({ case 'removeField': { if (!schema.properties || !schema.properties[fieldName]) throw new Error('Field to remove does not exist'); - return { + const newSchema = { ...schema, properties: Object.fromEntries( Object.entries(schema.properties).filter(([key]) => key !== fieldName) ), }; + // clean up required if needed + if (newSchema.required && Array.isArray(newSchema.required)) { + newSchema.required = newSchema.required.filter( + (key) => key !== fieldName + ); + } + return newSchema; } case 'renameField': { if (!schema.properties || !schema.properties[fieldName]) throw new Error('Field to rename does not exist'); if (!newFieldName) throw new Error('New field name is required for the rename operation'); - return { + const newSchema = { ...schema, properties: Object.fromEntries( Object.entries(schema.properties).map(([key, value]) => @@ -204,6 +211,13 @@ const applySchemaUpdate = ({ ) ), }; + // update required if needed + if (newSchema.required && Array.isArray(newSchema.required)) { + newSchema.required = newSchema.required.map((key) => + key !== fieldName ? key : newFieldName + ); + } + return newSchema; } default: return schema;