Skip to content

Commit 91ab956

Browse files
Merge pull request #2344 from contentstack/fix/merge-development-to-beta
Fix/merge development to beta
2 parents d21b093 + 3db3c65 commit 91ab956

148 files changed

Lines changed: 29050 additions & 23623 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.talismanrc

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,24 @@
11
fileignoreconfig:
22
- filename: pnpm-lock.yaml
3-
checksum: 41bc1d60449ab0682d9267172e54a5802c837869a1728b0560eea8052336c2fe
3+
checksum: 9188a8a814516e4f0633c2c8bfaa79ad7e1ada621bd2926c9b5b2c6a61763c06
44
- filename: package-lock.json
5-
checksum: 134104853f260380025e0d7e2b49ec32f15a1832b20756676819ce0bc4277c44
5+
checksum: 48485ed945783136e50845498e99aa3ce101e0fb1cbd70f5df18227e646316c0
6+
- filename: packages/contentstack-audit/test/unit/mock/contents/composable_studio/environments/environments.json
7+
checksum: 0402604e5919a7e38ecb5ff0916d6ae5ab7d98fe78ff6ac9eba8a9b8130af34d
8+
- filename: packages/contentstack-utilities/src/helpers.ts
9+
checksum: 6a741bb972f59c56d2c0f3a9f96e2963392361db2e401948c9c1796829478e13
10+
- filename: packages/contentstack-audit/test/unit/mock/contents/composable_studio/composable_studio.json
11+
checksum: 6912e5ea32b4456ad04d1645750c72bbb29ab1895368c3a242ab39e9350ec531
12+
- filename: packages/contentstack-utilities/src/logger/session-path.ts
13+
checksum: 4c66980a857bc12012a45e50790c0eaab06883db5e1476d84fb142a08b70b2e7
14+
- filename: packages/contentstack-import/test/unit/commands/cm/stacks/import.test.ts
15+
checksum: a9e24596e7ae54b71cc28a41cf9d65bbdbf6754446e08958288e90a579cc351d
16+
- filename: packages/contentstack-audit/src/modules/modulesData.ts
17+
checksum: 1e6c1fba1172512401038d5454c8d218201ec62262449c5c878609592e0124c4
18+
- filename: packages/contentstack-audit/test/unit/mock/contents/composable_studio/invalid_composable_studio.json
19+
checksum: e6465aa0011d1565a2de848d9cca74395d11419e6ac840e7dfb52e1d255b1c4f
20+
- filename: packages/contentstack-audit/src/modules/composable-studio.ts
21+
checksum: 4fc97ff582d6dff9a54b3a50dfa3cbb5febd38a55aeb8737034b97188ad543ba
22+
- filename: packages/contentstack-utilities/test/unit/logger.test.ts
23+
checksum: a1939dea16166b1893a248179524a76f2ed20b04b99c83bd1a5a13fcf6f0dadc
624
version: "1.0"

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
Please refer to the Contentstack Command-line Interface release notes [here](https://www.contentstack.com/docs/developers/cli/cli-changelog).
44

5+
## @contentstack/cli-cm-clone
6+
### Version: 1.8.2
7+
#### Date: June-30-2025
8+
##### Fix:
9+
- resolve stack-clone auth failure for non-NA regions
10+
511
## @contentstack/cli-config
612
### Version: 1.13.1
713
#### Date: July-21-2025

package-lock.json

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

packages/contentstack-audit/LICENSE

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
MIT License
22

3-
Copyright (c) 2024 Contentstack
3+
Copyright (c) 2026 Contentstack
44

55
Permission is hereby granted, free of charge, to any person obtaining a copy
66
of this software and associated documentation files (the "Software"), to deal

packages/contentstack-audit/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"/oclif.manifest.json"
1919
],
2020
"dependencies": {
21-
"@contentstack/cli-command": "~1.6.1",
21+
"@contentstack/cli-command": "~1.7.2",
2222
"@contentstack/cli-utilities": "~1.15.0",
2323
"@oclif/core": "^4.3.0",
2424
"@oclif/plugin-help": "^6.2.28",
@@ -44,7 +44,7 @@
4444
"nyc": "^15.1.0",
4545
"oclif": "^4.17.46",
4646
"shx": "^0.4.0",
47-
"sinon": "^19.0.5",
47+
"sinon": "^21.0.1",
4848
"ts-node": "^10.9.2",
4949
"typescript": "^5.8.3"
5050
},

