From 2d58f72ad0a0695f361e1b9865dac00233478a94 Mon Sep 17 00:00:00 2001 From: shafeeqd959 Date: Thu, 7 May 2026 18:20:52 +0530 Subject: [PATCH] updated contentstack assets texts --- .../package.json | 9 +- .../src/constants/index.ts | 10 +- .../src/export/asset-types.ts | 8 +- .../src/export/assets.ts | 8 +- .../src/export/base.ts | 14 +- .../src/export/fields.ts | 8 +- .../src/export/index.ts | 2 +- .../src/export/spaces.ts | 28 +-- .../src/export/workspaces.ts | 8 +- .../src/import/asset-types.ts | 8 +- .../src/import/assets.ts | 8 +- .../src/import/base.ts | 18 +- .../src/import/fields.ts | 8 +- .../src/import/index.ts | 2 +- .../src/import/spaces.ts | 30 +-- .../src/import/workspaces.ts | 12 +- ...set-management-api.ts => cs-assets-api.ts} | 22 +- .../src/types/index.ts | 2 +- ...pi-adapter.ts => cs-assets-api-adapter.ts} | 38 ++-- .../src/utils/index.ts | 2 +- .../test/unit/export/asset-types.test.ts | 18 +- .../test/unit/export/assets.test.ts | 30 +-- .../test/unit/export/base.test.ts | 14 +- .../test/unit/export/fields.test.ts | 18 +- .../test/unit/export/spaces.test.ts | 8 +- .../test/unit/export/workspaces.test.ts | 12 +- ....test.ts => cs-assets-api-adapter.test.ts} | 42 ++-- .../contentstack-audit/src/modules/assets.ts | 2 +- packages/contentstack-branches/README.md | 24 ++ packages/contentstack-clone/README.md | 2 +- .../contentstack-export/src/config/index.ts | 2 +- .../src/export/modules/assets.ts | 32 +-- .../src/types/default-config.ts | 4 +- .../contentstack-export/src/types/index.ts | 2 +- .../src/utils/constants.ts | 14 +- .../src/utils/export-config-handler.ts | 9 + .../src/utils/get-linked-workspaces.ts | 2 +- .../src/utils/progress-strategy-registry.ts | 8 +- .../test/unit/export/modules/assets.test.ts | 12 +- .../unit/export/modules/base-class.test.ts | 2 +- .../contentstack-import/src/config/index.ts | 2 +- .../src/import/modules/assets.ts | 26 +-- .../src/import/modules/stack.ts | 4 +- .../src/types/default-config.ts | 2 +- .../src/types/import-config.ts | 4 +- .../contentstack-import/src/types/index.ts | 2 +- .../src/utils/build-import-spaces-options.ts | 14 +- .../src/utils/import-config-handler.ts | 15 +- .../src/utils/progress-strategy-registry.ts | 215 +++++++++--------- .../test/unit/import/modules/locales.test.ts | 2 +- .../test/unit/utils/extension-helper.test.ts | 2 +- 51 files changed, 416 insertions(+), 374 deletions(-) rename packages/contentstack-asset-management/src/types/{asset-management-api.ts => cs-assets-api.ts} (93%) rename packages/contentstack-asset-management/src/utils/{asset-management-api-adapter.ts => cs-assets-api-adapter.ts} (89%) rename packages/contentstack-asset-management/test/unit/utils/{asset-management-api-adapter.test.ts => cs-assets-api-adapter.test.ts} (85%) diff --git a/packages/contentstack-asset-management/package.json b/packages/contentstack-asset-management/package.json index daa8c5a66..8f7e0978b 100644 --- a/packages/contentstack-asset-management/package.json +++ b/packages/contentstack-asset-management/package.json @@ -1,7 +1,7 @@ { "name": "@contentstack/cli-asset-management", "version": "1.0.0-beta.0", - "description": "Asset Management 2.0 API adapter for export and import", + "description": "Contentstack Assets API adapter for export and import", "main": "lib/index.js", "types": "lib/index.d.ts", "files": [ @@ -24,7 +24,8 @@ }, "keywords": [ "contentstack", - "asset-management", + "cs-assets", + "contentstack-assets", "cli" ], "license": "MIT", @@ -37,7 +38,7 @@ "devPlugins": [ "@oclif/plugin-help" ], - "repositoryPrefix": "<%- repo %>/blob/main/packages/contentstack-asset-management/<%- commandPath %>" + "repositoryPrefix": "<%- repo %>/blob/main/packages/contentstack-cs-assets/<%- commandPath %>" }, "devDependencies": { "@types/chai": "^4.3.11", @@ -55,4 +56,4 @@ "ts-node": "^10.9.2", "typescript": "^5.8.3" } -} \ No newline at end of file +} diff --git a/packages/contentstack-asset-management/src/constants/index.ts b/packages/contentstack-asset-management/src/constants/index.ts index f7f0ff0c8..cd0aa4ef5 100644 --- a/packages/contentstack-asset-management/src/constants/index.ts +++ b/packages/contentstack-asset-management/src/constants/index.ts @@ -29,13 +29,15 @@ export const FALLBACK_ASSET_TYPES_IMPORT_INVALID_KEYS = [ export const CHUNK_FILE_SIZE_MB = FALLBACK_AM_CHUNK_FILE_SIZE_MB; /** - * Main process name for Asset Management 2.0 export (single progress bar). + * Main process name for Contentstack Assets export (single progress bar). * Use this when adding/starting the process and for all ticks. */ -export const AM_MAIN_PROCESS_NAME = 'Asset Management 2.0'; +export const CS_ASSETS_MAIN_PROCESS_NAME = 'Contentstack Assets'; +/** @deprecated Use CS_ASSETS_MAIN_PROCESS_NAME */ +export const AM_MAIN_PROCESS_NAME = CS_ASSETS_MAIN_PROCESS_NAME; /** - * Process names for Asset Management 2.0 export/import progress. + * Process names for Contentstack Assets export/import progress. * * In the new per-space layout each entry below corresponds to a single row in * the multibar: @@ -70,7 +72,7 @@ const SPACE_PROCESS_NAME_PREFIX = 'Space '; const SPACE_PROCESS_NAME_MAX_UID_LEN = 14; /** - * Returns the multibar row label for a single AM 2.0 space. + * Returns the multibar row label for a single CS Assets space. * The label is bounded so CLIProgressManager.formatProcessName doesn't truncate * it mid-string; the full uid is still used for tick item labels and structured * logs, only the row label itself is shortened for display. diff --git a/packages/contentstack-asset-management/src/export/asset-types.ts b/packages/contentstack-asset-management/src/export/asset-types.ts index bd6c5f17c..50487195e 100644 --- a/packages/contentstack-asset-management/src/export/asset-types.ts +++ b/packages/contentstack-asset-management/src/export/asset-types.ts @@ -1,15 +1,15 @@ import { log } from '@contentstack/cli-utilities'; -import type { AssetManagementAPIConfig } from '../types/asset-management-api'; +import type { CSAssetsAPIConfig } from '../types/cs-assets-api'; import type { ExportContext } from '../types/export-types'; -import { AssetManagementExportAdapter } from './base'; +import { CSAssetsExportAdapter } from './base'; import { getArrayFromResponse } from '../utils/export-helpers'; import { PROCESS_NAMES } from '../constants/index'; -export default class ExportAssetTypes extends AssetManagementExportAdapter { +export default class ExportAssetTypes extends CSAssetsExportAdapter { protected processName: string = PROCESS_NAMES.AM_ASSET_TYPES; - constructor(apiConfig: AssetManagementAPIConfig, exportContext: ExportContext) { + constructor(apiConfig: CSAssetsAPIConfig, exportContext: ExportContext) { super(apiConfig, exportContext); } diff --git a/packages/contentstack-asset-management/src/export/assets.ts b/packages/contentstack-asset-management/src/export/assets.ts index dc8587111..6cc1129a3 100644 --- a/packages/contentstack-asset-management/src/export/assets.ts +++ b/packages/contentstack-asset-management/src/export/assets.ts @@ -3,15 +3,15 @@ import { Readable } from 'node:stream'; import { mkdir, writeFile } from 'node:fs/promises'; import { configHandler, log } from '@contentstack/cli-utilities'; -import type { AssetManagementAPIConfig, LinkedWorkspace } from '../types/asset-management-api'; +import type { CSAssetsAPIConfig, LinkedWorkspace } from '../types/cs-assets-api'; import type { ExportContext } from '../types/export-types'; -import { AssetManagementExportAdapter } from './base'; +import { CSAssetsExportAdapter } from './base'; import { getAssetItems, writeStreamToFile } from '../utils/export-helpers'; import { runInBatches } from '../utils/concurrent-batch'; import { PROCESS_NAMES, PROCESS_STATUS } from '../constants/index'; -export default class ExportAssets extends AssetManagementExportAdapter { - constructor(apiConfig: AssetManagementAPIConfig, exportContext: ExportContext) { +export default class ExportAssets extends CSAssetsExportAdapter { + constructor(apiConfig: CSAssetsAPIConfig, exportContext: ExportContext) { super(apiConfig, exportContext); } diff --git a/packages/contentstack-asset-management/src/export/base.ts b/packages/contentstack-asset-management/src/export/base.ts index 856781653..b9721685c 100644 --- a/packages/contentstack-asset-management/src/export/base.ts +++ b/packages/contentstack-asset-management/src/export/base.ts @@ -2,10 +2,10 @@ import { resolve as pResolve } from 'node:path'; import { writeFile } from 'node:fs/promises'; import { FsUtility, log, CLIProgressManager, configHandler } from '@contentstack/cli-utilities'; -import type { AssetManagementAPIConfig } from '../types/asset-management-api'; +import type { CSAssetsAPIConfig } from '../types/cs-assets-api'; import type { ExportContext } from '../types/export-types'; -import { AssetManagementAdapter } from '../utils/asset-management-api-adapter'; -import { AM_MAIN_PROCESS_NAME, FALLBACK_AM_API_CONCURRENCY, FALLBACK_AM_CHUNK_FILE_SIZE_MB } from '../constants/index'; +import { CSAssetsAdapter } from '../utils/cs-assets-api-adapter'; +import { CS_ASSETS_MAIN_PROCESS_NAME, FALLBACK_AM_API_CONCURRENCY, FALLBACK_AM_CHUNK_FILE_SIZE_MB } from '../constants/index'; export type { ExportContext }; @@ -13,14 +13,14 @@ export type { ExportContext }; * Base class for export modules. Extends the API adapter and adds export context, * internal progress management, and shared write helpers. */ -export class AssetManagementExportAdapter extends AssetManagementAdapter { - protected readonly apiConfig: AssetManagementAPIConfig; +export class CSAssetsExportAdapter extends CSAssetsAdapter { + protected readonly apiConfig: CSAssetsAPIConfig; protected readonly exportContext: ExportContext; protected progressManager: CLIProgressManager | null = null; protected parentProgressManager: CLIProgressManager | null = null; - protected processName: string = AM_MAIN_PROCESS_NAME; + protected processName: string = CS_ASSETS_MAIN_PROCESS_NAME; - constructor(apiConfig: AssetManagementAPIConfig, exportContext: ExportContext) { + constructor(apiConfig: CSAssetsAPIConfig, exportContext: ExportContext) { super(apiConfig); this.apiConfig = apiConfig; this.exportContext = exportContext; diff --git a/packages/contentstack-asset-management/src/export/fields.ts b/packages/contentstack-asset-management/src/export/fields.ts index 08e1caa6e..c1ca623f8 100644 --- a/packages/contentstack-asset-management/src/export/fields.ts +++ b/packages/contentstack-asset-management/src/export/fields.ts @@ -1,15 +1,15 @@ import { log } from '@contentstack/cli-utilities'; -import type { AssetManagementAPIConfig } from '../types/asset-management-api'; +import type { CSAssetsAPIConfig } from '../types/cs-assets-api'; import type { ExportContext } from '../types/export-types'; -import { AssetManagementExportAdapter } from './base'; +import { CSAssetsExportAdapter } from './base'; import { getArrayFromResponse } from '../utils/export-helpers'; import { PROCESS_NAMES } from '../constants/index'; -export default class ExportFields extends AssetManagementExportAdapter { +export default class ExportFields extends CSAssetsExportAdapter { protected processName: string = PROCESS_NAMES.AM_FIELDS; - constructor(apiConfig: AssetManagementAPIConfig, exportContext: ExportContext) { + constructor(apiConfig: CSAssetsAPIConfig, exportContext: ExportContext) { super(apiConfig, exportContext); } diff --git a/packages/contentstack-asset-management/src/export/index.ts b/packages/contentstack-asset-management/src/export/index.ts index 7d71e361e..14727ed70 100644 --- a/packages/contentstack-asset-management/src/export/index.ts +++ b/packages/contentstack-asset-management/src/export/index.ts @@ -3,5 +3,5 @@ export { default as ExportAssetTypes } from './asset-types'; export { default as ExportFields } from './fields'; export { default as ExportAssets } from './assets'; export { default as ExportWorkspace } from './workspaces'; -export { AssetManagementExportAdapter } from './base'; +export { CSAssetsExportAdapter } from './base'; export type { ExportContext } from './base'; diff --git a/packages/contentstack-asset-management/src/export/spaces.ts b/packages/contentstack-asset-management/src/export/spaces.ts index 1147cdb1a..3a3459c3f 100644 --- a/packages/contentstack-asset-management/src/export/spaces.ts +++ b/packages/contentstack-asset-management/src/export/spaces.ts @@ -2,15 +2,15 @@ import { resolve as pResolve } from 'node:path'; import { mkdir } from 'node:fs/promises'; import { log, CLIProgressManager, configHandler, handleAndLogError } from '@contentstack/cli-utilities'; -import type { AssetManagementExportOptions, AssetManagementAPIConfig } from '../types/asset-management-api'; +import type { AssetManagementExportOptions, CSAssetsAPIConfig } from '../types/cs-assets-api'; import type { ExportContext } from '../types/export-types'; -import { AM_MAIN_PROCESS_NAME, PROCESS_NAMES, getSpaceProcessName } from '../constants/index'; +import { CS_ASSETS_MAIN_PROCESS_NAME, PROCESS_NAMES, getSpaceProcessName } from '../constants/index'; import ExportAssetTypes from './asset-types'; import ExportFields from './fields'; import ExportWorkspace from './workspaces'; /** - * Orchestrates the full Asset Management 2.0 export: shared asset types and fields, + * Orchestrates the full Contentstack Assets export: shared asset types and fields, * then per-workspace metadata and assets (including internal download). * Progress and download are fully owned by this package. */ @@ -32,7 +32,7 @@ export class ExportSpaces { linkedWorkspaces, exportDir, branchName, - assetManagementUrl, + csAssetsUrl, org_uid, apiKey, context, @@ -45,9 +45,9 @@ export class ExportSpaces { return; } - log.debug('Starting Asset Management export process...', context); - log.info('Started Asset Management export', context); - log.debug(`Exporting Asset Management 2.0 (${linkedWorkspaces.length} space(s))`, context); + log.debug('Starting Contentstack Assets export process...', context); + log.info('Started Contentstack Assets export', context); + log.debug(`Exporting Contentstack Assets (${linkedWorkspaces.length} space(s))`, context); log.debug(`Spaces: ${linkedWorkspaces.map((ws) => ws.space_uid).join(', ')}`, context); const spacesRootPath = pResolve(exportDir, 'spaces'); @@ -67,8 +67,8 @@ export class ExportSpaces { progress.addProcess(spaceProcess, 1); } - const apiConfig: AssetManagementAPIConfig = { - baseURL: assetManagementUrl, + const apiConfig: CSAssetsAPIConfig = { + baseURL: csAssetsUrl, headers: { organization_uid: org_uid }, context, }; @@ -135,11 +135,11 @@ export class ExportSpaces { log.info( anySpaceFailed - ? 'Asset Management export completed with errors in one or more spaces' - : 'Asset Management export completed successfully', + ? 'Contentstack Assets export completed with errors in one or more spaces' + : 'Contentstack Assets export completed successfully', context, ); - log.debug('Asset Management 2.0 export completed', context); + log.debug('Contentstack Assets export completed', context); } catch (err) { if (!bootstrapFailed) { // Mark any spaces that hadn't been processed as failed so the multibar @@ -148,7 +148,7 @@ export class ExportSpaces { progress.completeProcess(spaceProcess, false); } } - handleAndLogError(err, { ...(context as Record) }, 'Asset Management export failed'); + handleAndLogError(err, { ...(context as Record) }, 'Contentstack Assets export failed'); throw err; } } @@ -160,7 +160,7 @@ export class ExportSpaces { } const logConfig = configHandler.get('log') || {}; const showConsoleLogs = logConfig.showConsoleLogs ?? false; - this.progressManager = CLIProgressManager.createNested(AM_MAIN_PROCESS_NAME, showConsoleLogs); + this.progressManager = CLIProgressManager.createNested(CS_ASSETS_MAIN_PROCESS_NAME, showConsoleLogs); return this.progressManager; } } diff --git a/packages/contentstack-asset-management/src/export/workspaces.ts b/packages/contentstack-asset-management/src/export/workspaces.ts index 0d45196e1..14dd5c1a5 100644 --- a/packages/contentstack-asset-management/src/export/workspaces.ts +++ b/packages/contentstack-asset-management/src/export/workspaces.ts @@ -2,13 +2,13 @@ import { resolve as pResolve } from 'node:path'; import { mkdir, writeFile } from 'node:fs/promises'; import { log } from '@contentstack/cli-utilities'; -import type { AssetManagementAPIConfig, LinkedWorkspace } from '../types/asset-management-api'; +import type { CSAssetsAPIConfig, LinkedWorkspace } from '../types/cs-assets-api'; import type { ExportContext } from '../types/export-types'; -import { AssetManagementExportAdapter } from './base'; +import { CSAssetsExportAdapter } from './base'; import ExportAssets from './assets'; -export default class ExportWorkspace extends AssetManagementExportAdapter { - constructor(apiConfig: AssetManagementAPIConfig, exportContext: ExportContext) { +export default class ExportWorkspace extends CSAssetsExportAdapter { + constructor(apiConfig: CSAssetsAPIConfig, exportContext: ExportContext) { super(apiConfig, exportContext); } diff --git a/packages/contentstack-asset-management/src/import/asset-types.ts b/packages/contentstack-asset-management/src/import/asset-types.ts index 0e943edee..dfc997512 100644 --- a/packages/contentstack-asset-management/src/import/asset-types.ts +++ b/packages/contentstack-asset-management/src/import/asset-types.ts @@ -4,8 +4,8 @@ import omit from 'lodash/omit'; import isEqual from 'lodash/isEqual'; import { log } from '@contentstack/cli-utilities'; -import type { AssetManagementAPIConfig, ImportContext } from '../types/asset-management-api'; -import { AssetManagementImportAdapter } from './base'; +import type { CSAssetsAPIConfig, ImportContext } from '../types/cs-assets-api'; +import { CSAssetsImportAdapter } from './base'; import { FALLBACK_ASSET_TYPES_IMPORT_INVALID_KEYS, PROCESS_NAMES, PROCESS_STATUS } from '../constants/index'; import { runInBatches } from '../utils/concurrent-batch'; import { forEachChunkedJsonStore } from '../utils/chunked-json-reader'; @@ -23,13 +23,13 @@ type AssetTypeToCreate = { uid: string; payload: Record }; * 4. If uid already exists and definition matches → silently skip. * 5. Strip read-only/computed keys from the POST body before creating new asset types. */ -export default class ImportAssetTypes extends AssetManagementImportAdapter { +export default class ImportAssetTypes extends CSAssetsImportAdapter { protected processName: string = PROCESS_NAMES.AM_IMPORT_ASSET_TYPES; private successCount = 0; private failureCount = 0; private skippedCount = 0; - constructor(apiConfig: AssetManagementAPIConfig, importContext: ImportContext) { + constructor(apiConfig: CSAssetsAPIConfig, importContext: ImportContext) { super(apiConfig, importContext); } diff --git a/packages/contentstack-asset-management/src/import/assets.ts b/packages/contentstack-asset-management/src/import/assets.ts index d665353b2..5b1187410 100644 --- a/packages/contentstack-asset-management/src/import/assets.ts +++ b/packages/contentstack-asset-management/src/import/assets.ts @@ -2,8 +2,8 @@ import { resolve as pResolve, join } from 'node:path'; import { existsSync, readFileSync } from 'node:fs'; import { FsUtility, log } from '@contentstack/cli-utilities'; -import type { AssetManagementAPIConfig, ImportContext } from '../types/asset-management-api'; -import { AssetManagementImportAdapter } from './base'; +import type { CSAssetsAPIConfig, ImportContext } from '../types/cs-assets-api'; +import { CSAssetsImportAdapter } from './base'; import { getArrayFromResponse } from '../utils/export-helpers'; import { runInBatches } from '../utils/concurrent-batch'; import { forEachChunkRecordsFromFs } from '../utils/chunked-json-reader'; @@ -40,8 +40,8 @@ type UploadJob = { * - Builds UID and URL mapper entries for entries.ts consumption * Mirrors ExportAssets. */ -export default class ImportAssets extends AssetManagementImportAdapter { - constructor(apiConfig: AssetManagementAPIConfig, importContext: ImportContext) { +export default class ImportAssets extends CSAssetsImportAdapter { + constructor(apiConfig: CSAssetsAPIConfig, importContext: ImportContext) { super(apiConfig, importContext); } diff --git a/packages/contentstack-asset-management/src/import/base.ts b/packages/contentstack-asset-management/src/import/base.ts index 24fca0918..7bb8e9914 100644 --- a/packages/contentstack-asset-management/src/import/base.ts +++ b/packages/contentstack-asset-management/src/import/base.ts @@ -1,24 +1,24 @@ import { resolve as pResolve } from 'node:path'; import { CLIProgressManager, configHandler } from '@contentstack/cli-utilities'; -import type { AssetManagementAPIConfig, ImportContext } from '../types/asset-management-api'; -import { AssetManagementAdapter } from '../utils/asset-management-api-adapter'; -import { AM_MAIN_PROCESS_NAME, FALLBACK_AM_API_CONCURRENCY } from '../constants/index'; +import type { CSAssetsAPIConfig, ImportContext } from '../types/cs-assets-api'; +import { CSAssetsAdapter } from '../utils/cs-assets-api-adapter'; +import { CS_ASSETS_MAIN_PROCESS_NAME, FALLBACK_AM_API_CONCURRENCY } from '../constants/index'; export type { ImportContext }; /** - * Base class for all AM 2.0 import modules. Mirrors AssetManagementExportAdapter + * Base class for all CS Assets import modules. Mirrors CSAssetsExportAdapter * but carries ImportContext (spacesRootPath, apiKey, host, etc.) instead of ExportContext. */ -export class AssetManagementImportAdapter extends AssetManagementAdapter { - protected readonly apiConfig: AssetManagementAPIConfig; +export class CSAssetsImportAdapter extends CSAssetsAdapter { + protected readonly apiConfig: CSAssetsAPIConfig; protected readonly importContext: ImportContext; protected progressManager: CLIProgressManager | null = null; protected parentProgressManager: CLIProgressManager | null = null; - protected processName: string = AM_MAIN_PROCESS_NAME; + protected processName: string = CS_ASSETS_MAIN_PROCESS_NAME; - constructor(apiConfig: AssetManagementAPIConfig, importContext: ImportContext) { + constructor(apiConfig: CSAssetsAPIConfig, importContext: ImportContext) { super(apiConfig); this.apiConfig = apiConfig; this.importContext = importContext; @@ -70,7 +70,7 @@ export class AssetManagementImportAdapter extends AssetManagementAdapter { return this.importContext.spacesRootPath; } - /** Parallel AM API limit for import batches. */ + /** Parallel CS Assets API limit for import batches. */ protected get apiConcurrency(): number { return this.importContext.apiConcurrency ?? FALLBACK_AM_API_CONCURRENCY; } diff --git a/packages/contentstack-asset-management/src/import/fields.ts b/packages/contentstack-asset-management/src/import/fields.ts index 2bba913f6..cf0747598 100644 --- a/packages/contentstack-asset-management/src/import/fields.ts +++ b/packages/contentstack-asset-management/src/import/fields.ts @@ -4,8 +4,8 @@ import omit from 'lodash/omit'; import isEqual from 'lodash/isEqual'; import { log } from '@contentstack/cli-utilities'; -import type { AssetManagementAPIConfig, ImportContext } from '../types/asset-management-api'; -import { AssetManagementImportAdapter } from './base'; +import type { CSAssetsAPIConfig, ImportContext } from '../types/cs-assets-api'; +import { CSAssetsImportAdapter } from './base'; import { FALLBACK_FIELDS_IMPORT_INVALID_KEYS, PROCESS_NAMES, PROCESS_STATUS } from '../constants/index'; import { runInBatches } from '../utils/concurrent-batch'; import { forEachChunkedJsonStore } from '../utils/chunked-json-reader'; @@ -23,13 +23,13 @@ type FieldToCreate = { uid: string; payload: Record }; * 4. If uid already exists and definition matches → silently skip. * 5. Strip read-only/computed keys from the POST body before creating new fields. */ -export default class ImportFields extends AssetManagementImportAdapter { +export default class ImportFields extends CSAssetsImportAdapter { protected processName: string = PROCESS_NAMES.AM_IMPORT_FIELDS; private successCount = 0; private failureCount = 0; private skippedCount = 0; - constructor(apiConfig: AssetManagementAPIConfig, importContext: ImportContext) { + constructor(apiConfig: CSAssetsAPIConfig, importContext: ImportContext) { super(apiConfig, importContext); } diff --git a/packages/contentstack-asset-management/src/import/index.ts b/packages/contentstack-asset-management/src/import/index.ts index 61d8a457e..0ab77f5c7 100644 --- a/packages/contentstack-asset-management/src/import/index.ts +++ b/packages/contentstack-asset-management/src/import/index.ts @@ -3,5 +3,5 @@ export { default as ImportWorkspace } from './workspaces'; export { default as ImportAssets } from './assets'; export { default as ImportFields } from './fields'; export { default as ImportAssetTypes } from './asset-types'; -export { AssetManagementImportAdapter } from './base'; +export { CSAssetsImportAdapter } from './base'; export type { ImportContext } from './base'; diff --git a/packages/contentstack-asset-management/src/import/spaces.ts b/packages/contentstack-asset-management/src/import/spaces.ts index 13706ffad..e96e2ff17 100644 --- a/packages/contentstack-asset-management/src/import/spaces.ts +++ b/packages/contentstack-asset-management/src/import/spaces.ts @@ -4,20 +4,20 @@ import { writeFile } from 'node:fs/promises'; import { log, CLIProgressManager, configHandler, handleAndLogError } from '@contentstack/cli-utilities'; import type { - AssetManagementAPIConfig, + CSAssetsAPIConfig, ImportContext, ImportResult, ImportSpacesOptions, SpaceMapping, -} from '../types/asset-management-api'; -import { AM_MAIN_PROCESS_NAME, PROCESS_NAMES, getSpaceProcessName } from '../constants/index'; -import { AssetManagementAdapter } from '../utils/asset-management-api-adapter'; +} from '../types/cs-assets-api'; +import { CS_ASSETS_MAIN_PROCESS_NAME, PROCESS_NAMES, getSpaceProcessName } from '../constants/index'; +import { CSAssetsAdapter } from '../utils/cs-assets-api-adapter'; import ImportAssetTypes from './asset-types'; import ImportFields from './fields'; import ImportWorkspace from './workspaces'; /** - * Top-level orchestrator for AM 2.0 import. + * Top-level orchestrator for CS Assets import. * Mirrors ExportSpaces: creates shared fields + asset types, then imports each space. * Returns combined uidMap, urlMap, and spaceMappings for the bridge module. */ @@ -64,13 +64,13 @@ export class ImportSpaces { mapperUrlFileName: configOptions.mapperUrlFileName, mapperSpaceUidFileName: configOptions.mapperSpaceUidFileName, }; - const apiConfig: AssetManagementAPIConfig = { - baseURL: configOptions.assetManagementUrl, + const apiConfig: CSAssetsAPIConfig = { + baseURL: configOptions.csAssetsUrl, headers: { organization_uid: org_uid }, context, }; - log.debug('Starting Asset Management import process...', context); + log.debug('Starting Contentstack Assets import process...', context); // Discover space directories let spaceDirs: string[] = []; @@ -110,7 +110,7 @@ export class ImportSpaces { // Space UIDs already present in the target org — reuse when export dir name matches a uid here. const existingSpaceUids = new Set(); try { - const adapterForList = new AssetManagementAdapter(apiConfig); + const adapterForList = new CSAssetsAdapter(apiConfig); await adapterForList.init(); const { spaces } = await adapterForList.listSpaces(); for (const s of spaces) { @@ -122,7 +122,7 @@ export class ImportSpaces { } try { - log.info('Started Asset Management import', context); + log.info('Started Contentstack Assets import', context); // 1. Import shared fields progress.startProcess(PROCESS_NAMES.AM_IMPORT_FIELDS); @@ -195,15 +195,15 @@ export class ImportSpaces { await writeFile(join(mapperDir, uidFile), JSON.stringify(allUidMap), 'utf8'); await writeFile(join(mapperDir, urlFile), JSON.stringify(allUrlMap), 'utf8'); await writeFile(join(mapperDir, spaceUidFile), JSON.stringify(allSpaceUidMap), 'utf8'); - log.debug('Wrote AM 2.0 mapper files (uid, url, space-uid)', context); + log.debug('Wrote CS Assets mapper files (uid, url, space-uid)', context); } log.info( - `Asset Management import finished: ${spacesSucceeded} space(s) succeeded, ${spacesFailed} failed, ${spaceDirs.length} attempted.`, + `Contentstack Assets import finished: ${spacesSucceeded} space(s) succeeded, ${spacesFailed} failed, ${spaceDirs.length} attempted.`, context, ); log.debug( - `Asset Management 2.0 import completed (hasFailures=${hasFailures})`, + `Contentstack Assets import completed (hasFailures=${hasFailures})`, context, ); } catch (err) { @@ -212,7 +212,7 @@ export class ImportSpaces { for (const [, spaceProcess] of spaceProcessNames) { progress.completeProcess(spaceProcess, false); } - handleAndLogError(err, { ...(context as Record) }, 'Asset Management import failed'); + handleAndLogError(err, { ...(context as Record) }, 'Contentstack Assets import failed'); throw err; } @@ -226,7 +226,7 @@ export class ImportSpaces { } const logConfig = configHandler.get('log') || {}; const showConsoleLogs = logConfig.showConsoleLogs ?? false; - this.progressManager = CLIProgressManager.createNested(AM_MAIN_PROCESS_NAME, showConsoleLogs); + this.progressManager = CLIProgressManager.createNested(CS_ASSETS_MAIN_PROCESS_NAME, showConsoleLogs); return this.progressManager; } } diff --git a/packages/contentstack-asset-management/src/import/workspaces.ts b/packages/contentstack-asset-management/src/import/workspaces.ts index d685cc3d2..0b31fb6e9 100644 --- a/packages/contentstack-asset-management/src/import/workspaces.ts +++ b/packages/contentstack-asset-management/src/import/workspaces.ts @@ -2,8 +2,8 @@ import { join } from 'node:path'; import { readFileSync } from 'node:fs'; import { log } from '@contentstack/cli-utilities'; -import type { AssetManagementAPIConfig, ImportContext, SpaceMapping } from '../types/asset-management-api'; -import { AssetManagementImportAdapter } from './base'; +import type { CSAssetsAPIConfig, ImportContext, SpaceMapping } from '../types/cs-assets-api'; +import { CSAssetsImportAdapter } from './base'; import ImportAssets from './assets'; type WorkspaceResult = SpaceMapping & { @@ -12,13 +12,13 @@ type WorkspaceResult = SpaceMapping & { }; /** - * Handles import for a single AM 2.0 space directory. + * Handles import for a single CS Assets space directory. * Reads `metadata.json`, creates the space in the target org when its uid is not * already present, or reuses the existing space and emits identity mappers only. * Returns the SpaceMapping plus UID/URL maps for the mapper files. */ -export default class ImportWorkspace extends AssetManagementImportAdapter { - constructor(apiConfig: AssetManagementAPIConfig, importContext: ImportContext) { +export default class ImportWorkspace extends CSAssetsImportAdapter { + constructor(apiConfig: CSAssetsAPIConfig, importContext: ImportContext) { super(apiConfig, importContext); } @@ -67,7 +67,7 @@ export default class ImportWorkspace extends AssetManagementImportAdapter { // Reuse: target org already has a space with the same uid as the export directory. if (existingSpaceUids.has(oldSpaceUid)) { log.info( - `Reusing existing AM space "${oldSpaceUid}" (uid matches export directory); skipping create and upload.`, + `Reusing existing Asset space "${oldSpaceUid}" (uid matches export directory); skipping create and upload.`, this.importContext.context, ); const newSpaceUid = oldSpaceUid; diff --git a/packages/contentstack-asset-management/src/types/asset-management-api.ts b/packages/contentstack-asset-management/src/types/cs-assets-api.ts similarity index 93% rename from packages/contentstack-asset-management/src/types/asset-management-api.ts rename to packages/contentstack-asset-management/src/types/cs-assets-api.ts index 40423da89..0d26bc669 100644 --- a/packages/contentstack-asset-management/src/types/asset-management-api.ts +++ b/packages/contentstack-asset-management/src/types/cs-assets-api.ts @@ -106,9 +106,9 @@ export type AssetTypesResponse = { }; /** - * Configuration for AssetManagementAdapter constructor. + * Configuration for CSAssetsAdapter constructor. */ -export type AssetManagementAPIConfig = { +export type CSAssetsAPIConfig = { baseURL: string; headers?: Record; /** Optional context for logging (e.g. exportConfig.context) */ @@ -116,10 +116,10 @@ export type AssetManagementAPIConfig = { }; /** - * Adapter interface for Asset Management API calls. + * Adapter interface for Contentstack Assets API calls. * Used by export and (future) import. */ -export interface IAssetManagementAdapter { +export interface ICSAssetsAdapter { init(): Promise; listSpaces(): Promise; getSpace(spaceUid: string): Promise; @@ -136,7 +136,7 @@ export type AssetManagementExportOptions = { linkedWorkspaces: LinkedWorkspace[]; exportDir: string; branchName: string; - assetManagementUrl: string; + csAssetsUrl: string; org_uid: string; context?: Record; /** When true, the AM package will add authtoken to asset download URLs. */ @@ -152,7 +152,7 @@ export type AssetManagementExportOptions = { */ chunkFileSizeMb?: number; /** - * Max parallel AM API/export tasks for export (shared module bootstrap default). + * Max parallel CS Assets API/export tasks for export (shared module bootstrap default). */ apiConcurrency?: number; /** @@ -184,13 +184,13 @@ export type ImportContext = { /** Optional logging context (same shape as ExportConfig.context). */ context?: Record; /** - * Max parallel AM API calls for import (fields, asset types, and default for folders/uploads). + * Max parallel CS Assets API calls for import (fields, asset types, and default for folders/uploads). * Set from `ImportSpacesOptions.apiConcurrency` (or host wiring). */ apiConcurrency?: number; - /** Overrides parallel limit for asset uploads when set (import `modules['asset-management'].uploadAssetsConcurrency`). */ + /** Overrides parallel limit for asset uploads when set (import `modules['cs-assets'].uploadAssetsConcurrency`). */ uploadAssetsConcurrency?: number; - /** Overrides parallel limit for folder creation batches when set (import `modules['asset-management'].importFoldersConcurrency`). */ + /** Overrides parallel limit for folder creation batches when set (import `modules['cs-assets'].importFoldersConcurrency`). */ importFoldersConcurrency?: number; /** Relative dir under content dir for AM export root (e.g. `spaces`). */ spacesDirName?: string; @@ -217,8 +217,8 @@ export type ImportContext = { export type ImportSpacesOptions = { /** Absolute path to the root content / backup directory. */ contentDir: string; - /** AM 2.0 base URL (e.g. "https://am.contentstack.io"). */ - assetManagementUrl: string; + /** CS Assets base URL (e.g. "https://am.contentstack.io"). */ + csAssetsUrl: string; org_uid: string; apiKey: string; host: string; diff --git a/packages/contentstack-asset-management/src/types/index.ts b/packages/contentstack-asset-management/src/types/index.ts index c673e1893..e8d39e6f1 100644 --- a/packages/contentstack-asset-management/src/types/index.ts +++ b/packages/contentstack-asset-management/src/types/index.ts @@ -1,2 +1,2 @@ -export * from './asset-management-api'; +export * from './cs-assets-api'; export * from './export-types'; diff --git a/packages/contentstack-asset-management/src/utils/asset-management-api-adapter.ts b/packages/contentstack-asset-management/src/utils/cs-assets-api-adapter.ts similarity index 89% rename from packages/contentstack-asset-management/src/utils/asset-management-api-adapter.ts rename to packages/contentstack-asset-management/src/utils/cs-assets-api-adapter.ts index 7e3bc0cbc..dcdf26a11 100644 --- a/packages/contentstack-asset-management/src/utils/asset-management-api-adapter.ts +++ b/packages/contentstack-asset-management/src/utils/cs-assets-api-adapter.ts @@ -3,7 +3,7 @@ import { basename } from 'node:path'; import { HttpClient, log, authenticationHandler, handleAndLogError } from '@contentstack/cli-utilities'; import type { - AssetManagementAPIConfig, + CSAssetsAPIConfig, AssetTypesResponse, CreateAssetMetadata, CreateAssetTypePayload, @@ -11,24 +11,24 @@ import type { CreateFolderPayload, CreateSpacePayload, FieldsResponse, - IAssetManagementAdapter, + ICSAssetsAdapter, Space, SpaceResponse, SpacesListResponse, -} from '../types/asset-management-api'; +} from '../types/cs-assets-api'; -export class AssetManagementAdapter implements IAssetManagementAdapter { - private readonly config: AssetManagementAPIConfig; +export class CSAssetsAdapter implements ICSAssetsAdapter { + private readonly config: CSAssetsAPIConfig; private readonly apiClient: HttpClient; - constructor(config: AssetManagementAPIConfig) { + constructor(config: CSAssetsAPIConfig) { this.config = config; this.apiClient = new HttpClient(); const baseURL = config.baseURL?.replace(/\/$/, '') ?? ''; this.apiClient.baseUrl(baseURL); const defaultHeaders = { Accept: 'application/json', 'x-cs-api-version': '4' }; this.apiClient.headers(config.headers ? { ...defaultHeaders, ...config.headers } : defaultHeaders); - log.debug('AssetManagementAdapter initialized', config.context); + log.debug('CSAssetsAdapter initialized', config.context); } /** @@ -67,7 +67,7 @@ export class AssetManagementAdapter implements IAssetManagementAdapter { } /** - * Normalize AM API failures into a consistent error message with optional cause and body snippet. + * Normalize CS Assets API failures into a consistent error message with optional cause and body snippet. */ private normalizeAmGetFailure(details: { path: string; @@ -77,7 +77,7 @@ export class AssetManagementAdapter implements IAssetManagementAdapter { bodySnippet?: string; }): Error { const { path, status, cause, bodySnippet } = details; - let message = `AM API GET failed: path ${path}`; + let message = `CS Assets API GET failed: path ${path}`; if (status) message += ` (status ${status})`; if (cause && cause instanceof Error) { message += ` - ${cause.message}`; @@ -122,7 +122,7 @@ export class AssetManagementAdapter implements IAssetManagementAdapter { } return response.data as T; } catch (error) { - if (error instanceof Error && error.message.includes('AM API GET failed')) { + if (error instanceof Error && error.message.includes('CS Assets API GET failed')) { throw error; } throw this.normalizeAmGetFailure({ @@ -135,7 +135,7 @@ export class AssetManagementAdapter implements IAssetManagementAdapter { async init(): Promise { try { - log.debug('Initializing Asset Management adapter...', this.config.context); + log.debug('Initializing Contentstack Assets adapter...', this.config.context); await authenticationHandler.getAuthDetails(); const token = authenticationHandler.accessToken; log.debug( @@ -144,12 +144,12 @@ export class AssetManagementAdapter implements IAssetManagementAdapter { ); const authHeader = authenticationHandler.isOauthEnabled ? { authorization: token } : { access_token: token }; this.apiClient.headers(this.config.headers ? { ...authHeader, ...this.config.headers } : authHeader); - log.debug('Asset Management adapter initialization completed', this.config.context); + log.debug('Contentstack Assets adapter initialization completed', this.config.context); } catch (error: unknown) { handleAndLogError( error as Error, this.config.context ? { ...(this.config.context as Record) } : {}, - 'Asset Management adapter initialization failed', + 'Contentstack Assets adapter initialization failed', ); throw error; } @@ -260,17 +260,17 @@ export class AssetManagementAdapter implements IAssetManagementAdapter { const text = await response.text().catch(() => ''); const bodySnippet = this.formatResponseBodyForError(text); throw new Error( - `AM API POST failed: status ${response.status} path ${path}${ + `CS Assets API POST failed: status ${response.status} path ${path}${ bodySnippet ? `\nResponse: ${bodySnippet}` : '' }`, ); } return response.json() as Promise; } catch (error) { - if (error instanceof Error && error.message.includes('AM API POST failed')) { + if (error instanceof Error && error.message.includes('CS Assets API POST failed')) { throw error; } - throw new Error(`AM API POST failed: path ${path} - ${error instanceof Error ? error.message : String(error)}`); + throw new Error(`CS Assets API POST failed: path ${path} - ${error instanceof Error ? error.message : String(error)}`); } } @@ -289,18 +289,18 @@ export class AssetManagementAdapter implements IAssetManagementAdapter { const text = await response.text().catch(() => ''); const bodySnippet = this.formatResponseBodyForError(text); throw new Error( - `AM API multipart POST failed: status ${response.status} path ${path}${ + `CS Assets API multipart POST failed: status ${response.status} path ${path}${ bodySnippet ? `\nResponse: ${bodySnippet}` : '' }`, ); } return response.json() as Promise; } catch (error) { - if (error instanceof Error && error.message.includes('AM API multipart POST failed')) { + if (error instanceof Error && error.message.includes('CS Assets API multipart POST failed')) { throw error; } throw new Error( - `AM API multipart POST failed: path ${path} - ${error instanceof Error ? error.message : String(error)}`, + `CS Assets API multipart POST failed: path ${path} - ${error instanceof Error ? error.message : String(error)}`, ); } } diff --git a/packages/contentstack-asset-management/src/utils/index.ts b/packages/contentstack-asset-management/src/utils/index.ts index f84b94cb1..262cfe9ef 100644 --- a/packages/contentstack-asset-management/src/utils/index.ts +++ b/packages/contentstack-asset-management/src/utils/index.ts @@ -1,4 +1,4 @@ -export { AssetManagementAdapter } from './asset-management-api-adapter'; +export { CSAssetsAdapter } from './cs-assets-api-adapter'; export { CHUNK_FILE_SIZE_MB, FALLBACK_AM_CHUNK_FILE_SIZE_MB } from '../constants'; export { forEachChunkedJsonStore, forEachChunkRecordsFromFs } from './chunked-json-reader'; export { diff --git a/packages/contentstack-asset-management/test/unit/export/asset-types.test.ts b/packages/contentstack-asset-management/test/unit/export/asset-types.test.ts index e0fd3bb1b..fd033432b 100644 --- a/packages/contentstack-asset-management/test/unit/export/asset-types.test.ts +++ b/packages/contentstack-asset-management/test/unit/export/asset-types.test.ts @@ -2,13 +2,13 @@ import { expect } from 'chai'; import sinon from 'sinon'; import ExportAssetTypes from '../../../src/export/asset-types'; -import { AssetManagementExportAdapter } from '../../../src/export/base'; +import { CSAssetsExportAdapter } from '../../../src/export/base'; -import type { AssetManagementAPIConfig } from '../../../src/types/asset-management-api'; +import type { CSAssetsAPIConfig } from '../../../src/types/cs-assets-api'; import type { ExportContext } from '../../../src/types/export-types'; describe('ExportAssetTypes', () => { - const apiConfig: AssetManagementAPIConfig = { + const apiConfig: CSAssetsAPIConfig = { baseURL: 'https://am.example.com', headers: { organization_uid: 'org-1' }, }; @@ -30,9 +30,9 @@ describe('ExportAssetTypes', () => { }; beforeEach(() => { - sinon.stub(AssetManagementExportAdapter.prototype, 'init' as any).resolves(); - sinon.stub(AssetManagementExportAdapter.prototype, 'writeItemsToChunkedJson' as any).resolves(); - sinon.stub(AssetManagementExportAdapter.prototype, 'tick' as any); + sinon.stub(CSAssetsExportAdapter.prototype, 'init' as any).resolves(); + sinon.stub(CSAssetsExportAdapter.prototype, 'writeItemsToChunkedJson' as any).resolves(); + sinon.stub(CSAssetsExportAdapter.prototype, 'tick' as any); }); afterEach(() => { @@ -53,7 +53,7 @@ describe('ExportAssetTypes', () => { const exporter = new ExportAssetTypes(apiConfig, exportContext); await exporter.start(spaceUid); - const writeStub = (AssetManagementExportAdapter.prototype as any).writeItemsToChunkedJson as sinon.SinonStub; + const writeStub = (CSAssetsExportAdapter.prototype as any).writeItemsToChunkedJson as sinon.SinonStub; const args = writeStub.firstCall.args; expect(args[0]).to.equal(assetTypesDir); expect(args[1]).to.equal('asset-types.json'); @@ -71,7 +71,7 @@ describe('ExportAssetTypes', () => { const exporter = new ExportAssetTypes(apiConfig, exportContext); await exporter.start(spaceUid); - const writeStub = (AssetManagementExportAdapter.prototype as any).writeItemsToChunkedJson as sinon.SinonStub; + const writeStub = (CSAssetsExportAdapter.prototype as any).writeItemsToChunkedJson as sinon.SinonStub; expect(writeStub.firstCall.args[4]).to.deep.equal([]); }); @@ -80,7 +80,7 @@ describe('ExportAssetTypes', () => { const exporter = new ExportAssetTypes(apiConfig, exportContext); await exporter.start(spaceUid); - const tickStub = (AssetManagementExportAdapter.prototype as any).tick as sinon.SinonStub; + const tickStub = (CSAssetsExportAdapter.prototype as any).tick as sinon.SinonStub; expect(tickStub.callCount).to.equal(1); const [success, label, error] = tickStub.firstCall.args; expect(success).to.be.true; diff --git a/packages/contentstack-asset-management/test/unit/export/assets.test.ts b/packages/contentstack-asset-management/test/unit/export/assets.test.ts index 2c4ac124e..f6a4bc61e 100644 --- a/packages/contentstack-asset-management/test/unit/export/assets.test.ts +++ b/packages/contentstack-asset-management/test/unit/export/assets.test.ts @@ -3,9 +3,9 @@ import sinon from 'sinon'; import { configHandler } from '@contentstack/cli-utilities'; import ExportAssets from '../../../src/export/assets'; -import { AssetManagementExportAdapter } from '../../../src/export/base'; +import { CSAssetsExportAdapter } from '../../../src/export/base'; -import type { AssetManagementAPIConfig, LinkedWorkspace } from '../../../src/types/asset-management-api'; +import type { CSAssetsAPIConfig, LinkedWorkspace } from '../../../src/types/cs-assets-api'; import type { ExportContext } from '../../../src/types/export-types'; const foldersData = [{ uid: 'folder-1', name: 'Images' }]; @@ -18,7 +18,7 @@ const assetsResponseWithItems = { const emptyAssetsResponse = { items: [] as any[] }; describe('ExportAssets', () => { - const apiConfig: AssetManagementAPIConfig = { + const apiConfig: CSAssetsAPIConfig = { baseURL: 'https://am.example.com', headers: { organization_uid: 'org-1' }, }; @@ -48,10 +48,10 @@ describe('ExportAssets', () => { }; beforeEach(() => { - sinon.stub(AssetManagementExportAdapter.prototype, 'init' as any).resolves(); - sinon.stub(AssetManagementExportAdapter.prototype, 'writeItemsToChunkedJson' as any).resolves(); - sinon.stub(AssetManagementExportAdapter.prototype, 'tick' as any); - sinon.stub(AssetManagementExportAdapter.prototype, 'updateStatus' as any); + sinon.stub(CSAssetsExportAdapter.prototype, 'init' as any).resolves(); + sinon.stub(CSAssetsExportAdapter.prototype, 'writeItemsToChunkedJson' as any).resolves(); + sinon.stub(CSAssetsExportAdapter.prototype, 'tick' as any); + sinon.stub(CSAssetsExportAdapter.prototype, 'updateStatus' as any); fetchStub = sinon.stub(globalThis, 'fetch'); }); @@ -89,7 +89,7 @@ describe('ExportAssets', () => { const exporter = new ExportAssets(apiConfig, exportContext); await exporter.start(workspace, spaceDir); - const writeStub = (AssetManagementExportAdapter.prototype as any).writeItemsToChunkedJson as sinon.SinonStub; + const writeStub = (CSAssetsExportAdapter.prototype as any).writeItemsToChunkedJson as sinon.SinonStub; const args = writeStub.firstCall.args; expect(args[1]).to.equal('assets.json'); expect(args[2]).to.equal('assets'); @@ -105,7 +105,7 @@ describe('ExportAssets', () => { await exporter.start(workspace, spaceDir); expect(fetchStub.callCount).to.equal(0); - const tickStub = (AssetManagementExportAdapter.prototype as any).tick as sinon.SinonStub; + const tickStub = (CSAssetsExportAdapter.prototype as any).tick as sinon.SinonStub; const assetTicks = tickStub.getCalls().filter((c) => String(c.args[1]).startsWith('asset:')); expect(assetTicks).to.have.length(0); }); @@ -118,7 +118,7 @@ describe('ExportAssets', () => { const exporter = new ExportAssets(apiConfig, exportContext); await exporter.start(workspace, spaceDir); - const tickStub = (AssetManagementExportAdapter.prototype as any).tick as sinon.SinonStub; + const tickStub = (CSAssetsExportAdapter.prototype as any).tick as sinon.SinonStub; const assetTicks = tickStub.getCalls().filter((c) => String(c.args[1]).startsWith('asset:')); // Per-asset tick: one failure entry per attempted download. expect(assetTicks.length).to.be.greaterThan(0); @@ -136,7 +136,7 @@ describe('ExportAssets', () => { const exporter = new ExportAssets(apiConfig, exportContext); await exporter.start(workspace, spaceDir); - const tickStub = (AssetManagementExportAdapter.prototype as any).tick as sinon.SinonStub; + const tickStub = (CSAssetsExportAdapter.prototype as any).tick as sinon.SinonStub; const assetTicks = tickStub.getCalls().filter((c) => String(c.args[1]).startsWith('asset:')); // One successful tick per asset in the workspace. expect(assetTicks).to.have.length(assetsResponseWithItems.items.length); @@ -175,7 +175,7 @@ describe('ExportAssets', () => { await exporter.start(workspace, spaceDir); expect(fetchStub.firstCall.args[0]).to.equal('https://cdn.example.com/a.png'); - const tickStub = (AssetManagementExportAdapter.prototype as any).tick as sinon.SinonStub; + const tickStub = (CSAssetsExportAdapter.prototype as any).tick as sinon.SinonStub; const assetTicks = tickStub.getCalls().filter((c) => String(c.args[1]).startsWith('asset:')); expect(assetTicks).to.have.length(1); expect(assetTicks[0].args[0]).to.be.true; @@ -199,7 +199,7 @@ describe('ExportAssets', () => { expect(fetchStub.callCount).to.equal(2); expect(fetchStub.firstCall.args[0]).to.equal('https://cdn.example.com/a1.pdf'); expect(fetchStub.secondCall.args[0]).to.equal('https://cdn.example.com/a2.bin'); - const tickStub = (AssetManagementExportAdapter.prototype as any).tick as sinon.SinonStub; + const tickStub = (CSAssetsExportAdapter.prototype as any).tick as sinon.SinonStub; const assetTicks = tickStub.getCalls().filter((c) => String(c.args[1]).startsWith('asset:')); expect(assetTicks).to.have.length(2); for (const t of assetTicks) expect(t.args[0]).to.be.true; @@ -247,7 +247,7 @@ describe('ExportAssets', () => { const exporter = new ExportAssets(apiConfig, exportContext); await exporter.start(workspace, spaceDir); - const tickStub = (AssetManagementExportAdapter.prototype as any).tick as sinon.SinonStub; + const tickStub = (CSAssetsExportAdapter.prototype as any).tick as sinon.SinonStub; const assetTicks = tickStub.getCalls().filter((c) => String(c.args[1]).startsWith('asset:')); expect(assetTicks).to.have.length(1); expect(assetTicks[0].args[0]).to.be.false; @@ -264,7 +264,7 @@ describe('ExportAssets', () => { const exporter = new ExportAssets(apiConfig, exportContext); await exporter.start(workspace, spaceDir); - const tickStub = (AssetManagementExportAdapter.prototype as any).tick as sinon.SinonStub; + const tickStub = (CSAssetsExportAdapter.prototype as any).tick as sinon.SinonStub; const assetTicks = tickStub.getCalls().filter((c) => String(c.args[1]).startsWith('asset:')); expect(assetTicks).to.have.length(1); expect(assetTicks[0].args[0]).to.be.false; diff --git a/packages/contentstack-asset-management/test/unit/export/base.test.ts b/packages/contentstack-asset-management/test/unit/export/base.test.ts index c65b04021..08993eddf 100644 --- a/packages/contentstack-asset-management/test/unit/export/base.test.ts +++ b/packages/contentstack-asset-management/test/unit/export/base.test.ts @@ -2,12 +2,12 @@ import { expect } from 'chai'; import sinon from 'sinon'; import { FsUtility, CLIProgressManager, configHandler } from '@contentstack/cli-utilities'; -import { AssetManagementExportAdapter } from '../../../src/export/base'; +import { CSAssetsExportAdapter } from '../../../src/export/base'; -import type { AssetManagementAPIConfig } from '../../../src/types/asset-management-api'; +import type { CSAssetsAPIConfig } from '../../../src/types/cs-assets-api'; import type { ExportContext } from '../../../src/types/export-types'; -class TestAdapter extends AssetManagementExportAdapter { +class TestAdapter extends CSAssetsExportAdapter { public callCreateNestedProgress(name: string) { return this.createNestedProgress(name); } @@ -20,7 +20,7 @@ class TestAdapter extends AssetManagementExportAdapter { public callCompleteProcess(name: string, success: boolean) { return this.completeProcess(name, success); } - public callWriteItemsToChunkedJson(...args: Parameters) { + public callWriteItemsToChunkedJson(...args: Parameters) { return this.writeItemsToChunkedJson(...args); } public getProgressOrParent() { @@ -37,8 +37,8 @@ class TestAdapter extends AssetManagementExportAdapter { } } -describe('AssetManagementExportAdapter (base)', () => { - const apiConfig: AssetManagementAPIConfig = { +describe('CSAssetsExportAdapter (base)', () => { + const apiConfig: CSAssetsAPIConfig = { baseURL: 'https://am.example.com', headers: { organization_uid: 'org-1' }, }; @@ -48,7 +48,7 @@ describe('AssetManagementExportAdapter (base)', () => { }; beforeEach(() => { - sinon.stub(AssetManagementExportAdapter.prototype, 'init' as any).resolves(); + sinon.stub(CSAssetsExportAdapter.prototype, 'init' as any).resolves(); }); afterEach(() => { diff --git a/packages/contentstack-asset-management/test/unit/export/fields.test.ts b/packages/contentstack-asset-management/test/unit/export/fields.test.ts index 008ceebe3..cb99ef844 100644 --- a/packages/contentstack-asset-management/test/unit/export/fields.test.ts +++ b/packages/contentstack-asset-management/test/unit/export/fields.test.ts @@ -2,13 +2,13 @@ import { expect } from 'chai'; import sinon from 'sinon'; import ExportFields from '../../../src/export/fields'; -import { AssetManagementExportAdapter } from '../../../src/export/base'; +import { CSAssetsExportAdapter } from '../../../src/export/base'; -import type { AssetManagementAPIConfig } from '../../../src/types/asset-management-api'; +import type { CSAssetsAPIConfig } from '../../../src/types/cs-assets-api'; import type { ExportContext } from '../../../src/types/export-types'; describe('ExportFields', () => { - const apiConfig: AssetManagementAPIConfig = { + const apiConfig: CSAssetsAPIConfig = { baseURL: 'https://am.example.com', headers: { organization_uid: 'org-1' }, }; @@ -30,9 +30,9 @@ describe('ExportFields', () => { }; beforeEach(() => { - sinon.stub(AssetManagementExportAdapter.prototype, 'init' as any).resolves(); - sinon.stub(AssetManagementExportAdapter.prototype, 'writeItemsToChunkedJson' as any).resolves(); - sinon.stub(AssetManagementExportAdapter.prototype, 'tick' as any); + sinon.stub(CSAssetsExportAdapter.prototype, 'init' as any).resolves(); + sinon.stub(CSAssetsExportAdapter.prototype, 'writeItemsToChunkedJson' as any).resolves(); + sinon.stub(CSAssetsExportAdapter.prototype, 'tick' as any); }); afterEach(() => { @@ -53,7 +53,7 @@ describe('ExportFields', () => { const exporter = new ExportFields(apiConfig, exportContext); await exporter.start(spaceUid); - const writeStub = (AssetManagementExportAdapter.prototype as any).writeItemsToChunkedJson as sinon.SinonStub; + const writeStub = (CSAssetsExportAdapter.prototype as any).writeItemsToChunkedJson as sinon.SinonStub; const args = writeStub.firstCall.args; expect(args[0]).to.equal(fieldsDir); expect(args[1]).to.equal('fields.json'); @@ -71,7 +71,7 @@ describe('ExportFields', () => { const exporter = new ExportFields(apiConfig, exportContext); await exporter.start(spaceUid); - const writeStub = (AssetManagementExportAdapter.prototype as any).writeItemsToChunkedJson as sinon.SinonStub; + const writeStub = (CSAssetsExportAdapter.prototype as any).writeItemsToChunkedJson as sinon.SinonStub; expect(writeStub.firstCall.args[4]).to.deep.equal([]); }); @@ -80,7 +80,7 @@ describe('ExportFields', () => { const exporter = new ExportFields(apiConfig, exportContext); await exporter.start(spaceUid); - const tickStub = (AssetManagementExportAdapter.prototype as any).tick as sinon.SinonStub; + const tickStub = (CSAssetsExportAdapter.prototype as any).tick as sinon.SinonStub; expect(tickStub.callCount).to.equal(1); const [success, label, error] = tickStub.firstCall.args; expect(success).to.be.true; diff --git a/packages/contentstack-asset-management/test/unit/export/spaces.test.ts b/packages/contentstack-asset-management/test/unit/export/spaces.test.ts index 3228ab8c1..ec30409e4 100644 --- a/packages/contentstack-asset-management/test/unit/export/spaces.test.ts +++ b/packages/contentstack-asset-management/test/unit/export/spaces.test.ts @@ -6,10 +6,10 @@ import { ExportSpaces, exportSpaceStructure } from '../../../src/export/spaces'; import ExportAssetTypes from '../../../src/export/asset-types'; import ExportFields from '../../../src/export/fields'; import ExportWorkspace from '../../../src/export/workspaces'; -import { AssetManagementExportAdapter } from '../../../src/export/base'; +import { CSAssetsExportAdapter } from '../../../src/export/base'; import { PROCESS_NAMES, getSpaceProcessName } from '../../../src/constants/index'; -import type { AssetManagementExportOptions, LinkedWorkspace } from '../../../src/types/asset-management-api'; +import type { AssetManagementExportOptions, LinkedWorkspace } from '../../../src/types/cs-assets-api'; describe('ExportSpaces', () => { const baseOptions: AssetManagementExportOptions = { @@ -19,7 +19,7 @@ describe('ExportSpaces', () => { ], exportDir: '/tmp/export', branchName: 'main', - assetManagementUrl: 'https://am.example.com', + csAssetsUrl: 'https://am.example.com', org_uid: 'org-1', }; @@ -32,7 +32,7 @@ describe('ExportSpaces', () => { }; beforeEach(() => { - sinon.stub(AssetManagementExportAdapter.prototype, 'init' as any).resolves(); + sinon.stub(CSAssetsExportAdapter.prototype, 'init' as any).resolves(); sinon.stub(configHandler, 'get').returns({ showConsoleLogs: false }); sinon.stub(CLIProgressManager, 'createNested').returns(fakeProgress as any); sinon.stub(ExportAssetTypes.prototype, 'start').resolves(); diff --git a/packages/contentstack-asset-management/test/unit/export/workspaces.test.ts b/packages/contentstack-asset-management/test/unit/export/workspaces.test.ts index 03bdfc6bf..212f79c94 100644 --- a/packages/contentstack-asset-management/test/unit/export/workspaces.test.ts +++ b/packages/contentstack-asset-management/test/unit/export/workspaces.test.ts @@ -3,13 +3,13 @@ import sinon from 'sinon'; import ExportWorkspace from '../../../src/export/workspaces'; import ExportAssets from '../../../src/export/assets'; -import { AssetManagementExportAdapter } from '../../../src/export/base'; +import { CSAssetsExportAdapter } from '../../../src/export/base'; -import type { AssetManagementAPIConfig, LinkedWorkspace, SpaceResponse } from '../../../src/types/asset-management-api'; +import type { CSAssetsAPIConfig, LinkedWorkspace, SpaceResponse } from '../../../src/types/cs-assets-api'; import type { ExportContext } from '../../../src/types/export-types'; describe('ExportWorkspace', () => { - const apiConfig: AssetManagementAPIConfig = { + const apiConfig: CSAssetsAPIConfig = { baseURL: 'https://am.example.com', headers: { organization_uid: 'org-1' }, }; @@ -36,8 +36,8 @@ describe('ExportWorkspace', () => { }; beforeEach(() => { - sinon.stub(AssetManagementExportAdapter.prototype, 'init' as any).resolves(); - sinon.stub(AssetManagementExportAdapter.prototype, 'tick' as any); + sinon.stub(CSAssetsExportAdapter.prototype, 'init' as any).resolves(); + sinon.stub(CSAssetsExportAdapter.prototype, 'tick' as any); sinon.stub(ExportAssets.prototype, 'start').resolves(); sinon.stub(ExportAssets.prototype, 'setParentProgressManager'); }); @@ -63,7 +63,7 @@ describe('ExportWorkspace', () => { // The per-space progress row's total is folder + metadata + downloads — // all owned by ExportAssets. The workspace metadata.json write is a // fixed bootstrap step and intentionally does not consume a tick. - const tickStub = (AssetManagementExportAdapter.prototype as any).tick as sinon.SinonStub; + const tickStub = (CSAssetsExportAdapter.prototype as any).tick as sinon.SinonStub; expect(tickStub.callCount).to.equal(0); }); diff --git a/packages/contentstack-asset-management/test/unit/utils/asset-management-api-adapter.test.ts b/packages/contentstack-asset-management/test/unit/utils/cs-assets-api-adapter.test.ts similarity index 85% rename from packages/contentstack-asset-management/test/unit/utils/asset-management-api-adapter.test.ts rename to packages/contentstack-asset-management/test/unit/utils/cs-assets-api-adapter.test.ts index f7e774912..20f122d82 100644 --- a/packages/contentstack-asset-management/test/unit/utils/asset-management-api-adapter.test.ts +++ b/packages/contentstack-asset-management/test/unit/utils/cs-assets-api-adapter.test.ts @@ -2,12 +2,12 @@ import { expect } from 'chai'; import sinon from 'sinon'; import { HttpClient, authenticationHandler } from '@contentstack/cli-utilities'; -import { AssetManagementAdapter } from '../../../src/utils/asset-management-api-adapter'; +import { CSAssetsAdapter } from '../../../src/utils/cs-assets-api-adapter'; -import type { AssetManagementAPIConfig } from '../../../src/types/asset-management-api'; +import type { CSAssetsAPIConfig } from '../../../src/types/cs-assets-api'; -describe('AssetManagementAdapter', () => { - const baseConfig: AssetManagementAPIConfig = { +describe('CSAssetsAdapter', () => { + const baseConfig: CSAssetsAPIConfig = { baseURL: 'https://am.example.com', headers: { organization_uid: 'org-1' }, }; @@ -31,12 +31,12 @@ describe('AssetManagementAdapter', () => { describe('constructor', () => { it('should set the baseURL with trailing slash stripped', () => { - new AssetManagementAdapter({ baseURL: 'https://am.example.com/' }); + new CSAssetsAdapter({ baseURL: 'https://am.example.com/' }); expect(baseUrlStub.firstCall.args[0]).to.equal('https://am.example.com'); }); it('should set default headers with x-cs-api-version when no extra headers provided', () => { - new AssetManagementAdapter({ baseURL: 'https://am.example.com' }); + new CSAssetsAdapter({ baseURL: 'https://am.example.com' }); const allHeaderArgs = headersStub.getCalls().map((c) => c.args[0]); const apiVersionCall = allHeaderArgs.find((h) => 'x-cs-api-version' in h); expect(apiVersionCall).to.exist; @@ -45,7 +45,7 @@ describe('AssetManagementAdapter', () => { }); it('should merge extra headers with default headers', () => { - new AssetManagementAdapter(baseConfig); + new CSAssetsAdapter(baseConfig); const allHeaderArgs = headersStub.getCalls().map((c) => c.args[0]); const apiVersionCall = allHeaderArgs.find((h) => 'x-cs-api-version' in h); expect(apiVersionCall).to.exist; @@ -54,14 +54,14 @@ describe('AssetManagementAdapter', () => { }); it('should handle empty baseURL gracefully', () => { - new AssetManagementAdapter({ baseURL: '' }); + new CSAssetsAdapter({ baseURL: '' }); expect(baseUrlStub.firstCall.args[0]).to.equal(''); }); }); describe('init', () => { it('should set access_token header when OAuth is disabled', async () => { - const adapter = new AssetManagementAdapter(baseConfig); + const adapter = new CSAssetsAdapter(baseConfig); await adapter.init(); const authCallArgs = headersStub.getCalls().map((c) => c.args[0]); @@ -83,7 +83,7 @@ describe('AssetManagementAdapter', () => { it('should set authorization header', async () => { const capturedHeaders = HttpClient.prototype.headers as sinon.SinonStub; - const adapter = new AssetManagementAdapter(baseConfig); + const adapter = new CSAssetsAdapter(baseConfig); await adapter.init(); const authCallArgs = capturedHeaders.getCalls().map((c) => c.args[0]); @@ -95,7 +95,7 @@ describe('AssetManagementAdapter', () => { it('should re-throw errors from getAuthDetails', async () => { (authenticationHandler.getAuthDetails as sinon.SinonStub).rejects(new Error('auth-failed')); - const adapter = new AssetManagementAdapter(baseConfig); + const adapter = new CSAssetsAdapter(baseConfig); try { await adapter.init(); @@ -106,7 +106,7 @@ describe('AssetManagementAdapter', () => { }); it('should merge config headers with auth header when config.headers is present', async () => { - const adapter = new AssetManagementAdapter(baseConfig); + const adapter = new CSAssetsAdapter(baseConfig); await adapter.init(); const capturedHeaders = headersStub.getCalls().map((c) => c.args[0]); @@ -118,7 +118,7 @@ describe('AssetManagementAdapter', () => { describe('getSpace', () => { it('should GET /api/spaces/{spaceUid}?addl_fields=... and return the space', async () => { getStub.resolves({ status: 200, data: { space: { uid: 'sp-1' } } }); - const adapter = new AssetManagementAdapter(baseConfig); + const adapter = new CSAssetsAdapter(baseConfig); const result = await adapter.getSpace('sp-1'); const path = getStub.firstCall.args[0] as string; @@ -129,7 +129,7 @@ describe('AssetManagementAdapter', () => { it('should throw when response status is non-2xx', async () => { getStub.resolves({ status: 404, data: null }); - const adapter = new AssetManagementAdapter(baseConfig); + const adapter = new CSAssetsAdapter(baseConfig); try { await adapter.getSpace('missing-space'); @@ -144,7 +144,7 @@ describe('AssetManagementAdapter', () => { it('should GET /api/fields and return the response data', async () => { const fieldsResponse = { count: 1, relation: 'org', fields: [{ uid: 'f1' }] }; getStub.resolves({ status: 200, data: fieldsResponse }); - const adapter = new AssetManagementAdapter(baseConfig); + const adapter = new CSAssetsAdapter(baseConfig); const result = await adapter.getWorkspaceFields('sp-1'); expect(getStub.firstCall.args[0]).to.equal('/api/fields'); @@ -155,7 +155,7 @@ describe('AssetManagementAdapter', () => { describe('getWorkspaceAssets', () => { it('should GET /api/spaces/{spaceUid}/assets', async () => { getStub.resolves({ status: 200, data: { items: [] } }); - const adapter = new AssetManagementAdapter(baseConfig); + const adapter = new CSAssetsAdapter(baseConfig); await adapter.getWorkspaceAssets('sp-1'); expect(getStub.firstCall.args[0]).to.include('/api/spaces/sp-1/assets'); @@ -163,7 +163,7 @@ describe('AssetManagementAdapter', () => { it('should URL-encode the spaceUid in the path', async () => { getStub.resolves({ status: 200, data: { items: [] } }); - const adapter = new AssetManagementAdapter(baseConfig); + const adapter = new CSAssetsAdapter(baseConfig); await adapter.getWorkspaceAssets('sp uid/special'); const path = getStub.firstCall.args[0] as string; @@ -174,7 +174,7 @@ describe('AssetManagementAdapter', () => { describe('getWorkspaceFolders', () => { it('should GET /api/spaces/{spaceUid}/folders', async () => { getStub.resolves({ status: 200, data: [] }); - const adapter = new AssetManagementAdapter(baseConfig); + const adapter = new CSAssetsAdapter(baseConfig); await adapter.getWorkspaceFolders('sp-1'); expect(getStub.firstCall.args[0]).to.include('/api/spaces/sp-1/folders'); @@ -185,7 +185,7 @@ describe('AssetManagementAdapter', () => { it('should GET /api/asset_types?include_fields=true and return the response data', async () => { const atResponse = { count: 1, relation: 'org', asset_types: [{ uid: 'at1' }] }; getStub.resolves({ status: 200, data: atResponse }); - const adapter = new AssetManagementAdapter(baseConfig); + const adapter = new CSAssetsAdapter(baseConfig); const result = await adapter.getWorkspaceAssetTypes('sp-1'); const path = getStub.firstCall.args[0] as string; @@ -198,7 +198,7 @@ describe('AssetManagementAdapter', () => { describe('buildQueryString (via public methods)', () => { it('should encode array values as repeated key=value pairs', async () => { getStub.resolves({ status: 200, data: { space: { uid: 'sp-1' } } }); - const adapter = new AssetManagementAdapter(baseConfig); + const adapter = new CSAssetsAdapter(baseConfig); await adapter.getSpace('sp-1'); const path = getStub.firstCall.args[0] as string; @@ -208,7 +208,7 @@ describe('AssetManagementAdapter', () => { it('should return empty string and no "?" when params are empty', async () => { getStub.resolves({ status: 200, data: { count: 0, relation: '', fields: [] } }); - const adapter = new AssetManagementAdapter(baseConfig); + const adapter = new CSAssetsAdapter(baseConfig); await adapter.getWorkspaceFields('sp-1'); const path = getStub.firstCall.args[0] as string; diff --git a/packages/contentstack-audit/src/modules/assets.ts b/packages/contentstack-audit/src/modules/assets.ts index 39c357b96..ff375a65a 100644 --- a/packages/contentstack-audit/src/modules/assets.ts +++ b/packages/contentstack-audit/src/modules/assets.ts @@ -11,7 +11,7 @@ import BaseClass from './base-class'; /** * Multibar row label for a single space. Bounded to 14 chars after the * `Space ` prefix so CLIProgressManager.formatProcessName doesn't truncate the - * row mid-string. Mirrors the helper in `@contentstack/cli-asset-management`. + * row mid-string. Mirrors the helper in `@contentstack/cli-cs-assets`. */ const SPACE_PROCESS_NAME_PREFIX = 'Space '; const SPACE_PROCESS_NAME_MAX_UID_LEN = 14; diff --git a/packages/contentstack-branches/README.md b/packages/contentstack-branches/README.md index 5fcb24e51..c22682f9b 100755 --- a/packages/contentstack-branches/README.md +++ b/packages/contentstack-branches/README.md @@ -53,6 +53,7 @@ USAGE * [`csdx cm:branches:delete [-uid ] [-k ]`](#csdx-cmbranchesdelete--uid-value--k-value) * [`csdx cm:branches:diff [--base-branch ] [--compare-branch ] [-k ][--module ] [--format ] [--csv-path ]`](#csdx-cmbranchesdiff---base-branch-value---compare-branch-value--k-value--module-value---format-value---csv-path-value) * [`csdx cm:branches:merge [-k ][--compare-branch ] [--no-revert] [--export-summary-path ] [--use-merge-summary ] [--comment ] [--base-branch ]`](#csdx-cmbranchesmerge--k-value--compare-branch-value---no-revert---export-summary-path-value---use-merge-summary-value---comment-value---base-branch-value) +* [`csdx cm:branches:merge-status -k --merge-uid `](#csdx-cmbranchesmerge-status--k-value---merge-uid-value) ## `csdx cm:branches` @@ -230,4 +231,27 @@ EXAMPLES ``` _See code: [src/commands/cm/branches/merge.ts](https://github.com/contentstack/cli/blob/main/packages/contentstack-export/src/commands/cm/branches/merge.ts)_ + +## `csdx cm:branches:merge-status -k --merge-uid ` + +Check the status of a branch merge job + +``` +USAGE + $ csdx cm:branches:merge-status -k --merge-uid + +FLAGS + -k, --stack-api-key= (required) Provide your stack API key. + --merge-uid= (required) Merge job UID to check status for. + +DESCRIPTION + Check the status of a branch merge job + +EXAMPLES + $ csdx cm:branches:merge-status -k bltxxxxxxxx --merge-uid merge_abc123 + + $ csdx cm:branches:merge-status --stack-api-key bltxxxxxxxx --merge-uid merge_abc123 +``` + +_See code: [src/commands/cm/branches/merge-status.ts](https://github.com/contentstack/cli/blob/main/packages/contentstack-export/src/commands/cm/branches/merge-status.ts)_ diff --git a/packages/contentstack-clone/README.md b/packages/contentstack-clone/README.md index f67e967e7..4c818981a 100644 --- a/packages/contentstack-clone/README.md +++ b/packages/contentstack-clone/README.md @@ -16,7 +16,7 @@ $ npm install -g @contentstack/cli-cm-clone $ csdx COMMAND running command... $ csdx (--version) -@contentstack/cli-cm-clone/2.0.0-beta.12 darwin-arm64 node-v24.13.0 +@contentstack/cli-cm-clone/2.0.0-beta.17 darwin-arm64 node-v22.13.1 $ csdx --help [COMMAND] USAGE $ csdx COMMAND diff --git a/packages/contentstack-export/src/config/index.ts b/packages/contentstack-export/src/config/index.ts index da39dc24c..767334759 100644 --- a/packages/contentstack-export/src/config/index.ts +++ b/packages/contentstack-export/src/config/index.ts @@ -112,7 +112,7 @@ const config: DefaultConfig = { enableDownloadStatus: false, includeVersionedAssets: false, }, - 'asset-management': { + 'cs-assets': { chunkFileSizeMb: 1, apiConcurrency: 5, downloadAssetsConcurrency: 5, diff --git a/packages/contentstack-export/src/export/modules/assets.ts b/packages/contentstack-export/src/export/modules/assets.ts index a54a4b84f..6b79da510 100644 --- a/packages/contentstack-export/src/export/modules/assets.ts +++ b/packages/contentstack-export/src/export/modules/assets.ts @@ -60,56 +60,60 @@ export default class ExportAssets extends BaseClass { const linkedWorkspaces = this.exportConfig.linkedWorkspaces ?? []; if (linkedWorkspaces.length > 0) { - const assetManagementUrl = this.exportConfig.region?.assetManagementUrl; - if (!assetManagementUrl) { + const csAssetsUrl = this.exportConfig.region?.csAssetsUrl; + if (!csAssetsUrl) { handleAndLogError( new Error( - 'Asset Management URL is required for AM 2.0 export. Ensure your region is configured with assetManagementUrl.', + 'Contentstack Assets URL is required for CS Assets export. Ensure your region is configured with csAssetsUrl.', ), { ...this.exportConfig.context, message: - 'Asset Management URL is required for AM 2.0 export. Ensure your region is configured with assetManagementUrl.', + 'Contentstack Assets URL is required for CS Assets export. Ensure your region is configured with csAssetsUrl.', }, ); this.completeProgressWithMessage({ - moduleName: 'Asset Management 2.0', + moduleName: 'Contentstack Assets', customWarningMessage: - 'Asset Management 2.0 export was skipped: assetManagementUrl is not configured. AM 2.0 assets will not be exported.', + 'Contentstack Assets export was skipped: csAssetsUrl is not configured. CS Assets assets will not be exported.', context: this.exportConfig.context, }); cliux.print( - 'Asset Management URL is required for AM 2.0 export. Ensure your region is configured with assetManagementUrl.', + 'Contentstack Assets URL is required for CS Assets export. Ensure your region is configured with csAssetsUrl.', { color: 'yellow' }, ); return; } log.debug( - `Exporting with AM 2.0: ${assetManagementUrl} (linked_workspaces from exportConfig)`, + `Exporting with CS Assets: ${csAssetsUrl} (linked_workspaces from exportConfig)`, this.exportConfig.context, ); this.exportConfig.org_uid = this.exportConfig.org_uid || (await getOrgUid(this.exportConfig)); const progress = this.createNestedProgress(this.currentModuleName); try { - const assetManagementModuleConfig = this.exportConfig.modules['asset-management']; + const legacyModuleConfig = (this.exportConfig.modules as Record)['asset-management']; + const csAssetsModuleConfig = this.exportConfig.modules['cs-assets'] || legacyModuleConfig; + if (!this.exportConfig.modules['cs-assets'] && legacyModuleConfig) { + log.warn('Config key "modules.asset-management" is deprecated. Please rename it to "modules.cs-assets".'); + } const exporter = new ExportSpaces({ linkedWorkspaces, exportDir: this.exportConfig.exportDir, branchName: this.exportConfig.branchName || 'main', - assetManagementUrl, + csAssetsUrl, org_uid: this.exportConfig.org_uid ?? '', apiKey: this.exportConfig.apiKey, context: this.exportConfig.context as unknown as Record, securedAssets: this.exportConfig.securedAssets, - chunkFileSizeMb: assetManagementModuleConfig?.chunkFileSizeMb, - apiConcurrency: assetManagementModuleConfig?.apiConcurrency, - downloadAssetsConcurrency: assetManagementModuleConfig?.downloadAssetsConcurrency, + chunkFileSizeMb: csAssetsModuleConfig?.chunkFileSizeMb, + apiConcurrency: csAssetsModuleConfig?.apiConcurrency, + downloadAssetsConcurrency: csAssetsModuleConfig?.downloadAssetsConcurrency, }); exporter.setParentProgressManager(progress); await exporter.start(); this.completeProgressWithMessage(); } catch (error) { - this.completeProgress(false, (error as Error)?.message ?? 'Asset Management export failed'); + this.completeProgress(false, (error as Error)?.message ?? 'Contentstack Assets export failed'); throw error; } return; diff --git a/packages/contentstack-export/src/types/default-config.ts b/packages/contentstack-export/src/types/default-config.ts index 7fedadd61..433f420fb 100644 --- a/packages/contentstack-export/src/types/default-config.ts +++ b/packages/contentstack-export/src/types/default-config.ts @@ -96,10 +96,10 @@ export default interface DefaultConfig { includeVersionedAssets: boolean; dependencies?: Modules[]; }; - 'asset-management': { + 'cs-assets': { /** Passed to FsUtility chunkFileSize (MB) when writing chunked export JSON. */ chunkFileSizeMb: number; - /** Shared export concurrency fallback used by AM 2.0 export. */ + /** Shared export concurrency fallback used by CS Assets export. */ apiConcurrency: number; /** Parallel downloads per AM workspace export. */ downloadAssetsConcurrency: number; diff --git a/packages/contentstack-export/src/types/index.ts b/packages/contentstack-export/src/types/index.ts index 3f06ebdb7..d8898a89d 100644 --- a/packages/contentstack-export/src/types/index.ts +++ b/packages/contentstack-export/src/types/index.ts @@ -32,7 +32,7 @@ export interface Region { cma: string; cda: string; uiHost: string; - assetManagementUrl?: string; + csAssetsUrl?: string; } export type Modules = diff --git a/packages/contentstack-export/src/utils/constants.ts b/packages/contentstack-export/src/utils/constants.ts index 323e3ab89..bf5339f45 100644 --- a/packages/contentstack-export/src/utils/constants.ts +++ b/packages/contentstack-export/src/utils/constants.ts @@ -3,11 +3,11 @@ export const PROCESS_NAMES = { ASSET_FOLDERS: 'Folders', ASSET_METADATA: 'Metadata', ASSET_DOWNLOADS: 'Downloads', - /** Used when Assets module runs Asset Management 2.0 path (spaces, metadata, folders, assets, downloads). */ + /** Used when Assets module runs Contentstack Assets path (spaces, metadata, folders, assets, downloads). */ ASSET_MANAGEMENT_SPACES: 'Spaces & assets', - // Asset Management 2.0 module - ASSET_MANAGEMENT_EXPORT: 'Asset Management 2.0', + // Contentstack Assets module + ASSET_MANAGEMENT_EXPORT: 'Contentstack Assets', // Custom Roles module FETCH_ROLES: 'Fetch Roles', @@ -42,7 +42,7 @@ export const PROCESS_NAMES = { export const MODULE_CONTEXTS = { ASSETS: 'assets', - ASSET_MANAGEMENT: 'asset-management', + CS_ASSETS: 'cs-assets', CONTENT_TYPES: 'content-types', CUSTOM_ROLES: 'custom-roles', ENTRIES: 'entries', @@ -62,7 +62,7 @@ export const MODULE_CONTEXTS = { // Display names for modules to avoid scattering user-facing strings export const MODULE_NAMES = { [MODULE_CONTEXTS.ASSETS]: 'Assets', - [MODULE_CONTEXTS.ASSET_MANAGEMENT]: 'Asset Management 2.0', + [MODULE_CONTEXTS.CS_ASSETS]: 'Contentstack Assets', [MODULE_CONTEXTS.CONTENT_TYPES]: 'Content Types', [MODULE_CONTEXTS.CUSTOM_ROLES]: 'Custom Roles', [MODULE_CONTEXTS.ENTRIES]: 'Entries', @@ -98,10 +98,10 @@ export const PROCESS_STATUS = { EXPORTING: 'Exporting spaces & assets...', FAILED: 'Failed to export spaces & assets.', }, - // Asset Management 2.0 + // Contentstack Assets [PROCESS_NAMES.ASSET_MANAGEMENT_EXPORT]: { EXPORTING: 'Exporting...', - FAILED: 'Asset Management export failed.', + FAILED: 'Contentstack Assets export failed.', }, [PROCESS_NAMES.FETCH_ROLES]: { FETCHING: 'Fetching custom roles...', diff --git a/packages/contentstack-export/src/utils/export-config-handler.ts b/packages/contentstack-export/src/utils/export-config-handler.ts index 188444545..3b1d559ff 100644 --- a/packages/contentstack-export/src/utils/export-config-handler.ts +++ b/packages/contentstack-export/src/utils/export-config-handler.ts @@ -25,6 +25,15 @@ const setupConfig = async (exportCmdFlags: any): Promise => { log.debug('Loading external configuration file...', { configFile: exportCmdFlags['config'] }); const externalConfig = await readFile(exportCmdFlags['config']); + const legacyCsAssetsConfig = externalConfig?.modules?.['asset-management']; + if (legacyCsAssetsConfig) { + externalConfig.modules['cs-assets'] = externalConfig.modules['cs-assets'] || legacyCsAssetsConfig; + delete externalConfig.modules['asset-management']; + log.warn( + 'Config key "modules.asset-management" is deprecated. Please rename it to "modules.cs-assets".', + ); + } + config = merge.recursive(config, externalConfig); } diff --git a/packages/contentstack-export/src/utils/get-linked-workspaces.ts b/packages/contentstack-export/src/utils/get-linked-workspaces.ts index e5abca975..94e070959 100644 --- a/packages/contentstack-export/src/utils/get-linked-workspaces.ts +++ b/packages/contentstack-export/src/utils/get-linked-workspaces.ts @@ -6,7 +6,7 @@ type StackWithBranch = { branch: (name: string) => { fetch: (params?: Record { enableDownloadStatus: false, includeVersionedAssets: false, }, - 'asset-management': { + 'cs-assets': { chunkFileSizeMb: 1, apiConcurrency: 5, downloadAssetsConcurrency: 5, @@ -335,11 +335,11 @@ describe('ExportAssets', () => { it('should forward AM export concurrency options to ExportSpaces', async () => { mockExportConfig.linkedWorkspaces = [{ uid: 'ws-1', space_uid: 'am-space-1', is_default: true }]; - mockExportConfig.region.assetManagementUrl = 'https://am.example.com'; + mockExportConfig.region.csAssetsUrl = 'https://am.example.com'; mockExportConfig.org_uid = 'org-from-config'; - mockExportConfig.modules['asset-management'].chunkFileSizeMb = 2; - mockExportConfig.modules['asset-management'].apiConcurrency = 7; - mockExportConfig.modules['asset-management'].downloadAssetsConcurrency = 3; + mockExportConfig.modules['cs-assets'].chunkFileSizeMb = 2; + mockExportConfig.modules['cs-assets'].apiConcurrency = 7; + mockExportConfig.modules['cs-assets'].downloadAssetsConcurrency = 3; const progressManager = { addProcess: sinon.stub(), startProcess: sinon.stub(), updateStatus: sinon.stub() }; ((exportAssets as any).createNestedProgress as sinon.SinonStub).returns(progressManager as any); diff --git a/packages/contentstack-export/test/unit/export/modules/base-class.test.ts b/packages/contentstack-export/test/unit/export/modules/base-class.test.ts index 52eefd922..03c0687d0 100644 --- a/packages/contentstack-export/test/unit/export/modules/base-class.test.ts +++ b/packages/contentstack-export/test/unit/export/modules/base-class.test.ts @@ -154,7 +154,7 @@ describe('BaseClass', () => { enableDownloadStatus: false, includeVersionedAssets: false, }, - 'asset-management': { + 'cs-assets': { chunkFileSizeMb: 1, apiConcurrency: 5, downloadAssetsConcurrency: 5, diff --git a/packages/contentstack-import/src/config/index.ts b/packages/contentstack-import/src/config/index.ts index a15332baa..a49014296 100644 --- a/packages/contentstack-import/src/config/index.ts +++ b/packages/contentstack-import/src/config/index.ts @@ -101,7 +101,7 @@ const config: DefaultConfig = { folderValidKeys: ['name', 'parent_uid'], validKeys: ['title', 'parent_uid', 'description', 'tags'], }, - 'asset-management': { + 'cs-assets': { dirName: 'spaces', fieldsDir: 'fields', assetTypesDir: 'asset_types', diff --git a/packages/contentstack-import/src/import/modules/assets.ts b/packages/contentstack-import/src/import/modules/assets.ts index 80b3f7ef0..a24cc5a09 100644 --- a/packages/contentstack-import/src/import/modules/assets.ts +++ b/packages/contentstack-import/src/import/modules/assets.ts @@ -67,11 +67,11 @@ export default class ImportAssets extends BaseClass { try { log.debug('Starting assets import process...', this.importConfig.context); - // AM 2.0: assetManagementEnabled is set in the config handler when spaces/ + am_v2 are detected. - if (this.importConfig.assetManagementEnabled) { - if (!this.importConfig.assetManagementUrl) { + // CS Assets: csAssetsEnabled is set in the config handler when spaces/ + am_v2 are detected. + if (this.importConfig.csAssetsEnabled) { + if (!this.importConfig.csAssetsUrl) { log.info( - 'AM 2.0 export detected but assetManagementUrl is not configured in the region settings. Skipping AM 2.0 asset import.', + 'CS Assets export detected but csAssetsUrl is not configured in the region settings. Skipping CS Assets asset import.', this.importConfig.context, ); return; @@ -81,13 +81,11 @@ export default class ImportAssets extends BaseClass { let spaceMappings: SpaceMapping[] = []; try { - const importer = new ImportSpaces( - buildImportSpacesOptions(this.importConfig, this.importConfig.assetManagementUrl), - ); + const importer = new ImportSpaces(buildImportSpacesOptions(this.importConfig, this.importConfig.csAssetsUrl)); importer.setParentProgressManager(progress); ({ spaceMappings } = await importer.start()); } catch (error) { - this.completeProgress(false, (error as Error)?.message ?? 'AM 2.0 asset import failed'); + this.completeProgress(false, (error as Error)?.message ?? 'CS Assets asset import failed'); throw error; } @@ -170,10 +168,7 @@ export default class ImportAssets extends BaseClass { try { const branchUid = this.importConfig.branchName ?? 'main'; - const branchData = (await this.stack.branch(branchUid).fetch({ include_settings: true })) as Record< - string, - any - >; + const branchData = (await this.stack.branch(branchUid).fetch({ include_settings: true })) as Record; const currentLinked = (branchData?.settings?.am_v2?.linked_workspaces ?? []) as Array<{ uid: string; space_uid: string; @@ -193,14 +188,11 @@ export default class ImportAssets extends BaseClass { await this.stack.branch(branchUid).updateSettings({ branch: { settings: { am_v2: { linked_workspaces: combinedWorkspaces } } }, }); - log.success( - `Linked ${newWorkspaces.length} space(s) to branch "${branchUid}"`, - this.importConfig.context, - ); + log.success(`Linked ${newWorkspaces.length} space(s) to branch "${branchUid}"`, this.importConfig.context); } catch (linkErr) { handleAndLogError(linkErr, { ...this.importConfig.context, - phase: 'AM 2.0 branch linking (linked_workspaces)', + phase: 'CS Assets branch linking (linked_workspaces)', }); } } diff --git a/packages/contentstack-import/src/import/modules/stack.ts b/packages/contentstack-import/src/import/modules/stack.ts index 969ad4c94..96602f941 100644 --- a/packages/contentstack-import/src/import/modules/stack.ts +++ b/packages/contentstack-import/src/import/modules/stack.ts @@ -70,12 +70,12 @@ export default class ImportStack extends BaseClass { log.debug('Processing stack settings for import', this.importConfig.context); // Old source-org space UIDs must not be written to the target stack — - // the asset-management module will apply the correct am_v2.linked_workspaces. + // the cs-assets module will apply the correct am_v2.linked_workspaces. if (existsSync(join(this.importConfig.contentDir, 'spaces'))) { const { am_v2, ...settingsWithoutAm } = this.stackSettings as any; this.stackSettings = settingsWithoutAm; log.debug( - 'Stripped am_v2 from stack settings; asset-management module will apply it after space creation', + 'Stripped am_v2 from stack settings; cs-assets module will apply it after space creation', this.importConfig.context, ); } diff --git a/packages/contentstack-import/src/types/default-config.ts b/packages/contentstack-import/src/types/default-config.ts index 29e859806..3374931ce 100644 --- a/packages/contentstack-import/src/types/default-config.ts +++ b/packages/contentstack-import/src/types/default-config.ts @@ -72,7 +72,7 @@ export default interface DefaultConfig { uploadAssetsConcurrency: number; importFoldersConcurrency: number; }; - 'asset-management': { + 'cs-assets': { dirName: string; fieldsDir: string; assetTypesDir: string; diff --git a/packages/contentstack-import/src/types/import-config.ts b/packages/contentstack-import/src/types/import-config.ts index e7ee366e2..1587a360e 100644 --- a/packages/contentstack-import/src/types/import-config.ts +++ b/packages/contentstack-import/src/types/import-config.ts @@ -57,8 +57,8 @@ export default interface ImportConfig extends DefaultConfig, ExternalConfig { personalizeProjectName?: string; 'exclude-global-modules': false; context: Context; - assetManagementUrl?: string; - assetManagementEnabled?: boolean; + csAssetsUrl?: string; + csAssetsEnabled?: boolean; } type branch = { diff --git a/packages/contentstack-import/src/types/index.ts b/packages/contentstack-import/src/types/index.ts index a73584b36..d7b2c946e 100644 --- a/packages/contentstack-import/src/types/index.ts +++ b/packages/contentstack-import/src/types/index.ts @@ -19,7 +19,7 @@ export interface Region { cma: string; cda: string; uiHost: string; - assetManagementUrl?: string; + csAssetsUrl?: string; } export interface InquirePayload { diff --git a/packages/contentstack-import/src/utils/build-import-spaces-options.ts b/packages/contentstack-import/src/utils/build-import-spaces-options.ts index 32e57c8ce..f0dc54e7f 100644 --- a/packages/contentstack-import/src/utils/build-import-spaces-options.ts +++ b/packages/contentstack-import/src/utils/build-import-spaces-options.ts @@ -1,4 +1,5 @@ import type { ImportSpacesOptions } from '@contentstack/cli-asset-management'; +import { log } from '@contentstack/cli-utilities'; import { PATH_CONSTANTS } from '../constants'; import type ImportConfig from '../types/import-config'; @@ -7,16 +8,17 @@ import type ImportConfig from '../types/import-config'; * Maps stack `ImportConfig` and AM base URL into a single `ImportSpacesOptions` for the AM package * (variants-style: one flat object; `ImportSpaces` splits API vs context internally). */ -export function buildImportSpacesOptions( - importConfig: ImportConfig, - assetManagementUrl: string, -): ImportSpacesOptions { - const am = importConfig.modules['asset-management']; +export function buildImportSpacesOptions(importConfig: ImportConfig, csAssetsUrl: string): ImportSpacesOptions { + const legacyModuleConfig = (importConfig.modules as Record)['asset-management']; + const am = importConfig.modules['cs-assets'] || legacyModuleConfig; + if (!importConfig.modules['cs-assets'] && legacyModuleConfig) { + log.warn('Config key "modules.asset-management" is deprecated. Please rename it to "modules.cs-assets".'); + } const org_uid = importConfig.org_uid ?? ''; return { contentDir: importConfig.contentDir, - assetManagementUrl, + csAssetsUrl, org_uid, apiKey: importConfig.apiKey, host: importConfig.region?.cma ?? importConfig.host ?? '', diff --git a/packages/contentstack-import/src/utils/import-config-handler.ts b/packages/contentstack-import/src/utils/import-config-handler.ts index 29c00c1c8..be5807ab0 100644 --- a/packages/contentstack-import/src/utils/import-config-handler.ts +++ b/packages/contentstack-import/src/utils/import-config-handler.ts @@ -22,6 +22,15 @@ const setupConfig = async (importCmdFlags: any): Promise => { if (importCmdFlags['config']) { let externalConfig = await readFile(importCmdFlags['config']); + const legacyCsAssetsConfig = externalConfig?.modules?.['asset-management']; + if (legacyCsAssetsConfig) { + externalConfig.modules['cs-assets'] = externalConfig.modules['cs-assets'] || legacyCsAssetsConfig; + delete externalConfig.modules['asset-management']; + log.warn( + 'Config key "modules.asset-management" is deprecated. Please rename it to "modules.cs-assets".', + ); + } + if (isArray(externalConfig['modules'])) { config.modules.types = filter(config.modules.types, (module) => includes(externalConfig['modules'], module)); externalConfig = omit(externalConfig, ['modules']); @@ -133,8 +142,8 @@ const setupConfig = async (importCmdFlags: any): Promise => { try { const stackSettings = JSON.parse(readFileSync(stackSettingsPath, 'utf8')); if (stackSettings?.am_v2) { - config.assetManagementEnabled = true; - config.assetManagementUrl = configHandler.get('region')?.assetManagementUrl; + config.csAssetsEnabled = true; + config.csAssetsUrl = configHandler.get('region')?.csAssetsUrl; if (existsSync(stackJsonPath)) { try { @@ -149,7 +158,7 @@ const setupConfig = async (importCmdFlags: any): Promise => { } } } catch { - // stack settings unreadable — not an AM 2.0 export we can process + // stack settings unreadable — not an CS Assets export we can process } } diff --git a/packages/contentstack-import/src/utils/progress-strategy-registry.ts b/packages/contentstack-import/src/utils/progress-strategy-registry.ts index 0d5137346..73984ed43 100644 --- a/packages/contentstack-import/src/utils/progress-strategy-registry.ts +++ b/packages/contentstack-import/src/utils/progress-strategy-registry.ts @@ -15,7 +15,7 @@ import { MODULE_CONTEXTS, MODULE_NAMES, PROCESS_NAMES } from './constants'; /** * Sum the totals/success/failure counts across every per-space process row in - * the multibar. Used by the AM 2.0 Assets strategy so the final import summary + * the multibar. Used by the CS Assets Assets strategy so the final import summary * reports total assets-across-all-spaces instead of the placeholder row. * * Returns null when no per-space rows exist, letting the strategy fall back to @@ -48,114 +48,113 @@ try { // Register strategy for Assets - use Asset Upload as primary process ProgressStrategyRegistry.register( - MODULE_NAMES[MODULE_CONTEXTS.ASSETS], - new CustomProgressStrategy((processes) => { - const uploadsProcess = processes.get(PROCESS_NAMES.ASSET_UPLOAD); - if (uploadsProcess) { - return { - total: uploadsProcess.total, - success: uploadsProcess.successCount, - failures: uploadsProcess.failureCount, - }; - } - - // Asset Management 2.0 (per-space layout): sum every "Space *" row so the - // final summary reports total assets-across-all-spaces. - const spaceTotals = aggregateSpaceProcesses(processes); - if (spaceTotals) return spaceTotals; - - return null; // Fall back to default aggregation - }), -); - -// Register strategy for Entries - use Entry Creation as primary process -ProgressStrategyRegistry.register( - MODULE_NAMES[MODULE_CONTEXTS.ENTRIES], - new PrimaryProcessStrategy(PROCESS_NAMES.ENTRIES_CREATE), -); - -// Register strategy for Global Fields - use Create as primary process -ProgressStrategyRegistry.register( - MODULE_NAMES[MODULE_CONTEXTS.GLOBAL_FIELDS], - new PrimaryProcessStrategy(PROCESS_NAMES.GLOBAL_FIELDS_CREATE), -); - -// Register strategy for Extensions - simple module -ProgressStrategyRegistry.register( - MODULE_NAMES[MODULE_CONTEXTS.EXTENSIONS], - new PrimaryProcessStrategy(PROCESS_NAMES.EXTENSIONS_CREATE), -); - -// Register strategy for Environments - uses default (no nested progress yet) -ProgressStrategyRegistry.register(MODULE_NAMES[MODULE_CONTEXTS.ENVIRONMENTS], new DefaultProgressStrategy()); - -// Register strategy for Locales - uses default (no nested progress yet) -ProgressStrategyRegistry.register( - MODULE_NAMES[MODULE_CONTEXTS.LOCALES], - new PrimaryProcessStrategy(PROCESS_NAMES.LOCALES_CREATE), -); - -// Register strategy for Labels - uses default (no nested progress yet) -ProgressStrategyRegistry.register( - MODULE_NAMES[MODULE_CONTEXTS.LABELS], - new PrimaryProcessStrategy(PROCESS_NAMES.LABELS_CREATE), -); - -// Register strategy for Webhooks - uses default (no nested progress yet) -ProgressStrategyRegistry.register(MODULE_NAMES[MODULE_CONTEXTS.WEBHOOKS], new DefaultProgressStrategy()); - -// Register strategy for Workflows - uses default (no nested progress yet) -ProgressStrategyRegistry.register( - MODULE_NAMES[MODULE_CONTEXTS.WORKFLOWS], - new PrimaryProcessStrategy(PROCESS_NAMES.WEBHOOKS_IMPORT), -); - -// Register strategy for Custom Roles - uses default (no nested progress yet) -ProgressStrategyRegistry.register(MODULE_NAMES[MODULE_CONTEXTS.CUSTOM_ROLES], new DefaultProgressStrategy()); - -// Register strategy for Taxonomies - uses default (no nested progress yet) -ProgressStrategyRegistry.register(MODULE_NAMES[MODULE_CONTEXTS.TAXONOMIES], new DefaultProgressStrategy()); - -// Register strategy for Marketplace Apps - complex module with app installations -ProgressStrategyRegistry.register( - MODULE_NAMES[MODULE_CONTEXTS.MARKETPLACE_APPS], - new PrimaryProcessStrategy(PROCESS_NAMES.CREATE_APPS), -); - -// Register strategy for Stack Settings - simple module -ProgressStrategyRegistry.register(MODULE_NAMES[MODULE_CONTEXTS.STACK], new DefaultProgressStrategy()); - -// Register strategy for Personalize - complex module with projects/experiences -ProgressStrategyRegistry.register( - MODULE_NAMES[MODULE_CONTEXTS.PERSONALIZE], - new CustomProgressStrategy((processes) => { - // For personalize import, count project imports as primary metric - const projectImport = processes.get(PROCESS_NAMES.PERSONALIZE_PROJECTS); - if (projectImport) { - return { - total: projectImport.total, - success: projectImport.successCount, - failures: projectImport.failureCount, - }; - } - - // Fallback to any other main process - const mainProcess = Array.from(processes.values())[0]; - if (mainProcess) { - return { - total: mainProcess.total, - success: mainProcess.successCount, - failures: mainProcess.failureCount, - }; - } - - return null; - }), -); - -// Register strategy for Variant Entries - sub-process of entries -ProgressStrategyRegistry.register(MODULE_NAMES[MODULE_CONTEXTS.VARIANT_ENTRIES], new DefaultProgressStrategy()); + MODULE_NAMES[MODULE_CONTEXTS.ASSETS], + new CustomProgressStrategy((processes) => { + const uploadsProcess = processes.get(PROCESS_NAMES.ASSET_UPLOAD); + if (uploadsProcess) { + return { + total: uploadsProcess.total, + success: uploadsProcess.successCount, + failures: uploadsProcess.failureCount, + }; + } + + // Contentstack Assets (per-space layout): sum every "Space *" row so the + // final summary reports total assets-across-all-spaces. + const spaceTotals = aggregateSpaceProcesses(processes); + if (spaceTotals) return spaceTotals; + + return null; // Fall back to default aggregation + }), + ); + + // Register strategy for Entries - use Entry Creation as primary process + ProgressStrategyRegistry.register( + MODULE_NAMES[MODULE_CONTEXTS.ENTRIES], + new PrimaryProcessStrategy(PROCESS_NAMES.ENTRIES_CREATE), + ); + + // Register strategy for Global Fields - use Create as primary process + ProgressStrategyRegistry.register( + MODULE_NAMES[MODULE_CONTEXTS.GLOBAL_FIELDS], + new PrimaryProcessStrategy(PROCESS_NAMES.GLOBAL_FIELDS_CREATE), + ); + + // Register strategy for Extensions - simple module + ProgressStrategyRegistry.register( + MODULE_NAMES[MODULE_CONTEXTS.EXTENSIONS], + new PrimaryProcessStrategy(PROCESS_NAMES.EXTENSIONS_CREATE), + ); + + // Register strategy for Environments - uses default (no nested progress yet) + ProgressStrategyRegistry.register(MODULE_NAMES[MODULE_CONTEXTS.ENVIRONMENTS], new DefaultProgressStrategy()); + + // Register strategy for Locales - uses default (no nested progress yet) + ProgressStrategyRegistry.register( + MODULE_NAMES[MODULE_CONTEXTS.LOCALES], + new PrimaryProcessStrategy(PROCESS_NAMES.LOCALES_CREATE), + ); + + // Register strategy for Labels - uses default (no nested progress yet) + ProgressStrategyRegistry.register( + MODULE_NAMES[MODULE_CONTEXTS.LABELS], + new PrimaryProcessStrategy(PROCESS_NAMES.LABELS_CREATE), + ); + + // Register strategy for Webhooks - uses default (no nested progress yet) + ProgressStrategyRegistry.register(MODULE_NAMES[MODULE_CONTEXTS.WEBHOOKS], new DefaultProgressStrategy()); + + // Register strategy for Workflows - uses default (no nested progress yet) + ProgressStrategyRegistry.register( + MODULE_NAMES[MODULE_CONTEXTS.WORKFLOWS], + new PrimaryProcessStrategy(PROCESS_NAMES.WEBHOOKS_IMPORT), + ); + + // Register strategy for Custom Roles - uses default (no nested progress yet) + ProgressStrategyRegistry.register(MODULE_NAMES[MODULE_CONTEXTS.CUSTOM_ROLES], new DefaultProgressStrategy()); + + // Register strategy for Taxonomies - uses default (no nested progress yet) + ProgressStrategyRegistry.register(MODULE_NAMES[MODULE_CONTEXTS.TAXONOMIES], new DefaultProgressStrategy()); + + // Register strategy for Marketplace Apps - complex module with app installations + ProgressStrategyRegistry.register( + MODULE_NAMES[MODULE_CONTEXTS.MARKETPLACE_APPS], + new PrimaryProcessStrategy(PROCESS_NAMES.CREATE_APPS), + ); + + // Register strategy for Stack Settings - simple module + ProgressStrategyRegistry.register(MODULE_NAMES[MODULE_CONTEXTS.STACK], new DefaultProgressStrategy()); + + // Register strategy for Personalize - complex module with projects/experiences + ProgressStrategyRegistry.register( + MODULE_NAMES[MODULE_CONTEXTS.PERSONALIZE], + new CustomProgressStrategy((processes) => { + // For personalize import, count project imports as primary metric + const projectImport = processes.get(PROCESS_NAMES.PERSONALIZE_PROJECTS); + if (projectImport) { + return { + total: projectImport.total, + success: projectImport.successCount, + failures: projectImport.failureCount, + }; + } + + // Fallback to any other main process + const mainProcess = Array.from(processes.values())[0]; + if (mainProcess) { + return { + total: mainProcess.total, + success: mainProcess.successCount, + failures: mainProcess.failureCount, + }; + } + + return null; + }), + ); + // Register strategy for Variant Entries - sub-process of entries + ProgressStrategyRegistry.register(MODULE_NAMES[MODULE_CONTEXTS.VARIANT_ENTRIES], new DefaultProgressStrategy()); } catch (error) { // Silently ignore registration errors during module loading } diff --git a/packages/contentstack-import/test/unit/import/modules/locales.test.ts b/packages/contentstack-import/test/unit/import/modules/locales.test.ts index 5bc5e8f7f..0bdfd8e6d 100644 --- a/packages/contentstack-import/test/unit/import/modules/locales.test.ts +++ b/packages/contentstack-import/test/unit/import/modules/locales.test.ts @@ -62,7 +62,7 @@ describe('ImportLocales', () => { folderValidKeys: ['uid', 'name'], validKeys: ['uid', 'title'], }, - 'asset-management': { + 'cs-assets': { dirName: 'spaces', fieldsDir: 'fields', assetTypesDir: 'asset_types', diff --git a/packages/contentstack-import/test/unit/utils/extension-helper.test.ts b/packages/contentstack-import/test/unit/utils/extension-helper.test.ts index f99a8fd9a..522b1e3da 100644 --- a/packages/contentstack-import/test/unit/utils/extension-helper.test.ts +++ b/packages/contentstack-import/test/unit/utils/extension-helper.test.ts @@ -67,7 +67,7 @@ describe('Extension Helper', () => { folderValidKeys: ['uid', 'name'], validKeys: ['uid', 'title'], }, - 'asset-management': { + 'cs-assets': { dirName: 'spaces', fieldsDir: 'fields', assetTypesDir: 'asset_types',