diff --git a/.talismanrc b/.talismanrc index 6b07a56fd0..359111bee3 100644 --- a/.talismanrc +++ b/.talismanrc @@ -1,28 +1,76 @@ fileignoreconfig: - - filename: pnpm-lock.yaml - checksum: f20d4336b379ba896f0092ed8dd03df2c6e5bc34fe200e58002efc2c77fd9359 - - filename: package-lock.json - checksum: b41714137255ba498375116ae9410e04af150d75ba323c8dbaeb8995564a4677 - - filename: packages/contentstack-audit/test/unit/mock/contents/composable_studio/environments/environments.json - checksum: 0402604e5919a7e38ecb5ff0916d6ae5ab7d98fe78ff6ac9eba8a9b8130af34d - - filename: packages/contentstack-utilities/src/helpers.ts - checksum: 6a741bb972f59c56d2c0f3a9f96e2963392361db2e401948c9c1796829478e13 - - filename: packages/contentstack-audit/test/unit/mock/contents/composable_studio/composable_studio.json - checksum: 6912e5ea32b4456ad04d1645750c72bbb29ab1895368c3a242ab39e9350ec531 - - filename: packages/contentstack-utilities/src/logger/session-path.ts - checksum: 4c66980a857bc12012a45e50790c0eaab06883db5e1476d84fb142a08b70b2e7 - - filename: packages/contentstack-import/test/unit/commands/cm/stacks/import.test.ts - checksum: a9e24596e7ae54b71cc28a41cf9d65bbdbf6754446e08958288e90a579cc351d - - filename: packages/contentstack-audit/src/modules/modulesData.ts - checksum: 1e6c1fba1172512401038d5454c8d218201ec62262449c5c878609592e0124c4 - - filename: packages/contentstack-audit/test/unit/mock/contents/composable_studio/invalid_composable_studio.json - checksum: e6465aa0011d1565a2de848d9cca74395d11419e6ac840e7dfb52e1d255b1c4f - - filename: packages/contentstack-audit/src/modules/composable-studio.ts - checksum: 4fc97ff582d6dff9a54b3a50dfa3cbb5febd38a55aeb8737034b97188ad543ba - - filename: packages/contentstack-utilities/test/unit/logger.test.ts - checksum: a1939dea16166b1893a248179524a76f2ed20b04b99c83bd1a5a13fcf6f0dadc - - filename: packages/contentstack-clone/README.md - checksum: 8580ab3f52a079a6411c27cbaad66e3a70d9ac5ea59fc429a8f17c95d09399f8 - - filename: packages/contentstack/README.md - checksum: 72850c976661f2912b5bca39734de09d56c311c2266fc67696c45ed3fb0b7511 +- filename: pnpm-lock.yaml + checksum: c0d22c50eb8d2169396adfe09ca44be2f7a1c1ff6460a44cc42bcfd8ede4a288 +- filename: package-lock.json + checksum: a1e6e1747cbbec22f0088a8c3dae4c4cf1aa81d81400b74535908abae9e3f762 +- filename: packages/contentstack-config/src/utils/interactive.ts + checksum: 09ebc9918e5161e423238df8879b782daf673e52a5ca97e000a9618517a40b96 +- filename: packages/contentstack-config/src/commands/config/set/proxy.ts + checksum: 058c98f96a2de7e75a65536933e5fcd88f0fb7e8a487d9c172f4daacd0d05bea +- filename: packages/contentstack-export-to-csv/src/base-command.ts + checksum: 2a110ef8afbe59c8bcc2f6cd48b06f92d8f717be2ecd88222f2c32bfcf2c7e31 +- filename: packages/contentstack-export-to-csv/src/utils/data-transform.ts + checksum: 8540c23a6b7af1f4ae277b8976c0557f8968f10a41f022dfef97e1e0aed911fb +- filename: packages/contentstack-export-to-csv/src/messages/index.ts + checksum: 9cfc0f22038aa9cd41bb492b565352fd3352e719c247820d59b3507b0fae9a3f +- filename: packages/contentstack-utilities/src/proxy-helper.ts + checksum: 2a8379d7a34acb3c14093599fb4ba7307c94b0f280ea70d6d862ecb2448fe924 +- filename: packages/contentstack-export-to-csv/src/utils/api-client.ts + checksum: 6b6c321a91c9766f344569a810359055556b25ae93d02133fa66591232f12bf5 +- filename: packages/contentstack-clone/.eslintrc + checksum: a7230ffa600c58047ac73f2dec7a23ca5862e36e68f04f2671379496739bd818 +- filename: packages/contentstack-clone/test/lib/util/clone-handler.helpers.test.ts + checksum: efd55d08a7b5263e9ba0d871208552c5df941274bc035bac6101ed26b6ba2da4 +- filename: packages/contentstack-export-to-csv/src/utils/teams-export.ts + checksum: 813eb651cd01a43baee33ea33d5253f7b41212c4b3a7c56e94aa035c97bf99fc +- filename: packages/contentstack-clone/src/types/clone-config.ts + checksum: c22f8b8a592e7b4da967715e595e79a680ab970ca85b65528d5ac318032e1857 +- filename: packages/contentstack-clone/test/commands/stack-clone.test.ts + checksum: 889b9d64434261910a50c14e039e6256fd6157727076308f39bba87b854d459a +- filename: packages/contentstack-export-to-csv/src/commands/cm/export-to-csv.ts + checksum: 7aa3a41132b1a765c5ec9326f8f044dc10ffca3ad2f97b04d13ccbedbb95962e +- filename: packages/contentstack-clone/package.json + checksum: f5f3add5345b73af81995bf8608033db878af672c058419077d201bb60e22546 +- filename: packages/contentstack-export-to-csv/src/utils/interactive.ts + checksum: 84bc2f171cb9e7707befc777aa50d7ab3ed5caf0c8c35639f55a83511b8686c1 +- filename: packages/contentstack-clone/test/lib/helpers/command-helpers.test.ts + checksum: 2702c3cedd9def635fa48408a3a4bbab6728ec8a2700af4f8d5ed6bbe2da4faa +- filename: packages/contentstack-export-to-csv/test/unit/utils/error-handler.test.ts + checksum: d491184f9db125ab6c6ec28407f614e868ee115ea8593cb9d2b83c1f115b9e63 +- filename: packages/contentstack-config/src/commands/config/get/proxy.ts + checksum: 9c49c2e6246ecdc5a4141c7e5f413d34f1fc799e25b3bbf60b61372c7a9a6f36 +- filename: packages/contentstack-export-to-csv/test/unit/utils/data-transform.test.ts + checksum: f5e40f93389f4fa62be90f0203ebd849c9c882d38afe3a8c35ae91970894a74e +- filename: packages/contentstack-clone/test/lib/util/clone-handler.branch.test.ts + checksum: 0f1fccb38c89b4baa9fa2b145905b626b5ce9633ae30021676a924fa88aa570c +- filename: packages/contentstack-utilities/src/helpers.ts + checksum: 06e6abb26e73047eae4794281a0764670d6186b44b4ce8a2c176f9c5607944f3 +- filename: packages/contentstack-clone/test/lib/util/clone-handler.commands.test.ts + checksum: e3c5be3312013df0c20faca3ff280130f9ce187a4187c5045b016b0c7b489b46 +- filename: packages/contentstack-export-to-csv/src/types/index.ts + checksum: 28c19efb0c13969d40df964f86fa6de444316e320801f19dee7392df7a36851d +- filename: packages/contentstack-clone/test/lib/util/clone-handler.execution.test.ts + checksum: d63e7253b2c8eb4da3238fdf78b66dfbad8e6340fb6ff0b4bcb6ae5cafba1328 +- filename: packages/contentstack-clone/test/commands/cm/stacks/clone.test.ts + checksum: 577aa1cba4e06b3c864c568853692eeaf6eee276b6eb3e040df112259118f4c4 +- filename: packages/contentstack/README.md + checksum: 232cc6d0fb261ebe39e4ccbcceea8d016fc6ee1fbf8fcc10d00dd004c78f1b78 +- filename: packages/contentstack-clone/src/core/util/clone-handler.ts + checksum: b34987603f2e53c4b5d3753a4b5f4370fcb6d3cc9181b953de13fcc7214648a1 +- filename: packages/contentstack-audit/test/unit/mock/contents/composable_studio/environments/environments.json + checksum: 0402604e5919a7e38ecb5ff0916d6ae5ab7d98fe78ff6ac9eba8a9b8130af34d +- filename: packages/contentstack-audit/test/unit/mock/contents/composable_studio/composable_studio.json + checksum: 6912e5ea32b4456ad04d1645750c72bbb29ab1895368c3a242ab39e9350ec531 +- filename: packages/contentstack-audit/test/unit/mock/contents/composable_studio/invalid_composable_studio.json + checksum: e6465aa0011d1565a2de848d9cca74395d11419e6ac840e7dfb52e1d255b1c4f +- filename: packages/contentstack-clone/README.md + checksum: 8580ab3f52a079a6411c27cbaad66e3a70d9ac5ea59fc429a8f17c95d09399f8 +- filename: packages/contentstack-audit/src/modules/composable-studio.ts + checksum: 4fc97ff582d6dff9a54b3a50dfa3cbb5febd38a55aeb8737034b97188ad543ba +- filename: packages/contentstack-audit/src/modules/modulesData.ts + checksum: 1e6c1fba1172512401038d5454c8d218201ec62262449c5c878609592e0124c4 +- filename: packages/contentstack-utilities/src/logger/session-path.ts + checksum: 4c66980a857bc12012a45e50790c0eaab06883db5e1476d84fb142a08b70b2e7 +- filename: packages/contentstack-utilities/test/unit/logger.test.ts + checksum: a1939dea16166b1893a248179524a76f2ed20b04b99c83bd1a5a13fcf6f0dadc version: "1.0" diff --git a/packages/contentstack-export/src/export/modules/assets.ts b/packages/contentstack-export/src/export/modules/assets.ts index efd8542ea2..8a574b5bde 100644 --- a/packages/contentstack-export/src/export/modules/assets.ts +++ b/packages/contentstack-export/src/export/modules/assets.ts @@ -120,8 +120,8 @@ export default class ExportAssets extends BaseClass { progress.completeProcess(PROCESS_NAMES.ASSET_DOWNLOADS, true); } - this.completeProgress(true); - log.success(messageHandler.parse('ASSET_EXPORT_COMPLETE'), this.exportConfig.context); + this.completeProgressWithMessage(); + } catch (error) { this.completeProgress(false, error?.message || 'Asset export failed'); } diff --git a/packages/contentstack-export/src/export/modules/base-class.ts b/packages/contentstack-export/src/export/modules/base-class.ts index 7523daa096..32d2a4f98e 100644 --- a/packages/contentstack-export/src/export/modules/base-class.ts +++ b/packages/contentstack-export/src/export/modules/base-class.ts @@ -19,6 +19,13 @@ export type ApiOptions = { additionalInfo?: Record; }; +export type CompleteProgressOptions = { + moduleName?: string; + customSuccessMessage?: string; + customWarningMessage?: string; + context?: Record; +}; + export type EnvType = { module: string; totalCount: number; @@ -95,6 +102,35 @@ export default abstract class BaseClass { this.progressManager = null; } + /** + * Complete progress and log success/warning message based on errors + * Checks the progress manager's failure count to determine if errors occurred + * @param options - Options object containing: + * - moduleName: The module name to generate the message (e.g., 'Assets', 'Entries') + * If not provided, uses this.currentModuleName + * - customSuccessMessage: Optional custom success message. If not provided, generates: "{moduleName} have been exported successfully!" + * - customWarningMessage: Optional custom warning message. If not provided, generates: "{moduleName} have been exported with some errors. Please check the logs for details." + * - context: Optional context for logging + */ + protected completeProgressWithMessage(options?: CompleteProgressOptions): void { + const logContext = options?.context || this.exportConfig?.context || {}; + const failureCount = this.progressManager?.getFailureCount() || 0; + const hasErrors = failureCount > 0; + const name = options?.moduleName || this.currentModuleName || 'Module'; + + // Generate default messages if not provided + const successMessage = options?.customSuccessMessage || `${name} have been exported successfully!`; + const warningMessage = options?.customWarningMessage || `${name} have been exported with some errors. Please check the logs for details.`; + + this.completeProgress(true); + + if (hasErrors) { + log.warn(warningMessage, logContext); + } else { + log.success(successMessage, logContext); + } + } + protected async withLoadingSpinner(message: string, action: () => Promise): Promise { const logConfig = configHandler.get('log') || {}; const showConsoleLogs = logConfig.showConsoleLogs ?? false; diff --git a/packages/contentstack-export/src/export/modules/content-types.ts b/packages/contentstack-export/src/export/modules/content-types.ts index c1d6f72355..61aa469aac 100644 --- a/packages/contentstack-export/src/export/modules/content-types.ts +++ b/packages/contentstack-export/src/export/modules/content-types.ts @@ -86,8 +86,8 @@ export default class ContentTypesExport extends BaseClass { await this.writeContentTypes(this.contentTypes); - log.success(messageHandler.parse('CONTENT_TYPE_EXPORT_COMPLETE'), this.exportConfig.context); - this.completeProgress(true); + this.completeProgressWithMessage(); + } catch (error) { handleAndLogError(error, { ...this.exportConfig.context }); this.completeProgress(false, error?.message || 'Content types export failed'); diff --git a/packages/contentstack-export/src/export/modules/custom-roles.ts b/packages/contentstack-export/src/export/modules/custom-roles.ts index 0c6f6aec7b..92ddba79ab 100644 --- a/packages/contentstack-export/src/export/modules/custom-roles.ts +++ b/packages/contentstack-export/src/export/modules/custom-roles.ts @@ -107,7 +107,8 @@ export default class ExportCustomRoles extends BaseClass { `Custom roles export completed. Total custom roles: ${Object.keys(this.customRoles || {}).length}`, this.exportConfig.context, ); - this.completeProgress(true); + this.completeProgressWithMessage(); + } catch (error) { handleAndLogError(error, { ...this.exportConfig.context }); this.completeProgress(false, error?.message || 'Custom roles export failed'); diff --git a/packages/contentstack-export/src/export/modules/entries.ts b/packages/contentstack-export/src/export/modules/entries.ts index eccc40c40f..855a6348fb 100644 --- a/packages/contentstack-export/src/export/modules/entries.ts +++ b/packages/contentstack-export/src/export/modules/entries.ts @@ -162,8 +162,8 @@ export default class EntriesExport extends BaseClass { } } - this.completeProgress(true); - log.success(messageHandler.parse('ENTRIES_EXPORT_SUCCESS'), this.exportConfig.context); + this.completeProgressWithMessage(); + } catch (error) { handleAndLogError(error, { ...this.exportConfig.context }); this.completeProgress(false, error?.message || 'Entries export failed'); diff --git a/packages/contentstack-export/src/export/modules/environments.ts b/packages/contentstack-export/src/export/modules/environments.ts index 31173b0319..5fc29ffa0d 100644 --- a/packages/contentstack-export/src/export/modules/environments.ts +++ b/packages/contentstack-export/src/export/modules/environments.ts @@ -65,12 +65,9 @@ export default class ExportEnvironments extends BaseClass { const environmentsFilePath = pResolve(this.environmentsFolderPath, this.environmentConfig.fileName); log.debug(`Writing environments to: ${environmentsFilePath}`, this.exportConfig.context); fsUtil.writeFile(environmentsFilePath, this.environments); - log.success( - messageHandler.parse('ENVIRONMENT_EXPORT_COMPLETE', Object.keys(this.environments || {}).length), - this.exportConfig.context, - ); } - this.completeProgress(true); + this.completeProgressWithMessage(); + } catch (error) { handleAndLogError(error, { ...this.exportConfig.context }); this.completeProgress(false, error?.message || 'Environments export failed'); diff --git a/packages/contentstack-export/src/export/modules/extensions.ts b/packages/contentstack-export/src/export/modules/extensions.ts index dcadf5df89..88f1cb434f 100644 --- a/packages/contentstack-export/src/export/modules/extensions.ts +++ b/packages/contentstack-export/src/export/modules/extensions.ts @@ -66,12 +66,10 @@ export default class ExportExtensions extends BaseClass { const extensionsFilePath = pResolve(this.extensionsFolderPath, this.extensionConfig.fileName); log.debug(`Writing extensions to: ${extensionsFilePath}`, this.exportConfig.context); fsUtil.writeFile(extensionsFilePath, this.extensions); - log.success( - messageHandler.parse('EXTENSION_EXPORT_COMPLETE', Object.keys(this.extensions || {}).length), - this.exportConfig.context, - ); + } - this.completeProgress(true); + this.completeProgressWithMessage(); + } catch (error) { handleAndLogError(error, { ...this.exportConfig.context }); this.completeProgress(false, error?.message || 'Extensions export failed'); diff --git a/packages/contentstack-export/src/export/modules/global-fields.ts b/packages/contentstack-export/src/export/modules/global-fields.ts index 4159ae5333..2481550646 100644 --- a/packages/contentstack-export/src/export/modules/global-fields.ts +++ b/packages/contentstack-export/src/export/modules/global-fields.ts @@ -81,12 +81,10 @@ export default class GlobalFieldsExport extends BaseClass { log.debug(`Writing global fields to: ${globalFieldsFilePath}`, this.exportConfig.context); fsUtil.writeFile(globalFieldsFilePath, this.globalFields); - log.success( - messageHandler.parse('GLOBAL_FIELDS_EXPORT_COMPLETE', this.globalFields.length), - this.exportConfig.context, - ); + + + this.completeProgressWithMessage(); - this.completeProgress(true); } catch (error) { log.debug('Error occurred during global fields export', this.exportConfig.context); handleAndLogError(error, { ...this.exportConfig.context }); diff --git a/packages/contentstack-export/src/export/modules/labels.ts b/packages/contentstack-export/src/export/modules/labels.ts index dab2625903..bfd2305a63 100644 --- a/packages/contentstack-export/src/export/modules/labels.ts +++ b/packages/contentstack-export/src/export/modules/labels.ts @@ -66,13 +66,11 @@ export default class ExportLabels extends BaseClass { const labelsFilePath = pResolve(this.labelsFolderPath, this.labelConfig.fileName); log.debug(`Writing labels to: ${labelsFilePath}`, this.exportConfig.context); fsUtil.writeFile(labelsFilePath, this.labels); - log.success( - messageHandler.parse('LABELS_EXPORT_COMPLETE', Object.keys(this.labels || {}).length), - this.exportConfig.context, - ); + } - this.completeProgress(true); + this.completeProgressWithMessage(); + } catch (error) { handleAndLogError(error, { ...this.exportConfig.context }); this.completeProgress(false, error?.message || 'Labels export failed'); diff --git a/packages/contentstack-export/src/export/modules/locales.ts b/packages/contentstack-export/src/export/modules/locales.ts index 2919983c6f..7cd206a4fe 100644 --- a/packages/contentstack-export/src/export/modules/locales.ts +++ b/packages/contentstack-export/src/export/modules/locales.ts @@ -86,15 +86,9 @@ export default class LocaleExport extends BaseClass { fsUtil.writeFile(localesFilePath, this.locales); log.debug(`Writing master locale to: ${masterLocaleFilePath}`, this.exportConfig.context); fsUtil.writeFile(masterLocaleFilePath, this.masterLocale); - log.success( - messageHandler.parse( - 'LOCALES_EXPORT_COMPLETE', - Object.keys(this.locales || {}).length, - Object.keys(this.masterLocale || {}).length, - ), - this.exportConfig.context, - ); - this.completeProgress(true); + + this.completeProgressWithMessage(); + } catch (error) { handleAndLogError(error, { ...this.exportConfig.context }); this.completeProgress(false, error?.message || 'Locales export failed'); diff --git a/packages/contentstack-export/src/export/modules/marketplace-apps.ts b/packages/contentstack-export/src/export/modules/marketplace-apps.ts index a258f5bc68..42944383a1 100644 --- a/packages/contentstack-export/src/export/modules/marketplace-apps.ts +++ b/packages/contentstack-export/src/export/modules/marketplace-apps.ts @@ -110,8 +110,8 @@ export default class ExportMarketplaceApps extends BaseClass { progress.completeProcess(PROCESS_NAMES.FETCH_CONFIG_MANIFEST, true); } - this.completeProgress(true); - log.success('Marketplace apps export completed successfully', this.exportConfig.context); + this.completeProgressWithMessage(); + } catch (error) { log.debug('Error occurred during marketplace apps export', this.exportConfig.context); handleAndLogError(error, { ...this.exportConfig.context }); diff --git a/packages/contentstack-export/src/export/modules/personalize.ts b/packages/contentstack-export/src/export/modules/personalize.ts index d3eaeb7459..9c402faaa2 100644 --- a/packages/contentstack-export/src/export/modules/personalize.ts +++ b/packages/contentstack-export/src/export/modules/personalize.ts @@ -96,8 +96,9 @@ export default class ExportPersonalize extends BaseClass { log.debug('No personalize modules configured for processing', this.exportConfig.context); } - this.completeProgress(true); - log.success('Personalize export completed successfully', this.exportConfig.context); + this.completeProgressWithMessage(); + + } catch (moduleError) { if (moduleError === 'Forbidden') { log.debug('Personalize access forbidden, personalization not enabled', this.exportConfig.context); diff --git a/packages/contentstack-export/src/export/modules/stack.ts b/packages/contentstack-export/src/export/modules/stack.ts index 8077682a59..a96c068757 100644 --- a/packages/contentstack-export/src/export/modules/stack.ts +++ b/packages/contentstack-export/src/export/modules/stack.ts @@ -119,8 +119,8 @@ export default class ExportStack extends BaseClass { log.debug('Locale locale already set, skipping locale fetch', this.exportConfig.context); } - this.completeProgress(true); - log.success('Stack export completed successfully', this.exportConfig.context); + this.completeProgressWithMessage(); + } catch (error) { log.debug('Error occurred during stack export', this.exportConfig.context); handleAndLogError(error, { ...this.exportConfig.context }); diff --git a/packages/contentstack-export/src/export/modules/taxonomies.ts b/packages/contentstack-export/src/export/modules/taxonomies.ts index 2f9fa502c6..7ba474f644 100644 --- a/packages/contentstack-export/src/export/modules/taxonomies.ts +++ b/packages/contentstack-export/src/export/modules/taxonomies.ts @@ -98,10 +98,8 @@ export default class ExportTaxonomies extends BaseClass { await this.writeTaxonomiesMetadata(); } - log.success( - messageHandler.parse('TAXONOMY_EXPORT_COMPLETE', keys(this.taxonomies || {}).length), - this.exportConfig.context, - ); + this.completeProgressWithMessage(); + } /** diff --git a/packages/contentstack-export/src/export/modules/webhooks.ts b/packages/contentstack-export/src/export/modules/webhooks.ts index a0bec4fd88..e70fc8f836 100644 --- a/packages/contentstack-export/src/export/modules/webhooks.ts +++ b/packages/contentstack-export/src/export/modules/webhooks.ts @@ -63,13 +63,9 @@ export default class ExportWebhooks extends BaseClass { const webhooksFilePath = pResolve(this.webhooksFolderPath, this.webhookConfig.fileName); log.debug(`Writing webhooks to: ${webhooksFilePath}`, this.exportConfig.context); fsUtil.writeFile(webhooksFilePath, this.webhooks); - log.success( - messageHandler.parse('WEBHOOK_EXPORT_COMPLETE', Object.keys(this.webhooks || {}).length), - this.exportConfig.context, - ); } - this.completeProgress(true); + this.completeProgressWithMessage(); } catch (error) { handleAndLogError(error, { ...this.exportConfig.context }); this.completeProgress(false, error?.message || 'Webhooks export failed'); diff --git a/packages/contentstack-export/src/export/modules/workflows.ts b/packages/contentstack-export/src/export/modules/workflows.ts index e0ae4192b5..09ebfb2256 100644 --- a/packages/contentstack-export/src/export/modules/workflows.ts +++ b/packages/contentstack-export/src/export/modules/workflows.ts @@ -66,13 +66,9 @@ export default class ExportWorkFlows extends BaseClass { const workflowsFilePath = pResolve(this.webhooksFolderPath, this.workflowConfig.fileName); log.debug(`Writing workflows to: ${workflowsFilePath}`, this.exportConfig.context); fsUtil.writeFile(workflowsFilePath, this.workflows); - log.success( - messageHandler.parse('WORKFLOW_EXPORT_COMPLETE', Object.keys(this.workflows || {}).length), - this.exportConfig.context, - ); } - this.completeProgress(true); + this.completeProgressWithMessage(); } catch (error) { handleAndLogError(error, { ...this.exportConfig.context }); this.completeProgress(false, error?.message || 'Workflows export failed'); diff --git a/packages/contentstack-import/src/import/modules/base-class.ts b/packages/contentstack-import/src/import/modules/base-class.ts index 098a3a2568..c22d1e1661 100644 --- a/packages/contentstack-import/src/import/modules/base-class.ts +++ b/packages/contentstack-import/src/import/modules/base-class.ts @@ -25,6 +25,13 @@ export type AdditionalKeys = { backupDir: string; }; +export type CompleteProgressOptions = { + moduleName?: string; + customSuccessMessage?: string; + customWarningMessage?: string; + context?: Record; +}; + export type ApiModuleType = | 'create-assets' | 'replace-assets' @@ -138,6 +145,35 @@ export default abstract class BaseClass { this.progressManager = null; } + /** + * Complete progress and log success/warning message based on errors + * Checks the progress manager's failure count to determine if errors occurred + * @param options - Options object containing: + * - moduleName: The module name to generate the message (e.g., 'Content types', 'Entries') + * If not provided, uses this.currentModuleName + * - customSuccessMessage: Optional custom success message. If not provided, generates: "{moduleName} have been imported successfully!" + * - customWarningMessage: Optional custom warning message. If not provided, generates: "{moduleName} have been imported with some errors. Please check the logs for details." + * - context: Optional context for logging + */ + protected completeProgressWithMessage(options?: CompleteProgressOptions): void { + const logContext = options?.context || this.importConfig?.context || {}; + const failureCount = this.progressManager?.getFailureCount() || 0; + const hasErrors = failureCount > 0; + const name = options?.moduleName || this.currentModuleName || 'Module'; + + // Generate default messages if not provided + const successMessage = options?.customSuccessMessage || `${name} have been imported successfully!`; + const warningMessage = options?.customWarningMessage || `${name} have been imported with some errors. Please check the logs for details.`; + + this.completeProgress(true); + + if (hasErrors) { + log.warn(warningMessage, logContext); + } else { + log.success(successMessage, logContext); + } + } + protected async withLoadingSpinner(message: string, action: () => Promise): Promise { const logConfig = configHandler.get('log') || {}; const showConsoleLogs = logConfig.showConsoleLogs ?? false; diff --git a/packages/contentstack-import/src/import/modules/content-types.ts b/packages/contentstack-import/src/import/modules/content-types.ts index b8c2282d80..a118a53c80 100644 --- a/packages/contentstack-import/src/import/modules/content-types.ts +++ b/packages/contentstack-import/src/import/modules/content-types.ts @@ -194,8 +194,7 @@ export default class ContentTypesImport extends BaseClass { await this.handlePendingGlobalFields(progress); } - this.completeProgress(true); - log.success('Content types have been imported successfully!', this.importConfig.context); + this.completeProgressWithMessage(); } catch (error) { this.completeProgress(false, error?.message || 'Content types import failed'); handleAndLogError(error, { ...this.importConfig.context }); diff --git a/packages/contentstack-import/src/import/modules/custom-roles.ts b/packages/contentstack-import/src/import/modules/custom-roles.ts index cb8973ffaf..86603f0388 100644 --- a/packages/contentstack-import/src/import/modules/custom-roles.ts +++ b/packages/contentstack-import/src/import/modules/custom-roles.ts @@ -74,8 +74,7 @@ export default class ImportCustomRoles extends BaseClass { this.handleImportResults(); - this.completeProgress(true); - log.success('Custom roles have been imported successfully!', this.importConfig.context); + this.completeProgressWithMessage(); } catch (error) { this.completeProgress(false, error?.message || 'Custom roles import failed'); handleAndLogError(error, { ...this.importConfig.context }); diff --git a/packages/contentstack-import/src/import/modules/entries.ts b/packages/contentstack-import/src/import/modules/entries.ts index 04a7d3b4a5..4b4706bb4b 100644 --- a/packages/contentstack-import/src/import/modules/entries.ts +++ b/packages/contentstack-import/src/import/modules/entries.ts @@ -218,8 +218,7 @@ export default class EntriesImport extends BaseClass { await this.processCleanup(); progress.completeProcess(PROCESS_NAMES.CLEANUP, true); - this.completeProgress(true); - log.success('Entries imported successfully', this.importConfig.context); + this.completeProgressWithMessage(); } catch (error) { this.createEntryDataForVariantEntry(); this.completeProgress(false, (error as any)?.message || 'Entries import failed'); diff --git a/packages/contentstack-import/src/import/modules/environments.ts b/packages/contentstack-import/src/import/modules/environments.ts index db9ba6ddb2..4962dd48fb 100644 --- a/packages/contentstack-import/src/import/modules/environments.ts +++ b/packages/contentstack-import/src/import/modules/environments.ts @@ -55,8 +55,7 @@ export default class ImportEnvironments extends BaseClass { await this.importEnvironments(); await this.processImportResults(); - this.completeProgress(true); - log.success('Environments have been imported successfully!', this.importConfig.context); + this.completeProgressWithMessage(); } catch (error) { this.completeProgress(false, error?.message || 'Environments import failed'); handleAndLogError(error, { ...this.importConfig.context }); diff --git a/packages/contentstack-import/src/import/modules/extensions.ts b/packages/contentstack-import/src/import/modules/extensions.ts index eb205d792d..a2a1836817 100644 --- a/packages/contentstack-import/src/import/modules/extensions.ts +++ b/packages/contentstack-import/src/import/modules/extensions.ts @@ -86,8 +86,7 @@ export default class ImportExtensions extends BaseClass { await this.processExtensionResults(); - this.completeProgress(true); - log.success('Extensions have been imported successfully!', this.importConfig.context); + this.completeProgressWithMessage(); } catch (error) { this.completeProgress(false, error?.message || 'Create failed'); handleAndLogError(error, { ...this.importConfig.context }); diff --git a/packages/contentstack-import/src/import/modules/global-fields.ts b/packages/contentstack-import/src/import/modules/global-fields.ts index b130ad8a44..4a8c909717 100644 --- a/packages/contentstack-import/src/import/modules/global-fields.ts +++ b/packages/contentstack-import/src/import/modules/global-fields.ts @@ -132,9 +132,8 @@ export default class ImportGlobalFields extends BaseClass { } await this.processGlobalFieldResults(); + this.completeProgressWithMessage(); - this.completeProgress(true); - log.success('Global fields import has been completed!', this.importConfig.context); } catch (error) { this.completeProgress(false, error?.message || 'Global fields import failed'); handleAndLogError(error, { ...this.importConfig.context }); diff --git a/packages/contentstack-import/src/import/modules/labels.ts b/packages/contentstack-import/src/import/modules/labels.ts index 397a860987..021f33d4ab 100644 --- a/packages/contentstack-import/src/import/modules/labels.ts +++ b/packages/contentstack-import/src/import/modules/labels.ts @@ -73,8 +73,8 @@ export default class ImportLabels extends BaseClass { this.processLabelResults(); - this.completeProgress(true); - log.success('Labels have been imported successfully!', this.importConfig.context); + this.completeProgressWithMessage(); + } catch (error) { this.completeProgress(false, error?.message || 'Labels import failed'); handleAndLogError(error, { ...this.importConfig.context }); diff --git a/packages/contentstack-import/src/import/modules/locales.ts b/packages/contentstack-import/src/import/modules/locales.ts index 0165bce297..b18da1400f 100644 --- a/packages/contentstack-import/src/import/modules/locales.ts +++ b/packages/contentstack-import/src/import/modules/locales.ts @@ -87,8 +87,7 @@ export default class ImportLocales extends BaseClass { fsUtil.writeFile(this.langFailsPath, this.failedLocales); log.debug(`Written ${this.failedLocales.length} failed locales to file`, this.config.context); - this.completeProgress(true); - log.success('Languages have been imported successfully!', this.config.context); + this.completeProgressWithMessage({ context: this.config.context }); } catch (error) { this.completeProgress(false, error?.message || 'Locales import failed'); handleAndLogError(error, { ...this.config.context }); diff --git a/packages/contentstack-import/src/import/modules/marketplace-apps.ts b/packages/contentstack-import/src/import/modules/marketplace-apps.ts index 6b0049d06a..ceba64f339 100644 --- a/packages/contentstack-import/src/import/modules/marketplace-apps.ts +++ b/packages/contentstack-import/src/import/modules/marketplace-apps.ts @@ -140,8 +140,8 @@ export default class ImportMarketplaceApps extends BaseClass { await this.importMarketplaceApps(); progress.completeProcess(PROCESS_NAMES.INSTALL_APPS, true); - this.completeProgress(true); - log.success('Marketplace apps have been imported successfully!', this.importConfig.context); + this.completeProgressWithMessage(); + } catch (error) { this.completeProgress(false, error?.message || 'Marketplace apps import failed'); handleAndLogError(error, { ...this.importConfig.context }); diff --git a/packages/contentstack-import/src/import/modules/personalize.ts b/packages/contentstack-import/src/import/modules/personalize.ts index 711d80ba94..ced2abfce3 100644 --- a/packages/contentstack-import/src/import/modules/personalize.ts +++ b/packages/contentstack-import/src/import/modules/personalize.ts @@ -54,8 +54,8 @@ export default class ImportPersonalize extends BaseClass { log.debug('No personalize modules configured for processing', this.config.context); } - this.completeProgress(true); - log.success('Personalize import completed successfully', this.config.context); + this.completeProgressWithMessage(); + } catch (error) { this.personalizeConfig.importData = false; // Stop personalize import if project creation fails this.completeProgress(false, (error as any)?.message || 'Personalize import failed'); diff --git a/packages/contentstack-import/src/import/modules/stack.ts b/packages/contentstack-import/src/import/modules/stack.ts index 2bf7cdf288..de80a03492 100644 --- a/packages/contentstack-import/src/import/modules/stack.ts +++ b/packages/contentstack-import/src/import/modules/stack.ts @@ -48,8 +48,8 @@ export default class ImportStack extends BaseClass { log.info('Starting stack settings import process', this.importConfig.context); await this.importStackSettings(); - this.completeProgress(true); - log.success('Stack settings imported successfully!', this.importConfig.context); + this.completeProgressWithMessage(); + } catch (error) { this.completeProgress(false, 'Stack settings import failed'); handleAndLogError(error, { ...this.importConfig.context }); diff --git a/packages/contentstack-import/src/import/modules/taxonomies.ts b/packages/contentstack-import/src/import/modules/taxonomies.ts index fc25786d81..5fc244b75d 100644 --- a/packages/contentstack-import/src/import/modules/taxonomies.ts +++ b/packages/contentstack-import/src/import/modules/taxonomies.ts @@ -57,8 +57,8 @@ export default class ImportTaxonomies extends BaseClass { await this.importTaxonomies(); this.createSuccessAndFailedFile(); - this.completeProgress(true); - log.success('Taxonomies imported successfully!', this.importConfig.context); + this.completeProgressWithMessage(); + } catch (error) { this.completeProgress(false, error?.message || 'Taxonomies import failed'); handleAndLogError(error, { ...this.importConfig.context }); diff --git a/packages/contentstack-import/src/import/modules/variant-entries.ts b/packages/contentstack-import/src/import/modules/variant-entries.ts index 84617c89f8..0953ebfaf7 100644 --- a/packages/contentstack-import/src/import/modules/variant-entries.ts +++ b/packages/contentstack-import/src/import/modules/variant-entries.ts @@ -62,8 +62,8 @@ export default class ImportVariantEntries extends BaseClass { log.info('Starting variant entries import process', this.config.context); await this.importVariantEntries(); - this.completeProgress(true); - log.success('Variant entries imported successfully', this.config.context); + this.completeProgressWithMessage(); + } catch (error) { this.completeProgress(false, (error as any)?.message || 'Variant entries import failed'); handleAndLogError(error, { ...this.config.context }); diff --git a/packages/contentstack-import/src/import/modules/webhooks.ts b/packages/contentstack-import/src/import/modules/webhooks.ts index 54d0621f01..a9197ce0b1 100644 --- a/packages/contentstack-import/src/import/modules/webhooks.ts +++ b/packages/contentstack-import/src/import/modules/webhooks.ts @@ -58,8 +58,8 @@ export default class ImportWebhooks extends BaseClass { this.processWebhookResults(); - this.completeProgress(true); - log.success('Webhooks have been imported successfully!', this.importConfig.context); + this.completeProgressWithMessage(); + } catch (error) { this.completeProgress(false, error?.message || 'Webhooks import failed'); handleAndLogError(error, { ...this.importConfig.context }); diff --git a/packages/contentstack-import/src/import/modules/workflows.ts b/packages/contentstack-import/src/import/modules/workflows.ts index 756ae9fde5..5c8ce218d7 100644 --- a/packages/contentstack-import/src/import/modules/workflows.ts +++ b/packages/contentstack-import/src/import/modules/workflows.ts @@ -92,8 +92,8 @@ export default class ImportWorkflows extends BaseClass { this.processWorkflowResults(); - this.completeProgress(true); - log.success('Workflows have been imported successfully!', this.importConfig.context); + this.completeProgressWithMessage(); + } catch (error) { this.completeProgress(false, error?.message || 'Workflows import failed'); handleAndLogError(error, { ...this.importConfig.context }); diff --git a/packages/contentstack-utilities/src/progress-summary/cli-progress-manager.ts b/packages/contentstack-utilities/src/progress-summary/cli-progress-manager.ts index 32b1762f50..d87c03f446 100644 --- a/packages/contentstack-utilities/src/progress-summary/cli-progress-manager.ts +++ b/packages/contentstack-utilities/src/progress-summary/cli-progress-manager.ts @@ -578,10 +578,10 @@ export default class CLIProgressManager { this.spinner.stop(); } - // Print summary when console logs are enabled - if (this.showConsoleLogs) { - this.printSummary(); - } + // // Print summary when console logs are enabled + // if (this.showConsoleLogs) { + // this.printSummary(); + // } } private printSummary(): void {