contensis-cli 1.4.1 → 1.4.2-beta.1
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.
- package/README.md +360 -1
- package/dist/commands/create.js +83 -2
- package/dist/commands/create.js.map +2 -2
- package/dist/commands/get.js +33 -1
- package/dist/commands/get.js.map +2 -2
- package/dist/commands/import.js +62 -0
- package/dist/commands/import.js.map +2 -2
- package/dist/commands/list.js +48 -1
- package/dist/commands/list.js.map +2 -2
- package/dist/commands/remove.js +50 -1
- package/dist/commands/remove.js.map +2 -2
- package/dist/localisation/en-GB.js +38 -8
- package/dist/localisation/en-GB.js.map +2 -2
- package/dist/providers/HttpProvider.js +4 -4
- package/dist/providers/HttpProvider.js.map +2 -2
- package/dist/providers/ManifestProvider.js +2 -2
- package/dist/providers/ManifestProvider.js.map +2 -2
- package/dist/providers/SessionCacheProvider.js +6 -3
- package/dist/providers/SessionCacheProvider.js.map +2 -2
- package/dist/providers/file-provider.js +2 -2
- package/dist/providers/file-provider.js.map +2 -2
- package/dist/services/ContensisCliService.js +370 -22
- package/dist/services/ContensisCliService.js.map +3 -3
- package/dist/shell.js +14 -1
- package/dist/shell.js.map +2 -2
- package/dist/util/assert.js +62 -0
- package/dist/util/assert.js.map +7 -0
- package/dist/util/index.js +11 -36
- package/dist/util/index.js.map +2 -2
- package/dist/util/logger.js +17 -6
- package/dist/util/logger.js.map +2 -2
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +3 -3
- package/src/commands/create.ts +118 -0
- package/src/commands/get.ts +48 -1
- package/src/commands/import.ts +86 -0
- package/src/commands/list.ts +80 -1
- package/src/commands/remove.ts +91 -1
- package/src/localisation/en-GB.ts +62 -9
- package/src/models/Cache.d.ts +2 -1
- package/src/providers/HttpProvider.ts +1 -1
- package/src/providers/ManifestProvider.ts +1 -1
- package/src/providers/SessionCacheProvider.ts +6 -1
- package/src/providers/file-provider.ts +1 -1
- package/src/services/ContensisCliService.ts +480 -24
- package/src/shell.ts +14 -1
- package/src/util/assert.ts +35 -0
- package/src/util/index.ts +15 -36
- package/src/util/logger.ts +18 -6
- 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 {
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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 =>
|
|
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
|
|
936
|
-
p as any
|
|
937
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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',
|