contensis-cli 1.4.1 → 1.4.2-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/README.md +360 -1
  2. package/dist/commands/create.js +83 -2
  3. package/dist/commands/create.js.map +2 -2
  4. package/dist/commands/get.js +33 -1
  5. package/dist/commands/get.js.map +2 -2
  6. package/dist/commands/import.js +62 -0
  7. package/dist/commands/import.js.map +2 -2
  8. package/dist/commands/list.js +48 -1
  9. package/dist/commands/list.js.map +2 -2
  10. package/dist/commands/remove.js +50 -1
  11. package/dist/commands/remove.js.map +2 -2
  12. package/dist/localisation/en-GB.js +38 -8
  13. package/dist/localisation/en-GB.js.map +2 -2
  14. package/dist/providers/HttpProvider.js +4 -4
  15. package/dist/providers/HttpProvider.js.map +2 -2
  16. package/dist/providers/ManifestProvider.js +2 -2
  17. package/dist/providers/ManifestProvider.js.map +2 -2
  18. package/dist/providers/SessionCacheProvider.js +6 -3
  19. package/dist/providers/SessionCacheProvider.js.map +2 -2
  20. package/dist/providers/file-provider.js +2 -2
  21. package/dist/providers/file-provider.js.map +2 -2
  22. package/dist/services/ContensisCliService.js +370 -22
  23. package/dist/services/ContensisCliService.js.map +3 -3
  24. package/dist/shell.js +14 -1
  25. package/dist/shell.js.map +2 -2
  26. package/dist/util/assert.js +62 -0
  27. package/dist/util/assert.js.map +7 -0
  28. package/dist/util/index.js +11 -36
  29. package/dist/util/index.js.map +2 -2
  30. package/dist/util/logger.js +17 -6
  31. package/dist/util/logger.js.map +2 -2
  32. package/dist/version.js +1 -1
  33. package/dist/version.js.map +1 -1
  34. package/package.json +2 -2
  35. package/src/commands/create.ts +118 -0
  36. package/src/commands/get.ts +48 -1
  37. package/src/commands/import.ts +86 -0
  38. package/src/commands/list.ts +80 -1
  39. package/src/commands/remove.ts +91 -1
  40. package/src/localisation/en-GB.ts +62 -9
  41. package/src/models/Cache.d.ts +2 -1
  42. package/src/providers/HttpProvider.ts +1 -1
  43. package/src/providers/ManifestProvider.ts +1 -1
  44. package/src/providers/SessionCacheProvider.ts +6 -1
  45. package/src/providers/file-provider.ts +1 -1
  46. package/src/services/ContensisCliService.ts +480 -24
  47. package/src/shell.ts +14 -1
  48. package/src/util/assert.ts +35 -0
  49. package/src/util/index.ts +15 -36
  50. package/src/util/logger.ts +18 -6
  51. package/src/version.ts +1 -1
@@ -1,7 +1,7 @@
1
1
  import fs from 'fs';
2
2
  import { homedir } from 'os';
3
3
  import path from 'path';
4
- import { tryParse } from '~/util';
4
+ import { tryParse } from '~/util/assert';
5
5
  import { csvToJson, detectCsv } from '~/util/csv.formatter';
6
6
  import { unflattenObject } from '~/util/json.formatter';
7
7
  import { Logger } from '~/util/logger';
@@ -7,7 +7,13 @@ import path from 'path';
7
7
  import clone from 'rfdc';
8
8
 
9
9
  import { Component, ContentType, Project } from 'contensis-core-api';
