Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
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