@@ -91,6 +91,46 @@ export default class Entries extends BaseClass {
9191 return 'entries' ;
9292 }
9393
94+ /**
95+ * Returns whether a referenced entry's content type is allowed by the schema's reference_to.
96+ * @param refCtUid - Content type UID of the referenced entry (e.g. from _content_type_uid)
97+ * @param referenceTo - Schema's reference_to (string or string[])
98+ * @param configOverride - Optional config with skipRefs; falls back to this.config
99+ * @returns true if allowed or check cannot be performed; false if refCtUid is not in reference_to
100+ */
101+ protected isRefContentTypeAllowed (
102+ refCtUid : string | undefined ,
103+ referenceTo : string | string [ ] | undefined ,
104+ configOverride ?: { skipRefs ?: string [ ] } ,
105+ ) : boolean {
106+ if ( refCtUid === undefined ) return true ;
107+ const skipRefs = configOverride ?. skipRefs ?? ( this . config as any ) . skipRefs ?? [ ] ;
108+ if ( Array . isArray ( skipRefs ) && skipRefs . includes ( refCtUid ) ) return true ;
109+ if ( referenceTo === undefined || referenceTo === null ) return true ;
110+ const refToList = Array . isArray ( referenceTo ) ? referenceTo : [ referenceTo ] ;
111+ if ( refToList . length === 0 ) return false ;
112+ return refToList . includes ( refCtUid ) ;
113+ }
114+
115+ /**
116+ * If ref CT is not allowed, pushes to missingRefs.
117+ * @returns true if invalid (pushed), false if valid
118+ */
119+ private addInvalidRefIfNeeded (
120+ missingRefs : Record < string , any > [ ] ,
121+ uidValue : string ,
122+ refCtUid : string | undefined ,
123+ referenceTo : string | string [ ] | undefined ,
124+ fullRef : any ,
125+ logLabel : string ,
126+ ) : boolean {
127+ if ( this . isRefContentTypeAllowed ( refCtUid , referenceTo ) ) return false ;
128+ log . debug ( `${ logLabel } has wrong content type: ${ refCtUid } not in reference_to` ) ;
129+ const refList = Array . isArray ( referenceTo ) ? referenceTo : referenceTo != null ? [ referenceTo ] : [ ] ;
130+ missingRefs . push ( refList . length === 1 ? { uid : uidValue , _content_type_uid : refCtUid } : fullRef ) ;
131+ return true ;
132+ }
133+
94134 /**
95135 * The `run` function checks if a folder path exists, sets the schema based on the module name,
96136 * iterates over the schema and looks for references, and returns a list of missing references.
@@ -967,8 +1007,9 @@ export default class Entries extends BaseClass {
9671007
9681008 const missingRefs : Record < string , any > [ ] = [ ] ;
9691009 const { uid : data_type , display_name, reference_to } = fieldStructure ;
1010+ const refToList = Array . isArray ( reference_to ) ? reference_to : reference_to != null ? [ reference_to ] : [ ] ;
9701011 log . debug ( `Reference field UID: ${ data_type } ` ) ;
971- log . debug ( `Reference to: ${ reference_to ? .join ( ', ' ) || 'none' } ` ) ;
1012+ log . debug ( `Reference to: ${ refToList . join ( ', ' ) || 'none' } ` ) ;
9721013 log . debug ( `Found ${ field ?. length || 0 } references to validate` ) ;
9731014
9741015 for ( const index in field ?? [ ] ) {
@@ -987,7 +1028,10 @@ export default class Entries extends BaseClass {
9871028 missingRefs . push ( reference ) ;
9881029 }
9891030 } else {
990- log . debug ( `Reference ${ reference } is valid` ) ;
1031+ const refCtUid = refExist . ctUid ;
1032+ if ( ! this . addInvalidRefIfNeeded ( missingRefs , reference , refCtUid , reference_to , reference , `Reference ${ reference } ` ) ) {
1033+ log . debug ( `Reference ${ reference } is valid` ) ;
1034+ }
9911035 }
9921036 }
9931037 // NOTE Can skip specific references keys (Ex, system defined keys can be skipped)
@@ -1000,7 +1044,10 @@ export default class Entries extends BaseClass {
10001044 log . debug ( `Missing reference: ${ uid } ` ) ;
10011045 missingRefs . push ( reference ) ;
10021046 } else {
1003- log . debug ( `Reference ${ uid } is valid` ) ;
1047+ const refCtUid = reference . _content_type_uid ?? refExist . ctUid ;
1048+ if ( ! this . addInvalidRefIfNeeded ( missingRefs , uid , refCtUid , reference_to , reference , `Reference ${ uid } ` ) ) {
1049+ log . debug ( `Reference ${ uid } is valid` ) ;
1050+ }
10041051 }
10051052 }
10061053 }
@@ -1799,6 +1846,10 @@ export default class Entries extends BaseClass {
17991846 missingRefs . push ( reference ) ;
18001847 }
18011848 } else {
1849+ const refCtUid = reference . _content_type_uid ?? refExist . ctUid ;
1850+ if ( this . addInvalidRefIfNeeded ( missingRefs , reference , refCtUid , reference_to , reference , `Blt reference ${ reference } ` ) ) {
1851+ return null ;
1852+ }
18021853 log . debug ( `Blt reference ${ reference } is valid` ) ;
18031854 return { uid : reference , _content_type_uid : refExist . ctUid } ;
18041855 }
@@ -1810,6 +1861,10 @@ export default class Entries extends BaseClass {
18101861 missingRefs . push ( reference ) ;
18111862 return null ;
18121863 } else {
1864+ const refCtUid = reference . _content_type_uid ?? refExist . ctUid ;
1865+ if ( this . addInvalidRefIfNeeded ( missingRefs , uid , refCtUid , reference_to , reference , `Reference ${ uid } ` ) ) {
1866+ return null ;
1867+ }
18131868 log . debug ( `Reference ${ uid } is valid` ) ;
18141869 return reference ;
18151870 }
@@ -1941,6 +1996,25 @@ export default class Entries extends BaseClass {
19411996 log . debug ( `JSON reference check failed for entry: ${ entryUid } ` ) ;
19421997 return null ;
19431998 } else {
1999+ const refCtUid = contentTypeUid ?? refExist . ctUid ;
2000+ const referenceTo = ( schema as any ) . reference_to ;
2001+ if ( ! this . isRefContentTypeAllowed ( refCtUid , referenceTo ) ) {
2002+ log . debug ( `JSON RTE embed ${ entryUid } has wrong content type: ${ refCtUid } not in reference_to` ) ;
2003+ this . missingRefs [ this . currentUid ] . push ( {
2004+ tree,
2005+ uid : this . currentUid ,
2006+ name : this . currentTitle ,
2007+ data_type : schema . data_type ,
2008+ display_name : schema . display_name ,
2009+ fixStatus : this . fix ? 'Fixed' : undefined ,
2010+ treeStr : tree
2011+ . map ( ( { name } ) => name )
2012+ . filter ( ( val ) => val )
2013+ . join ( ' ➜ ' ) ,
2014+ missingRefs : [ { uid : entryUid , 'content-type-uid' : refCtUid } ] ,
2015+ } ) ;
2016+ return this . fix ? null : true ;
2017+ }
19442018 log . debug ( `Entry reference ${ entryUid } is valid` ) ;
19452019 }
19462020 } else {
0 commit comments