Skip to content

Commit d1783d6

Browse files
committed
merged latest changes
2 parents 38eb6e4 + 3b3556e commit d1783d6

File tree

8 files changed

+4951
-3023
lines changed

8 files changed

+4951
-3023
lines changed

.talismanrc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ fileignoreconfig:
22
- filename: packages/contentstack-import/src/import/modules/environments.ts
33
checksum: f61c635eaec8026e0cfa80a5ab8272f7946531f6d89505dc0d247b4c7ab0eab7
44
- filename: pnpm-lock.yaml
5-
checksum: c68233c37ae42eb0746d7e30b5bec0de902e335334cc3d2f24d63ee1dee0cd4f
5+
checksum: d0b4bc0ea17bfec6043ff580e9be666fccc80a07f995002834a9a3f8c29a2a56
66
- filename: package-lock.json
7-
checksum: fb88b090283d3a6c08fb1e789900fc3a702f4c64f0ea23f9366ed6e2125707b5
7+
checksum: 43bb22bfce4cabb8c8aaf66c85abee0cbe24aabf22ada66da1f485bed37e02c1
88
- filename: packages/contentstack-bootstrap/src/bootstrap/utils.ts
99
checksum: 5ab20e057fa9c4c300f7a882d30e1c68bbc91ed19de520488107e8c37239682a
1010
- filename: packages/contentstack-migration/README.md
@@ -14,5 +14,5 @@ fileignoreconfig:
1414
- filename: packages/contentstack/README.md
1515
checksum: 3a0fab964797476a71d2149ce261d265f410bd756eb9cde9400be9e5250fdc35
1616
- filename: packages/contentstack-audit/src/modules/entries.ts
17-
checksum: 39992b33a18b2c94e050957255997ed3972d60937719452ef7f68cdcb5c3edf7
17+
checksum: 8ad10d72522433bc5ce66079248aa2dabae1758ee63335024efd8526d76dd885
1818
version: '1.0'

package-lock.json

Lines changed: 78 additions & 16 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/contentstack-audit/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@contentstack/cli-audit",
3-
"version": "2.0.0-beta.4",
3+
"version": "2.0.0-beta.5",
44
"description": "Contentstack audit plugin",
55
"author": "Contentstack CLI",
66
"homepage": "https://github.com/contentstack/cli",

packages/contentstack-audit/src/modules/entries.ts

Lines changed: 77 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)