@@ -5,7 +5,15 @@ import { v4 as uuid } from 'uuid';
55import isEmpty from 'lodash/isEmpty' ;
66import { join , resolve } from 'path' ;
77import cloneDeep from 'lodash/cloneDeep' ;
8- import { cliux , sanitizePath , TableFlags , TableHeader , log , configHandler , createLogContext } from '@contentstack/cli-utilities' ;
8+ import {
9+ cliux ,
10+ sanitizePath ,
11+ TableFlags ,
12+ TableHeader ,
13+ log ,
14+ configHandler ,
15+ createLogContext ,
16+ } from '@contentstack/cli-utilities' ;
917import { createWriteStream , existsSync , mkdirSync , readFileSync , writeFileSync , rmSync } from 'fs' ;
1018import config from './config' ;
1119import { print } from './util/log' ;
@@ -21,6 +29,7 @@ import {
2129 FieldRule ,
2230 ModuleDataReader ,
2331 CustomRoles ,
32+ ComposableStudio ,
2433} from './modules' ;
2534
2635import {
@@ -50,7 +59,6 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
5059 } ;
5160 }
5261
53-
5462 /**
5563 * The `start` function performs an audit on content types, global fields, entries, and workflows and displays
5664 * any missing references.
@@ -65,7 +73,6 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
6573 log . debug ( `Starting audit command: ${ command } ` , this . auditContext ) ;
6674 log . info ( `Starting audit command: ${ command } ` , this . auditContext ) ;
6775
68-
6976 await this . promptQueue ( ) ;
7077 await this . createBackUp ( ) ;
7178 this . sharedConfig . reportPath = resolve ( this . flags [ 'report-path' ] || process . cwd ( ) , 'audit-report' ) ;
@@ -86,6 +93,7 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
8693 missingEnvLocalesInEntries,
8794 missingFieldRules,
8895 missingMultipleFields,
96+ missingRefsInComposableStudio,
8997 } = await this . scanAndFix ( ) ;
9098
9199 if ( this . flags [ 'show-console-output' ] ) {
@@ -116,6 +124,7 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
116124 this . showOutputOnScreenWorkflowsAndExtension ( [
117125 { module : 'Entries Changed Multiple Fields' , missingRefs : missingMultipleFields } ,
118126 ] ) ;
127+ this . showOutputOnScreenWorkflowsAndExtension ( [ { module : 'Studio' , missingRefs : missingRefsInComposableStudio } ] ) ;
119128 }
120129 this . showOutputOnScreenWorkflowsAndExtension ( [ { module : 'Summary' , missingRefs : this . summaryDataToPrint } ] ) ;
121130
@@ -131,12 +140,16 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
131140 ! isEmpty ( missingEnvLocalesInAssets ) ||
132141 ! isEmpty ( missingEnvLocalesInEntries ) ||
133142 ! isEmpty ( missingFieldRules ) ||
134- ! isEmpty ( missingMultipleFields )
143+ ! isEmpty ( missingMultipleFields ) ||
144+ ! isEmpty ( missingRefsInComposableStudio )
135145 ) {
136146 if ( this . currentCommand === 'cm:stacks:audit' ) {
137147 log . warn ( this . $t ( auditMsg . FINAL_REPORT_PATH , { path : this . sharedConfig . reportPath } ) , this . auditContext ) ;
138148 } else {
139- log . warn ( this . $t ( this . messages . FIXED_CONTENT_PATH_MAG , { path : this . sharedConfig . basePath } ) , this . auditContext ) ;
149+ log . warn (
150+ this . $t ( this . messages . FIXED_CONTENT_PATH_MAG , { path : this . sharedConfig . basePath } ) ,
151+ this . auditContext ,
152+ ) ;
140153 }
141154 } else {
142155 log . info ( this . messages . NO_MISSING_REF_FOUND , this . auditContext ) ;
@@ -162,7 +175,8 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
162175 ! isEmpty ( missingRefInCustomRoles ) ||
163176 ! isEmpty ( missingEnvLocalesInAssets ) ||
164177 ! isEmpty ( missingEnvLocalesInEntries ) ||
165- ! isEmpty ( missingFieldRules )
178+ ! isEmpty ( missingFieldRules ) ||
179+ ! isEmpty ( missingRefsInComposableStudio )
166180 ) ;
167181 }
168182
@@ -175,8 +189,11 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
175189 async scanAndFix ( ) {
176190 log . debug ( 'Starting scan and fix process' , this . auditContext ) ;
177191 let { ctSchema, gfSchema } = this . getCtAndGfSchema ( ) ;
178- log . info ( `Retrieved ${ ctSchema ?. length || 0 } content types and ${ gfSchema ?. length || 0 } global fields` , this . auditContext ) ;
179-
192+ log . info (
193+ `Retrieved ${ ctSchema ?. length || 0 } content types and ${ gfSchema ?. length || 0 } global fields` ,
194+ this . auditContext ,
195+ ) ;
196+
180197 let missingCtRefs ,
181198 missingGfRefs ,
182199 missingEntryRefs ,
@@ -197,7 +214,8 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
197214 missingEnvLocalesInAssets ,
198215 missingEnvLocalesInEntries ,
199216 missingFieldRules ,
200- missingMultipleFields ;
217+ missingMultipleFields ,
218+ missingRefsInComposableStudio ;
201219
202220 const constructorParam : ModuleConstructorParam & CtConstructorParam = {
203221 ctSchema,
@@ -233,21 +251,30 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
233251 missingEnvLocalesInAssets = await new Assets ( cloneDeep ( constructorParam ) ) . run ( ) ;
234252 await this . prepareReport ( module , missingEnvLocalesInAssets ) ;
235253 this . getAffectedData ( 'assets' , dataModuleWise [ 'assets' ] , missingEnvLocalesInAssets ) ;
236- log . success ( `Assets audit completed. Found ${ Object . keys ( missingEnvLocalesInAssets || { } ) . length } issues` , this . auditContext ) ;
254+ log . success (
255+ `Assets audit completed. Found ${ Object . keys ( missingEnvLocalesInAssets || { } ) . length } issues` ,
256+ this . auditContext ,
257+ ) ;
237258 break ;
238259 case 'content-types' :
239260 log . info ( 'Executing content-types audit' , this . auditContext ) ;
240261 missingCtRefs = await new ContentType ( cloneDeep ( constructorParam ) ) . run ( ) ;
241262 await this . prepareReport ( module , missingCtRefs ) ;
242263 this . getAffectedData ( 'content-types' , dataModuleWise [ 'content-types' ] , missingCtRefs ) ;
243- log . success ( `Content-types audit completed. Found ${ Object . keys ( missingCtRefs || { } ) . length } issues` , this . auditContext ) ;
264+ log . success (
265+ `Content-types audit completed. Found ${ Object . keys ( missingCtRefs || { } ) . length } issues` ,
266+ this . auditContext ,
267+ ) ;
244268 break ;
245269 case 'global-fields' :
246270 log . info ( 'Executing global-fields audit' , this . auditContext ) ;
247271 missingGfRefs = await new GlobalField ( cloneDeep ( constructorParam ) ) . run ( ) ;
248272 await this . prepareReport ( module , missingGfRefs ) ;
249273 this . getAffectedData ( 'global-fields' , dataModuleWise [ 'global-fields' ] , missingGfRefs ) ;
250- log . success ( `Global-fields audit completed. Found ${ Object . keys ( missingGfRefs || { } ) . length } issues` , this . auditContext ) ;
274+ log . success (
275+ `Global-fields audit completed. Found ${ Object . keys ( missingGfRefs || { } ) . length } issues` ,
276+ this . auditContext ,
277+ ) ;
251278 break ;
252279 case 'entries' :
253280 log . info ( 'Executing entries audit' , this . auditContext ) ;
@@ -270,7 +297,10 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
270297
271298 await this . prepareReport ( 'Entry_Multiple_Fields' , missingMultipleFields ) ;
272299 this . getAffectedData ( 'entries' , dataModuleWise [ 'entries' ] , missingEntry ) ;
273- log . success ( `Entries audit completed. Found ${ Object . keys ( missingEntryRefs || { } ) . length } reference issues` , this . auditContext ) ;
300+ log . success (
301+ `Entries audit completed. Found ${ Object . keys ( missingEntryRefs || { } ) . length } reference issues` ,
302+ this . auditContext ,
303+ ) ;
274304
275305 break ;
276306 case 'workflows' :
@@ -283,34 +313,62 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
283313 } ) . run ( ) ;
284314 await this . prepareReport ( module , missingCtRefsInWorkflow ) ;
285315 this . getAffectedData ( 'workflows' , dataModuleWise [ 'workflows' ] , missingCtRefsInWorkflow ) ;
286- log . success ( `Workflows audit completed. Found ${ Object . keys ( missingCtRefsInWorkflow || { } ) . length } issues` , this . auditContext ) ;
316+ log . success (
317+ `Workflows audit completed. Found ${ Object . keys ( missingCtRefsInWorkflow || { } ) . length } issues` ,
318+ this . auditContext ,
319+ ) ;
287320
288321 break ;
289322 case 'extensions' :
290323 log . info ( 'Executing extensions audit' , this . auditContext ) ;
291324 missingCtRefsInExtensions = await new Extensions ( cloneDeep ( constructorParam ) ) . run ( ) ;
292325 await this . prepareReport ( module , missingCtRefsInExtensions ) ;
293326 this . getAffectedData ( 'extensions' , dataModuleWise [ 'extensions' ] , missingCtRefsInExtensions ) ;
294- log . success ( `Extensions audit completed. Found ${ Object . keys ( missingCtRefsInExtensions || { } ) . length } issues` , this . auditContext ) ;
327+ log . success (
328+ `Extensions audit completed. Found ${ Object . keys ( missingCtRefsInExtensions || { } ) . length } issues` ,
329+ this . auditContext ,
330+ ) ;
295331 break ;
296332 case 'custom-roles' :
297333 log . info ( 'Executing custom-roles audit' , this . auditContext ) ;
298334 missingRefInCustomRoles = await new CustomRoles ( cloneDeep ( constructorParam ) ) . run ( ) ;
299335 await this . prepareReport ( module , missingRefInCustomRoles ) ;
300336 this . getAffectedData ( 'custom-roles' , dataModuleWise [ 'custom-roles' ] , missingRefInCustomRoles ) ;
301- log . success ( `Custom-roles audit completed. Found ${ Object . keys ( missingRefInCustomRoles || { } ) . length } issues` , this . auditContext ) ;
337+ log . success (
338+ `Custom-roles audit completed. Found ${ Object . keys ( missingRefInCustomRoles || { } ) . length } issues` ,
339+ this . auditContext ,
340+ ) ;
302341
303342 break ;
304343 case 'field-rules' :
305344 log . info ( 'Executing field-rules audit' , this . auditContext ) ;
306345 // NOTE: We are using the fixed content-type for validation of field rules
307- const data = this . getCtAndGfSchema ( ) ;
346+ const data = this . getCtAndGfSchema ( ) ;
308347 constructorParam . ctSchema = data . ctSchema ;
309348 constructorParam . gfSchema = data . gfSchema ;
310349 missingFieldRules = await new FieldRule ( cloneDeep ( constructorParam ) ) . run ( ) ;
311350 await this . prepareReport ( module , missingFieldRules ) ;
312351 this . getAffectedData ( 'field-rules' , dataModuleWise [ 'content-types' ] , missingFieldRules ) ;
313- log . success ( `Field-rules audit completed. Found ${ Object . keys ( missingFieldRules || { } ) . length } issues` , this . auditContext ) ;
352+ log . success (
353+ `Field-rules audit completed. Found ${ Object . keys ( missingFieldRules || { } ) . length } issues` ,
354+ this . auditContext ,
355+ ) ;
356+ break ;
357+ case 'composable-studio' :
358+ log . info ( 'Executing composable-studio audit' , this . auditContext ) ;
359+ missingRefsInComposableStudio = await new ComposableStudio ( cloneDeep ( constructorParam ) ) . run ( ) ;
360+ await this . prepareReport ( module , missingRefsInComposableStudio ) ;
361+ this . getAffectedData (
362+ 'composable-studio' ,
363+ dataModuleWise [ 'composable-studio' ] || { Total : Object . keys ( missingRefsInComposableStudio || { } ) . length } ,
364+ missingRefsInComposableStudio ,
365+ ) ;
366+ log . success (
367+ `Composable-studio audit completed. Found ${
368+ Object . keys ( missingRefsInComposableStudio || { } ) . length
369+ } issues`,
370+ this . auditContext ,
371+ ) ;
314372 break ;
315373 }
316374
@@ -345,6 +403,7 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
345403 missingEnvLocalesInEntries,
346404 missingFieldRules,
347405 missingMultipleFields,
406+ missingRefsInComposableStudio,
348407 } ;
349408 }
350409
@@ -488,7 +547,7 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
488547 }
489548
490549 print ( [ { bold : true , color : 'cyan' , message : ` ${ module } ` } ] ) ;
491-
550+
492551 const tableValues = Object . values ( missingRefs ) . flat ( ) ;
493552 missingRefs = Object . values ( missingRefs ) . flat ( ) ;
494553 const tableKeys = Object . keys ( missingRefs [ 0 ] ) ;
@@ -542,7 +601,7 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
542601 log . debug ( `Preparing report for module: ${ moduleName } ` , this . auditContext ) ;
543602 log . debug ( `Report path: ${ this . sharedConfig . reportPath } ` , this . auditContext ) ;
544603 log . info ( `Missing references count: ${ Object . keys ( listOfMissingRefs ) . length } ` , this . auditContext ) ;
545-
604+
546605 if ( isEmpty ( listOfMissingRefs ) ) {
547606 log . debug ( `No missing references found for ${ moduleName } , skipping report generation` , this . auditContext ) ;
548607 return Promise . resolve ( void 0 ) ;
0 commit comments