@lucidcms/core
Version:
The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.
2 lines • 7.04 kB
JavaScript
import{copy as e}from"../../../libs/i18n/copy.mjs";import t from"../../../constants/constants.mjs";import n from"../../../libs/logger/index.mjs";import{tenantAccessAllowed as r}from"../../../utils/helpers/tenants.mjs";import{isStorageMode as i}from"../../../libs/collection/custom-fields/storage/index.mjs";import{evaluateFieldCondition as a}from"../../../libs/collection/custom-fields/conditions/index.mjs";import o from"../helpers/fetch-validation-data.mjs";import s from"../../../libs/collection/custom-fields/registered-fields.mjs";const c=e=>`validation`in e&&typeof e.validation==`object`&&e.validation!==null,l=e=>e.config.ui?.condition,u=e=>{let t=new Map,n;for(let[r,i]of e.fields){if(i.type===`tab`){n=l(i);continue}let a=[];i.treeParent===null&&n&&a.push(n);let o=i.structuralParent;for(;o;){let t=e.fields.get(o);if(!t)break;let n=l(t);n&&a.push(n),o=t.structuralParent}a.length>0&&t.set(r,a)}return t},d=e=>t=>{let n=e.instance.fields.get(t);if(!n||n.type===`repeater`||n.type===`tab`||n.type===`section`||n.type===`collapsible`)return{resolved:!1};let r=e.scopes.find(e=>(e.treeParentKey??null)===n.treeParent);if(!r)return{resolved:!1};let i=r.fields.find(e=>e.key===t);if(!i)return e.collectionLocalized&&n.localizedEnabled&&e.translationScope===`any`?{resolved:!0,match:`any`,values:[n.defaultValue]}:{resolved:!0,value:n.defaultValue};if(i.translations&&e.collectionLocalized&&n.localizedEnabled){if(e.translationScope===`any`)return{resolved:!0,match:`any`,values:Object.values(i.translations).map(e=>n.normalizeInputValue(e))};let t=e.translationScope==="default"?e.defaultLocale:e.locale;return{resolved:!0,value:n.normalizeInputValue(i.translations[t])}}return{resolved:!0,value:n.normalizeInputValue(i.value)}},f=(e,t)=>e.translationScope&&e.translationScope!==`same`?e.translationScope:t?`same`:`default`,p=e=>{let t=l(e.fieldInstance),n=e.structuralConditions.get(e.fieldKey);if(!t&&!n)return!0;let r=(t,n)=>a(t,d({instance:e.instance,scopes:e.scopes,locale:e.locale,defaultLocale:e.defaultLocale,collectionLocalized:e.collectionLocalized,translationScope:f(t,n)}));for(let e of n??[])if(!r(e,!1))return!1;return!t||r(t,e.fieldInstance.localizedEnabled)},m=async(t,n)=>{let r=await o(t,n);if(r.error)return r;let i=h({bricks:n.bricks,collection:n.collection,validationData:r.data,defaultLocale:t.config.localization.defaultLocale,locales:t.config.localization.locales.map(e=>e.code),tenantKey:t.request.tenantKey}),a=g({fields:n.fields,instance:n.collection,validationData:r.data,meta:{localized:n.collection.getData.localized,defaultLocale:t.config.localization.defaultLocale,locales:t.config.localization.locales.map(e=>e.code)}});return i.length>0||a.length>0?{data:void 0,error:{type:`basic`,name:e(`server:core.fields.validation.error.name`),message:e(`server:core.fields.validation.error.message`),status:400,errors:{bricks:i,fields:a}}}:{data:void 0,error:void 0}},h=i=>{let a=[];for(let o of i.bricks){let s;switch(o.type){case`builder`:s=i.collection.config.bricks?.builder?.find(e=>e.key===o.key);break;case`fixed`:s=i.collection.config.bricks?.fixed?.find(e=>e.key===o.key);break}if(!s||!r(s.config.tenants,i.tenantKey)){n.error({scope:t.logScopes.validation,message:`Brick config was not found during document validation`,data:{key:o.key||``}}),a.push({ref:o.ref,key:o.key,order:o.order,fields:[{key:o.key,localeCode:null,message:e(`server:core.fields.lookup.not.found.in.collection.or.brick`)}]});continue}let c=g({fields:o.fields||[],instance:s,validationData:i.validationData,meta:{localized:i.collection.getData.localized,defaultLocale:i.defaultLocale,locales:i.locales}});c.length!==0&&a.push({ref:o.ref,key:o.key,order:o.order,fields:c})}return a},g=t=>{let n=[],r=[{treeParentKey:t.parentTreeFieldKey,fields:t.fields},...t.parentScopes??[]],a=t.structuralConditions??u(t.instance),o=(e,n,i)=>p({fieldKey:e,fieldInstance:n,instance:t.instance,scopes:r,locale:i,defaultLocale:t.meta.defaultLocale,collectionLocalized:t.meta.localized,structuralConditions:a});for(let c of t.fields){let l=t.instance.fields.get(c.key);if(!l){n.push({key:c.key,localeCode:null,message:e(`server:core.fields.lookup.not.found.in.collection.or.brick`)});continue}let u=s[l.type].config.database;if(i(u,`tree-table`)){if(!o(c.key,l,t.meta.defaultLocale))continue;let i=[],s=c.groups||[],u=l.validate({type:c.type,value:s});u.valid||n.push({key:c.key,localeCode:null,message:u.message||e(`server:core.fields.repeater.validation.field.contains.errors`)});for(let e=0;e<s.length;e++){let n=s[e];if(!n)continue;let o=g({fields:n.fields,instance:t.instance,validationData:t.validationData,parentTreeFieldKey:c.key,parentScopes:r,structuralConditions:a,meta:t.meta});o.length>0&&i.push({ref:n.ref,order:n.order||e,fields:o})}i.length>0&&n.push({key:c.key,localeCode:null,message:e(`server:core.fields.repeater.validation.field.contains.errors`),groupErrors:i});continue}let d=y({field:c,instance:l,validationData:t.validationData,meta:t.meta,isLocaleVisible:e=>o(c.key,l,e??t.meta.defaultLocale)});d.length>0&&n.push(...d)}let l=new Set(t.fields.map(e=>e.key));return t.instance.fields.forEach((r,i)=>{if(l.has(i))return;let a=r.treeParent;if(!(a&&a!==t.parentTreeFieldKey||!a&&t.parentTreeFieldKey)&&c(r.config)&&r.config.validation.required){if(t.meta.localized&&r.localizedEnabled&&t.meta.locales?.length){for(let a of _(t.meta))o(i,r,a)&&n.push({key:i,localeCode:a,message:e(`server:core.fields.validation.is.required`)});return}if(!o(i,r,t.meta.defaultLocale))return;n.push({key:i,localeCode:null,message:e(`server:core.fields.validation.is.required`)})}}),n},_=e=>{let t=new Set(e.locales??[]);return t.add(e.defaultLocale),Array.from(t)},v=(e,t)=>{let n=Object.keys(t);return e.locales?.length?Array.from(new Set([..._(e),...n])):n},y=t=>{let n=[],r=t.validationData[t.field.type],i=t.meta.localized&&t.instance.localizedEnabled,a=(n,r)=>(r?[{message:r}]:[{message:e(`server:core.fields.validation.errors.unknown`)}]).map(e=>({key:t.field.key,localeCode:n,message:e.message})),o=(n,r)=>r.errors?.length?r.errors.map(r=>({key:t.field.key,localeCode:n,message:r.message||e(`server:core.fields.validation.errors.unknown`),itemIndex:r.itemIndex})):a(n,r.message);if(t.field.translations){let e=i?v(t.meta,t.field.translations):Object.keys(t.field.translations);for(let i of e){if(t.isLocaleVisible&&!t.isLocaleVisible(i))continue;let e=t.field.translations[i],a=t.instance.validate({type:t.field.type,value:e,refData:r});a.valid||n.push(...o(i,a))}}else{if(i&&t.meta.locales?.length){for(let e of _(t.meta)){if(t.isLocaleVisible&&!t.isLocaleVisible(e))continue;let i=t.instance.validate({type:t.field.type,value:e===t.meta.defaultLocale?t.field.value:void 0,refData:r});i.valid||n.push(...o(e,i))}return n}if(t.isLocaleVisible&&!t.isLocaleVisible(null))return n;let e=t.instance.validate({type:t.field.type,value:t.field.value,refData:r});e.valid||n.push(...o(i?t.meta.defaultLocale:null,e))}return n};export{m as default,g as recursiveFieldValidate,y as validateField};
//# sourceMappingURL=check-validate-bricks-fields.mjs.map