Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .talismanrc
Original file line number Diff line number Diff line change
Expand Up @@ -3,4 +3,8 @@ fileignoreconfig:
checksum: 41bc1d60449ab0682d9267172e54a5802c837869a1728b0560eea8052336c2fe
- filename: package-lock.json
checksum: 0514f96f07a6c2c5be811d8973a0b1197943303cfcf224c0b01745342699f545
- filename: packages/contentstack-export/src/export/modules/environments.ts
checksum: 5077c6d8418163d538b28252b62ce7679247c795af2387fd0d9535af974106e8
- filename: packages/contentstack-import/src/import/modules/environments.ts
checksum: d1d83112db63ed7e45de89f68b2e6873ef08c9035d9f7313c950fb8036f93761
version: "1.0"
4 changes: 2 additions & 2 deletions packages/contentstack-export/src/export/modules/assets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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');
}
Expand Down
36 changes: 36 additions & 0 deletions packages/contentstack-export/src/export/modules/base-class.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,13 @@ export type ApiOptions = {
additionalInfo?: Record<any, any>;
};

export type CompleteProgressOptions = {
moduleName?: string;
customSuccessMessage?: string;
customWarningMessage?: string;
context?: Record<string, any>;
};

export type EnvType = {
module: string;
totalCount: number;
Expand Down Expand Up @@ -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<T>(message: string, action: () => Promise<T>): Promise<T> {
const logConfig = configHandler.get('log') || {};
const showConsoleLogs = logConfig.showConsoleLogs ?? false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down
4 changes: 2 additions & 2 deletions packages/contentstack-export/src/export/modules/entries.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 });
Expand Down
8 changes: 3 additions & 5 deletions packages/contentstack-export/src/export/modules/labels.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down
12 changes: 3 additions & 9 deletions packages/contentstack-export/src/export/modules/locales.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 });
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions packages/contentstack-export/src/export/modules/stack.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 });
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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();

}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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');
Expand Down
36 changes: 36 additions & 0 deletions packages/contentstack-import/src/import/modules/base-class.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,13 @@ export type AdditionalKeys = {
backupDir: string;
};

export type CompleteProgressOptions = {
moduleName?: string;
customSuccessMessage?: string;
customWarningMessage?: string;
context?: Record<string, any>;
};

export type ApiModuleType =
| 'create-assets'
| 'replace-assets'
Expand Down Expand Up @@ -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<T>(message: string, action: () => Promise<T>): Promise<T> {
const logConfig = configHandler.get('log') || {};
const showConsoleLogs = logConfig.showConsoleLogs ?? false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -128,8 +128,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 });
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 });
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,8 +193,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');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 });
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 });
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 });
Expand Down
4 changes: 2 additions & 2 deletions packages/contentstack-import/src/import/modules/labels.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 });
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 });
Expand Down
Loading
Loading