diff --git a/packages/basebuilder/src/builder-store.ts b/packages/basebuilder/src/builder-store.ts index 690c027..03f9589 100644 --- a/packages/basebuilder/src/builder-store.ts +++ b/packages/basebuilder/src/builder-store.ts @@ -241,17 +241,22 @@ async function validateEntityAttribute( id: entityId, }; - await attribute.validate(attributeValue, { - schema, - entity: serializedEntity, - }); - - await (builder.entitiesExtensions as EntitiesExtensions)[ - entity.type - ]?.attributes?.[attributeName]?.validate?.(attributeValue, { - schema, - entity: serializedEntity, - }); + const extensionValidator = ( + builder.entitiesExtensions as EntitiesExtensions + )[entity.type]?.attributes?.[attributeName]?.validate; + + if (extensionValidator) { + await extensionValidator?.(attributeValue, { + validate: attribute.validate, + schema, + entity: serializedEntity, + }); + } else { + await attribute.validate(attributeValue, { + schema, + entity: serializedEntity, + }); + } delete entityAttributesErrors?.[ attributeName as keyof EntityAttributesErrors diff --git a/packages/basebuilder/src/builder.ts b/packages/basebuilder/src/builder.ts index d2faf42..90ff823 100644 --- a/packages/basebuilder/src/builder.ts +++ b/packages/basebuilder/src/builder.ts @@ -16,14 +16,16 @@ export type EntitiesExtensions< { name: K } >["attributes"][number]["name"]]?: { validate?: ( - value: AttributesValues< - Extract["attributes"] - >[K2], + value: unknown, context: { schema: Schema>; entity: SchemaEntityWithId< Builder<[Extract]> >; + validate: Extract< + Extract["attributes"][number], + { name: K2 } + >["validate"]; }, ) => | AttributesValues< diff --git a/packages/basebuilder/src/schema.ts b/packages/basebuilder/src/schema.ts index 96ccffb..a7a7205 100644 --- a/packages/basebuilder/src/schema.ts +++ b/packages/basebuilder/src/schema.ts @@ -313,24 +313,22 @@ async function validateEntityAttributes( try { let attributeValue = entity.attributes[attribute.name]; - attributeValue = await attribute.validate(attributeValue, { - schema: schema, - entity: { - ...entity, - id: entity.id, - }, - }); - - attributeValue = - (await (builder.entitiesExtensions as EntitiesExtensions)[ - entity.type - ]?.attributes?.[attribute.name]?.validate?.(attributeValue, { + const extensionValidator = ( + builder.entitiesExtensions as EntitiesExtensions + )[entity.type]?.attributes?.[attribute.name]?.validate; + + if (extensionValidator) { + attributeValue = await extensionValidator(attributeValue, { + validate: attribute.validate, schema, - entity: { - ...entity, - id: entity.id, - }, - })) ?? attributeValue; + entity, + }); + } else { + attributeValue = await attribute.validate(attributeValue, { + schema: schema, + entity, + }); + } newAttributes[attribute.name] = attributeValue; } catch (error) {