diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index 35dc5c24c..1a5aa8150 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -25,7 +25,7 @@ jobs: - name: Prune pnpm store run: pnpm store prune - name: Install Dependencies - run: pnpm install --frozen-lockfile + run: pnpm install --no-frozen-lockfile - name: Build all plugins run: | diff --git a/.talismanrc b/.talismanrc index 3db7ed059..0ca99ad2b 100644 --- a/.talismanrc +++ b/.talismanrc @@ -1,8 +1,180 @@ fileignoreconfig: -- filename: packages/contentstack-bulk-operations/src/services/am-asset-service.ts - checksum: 5f6c0ecba74e27399a7079ca15e65e77ef692697093c9fb1d57213728c4fe985 -- filename: packages/contentstack-bulk-operations/src/utils/asset-uids-from-file.ts - checksum: 580932f192dd3fdd8bb2c55b7a7a78f1694f646ef5c5041f86c75668778f7ecb -- filename: packages/contentstack-bulk-operations/test/unit/utils/asset-uids-from-file.test.ts - checksum: 8123f7a675a0275795b59b15d0f2d5f8f1e57ccbecf3f97249a0dc5a037b9203 + - filename: packages/contentstack-bulk-operations/src/services/am-asset-service.ts + checksum: 5f6c0ecba74e27399a7079ca15e65e77ef692697093c9fb1d57213728c4fe985 + - filename: packages/contentstack-bulk-operations/src/utils/asset-uids-from-file.ts + checksum: 580932f192dd3fdd8bb2c55b7a7a78f1694f646ef5c5041f86c75668778f7ecb + - filename: packages/contentstack-bulk-operations/test/unit/utils/asset-uids-from-file.test.ts + checksum: 8123f7a675a0275795b59b15d0f2d5f8f1e57ccbecf3f97249a0dc5a037b9203 + - filename: packages/contentstack-migrate-rte/test/dummy/entriesResponse.json + checksum: 691f3dcfbbcf69fd21e109a0d7003bdb500af2d0253bb7d7e8a0636d8f2a58f4 + - filename: packages/contentstack-migrate-rte/test/dummy/expectedEntriesResponse.json + checksum: a2784a3cb21780434958478d478dcb91d2d9a3a8025567d90fe8d74e9141b052 + - filename: pnpm-lock.yaml + checksum: 14eba55779e1e2697caa1ee824fa0e52c3b9c5cf441f10097ae9fb8031f6a136 + - filename: packages/contentstack-content-type/tests/core/contentstack/client.test.ts + checksum: 5c4b952c5bee5c4e05825e24a7f953cd9ddebbe07e7dbae73e4e959730683988 + - filename: packages/contentstack-apps-cli/.eslintrc + checksum: 7c5c4f2835c74ab36bce038d78ccd8cf9895d30c5d7e12f5e7536a42134deefc + - filename: packages/contentstack-content-type/tests/utils/index.test.ts + checksum: ba3137f99bba3d430145088fabf560ec9324a3fe14699eb7eacf1a863243f4b9 + - filename: packages/contentstack-cli-tsgen/AGENTS.md + checksum: 7291676dc95b70ba0c4f0ead220b88355534682d4392aecd75609f1740df4be1 + - filename: packages/contentstack-bulk-operations/test/unit/utils/batch-queue-handler.test.ts + checksum: c91f1822b5cfd34a4f4ba05dfc56c10a66e0f5ddb55a1cf5b454fa9549ea0052 + - filename: packages/contentstack-apps-cli/README.md + checksum: 15d074e196a35b5bdfa095d125fb055b5377df138e5cfeadcf4c2371dde8a7ca + - filename: packages/contentstack-bulk-operations/test/unit/utils/bulk-operation-log-handler.test.ts + checksum: cec7ba35157c6516d67931d41deb57b7a156d9fc05dbab93ca5116e89b95c820 + - filename: packages/contentstack-migrate-rte/README.md + checksum: 971bfdd67d66ae565feab612978123a9956248b25439e8cea65e4fa7cbcb403f + - filename: packages/contentstack-content-type/skills/code-review/SKILL.md + checksum: e784c95e1efba37e79acc5d6187d26f25bea9228f9c28bbcac0dd9285c70381f + - filename: packages/contentstack-bulk-operations/test/unit/utils/client.test.ts + checksum: 178611b1f153b46a0020da22cc18293d5bd9c539ec2e54557fd8c1a3c2e796b3 + - filename: packages/contentstack-migrate-rte/src/commands/cm/entries/migrate-html-rte.js + checksum: 42f5322863e422f5b9c64f61116367fa825ea526bd198256a5ef296aac5b07a8 + - filename: packages/contentstack-apps-cli/src/commands/app/deploy.ts + checksum: f1d4ffe04e6d06c48d272085ab348c03260051a751af98ae458289cc5d0404d3 + - filename: packages/contentstack-bulk-operations/src/core/operation-executor.ts + checksum: 46295f495f007ad291787133936c5af3c76838d72f2be0de9c235bb644d6f905 + - filename: packages/contentstack-apps-cli/src/util/common-utils.ts + checksum: 0a64a332639c7788c95724c7a17313606d6dffdb2a889decaf4069149d8e37dc + - filename: packages/contentstack-content-type/skills/contentstack-cli-content-type/SKILL.md + checksum: f52be931ec23638c76b44652921c4b45dbca9edf558f05bf465f33bcadf20790 + - filename: packages/contentstack-cli-tsgen/skills/typescript-cli-tsgen/SKILL.md + checksum: 0434741d74f66edab28fbea1520a6a5d4d42e292cc014d3f9c804aa10809334b + - filename: packages/contentstack-bulk-operations/eslint.config.js + checksum: 82f8cf518eaf71c7463db4d4bbf62c77696c86242f711caf14963a9bf1e8e62d + - filename: packages/contentstack-content-type/src/commands/content-type/compare-remote.ts + checksum: c088b723b20cf1b07f29b498e13ffb6b76b5d382f014c515bd94ccb2d7606a11 + - filename: packages/contentstack-bulk-operations/test/unit/utils/revert-retry-handler.test.ts + checksum: 078f9633edb53204ed14ebe3cf6b1d6063729dd37b7ee1c6e936a344ceabebda + - filename: packages/contentstack-content-type/src/commands/content-type/details.ts + checksum: a68adade9137360b6d68917360e4bec05a5ca3755148225f8b4bf1357cc086b0 + - filename: packages/contentstack-apps-cli/test/unit/commands/app/update.test.ts + checksum: c2f4dd0644d16f97727d095259a90785729bb20d63d2b95114ebb1b70300a69f + - filename: packages/contentstack-migrate-rte/src/lib/util/index.js + checksum: 47a154b83045535af878888d618d8e1d42d7b128318a361e03be881cb0d71c6e + - filename: packages/contentstack-content-type/src/commands/content-type/list.ts + checksum: cb9876105f347a815919f772db9c9b9bf4cdfe5e1b9946c7b5c94d98d6254213 + - filename: packages/contentstack-apps-cli/test/unit/util/inquirer.test.ts + checksum: 13d9c0a3bbeb4fa3b87579a43b4387819faab1d8ae4ba4cb649ae7cddc8b2c05 + - filename: packages/contentstack-bulk-operations/test/unit/messages/index.test.ts + checksum: e86e76db4f4afc899ae2a4742627a71a7d227a7139014361b9d83de6154b3c7a + - filename: packages/contentstack-content-type/src/utils/index.ts + checksum: 3209ee03042b33b491443bd2aabd273125eb1808607c9ef0b231323f2616092e + - filename: packages/contentstack-bulk-operations/src/messages/index.ts + checksum: 1bfd1aea476488a450271d6df13ba56f5ec36576bd99ccab3774fed844baed1f + - filename: packages/contentstack-content-type/src/core/command.ts + checksum: ee30e78b945495baa9d064c96feee454ec73607420b8a3b1da2ecc3be4c9a85d + - filename: packages/contentstack-content-type/tests/commands/content-type/list.test.ts + checksum: 7e001903e10d7c205a238241f069a203286f722b62d384befd1204a364eab7f9 + - filename: packages/contentstack-bulk-operations/test/unit/core/operation-executor.test.ts + checksum: 97f0ddd4d547f37a8d93650aa1e8af4ef4dbce343dd51853e34bbde6107cd725 + - filename: packages/contentstack-content-type/.eslintrc + checksum: 6a5fa2bef65bf5a62598c10d45d83dfdef2dc32675aca5827ef31c230fa29c97 + - filename: packages/contentstack-content-type/src/commands/content-type/diagram.ts + checksum: d6afdfc71b9bf66137a724fbce68ac841b3af053dc818f1271b6412b5c7863ec + - filename: packages/contentstack-bulk-operations/test/unit/commands/bulk-assets.test.ts + checksum: c099c628c7ae1a40a9ca5580de0afa8309a611b2dff7837b10bb8f70eb92f8b3 + - filename: packages/contentstack-cli-cm-regex-validate/src/utils/connect-stack.ts + checksum: 2b0d9cc73a8f568ca52a8aac06be1116ad6ea90908d3880984a354ac55039c82 + - filename: packages/contentstack-cli-cm-regex-validate/messages/index.json + checksum: 044b311bde624dcc3c12434174d6027dbb6b62eefdfae120570a1748f806c60c + - filename: packages/contentstack-bulk-operations/test/unit/utils/taxonomy-interactive-select.test.ts + checksum: 34a085702d01d7e16e1507ea1e434b374c2cba5dd884aad5996c5484412897c0 + - filename: packages/contentstack-bulk-operations/test/unit/utils/interactive.test.ts + checksum: 3ee0ff5a74929346bfe997aeb977b4e93d398ea63892efc5f85e0b51a21074f6 + - filename: packages/contentstack-content-type/skills/testing/SKILL.md + checksum: 1da781909a238a7e96dea43ed74ca97cd405e10d6a95dd2042a5280a7a9172f8 + - filename: packages/contentstack-cli-cm-regex-validate/skills/code-review/SKILL.md + checksum: 17431609f7d91acb67930ec6c405bdea670ad0ac2b96b39c2873241c5d8e4fb7 + - filename: packages/contentstack-bulk-operations/test/unit/base-bulk-command.test.ts + checksum: 18684a596707865e671f1ee57b4819cb3f4b4f2633d6c49f7f4b6ce09391359f + - filename: packages/contentstack-bulk-operations/test/unit/core/index.test.ts + checksum: 0d789258f5a9664e8a7dc5f5b23da846d0eaf8c52638ff20fb1f26104d3f9f8d + - filename: packages/contentstack-bulk-operations/test/unit/utils/validators.test.ts + checksum: 69cf394584e325b972d6825879de7c31b9dd1bd50b0bb057aecb739258ac0317 + - filename: packages/contentstack-content-type/tests/commands/content-type/compare-remote.test.ts + checksum: e6bb377c26e531cb8c61ae278cc99060e35e8f88e5ffab221d92e343aab44c52 + - filename: packages/contentstack-content-type/tests/core/command.test.ts + checksum: 65b8a60273110303467ce56438370f24d4803301c86fe1823c33233c523795d3 + - filename: packages/contentstack-cli-cm-regex-validate/skills/dev-workflow/SKILL.md + checksum: 23e1148c3287b8c67f43f15063e8dfff9a1521d374e400d048914b88279a15cc + - filename: packages/contentstack-bulk-operations/test/unit/commands/bulk-entries.test.ts + checksum: 845512e660813a6d7d96efd89dcff6eba4591a3f9ff371dc9b1aad38921e18a6 + - filename: packages/contentstack-content-type/src/commands/content-type/audit.ts + checksum: bd572809a575be54dc479e21d811e8b942f44f90ba35a2ecf2e8794468afef27 + - filename: packages/contentstack-cli-cm-regex-validate/skills/contentstack-cli/SKILL.md + checksum: 9420a516ba6046b05748683c90e3817d091cef76c46e029cb3745d6c0c350838 + - filename: packages/contentstack-bulk-operations/test/unit/services/index.test.ts + checksum: aae62ba072551bedf869ec7b1f6bf90238bc039336f37e7c583da8ba0637f9be + - filename: packages/contentstack-bulk-operations/src/utils/batch-queue-handler.ts + checksum: d88571fe3217baebb6abd3c6a4ffbee1d4abd3c7220a414964f44e3e25bf8044 + - filename: packages/contentstack-bulk-operations/test/unit/utils/config-builder.test.ts + checksum: d46757d3bb98d76845e83d4585f269b62b1fa9cb5bee3215b88fed38fd1dbb53 + - filename: packages/contentstack-bulk-operations/src/utils/bulk-publish-url-generator.ts + checksum: 052d811adb5da9bac8c70e5b3dc4ddf700d5aea274dd2aa90a2df374118fbd26 + - filename: packages/contentstack-bulk-operations/test/unit/utils/operation-confirmation.test.ts + checksum: 043185e56361ffae2116a2af5a4da16986816ad054fd94f189269e5b6150609e + - filename: packages/contentstack-content-type/tests/core/content-type/diagram.test.ts + checksum: 75b5882e09a2f9f21d12236c8c64ed0d09bcbe9ff4a65f76b4b9f9b63b1a130c + - filename: packages/contentstack-cli-cm-regex-validate/test/utils/connect-stack.test.ts + checksum: 1bfbd51850d013e4bb79ec62bd1abe450b65ccf31d6722010b234a7c0e5e17fc + - filename: packages/contentstack-bulk-operations/test/unit/services/taxonomy-service.test.ts + checksum: 33af8ee198158dd92916d76207e172b5316864d063a6929526ca259b459ec79a + - filename: packages/contentstack-bulk-operations/src/utils/config-builder.ts + checksum: a7b5259ad719b8c5929f9fea3783bdc92610dc2549426204c1bb6813e7e1112a + - filename: packages/contentstack-apps-cli/src/util/inquirer.ts + checksum: 7f593b91cf5965b40c63fa1edc7b73330735f343350cb987c08f1208007e9f4b + - filename: packages/contentstack-bulk-operations/src/utils/interactive.ts + checksum: ba4fdd6f17c7d43cae639158f82dea3065ba8a368ddce8c476bfe49a6945e5c1 + - filename: packages/contentstack-bulk-operations/src/utils/client.ts + checksum: efdada21291db6d66e3114b7408163dee4cafe6ddb3904f02aa67140a1a89bb6 + - filename: packages/contentstack-migrate-rte/test/commands/json-migration.test.js + checksum: 56e10f1e0d2794fa13bcf5a6bb3e868b28277df1762fb3df0a8a82ad44f8045b + - filename: packages/contentstack-migrate-rte/test/utils/index.js + checksum: bc2a509a86174aecbaf0bfc44d6ad3afabe57ef871ec91b796d498e00177e3f0 + - filename: packages/contentstack-apps-cli/test/unit/commands/app/create.test.ts + checksum: e3ab7efb35b7adebccf34c62bfb91517d560d0934b5429a3e8fd4274f9b87b97 + - filename: packages/contentstack-apps-cli/test/unit/commands/app/get.test.ts + checksum: 2fea666f0e10686369f313c84ead1248ab69122862891abdafd501fc3dacdcd5 + - filename: packages/contentstack-apps-cli/test/unit/commands/app/install.test.ts + checksum: 676adb64afae28104be457e1027a2e658955798c32e745b58c5460d3f52ce595 + - filename: packages/contentstack-apps-cli/test/unit/helpers/auth-stub-helper.ts + checksum: 0c70166b1131e06af8ce84de030ac3dc32ce0e4ce1059c30804cbfa5b9724944 + - filename: packages/contentstack-apps-cli/test/unit/mock/common.mock.json + checksum: 24a36892824e71de353155d3f1b840e923cbb61e6f200528327bc6b00e07c795 + - filename: packages/contentstack-apps-cli/test/unit/commands/app/reinstall.test.ts + checksum: 59bb0608a3b82e4c7cb7d3e6e11b920705b63979d79f644aa6ba1f133df639b6 + - filename: packages/contentstack-asset-management/src/utils/cs-assets-api-adapter.ts + checksum: 00f7d532e4878d20fea2ce7faac50f30976785f7dce79beb93811abd46455ad3 + - filename: packages/contentstack-apps-cli/src/commands/app/reinstall.ts + checksum: 9759d7430179211d23843e53bd8ad26a70082152a97f1d8a9c7b2fc1e7cdf459 + - filename: packages/contentstack-content-type/src/commands/content-type/compare.ts + checksum: e8dc5f854d56f3a4052bb1326fe4cff9f06fa7eb17a62b21955729196ff8c906 + - filename: packages/contentstack-bulk-operations/src/core/rate-limiter.ts + checksum: 81e3d624166ab34a589e3e8527b9e57ebc7e7f4374efd0483b1df0dd11788b68 + - filename: packages/contentstack-seed/README.md + checksum: ee6667dc5ce3a11517663ed19c090cac9ddfadf562a117b1f165220eb61cdc2b + - filename: packages/contentstack-cli-tsgen/src/lib/helper.ts + checksum: a7ead0030ead9d15b6b6e9623f61e7def77b00325e3988f0e3d73a145180dedc + - filename: packages/contentstack-bulk-operations/README.md + checksum: 08ce31ed44af9b8b4c1ee054514198ec3533f713b59e7eaffd06d737c17cc867 + - filename: packages/contentstack-cli-tsgen/src/commands/tsgen.ts + checksum: 054ea78f765edca62c785714cf8962df4fb91529c0851439d1ed61e963467408 + - filename: packages/contentstack-bulk-operations/src/utils/revert-retry-handler.ts + checksum: 76899098d74de1dd20f1b08401c65f23b2bec584c051388e63f70f3d24a6d1a4 + - filename: packages/contentstack-apps-cli/src/messages/index.ts + checksum: 14e875e46133362a2c64ba43dc3f16fe25e7874b7f76b5121cde40c5bc983947 + - filename: packages/contentstack-apps-cli/src/commands/app/install.ts + checksum: d4b9d0833fc6488584fd75d4b79b3c114289fe9fa11531206558ac24d600fa75 + - filename: packages/contentstack-bulk-operations/src/base-bulk-command.ts + checksum: 1c69168aa142879f78c3cb56e0af14fcac8c4362b21d78206643460cb2314a44 + - filename: skills/framework/SKILL.md + checksum: c5746de64b1e7d1df051c4337de5eb32de6a4c85c7297aa408838d304bb2d771 + - filename: packages/contentstack-bulk-operations/src/interfaces/index.ts + checksum: c24acda784c64a672b6deece07510c86cfe0f647f758055d6f49a36b1220efe7 + - filename: packages/contentstack-content-type/README.md + checksum: 61726431e81915759681be79faaf08db4514d4c029abea01c7b2e27c63076433 version: '1.0' diff --git a/packages/contentstack-apps-cli/package.json b/packages/contentstack-apps-cli/package.json index 92423f343..76c7aa329 100644 --- a/packages/contentstack-apps-cli/package.json +++ b/packages/contentstack-apps-cli/package.json @@ -22,9 +22,9 @@ ], "dependencies": { "@apollo/client": "^3.14.1", - "@contentstack/cli-command": "~2.0.0-beta.7", + "@contentstack/cli-command": "~2.0.0-beta.8", "@contentstack/cli-launch": "^1.9.9", - "@contentstack/cli-utilities": "~2.0.0-beta.8", + "@contentstack/cli-utilities": "~2.0.0-beta.9", "adm-zip": "^0.5.17", "chalk": "^5.6.2", "lodash": "^4.18.1", @@ -110,4 +110,4 @@ "app:deploy": "APDP" } } -} \ No newline at end of file +} diff --git a/packages/contentstack-asset-management/package.json b/packages/contentstack-asset-management/package.json index 30f18c3ec..b6dccd0bc 100644 --- a/packages/contentstack-asset-management/package.json +++ b/packages/contentstack-asset-management/package.json @@ -30,7 +30,7 @@ ], "license": "MIT", "dependencies": { - "@contentstack/cli-utilities": "~2.0.0-beta.8" + "@contentstack/cli-utilities": "~2.0.0-beta.9" }, "oclif": { "commands": "./lib/commands", diff --git a/packages/contentstack-asset-management/src/index.ts b/packages/contentstack-asset-management/src/index.ts index b8b2252d6..d2a9b823a 100644 --- a/packages/contentstack-asset-management/src/index.ts +++ b/packages/contentstack-asset-management/src/index.ts @@ -3,4 +3,5 @@ export * from './types'; export * from './utils'; export * from './export'; export * from './import'; +export * from './query-export'; export * from './import-setup'; diff --git a/packages/contentstack-asset-management/src/query-export/cs-assets-query-exporter.ts b/packages/contentstack-asset-management/src/query-export/cs-assets-query-exporter.ts new file mode 100644 index 000000000..9e50ae94b --- /dev/null +++ b/packages/contentstack-asset-management/src/query-export/cs-assets-query-exporter.ts @@ -0,0 +1,246 @@ +import { resolve as pResolve } from 'node:path'; +import { mkdir, writeFile } from 'node:fs/promises'; +import { Readable } from 'node:stream'; +import { log, handleAndLogError, configHandler } from '@contentstack/cli-utilities'; + +import type { CsAssetsQueryExportOptions, CSAssetsAPIConfig, LinkedWorkspace } from '../types/cs-assets-api'; +import type { ExportContext } from '../types/export-types'; +import ExportAssetTypes from '../export/asset-types'; +import ExportFields from '../export/fields'; +import { CSAssetsExportAdapter } from '../export/base'; +import { getAssetItems, writeStreamToFile } from '../utils/export-helpers'; +import { runInBatches } from '../utils/concurrent-batch'; + +const DEFAULT_ASSET_BATCH_SIZE = 100; +const SEARCH_PAGE_LIMIT = 100; + +/** + * Query-based Contentstack Assets exporter. + * Exports only referenced asset UIDs from entries into the `spaces/` directory layout. + */ +export class CsAssetsQueryExporter { + private readonly options: CsAssetsQueryExportOptions; + + constructor(options: CsAssetsQueryExportOptions) { + this.options = options; + } + + async export(assetUIDs: string[]): Promise { + const { linkedWorkspaces, exportDir, context } = this.options; + + if (!assetUIDs.length) { + log.info('No asset UIDs to export for Contentstack Assets query export', context); + return; + } + + if (!linkedWorkspaces.length) { + log.warn('No linked workspaces configured for Contentstack Assets query export', context); + return; + } + + log.info( + `Starting Contentstack Assets query export (${assetUIDs.length} UID(s), ${linkedWorkspaces.length} space(s))`, + context, + ); + + const spacesRootPath = pResolve(exportDir, 'spaces'); + await mkdir(spacesRootPath, { recursive: true }); + + const apiConfig: CSAssetsAPIConfig = { + baseURL: this.options.csAssetsUrl, + headers: { organization_uid: this.options.org_uid }, + context, + }; + + const exportContext: ExportContext = { + spacesRootPath, + context, + securedAssets: this.options.securedAssets, + chunkFileSizeMb: this.options.chunkFileSizeMb, + apiConcurrency: this.options.apiConcurrency, + downloadAssetsConcurrency: this.options.downloadAssetsConcurrency, + }; + + const batchSize = this.options.assetBatchSize ?? DEFAULT_ASSET_BATCH_SIZE; + + try { + await this.bootstrapSharedModules(apiConfig, exportContext, linkedWorkspaces[0].space_uid); + + for (const workspace of linkedWorkspaces) { + try { + await this.exportWorkspaceAssets(apiConfig, exportContext, workspace, assetUIDs, batchSize); + } catch (err) { + handleAndLogError( + err, + { ...(context as Record), spaceUid: workspace.space_uid }, + `Failed Contentstack Assets query export for space ${workspace.space_uid}`, + ); + } + } + + log.success('Contentstack Assets query export completed', context); + } catch (err) { + handleAndLogError(err, context as Record, 'Contentstack Assets query export failed'); + throw err; + } + } + + private async bootstrapSharedModules( + apiConfig: CSAssetsAPIConfig, + exportContext: ExportContext, + firstSpaceUid: string, + ): Promise { + const sharedFieldsDir = pResolve(exportContext.spacesRootPath, 'fields'); + const sharedAssetTypesDir = pResolve(exportContext.spacesRootPath, 'asset_types'); + await mkdir(sharedFieldsDir, { recursive: true }); + await mkdir(sharedAssetTypesDir, { recursive: true }); + + const exportAssetTypes = new ExportAssetTypes(apiConfig, exportContext); + const exportFields = new ExportFields(apiConfig, exportContext); + await Promise.all([exportAssetTypes.start(firstSpaceUid), exportFields.start(firstSpaceUid)]); + } + + private async exportWorkspaceAssets( + apiConfig: CSAssetsAPIConfig, + exportContext: ExportContext, + workspace: LinkedWorkspace, + assetUIDs: string[], + batchSize: number, + ): Promise { + const { branchName, context } = this.options; + const workspaceExporter = new QueryExportWorkspaceAdapter(apiConfig, exportContext); + await workspaceExporter.start(workspace, assetUIDs, branchName || 'main', batchSize); + log.debug(`Contentstack Assets query export finished for space ${workspace.space_uid}`, context); + } +} + +/** + * Per-space export: search by UID, write metadata/files, download binaries. + */ +class QueryExportWorkspaceAdapter extends CSAssetsExportAdapter { + async start( + workspace: LinkedWorkspace, + assetUIDs: string[], + branchName: string, + uidBatchSize: number, + ): Promise { + await this.init(); + + const spaceDir = pResolve(this.exportContext.spacesRootPath, workspace.space_uid); + await mkdir(spaceDir, { recursive: true }); + + const spaceResponse = await this.getSpace(workspace.space_uid); + const space = spaceResponse.space; + const metadata = { + ...space, + workspace_uid: workspace.uid, + is_default: workspace.is_default, + branch: branchName, + }; + await writeFile(pResolve(spaceDir, 'metadata.json'), JSON.stringify(metadata, null, 2)); + + const assetsDir = pResolve(spaceDir, 'assets'); + await mkdir(assetsDir, { recursive: true }); + + const spaceRef = { space_uid: workspace.space_uid, workspace: workspace.uid }; + const assetItems = await this.searchAllAssets(assetUIDs, spaceRef, uidBatchSize); + + const folders = assetItems.filter((item) => (item as { is_dir?: boolean }).is_dir === true); + const files = assetItems.filter((item) => (item as { is_dir?: boolean }).is_dir !== true); + + await writeFile(pResolve(assetsDir, 'folders.json'), JSON.stringify(folders, null, 2)); + + await this.writeItemsToChunkedJson( + assetsDir, + 'assets.json', + 'assets', + ['uid', 'url', 'filename', 'file_name', 'parent_uid'], + files, + ); + + await this.downloadAssets(files, assetsDir, workspace.space_uid); + } + + private async searchAllAssets( + assetUIDs: string[], + spaceRef: { space_uid: string; workspace: string }, + uidBatchSize: number, + ): Promise>> { + const seen = new Set(); + const results: Array> = []; + + for (let i = 0; i < assetUIDs.length; i += uidBatchSize) { + const uidBatch = assetUIDs.slice(i, i + uidBatchSize); + let skip = 0; + let pageItems: unknown[]; + + do { + const response = await this.searchAssets({ + assetUIDs: uidBatch, + spaces: [spaceRef], + skip, + limit: SEARCH_PAGE_LIMIT, + }); + pageItems = getAssetItems(response); + + if (pageItems.length === 0 && skip === 0) { + log.warn( + `Search returned 0 assets in space ${spaceRef.space_uid} for UID(s): [${uidBatch.join(', ')}]`, + this.exportContext.context, + ); + } + + for (const item of pageItems) { + const record = item as Record; + const key = String(record.uid ?? record.asset_id ?? record._uid ?? ''); + if (key && !seen.has(key)) { + seen.add(key); + results.push(record); + } + } + + skip += pageItems.length; + } while (pageItems.length === SEARCH_PAGE_LIMIT); + } + + return results; + } + + private async downloadAssets( + items: Array>, + assetsDir: string, + spaceUid: string, + ): Promise { + const downloadable = items.filter((asset) => Boolean(asset.url && (asset.uid ?? asset._uid))); + if (downloadable.length === 0) { + log.debug(`No downloadable assets for space ${spaceUid}`, this.exportContext.context); + return; + } + + const filesDir = pResolve(assetsDir, 'files'); + await mkdir(filesDir, { recursive: true }); + + const securedAssets = this.exportContext.securedAssets ?? false; + const authtoken = securedAssets ? configHandler.get('authtoken') : null; + + await runInBatches(downloadable, this.downloadAssetsBatchConcurrency, async (asset) => { + const uid = String(asset.uid ?? asset._uid); + const url = String(asset.url); + const filename = String(asset.filename ?? asset.file_name ?? 'asset'); + try { + const separator = url.includes('?') ? '&' : '?'; + const downloadUrl = securedAssets && authtoken ? `${url}${separator}authtoken=${authtoken}` : url; + const response = await fetch(downloadUrl); + if (!response.ok) throw new Error(`HTTP ${response.status}`); + const body = response.body; + if (!body) throw new Error('No response body'); + const nodeStream = Readable.fromWeb(body as Parameters[0]); + const assetFolderPath = pResolve(filesDir, uid); + await mkdir(assetFolderPath, { recursive: true }); + await writeStreamToFile(nodeStream, pResolve(assetFolderPath, filename)); + } catch (e) { + log.debug(`Failed to download asset ${uid} in space ${spaceUid}: ${e}`, this.exportContext.context); + } + }); + } +} diff --git a/packages/contentstack-asset-management/src/query-export/index.ts b/packages/contentstack-asset-management/src/query-export/index.ts new file mode 100644 index 000000000..a46638b88 --- /dev/null +++ b/packages/contentstack-asset-management/src/query-export/index.ts @@ -0,0 +1 @@ +export { CsAssetsQueryExporter } from './cs-assets-query-exporter'; diff --git a/packages/contentstack-asset-management/src/types/cs-assets-api.ts b/packages/contentstack-asset-management/src/types/cs-assets-api.ts index 7f7eb7f42..96dbac1bd 100644 --- a/packages/contentstack-asset-management/src/types/cs-assets-api.ts +++ b/packages/contentstack-asset-management/src/types/cs-assets-api.ts @@ -141,6 +141,30 @@ export type BulkMoveAssetsResponse = { * Adapter interface for Contentstack Assets API calls. * Used by export and (future) import. */ +/** Space + workspace pair for Contentstack Assets search API. */ +export type SearchSpaceRef = { + space_uid: string; + workspace: string; +}; + +/** Parameters for POST /api/search (asset query export). */ +export type SearchAssetsParams = { + assetUIDs: string[]; + spaces: SearchSpaceRef[]; + skip?: number; + limit?: number; +}; + +/** Response shape from POST /api/search for assets. */ +export type SearchAssetsResponse = { + count?: number; + relation?: string; + assets?: unknown[]; + items?: unknown[]; + results?: unknown[]; + folders?: unknown[]; +}; + export interface ICSAssetsAdapter { init(): Promise; listSpaces(): Promise; @@ -149,6 +173,7 @@ export interface ICSAssetsAdapter { getWorkspaceAssets(spaceUid: string, workspaceUid?: string): Promise; getWorkspaceFolders(spaceUid: string, workspaceUid?: string): Promise; getWorkspaceAssetTypes(spaceUid: string): Promise; + searchAssets(params: SearchAssetsParams): Promise; bulkDeleteAssets( spaceUid: string, workspaceUid: string | undefined, @@ -161,6 +186,23 @@ export interface ICSAssetsAdapter { ): Promise; } +/** Options for query-based Contentstack Assets export (referenced assets from entries). */ +export type CsAssetsQueryExportOptions = { + linkedWorkspaces: LinkedWorkspace[]; + exportDir: string; + branchName: string; + csAssetsUrl: string; + org_uid: string; + apiKey?: string; + context?: Record; + securedAssets?: boolean; + chunkFileSizeMb?: number; + apiConcurrency?: number; + downloadAssetsConcurrency?: number; + /** Max UIDs per search request ($in batch). */ + assetBatchSize?: number; +}; + /** * Options for exporting space structure (used by export app after fetching linked workspaces). */ diff --git a/packages/contentstack-asset-management/src/utils/cs-assets-api-adapter.ts b/packages/contentstack-asset-management/src/utils/cs-assets-api-adapter.ts index 5a8384f89..f76fa4106 100644 --- a/packages/contentstack-asset-management/src/utils/cs-assets-api-adapter.ts +++ b/packages/contentstack-asset-management/src/utils/cs-assets-api-adapter.ts @@ -16,11 +16,41 @@ import type { CreateSpacePayload, FieldsResponse, ICSAssetsAdapter, + SearchAssetsParams, + SearchAssetsResponse, Space, SpaceResponse, SpacesListResponse, } from '../types/cs-assets-api'; +/** Default fields requested from POST /api/search for asset export. */ +export const DEFAULT_SEARCH_ASSET_FIELDS = [ + 'asset_id', + 'uid', + 'title', + 'file_name', + 'description', + 'parent_uid', + 'is_dir', + 'dimensions', + 'file_size', + 'content_type', + 'asset_type', + 'url', + 'tags', + 'created_at', + 'updated_at', + 'created_by', + 'updated_by', + 'path', + 'locale', + 'space_uid', + 'version', + 'publish_details', + 'ACL', + '_asset_scan_status', +] as const; + export class CSAssetsAdapter implements ICSAssetsAdapter { private readonly config: CSAssetsAPIConfig; private readonly apiClient: HttpClient; @@ -227,6 +257,36 @@ export class CSAssetsAdapter implements ICSAssetsAdapter { return result; } + /** + * POST /api/search — query assets by UID within linked spaces (Contentstack Assets query export). + */ + async searchAssets(params: SearchAssetsParams): Promise { + await this.init(); + const { assetUIDs, spaces, skip = 0, limit = 50 } = params; + if (!assetUIDs.length) { + return { count: 0, assets: [] }; + } + const body = { + query: { + $and: [{ uid: { $in: assetUIDs } }], + }, + skip, + limit, + desc: 'updated_at', + search_text: '', + search_field: 'all', + object_type: 'asset', + search_terms_operator: 'or', + fields: [...DEFAULT_SEARCH_ASSET_FIELDS], + spaces, + }; + log.debug( + `Searching assets (skip=${skip}, limit=${limit}, uids=${assetUIDs.length}, spaces=${spaces.length})`, + this.config.context, + ); + return this.postJson('/api/search', body); + } + // --------------------------------------------------------------------------- // POST helpers // --------------------------------------------------------------------------- diff --git a/packages/contentstack-asset-management/src/utils/export-helpers.ts b/packages/contentstack-asset-management/src/utils/export-helpers.ts index 9bc772c0f..252b33652 100644 --- a/packages/contentstack-asset-management/src/utils/export-helpers.ts +++ b/packages/contentstack-asset-management/src/utils/export-helpers.ts @@ -14,7 +14,7 @@ export function getAssetItems( ): Array<{ uid?: string; _uid?: string; url?: string; filename?: string; file_name?: string }> { if (Array.isArray(assetsData)) return assetsData; const data = assetsData as Record; - const items = data?.items ?? data?.assets; + const items = data?.items ?? data?.assets ?? data?.results; return Array.isArray(items) ? items : []; } diff --git a/packages/contentstack-asset-management/test/unit/import-setup/import-setup-asset-mappers.test.ts b/packages/contentstack-asset-management/test/unit/import-setup/import-setup-asset-mappers.test.ts index 936a6a344..b2b74383f 100644 --- a/packages/contentstack-asset-management/test/unit/import-setup/import-setup-asset-mappers.test.ts +++ b/packages/contentstack-asset-management/test/unit/import-setup/import-setup-asset-mappers.test.ts @@ -3,7 +3,7 @@ import * as fs from 'fs'; import * as os from 'os'; import * as path from 'path'; import { stub, restore } from 'sinon'; -import { AssetManagementAdapter } from '../../../src/utils/asset-management-api-adapter'; +import { CSAssetsAdapter } from '../../../src/utils/cs-assets-api-adapter'; import ImportAssets from '../../../src/import/assets'; import ImportSetupAssetMappers from '../../../src/import-setup/import-setup-asset-mappers'; @@ -77,8 +77,8 @@ describe('ImportSetupAssetMappers', () => { fs.mkdirSync(path.join(contentDir, 'spaces', 'amspace01'), { recursive: true }); fs.mkdirSync(backupDir, { recursive: true }); - stub(AssetManagementAdapter.prototype, 'init').resolves(); - stub(AssetManagementAdapter.prototype, 'listSpaces').resolves({ + stub(CSAssetsAdapter.prototype, 'init').resolves(); + stub(CSAssetsAdapter.prototype, 'listSpaces').resolves({ spaces: [{ uid: 'amspace01' }], }); stub(ImportAssets.prototype, 'buildIdentityMappersFromExport').resolves({ @@ -133,8 +133,8 @@ describe('ImportSetupAssetMappers', () => { fs.mkdirSync(path.join(contentDir, 'spaces', 'amspace01'), { recursive: true }); fs.mkdirSync(backupDir, { recursive: true }); - stub(AssetManagementAdapter.prototype, 'init').resolves(); - stub(AssetManagementAdapter.prototype, 'listSpaces').resolves({ spaces: [] }); + stub(CSAssetsAdapter.prototype, 'init').resolves(); + stub(CSAssetsAdapter.prototype, 'listSpaces').resolves({ spaces: [] }); const buildStub = stub(ImportAssets.prototype, 'buildIdentityMappersFromExport').resolves({ uidMap: {}, @@ -176,8 +176,8 @@ describe('ImportSetupAssetMappers', () => { fs.mkdirSync(path.join(contentDir, 'custom_spaces', 'amspace99'), { recursive: true }); fs.mkdirSync(backupDir, { recursive: true }); - stub(AssetManagementAdapter.prototype, 'init').resolves(); - stub(AssetManagementAdapter.prototype, 'listSpaces').resolves({ + stub(CSAssetsAdapter.prototype, 'init').resolves(); + stub(CSAssetsAdapter.prototype, 'listSpaces').resolves({ spaces: [{ uid: 'amspace99' }], }); @@ -231,8 +231,8 @@ describe('ImportSetupAssetMappers', () => { fs.mkdirSync(path.join(contentDir, 'spaces', 'amX'), { recursive: true }); fs.mkdirSync(backupDir, { recursive: true }); - stub(AssetManagementAdapter.prototype, 'init').resolves(); - stub(AssetManagementAdapter.prototype, 'listSpaces').resolves({ spaces: [{ uid: 'amX' }] }); + stub(CSAssetsAdapter.prototype, 'init').resolves(); + stub(CSAssetsAdapter.prototype, 'listSpaces').resolves({ spaces: [{ uid: 'amX' }] }); stub(ImportAssets.prototype, 'buildIdentityMappersFromExport').callsFake(async function fetchConcCheck( this: ImportAssets, diff --git a/packages/contentstack-asset-management/test/unit/query-export/cs-assets-query-exporter.test.ts b/packages/contentstack-asset-management/test/unit/query-export/cs-assets-query-exporter.test.ts new file mode 100644 index 000000000..7d5af5090 --- /dev/null +++ b/packages/contentstack-asset-management/test/unit/query-export/cs-assets-query-exporter.test.ts @@ -0,0 +1,158 @@ +import { expect } from 'chai'; +import sinon from 'sinon'; +import * as fs from 'node:fs/promises'; +import { resolve as pResolve } from 'node:path'; +import { tmpdir } from 'node:os'; +import { HttpClient, authenticationHandler } from '@contentstack/cli-utilities'; + +import { CsAssetsQueryExporter } from '../../../src/query-export/cs-assets-query-exporter'; +import ExportAssetTypes from '../../../src/export/asset-types'; +import ExportFields from '../../../src/export/fields'; +import { CSAssetsExportAdapter } from '../../../src/export/base'; +import { CSAssetsAdapter } from '../../../src/utils/cs-assets-api-adapter'; +import * as concurrentBatch from '../../../src/utils/concurrent-batch'; + +import type { CsAssetsQueryExportOptions } from '../../../src/types/cs-assets-api'; + +describe('CsAssetsQueryExporter', () => { + let exportDir: string; + let searchAssetsStub: sinon.SinonStub; + const baseOptions: CsAssetsQueryExportOptions = { + linkedWorkspaces: [{ uid: 'main', space_uid: 'space-1', is_default: true }], + exportDir: '', + branchName: 'main', + csAssetsUrl: 'https://am.example.com', + org_uid: 'org-1', + context: { command: 'export-query' }, + assetBatchSize: 2, + }; + + beforeEach(async () => { + exportDir = await fs.mkdtemp(pResolve(tmpdir(), 'cs-assets-query-export-')); + baseOptions.exportDir = exportDir; + + sinon.stub(ExportFields.prototype, 'start').resolves(); + sinon.stub(ExportAssetTypes.prototype, 'start').resolves(); + sinon.stub(CSAssetsExportAdapter.prototype, 'init').resolves(); + sinon.stub(CSAssetsExportAdapter.prototype, 'getSpace').resolves({ + space: { uid: 'space-1', title: 'Test Space' }, + }); + searchAssetsStub = sinon.stub(CSAssetsExportAdapter.prototype, 'searchAssets').resolves({ + count: 2, + relation: 'eq', + results: [ + { uid: 'asset-1', url: 'https://cdn.example.com/a1.png', file_name: 'a1.png', is_dir: false }, + { uid: 'asset-2', url: 'https://cdn.example.com/a2.png', file_name: 'a2.png', is_dir: false }, + ], + }); + sinon.stub(CSAssetsExportAdapter.prototype as any, 'writeItemsToChunkedJson').resolves(); + sinon.stub(concurrentBatch, 'runInBatches').callsFake(async (items, _concurrency, handler) => { + for (let i = 0; i < items.length; i++) { + await handler(items[i], i); + } + }); + }); + + afterEach(() => { + sinon.restore(); + }); + + it('should return early when no asset UIDs are provided', async () => { + const exporter = new CsAssetsQueryExporter(baseOptions); + await exporter.export([]); + + expect((ExportFields.prototype.start as sinon.SinonStub).called).to.be.false; + }); + + it('should bootstrap shared fields and asset types', async () => { + const exporter = new CsAssetsQueryExporter(baseOptions); + await exporter.export(['asset-1']); + + expect((ExportFields.prototype.start as sinon.SinonStub).calledOnceWith('space-1')).to.be.true; + expect((ExportAssetTypes.prototype.start as sinon.SinonStub).calledOnceWith('space-1')).to.be.true; + }); + + it('should call searchAssets with batched UIDs and space reference', async () => { + const exporter = new CsAssetsQueryExporter(baseOptions); + await exporter.export(['asset-1', 'asset-2', 'asset-3']); + + expect(searchAssetsStub.called).to.be.true; + const firstCall = searchAssetsStub.getCall(0).args[0]; + expect(firstCall.spaces).to.deep.equal([{ space_uid: 'space-1', workspace: 'main' }]); + expect(firstCall.assetUIDs).to.deep.equal(['asset-1', 'asset-2']); + }); + + it('should write space metadata and asset files under spaces/', async () => { + const exporter = new CsAssetsQueryExporter(baseOptions); + await exporter.export(['asset-1']); + + const metadataPath = pResolve(exportDir, 'spaces', 'space-1', 'metadata.json'); + const metadata = JSON.parse(await fs.readFile(metadataPath, 'utf-8')); + expect(metadata.uid).to.equal('space-1'); + expect(metadata.workspace_uid).to.equal('main'); + + const foldersPath = pResolve(exportDir, 'spaces', 'space-1', 'assets', 'folders.json'); + const folders = JSON.parse(await fs.readFile(foldersPath, 'utf-8')); + expect(folders).to.be.an('array').that.is.empty; + }); +}); + +describe('CSAssetsAdapter.searchAssets', () => { + const baseConfig = { + baseURL: 'https://am.example.com', + headers: { organization_uid: 'org-1' }, + }; + + let fetchStub: sinon.SinonStub; + + beforeEach(() => { + sinon.stub(HttpClient.prototype, 'headers').returnsThis(); + sinon.stub(HttpClient.prototype, 'baseUrl').returnsThis(); + sinon.stub(authenticationHandler, 'getAuthDetails').resolves(); + sinon.stub(authenticationHandler, 'isOauthEnabled').get(() => false); + sinon.stub(authenticationHandler, 'accessToken').get(() => 'test-token'); + + fetchStub = sinon.stub(global, 'fetch').resolves({ + ok: true, + json: async () => ({ count: 1, assets: [{ uid: 'a1' }] }), + } as Response); + }); + + afterEach(() => { + sinon.restore(); + }); + + it('should POST to /api/search with $and-wrapped uid $in query and required fields', async () => { + const adapter = new CSAssetsAdapter(baseConfig); + await adapter.searchAssets({ + assetUIDs: ['uid-1', 'uid-2'], + spaces: [{ space_uid: 'space-1', workspace: 'main' }], + skip: 0, + limit: 50, + }); + + expect(fetchStub.calledOnce).to.be.true; + const [url, init] = fetchStub.firstCall.args; + expect(url).to.equal('https://am.example.com/api/search'); + expect(init.method).to.equal('POST'); + const body = JSON.parse(init.body); + expect(body.query).to.deep.equal({ $and: [{ uid: { $in: ['uid-1', 'uid-2'] } }] }); + expect(body.object_type).to.equal('asset'); + expect(body.desc).to.equal('updated_at'); + expect(body.search_text).to.equal(''); + expect(body.search_field).to.equal('all'); + expect(body.search_terms_operator).to.equal('or'); + expect(body.spaces).to.deep.equal([{ space_uid: 'space-1', workspace: 'main' }]); + }); + + it('should return empty result when assetUIDs is empty', async () => { + const adapter = new CSAssetsAdapter(baseConfig); + const result = await adapter.searchAssets({ + assetUIDs: [], + spaces: [{ space_uid: 'space-1', workspace: 'main' }], + }); + + expect(fetchStub.called).to.be.false; + expect(result).to.deep.equal({ count: 0, assets: [] }); + }); +}); diff --git a/packages/contentstack-audit/README.md b/packages/contentstack-audit/README.md index 81eb8c8fe..1ee7bde2f 100644 --- a/packages/contentstack-audit/README.md +++ b/packages/contentstack-audit/README.md @@ -19,7 +19,7 @@ $ npm install -g @contentstack/cli-audit $ csdx COMMAND running command... $ csdx (--version|-v) -@contentstack/cli-audit/2.0.0-beta.11 darwin-arm64 node-v22.13.1 +@contentstack/cli-audit/2.0.0-beta.13 darwin-arm64 node-v22.13.1 $ csdx --help [COMMAND] USAGE $ csdx COMMAND @@ -137,24 +137,4 @@ EXAMPLES ``` _See code: [src/commands/cm/stacks/audit/fix.ts](https://github.com/contentstack/audit/blob/main/packages/contentstack-audit/src/commands/cm/stacks/audit/fix.ts)_ - -## `csdx help [COMMAND]` - -Display help for csdx. - -``` -USAGE - $ csdx help [COMMAND...] [-n] - -ARGUMENTS - [COMMAND...] Command to show help for. - -FLAGS - -n, --nested-commands Include all nested commands in the output. - -DESCRIPTION - Display help for csdx. -``` - -_See code: [@oclif/plugin-help](https://github.com/oclif/plugin-help/blob/v6.2.37/src/commands/help.ts)_ diff --git a/packages/contentstack-audit/package.json b/packages/contentstack-audit/package.json index 92c9598d1..7da2cc83c 100644 --- a/packages/contentstack-audit/package.json +++ b/packages/contentstack-audit/package.json @@ -18,8 +18,8 @@ "/oclif.manifest.json" ], "dependencies": { - "@contentstack/cli-command": "~2.0.0-beta.7", - "@contentstack/cli-utilities": "~2.0.0-beta.8", + "@contentstack/cli-command": "~2.0.0-beta.8", + "@contentstack/cli-utilities": "~2.0.0-beta.9", "@oclif/core": "^4.11.4", "chalk": "^5.6.2", "fast-csv": "^4.3.6", diff --git a/packages/contentstack-bootstrap/README.md b/packages/contentstack-bootstrap/README.md index 38991eec0..914dbca61 100644 --- a/packages/contentstack-bootstrap/README.md +++ b/packages/contentstack-bootstrap/README.md @@ -15,7 +15,7 @@ $ npm install -g @contentstack/cli-cm-bootstrap $ csdx COMMAND running command... $ csdx (--version) -@contentstack/cli-cm-bootstrap/2.0.0-beta.16 darwin-arm64 node-v22.13.1 +@contentstack/cli-cm-bootstrap/2.0.0-beta.19 darwin-arm64 node-v22.13.1 $ csdx --help [COMMAND] USAGE $ csdx COMMAND diff --git a/packages/contentstack-bootstrap/package.json b/packages/contentstack-bootstrap/package.json index 87c45287a..2daacbd54 100644 --- a/packages/contentstack-bootstrap/package.json +++ b/packages/contentstack-bootstrap/package.json @@ -17,8 +17,8 @@ }, "dependencies": { "@contentstack/cli-cm-seed": "~2.0.0-beta.19", - "@contentstack/cli-command": "~2.0.0-beta.7", - "@contentstack/cli-utilities": "~2.0.0-beta.8", + "@contentstack/cli-command": "~2.0.0-beta.8", + "@contentstack/cli-utilities": "~2.0.0-beta.9", "@contentstack/cli-config": "~2.0.0-beta.10", "@oclif/core": "^4.11.4", "inquirer": "12.11.1", @@ -70,4 +70,4 @@ } }, "repository": "contentstack/cli" -} \ No newline at end of file +} diff --git a/packages/contentstack-branches/README.md b/packages/contentstack-branches/README.md index c22682f9b..ba0c0be8c 100755 --- a/packages/contentstack-branches/README.md +++ b/packages/contentstack-branches/README.md @@ -37,7 +37,7 @@ $ npm install -g @contentstack/cli-cm-branches $ csdx COMMAND running command... $ csdx (--version) -@contentstack/cli-cm-branches/2.0.0-beta.6 darwin-arm64 node-v22.13.1 +@contentstack/cli-cm-branches/2.0.0-beta.8 darwin-arm64 node-v22.13.1 $ csdx --help [COMMAND] USAGE $ csdx COMMAND diff --git a/packages/contentstack-branches/package.json b/packages/contentstack-branches/package.json index 323e824d4..07fca6ca4 100644 --- a/packages/contentstack-branches/package.json +++ b/packages/contentstack-branches/package.json @@ -5,9 +5,9 @@ "author": "Contentstack", "bugs": "https://github.com/contentstack/cli/issues", "dependencies": { - "@contentstack/cli-command": "~2.0.0-beta.7", + "@contentstack/cli-command": "~2.0.0-beta.8", "@oclif/core": "^4.11.4", - "@contentstack/cli-utilities": "~2.0.0-beta.8", + "@contentstack/cli-utilities": "~2.0.0-beta.9", "chalk": "^5.6.2", "just-diff": "^6.0.2", "lodash": "^4.18.1" diff --git a/packages/contentstack-bulk-operations/package.json b/packages/contentstack-bulk-operations/package.json index 06d32783f..f4431f32f 100644 --- a/packages/contentstack-bulk-operations/package.json +++ b/packages/contentstack-bulk-operations/package.json @@ -21,8 +21,8 @@ ], "dependencies": { "@contentstack/cli-asset-management": "1.0.0-beta.3", - "@contentstack/cli-command": "~2.0.0-beta.7", - "@contentstack/cli-utilities": "~2.0.0-beta.8", + "@contentstack/cli-command": "~2.0.0-beta.8", + "@contentstack/cli-utilities": "~2.0.0-beta.9", "@contentstack/delivery-sdk": "^5.2.0", "@contentstack/management": "^1.30.2", "lodash": "^4.18.1", @@ -118,4 +118,4 @@ "cm:stacks:bulk-taxonomies": "BOT" } } -} \ No newline at end of file +} diff --git a/packages/contentstack-cli-cm-regex-validate/README.md b/packages/contentstack-cli-cm-regex-validate/README.md index 590363338..2e45f66e5 100644 --- a/packages/contentstack-cli-cm-regex-validate/README.md +++ b/packages/contentstack-cli-cm-regex-validate/README.md @@ -50,41 +50,5 @@ USAGE # Commands -* [`csdx cm:stacks:validate-regex`](#csdx-cmstacksvalidate-regex) -## `csdx cm:stacks:validate-regex` - -This command is used to find all the invalid regexes present in the content types and global fields of your stack. - -``` -USAGE - $ csdx cm:stacks:validate-regex [-a ] [-c] [-f ] [-g] - -FLAGS - -a, --alias= Alias (name) assigned to the management token - -c, --contentType To find invalid regexes within the content types - -f, --filePath= [optional] The path or the location in your file system where the CSV output file should be - stored. - -g, --globalField To find invalid regexes within the global fields - -DESCRIPTION - This command is used to find all the invalid regexes present in the content types and global fields of your stack. - -EXAMPLES - $ csdx cm:stacks:validate-regex - - $ csdx cm:stacks:validate-regex -a - - $ csdx cm:stacks:validate-regex -c - - $ csdx cm:stacks:validate-regex -g - - $ csdx cm:stacks:validate-regex -f - - $ csdx cm:stacks:validate-regex -a -c -g - - $ csdx cm:stacks:validate-regex -a -c -g -f -``` - -_See code: [src/commands/cm/stacks/validate-regex.ts](https://github.com/contentstack/cli-plugins/blob/main/packages/contentstack-cli-cm-regex-validate/src/commands/cm/stacks/validate-regex.ts)_ diff --git a/packages/contentstack-cli-cm-regex-validate/package.json b/packages/contentstack-cli-cm-regex-validate/package.json index a4037f173..a0f2fc13b 100644 --- a/packages/contentstack-cli-cm-regex-validate/package.json +++ b/packages/contentstack-cli-cm-regex-validate/package.json @@ -5,8 +5,8 @@ "author": "Contentstack", "bugs": "https://github.com/contentstack/cli-plugins/issues", "dependencies": { - "@contentstack/cli-command": "~2.0.0-beta.7", - "@contentstack/cli-utilities": "~2.0.0-beta.8", + "@contentstack/cli-command": "~2.0.0-beta.8", + "@contentstack/cli-utilities": "~2.0.0-beta.9", "@contentstack/management": "^1.30.2", "cli-table3": "^0.6.5", "inquirer": "12.11.1", diff --git a/packages/contentstack-cli-tsgen/package.json b/packages/contentstack-cli-tsgen/package.json index 499d409f1..940a23f99 100644 --- a/packages/contentstack-cli-tsgen/package.json +++ b/packages/contentstack-cli-tsgen/package.json @@ -5,8 +5,8 @@ "author": "Contentstack", "bugs": "https://github.com/contentstack/cli-plugins/issues", "dependencies": { - "@contentstack/cli-command": "~2.0.0-beta.7", - "@contentstack/cli-utilities": "~2.0.0-beta.8", + "@contentstack/cli-command": "~2.0.0-beta.8", + "@contentstack/cli-utilities": "~2.0.0-beta.9", "@contentstack/types-generator": "^3.10.0" }, "devDependencies": { diff --git a/packages/contentstack-clone/README.md b/packages/contentstack-clone/README.md index 4c818981a..604d99026 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.17 darwin-arm64 node-v22.13.1 +@contentstack/cli-cm-clone/2.0.0-beta.20 darwin-arm64 node-v22.13.1 $ csdx --help [COMMAND] USAGE $ csdx COMMAND diff --git a/packages/contentstack-clone/package.json b/packages/contentstack-clone/package.json index 6313eeb69..77ac1daba 100644 --- a/packages/contentstack-clone/package.json +++ b/packages/contentstack-clone/package.json @@ -8,8 +8,8 @@ "@colors/colors": "^1.6.0", "@contentstack/cli-cm-export": "~2.0.0-beta.19", "@contentstack/cli-cm-import": "~2.0.0-beta.19", - "@contentstack/cli-command": "~2.0.0-beta.7", - "@contentstack/cli-utilities": "~2.0.0-beta.8", + "@contentstack/cli-command": "~2.0.0-beta.8", + "@contentstack/cli-utilities": "~2.0.0-beta.9", "@oclif/core": "^4.11.4", "chalk": "^5.6.2", "inquirer": "12.11.1", diff --git a/packages/contentstack-content-type/README.md b/packages/contentstack-content-type/README.md index 5321599cc..ddde8811b 100644 --- a/packages/contentstack-content-type/README.md +++ b/packages/contentstack-content-type/README.md @@ -54,171 +54,5 @@ $ csdx content-type:details -a "management token" -c "content type" --no-path # Commands -* [`csdx content-type:audit`](#csdx-content-typeaudit) -* [`csdx content-type:compare`](#csdx-content-typecompare) -* [`csdx content-type:compare-remote`](#csdx-content-typecompare-remote) -* [`csdx content-type:details`](#csdx-content-typedetails) -* [`csdx content-type:diagram`](#csdx-content-typediagram) -* [`csdx content-type:list`](#csdx-content-typelist) -## `csdx content-type:audit` - -Display recent changes to a Content Type - -``` -USAGE - $ csdx content-type:audit --content-type [-k | | -a ] - -FLAGS - -a, --alias= Alias of the management token - -k, --stack-api-key= Stack API Key - --content-type= (required) Content Type UID - -DESCRIPTION - Display recent changes to a Content Type - -EXAMPLES - $ csdx content-type:audit --stack-api-key "xxxxxxxxxxxxxxxxxxx" --content-type "home_page" - - $ csdx content-type:audit --alias "management token" --content-type "home_page" -``` - -_See code: [src/commands/content-type/audit.ts](https://github.com/contentstack/cli-plugins/blob/main/packages/contentstack-content-type/src/commands/content-type/audit.ts)_ - -## `csdx content-type:compare` - -Compare two Content Type versions - -``` -USAGE - $ csdx content-type:compare --content-type [-k | ] [-a ] [--left --right ] - -FLAGS - -a, --alias= Alias of the management token - -k, --stack-api-key= Stack API Key - --content-type= (required) Content Type UID - --left= Content Type version, i.e. prev version - --right= Content Type version, i.e. later version - -DESCRIPTION - Compare two Content Type versions - -EXAMPLES - $ csdx content-type:compare --stack-api-key "xxxxxxxxxxxxxxxxxxx" --content-type "home_page" - - $ csdx content-type:compare --stack-api-key "xxxxxxxxxxxxxxxxxxx" --content-type "home_page" --left # --right # - - $ csdx content-type:compare --alias "management token" --content-type "home_page" --left # --right # -``` - -_See code: [src/commands/content-type/compare.ts](https://github.com/contentstack/cli-plugins/blob/main/packages/contentstack-content-type/src/commands/content-type/compare.ts)_ - -## `csdx content-type:compare-remote` - -compare two Content Types on different Stacks - -``` -USAGE - $ csdx content-type:compare-remote (--origin-stack --remote-stack ) --content-type - -FLAGS - --content-type= (required) Content Type UID - --origin-stack= (required) Origin Stack API Key - --remote-stack= (required) Remote Stack API Key - -DESCRIPTION - compare two Content Types on different Stacks - -EXAMPLES - $ csdx content-type:compare-remote --origin-stack "xxxxxxxxxxxxxxxxxxx" --remote-stack "xxxxxxxxxxxxxxxxxxx" -content-type "home_page" -``` - -_See code: [src/commands/content-type/compare-remote.ts](https://github.com/contentstack/cli-plugins/blob/main/packages/contentstack-content-type/src/commands/content-type/compare-remote.ts)_ - -## `csdx content-type:details` - -Display Content Type details - -``` -USAGE - $ csdx content-type:details --content-type [-k | ] [-a ] [--path] - -FLAGS - -a, --alias= Alias of the management token - -k, --stack-api-key= Stack API Key - --content-type= (required) Content Type UID - --[no-]path show path column - -DESCRIPTION - Display Content Type details - -EXAMPLES - $ csdx content-type:details --stack-api-key "xxxxxxxxxxxxxxxxxxx" --content-type "home_page" - - $ csdx content-type:details --alias "management token" --content-type "home_page" - - $ csdx content-type:details --alias "management token" --content-type "home_page" --no-path -``` - -_See code: [src/commands/content-type/details.ts](https://github.com/contentstack/cli-plugins/blob/main/packages/contentstack-content-type/src/commands/content-type/details.ts)_ - -## `csdx content-type:diagram` - -Create a visual diagram of a Stack's Content Types - -``` -USAGE - $ csdx content-type:diagram --output --direction portrait|landscape --type svg|dot [-k | | -a - ] - -FLAGS - -a, --alias= Alias of the management token - -k, --stack-api-key= Stack API Key - --direction=