10
- import { Role } from 'contensis-management-api/lib/models';
10
+ import {
11
+ ICreateTag,
12
+ ICreateTagGroup,
13
+ Role,
14
+ Tag,
15
+ TagGroup,
16
+ } from 'contensis-management-api';
11
17
  import {
12
18
  ContensisMigrationService,
13
19
  MigrateRequest,
@@ -32,15 +38,15 @@ import { readFileAsJSON } from '~/providers/file-provider';
32
38
  import SessionCacheProvider from '../providers/SessionCacheProvider';
33
39
  import CredentialProvider from '~/providers/CredentialProvider';
34
40
 
41
+ import { splitTagsAndGroups, url } from '~/util';
42
+ import { sanitiseIds } from '~/util/api-ids';
35
43
  import {
36
44
  isPassword,
37
45
  isSharedSecret,
38
46
  isUuid,
39
47
  tryParse,
40
48
  tryStringify,
41
- url,
42
- } from '~/util';
43
- import { sanitiseIds } from '~/util/api-ids';
49
+ } from '~/util/assert';
44
50
  import {
45
51
  printBlockVersion,
46
52
  printEntriesMigrateResult,
@@ -58,6 +64,18 @@ import { diffLogStrings } from '~/util/diff';
58
64
  import { findByIdOrName } from '~/util/find';
59
65
  import { logError, Logger } from '~/util/logger';
60
66
  import { promiseDelay } from '~/util/timers';
67
+ import { GetTagsArgs } from 'migratortron/dist/services/TagsMigrationService';
68
+ import { GetTagGroupsArgs } from 'migratortron/dist/services/TagGroupsMigrationService';
69
+
70
+ type ImportDataType =
71
+ | 'entries'
72
+ | 'contentTypes'
73
+ | 'components'
74
+ | 'models'
75
+ | 'nodes'
76
+ | 'tagGroups'
77
+ | 'tags'
78
+ | 'user-input';
61
79
 
62
80
  let insecurePasswordWarningShown = false;
63
81
 
@@ -326,20 +344,18 @@ class ContensisCli {
326
344
  fromFile,
327
345
  importDataType,
328
346
  importData,
347
+ mixedData,
329
348
  }: {
330
349
  commit?: boolean;
331
350
  fromFile?: string;
332
- importDataType?:
333
- | 'entries'
334
- | 'contentTypes'
335
- | 'components'
336
- | 'models'
337
- | 'nodes'
338
- | 'user-input';
351
+ importDataType?: ImportDataType;
339
352
  importData?: any[];
353
+ mixedData?: {
354
+ [K in ImportDataType]?: any[];
355
+ };
340
356
  }) => {
341
357
  const source: 'contensis' | 'file' =
342
- fromFile || importData ? 'file' : 'contensis';
358
+ fromFile || importData || mixedData ? 'file' : 'contensis';
343
359
 
344
360
  const fileData =
345
361
  importData || (fromFile ? (await readFileAsJSON(fromFile)) || [] : []);
@@ -389,7 +405,7 @@ class ContensisCli {
389
405
  if (source === 'file' || importDataType === 'user-input') {
390
406
  this.contensis = new ContensisMigrationService(
391
407
  {
392
- concurrency: 3,
408
+ concurrency: 2,
393
409
  outputProgress: true,
394
410
  ...contensisOpts,
395
411
  target: {
@@ -402,13 +418,14 @@ class ContensisCli {
402
418
  assetHostname: this.urls?.previewWeb,
403
419
  },
404
420
  ...(importDataType ? { [importDataType]: fileData } : {}),
421
+ ...(mixedData || {}),
405
422
  },
406
423
  !commit
407
424
  );
408
425
  } else if (source === 'contensis') {
409
426
  this.contensis = new ContensisMigrationService(
410
427
  {
411
- concurrency: 3,
428
+ concurrency: 2,
412
429
  outputProgress: true,
413
430
  ...contensisOpts,
414
431
  source: {
@@ -663,7 +680,10 @@ class ContensisCli {
663
680
  : undefined;
664
681
 
665
682
  session.UpdateEnv({
666
- projects: projects.map(p => p.id),
683
+ projects: projects.map(p => ({
684
+ id: p.id,
685
+ primaryLanguage: p.primaryLanguage,
686
+ })),
667
687
  currentProject: nextCurrentProject,
668
688
  });
669
689
 
@@ -740,8 +760,8 @@ class ContensisCli {
740
760
  let nextProjectId: string | undefined;
741
761
  if (env?.projects.length > 0 && env?.lastUserId) {
742
762
  nextProjectId = env.projects.find(
743
- p => p.toLowerCase() === projectId.toLowerCase()
744
- );
763
+ p => p.id.toLowerCase() === projectId.toLowerCase()
764
+ )?.id;
745
765
  if (nextProjectId) {
746
766
  env.currentProject = nextProjectId;
747
767
  session.UpdateEnv(env);
@@ -932,9 +952,9 @@ class ContensisCli {
932
952
  )}: ${permissions.contentTypes
933
953
  .map(
934
954
  p =>
935
- `${p.id} [${p.actions.join(',')}] ${(
936
- p as any
937
- ).languages.join(' ')}`
955
+ `${p.id} [${p.actions?.join(',')}] ${
956
+ (p as any).languages?.join(' ') || ''
957
+ }`
938
958
  )
939
959
  .join(', ')}`
940
960
  );
@@ -1045,6 +1065,13 @@ class ContensisCli {
1045
1065
  const contensis = await this.ConnectContensis();
1046
1066
 
1047
1067
  if (contensis) {
1068
+ log.line();
1069
+ if (contensis.isPreview) {
1070
+ log.success(messages.migrate.preview());
1071
+ } else {
1072
+ log.warning(messages.migrate.commit());
1073
+ }
1074
+
1048
1075
  // Retrieve roles list for env
1049
1076
  const [rolesErr, roles] = await to(contensis.roles.GetRoles());
1050
1077
 
@@ -1072,6 +1099,433 @@ class ContensisCli {
1072
1099
  }
1073
1100
  };
1074
1101
 
1102
+ PrintTagGroup = async (groupId: string) => {
1103
+ const { currentEnv, log, messages } = this;
1104
+ const contensis = await this.ConnectContensis();
1105
+
1106
+ if (contensis) {
1107
+ // Retrieve taggroups list for env
1108
+ const [groupsErr, groups] = await contensis.tags.GetTagGroups({
1109
+ id: groupId,
1110
+ });
1111
+
1112
+ if (Array.isArray(groups)) {
1113
+ log.success(messages.taggroups.list(currentEnv, groups.length));
1114
+
1115
+ if (groups.length)
1116
+ await this.HandleFormattingAndOutput(groups[0], () => {
1117
+ log.raw('');
1118
+ log.object(groups[0]);
1119
+ });
1120
+ else log.error(messages.taggroups.failedGet(currentEnv, groupId));
1121
+ }
1122
+
1123
+ if (groupsErr)
1124
+ log.error(messages.taggroups.noList(currentEnv), groupsErr);
1125
+ }
1126
+ };
1127
+
1128
+ PrintTagGroups = async (query: string) => {
1129
+ const { currentEnv, log, messages } = this;
1130
+ const contensis = await this.ConnectContensis();
1131
+
1132
+ if (contensis) {
1133
+ // Retrieve tag groups list for env
1134
+ const [groupsErr, groups] = await contensis.tags.GetTagGroups({
1135
+ q: query,
1136
+ });
1137
+
1138
+ if (Array.isArray(groups)) {
1139
+ log.success(messages.taggroups.list(currentEnv, groups.length));
1140
+
1141
+ if (!groups.length) log.help(messages.taggroups.noneExist());
1142
+
1143
+ await this.HandleFormattingAndOutput(groups, () => {
1144
+ // print the tag groups to console
1145
+
1146
+ for (const { version, ...group } of groups) {
1147
+ log.raw('');
1148
+ log.object(group);
1149
+ }
1150
+ });
1151
+ }
1152
+
1153
+ if (groupsErr)
1154
+ log.error(messages.taggroups.noList(currentEnv), groupsErr);
1155
+ }
1156
+ };
1157
+
1158
+ ImportTagGroups = async ({
1159
+ commit,
1160
+ fromFile,
1161
+ getBy,
1162
+ data,
1163
+ tags,
1164
+ save,
1165
+ }: {
1166
+ commit: boolean;
1167
+ fromFile?: string;
1168
+ getBy?: GetTagGroupsArgs;
1169
+ data?: ICreateTagGroup[];
1170
+ tags?: ICreateTag[];
1171
+ save?: boolean;
1172
+ }) => {
1173
+ const { currentEnv, currentProject, log, messages } = this;
1174
+
1175
+ const contensis = await this.ConnectContensisImport({
1176
+ commit,
1177
+ fromFile,
1178
+ importDataType: tags ? 'user-input' : 'tagGroups',
1179
+ mixedData: {
1180
+ tagGroups: data,
1181
+ tags: tags,
1182
+ },
1183
+ });
1184
+
1185
+ if (contensis) {
1186
+ log.line();
1187
+ if (contensis.isPreview) {
1188
+ log.success(messages.migrate.preview());
1189
+ } else {
1190
+ log.warning(messages.migrate.commit());
1191
+ }
1192
+
1193
+ // contensis.payload.tagGroups = data;
1194
+ const method = tags?.length
1195
+ ? contensis.tags.MigrateTags
1196
+ : contensis.tags.MigrateTagGroups;
1197
+ const [err, result] = await to(method(getBy));
1198
+
1199
+ if (err) logError(err);
1200
+ else {
1201
+ const { tags } = contensis.content.targets[currentProject];
1202
+ await this.HandleFormattingAndOutput(
1203
+ save
1204
+ ? [
1205
+ ...tags.migrateGroups.map(g => g.toJSON()),
1206
+ ...tags.migrateTags.map(t => t.toJSON()),
1207
+ ]
1208
+ : result,
1209
+ () => {}
1210
+ );
1211
+ }
1212
+
1213
+ const tagsToMigrate =
1214
+ (result as any)?.tagsToMigrate?.[currentProject]?.totalCount || 0;
1215
+ const groupsToMigrate = (result?.groupsToMigrate?.[currentProject]
1216
+ ?.totalCount || 0) as number;
1217
+
1218
+ const tagsCommitted =
1219
+ ((result as any)?.tagsResult?.created || 0) +
1220
+ ((result as any)?.tagsResult?.updated || 0);
1221
+
1222
+ const groupsCommitted =
1223
+ (result?.groupsResult?.created || 0) +
1224
+ (result?.groupsResult?.updated || 0);
1225
+ if (
1226
+ !err &&
1227
+ !result.errors?.length &&
1228
+ ((!commit && tagsToMigrate + groupsToMigrate) ||
1229
+ (commit && tagsCommitted + groupsCommitted))
1230
+ ) {
1231
+ log.success(
1232
+ messages.taggroups.imported(
1233
+ currentEnv,
1234
+ commit,
1235
+ commit ? groupsCommitted : groupsToMigrate,
1236
+ commit ? tagsCommitted : tagsToMigrate
1237
+ )
1238
+ );
1239
+ if (!commit) {
1240
+ log.raw(``);
1241
+ log.help(messages.migrate.commitTip());
1242
+ }
1243
+ } else {
1244
+ log.error(
1245
+ messages.taggroups.failedCreate(currentEnv, data?.[0].name),
1246
+ err
1247
+ );
1248
+ }
1249
+ if (tagsCommitted)
1250
+ log.success(messages.tags.imported(currentEnv, commit, tagsCommitted));
1251
+ } else {
1252
+ log.warning(messages.models.noList(currentProject));
1253
+ log.help(messages.connect.tip());
1254
+ }
1255
+ };
1256
+
1257
+ RemoveTagGroup = async (groupId: string, commit = false) => {
1258
+ const { currentEnv, currentProject, log, messages } = this;
1259
+ const contensis = await this.ConnectContensisImport({
1260
+ commit,
1261
+ });
1262
+ if (contensis) {
1263
+ log.line();
1264
+ if (contensis.isPreview) {
1265
+ log.success(messages.migrate.preview('DELETE'));
1266
+ } else {
1267
+ log.warning(messages.migrate.commit('DELETE'));
1268
+ }
1269
+ const result = await contensis.tags.DeleteTagGroups({ id: groupId });
1270
+
1271
+ // print the results to console
1272
+ await this.HandleFormattingAndOutput(result, () => {
1273
+ log.raw('');
1274
+ log.object(result.existing[currentProject].groups?.[0]);
1275
+ });
1276
+ if (result.errors?.length) {
1277
+ log.error(
1278
+ messages.taggroups.failedRemove(currentEnv, groupId),
1279
+ result.errors[0]
1280
+ );
1281
+ } else {
1282
+ log.success(
1283
+ messages.taggroups.removed(currentEnv, groupId, !contensis.isPreview)
1284
+ );
1285
+ if (!commit) {
1286
+ log.raw(``);
1287
+ log.help(messages.migrate.commitTip());
1288
+ }
1289
+ }
1290
+ }
1291
+ };
1292
+
1293
+ PrintTag = async (getBy?: GetTagsArgs, withDependents = false) => {
1294
+ const { currentEnv, log, messages } = this;
1295
+ const contensis = await this.ConnectContensis();
1296
+
1297
+ if (contensis) {
1298
+ // Retrieve tags list for env
1299
+ const [tagsErr, result] = await contensis.tags.GetTags(getBy, {
1300
+ withDependents,
1301
+ });
1302
+
1303
+ if (Array.isArray(result)) {
1304
+ let tags: ICreateTag[] = [];
1305
+ const groups: ICreateTagGroup[] = [];
1306
+ if (withDependents) splitTagsAndGroups(result, tags, groups);
1307
+ else tags = result;
1308
+
1309
+ log.success(messages.tags.list(currentEnv, tags.length));
1310
+
1311
+ if (tags)
1312
+ await this.HandleFormattingAndOutput(result, () => {
1313
+ // print the tags to console
1314
+ for (const tag of tags) {
1315
+ log.raw('');
1316
+ log.object(tag);
1317
+ }
1318
+ if (groups.length) {
1319
+ log.raw('');
1320
+ log.success(messages.taggroups.list(currentEnv, groups.length));
1321
+
1322
+ for (const group of groups) {
1323
+ log.raw('');
1324
+ log.object(group);
1325
+ }
1326
+ }
1327
+ });
1328
+ else log.error(messages.tags.failedGet(currentEnv));
1329
+ }
1330
+
1331
+ if (tagsErr) log.error(messages.tags.noList(currentEnv), tagsErr);
1332
+ }
1333
+ };
1334
+
1335
+ PrintTags = async (getBy?: GetTagsArgs, withDependents = false) => {
1336
+ const { currentEnv, log, messages } = this;
1337
+ const contensis = await this.ConnectContensis();
1338
+
1339
+ if (contensis) {
1340
+ // Retrieve tags list for env
1341
+ const [tagsErr, result] = await contensis.tags.GetTags(getBy, {
1342
+ withDependents,
1343
+ });
1344
+
1345
+ if (Array.isArray(result)) {
1346
+ let tags: Tag[] = [];
1347
+ const groups: TagGroup[] = [];
1348
+ if (withDependents) splitTagsAndGroups(result, tags, groups);
1349
+ else tags = result;
1350
+ log.success(messages.tags.list(currentEnv, tags.length));
1351
+
1352
+ if (!tags.length) log.help(messages.tags.noneExist());
1353
+
1354
+ await this.HandleFormattingAndOutput(result, () => {
1355
+ // print the tags to console
1356
+ for (const { version, ...tag } of tags) {
1357
+ log.raw('');
1358
+ log.object(tag);
1359
+ }
1360
+ if (groups.length) {
1361
+ log.raw('');
1362
+ log.success(messages.taggroups.list(currentEnv, groups.length));
1363
+
1364
+ for (const { version, ...group } of groups) {
1365
+ log.raw('');
1366
+ log.object(group);
1367
+ }
1368
+ }
1369
+ });
1370
+ }
1371
+
1372
+ if (tagsErr) log.error(messages.tags.noList(currentEnv), tagsErr);
1373
+ }
1374
+ };
1375
+
1376
+ ImportTags = async ({
1377
+ commit,
1378
+ fromFile,
1379
+ getBy,
1380
+ data,
1381
+ save,
1382
+ }: {
1383
+ commit: boolean;
1384
+ fromFile?: string;
1385
+ getBy?: GetTagsArgs;
1386
+ data?: ICreateTag[];
1387
+ save?: boolean;
1388
+ }) => {
1389
+ const { currentEnv, currentProject, log, messages } = this;
1390
+
1391
+ const mixedData: {
1392
+ tags: ICreateTag[];
1393
+ tagGroups: ICreateTagGroup[];
1394
+ } = { tags: [], tagGroups: [] };
1395
+
1396
+ if (data) {
1397
+ mixedData.tags = data;
1398
+ mixedData.tagGroups = [...new Set(data.map(t => t.groupId))].map(
1399
+ id =>
1400
+ ({
1401
+ id,
1402
+ }) as ICreateTagGroup
1403
+ );
1404
+ }
1405
+ if (fromFile) {
1406
+ // File may contain mix of tags and tag groups, separate those here
1407
+ const fileData = fromFile ? (await readFileAsJSON(fromFile)) || [] : [];
1408
+ splitTagsAndGroups(fileData, mixedData.tags, mixedData.tagGroups);
1409
+ }
1410
+
1411
+ const contensis = await this.ConnectContensisImport({
1412
+ commit,
1413
+ importDataType: 'tags',
1414
+ mixedData,
1415
+ });
1416
+
1417
+ if (contensis) {
1418
+ log.line();
1419
+ if (contensis.isPreview) {
1420
+ log.success(messages.migrate.preview());
1421
+ } else {
1422
+ log.warning(messages.migrate.commit());
1423
+ }
1424
+
1425
+ contensis.payload.tags = data;
1426
+ const [err, result] = await to(contensis.tags.MigrateTags(getBy));
1427
+
1428
+ if (err) logError(err);
1429
+ else {
1430
+ const { tags } = contensis.content.targets[currentProject];
1431
+ await this.HandleFormattingAndOutput(
1432
+ save
1433
+ ? [
1434
+ ...tags.migrateGroups.map(g => g.toJSON()),
1435
+ ...tags.migrateTags.map(t => t.toJSON()),
1436
+ ]
1437
+ : result,
1438
+ () => {}
1439
+ );
1440
+ }
1441
+ if (
1442
+ !err &&
1443
+ !result.errors?.length &&
1444
+ ((!commit && result.tagsToMigrate[currentProject].totalCount) ||
1445
+ (commit &&
1446
+ (result.tagsResult?.created || result.tagsResult?.updated)))
1447
+ ) {
1448
+ log.success(
1449
+ messages.tags.imported(
1450
+ currentEnv,
1451
+ commit,
1452
+ commit
1453
+ ? (result.tagsResult?.created || 0) +
1454
+ (result.tagsResult?.updated || 0)
1455
+ : (result.tagsToMigrate[currentProject].totalCount as number)
1456
+ )
1457
+ );
1458
+ if (!commit) {
1459
+ log.raw(``);
1460
+ log.help(messages.migrate.commitTip());
1461
+ }
1462
+ } else {
1463
+ log.error(
1464
+ messages.tags.failedCreate(
1465
+ currentEnv,
1466
+ data?.length === 1 ? data?.[0].label['en-GB'] : undefined
1467
+ ),
1468
+ err
1469
+ );
1470
+ }
1471
+ } else {
1472
+ log.warning(messages.models.noList(currentProject));
1473
+ log.help(messages.connect.tip());
1474
+ }
1475
+ };
1476
+
1477
+ RemoveTags = async (getBy: GetTagsArgs, commit = false) => {
1478
+ const { currentEnv, currentProject, log, messages } = this;
1479
+
1480
+ this.contensisOpts.concurrency = 1;
1481
+ const contensis = await this.ConnectContensisImport({
1482
+ commit,
1483
+ importDataType: 'user-input', // 'user-input' import type does not require a source cms
1484
+ });
1485
+ if (contensis) {
1486
+ log.line();
1487
+ if (contensis.isPreview) {
1488
+ log.success(messages.migrate.preview('DELETE'));
1489
+ } else {
1490
+ log.warning(messages.migrate.commit('DELETE'));
1491
+ }
1492
+ const result = await contensis.tags.DeleteTags(getBy);
1493
+ const deleted =
1494
+ (commit
1495
+ ? result.tagsResult?.deleted
1496
+ : (result.tagsToMigrate[currentProject].delete as number)) || 0;
1497
+
1498
+ // print the results to console
1499
+ await this.HandleFormattingAndOutput(result, () => {
1500
+ const tags = result.existing[currentProject].tags;
1501
+ for (const { version, ...tag } of tags || []) {
1502
+ const { status, error } =
1503
+ result.tagsToMigrate.tagIds[tag.groupId][tag.id][currentProject];
1504
+ log.raw('');
1505
+ log.object({
1506
+ ...tag,
1507
+ status,
1508
+ error,
1509
+ });
1510
+ }
1511
+ });
1512
+ if (result.errors?.length) {
1513
+ log.error(
1514
+ messages.tags.failedRemove(currentEnv, result.errors.length),
1515
+ result.errors
1516
+ );
1517
+ } else {
1518
+ log.success(
1519
+ messages.tags.removed(currentEnv, deleted, !contensis.isPreview)
1520
+ );
1521
+ if (!commit && deleted) {
1522
+ log.raw(``);
1523
+ log.help(messages.migrate.commitTip());
1524
+ }
1525
+ }
1526
+ }
1527
+ };
1528
+
1075
1529
  PrintWorkflows = async () => {
1076
1530
  const { currentEnv, log, messages } = this;
1077
1531
  const contensis = await this.ConnectContensis();
@@ -1784,6 +2238,8 @@ class ContensisCli {
1784
2238
 
1785
2239
  RemoveEntries = async (commit = false) => {
1786
2240
  const { currentEnv, currentProject, log, messages } = this;
2241
+
2242
+ this.contensisOpts.concurrency = 1;
1787
2243
  const contensis = await this.ConnectContensisImport({
1788
2244
  commit,
1789
2245
  importDataType: 'user-input', // 'user-input' import type does not require a source cms
@@ -1812,7 +2268,7 @@ class ContensisCli {
1812
2268
  log.success(messages.entries.removed(currentEnv, commit));
1813
2269
  if (!commit) {
1814
2270
  log.raw(``);
1815
- log.help(messages.entries.commitTip());
2271
+ log.help(messages.migrate.commitTip());
1816
2272
  }
1817
2273
  } else {
1818
2274
  log.error(messages.entries.failedRemove(currentEnv), err);
@@ -1950,7 +2406,7 @@ class ContensisCli {
1950
2406
  );
1951
2407
  if (!commit) {
1952
2408
  log.raw(``);
1953
- log.help(messages.entries.commitTip());
2409
+ log.help(messages.migrate.commitTip());
1954
2410
  }
1955
2411
  } else {
1956
2412
  log.error(messages.entries.failedImport(currentEnv), err);
@@ -2031,7 +2487,7 @@ class ContensisCli {
2031
2487
  );
2032
2488
  if (!commit) {
2033
2489
  log.raw(``);
2034
- log.help(messages.entries.commitTip());
2490
+ log.help(messages.migrate.commitTip());
2035
2491
  }
2036
2492
  } else {
2037
2493
  log.error(messages.entries.failedImport(currentEnv), err);
@@ -2113,7 +2569,7 @@ class ContensisCli {
2113
2569
  );
2114
2570
  if (!commit) {
2115
2571
  log.raw(``);
2116
- log.help(messages.entries.commitTip());
2572
+ log.help(messages.migrate.commitTip());
2117
2573
  }
2118
2574
  } else {
2119
2575
  log.error(messages.entries.update.failed(currentEnv), err);
package/src/shell.ts CHANGED
@@ -142,7 +142,7 @@ class ContensisShell {
142
142
  'login',
143
143
  'list projects',
144
144
  'set project',
145
- ...(this.env?.projects || []).map(project => `set project ${project}`)
145
+ ...(this.env?.projects || []).map(project => `set project ${project.id}`)
146
146
  );
147
147
  if (userId)
148
148
  availableCommands.push(
@@ -150,6 +150,9 @@ class ContensisShell {
150
150
  'create key',
151
151
  'create project',
152
152
  'create role',
153
+ 'create tag',
154
+ 'create taggroup',
155
+ 'create tags in',
153
156
  'diff models',
154
157
  'execute block action release',
155
158
  'execute block action makelive',
@@ -167,6 +170,8 @@ class ContensisShell {
167
170
  'get proxy',
168
171
  'get renderer',
169
172
  'get role',
173
+ 'get tag',
174
+ 'get taggroup',
170
175
  'get token',
171
176
  'get version',
172
177
  'get webhook',
@@ -176,6 +181,8 @@ class ContensisShell {
176
181
  'import entries',
177
182
  'import models',
178
183
  'import nodes',
184
+ 'import tags',
185
+ 'import taggroups',
179
186
  'list blocks',
180
187
  'list contenttypes',
181
188
  'list components',
@@ -184,6 +191,9 @@ class ContensisShell {
184
191
  'list proxies',
185
192
  'list renderers',
186
193
  'list roles',
194
+ 'list tags',
195
+ 'list tags in',
196
+ 'list taggroups',
187
197
  'list webhooks',
188
198
  'list workflows',
189
199
  'push asset',
@@ -194,6 +204,9 @@ class ContensisShell {
194
204
  'remove entries',
195
205
  'remove nodes',
196
206
  'remove role',
207
+ 'remove tags',
208
+ 'remove tags in',
209
+ 'remove taggroup',
197
210
  'set project name',
198
211
  'set project description',
199
212
  'set role name',