Skip to content

Commit 1016d9f

Browse files
Merge pull request #2216 from contentstack/feat/DX-3571-taxonomy-localization
Feat/dx 3571 taxonomy localization
2 parents 700b94b + 73ca127 commit 1016d9f

File tree

30 files changed

+1622
-1277
lines changed

30 files changed

+1622
-1277
lines changed

.github/workflows/unit-test.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ jobs:
1818

1919
- name: Install dependencies for all plugins
2020
run: |
21-
npm run setup-repo-old
21+
NODE_ENV=PREPACK_MODE npm run setup-repo-old
2222
2323
- name: Run tests for Contentstack Command
2424
working-directory: ./packages/contentstack-command

.talismanrc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
fileignoreconfig:
22
- filename: package-lock.json
3-
checksum: 484e310f7e8884916149057a6581e655503d6977021f54da4cfdb31558820ffc
3+
checksum: d3b93fad9630655f037e36b78fea3354f1a038988562254afdad0f6e54ece12d
44
- filename: pnpm-lock.yaml
5-
checksum: 3cdef03a4cdc334dd5ab432ab9dfa9c35f529ed5f744d5a44a4bff68f1e43ead
5+
checksum: aa6177859aaa87caf2892e8034657fd485c3abe7c13a833fd28449a1d33fa950
66
- filename: packages/contentstack-import-setup/test/unit/backup-handler.test.ts
77
checksum: 0582d62b88834554cf12951c8690a73ef3ddbb78b82d2804d994cf4148e1ef93
88
- filename: packages/contentstack-import-setup/test/config.json
@@ -32,7 +32,7 @@ fileignoreconfig:
3232
- filename: packages/contentstack-import-setup/test/unit/login-handler.test.ts
3333
checksum: e549f9ca3a9aae0d93b7284f7e771d55c0610725ddcb4333612df2f215e92769
3434
- filename: packages/contentstack/README.md
35-
checksum: f46084b199b3b0d7986b363c86a657570def71e5da29b948cc343eaf94ec7e97
35+
checksum: 10f580c697d0b70b813428954b946e60609f41c42e78ca95ca3232443e725615
3636
- filename: packages/contentstack-import-setup/test/unit/modules/assets.test.ts
3737
checksum: 449a5e3383631a6f78d1291aa3c28c91681879289398f0a933158fba5c5d5acf
3838
- filename: packages/contentstack-auth/env.example
@@ -142,7 +142,7 @@ fileignoreconfig:
142142
- filename: packages/contentstack-export/test/unit/export/modules/stack.test.ts
143143
checksum: bb0f20845d85fd56197f1a8c67b8f71c57dcd1836ed9cfd86d1f49f41e84d3a0
144144
- filename: packages/contentstack-export/test/unit/export/modules/taxonomies.test.ts
145-
checksum: 621c1de129488b6a0372a91056ebb84353bcc642ce06de59e3852cfee8d0ce49
145+
checksum: 5b1d2ba5ec9100fd6174e9c6771b7e49c93a09fa2d6aedadd338e56bc3e3610f
146146
- filename: packages/contentstack-export/test/unit/export/modules/custom-roles.test.ts
147147
checksum: 39f0166a8030ee8f504301f3a42cc71b46ddc027189b90029ef19800b79a46e5
148148
- filename: packages/contentstack-export/test/unit/export/modules/workflows.test.ts

package-lock.json

Lines changed: 647 additions & 792 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/contentstack-bootstrap/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@contentstack/cli-cm-bootstrap",
33
"description": "Bootstrap contentstack apps",
4-
"version": "1.16.1",
4+
"version": "1.17.0",
55
"author": "Contentstack",
66
"bugs": "https://github.com/contentstack/cli/issues",
77
"scripts": {
@@ -16,12 +16,12 @@
1616
"test:report": "nyc --reporter=lcov mocha \"test/**/*.test.js\""
1717
},
1818
"dependencies": {
19-
"@contentstack/cli-cm-seed": "~1.12.2",
19+
"@contentstack/cli-cm-seed": "~1.13.0",
2020
"@contentstack/cli-command": "~1.6.1",
2121
"@contentstack/cli-utilities": "~1.14.4",
2222
"@oclif/core": "^4.3.0",
2323
"@oclif/plugin-help": "^6.2.28",
24-
"inquirer": "8.2.6",
24+
"inquirer": "8.2.7",
2525
"mkdirp": "^1.0.4",
2626
"tar": "^6.2.1 "
2727
},