packages/contentstack-audit/src/audit-base-command.ts

Lines changed: 71 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import {
2121
FieldRule,
2222
ModuleDataReader,
2323
CustomRoles,
24+
ComposableStudio,
2425
} from './modules';
2526

2627
import {
@@ -50,19 +51,6 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
5051
};
5152
}
5253

53-
/**
54-
* Create audit context object similar to export command
55-
*/
56-
private createAuditContext(moduleName?: string): AuditContext {
57-
return {
58-
command: this.context?.info?.command || 'cm:stacks:audit',
59-
module: moduleName || 'audit',
60-
email: configHandler.get('email') || '',
61-
sessionId: this.context?.sessionId || '',
62-
authenticationMethod: configHandler.get('authenticationMethod') || '',
63-
};
64-
}
65-
6654
/**
6755
* The `start` function performs an audit on content types, global fields, entries, and workflows and displays
6856
* any missing references.
@@ -81,11 +69,6 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
8169
}
8270
configHandler.set('log.progressSupportedModule', 'audit');
8371

84-
// Initialize audit context
85-
this.auditContext = this.createAuditContext();
86-
log.debug(`Starting audit command: ${command}`, this.auditContext);
87-
log.info(`Starting audit command: ${command}`, this.auditContext);
88-
8972
// Initialize global summary for progress tracking
9073
CLIProgressManager.initializeGlobalSummary('AUDIT', '', 'Auditing content...');
9174

@@ -109,6 +92,7 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
10992
missingEnvLocalesInEntries,
11093
missingFieldRules,
11194
missingMultipleFields,
95+
missingRefsInComposableStudio,
11296
} = await this.scanAndFix();
11397

11498
if (this.flags['show-console-output']) {
@@ -139,6 +123,7 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
139123
this.showOutputOnScreenWorkflowsAndExtension([
140124
{ module: 'Entries Changed Multiple Fields', missingRefs: missingMultipleFields },
141125
]);
126+
this.showOutputOnScreenWorkflowsAndExtension([{ module: 'Studio', missingRefs: missingRefsInComposableStudio }]);
142127
}
143128
this.showOutputOnScreenWorkflowsAndExtension([{ module: 'Summary', missingRefs: this.summaryDataToPrint }]);
144129

@@ -154,12 +139,16 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
154139
!isEmpty(missingEnvLocalesInAssets) ||
155140
!isEmpty(missingEnvLocalesInEntries) ||
156141
!isEmpty(missingFieldRules) ||
157-
!isEmpty(missingMultipleFields)
142+
!isEmpty(missingMultipleFields) ||
143+
!isEmpty(missingRefsInComposableStudio)
158144
) {
159145
if (this.currentCommand === 'cm:stacks:audit') {
160146
log.warn(this.$t(auditMsg.FINAL_REPORT_PATH, { path: this.sharedConfig.reportPath }), this.auditContext);
161147
} else {
162-
log.warn(this.$t(this.messages.FIXED_CONTENT_PATH_MAG, { path: this.sharedConfig.basePath }), this.auditContext);
148+
log.warn(
149+
this.$t(this.messages.FIXED_CONTENT_PATH_MAG, { path: this.sharedConfig.basePath }),
150+
this.auditContext,
151+
);
163152
}
164153
} else {
165154
log.info(this.messages.NO_MISSING_REF_FOUND, this.auditContext);
@@ -191,7 +180,8 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
191180
!isEmpty(missingRefInCustomRoles) ||
192181
!isEmpty(missingEnvLocalesInAssets) ||
193182
!isEmpty(missingEnvLocalesInEntries) ||
194-
!isEmpty(missingFieldRules)
183+
!isEmpty(missingFieldRules) ||
184+
!isEmpty(missingRefsInComposableStudio)
195185
);
196186
}
197187

@@ -204,8 +194,11 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
204194
async scanAndFix() {
205195
log.debug('Starting scan and fix process', this.auditContext);
206196
let { ctSchema, gfSchema } = this.getCtAndGfSchema();
207-
log.info(`Retrieved ${ctSchema?.length || 0} content types and ${gfSchema?.length || 0} global fields`, this.auditContext);
208-
197+
log.info(
198+
`Retrieved ${ctSchema?.length || 0} content types and ${gfSchema?.length || 0} global fields`,
199+
this.auditContext,
200+
);
201+
209202
let missingCtRefs,
210203
missingGfRefs,
211204
missingEntryRefs,
@@ -226,7 +219,8 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
226219
missingEnvLocalesInAssets,
227220
missingEnvLocalesInEntries,
228221
missingFieldRules,
229-
missingMultipleFields;
222+
missingMultipleFields,
223+
missingRefsInComposableStudio;
230224

231225
const constructorParam: ModuleConstructorParam & CtConstructorParam = {
232226
ctSchema,
@@ -247,7 +241,7 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
247241

248242
for (const module of this.sharedConfig.flags.modules || this.sharedConfig.modules) {
249243
// Update audit context with current module
250-
this.auditContext = this.createAuditContext(module);
244+
this.auditContext = { module: module };
251245
log.debug(`Starting audit for module: ${module}`, this.auditContext);
252246
log.info(`Starting audit for module: ${module}`, this.auditContext);
253247

@@ -271,23 +265,32 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
271265
missingEnvLocalesInAssets = await new Assets(cloneDeep(constructorParam)).run(false, assetsTotalCount);
272266
await this.prepareReport(module, missingEnvLocalesInAssets);
273267
this.getAffectedData('assets', dataModuleWise['assets'], missingEnvLocalesInAssets);
274-
log.success(`Assets audit completed. Found ${Object.keys(missingEnvLocalesInAssets || {}).length} issues`, this.auditContext);
268+
log.success(
269+
`Assets audit completed. Found ${Object.keys(missingEnvLocalesInAssets || {}).length} issues`,
270+
this.auditContext,
271+
);
275272
break;
276273
case 'content-types':
277274
log.info('Executing content-types audit', this.auditContext);
278275
const contentTypesTotalCount = dataModuleWise['content-types']?.Total || 0;
279276
missingCtRefs = await new ContentType(cloneDeep(constructorParam)).run(false, contentTypesTotalCount);
280277
await this.prepareReport(module, missingCtRefs);
281278
this.getAffectedData('content-types', dataModuleWise['content-types'], missingCtRefs);
282-
log.success(`Content-types audit completed. Found ${Object.keys(missingCtRefs || {}).length} issues`, this.auditContext);
279+
log.success(
280+
`Content-types audit completed. Found ${Object.keys(missingCtRefs || {}).length} issues`,
281+
this.auditContext,
282+
);
283283
break;
284284
case 'global-fields':
285285
log.info('Executing global-fields audit', this.auditContext);
286286
const globalFieldsTotalCount = dataModuleWise['global-fields']?.Total || 0;
287287
missingGfRefs = await new GlobalField(cloneDeep(constructorParam)).run(false, globalFieldsTotalCount);
288288
await this.prepareReport(module, missingGfRefs);
289289
this.getAffectedData('global-fields', dataModuleWise['global-fields'], missingGfRefs);
290-
log.success(`Global-fields audit completed. Found ${Object.keys(missingGfRefs || {}).length} issues`, this.auditContext);
290+
log.success(
291+
`Global-fields audit completed. Found ${Object.keys(missingGfRefs || {}).length} issues`,
292+
this.auditContext,
293+
);
291294
break;
292295
case 'entries':
293296
log.info('Executing entries audit', this.auditContext);
@@ -311,7 +314,10 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
311314

312315
await this.prepareReport('Entry_Multiple_Fields', missingMultipleFields);
313316
this.getAffectedData('entries', dataModuleWise['entries'], missingEntry);
314-
log.success(`Entries audit completed. Found ${Object.keys(missingEntryRefs || {}).length} reference issues`, this.auditContext);
317+
log.success(
318+
`Entries audit completed. Found ${Object.keys(missingEntryRefs || {}).length} reference issues`,
319+
this.auditContext,
320+
);
315321

316322
break;
317323
case 'workflows':
@@ -325,7 +331,10 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
325331
}).run(workflowsTotalCount);
326332
await this.prepareReport(module, missingCtRefsInWorkflow);
327333
this.getAffectedData('workflows', dataModuleWise['workflows'], missingCtRefsInWorkflow);
328-
log.success(`Workflows audit completed. Found ${Object.keys(missingCtRefsInWorkflow || {}).length} issues`, this.auditContext);
334+
log.success(
335+
`Workflows audit completed. Found ${Object.keys(missingCtRefsInWorkflow || {}).length} issues`,
336+
this.auditContext,
337+
);
329338

330339
break;
331340
case 'extensions':
@@ -334,28 +343,53 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
334343
missingCtRefsInExtensions = await new Extensions(cloneDeep(constructorParam)).run(extensionsTotalCount);
335344
await this.prepareReport(module, missingCtRefsInExtensions);
336345
this.getAffectedData('extensions', dataModuleWise['extensions'], missingCtRefsInExtensions);
337-
log.success(`Extensions audit completed. Found ${Object.keys(missingCtRefsInExtensions || {}).length} issues`, this.auditContext);
346+
log.success(
347+
`Extensions audit completed. Found ${Object.keys(missingCtRefsInExtensions || {}).length} issues`,
348+
this.auditContext,
349+
);
338350
break;
339351
case 'custom-roles':
340352
log.info('Executing custom-roles audit', this.auditContext);
341353
const customRolesTotalCount = dataModuleWise['custom-roles']?.Total || 0;
342354
missingRefInCustomRoles = await new CustomRoles(cloneDeep(constructorParam)).run(customRolesTotalCount);
343355
await this.prepareReport(module, missingRefInCustomRoles);
344356
this.getAffectedData('custom-roles', dataModuleWise['custom-roles'], missingRefInCustomRoles);
345-
log.success(`Custom-roles audit completed. Found ${Object.keys(missingRefInCustomRoles || {}).length} issues`, this.auditContext);
357+
log.success(
358+
`Custom-roles audit completed. Found ${Object.keys(missingRefInCustomRoles || {}).length} issues`,
359+
this.auditContext,
360+
);
346361

347362
break;
348363
case 'field-rules':
349364
log.info('Executing field-rules audit', this.auditContext);
350365
// NOTE: We are using the fixed content-type for validation of field rules
351-
const data = this.getCtAndGfSchema();
366+
const data = this.getCtAndGfSchema();
352367
constructorParam.ctSchema = data.ctSchema;
353368
constructorParam.gfSchema = data.gfSchema;
354369
const fieldRulesTotalCount = dataModuleWise['content-types']?.Total || 0;
355370
missingFieldRules = await new FieldRule(cloneDeep(constructorParam)).run(fieldRulesTotalCount);
356371
await this.prepareReport(module, missingFieldRules);
357372
this.getAffectedData('field-rules', dataModuleWise['content-types'], missingFieldRules);
358-
log.success(`Field-rules audit completed. Found ${Object.keys(missingFieldRules || {}).length} issues`, this.auditContext);
373+
log.success(
374+
`Field-rules audit completed. Found ${Object.keys(missingFieldRules || {}).length} issues`,
375+
this.auditContext,
376+
);
377+
break;
378+
case 'composable-studio':
379+
log.info('Executing composable-studio audit', this.auditContext);
380+
missingRefsInComposableStudio = await new ComposableStudio(cloneDeep(constructorParam)).run();
381+
await this.prepareReport(module, missingRefsInComposableStudio);
382+
this.getAffectedData(
383+
'composable-studio',
384+
dataModuleWise['composable-studio'] || { Total: Object.keys(missingRefsInComposableStudio || {}).length },
385+
missingRefsInComposableStudio,
386+
);
387+
log.success(
388+
`Composable-studio audit completed. Found ${
389+
Object.keys(missingRefsInComposableStudio || {}).length
390+
} issues`,
391+
this.auditContext,
392+
);
359393
break;
360394
}
361395

@@ -393,6 +427,7 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
393427
missingEnvLocalesInEntries,
394428
missingFieldRules,
395429
missingMultipleFields,
430+
missingRefsInComposableStudio,
396431
};
397432
}
398433

@@ -536,7 +571,7 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
536571
}
537572

538573
print([{ bold: true, color: 'cyan', message: ` ${module}` }]);
539-
574+
540575
const tableValues = Object.values(missingRefs).flat();
541576
missingRefs = Object.values(missingRefs).flat();
542577
const tableKeys = Object.keys(missingRefs[0]);
@@ -590,7 +625,7 @@ export abstract class AuditBaseCommand extends BaseCommand<typeof AuditBaseComma
590625
log.debug(`Preparing report for module: ${moduleName}`, this.auditContext);
591626
log.debug(`Report path: ${this.sharedConfig.reportPath}`, this.auditContext);
592627
log.info(`Missing references count: ${Object.keys(listOfMissingRefs).length}`, this.auditContext);
593-
628+
594629
if (isEmpty(listOfMissingRefs)) {
595630
log.debug(`No missing references found for ${moduleName}, skipping report generation`, this.auditContext);
596631
return Promise.resolve(void 0);

packages/contentstack-audit/src/config/index.ts

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,10 @@ const config = {
1111
'custom-roles',
1212
'assets',
1313
'field-rules',
14+
'composable-studio',
1415
],
1516
'fix-fields': ['reference', 'global_field', 'json:rte', 'json:extension', 'blocks', 'group', 'content_types'],
16-
'schema-fields-data-type': ['blocks','group','global_field'],
17+
'schema-fields-data-type': ['blocks', 'group', 'global_field'],
1718
moduleConfig: {
1819
'content-types': {
1920
name: 'content type',
@@ -60,6 +61,11 @@ const config = {
6061
dirName: 'environments',
6162
fileName: 'environments.json',
6263
},
64+
'composable-studio': {
65+
name: 'composable-studio',
66+
dirName: 'composable_studio',
67+
fileName: 'composable_studio.json',
68+
},
6369
},
6470
entries: {
6571
systemKeys: [
@@ -107,21 +113,22 @@ const config = {
107113
'selectedValue',
108114
'ct_uid',
109115
'action',
110-
"Module",
111-
"Total",
112-
"Fixable",
113-
"Non-Fixable",
114-
"Fixed",
115-
"Not-Fixed",
116-
"Passed",
116+
'Module',
117+
'Total',
118+
'Fixable',
119+
'Non-Fixable',
120+
'Fixed',
121+
'Not-Fixed',
122+
'Passed',
123+
'issues',
117124
],
118125
ReportTitleForEntries: {
119126
Entries_Select_field: 'Entries_Select_field',
120127
Entries_Mandatory_field: 'Entries_Mandatory_field',
121128
Entries_Title_field: 'Entries_Title_field',
122129
Entry_Missing_Locale_and_Env: 'Entry_Missing_Locale_and_Env',
123130
Entry_Missing_Locale_and_Env_in_Publish_Details: 'Entry_Missing_Locale_and_Env_in_Publish_Details',
124-
Entry_Multiple_Fields:"Entry_Multiple_Fields"
131+
Entry_Multiple_Fields: 'Entry_Multiple_Fields',
125132
},
126133
feild_level_modules: [
127134
'Entries_Title_field',
@@ -130,7 +137,7 @@ const config = {
130137
'Entry_Missing_Locale_and_Env_in_Publish_Details',
131138
'field-rules',
132139
'Entry_Multiple_Fields',
133-
'Summary'
140+
'Summary',
134141
],
135142
fixSelectField: false,
136143
};

0 commit comments

Comments
 (0)