packages/contentstack-bulk-publish/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
"@oclif/plugin-help": "^6.2.28",
1313
"chalk": "^4.1.2",
1414
"dotenv": "^16.5.0",
15-
"inquirer": "8.2.6",
15+
"inquirer": "8.2.7",
1616
"lodash": "^4.17.21",
1717
"winston": "^3.17.0"
1818
},

packages/contentstack-clone/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,19 @@
11
{
22
"name": "@contentstack/cli-cm-clone",
33
"description": "Contentstack stack clone plugin",
4-
"version": "1.16.1",
4+
"version": "1.17.0",
55
"author": "Contentstack",
66
"bugs": "https://github.com/rohitmishra209/cli-cm-clone/issues",
77
"dependencies": {
88
"@colors/colors": "^1.6.0",
9-
"@contentstack/cli-cm-export": "~1.20.1",
10-
"@contentstack/cli-cm-import": "~1.28.4",
9+
"@contentstack/cli-cm-export": "~1.21.0",
10+
"@contentstack/cli-cm-import": "~1.29.0",
1111
"@contentstack/cli-command": "~1.6.1",
1212
"@contentstack/cli-utilities": "~1.14.4",
1313
"@oclif/core": "^4.3.0",
1414
"@oclif/plugin-help": "^6.2.28",
1515
"chalk": "^4.1.2",
16-
"inquirer": "8.2.6",
16+
"inquirer": "8.2.7",
1717
"lodash": "^4.17.21",
1818
"merge": "^2.1.1",
1919
"ora": "^5.4.1",

packages/contentstack-config/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ USAGE
395395
[--personalize <value>] [--launch <value>]
396396
397397
ARGUMENTS
398-
REGION Name for the region
398+
[REGION] Name for the region
399399
400400
FLAGS
401401
-d, --cda=<value> Custom host to set for content delivery API, if this flag is added then cma, ui-host and

packages/contentstack-export-to-csv/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@contentstack/cli-cm-export-to-csv",
33
"description": "Export entities to csv",
4-
"version": "1.9.1",
4+
"version": "1.10.0",
55
"author": "Abhinav Gupta @abhinav-from-contentstack",
66
"bugs": "https://github.com/contentstack/cli/issues",
77
"dependencies": {

packages/contentstack-export-to-csv/src/commands/cm/export-to-csv.js

Lines changed: 77 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ const {
77
cliux,
88
doesBranchExist,
99
isManagementTokenValid,
10-
log
1110
} = require('@contentstack/cli-utilities');
1211
const util = require('../../util');
1312
const config = require('../../util/config');
@@ -18,7 +17,8 @@ class ExportToCsvCommand extends Command {
1817
required: false,
1918
multiple: false,
2019
options: ['entries', 'users', 'teams', 'taxonomies'],
21-
description: 'Option to export data (entries, users, teams, taxonomies). <options: entries|users|teams|taxonomies>',
20+
description:
21+
'Option to export data (entries, users, teams, taxonomies). <options: entries|users|teams|taxonomies>',
2222
}),
2323
alias: flags.string({
2424
char: 'a',
@@ -67,12 +67,22 @@ class ExportToCsvCommand extends Command {
6767
'taxonomy-uid': flags.string({
6868
description: 'Provide the taxonomy UID of the related terms you want to export.',
6969
}),
70+
'include-fallback': flags.boolean({
71+
description:
72+
"[Optional] Include fallback locale data when exporting taxonomies. When enabled, if a taxonomy term doesn't exist in the specified locale, it will fallback to the hierarchy defined in the branch settings.",
73+
default: false,
74+
}),
75+
'fallback-locale': flags.string({
76+
description:
77+
"[Optional] Specify a specific fallback locale for taxonomy export. This locale will be used when a taxonomy term doesn't exist in the primary locale. Takes priority over branch fallback hierarchy when both are specified.",
78+
required: false,
79+
}),
7080
delimiter: flags.string({
71-
description: '[optional] Provide a delimiter to separate individual data fields within the CSV file. For example: cm:export-to-csv --delimiter \'|\'',
81+
description:
82+
"[optional] Provide a delimiter to separate individual data fields within the CSV file. For example: cm:export-to-csv --delimiter '|'",
7283
default: ',',
7384
}),
74-
};
75-
85+
};
7686
async run() {
7787
try {
7888
let action, managementAPIClient;
@@ -87,9 +97,11 @@ class ExportToCsvCommand extends Command {
8797
'content-type': contentTypesFlag,
8898
alias: managementTokenAlias,
8999
branch: branchUid,
90-
"team-uid": teamUid,
100+
'team-uid': teamUid,
91101
'taxonomy-uid': taxonomyUID,
92-
delimiter
102+
'include-fallback': includeFallback,
103+
'fallback-locale': fallbackLocale,
104+
delimiter,
93105
},
94106
} = await this.parse(ExportToCsvCommand);
95107

@@ -127,7 +139,12 @@ class ExportToCsvCommand extends Command {
127139
}
128140

129141
stackAPIClient = this.getStackClient(managementAPIClient, stack);
130-
stackAPIClient = await this.checkAndUpdateBranchDetail(branchUid, stack, stackAPIClient, managementAPIClient);
142+
stackAPIClient = await this.checkAndUpdateBranchDetail(
143+
branchUid,
144+
stack,
145+
stackAPIClient,
146+
managementAPIClient,
147+
);
131148

132149
const contentTypeCount = await util.getContentTypeCount(stackAPIClient);
133150

@@ -223,15 +240,15 @@ class ExportToCsvCommand extends Command {
223240
}
224241
case config.exportTeams:
225242
case 'teams': {
226-
try{
243+
try {
227244
let organization;
228245
if (org) {
229246
organization = { uid: org, name: orgName || org };
230247
} else {
231248
organization = await util.chooseOrganization(managementAPIClient, action); // prompt for organization
232249
}
233-
234-
await util.exportTeams(managementAPIClient,organization,teamUid, delimiter);
250+
251+
await util.exportTeams(managementAPIClient, organization, teamUid, delimiter);
235252
} catch (error) {
236253
if (error.message || error.errorMessage) {
237254
cliux.error(util.formatError(error));
@@ -242,7 +259,11 @@ class ExportToCsvCommand extends Command {
242259
case config.exportTaxonomies:
243260
case 'taxonomies': {
244261
let stack;
262+
let language;
245263
let stackAPIClient;
264+
let finalIncludeFallback = includeFallback;
265+
let finalFallbackLocale = fallbackLocale;
266+
246267
if (managementTokenAlias) {
247268
const { stackDetails, apiClient } = await this.getAliasDetails(managementTokenAlias, stackName);
248269
managementAPIClient = apiClient;
@@ -252,7 +273,27 @@ class ExportToCsvCommand extends Command {
252273
}
253274

254275
stackAPIClient = this.getStackClient(managementAPIClient, stack);
255-
await this.createTaxonomyAndTermCsvFile(stackAPIClient, stackName, stack, taxonomyUID, delimiter);
276+
if (locale) {
277+
language = { code: locale };
278+
} else {
279+
language = await util.chooseLanguage(stackAPIClient);
280+
}
281+
282+
// if (includeFallback === undefined || fallbackLocale === undefined) {
283+
// const fallbackOptions = await util.chooseFallbackOptions(stackAPIClient);
284+
// }
285+
286+
287+
if (fallbackLocale !== undefined) {
288+
finalFallbackLocale = fallbackLocale;
289+
}
290+
291+
await this.createTaxonomyAndTermCsvFile(stackAPIClient, stackName, stack, taxonomyUID, delimiter, {
292+
locale: language.code,
293+
branch: branchUid,
294+
include_fallback: finalIncludeFallback,
295+
fallback_locale: finalFallbackLocale,
296+
});
256297
break;
257298
}
258299
}
@@ -287,7 +328,7 @@ class ExportToCsvCommand extends Command {
287328
.query()
288329
.find()
289330
.then(({ items }) => (items !== undefined ? items : []))
290-
.catch((_err) => {});
331+
.catch(() => {});
291332
}
292333

293334
/**
@@ -335,9 +376,14 @@ class ExportToCsvCommand extends Command {
335376
let apiClient, stackDetails;
336377
const listOfTokens = configHandler.get('tokens');
337378
if (managementTokenAlias && listOfTokens[managementTokenAlias]) {
338-
const checkManagementTokenValidity = await isManagementTokenValid((listOfTokens[managementTokenAlias].apiKey) ,listOfTokens[managementTokenAlias].token);
339-
if(checkManagementTokenValidity.hasOwnProperty('message')) {
340-
throw checkManagementTokenValidity.valid==='failedToCheck'?checkManagementTokenValidity.message:(`error: Management token or stack API key is invalid. ${checkManagementTokenValidity.message}`);
379+
const checkManagementTokenValidity = await isManagementTokenValid(
380+
listOfTokens[managementTokenAlias].apiKey,
381+
listOfTokens[managementTokenAlias].token,
382+
);
383+
if (Object.prototype.hasOwnProperty.call(checkManagementTokenValidity, 'message')) {
384+
throw checkManagementTokenValidity.valid === 'failedToCheck'
385+
? checkManagementTokenValidity.message
386+
: `error: Management token or stack API key is invalid. ${checkManagementTokenValidity.message}`;
341387
}
342388
apiClient = await managementSDKClient({
343389
host: this.cmaHost,
@@ -393,13 +439,12 @@ class ExportToCsvCommand extends Command {
393439
* @param {object} stack
394440
* @param {string} taxUID
395441
*/
396-
async createTaxonomyAndTermCsvFile(stackAPIClient, stackName, stack, taxUID, delimiter) {
397-
//TODO: Temp variable to export taxonomies in importable format will replaced with flag once decided
398-
const importableCSV = true;
442+
async createTaxonomyAndTermCsvFile(stackAPIClient, stackName, stack, taxUID, delimiter, localeOptions = {}) {
399443
const payload = {
400444
stackAPIClient,
401445
type: '',
402446
limit: config.limit || 100,
447+
...localeOptions, // Spread locale, branch, include_fallback, fallback_locale
403448
};
404449
//check whether the taxonomy is valid or not
405450
let taxonomies = [];
@@ -411,36 +456,13 @@ class ExportToCsvCommand extends Command {
411456
taxonomies = await util.getAllTaxonomies(payload);
412457
}
413458

414-
if (!importableCSV) {
415-
const formattedTaxonomiesData = util.formatTaxonomiesData(taxonomies);
416-
if (formattedTaxonomiesData?.length) {
417-
const fileName = `${stackName ? stackName : stack.name}_taxonomies.csv`;
418-
util.write(this, formattedTaxonomiesData, fileName, 'taxonomies', delimiter);
419-
} else {
420-
cliux.print('info: No taxonomies found! Please provide a valid stack.', { color: 'blue' });
421-
}
422-
423-
for (let index = 0; index < taxonomies?.length; index++) {
424-
const taxonomy = taxonomies[index];
425-
const taxonomyUID = taxonomy?.uid;
426-
if (taxonomyUID) {
427-
payload['taxonomyUID'] = taxonomyUID;
428-
const terms = await util.getAllTermsOfTaxonomy(payload);
429-
const formattedTermsData = util.formatTermsOfTaxonomyData(terms, taxonomyUID);
430-
const taxonomyName = taxonomy?.name ?? '';
431-
const termFileName = `${stackName ?? stack.name}_${taxonomyName}_${taxonomyUID}_terms.csv`;
432-
if (formattedTermsData?.length) {
433-
util.write(this, formattedTermsData, termFileName, 'terms', delimiter);
434-
} else {
435-
cliux.print(`info: No terms found for the taxonomy UID - '${taxonomyUID}'!`, { color: 'blue' });
436-
}
437-
}
438-
}
459+
if (!taxonomies?.length) {
460+
cliux.print('info: No taxonomies found!', { color: 'blue' });
439461
} else {
440462
const fileName = `${stackName ?? stack.name}_taxonomies.csv`;
441463
const { taxonomiesData, headers } = await util.createImportableCSV(payload, taxonomies);
442464
if (taxonomiesData?.length) {
443-
util.write(this, taxonomiesData, fileName, 'taxonomies',delimiter, headers);
465+
util.write(this, taxonomiesData, fileName, 'taxonomies', delimiter, headers);
444466
}
445467
}
446468
}
@@ -486,6 +508,16 @@ ExportToCsvCommand.examples = [
486508
'',
487509
'Exporting taxonomies and respective terms to a .CSV file with a delimiter',
488510
'csdx cm:export-to-csv --action <taxonomies> --alias <management-token-alias> --delimiter <delimiter>',
511+
'',
512+
'Exporting taxonomies with specific locale',
513+
'csdx cm:export-to-csv --action <taxonomies> --alias <management-token-alias> --locale <locale>',
514+
'',
515+
'Exporting taxonomies with fallback locale support',
516+
'csdx cm:export-to-csv --action <taxonomies> --alias <management-token-alias> --locale <locale> --include-fallback',
517+
'',
518+
'Exporting taxonomies with custom fallback locale',
519+
'csdx cm:export-to-csv --action <taxonomies> --alias <management-token-alias> --locale <locale> --include-fallback --fallback-locale <fallback-locale>',
520+
'',
489521
];
490522

491523
module.exports = ExportToCsvCommand;

0 commit comments

Comments
 (0)