contensis-cli 1.0.0-beta.18 → 1.0.0-beta.20
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/dist/providers/CredentialProvider.js +28 -4
- package/dist/providers/CredentialProvider.js.map +3 -3
- package/dist/providers/SessionCacheProvider.js +1 -1
- package/dist/providers/SessionCacheProvider.js.map +2 -2
- package/dist/services/ContensisCliService.js +0 -3
- package/dist/services/ContensisCliService.js.map +2 -2
- package/dist/shell.js +1 -1
- package/dist/shell.js.map +2 -2
- package/dist/util/index.js +5 -2
- package/dist/util/index.js.map +3 -3
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +1 -1
- package/src/providers/CredentialProvider.ts +29 -3
- package/src/providers/SessionCacheProvider.ts +1 -1
- package/src/services/ContensisCliService.ts +1 -1
- package/src/shell.ts +1 -1
- package/src/util/index.ts +12 -6
- package/src/version.ts +1 -1
|
@@ -27,12 +27,12 @@ __export(CredentialProvider_exports, {
|
|
|
27
27
|
default: () => CredentialProvider_default
|
|
28
28
|
});
|
|
29
29
|
module.exports = __toCommonJS(CredentialProvider_exports);
|
|
30
|
-
var import_keytar = __toESM(require("keytar"));
|
|
31
30
|
var import_await_to_js = __toESM(require("await-to-js"));
|
|
32
31
|
var import_logger = require("../util/logger");
|
|
33
32
|
const SERVICE_NAME = "contensis-cli";
|
|
34
33
|
class CredentialProvider {
|
|
35
34
|
serviceId;
|
|
35
|
+
keytar;
|
|
36
36
|
userId = "";
|
|
37
37
|
passwordFallback;
|
|
38
38
|
current = null;
|
|
@@ -42,9 +42,33 @@ class CredentialProvider {
|
|
|
42
42
|
this.userId = userId;
|
|
43
43
|
this.passwordFallback = passwordFallback;
|
|
44
44
|
}
|
|
45
|
+
Import = async () => {
|
|
46
|
+
try {
|
|
47
|
+
this.keytar = (await import("keytar")).default;
|
|
48
|
+
} catch (ex) {
|
|
49
|
+
this.keytar = {
|
|
50
|
+
findCredentials: async () => {
|
|
51
|
+
throw ex;
|
|
52
|
+
},
|
|
53
|
+
getPassword: async () => {
|
|
54
|
+
throw ex;
|
|
55
|
+
},
|
|
56
|
+
findPassword: async () => {
|
|
57
|
+
throw ex;
|
|
58
|
+
},
|
|
59
|
+
setPassword: async () => {
|
|
60
|
+
throw ex;
|
|
61
|
+
},
|
|
62
|
+
deletePassword: async () => {
|
|
63
|
+
throw ex;
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
};
|
|
45
68
|
Init = async () => {
|
|
69
|
+
await this.Import();
|
|
46
70
|
const [err, stored] = await (0, import_await_to_js.default)(
|
|
47
|
-
|
|
71
|
+
this.keytar.findCredentials(this.serviceId)
|
|
48
72
|
);
|
|
49
73
|
if (err && this.passwordFallback) {
|
|
50
74
|
this.current = {
|
|
@@ -69,7 +93,7 @@ class CredentialProvider {
|
|
|
69
93
|
};
|
|
70
94
|
Save = async (password) => {
|
|
71
95
|
const [err] = await (0, import_await_to_js.default)(
|
|
72
|
-
|
|
96
|
+
this.keytar.setPassword(this.serviceId, this.userId, password)
|
|
73
97
|
);
|
|
74
98
|
return err && !this.passwordFallback ? err : true;
|
|
75
99
|
};
|
|
@@ -79,7 +103,7 @@ class CredentialProvider {
|
|
|
79
103
|
return true;
|
|
80
104
|
} else {
|
|
81
105
|
const [err] = await (0, import_await_to_js.default)(
|
|
82
|
-
|
|
106
|
+
this.keytar.deletePassword(this.serviceId, this.userId)
|
|
83
107
|
);
|
|
84
108
|
import_logger.Logger.warning(`${this.serviceId} - invalid credentials removed`);
|
|
85
109
|
return err || true;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/providers/CredentialProvider.ts"],
|
|
4
|
-
"sourcesContent": ["import keytar from 'keytar';\nimport to from 'await-to-js';\nimport { Logger } from '~/util/logger';\n\nconst SERVICE_NAME = 'contensis-cli';\n\ninterface Remarks {\n secure: boolean;\n}\n\nclass CredentialProvider {\n private serviceId: string;\n private userId: string = '';\n private passwordFallback?: string;\n\n current: {\n account: string;\n password: string;\n } | null = null;\n remarks: Remarks = { secure: false };\n\n constructor(\n { userId, alias }: { userId: string; alias?: string },\n passwordFallback?: string\n ) {\n this.serviceId =\n typeof alias !== 'undefined' ? `${SERVICE_NAME}_${alias}` : SERVICE_NAME;\n this.userId = userId;\n this.passwordFallback = passwordFallback;\n }\n\n Init = async (): Promise<[Error, CredentialProvider]> => {\n const [err, stored] = (await to(\n keytar.findCredentials(this.serviceId)\n )) as [\n Error,\n {\n account: string;\n password: string;\n }[]\n ];\n if (err && this.passwordFallback) {\n this.current = {\n account: this.userId,\n password: this.passwordFallback,\n };\n }\n if (!err) {\n this.remarks = { secure: true };\n this.current =\n stored?.find(\n u => u?.account?.toLowerCase() === this.userId.toLowerCase()\n ) || null;\n\n if (!this.current && this.passwordFallback) {\n await this.Save(this.passwordFallback);\n return await this.Init();\n }\n }\n return [err, this];\n };\n\n Save = async (password: string) => {\n const [err] = await to(\n keytar.setPassword(this.serviceId, this.userId, password)\n );\n\n // if (!err) Logger.info(`${this.serviceId} - credentials saved`);\n return err && !this.passwordFallback ? err : true;\n };\n\n Delete = async () => {\n if (this.passwordFallback) {\n this.passwordFallback = undefined;\n return true;\n } else {\n const [err] = await to(\n keytar.deletePassword(this.serviceId, this.userId)\n );\n\n Logger.warning(`${this.serviceId} - invalid credentials removed`);\n return err || true;\n }\n };\n\n // GetPassword = async () => {\n // const [err, password] = await to(\n // keytar.getPassword(this.serviceId, this.userId)\n // );\n\n // return err || password;\n // };\n}\n\nexport default CredentialProvider;\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
6
|
-
"names": ["to"
|
|
4
|
+
"sourcesContent": ["import keytar from 'keytar';\nimport to from 'await-to-js';\nimport { Logger } from '~/util/logger';\n\nconst SERVICE_NAME = 'contensis-cli';\n\ninterface Remarks {\n secure: boolean;\n}\n\nclass CredentialProvider {\n private serviceId: string;\n private keytar!: typeof keytar;\n private userId: string = '';\n private passwordFallback?: string;\n\n current: {\n account: string;\n password: string;\n } | null = null;\n remarks: Remarks = { secure: false };\n\n constructor(\n { userId, alias }: { userId: string; alias?: string },\n passwordFallback?: string\n ) {\n this.serviceId =\n typeof alias !== 'undefined' ? `${SERVICE_NAME}_${alias}` : SERVICE_NAME;\n this.userId = userId;\n this.passwordFallback = passwordFallback;\n }\n\n Import = async () => {\n try {\n this.keytar = (await import('keytar')).default;\n } catch (ex) {\n this.keytar = {\n findCredentials: async () => {\n throw ex;\n },\n getPassword: async () => {\n throw ex;\n },\n findPassword: async () => {\n throw ex;\n },\n setPassword: async () => {\n throw ex;\n },\n deletePassword: async () => {\n throw ex;\n },\n };\n }\n };\n\n Init = async (): Promise<[Error, CredentialProvider]> => {\n await this.Import();\n const [err, stored] = (await to(\n this.keytar.findCredentials(this.serviceId)\n )) as [\n Error,\n {\n account: string;\n password: string;\n }[]\n ];\n if (err && this.passwordFallback) {\n this.current = {\n account: this.userId,\n password: this.passwordFallback,\n };\n }\n if (!err) {\n this.remarks = { secure: true };\n this.current =\n stored?.find(\n u => u?.account?.toLowerCase() === this.userId.toLowerCase()\n ) || null;\n\n if (!this.current && this.passwordFallback) {\n await this.Save(this.passwordFallback);\n return await this.Init();\n }\n }\n return [err, this];\n };\n\n Save = async (password: string) => {\n const [err] = await to(\n this.keytar.setPassword(this.serviceId, this.userId, password)\n );\n\n // if (!err) Logger.info(`${this.serviceId} - credentials saved`);\n return err && !this.passwordFallback ? err : true;\n };\n\n Delete = async () => {\n if (this.passwordFallback) {\n this.passwordFallback = undefined;\n return true;\n } else {\n const [err] = await to(\n this.keytar.deletePassword(this.serviceId, this.userId)\n );\n\n Logger.warning(`${this.serviceId} - invalid credentials removed`);\n return err || true;\n }\n };\n\n // GetPassword = async () => {\n // const [err, password] = await to(\n // keytar.getPassword(this.serviceId, this.userId)\n // );\n\n // return err || password;\n // };\n}\n\nexport default CredentialProvider;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,yBAAe;AACf,oBAAuB;AAEvB,MAAM,eAAe;AAMrB,MAAM,mBAAmB;AAAA,EACf;AAAA,EACA;AAAA,EACA,SAAiB;AAAA,EACjB;AAAA,EAER,UAGW;AAAA,EACX,UAAmB,EAAE,QAAQ,MAAM;AAAA,EAEnC,YACE,EAAE,QAAQ,MAAM,GAChB,kBACA;AACA,SAAK,YACH,OAAO,UAAU,cAAc,GAAG,gBAAgB,UAAU;AAC9D,SAAK,SAAS;AACd,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEA,SAAS,YAAY;AACnB,QAAI;AACF,WAAK,UAAU,MAAM,OAAO,WAAW;AAAA,IACzC,SAAS,IAAP;AACA,WAAK,SAAS;AAAA,QACZ,iBAAiB,YAAY;AAC3B,gBAAM;AAAA,QACR;AAAA,QACA,aAAa,YAAY;AACvB,gBAAM;AAAA,QACR;AAAA,QACA,cAAc,YAAY;AACxB,gBAAM;AAAA,QACR;AAAA,QACA,aAAa,YAAY;AACvB,gBAAM;AAAA,QACR;AAAA,QACA,gBAAgB,YAAY;AAC1B,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,OAAO,YAAkD;AACvD,UAAM,KAAK,OAAO;AAClB,UAAM,CAAC,KAAK,MAAM,IAAK,UAAM,mBAAAA;AAAA,MAC3B,KAAK,OAAO,gBAAgB,KAAK,SAAS;AAAA,IAC5C;AAOA,QAAI,OAAO,KAAK,kBAAkB;AAChC,WAAK,UAAU;AAAA,QACb,SAAS,KAAK;AAAA,QACd,UAAU,KAAK;AAAA,MACjB;AAAA,IACF;AACA,QAAI,CAAC,KAAK;AACR,WAAK,UAAU,EAAE,QAAQ,KAAK;AAC9B,WAAK,WACH,iCAAQ;AAAA,QACN,OAAE;AA7EZ;AA6Ee,+CAAG,YAAH,mBAAY,mBAAkB,KAAK,OAAO,YAAY;AAAA;AAAA,YACxD;AAEP,UAAI,CAAC,KAAK,WAAW,KAAK,kBAAkB;AAC1C,cAAM,KAAK,KAAK,KAAK,gBAAgB;AACrC,eAAO,MAAM,KAAK,KAAK;AAAA,MACzB;AAAA,IACF;AACA,WAAO,CAAC,KAAK,IAAI;AAAA,EACnB;AAAA,EAEA,OAAO,OAAO,aAAqB;AACjC,UAAM,CAAC,GAAG,IAAI,UAAM,mBAAAA;AAAA,MAClB,KAAK,OAAO,YAAY,KAAK,WAAW,KAAK,QAAQ,QAAQ;AAAA,IAC/D;AAGA,WAAO,OAAO,CAAC,KAAK,mBAAmB,MAAM;AAAA,EAC/C;AAAA,EAEA,SAAS,YAAY;AACnB,QAAI,KAAK,kBAAkB;AACzB,WAAK,mBAAmB;AACxB,aAAO;AAAA,IACT,OAAO;AACL,YAAM,CAAC,GAAG,IAAI,UAAM,mBAAAA;AAAA,QAClB,KAAK,OAAO,eAAe,KAAK,WAAW,KAAK,MAAM;AAAA,MACxD;AAEA,2BAAO,QAAQ,GAAG,KAAK,yCAAyC;AAChE,aAAO,OAAO;AAAA,IAChB;AAAA,EACF;AASF;AAEA,IAAO,6BAAQ;",
|
|
6
|
+
"names": ["to"]
|
|
7
7
|
}
|
|
@@ -38,7 +38,7 @@ class SessionCacheProvider {
|
|
|
38
38
|
localFilePath;
|
|
39
39
|
cache = {};
|
|
40
40
|
constructor() {
|
|
41
|
-
this.localFilePath = import_path.default.join(
|
|
41
|
+
this.localFilePath = import_path.default.join(process.cwd(), "environments.json");
|
|
42
42
|
this.cache = {
|
|
43
43
|
currentTimestamp: new Date().toISOString(),
|
|
44
44
|
environments: {},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/providers/SessionCacheProvider.ts"],
|
|
4
|
-
"sourcesContent": ["import fs from 'fs';\nimport path from 'path';\nimport clone from 'lodash/cloneDeep';\nimport mergeWith from 'lodash/mergeWith';\nimport unionBy from 'lodash/unionBy';\nimport { isJson, tryParse } from '~/util';\nimport { Logger } from '~/util/logger';\n\nclass SessionCacheProvider {\n private localFilePath: string;\n private cache = {} as SessionCache;\n\n constructor() {\n this.localFilePath = path.join(
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAe;AACf,kBAAiB;AACjB,uBAAkB;AAClB,uBAAsB;AACtB,qBAAoB;AACpB,kBAAiC;AACjC,oBAAuB;AAEvB,MAAM,qBAAqB;AAAA,EACjB;AAAA,EACA,QAAQ,CAAC;AAAA,EAEjB,cAAc;AACZ,SAAK,gBAAgB,YAAAA,QAAK,KAAK,
|
|
4
|
+
"sourcesContent": ["import fs from 'fs';\nimport path from 'path';\nimport clone from 'lodash/cloneDeep';\nimport mergeWith from 'lodash/mergeWith';\nimport unionBy from 'lodash/unionBy';\nimport { isJson, tryParse } from '~/util';\nimport { Logger } from '~/util/logger';\n\nclass SessionCacheProvider {\n private localFilePath: string;\n private cache = {} as SessionCache;\n\n constructor() {\n this.localFilePath = path.join(process.cwd(), 'environments.json');\n this.cache = {\n currentTimestamp: new Date().toISOString(),\n environments: {},\n history: [],\n };\n this.ReadCacheFromDisk();\n }\n\n private ReadCacheFromDisk = () => {\n try {\n if (fs.existsSync(this.localFilePath)) {\n const raw = fs.readFileSync(this.localFilePath, 'utf-8');\n if (isJson(raw)) this.cache = tryParse(raw);\n } else {\n this.WriteCacheToDisk();\n }\n } catch (ex) {\n // Problem reading or parsing cache file\n }\n };\n\n private WriteCacheToDisk = () => {\n try {\n fs.writeFileSync(this.localFilePath, JSON.stringify(this.cache, null, 2));\n } catch (ex) {\n // Problem writing session cache to file\n }\n };\n\n Get = () => clone(this.cache);\n\n Update = (updateContent: Partial<SessionCache>) => {\n try {\n this.cache = mergeWith(this.cache, updateContent, (val, src, key) => {\n if (\n key === 'history' &&\n ((src?.[0] &&\n typeof src[0] === 'object' &&\n 'createdDate' in src[0]) ||\n (val?.[0] && typeof val[0] === 'object' && 'createdDate' in val[0]))\n ) {\n return unionBy(val, src, 'createdDate');\n }\n if (key === 'projects')\n return Array.isArray(val) ? [...new Set([...val, ...src])] : src;\n\n if (Array.isArray(val)) return val.concat(src);\n });\n this.cache.currentTimestamp = new Date().toISOString();\n this.WriteCacheToDisk();\n } catch (ex: any) {\n // Problem merging cache data for update\n Logger.error(`Problem updating environments.json`);\n Logger.error(ex);\n }\n return this.Get();\n };\n\n UpdateEnv = (\n updateContent: Partial<EnvironmentCache>,\n env = this.cache.currentEnvironment\n ) => {\n try {\n const environment = this.cache.environments[env || ''];\n\n this.cache.environments[env || ''] = {\n ...environment,\n ...updateContent,\n };\n this.Update({\n currentEnvironment: env,\n environments: this.cache.environments,\n });\n } catch (ex: any) {\n // Problem merging cache data for update\n Logger.error(\n `Problem updating environment \"${env}\" in environments.json`\n );\n Logger.error(ex);\n }\n return this.Get();\n };\n}\n\nexport default SessionCacheProvider;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,gBAAe;AACf,kBAAiB;AACjB,uBAAkB;AAClB,uBAAsB;AACtB,qBAAoB;AACpB,kBAAiC;AACjC,oBAAuB;AAEvB,MAAM,qBAAqB;AAAA,EACjB;AAAA,EACA,QAAQ,CAAC;AAAA,EAEjB,cAAc;AACZ,SAAK,gBAAgB,YAAAA,QAAK,KAAK,QAAQ,IAAI,GAAG,mBAAmB;AACjE,SAAK,QAAQ;AAAA,MACX,kBAAkB,IAAI,KAAK,EAAE,YAAY;AAAA,MACzC,cAAc,CAAC;AAAA,MACf,SAAS,CAAC;AAAA,IACZ;AACA,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEQ,oBAAoB,MAAM;AAChC,QAAI;AACF,UAAI,UAAAC,QAAG,WAAW,KAAK,aAAa,GAAG;AACrC,cAAM,MAAM,UAAAA,QAAG,aAAa,KAAK,eAAe,OAAO;AACvD,gBAAI,oBAAO,GAAG;AAAG,eAAK,YAAQ,sBAAS,GAAG;AAAA,MAC5C,OAAO;AACL,aAAK,iBAAiB;AAAA,MACxB;AAAA,IACF,SAAS,IAAP;AAAA,IAEF;AAAA,EACF;AAAA,EAEQ,mBAAmB,MAAM;AAC/B,QAAI;AACF,gBAAAA,QAAG,cAAc,KAAK,eAAe,KAAK,UAAU,KAAK,OAAO,MAAM,CAAC,CAAC;AAAA,IAC1E,SAAS,IAAP;AAAA,IAEF;AAAA,EACF;AAAA,EAEA,MAAM,UAAM,iBAAAC,SAAM,KAAK,KAAK;AAAA,EAE5B,SAAS,CAAC,kBAAyC;AACjD,QAAI;AACF,WAAK,YAAQ,iBAAAC,SAAU,KAAK,OAAO,eAAe,CAAC,KAAK,KAAK,QAAQ;AACnE,YACE,QAAQ,eACN,2BAAM,OACN,OAAO,IAAI,OAAO,YAClB,iBAAiB,IAAI,OACpB,2BAAM,OAAM,OAAO,IAAI,OAAO,YAAY,iBAAiB,IAAI,KAClE;AACA,qBAAO,eAAAC,SAAQ,KAAK,KAAK,aAAa;AAAA,QACxC;AACA,YAAI,QAAQ;AACV,iBAAO,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC,IAAI;AAE/D,YAAI,MAAM,QAAQ,GAAG;AAAG,iBAAO,IAAI,OAAO,GAAG;AAAA,MAC/C,CAAC;AACD,WAAK,MAAM,mBAAmB,IAAI,KAAK,EAAE,YAAY;AACrD,WAAK,iBAAiB;AAAA,IACxB,SAAS,IAAP;AAEA,2BAAO,MAAM,oCAAoC;AACjD,2BAAO,MAAM,EAAE;AAAA,IACjB;AACA,WAAO,KAAK,IAAI;AAAA,EAClB;AAAA,EAEA,YAAY,CACV,eACA,MAAM,KAAK,MAAM,uBACd;AACH,QAAI;AACF,YAAM,cAAc,KAAK,MAAM,aAAa,OAAO;AAEnD,WAAK,MAAM,aAAa,OAAO,MAAM;AAAA,QACnC,GAAG;AAAA,QACH,GAAG;AAAA,MACL;AACA,WAAK,OAAO;AAAA,QACV,oBAAoB;AAAA,QACpB,cAAc,KAAK,MAAM;AAAA,MAC3B,CAAC;AAAA,IACH,SAAS,IAAP;AAEA,2BAAO;AAAA,QACL,iCAAiC;AAAA,MACnC;AACA,2BAAO,MAAM,EAAE;AAAA,IACjB;AACA,WAAO,KAAK,IAAI;AAAA,EAClB;AACF;AAEA,IAAO,+BAAQ;",
|
|
6
6
|
"names": ["path", "fs", "clone", "mergeWith", "unionBy"]
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/services/ContensisCliService.ts"],
|
|
4
|
-
"sourcesContent": ["import fs from 'fs';\nimport path from 'path';\nimport fetch from 'node-fetch';\nimport inquirer from 'inquirer';\nimport to from 'await-to-js';\nimport { Component, ContentType } from 'contensis-core-api';\nimport { isPassword, isSharedSecret, isUuid, url } from '~/util';\nimport SessionCacheProvider from '../providers/SessionCacheProvider';\nimport ContensisAuthService from './ContensisAuthService';\nimport CredentialProvider from '~/providers/CredentialProvider';\nimport { logError, Logger } from '~/util/logger';\nimport { LogMessages } from '~/localisation/en-GB';\nimport {\n ContensisMigrationService,\n MigrateRequest,\n PushBlockParams,\n SourceCms,\n logEntriesTable,\n} from 'migratortron';\nimport { Entry } from 'contensis-management-api/lib/models';\n\nimport { csvFormatter } from '~/util/csv.formatter';\nimport { xmlFormatter } from '~/util/xml.formatter';\nimport { jsonFormatter } from '~/util/json.formatter';\nimport { printBlockVersion, printMigrateResult } from '~/util/console.printer';\nimport { readJsonFile } from '~/providers/file-provider';\n\ntype OutputFormat = 'json' | 'csv' | 'xml';\n\ntype OutputOptions = {\n format?: OutputFormat;\n output?: string;\n};\n\ninterface IConnectOptions extends IAuthOptions {\n alias?: string;\n projectId?: string;\n}\n\ninterface IAuthOptions {\n user?: string;\n password?: string;\n clientId?: string;\n sharedSecret?: string;\n}\n\ninterface IImportOptions {\n sourceEnv?: string;\n sourceProjectId?: string;\n}\n\nclass ContensisCli {\n static quit = (error?: Error) => {\n process.removeAllListeners('exit');\n const exitCode = error ? 1 : 0;\n\n console.info(`\\nExiting contensis-cli with exit code: ${exitCode}\\n`);\n process.exit(exitCode);\n };\n\n private command: CliCommand;\n private format?: OutputFormat;\n private output?: string;\n private session: SessionCacheProvider;\n\n contensis?: ContensisMigrationService;\n contensisOpts: Partial<MigrateRequest>;\n contentTypes?: ContentType[];\n components?: Component[];\n currentProject: string;\n\n sourceEnv?: string;\n targetEnv?: string;\n urls:\n | {\n api: string;\n cms: string;\n liveWeb: string;\n previewWeb: string;\n iisWeb: string;\n iisPreviewWeb: string;\n }\n | undefined;\n log = Logger;\n messages = LogMessages;\n\n verb: string;\n noun: string;\n thirdArg: string;\n\n get cache() {\n return this.session.Get();\n }\n get currentEnv() {\n return this.cache.currentEnvironment || '';\n }\n\n set currentEnv(currentEnvironment: string) {\n this.session.Update({ currentEnvironment });\n }\n\n get env() {\n const currentEnvironment = this.currentEnv;\n const environments = this.cache.environments || {};\n\n if (!currentEnvironment) return {} as EnvironmentCache;\n else if (!!environments[currentEnvironment])\n return environments[currentEnvironment];\n else {\n return {\n history: [],\n lastUserId: '',\n projects: [],\n versionStatus: 'latest',\n } as EnvironmentCache;\n }\n }\n\n constructor(\n args: string[],\n outputOpts?: OutputOptions & IConnectOptions & IImportOptions,\n contensisOpts: Partial<MigrateRequest> = {}\n ) {\n // console.log('args: ', JSON.stringify(args, null, 2));\n\n const [exe, script, verb = '', noun = '', ...restArgs] = args;\n this.verb = verb?.toLowerCase();\n this.noun = noun?.toLowerCase();\n this.thirdArg = restArgs?.[0];\n\n const commandText = `${this.verb} ${this.noun} ${\n restArgs ? restArgs.join(' ') : ''\n }`.trim();\n\n this.session = new SessionCacheProvider();\n\n this.contensisOpts = contensisOpts;\n this.format = outputOpts?.format;\n this.output =\n outputOpts?.output && path.join(process.cwd(), outputOpts.output);\n\n const currentEnvironment = outputOpts?.alias || this.currentEnv;\n const environments = this.cache.environments || {};\n this.currentEnv = currentEnvironment;\n\n const env = this.env;\n\n if (outputOpts?.projectId) env.currentProject = outputOpts.projectId;\n if (outputOpts?.user) env.lastUserId = outputOpts.user;\n // setting this in env means passwordFallback is written to environments.json\n if (outputOpts?.password) env.passwordFallback = outputOpts.password;\n if (outputOpts?.clientId) env.lastUserId = outputOpts.clientId;\n if (outputOpts?.sharedSecret)\n env.passwordFallback = outputOpts.sharedSecret;\n\n this.currentProject = env?.currentProject || 'null';\n this.sourceEnv = outputOpts?.sourceEnv || currentEnvironment;\n\n if (currentEnvironment) {\n this.urls = url(currentEnvironment, env?.currentProject || 'website');\n }\n\n this.command = {\n commandText,\n createdDate: new Date().toISOString(),\n createdUserId: env?.lastUserId,\n };\n\n if (currentEnvironment) {\n env.history = [this.command];\n if (commandText) {\n environments[currentEnvironment] = env;\n this.session.Update({\n currentEnvironment,\n environments,\n history: [commandText],\n });\n }\n }\n }\n\n PrintEnvironments = () => {\n const { log, messages } = this;\n const { currentEnvironment, environments = {} } = this.cache;\n const envKeys = Object.keys(environments);\n log.success(messages.envs.found(envKeys.length));\n this.HandleFormattingAndOutput(envKeys, () => {\n // print the envKeys to console\n for (const env of envKeys) {\n console.log(` - ${currentEnvironment === env ? '* ' : ''}${env}`);\n }\n });\n if (envKeys.length === 0 || !currentEnvironment) {\n log.help(messages.envs.tip());\n }\n };\n\n Connect = async (environment: string) => {\n const { log, messages, session } = this;\n\n if (environment) {\n this.currentEnv = environment;\n this.urls = url(environment, 'website');\n\n const [fetchErr, response] = await to(fetch(this.urls.cms));\n if (response && response?.status < 400) {\n log.success(messages.connect.connected(environment));\n session.UpdateEnv(this.env, environment);\n\n if (this.env?.lastUserId) {\n // await this.ConnectContensis();\n await this.PrintProjects();\n } else {\n log.warning(messages.projects.noList());\n log.help(messages.connect.tip());\n }\n } else {\n // Cannot reach environment - status X\n log.error(\n messages.connect.unreachable(this.urls.cms, response?.status || 0)\n );\n }\n } else {\n // No environment alias specified\n log.error(messages.connect.noEnv());\n }\n };\n\n ConnectContensis = async ({ commit = false } = {}) => {\n const { contensisOpts, currentEnv, env, log, messages } = this;\n const userId = env?.lastUserId;\n const isGuidId = userId && isUuid(userId);\n\n if (currentEnv && userId) {\n const credentials = await this.GetCredentials(\n userId,\n env.passwordFallback\n );\n\n const cachedPassword = credentials?.current?.password;\n\n if (cachedPassword) {\n this.contensis = new ContensisMigrationService(\n {\n ...contensisOpts,\n source: {\n url: this.urls?.cms || '',\n username: !isGuidId ? userId : undefined,\n password: !isGuidId ? cachedPassword : undefined,\n clientId: isGuidId ? userId : undefined,\n sharedSecret: isGuidId ? cachedPassword : undefined,\n project: env?.currentProject || '',\n assetHostname: this.urls?.previewWeb,\n },\n concurrency:\n typeof contensisOpts.concurrency !== 'undefined'\n ? contensisOpts.concurrency\n : 3,\n outputProgress: true,\n },\n !commit\n );\n }\n } else {\n if (!currentEnv) log.help(messages.connect.help());\n if (!userId) log.help(messages.connect.tip());\n }\n };\n\n ConnectContensisImport = async ({\n commit,\n source,\n fileData,\n fileDataType,\n }: {\n commit: boolean;\n source: 'contensis' | 'file' | 'input';\n fileData?: any[] | string;\n fileDataType?: 'entries' | 'contentTypes' | 'components';\n }) => {\n const { contensisOpts, currentEnv, env, log, messages, sourceEnv } = this;\n const environments = this.cache.environments || {};\n const sourceEnvironment = environments[sourceEnv || ''] || {};\n const sourceCms =\n ('source' in contensisOpts && contensisOpts.source) ||\n ({} as Partial<SourceCms>);\n const sourceUserId =\n sourceCms.clientId || sourceCms.username || sourceEnvironment.lastUserId;\n const sourceProjectId =\n sourceCms.project || sourceEnvironment.currentProject || 'website';\n const isSourceGuidId = sourceUserId && isUuid(sourceUserId);\n const sourceUrls = url(sourceEnv || '', sourceProjectId);\n\n const sourcePassword =\n sourceCms.sharedSecret ||\n sourceCms.password ||\n sourceEnvironment.passwordFallback;\n\n const targetUserId = env?.lastUserId;\n const isTargetGuidId = targetUserId && isUuid(targetUserId);\n\n if (sourceUserId && currentEnv && targetUserId) {\n const sourceCredentials = await this.GetCredentials(\n sourceUserId,\n sourcePassword,\n sourceEnv\n );\n\n const cachedSourcePassword = sourceCredentials?.current?.password;\n\n const targetCredentials = await this.GetCredentials(\n targetUserId,\n env.passwordFallback\n );\n\n const cachedTargetPassword = targetCredentials?.current?.password;\n\n if (cachedSourcePassword && cachedTargetPassword) {\n if (source === 'file' || source === 'input') {\n this.contensis = new ContensisMigrationService(\n {\n concurrency: 3,\n outputProgress: true,\n ...contensisOpts,\n target: {\n url: this.urls?.cms || '',\n username: !isTargetGuidId ? targetUserId : undefined,\n password: !isTargetGuidId ? cachedTargetPassword : undefined,\n clientId: isTargetGuidId ? targetUserId : undefined,\n sharedSecret: isTargetGuidId ? cachedTargetPassword : undefined,\n targetProjects: [env.currentProject || ''],\n assetHostname: this.urls?.previewWeb,\n },\n ...(fileDataType ? { [fileDataType]: fileData } : {}),\n },\n !commit\n );\n }\n if (source === 'contensis') {\n this.contensis = new ContensisMigrationService(\n {\n concurrency: 3,\n outputProgress: true,\n ...contensisOpts,\n source: {\n url: sourceUrls.cms || '',\n username: !isSourceGuidId ? sourceUserId : undefined,\n password: !isSourceGuidId ? cachedSourcePassword : undefined,\n clientId: isSourceGuidId ? sourceUserId : undefined,\n sharedSecret: isSourceGuidId ? cachedSourcePassword : undefined,\n project: sourceProjectId,\n assetHostname: sourceUrls.previewWeb,\n },\n target: {\n url: this.urls?.cms || '',\n username: !isTargetGuidId ? targetUserId : undefined,\n password: !isTargetGuidId ? cachedTargetPassword : undefined,\n clientId: isTargetGuidId ? targetUserId : undefined,\n sharedSecret: isTargetGuidId ? cachedTargetPassword : undefined,\n targetProjects: [env.currentProject || ''],\n assetHostname: this.urls?.previewWeb,\n },\n },\n !commit\n );\n }\n }\n } else {\n if (!currentEnv) log.help(messages.connect.help());\n if (!targetUserId) log.help(messages.connect.tip());\n }\n };\n\n GetCredentials = async (\n userId: string,\n password?: string,\n currentEnv = this.currentEnv\n ): Promise<CredentialProvider | undefined> => {\n const { env, log, messages } = this;\n if (userId) {\n const [credentialError, credentials] = await new CredentialProvider(\n { userId, alias: currentEnv },\n password\n ).Init();\n\n if (credentialError && !credentials.current) {\n // Log problem with Credential Provider\n log.error(credentialError as any);\n return;\n }\n\n if (credentials.remarks.secure !== true) {\n log.warning(messages.login.insecurePassword());\n } else {\n env.passwordFallback = undefined;\n this.session.UpdateEnv(env, currentEnv);\n }\n return credentials;\n }\n };\n\n Login = async (\n userId: string,\n {\n password = isPassword(this.env.passwordFallback),\n promptPassword = true,\n sharedSecret = isSharedSecret(this.env.passwordFallback),\n silent = false,\n attempt = 1,\n }: {\n password?: string;\n promptPassword?: boolean;\n sharedSecret?: string;\n silent?: boolean;\n attempt?: number;\n } = {}\n ): Promise<string | undefined> => {\n let inputPassword = password || sharedSecret;\n const { log, messages } = this;\n\n if (userId) {\n const { currentEnv, env } = this;\n\n if (currentEnv) {\n const credentials = await this.GetCredentials(userId, inputPassword);\n\n if (credentials) {\n const cachedPassword = isPassword(credentials.current?.password);\n const cachedSecret = isSharedSecret(credentials.current?.password);\n\n if (!cachedPassword && !cachedSecret && promptPassword) {\n // Password prompt\n ({ inputPassword } = await inquirer.prompt([\n {\n type: 'password',\n message: messages.login.passwordPrompt(currentEnv, userId),\n name: 'inputPassword',\n mask: '*',\n prefix: undefined,\n },\n ]));\n }\n\n if (inputPassword || cachedPassword || cachedSecret) {\n const authService = new ContensisAuthService({\n username: userId,\n password: inputPassword || cachedPassword,\n projectId: env?.currentProject || 'website',\n rootUrl: this.urls?.cms || '',\n clientId: userId,\n clientSecret: sharedSecret || cachedSecret,\n });\n\n const [authError, bearerToken] = await to(\n authService.BearerToken()\n );\n\n // Login successful\n if (bearerToken) {\n // Set env vars\n env.authToken = bearerToken;\n env.lastUserId = userId;\n env.passwordFallback =\n credentials.remarks.secure !== true\n ? credentials.current?.password\n : undefined;\n // Persist env before finding projects or doing anything else\n this.session.UpdateEnv(env);\n\n if (!silent) {\n Logger.success(messages.login.success(currentEnv, userId));\n await this.PrintProjects();\n }\n if (inputPassword) await credentials.Save(inputPassword);\n if (sharedSecret) await credentials.Save(sharedSecret);\n } else if (authError) {\n Logger.error(authError.toString());\n // Clear env vars\n env.authToken = '';\n env.lastUserId = '';\n env.passwordFallback = undefined;\n // Persist env to remove cleared values\n this.session.UpdateEnv(env);\n\n // If the auth error was raised using a cached password\n if (\n (cachedPassword || cachedSecret) &&\n credentials.remarks.secure\n ) {\n // Remove any bad stored credential and trigger login prompt again\n await credentials.Delete();\n return await this.Login(userId, { password, sharedSecret });\n } else {\n throw new Error(messages.login.failed(currentEnv, userId));\n }\n }\n\n return env.authToken;\n } else {\n Logger.error(messages.login.passwordPrompt());\n if (attempt < 2)\n return await this.Login(userId, { attempt: attempt + 1 });\n }\n }\n } else {\n // No environment set, use `contensis connect {alias}` first\n Logger.error(messages.login.noEnv());\n }\n } else {\n // No user id specified\n Logger.error(messages.login.noUserId());\n }\n };\n\n PrintProjects = async () => {\n const { currentProject, log, messages, session } = this;\n if (!this.contensis) await this.ConnectContensis();\n\n if (this.contensis) {\n // Retrieve projects list for env\n const [projectsErr, projects] = await to(\n this.contensis.projects.GetSourceProjects()\n );\n\n if (Array.isArray(projects)) {\n // save these projects in cache\n const nextCurrentProject =\n currentProject && currentProject !== 'null'\n ? currentProject\n : projects.some(p => p.id === 'website')\n ? 'website'\n : undefined;\n\n session.UpdateEnv({\n projects: projects.map(p => p.id),\n currentProject: nextCurrentProject,\n });\n\n log.success(messages.projects.list());\n this.HandleFormattingAndOutput(projects, () => {\n // print the projects to console\n for (const project of projects) {\n console.log(\n ` - ${nextCurrentProject === project.id ? '* ' : ''}[${\n project.primaryLanguage\n }] ${project.id}`\n );\n }\n });\n\n if (!this.SetProject(nextCurrentProject))\n log.warning(messages.projects.tip());\n }\n\n if (projectsErr) {\n log.error(messages.projects.noList());\n log.error(projectsErr.message);\n }\n }\n };\n\n SetProject = (projectId = 'website') => {\n const { env, log, messages, session } = this;\n let nextProjectId: string | undefined;\n if (env?.projects.length > 0 && env?.lastUserId) {\n nextProjectId = env.projects.find(\n p => p.toLowerCase() === projectId.toLowerCase()\n );\n if (nextProjectId) {\n env.currentProject = nextProjectId;\n session.UpdateEnv(env);\n log.success(messages.projects.set(projectId));\n } else {\n log.error(messages.projects.failedSet(projectId));\n }\n } else {\n // No projects for currentEnv, try logging in\n log.warning(messages.projects.noList());\n log.help(messages.connect.tip());\n }\n return nextProjectId;\n };\n\n SetVersion = (versionStatus: 'latest' | 'published') => {\n const { env, log, messages, session } = this;\n if (!['latest', 'published'].includes(versionStatus)) {\n log.error(messages.version.invalid(versionStatus));\n return false;\n }\n if (!env) {\n log.help(messages.version.noEnv());\n return false;\n }\n if (env?.projects.length > 0 && env?.lastUserId) {\n session.UpdateEnv({ versionStatus });\n log.success(messages.version.set(this.currentEnv, versionStatus));\n return true;\n } else {\n // No projects for currentEnv, try logging in\n log.warning(messages.projects.noList());\n log.help(messages.connect.tip());\n return false;\n }\n };\n\n HydrateContensis = async () => {\n const { log } = this;\n if (!this.contensis) await this.ConnectContensis();\n\n if (this.contensis) {\n // Retrieve content types list for env\n const [contensisErr, models] = await to(\n this.contensis.models.HydrateContensisRepositories()\n );\n\n if (contensisErr) {\n log.error(contensisErr.message);\n return contensisErr;\n }\n }\n };\n\n PrintApiKeys = async () => {\n const { currentEnv, log, messages } = this;\n if (!this.contensis) await this.ConnectContensis();\n\n if (this.contensis) {\n // Retrieve keys list for env\n const [keysErr, apiKeys] = await this.contensis.apiKeys.GetKeys();\n\n if (Array.isArray(apiKeys)) {\n log.success(messages.keys.list(currentEnv));\n this.HandleFormattingAndOutput(apiKeys, () => {\n // print the keys to console\n for (const {\n id,\n sharedSecret,\n name,\n description,\n dateModified,\n modifiedBy,\n } of apiKeys) {\n console.log(\n ` - ${name}${\n description ? ` (${description})` : ''\n } [${dateModified.toString().substring(0, 10)} ${modifiedBy}]`\n );\n console.log(` ${id}`);\n console.log(` ${sharedSecret}`);\n }\n });\n }\n\n if (keysErr) {\n log.error(messages.keys.noList(currentEnv));\n log.error(jsonFormatter(keysErr));\n }\n }\n };\n\n CreateApiKey = async (name: string, description?: string) => {\n const { currentEnv, log, messages } = this;\n if (!this.contensis) await this.ConnectContensis();\n\n if (this.contensis) {\n const [err, key] = await this.contensis.apiKeys.CreateKey(\n name,\n description\n );\n\n if (key) {\n log.success(messages.keys.created(currentEnv, name));\n\n // print the key details to console\n console.log(\n ` - ${key.name}${\n key.description ? ` (${key.description})` : ''\n } [${key.dateModified.toString().substring(0, 10)} ${key.modifiedBy}]`\n );\n console.log(` - id: ${key.id}`);\n console.log(` - sharedSecret: ${key.sharedSecret}`);\n }\n console.log('');\n\n if (err) {\n log.error(messages.keys.failedCreate(currentEnv, name), err);\n }\n }\n };\n\n RemoveApiKey = async (id: string) => {\n const { currentEnv, log, messages } = this;\n if (!this.contensis) await this.ConnectContensis({ commit: true });\n\n if (this.contensis) {\n const [err, key] = await this.contensis.apiKeys.RemoveKey(id);\n\n if (!err) {\n log.success(messages.keys.removed(currentEnv, id));\n console.log('');\n } else {\n log.error(messages.keys.failedRemove(currentEnv, id), err);\n }\n }\n };\n\n GetContentTypes = async () => {\n const { currentProject, log, messages } = this;\n let err;\n if (!this.contensis) err = await this.HydrateContensis();\n\n if (err) log.error(messages.contenttypes.noList(currentProject));\n if (this.contensis) {\n this.contentTypes = this.contensis.models.contentTypes();\n this.components = this.contensis.models.components();\n } else {\n log.warning(messages.contenttypes.noList(currentProject));\n }\n };\n\n PrintContentTypes = async () => {\n const { currentProject, log, messages } = this;\n await this.GetContentTypes();\n if (this.contensis) {\n // Retrieve content types list for env\n const { contentTypes } = this;\n\n if (Array.isArray(contentTypes)) {\n log.success(messages.contenttypes.list(currentProject));\n this.HandleFormattingAndOutput(contentTypes, () => {\n // print the content types to console\n for (const contentType of contentTypes) {\n const fieldsLength = contentType.fields?.length || 0;\n console.log(\n ` - ${contentType.id} [${fieldsLength} field${\n fieldsLength !== 1 ? 's' : ''\n }]`\n );\n }\n });\n }\n }\n };\n\n PrintContentType = async (contentTypeId: string) => {\n const { currentProject, log, messages } = this;\n await this.GetContentTypes();\n if (this.contensis) {\n // Retrieve content types list for env\n const { contentTypes } = this;\n\n if (Array.isArray(contentTypes)) {\n const contentType = contentTypes.find(\n c => c.id.toLowerCase() === contentTypeId.toLowerCase()\n );\n if (contentType) {\n log.success(\n messages.contenttypes.get(currentProject, contentType.id)\n );\n // print the content type to console\n this.HandleFormattingAndOutput(contentType, log.object);\n } else {\n log.error(\n messages.contenttypes.failedGet(currentProject, contentTypeId)\n );\n }\n }\n }\n };\n\n RemoveContentTypes = async (contentTypeIds: string[], commit = false) => {\n const { currentProject, log, messages } = this;\n if (!this.contensis)\n await this.ConnectContensisImport({\n source: 'input',\n commit,\n });\n if (this.contensis) {\n const [err, result] = await this.contensis.DeleteContentTypes(\n contentTypeIds\n );\n\n if (err) {\n log.error(\n messages.contenttypes.failedRemove(\n currentProject,\n contentTypeIds.join('\", \"')\n ),\n err\n );\n } else {\n log.success(\n messages.contenttypes.removed(\n currentProject,\n contentTypeIds.join('\", \"'),\n !this.contensis.isPreview\n )\n );\n // print the results to console\n this.HandleFormattingAndOutput(result, () =>\n log.object(jsonFormatter(result))\n );\n }\n }\n };\n\n ImportContentTypes = async (\n {\n commit,\n fromFile,\n }: {\n commit: boolean;\n fromFile: string;\n },\n contentTypeIds: string[] = []\n ) => {\n const { currentProject, log, messages } = this;\n\n let fileData = fromFile ? readJsonFile<ContentType[]>(fromFile) || [] : [];\n if (typeof fileData === 'string')\n throw new Error(`Import file format must be of type JSON`);\n\n if (!Array.isArray(fileData)) fileData = [fileData];\n\n await this.ConnectContensisImport({\n commit,\n source: fromFile ? 'file' : 'contensis',\n });\n\n if (this.contensis) {\n // Pass each content type to the target repo\n for (const contentType of fileData) {\n // Fix invalid data\n contentType.projectId = currentProject;\n delete contentType.uuid;\n\n const [err, created, createStatus] =\n await this.contensis.models.targetRepos[\n currentProject\n ].repo.UpsertContentType(false, contentType);\n\n if (err) log.error(err.message, err);\n if (createStatus) {\n log.success(\n messages.contenttypes.created(\n currentProject,\n contentType.id,\n createStatus\n )\n );\n // print the content type to console\n this.HandleFormattingAndOutput(contentType, () => {});\n }\n }\n }\n };\n\n PrintComponents = async () => {\n const { currentProject, log, messages } = this;\n await this.GetContentTypes();\n if (this.contensis) {\n // Retrieve components list for env\n const { components } = this;\n\n if (Array.isArray(components)) {\n log.success(messages.components.list(currentProject));\n\n this.HandleFormattingAndOutput(components, () => {\n // print the components to console\n for (const component of components) {\n const fieldsLength = component.fields?.length || 0;\n console.log(\n ` - ${component.id} [${fieldsLength} field${\n fieldsLength !== 1 ? 's' : ''\n }]`\n );\n }\n });\n }\n }\n };\n\n PrintComponent = async (componentId: string) => {\n const { currentProject, log, messages } = this;\n await this.GetContentTypes();\n if (this.contensis) {\n // Retrieve content types list for env\n const { components } = this;\n\n if (Array.isArray(components)) {\n const component = components.find(\n c => c.id.toLowerCase() === componentId.toLowerCase()\n );\n if (component) {\n log.success(messages.components.get(currentProject, component.id));\n // print the component to console\n this.HandleFormattingAndOutput(component, log.object);\n } else {\n log.error(messages.components.failedGet(currentProject, componentId));\n }\n }\n }\n };\n\n RemoveComponents = async (componentIds: string[], commit = false) => {\n const { currentProject, log, messages } = this;\n if (!this.contensis)\n await this.ConnectContensisImport({\n source: 'input',\n commit,\n });\n if (this.contensis) {\n const [err, result] = await this.contensis.DeleteContentTypes(\n undefined,\n componentIds\n );\n\n if (err) {\n log.error(\n messages.components.failedRemove(\n currentProject,\n componentIds.join('\", \"')\n ),\n err\n );\n } else {\n log.success(\n messages.components.removed(\n currentProject,\n componentIds.join('\", \"'),\n !this.contensis.isPreview\n )\n );\n // print the results to console\n this.HandleFormattingAndOutput(result, () =>\n log.info(jsonFormatter(result))\n );\n }\n }\n };\n\n ImportComponents = async (\n {\n commit,\n fromFile,\n }: {\n commit: boolean;\n fromFile: string;\n },\n componentIds: string[] = []\n ) => {\n const { currentProject, log, messages } = this;\n\n let fileData = fromFile ? readJsonFile<Component[]>(fromFile) || [] : [];\n if (typeof fileData === 'string')\n throw new Error(`Import file format must be of type JSON`);\n\n if (!Array.isArray(fileData)) fileData = [fileData];\n\n await this.ConnectContensisImport({\n commit,\n source: fromFile ? 'file' : 'contensis',\n });\n\n if (this.contensis) {\n // Pass each component to the target repo\n for (const component of fileData) {\n // Fix invalid data\n component.projectId = currentProject;\n delete component.uuid;\n\n const [err, created, createStatus] =\n await this.contensis.models.targetRepos[\n currentProject\n ].repo.UpsertComponent(false, component);\n\n if (err) log.error(err.message, err);\n if (createStatus) {\n log.success(\n messages.components.created(\n currentProject,\n component.id,\n createStatus\n )\n );\n // print the component to console\n this.HandleFormattingAndOutput(component, () => {});\n }\n }\n }\n };\n\n RemoveEntry = async (id: string, commit = false) => {\n const { currentEnv, log, messages } = this;\n if (!this.contensis)\n await this.ConnectContensisImport({\n source: 'input',\n commit,\n });\n\n if (this.contensis) {\n if (this.contensis.isPreview) {\n console.log(log.successText(` -- PREVIEW -- `));\n } else {\n console.log(log.warningText(` *** COMMITTING DELETE *** `));\n }\n const [err, result] = await this.contensis.DeleteEntries();\n if (result)\n this.HandleFormattingAndOutput(result, () => {\n // print the migrateResult to console\n printMigrateResult(this, result, { action: 'delete' });\n });\n if (\n !err &&\n ((!commit &&\n Object.values(result.entriesToMigrate)?.[0].totalCount > 0) ||\n (commit && result.migrateResult?.deleted))\n ) {\n log.success(messages.entries.removed(currentEnv, id, commit));\n if (!commit) log.help(messages.entries.commitTip());\n } else {\n log.error(messages.entries.failedRemove(currentEnv, id), err);\n if (!Object.values(result.entriesToMigrate)?.[0].totalCount)\n log.help(messages.entries.notFound(id));\n }\n }\n };\n\n GetEntries = async ({\n withDependents = false,\n }: {\n withDependents?: boolean;\n }) => {\n const { currentProject, log, messages } = this;\n await this.ConnectContensis();\n\n if (this.contensis) {\n log.line();\n const entries = await this.contensis.GetEntries({ withDependents });\n this.HandleFormattingAndOutput(entries, () =>\n // print the entries to console\n logEntriesTable(\n entries,\n currentProject,\n this.contensis?.payload.query?.fields\n )\n );\n } else {\n log.warning(messages.contenttypes.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n ImportEntries = async ({\n commit,\n fromFile,\n }: {\n commit: boolean;\n fromFile: string;\n }) => {\n const { currentProject, log, messages } = this;\n\n const fileData = fromFile ? readJsonFile<Entry[]>(fromFile) || [] : [];\n if (typeof fileData === 'string')\n throw new Error(`Import file format must be of type JSON`);\n\n await this.ConnectContensisImport({\n commit,\n source: fromFile ? 'file' : 'contensis',\n fileData,\n fileDataType: 'entries',\n });\n\n if (this.contensis) {\n log.line();\n if (this.contensis.isPreview) {\n console.log(log.successText(` -- IMPORT PREVIEW -- `));\n } else {\n console.log(log.warningText(` *** COMMITTING IMPORT *** `));\n }\n\n const [migrateErr, migrateResult] = await this.contensis.MigrateEntries();\n\n if (migrateErr) logError(migrateErr);\n else\n this.HandleFormattingAndOutput(migrateResult, () => {\n // print the migrateResult to console\n printMigrateResult(this, migrateResult);\n });\n } else {\n log.warning(messages.contenttypes.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n PrintWebhookSubscriptions = async (\n subscriptionIds?: string[],\n name?: string\n ) => {\n const { currentEnv, log, messages } = this;\n if (!this.contensis) await this.ConnectContensis();\n if (this.contensis) {\n // Retrieve webhooks list for env\n const [webhooksErr, webhooks] =\n await this.contensis.subscriptions.webhooks.GetSubscriptions();\n\n const filteredResults =\n typeof name === 'string'\n ? webhooks.filter(w =>\n w.name?.toLowerCase().includes(name.toLowerCase())\n )\n : Array.isArray(subscriptionIds)\n ? webhooks.filter(w => subscriptionIds?.some(id => id === w.id))\n : webhooks;\n\n if (Array.isArray(filteredResults)) {\n this.HandleFormattingAndOutput(filteredResults, () => {\n // print the keys to console\n log.success(messages.webhooks.list(currentEnv));\n for (const {\n id,\n description,\n method,\n name,\n version,\n url,\n } of filteredResults) {\n console.log(\n ` - ${name}${\n description ? ` (${description})` : ''\n } [${version.modified.toString().substring(0, 10)} ${\n version.modifiedBy\n }]`\n );\n console.log(` ${id}`);\n console.log(` [${method}] ${url}`);\n }\n console.log('');\n });\n }\n\n if (webhooksErr) {\n log.error(messages.webhooks.noList(currentEnv));\n log.error(jsonFormatter(webhooksErr));\n }\n }\n };\n\n PrintBlocks = async () => {\n const { currentEnv, env, log, messages } = this;\n if (!this.contensis) await this.ConnectContensis();\n if (this.contensis) {\n // Retrieve blocks list for env\n const [err, blocks] = await this.contensis.blocks.GetBlocks();\n\n if (Array.isArray(blocks)) {\n this.HandleFormattingAndOutput(blocks, () => {\n // print the blocks to console\n log.success(messages.blocks.list(currentEnv, env.currentProject));\n for (const {\n id,\n description,\n branches,\n liveVersion,\n madeLive,\n versionsSinceLive,\n } of blocks) {\n console.log(\n ` - ${id}${description ? ` (${description})` : ''}${\n madeLive\n ? ` [${madeLive.toString().substring(0, 10)} v${liveVersion}]`\n : ''\n }${\n versionsSinceLive\n ? log.warningText(` +${versionsSinceLive}`)\n : ''\n }`\n );\n for (const branch of branches)\n console.log(\n log.infoText(` [${branch.id}]: ${branch.status}`)\n );\n }\n });\n }\n\n if (err) {\n log.error(messages.blocks.noList(currentEnv));\n log.error(jsonFormatter(err));\n }\n }\n };\n\n PrintBlockVersions = async (\n blockId: string,\n branch: string,\n version: string\n ) => {\n const { currentEnv, env, log, messages } = this;\n if (!this.contensis) await this.ConnectContensis();\n if (this.contensis) {\n // Retrieve block version\n const [err, blocks] = await this.contensis.blocks.GetBlockVersions(\n blockId,\n branch,\n version\n );\n\n if (blocks) {\n this.HandleFormattingAndOutput(blocks, () => {\n // print the version detail to console\n log.success(\n messages.blocks.get(blockId, currentEnv, env.currentProject)\n );\n for (const block of blocks)\n printBlockVersion(\n this,\n block,\n !version\n ? {\n showImage: false,\n showSource: true,\n showStaticPaths: false,\n showStatus: false,\n }\n : undefined\n );\n });\n }\n\n if (err) {\n log.error(messages.blocks.noList(currentEnv, env.currentProject));\n log.error(jsonFormatter(err));\n }\n }\n };\n\n PushBlock = async (block: PushBlockParams) => {\n const { currentEnv, env, log, messages } = this;\n\n // Output request to console\n messages.blocks.tryPush(\n block.id,\n block.source.branch,\n currentEnv,\n env.currentProject\n );\n console.log(jsonFormatter(block));\n\n if (!this.contensis) await this.ConnectContensis();\n if (this.contensis) {\n // Push new block version\n const [err, blockVersion] = await this.contensis.blocks.PushBlockVersion(\n block\n );\n if (!err) {\n log.success(\n messages.blocks.pushed(\n block.id,\n block.source.branch,\n currentEnv,\n env.currentProject\n )\n );\n console.log(jsonFormatter(blockVersion));\n }\n if (blockVersion) {\n this.HandleFormattingAndOutput(blockVersion, () => {\n // print the version detail to console\n printBlockVersion(this, blockVersion);\n });\n }\n if (err)\n throw new Error(\n messages.blocks.failedPush(block.id, currentEnv, env.currentProject)\n );\n }\n };\n\n ReleaseBlock = async (blockId: string, version: string) => {\n const { currentEnv, env, log, messages } = this;\n if (!this.contensis) await this.ConnectContensis();\n if (this.contensis) {\n // Retrieve block version\n const [err, blockVersion] = await this.contensis.blocks.BlockAction(\n blockId,\n 'release',\n version\n );\n\n if (blockVersion) {\n this.HandleFormattingAndOutput(blockVersion, () => {\n // print the version detail to console\n log.success(\n messages.blocks.released(blockId, currentEnv, env.currentProject)\n );\n printBlockVersion(this, blockVersion);\n });\n }\n\n if (err) {\n log.error(\n messages.blocks.failedRelease(blockId, currentEnv, env.currentProject)\n );\n log.error(jsonFormatter(err));\n }\n }\n };\n\n PrintBlockLogs = async (\n blockId: string,\n branch: string,\n version: string,\n dataCenter: 'hq' | 'manchester' | 'london'\n ) => {\n const { currentEnv, env, log, messages } = this;\n if (!this.contensis) await this.ConnectContensis();\n if (this.contensis) {\n // Retrieve block logs\n log.success(\n messages.blocks.getLogs(blockId, branch, currentEnv, env.currentProject)\n );\n\n const [err, blockLogs] = await this.contensis.blocks.GetBlockLogs({\n blockId,\n branchId: branch,\n version,\n dataCenter,\n });\n\n if (blockLogs) {\n this.HandleFormattingAndOutput(blockLogs, () => {\n // print the logs to console\n console.log(\n ` - ${blockId} ${branch} ${\n Number(version) ? `v${version}` : version\n } [${dataCenter}]`\n );\n log.line();\n console.log(log.infoText(blockLogs));\n log.line();\n });\n }\n\n if (err) {\n log.error(\n messages.blocks.failedGetLogs(blockId, currentEnv, env.currentProject)\n );\n log.error(jsonFormatter(err));\n }\n }\n };\n\n HandleFormattingAndOutput = <T>(obj: T, logFn: (obj: T) => void) => {\n const { format, log, messages, output } = this;\n if (output) {\n let writeString = '';\n if (format === 'csv') {\n writeString = csvFormatter(obj as any);\n } else if (format === 'xml') {\n writeString = xmlFormatter(obj as any);\n } else writeString = jsonFormatter(obj);\n // write output to file\n if (writeString) {\n fs.writeFileSync(output, writeString);\n log.success(messages.app.fileOutput(format, output));\n } else {\n log.info(messages.app.noFileOutput());\n }\n } else {\n if (!format) {\n // print the object to console\n logFn(obj);\n } else if (format === 'csv') {\n log.raw('');\n log.raw(log.infoText(csvFormatter(obj)));\n } else if (format === 'xml') {\n log.raw('');\n log.raw(log.infoText(xmlFormatter(obj)));\n } else if (format === 'json') {\n log.raw('');\n log.raw(log.infoText(jsonFormatter(obj)));\n }\n log.raw('');\n }\n };\n}\n\nexport const cliCommand = (\n commandArgs: string[],\n outputOpts: OutputOptions & IConnectOptions = {},\n contensisOpts: Partial<MigrateRequest> = {}\n) => {\n return new ContensisCli(['', '', ...commandArgs], outputOpts, contensisOpts);\n};\nexport default ContensisCli;\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["import fs from 'fs';\nimport path from 'path';\nimport fetch from 'node-fetch';\nimport inquirer from 'inquirer';\nimport to from 'await-to-js';\nimport { Component, ContentType } from 'contensis-core-api';\nimport { isPassword, isSharedSecret, isUuid, url } from '~/util';\nimport SessionCacheProvider from '../providers/SessionCacheProvider';\nimport ContensisAuthService from './ContensisAuthService';\nimport CredentialProvider from '~/providers/CredentialProvider';\nimport { logError, Logger } from '~/util/logger';\nimport { LogMessages } from '~/localisation/en-GB';\nimport {\n ContensisMigrationService,\n MigrateRequest,\n PushBlockParams,\n SourceCms,\n logEntriesTable,\n} from 'migratortron';\nimport { Entry } from 'contensis-management-api/lib/models';\n\nimport { csvFormatter } from '~/util/csv.formatter';\nimport { xmlFormatter } from '~/util/xml.formatter';\nimport { jsonFormatter } from '~/util/json.formatter';\nimport { printBlockVersion, printMigrateResult } from '~/util/console.printer';\nimport { readJsonFile } from '~/providers/file-provider';\n\ntype OutputFormat = 'json' | 'csv' | 'xml';\n\ntype OutputOptions = {\n format?: OutputFormat;\n output?: string;\n};\n\ninterface IConnectOptions extends IAuthOptions {\n alias?: string;\n projectId?: string;\n}\n\ninterface IAuthOptions {\n user?: string;\n password?: string;\n clientId?: string;\n sharedSecret?: string;\n}\n\ninterface IImportOptions {\n sourceEnv?: string;\n sourceProjectId?: string;\n}\n\nclass ContensisCli {\n static quit = (error?: Error) => {\n process.removeAllListeners('exit');\n const exitCode = error ? 1 : 0;\n\n // console.info(`\\nExiting contensis-cli with exit code: ${exitCode}\\n`);\n process.exit(exitCode);\n };\n\n private command: CliCommand;\n private format?: OutputFormat;\n private output?: string;\n private session: SessionCacheProvider;\n\n contensis?: ContensisMigrationService;\n contensisOpts: Partial<MigrateRequest>;\n contentTypes?: ContentType[];\n components?: Component[];\n currentProject: string;\n\n sourceEnv?: string;\n targetEnv?: string;\n urls:\n | {\n api: string;\n cms: string;\n liveWeb: string;\n previewWeb: string;\n iisWeb: string;\n iisPreviewWeb: string;\n }\n | undefined;\n log = Logger;\n messages = LogMessages;\n\n verb: string;\n noun: string;\n thirdArg: string;\n\n get cache() {\n return this.session.Get();\n }\n get currentEnv() {\n return this.cache.currentEnvironment || '';\n }\n\n set currentEnv(currentEnvironment: string) {\n this.session.Update({ currentEnvironment });\n }\n\n get env() {\n const currentEnvironment = this.currentEnv;\n const environments = this.cache.environments || {};\n\n if (!currentEnvironment) return {} as EnvironmentCache;\n else if (!!environments[currentEnvironment])\n return environments[currentEnvironment];\n else {\n return {\n history: [],\n lastUserId: '',\n projects: [],\n versionStatus: 'latest',\n } as EnvironmentCache;\n }\n }\n\n constructor(\n args: string[],\n outputOpts?: OutputOptions & IConnectOptions & IImportOptions,\n contensisOpts: Partial<MigrateRequest> = {}\n ) {\n // console.log('args: ', JSON.stringify(args, null, 2));\n\n const [exe, script, verb = '', noun = '', ...restArgs] = args;\n this.verb = verb?.toLowerCase();\n this.noun = noun?.toLowerCase();\n this.thirdArg = restArgs?.[0];\n\n const commandText = `${this.verb} ${this.noun} ${\n restArgs ? restArgs.join(' ') : ''\n }`.trim();\n\n this.session = new SessionCacheProvider();\n\n this.contensisOpts = contensisOpts;\n this.format = outputOpts?.format;\n this.output =\n outputOpts?.output && path.join(process.cwd(), outputOpts.output);\n\n const currentEnvironment = outputOpts?.alias || this.currentEnv;\n const environments = this.cache.environments || {};\n this.currentEnv = currentEnvironment;\n\n const env = this.env;\n\n if (outputOpts?.projectId) env.currentProject = outputOpts.projectId;\n if (outputOpts?.user) env.lastUserId = outputOpts.user;\n // setting this in env means passwordFallback is written to environments.json\n if (outputOpts?.password) env.passwordFallback = outputOpts.password;\n if (outputOpts?.clientId) env.lastUserId = outputOpts.clientId;\n if (outputOpts?.sharedSecret)\n env.passwordFallback = outputOpts.sharedSecret;\n\n this.currentProject = env?.currentProject || 'null';\n this.sourceEnv = outputOpts?.sourceEnv || currentEnvironment;\n\n if (currentEnvironment) {\n this.urls = url(currentEnvironment, env?.currentProject || 'website');\n }\n\n this.command = {\n commandText,\n createdDate: new Date().toISOString(),\n createdUserId: env?.lastUserId,\n };\n\n if (currentEnvironment) {\n env.history = [this.command];\n if (commandText) {\n environments[currentEnvironment] = env;\n this.session.Update({\n currentEnvironment,\n environments,\n history: [commandText],\n });\n }\n }\n }\n\n PrintEnvironments = () => {\n const { log, messages } = this;\n const { currentEnvironment, environments = {} } = this.cache;\n const envKeys = Object.keys(environments);\n log.success(messages.envs.found(envKeys.length));\n this.HandleFormattingAndOutput(envKeys, () => {\n // print the envKeys to console\n for (const env of envKeys) {\n console.log(` - ${currentEnvironment === env ? '* ' : ''}${env}`);\n }\n });\n if (envKeys.length === 0 || !currentEnvironment) {\n log.help(messages.envs.tip());\n }\n };\n\n Connect = async (environment: string) => {\n const { log, messages, session } = this;\n\n if (environment) {\n this.currentEnv = environment;\n this.urls = url(environment, 'website');\n\n const [fetchErr, response] = await to(fetch(this.urls.cms));\n if (response && response?.status < 400) {\n log.success(messages.connect.connected(environment));\n session.UpdateEnv(this.env, environment);\n\n if (this.env?.lastUserId) {\n // await this.ConnectContensis();\n await this.PrintProjects();\n } else {\n log.warning(messages.projects.noList());\n log.help(messages.connect.tip());\n }\n } else {\n // Cannot reach environment - status X\n log.error(\n messages.connect.unreachable(this.urls.cms, response?.status || 0)\n );\n }\n } else {\n // No environment alias specified\n log.error(messages.connect.noEnv());\n }\n };\n\n ConnectContensis = async ({ commit = false } = {}) => {\n const { contensisOpts, currentEnv, env, log, messages } = this;\n const userId = env?.lastUserId;\n const isGuidId = userId && isUuid(userId);\n\n if (currentEnv && userId) {\n const credentials = await this.GetCredentials(\n userId,\n env.passwordFallback\n );\n\n const cachedPassword = credentials?.current?.password;\n\n if (cachedPassword) {\n this.contensis = new ContensisMigrationService(\n {\n ...contensisOpts,\n source: {\n url: this.urls?.cms || '',\n username: !isGuidId ? userId : undefined,\n password: !isGuidId ? cachedPassword : undefined,\n clientId: isGuidId ? userId : undefined,\n sharedSecret: isGuidId ? cachedPassword : undefined,\n project: env?.currentProject || '',\n assetHostname: this.urls?.previewWeb,\n },\n concurrency:\n typeof contensisOpts.concurrency !== 'undefined'\n ? contensisOpts.concurrency\n : 3,\n outputProgress: true,\n },\n !commit\n );\n }\n } else {\n if (!currentEnv) log.help(messages.connect.help());\n if (!userId) log.help(messages.connect.tip());\n }\n };\n\n ConnectContensisImport = async ({\n commit,\n source,\n fileData,\n fileDataType,\n }: {\n commit: boolean;\n source: 'contensis' | 'file' | 'input';\n fileData?: any[] | string;\n fileDataType?: 'entries' | 'contentTypes' | 'components';\n }) => {\n const { contensisOpts, currentEnv, env, log, messages, sourceEnv } = this;\n const environments = this.cache.environments || {};\n const sourceEnvironment = environments[sourceEnv || ''] || {};\n const sourceCms =\n ('source' in contensisOpts && contensisOpts.source) ||\n ({} as Partial<SourceCms>);\n const sourceUserId =\n sourceCms.clientId || sourceCms.username || sourceEnvironment.lastUserId;\n const sourceProjectId =\n sourceCms.project || sourceEnvironment.currentProject || 'website';\n const isSourceGuidId = sourceUserId && isUuid(sourceUserId);\n const sourceUrls = url(sourceEnv || '', sourceProjectId);\n\n const sourcePassword =\n sourceCms.sharedSecret ||\n sourceCms.password ||\n sourceEnvironment.passwordFallback;\n\n const targetUserId = env?.lastUserId;\n const isTargetGuidId = targetUserId && isUuid(targetUserId);\n\n if (sourceUserId && currentEnv && targetUserId) {\n const sourceCredentials = await this.GetCredentials(\n sourceUserId,\n sourcePassword,\n sourceEnv\n );\n\n const cachedSourcePassword = sourceCredentials?.current?.password;\n\n const targetCredentials = await this.GetCredentials(\n targetUserId,\n env.passwordFallback\n );\n\n const cachedTargetPassword = targetCredentials?.current?.password;\n\n if (cachedSourcePassword && cachedTargetPassword) {\n if (source === 'file' || source === 'input') {\n this.contensis = new ContensisMigrationService(\n {\n concurrency: 3,\n outputProgress: true,\n ...contensisOpts,\n target: {\n url: this.urls?.cms || '',\n username: !isTargetGuidId ? targetUserId : undefined,\n password: !isTargetGuidId ? cachedTargetPassword : undefined,\n clientId: isTargetGuidId ? targetUserId : undefined,\n sharedSecret: isTargetGuidId ? cachedTargetPassword : undefined,\n targetProjects: [env.currentProject || ''],\n assetHostname: this.urls?.previewWeb,\n },\n ...(fileDataType ? { [fileDataType]: fileData } : {}),\n },\n !commit\n );\n }\n if (source === 'contensis') {\n this.contensis = new ContensisMigrationService(\n {\n concurrency: 3,\n outputProgress: true,\n ...contensisOpts,\n source: {\n url: sourceUrls.cms || '',\n username: !isSourceGuidId ? sourceUserId : undefined,\n password: !isSourceGuidId ? cachedSourcePassword : undefined,\n clientId: isSourceGuidId ? sourceUserId : undefined,\n sharedSecret: isSourceGuidId ? cachedSourcePassword : undefined,\n project: sourceProjectId,\n assetHostname: sourceUrls.previewWeb,\n },\n target: {\n url: this.urls?.cms || '',\n username: !isTargetGuidId ? targetUserId : undefined,\n password: !isTargetGuidId ? cachedTargetPassword : undefined,\n clientId: isTargetGuidId ? targetUserId : undefined,\n sharedSecret: isTargetGuidId ? cachedTargetPassword : undefined,\n targetProjects: [env.currentProject || ''],\n assetHostname: this.urls?.previewWeb,\n },\n },\n !commit\n );\n }\n }\n } else {\n if (!currentEnv) log.help(messages.connect.help());\n if (!targetUserId) log.help(messages.connect.tip());\n }\n };\n\n GetCredentials = async (\n userId: string,\n password?: string,\n currentEnv = this.currentEnv\n ): Promise<CredentialProvider | undefined> => {\n const { env, log, messages } = this;\n if (userId) {\n const [credentialError, credentials] = await new CredentialProvider(\n { userId, alias: currentEnv },\n password\n ).Init();\n\n if (credentialError && !credentials.current) {\n // Log problem with Credential Provider\n log.error(credentialError as any);\n return;\n }\n\n if (credentials.remarks.secure !== true) {\n log.warning(messages.login.insecurePassword());\n } else {\n env.passwordFallback = undefined;\n this.session.UpdateEnv(env, currentEnv);\n }\n return credentials;\n }\n };\n\n Login = async (\n userId: string,\n {\n password = isPassword(this.env.passwordFallback),\n promptPassword = true,\n sharedSecret = isSharedSecret(this.env.passwordFallback),\n silent = false,\n attempt = 1,\n }: {\n password?: string;\n promptPassword?: boolean;\n sharedSecret?: string;\n silent?: boolean;\n attempt?: number;\n } = {}\n ): Promise<string | undefined> => {\n let inputPassword = password || sharedSecret;\n const { log, messages } = this;\n\n if (userId) {\n const { currentEnv, env } = this;\n\n if (currentEnv) {\n const credentials = await this.GetCredentials(userId, inputPassword);\n\n if (credentials) {\n const cachedPassword = isPassword(credentials.current?.password);\n const cachedSecret = isSharedSecret(credentials.current?.password);\n\n if (!cachedPassword && !cachedSecret && promptPassword) {\n // Password prompt\n ({ inputPassword } = await inquirer.prompt([\n {\n type: 'password',\n message: messages.login.passwordPrompt(currentEnv, userId),\n name: 'inputPassword',\n mask: '*',\n prefix: undefined,\n },\n ]));\n }\n\n if (inputPassword || cachedPassword || cachedSecret) {\n const authService = new ContensisAuthService({\n username: userId,\n password: inputPassword || cachedPassword,\n projectId: env?.currentProject || 'website',\n rootUrl: this.urls?.cms || '',\n clientId: userId,\n clientSecret: sharedSecret || cachedSecret,\n });\n\n const [authError, bearerToken] = await to(\n authService.BearerToken()\n );\n\n // Login successful\n if (bearerToken) {\n // Set env vars\n env.authToken = bearerToken;\n env.lastUserId = userId;\n env.passwordFallback =\n credentials.remarks.secure !== true\n ? credentials.current?.password\n : undefined;\n // Persist env before finding projects or doing anything else\n this.session.UpdateEnv(env);\n\n if (!silent) {\n Logger.success(messages.login.success(currentEnv, userId));\n await this.PrintProjects();\n }\n if (inputPassword) await credentials.Save(inputPassword);\n if (sharedSecret) await credentials.Save(sharedSecret);\n } else if (authError) {\n Logger.error(authError.toString());\n // Clear env vars\n env.authToken = '';\n env.lastUserId = '';\n env.passwordFallback = undefined;\n // Persist env to remove cleared values\n this.session.UpdateEnv(env);\n\n // If the auth error was raised using a cached password\n if (\n (cachedPassword || cachedSecret) &&\n credentials.remarks.secure\n ) {\n // Remove any bad stored credential and trigger login prompt again\n await credentials.Delete();\n return await this.Login(userId, { password, sharedSecret });\n } else {\n throw new Error(messages.login.failed(currentEnv, userId));\n }\n }\n\n return env.authToken;\n } else {\n Logger.error(messages.login.passwordPrompt());\n if (attempt < 2)\n return await this.Login(userId, { attempt: attempt + 1 });\n }\n }\n } else {\n // No environment set, use `contensis connect {alias}` first\n Logger.error(messages.login.noEnv());\n }\n } else {\n // No user id specified\n Logger.error(messages.login.noUserId());\n }\n };\n\n PrintProjects = async () => {\n const { currentProject, log, messages, session } = this;\n if (!this.contensis) await this.ConnectContensis();\n\n if (this.contensis) {\n // Retrieve projects list for env\n const [projectsErr, projects] = await to(\n this.contensis.projects.GetSourceProjects()\n );\n\n if (Array.isArray(projects)) {\n // save these projects in cache\n const nextCurrentProject =\n currentProject && currentProject !== 'null'\n ? currentProject\n : projects.some(p => p.id === 'website')\n ? 'website'\n : undefined;\n\n session.UpdateEnv({\n projects: projects.map(p => p.id),\n currentProject: nextCurrentProject,\n });\n\n log.success(messages.projects.list());\n this.HandleFormattingAndOutput(projects, () => {\n // print the projects to console\n for (const project of projects) {\n console.log(\n ` - ${nextCurrentProject === project.id ? '* ' : ''}[${\n project.primaryLanguage\n }] ${project.id}`\n );\n }\n });\n\n if (!this.SetProject(nextCurrentProject))\n log.warning(messages.projects.tip());\n }\n\n if (projectsErr) {\n log.error(messages.projects.noList());\n log.error(projectsErr.message);\n }\n }\n };\n\n SetProject = (projectId = 'website') => {\n const { env, log, messages, session } = this;\n let nextProjectId: string | undefined;\n if (env?.projects.length > 0 && env?.lastUserId) {\n nextProjectId = env.projects.find(\n p => p.toLowerCase() === projectId.toLowerCase()\n );\n if (nextProjectId) {\n env.currentProject = nextProjectId;\n session.UpdateEnv(env);\n log.success(messages.projects.set(projectId));\n } else {\n log.error(messages.projects.failedSet(projectId));\n }\n } else {\n // No projects for currentEnv, try logging in\n log.warning(messages.projects.noList());\n log.help(messages.connect.tip());\n }\n return nextProjectId;\n };\n\n SetVersion = (versionStatus: 'latest' | 'published') => {\n const { env, log, messages, session } = this;\n if (!['latest', 'published'].includes(versionStatus)) {\n log.error(messages.version.invalid(versionStatus));\n return false;\n }\n if (!env) {\n log.help(messages.version.noEnv());\n return false;\n }\n if (env?.projects.length > 0 && env?.lastUserId) {\n session.UpdateEnv({ versionStatus });\n log.success(messages.version.set(this.currentEnv, versionStatus));\n return true;\n } else {\n // No projects for currentEnv, try logging in\n log.warning(messages.projects.noList());\n log.help(messages.connect.tip());\n return false;\n }\n };\n\n HydrateContensis = async () => {\n const { log } = this;\n if (!this.contensis) await this.ConnectContensis();\n\n if (this.contensis) {\n // Retrieve content types list for env\n const [contensisErr, models] = await to(\n this.contensis.models.HydrateContensisRepositories()\n );\n\n if (contensisErr) {\n log.error(contensisErr.message);\n return contensisErr;\n }\n }\n };\n\n PrintApiKeys = async () => {\n const { currentEnv, log, messages } = this;\n if (!this.contensis) await this.ConnectContensis();\n\n if (this.contensis) {\n // Retrieve keys list for env\n const [keysErr, apiKeys] = await this.contensis.apiKeys.GetKeys();\n\n if (Array.isArray(apiKeys)) {\n log.success(messages.keys.list(currentEnv));\n this.HandleFormattingAndOutput(apiKeys, () => {\n // print the keys to console\n for (const {\n id,\n sharedSecret,\n name,\n description,\n dateModified,\n modifiedBy,\n } of apiKeys) {\n console.log(\n ` - ${name}${\n description ? ` (${description})` : ''\n } [${dateModified.toString().substring(0, 10)} ${modifiedBy}]`\n );\n console.log(` ${id}`);\n console.log(` ${sharedSecret}`);\n }\n });\n }\n\n if (keysErr) {\n log.error(messages.keys.noList(currentEnv));\n log.error(jsonFormatter(keysErr));\n }\n }\n };\n\n CreateApiKey = async (name: string, description?: string) => {\n const { currentEnv, log, messages } = this;\n if (!this.contensis) await this.ConnectContensis();\n\n if (this.contensis) {\n const [err, key] = await this.contensis.apiKeys.CreateKey(\n name,\n description\n );\n\n if (key) {\n log.success(messages.keys.created(currentEnv, name));\n\n // print the key details to console\n console.log(\n ` - ${key.name}${\n key.description ? ` (${key.description})` : ''\n } [${key.dateModified.toString().substring(0, 10)} ${key.modifiedBy}]`\n );\n console.log(` - id: ${key.id}`);\n console.log(` - sharedSecret: ${key.sharedSecret}`);\n }\n console.log('');\n\n if (err) {\n log.error(messages.keys.failedCreate(currentEnv, name), err);\n }\n }\n };\n\n RemoveApiKey = async (id: string) => {\n const { currentEnv, log, messages } = this;\n if (!this.contensis) await this.ConnectContensis({ commit: true });\n\n if (this.contensis) {\n const [err, key] = await this.contensis.apiKeys.RemoveKey(id);\n\n if (!err) {\n log.success(messages.keys.removed(currentEnv, id));\n console.log('');\n } else {\n log.error(messages.keys.failedRemove(currentEnv, id), err);\n }\n }\n };\n\n GetContentTypes = async () => {\n const { currentProject, log, messages } = this;\n let err;\n if (!this.contensis) err = await this.HydrateContensis();\n\n if (err) log.error(messages.contenttypes.noList(currentProject));\n if (this.contensis) {\n this.contentTypes = this.contensis.models.contentTypes();\n this.components = this.contensis.models.components();\n } else {\n log.warning(messages.contenttypes.noList(currentProject));\n }\n };\n\n PrintContentTypes = async () => {\n const { currentProject, log, messages } = this;\n await this.GetContentTypes();\n if (this.contensis) {\n // Retrieve content types list for env\n const { contentTypes } = this;\n\n if (Array.isArray(contentTypes)) {\n log.success(messages.contenttypes.list(currentProject));\n this.HandleFormattingAndOutput(contentTypes, () => {\n // print the content types to console\n for (const contentType of contentTypes) {\n const fieldsLength = contentType.fields?.length || 0;\n console.log(\n ` - ${contentType.id} [${fieldsLength} field${\n fieldsLength !== 1 ? 's' : ''\n }]`\n );\n }\n });\n }\n }\n };\n\n PrintContentType = async (contentTypeId: string) => {\n const { currentProject, log, messages } = this;\n await this.GetContentTypes();\n if (this.contensis) {\n // Retrieve content types list for env\n const { contentTypes } = this;\n\n if (Array.isArray(contentTypes)) {\n const contentType = contentTypes.find(\n c => c.id.toLowerCase() === contentTypeId.toLowerCase()\n );\n if (contentType) {\n log.success(\n messages.contenttypes.get(currentProject, contentType.id)\n );\n // print the content type to console\n this.HandleFormattingAndOutput(contentType, log.object);\n } else {\n log.error(\n messages.contenttypes.failedGet(currentProject, contentTypeId)\n );\n }\n }\n }\n };\n\n RemoveContentTypes = async (contentTypeIds: string[], commit = false) => {\n const { currentProject, log, messages } = this;\n if (!this.contensis)\n await this.ConnectContensisImport({\n source: 'input',\n commit,\n });\n if (this.contensis) {\n const [err, result] = await this.contensis.DeleteContentTypes(\n contentTypeIds\n );\n\n if (err) {\n log.error(\n messages.contenttypes.failedRemove(\n currentProject,\n contentTypeIds.join('\", \"')\n ),\n err\n );\n } else {\n log.success(\n messages.contenttypes.removed(\n currentProject,\n contentTypeIds.join('\", \"'),\n !this.contensis.isPreview\n )\n );\n // print the results to console\n this.HandleFormattingAndOutput(result, () =>\n log.object(jsonFormatter(result))\n );\n }\n }\n };\n\n ImportContentTypes = async (\n {\n commit,\n fromFile,\n }: {\n commit: boolean;\n fromFile: string;\n },\n contentTypeIds: string[] = []\n ) => {\n const { currentProject, log, messages } = this;\n\n let fileData = fromFile ? readJsonFile<ContentType[]>(fromFile) || [] : [];\n if (typeof fileData === 'string')\n throw new Error(`Import file format must be of type JSON`);\n\n if (!Array.isArray(fileData)) fileData = [fileData];\n\n await this.ConnectContensisImport({\n commit,\n source: fromFile ? 'file' : 'contensis',\n });\n\n if (this.contensis) {\n // Pass each content type to the target repo\n for (const contentType of fileData) {\n // Fix invalid data\n contentType.projectId = currentProject;\n delete contentType.uuid;\n\n const [err, created, createStatus] =\n await this.contensis.models.targetRepos[\n currentProject\n ].repo.UpsertContentType(false, contentType);\n\n if (err) log.error(err.message, err);\n if (createStatus) {\n log.success(\n messages.contenttypes.created(\n currentProject,\n contentType.id,\n createStatus\n )\n );\n // print the content type to console\n this.HandleFormattingAndOutput(contentType, () => {});\n }\n }\n }\n };\n\n PrintComponents = async () => {\n const { currentProject, log, messages } = this;\n await this.GetContentTypes();\n if (this.contensis) {\n // Retrieve components list for env\n const { components } = this;\n\n if (Array.isArray(components)) {\n log.success(messages.components.list(currentProject));\n\n this.HandleFormattingAndOutput(components, () => {\n // print the components to console\n for (const component of components) {\n const fieldsLength = component.fields?.length || 0;\n console.log(\n ` - ${component.id} [${fieldsLength} field${\n fieldsLength !== 1 ? 's' : ''\n }]`\n );\n }\n });\n }\n }\n };\n\n PrintComponent = async (componentId: string) => {\n const { currentProject, log, messages } = this;\n await this.GetContentTypes();\n if (this.contensis) {\n // Retrieve content types list for env\n const { components } = this;\n\n if (Array.isArray(components)) {\n const component = components.find(\n c => c.id.toLowerCase() === componentId.toLowerCase()\n );\n if (component) {\n log.success(messages.components.get(currentProject, component.id));\n // print the component to console\n this.HandleFormattingAndOutput(component, log.object);\n } else {\n log.error(messages.components.failedGet(currentProject, componentId));\n }\n }\n }\n };\n\n RemoveComponents = async (componentIds: string[], commit = false) => {\n const { currentProject, log, messages } = this;\n if (!this.contensis)\n await this.ConnectContensisImport({\n source: 'input',\n commit,\n });\n if (this.contensis) {\n const [err, result] = await this.contensis.DeleteContentTypes(\n undefined,\n componentIds\n );\n\n if (err) {\n log.error(\n messages.components.failedRemove(\n currentProject,\n componentIds.join('\", \"')\n ),\n err\n );\n } else {\n log.success(\n messages.components.removed(\n currentProject,\n componentIds.join('\", \"'),\n !this.contensis.isPreview\n )\n );\n // print the results to console\n this.HandleFormattingAndOutput(result, () =>\n log.info(jsonFormatter(result))\n );\n }\n }\n };\n\n ImportComponents = async (\n {\n commit,\n fromFile,\n }: {\n commit: boolean;\n fromFile: string;\n },\n componentIds: string[] = []\n ) => {\n const { currentProject, log, messages } = this;\n\n let fileData = fromFile ? readJsonFile<Component[]>(fromFile) || [] : [];\n if (typeof fileData === 'string')\n throw new Error(`Import file format must be of type JSON`);\n\n if (!Array.isArray(fileData)) fileData = [fileData];\n\n await this.ConnectContensisImport({\n commit,\n source: fromFile ? 'file' : 'contensis',\n });\n\n if (this.contensis) {\n // Pass each component to the target repo\n for (const component of fileData) {\n // Fix invalid data\n component.projectId = currentProject;\n delete component.uuid;\n\n const [err, created, createStatus] =\n await this.contensis.models.targetRepos[\n currentProject\n ].repo.UpsertComponent(false, component);\n\n if (err) log.error(err.message, err);\n if (createStatus) {\n log.success(\n messages.components.created(\n currentProject,\n component.id,\n createStatus\n )\n );\n // print the component to console\n this.HandleFormattingAndOutput(component, () => {});\n }\n }\n }\n };\n\n RemoveEntry = async (id: string, commit = false) => {\n const { currentEnv, log, messages } = this;\n if (!this.contensis)\n await this.ConnectContensisImport({\n source: 'input',\n commit,\n });\n\n if (this.contensis) {\n if (this.contensis.isPreview) {\n console.log(log.successText(` -- PREVIEW -- `));\n } else {\n console.log(log.warningText(` *** COMMITTING DELETE *** `));\n }\n const [err, result] = await this.contensis.DeleteEntries();\n if (result)\n this.HandleFormattingAndOutput(result, () => {\n // print the migrateResult to console\n printMigrateResult(this, result, { action: 'delete' });\n });\n if (\n !err &&\n ((!commit &&\n Object.values(result.entriesToMigrate)?.[0].totalCount > 0) ||\n (commit && result.migrateResult?.deleted))\n ) {\n log.success(messages.entries.removed(currentEnv, id, commit));\n if (!commit) log.help(messages.entries.commitTip());\n } else {\n log.error(messages.entries.failedRemove(currentEnv, id), err);\n if (!Object.values(result.entriesToMigrate)?.[0].totalCount)\n log.help(messages.entries.notFound(id));\n }\n }\n };\n\n GetEntries = async ({\n withDependents = false,\n }: {\n withDependents?: boolean;\n }) => {\n const { currentProject, log, messages } = this;\n await this.ConnectContensis();\n\n if (this.contensis) {\n log.line();\n const entries = await this.contensis.GetEntries({ withDependents });\n this.HandleFormattingAndOutput(entries, () =>\n // print the entries to console\n logEntriesTable(\n entries,\n currentProject,\n this.contensis?.payload.query?.fields\n )\n );\n } else {\n log.warning(messages.contenttypes.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n ImportEntries = async ({\n commit,\n fromFile,\n }: {\n commit: boolean;\n fromFile: string;\n }) => {\n const { currentProject, log, messages } = this;\n\n const fileData = fromFile ? readJsonFile<Entry[]>(fromFile) || [] : [];\n if (typeof fileData === 'string')\n throw new Error(`Import file format must be of type JSON`);\n\n await this.ConnectContensisImport({\n commit,\n source: fromFile ? 'file' : 'contensis',\n fileData,\n fileDataType: 'entries',\n });\n\n if (this.contensis) {\n log.line();\n if (this.contensis.isPreview) {\n console.log(log.successText(` -- IMPORT PREVIEW -- `));\n } else {\n console.log(log.warningText(` *** COMMITTING IMPORT *** `));\n }\n\n const [migrateErr, migrateResult] = await this.contensis.MigrateEntries();\n\n if (migrateErr) logError(migrateErr);\n else\n this.HandleFormattingAndOutput(migrateResult, () => {\n // print the migrateResult to console\n printMigrateResult(this, migrateResult);\n });\n } else {\n log.warning(messages.contenttypes.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n PrintWebhookSubscriptions = async (\n subscriptionIds?: string[],\n name?: string\n ) => {\n const { currentEnv, log, messages } = this;\n if (!this.contensis) await this.ConnectContensis();\n if (this.contensis) {\n // Retrieve webhooks list for env\n const [webhooksErr, webhooks] =\n await this.contensis.subscriptions.webhooks.GetSubscriptions();\n\n const filteredResults =\n typeof name === 'string'\n ? webhooks.filter(w =>\n w.name?.toLowerCase().includes(name.toLowerCase())\n )\n : Array.isArray(subscriptionIds)\n ? webhooks.filter(w => subscriptionIds?.some(id => id === w.id))\n : webhooks;\n\n if (Array.isArray(filteredResults)) {\n this.HandleFormattingAndOutput(filteredResults, () => {\n // print the keys to console\n log.success(messages.webhooks.list(currentEnv));\n for (const {\n id,\n description,\n method,\n name,\n version,\n url,\n } of filteredResults) {\n console.log(\n ` - ${name}${\n description ? ` (${description})` : ''\n } [${version.modified.toString().substring(0, 10)} ${\n version.modifiedBy\n }]`\n );\n console.log(` ${id}`);\n console.log(` [${method}] ${url}`);\n }\n console.log('');\n });\n }\n\n if (webhooksErr) {\n log.error(messages.webhooks.noList(currentEnv));\n log.error(jsonFormatter(webhooksErr));\n }\n }\n };\n\n PrintBlocks = async () => {\n const { currentEnv, env, log, messages } = this;\n if (!this.contensis) await this.ConnectContensis();\n if (this.contensis) {\n // Retrieve blocks list for env\n const [err, blocks] = await this.contensis.blocks.GetBlocks();\n\n if (Array.isArray(blocks)) {\n this.HandleFormattingAndOutput(blocks, () => {\n // print the blocks to console\n log.success(messages.blocks.list(currentEnv, env.currentProject));\n for (const {\n id,\n description,\n branches,\n liveVersion,\n madeLive,\n versionsSinceLive,\n } of blocks) {\n console.log(\n ` - ${id}${description ? ` (${description})` : ''}${\n madeLive\n ? ` [${madeLive.toString().substring(0, 10)} v${liveVersion}]`\n : ''\n }${\n versionsSinceLive\n ? log.warningText(` +${versionsSinceLive}`)\n : ''\n }`\n );\n for (const branch of branches)\n console.log(\n log.infoText(` [${branch.id}]: ${branch.status}`)\n );\n }\n });\n }\n\n if (err) {\n log.error(messages.blocks.noList(currentEnv));\n log.error(jsonFormatter(err));\n }\n }\n };\n\n PrintBlockVersions = async (\n blockId: string,\n branch: string,\n version: string\n ) => {\n const { currentEnv, env, log, messages } = this;\n if (!this.contensis) await this.ConnectContensis();\n if (this.contensis) {\n // Retrieve block version\n const [err, blocks] = await this.contensis.blocks.GetBlockVersions(\n blockId,\n branch,\n version\n );\n\n if (blocks) {\n this.HandleFormattingAndOutput(blocks, () => {\n // print the version detail to console\n log.success(\n messages.blocks.get(blockId, currentEnv, env.currentProject)\n );\n for (const block of blocks)\n printBlockVersion(\n this,\n block,\n !version\n ? {\n showImage: false,\n showSource: true,\n showStaticPaths: false,\n showStatus: false,\n }\n : undefined\n );\n });\n }\n\n if (err) {\n log.error(messages.blocks.noList(currentEnv, env.currentProject));\n log.error(jsonFormatter(err));\n }\n }\n };\n\n PushBlock = async (block: PushBlockParams) => {\n const { currentEnv, env, log, messages } = this;\n\n // Output request to console\n messages.blocks.tryPush(\n block.id,\n block.source.branch,\n currentEnv,\n env.currentProject\n );\n console.log(jsonFormatter(block));\n\n if (!this.contensis) await this.ConnectContensis();\n if (this.contensis) {\n // Push new block version\n const [err, blockVersion] = await this.contensis.blocks.PushBlockVersion(\n block\n );\n if (!err) {\n log.success(\n messages.blocks.pushed(\n block.id,\n block.source.branch,\n currentEnv,\n env.currentProject\n )\n );\n console.log(jsonFormatter(blockVersion));\n }\n if (blockVersion) {\n this.HandleFormattingAndOutput(blockVersion, () => {\n // print the version detail to console\n printBlockVersion(this, blockVersion);\n });\n }\n if (err)\n throw new Error(\n messages.blocks.failedPush(block.id, currentEnv, env.currentProject)\n );\n }\n };\n\n ReleaseBlock = async (blockId: string, version: string) => {\n const { currentEnv, env, log, messages } = this;\n if (!this.contensis) await this.ConnectContensis();\n if (this.contensis) {\n // Retrieve block version\n const [err, blockVersion] = await this.contensis.blocks.BlockAction(\n blockId,\n 'release',\n version\n );\n\n if (blockVersion) {\n this.HandleFormattingAndOutput(blockVersion, () => {\n // print the version detail to console\n log.success(\n messages.blocks.released(blockId, currentEnv, env.currentProject)\n );\n printBlockVersion(this, blockVersion);\n });\n }\n\n if (err) {\n log.error(\n messages.blocks.failedRelease(blockId, currentEnv, env.currentProject)\n );\n log.error(jsonFormatter(err));\n }\n }\n };\n\n PrintBlockLogs = async (\n blockId: string,\n branch: string,\n version: string,\n dataCenter: 'hq' | 'manchester' | 'london'\n ) => {\n const { currentEnv, env, log, messages } = this;\n if (!this.contensis) await this.ConnectContensis();\n if (this.contensis) {\n // Retrieve block logs\n log.success(\n messages.blocks.getLogs(blockId, branch, currentEnv, env.currentProject)\n );\n\n const [err, blockLogs] = await this.contensis.blocks.GetBlockLogs({\n blockId,\n branchId: branch,\n version,\n dataCenter,\n });\n\n if (blockLogs) {\n this.HandleFormattingAndOutput(blockLogs, () => {\n // print the logs to console\n console.log(\n ` - ${blockId} ${branch} ${\n Number(version) ? `v${version}` : version\n } [${dataCenter}]`\n );\n log.line();\n console.log(log.infoText(blockLogs));\n log.line();\n });\n }\n\n if (err) {\n log.error(\n messages.blocks.failedGetLogs(blockId, currentEnv, env.currentProject)\n );\n log.error(jsonFormatter(err));\n }\n }\n };\n\n HandleFormattingAndOutput = <T>(obj: T, logFn: (obj: T) => void) => {\n const { format, log, messages, output } = this;\n if (output) {\n let writeString = '';\n if (format === 'csv') {\n writeString = csvFormatter(obj as any);\n } else if (format === 'xml') {\n writeString = xmlFormatter(obj as any);\n } else writeString = jsonFormatter(obj);\n // write output to file\n if (writeString) {\n fs.writeFileSync(output, writeString);\n log.success(messages.app.fileOutput(format, output));\n } else {\n log.info(messages.app.noFileOutput());\n }\n } else {\n if (!format) {\n // print the object to console\n logFn(obj);\n } else if (format === 'csv') {\n log.raw('');\n log.raw(log.infoText(csvFormatter(obj)));\n } else if (format === 'xml') {\n log.raw('');\n log.raw(log.infoText(xmlFormatter(obj)));\n } else if (format === 'json') {\n log.raw('');\n log.raw(log.infoText(jsonFormatter(obj)));\n }\n log.raw('');\n }\n };\n}\n\nexport const cliCommand = (\n commandArgs: string[],\n outputOpts: OutputOptions & IConnectOptions = {},\n contensisOpts: Partial<MigrateRequest> = {}\n) => {\n return new ContensisCli(['', '', ...commandArgs], outputOpts, contensisOpts);\n};\nexport default ContensisCli;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["SessionCacheProvider", "path", "to", "fetch", "CredentialProvider", "inquirer", "ContensisAuthService", "name", "url", "fs"]
|
|
7
7
|
}
|
package/dist/shell.js
CHANGED
|
@@ -61,7 +61,7 @@ class ContensisShell {
|
|
|
61
61
|
import_inquirer_command_prompt.default.setConfig({
|
|
62
62
|
history: {
|
|
63
63
|
save: true,
|
|
64
|
-
folder: import_path.default.join(
|
|
64
|
+
folder: import_path.default.join(process.cwd(), "../"),
|
|
65
65
|
limit: 100,
|
|
66
66
|
blacklist: ["quit"]
|
|
67
67
|
}
|
package/dist/shell.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/shell.ts"],
|
|
4
|
-
"sourcesContent": ["import path from 'path';\nimport figlet from 'figlet';\nimport inquirer from 'inquirer';\nimport inquirerPrompt from 'inquirer-command-prompt';\nimport commands from './commands';\nimport { LogMessages } from './localisation/en-GB';\nimport { logError, Logger } from './util/logger';\nimport CredentialProvider from './providers/CredentialProvider';\nimport ContensisCli, { cliCommand } from './services/ContensisCliService';\nimport { Logging } from './util';\n\nclass ContensisShell {\n private currentEnvironment!: string;\n private emptyInputCounter: number = 0;\n private env!: EnvironmentCache;\n private firstStart = true;\n private userId: string = '';\n private log = Logger;\n private messages = LogMessages;\n\n private refreshEnvironment = () => {\n // Reload any persisted changes from the disk cache\n const {\n cache: { currentEnvironment = '', environments = {} },\n } = new ContensisCli([]);\n // console.log(`refreshing env w/${currentEnvironment}`);\n this.currentEnvironment = currentEnvironment;\n this.env = environments[currentEnvironment];\n\n // Reload logging here to support changing language\n Logging('en-GB').then(({ messages, Log }) => {\n this.log = Log;\n this.messages = messages;\n });\n };\n\n constructor() {\n this.refreshEnvironment();\n inquirerPrompt.setConfig({\n history: {\n save: true,\n folder: path.join(
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAiB;AACjB,oBAAmB;AACnB,sBAAqB;AACrB,qCAA2B;AAC3B,sBAAqB;AACrB,mBAA4B;AAC5B,oBAAiC;AACjC,gCAA+B;AAC/B,iCAAyC;AACzC,kBAAwB;AAExB,MAAM,eAAe;AAAA,EACX;AAAA,EACA,oBAA4B;AAAA,EAC5B;AAAA,EACA,aAAa;AAAA,EACb,SAAiB;AAAA,EACjB,MAAM;AAAA,EACN,WAAW;AAAA,EAEX,qBAAqB,MAAM;AAEjC,UAAM;AAAA,MACJ,OAAO,EAAE,qBAAqB,IAAI,eAAe,CAAC,EAAE;AAAA,IACtD,IAAI,IAAI,2BAAAA,QAAa,CAAC,CAAC;AAEvB,SAAK,qBAAqB;AAC1B,SAAK,MAAM,aAAa;AAGxB,6BAAQ,OAAO,EAAE,KAAK,CAAC,EAAE,UAAU,IAAI,MAAM;AAC3C,WAAK,MAAM;AACX,WAAK,WAAW;AAAA,IAClB,CAAC;AAAA,EACH;AAAA,EAEA,cAAc;AACZ,SAAK,mBAAmB;AACxB,mCAAAC,QAAe,UAAU;AAAA,MACvB,SAAS;AAAA,QACP,MAAM;AAAA,QACN,QAAQ,YAAAC,QAAK,KAAK,
|
|
4
|
+
"sourcesContent": ["import path from 'path';\nimport figlet from 'figlet';\nimport inquirer from 'inquirer';\nimport inquirerPrompt from 'inquirer-command-prompt';\nimport commands from './commands';\nimport { LogMessages } from './localisation/en-GB';\nimport { logError, Logger } from './util/logger';\nimport CredentialProvider from './providers/CredentialProvider';\nimport ContensisCli, { cliCommand } from './services/ContensisCliService';\nimport { Logging } from './util';\n\nclass ContensisShell {\n private currentEnvironment!: string;\n private emptyInputCounter: number = 0;\n private env!: EnvironmentCache;\n private firstStart = true;\n private userId: string = '';\n private log = Logger;\n private messages = LogMessages;\n\n private refreshEnvironment = () => {\n // Reload any persisted changes from the disk cache\n const {\n cache: { currentEnvironment = '', environments = {} },\n } = new ContensisCli([]);\n // console.log(`refreshing env w/${currentEnvironment}`);\n this.currentEnvironment = currentEnvironment;\n this.env = environments[currentEnvironment];\n\n // Reload logging here to support changing language\n Logging('en-GB').then(({ messages, Log }) => {\n this.log = Log;\n this.messages = messages;\n });\n };\n\n constructor() {\n this.refreshEnvironment();\n inquirerPrompt.setConfig({\n history: {\n save: true,\n folder: path.join(process.cwd(), '../'),\n limit: 100,\n blacklist: ['quit'],\n },\n });\n // inquirer.registerPrompt('command', inquirerPrompt);\n\n const { log, messages } = this;\n\n figlet.text(\n messages.app.contensis(),\n {\n font: 'Block',\n horizontalLayout: 'default',\n verticalLayout: 'default',\n width: process.stdout.columns,\n whitespaceBreak: true,\n },\n (err, data) => {\n if (err) {\n log.error(messages.app.unknownError());\n console.dir(err);\n return;\n }\n console.log(log.successText(data));\n console.log(log.infoText(messages.app.startup()));\n console.log(log.helpText(messages.app.help()));\n\n this.start().catch(ex => log.error(ex));\n }\n );\n }\n\n restart = async () => {\n this.firstStart = false;\n this.log.line(); // add a line so we can see where the shell has been restarted\n await this.start();\n };\n\n start = async () => {\n this.refreshEnvironment();\n this.userId = '';\n const { currentEnvironment, env, log, messages } = this;\n\n if (env?.lastUserId) {\n const [credsErr, credentials] = await new CredentialProvider(\n {\n userId: env.lastUserId,\n alias: currentEnvironment,\n },\n env.passwordFallback\n ).Init();\n if (credsErr && !credentials.current) {\n log.error(credsErr.message);\n }\n if (credentials.current) {\n if (this.firstStart) {\n const token = await cliCommand(['login', env.lastUserId]).Login(\n env.lastUserId,\n {\n promptPassword: false,\n silent: true,\n }\n );\n if (token) {\n this.userId = env.lastUserId;\n if (!env.currentProject) log.warning(messages.projects.tip());\n }\n this.firstStart = false;\n this.refreshEnvironment();\n } else {\n this.userId = env.lastUserId;\n }\n }\n }\n await this.contensisPrompt();\n };\n\n contensisPrompt = async (): Promise<any> => {\n const { currentEnvironment, env, log, messages, userId } = this;\n\n const availableCommands = [\n {\n filter: (str: string) => {\n return str.replace(/ \\[.*$/, '');\n },\n },\n 'connect',\n 'list envs',\n 'quit',\n ];\n\n if (currentEnvironment)\n availableCommands.push('login', 'list projects', 'set project');\n if (userId)\n availableCommands.push(\n 'get block',\n 'get block logs',\n 'get contenttype',\n 'get component',\n 'get entries',\n 'import contenttypes',\n 'import components',\n 'import entries',\n 'list blocks',\n 'list contenttypes',\n 'list components',\n 'list models',\n 'list keys',\n 'list webhooks',\n 'create key',\n 'push block',\n 'release block',\n 'remove key',\n 'remove entry',\n 'remove contenttypes',\n 'remove components'\n );\n\n const prompt = inquirer.createPromptModule();\n prompt.registerPrompt('command', inquirerPrompt);\n return prompt([\n {\n type: 'command',\n name: 'cmd',\n autoCompletion: availableCommands,\n autocompletePrompt: log.infoText(messages.app.autocomplete()),\n message: `${userId ? `${userId}@` : ''}${currentEnvironment || ''}>`,\n context: 0,\n validate: (val: string) => {\n if (!val) this.emptyInputCounter++;\n if (this.emptyInputCounter > 1)\n console.log(this.log.infoText(this.messages.app.suggestions()));\n if (val) {\n this.emptyInputCounter = 0;\n return true;\n }\n },\n prefix: `${env?.currentProject || log.infoText('contensis')}`,\n short: true,\n },\n ])\n .then(async (answers: { cmd: string }) => {\n if (answers.cmd === 'quit') {\n this.quit();\n } else {\n try {\n if (answers.cmd) {\n const program = commands();\n await program.parseAsync(\n answers.cmd\n .match(/\"[^\"]+\"|[^\\s]+/g)\n ?.map(e => e.replace(/\"(.+)\"/, '$1')),\n {\n from: 'user',\n }\n );\n }\n } catch (ex: any) {\n const str = ex.toString();\n if (!str.includes('CommanderError'))\n logError(ex, `Shell ${ex.toString()}`);\n } finally {\n return this.contensisPrompt();\n }\n }\n })\n .catch((err: Error) => {\n log.error(err.message);\n this.quit();\n });\n };\n\n quit = (error?: Error) => {\n const { log, messages } = this;\n process.removeAllListeners('exit');\n\n if (error) {\n log.error(error.message);\n process.exit(1);\n } else {\n log.success(messages.app.quit());\n process.exitCode = 0;\n process.exit(0);\n }\n };\n}\n\nlet globalShell: ContensisShell;\n\nexport const shell = () => {\n // Return a benign function for shell().restart() when used in cli context\n // as some commands need to restart the shell to show an updated prompt\n // after successful connect / login / set project\n if (typeof process.argv?.[2] !== 'undefined') return { restart() {} } as any;\n if (!globalShell) globalShell = new ContensisShell();\n return globalShell;\n};\n\nprocess.on('uncaughtException', function (err) {\n // Handle the error safely\n console.log(err);\n});\n\nprocess.on('SIGINT', () => {\n console.log('catching SIGINT');\n shell().quit();\n});\n\nprocess.on('SIGTERM', () => {\n console.log('catching SIGTERM');\n shell().quit();\n});\n\nprocess.stdin.on('data', key => {\n if ((key as any) == '\\u0003') {\n console.log('');\n Logger.info(`[CTRL]+[C] detected, exiting shell...`);\n shell().quit();\n }\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["ContensisCli", "inquirerPrompt", "path", "figlet", "CredentialProvider", "inquirer", "commands"]
|
|
7
7
|
}
|
package/dist/util/index.js
CHANGED
|
@@ -36,6 +36,7 @@ __export(util_exports, {
|
|
|
36
36
|
module.exports = __toCommonJS(util_exports);
|
|
37
37
|
var import_mergeWith = __toESM(require("lodash/mergeWith"));
|
|
38
38
|
var import_logger = require("./logger");
|
|
39
|
+
var import_en_GB = require("../localisation/en-GB.js");
|
|
39
40
|
const isSharedSecret = (str = "") => str.length > 80 && str.split("-").length === 3 ? str : void 0;
|
|
40
41
|
const isPassword = (str = "") => !isSharedSecret(str) ? str : void 0;
|
|
41
42
|
const tryParse = (str) => {
|
|
@@ -69,8 +70,10 @@ const url = (alias, project) => {
|
|
|
69
70
|
};
|
|
70
71
|
};
|
|
71
72
|
const Logging = async (language = "en-GB") => {
|
|
72
|
-
const
|
|
73
|
-
|
|
73
|
+
const defaultMessages = import_en_GB.LogMessages;
|
|
74
|
+
let localisedMessages = defaultMessages;
|
|
75
|
+
if (language === "en-GB") {
|
|
76
|
+
}
|
|
74
77
|
return {
|
|
75
78
|
messages: (0, import_mergeWith.default)(
|
|
76
79
|
localisedMessages,
|
package/dist/util/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/util/index.ts"],
|
|
4
|
-
"sourcesContent": ["import mergeWith from 'lodash/mergeWith';\nimport { Logger } from './logger';\n\nexport const isSharedSecret = (str = '') =>\n str.length > 80 && str.split('-').length === 3 ? str : undefined;\n\nexport const isPassword = (str = '') =>\n !isSharedSecret(str) ? str : undefined;\n\nexport const tryParse = (str: string) => {\n try {\n return typeof str === 'object' ? str : JSON.parse(str);\n } catch (e) {\n return false;\n }\n};\n\nexport const isJson = (str: string) =>\n typeof str === 'object' || !!tryParse(str);\n\nexport const tryStringify = (obj: any) => {\n try {\n return typeof obj === 'object' ? JSON.stringify(obj) : obj;\n } catch (e) {\n return obj;\n }\n};\n\nexport const isUuid = (str: string) => {\n // Regular expression to check if string is a valid UUID\n const regexExp =\n /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/gi;\n\n return regexExp.test(str);\n};\n\nexport const url = (alias: string, project: string) => {\n const projectAndAlias =\n project && project.toLowerCase() !== 'website'\n ? `${project.toLowerCase()}-${alias}`\n : alias;\n return {\n api: `https://api-${alias}.cloud.contensis.com`,\n cms: `https://cms-${alias}.cloud.contensis.com`,\n liveWeb: `https://live-${projectAndAlias}.cloud.contensis.com`,\n previewWeb: `https://preview-${projectAndAlias}.cloud.contensis.com`,\n iisWeb: `https://iis-live-${projectAndAlias}.cloud.contensis.com`,\n iisPreviewWeb: `https://iis-preview-${projectAndAlias}.cloud.contensis.com`,\n };\n};\n\nexport const Logging = async (language = 'en-GB') => {\n const { LogMessages: defaultMessages } = await import(\n
|
|
5
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAsB;AACtB,oBAAuB;
|
|
6
|
-
"names": ["mergeWith"]
|
|
4
|
+
"sourcesContent": ["import mergeWith from 'lodash/mergeWith';\nimport { Logger } from './logger';\nimport { LogMessages as enGB } from '../localisation/en-GB.js';\n\nexport const isSharedSecret = (str = '') =>\n str.length > 80 && str.split('-').length === 3 ? str : undefined;\n\nexport const isPassword = (str = '') =>\n !isSharedSecret(str) ? str : undefined;\n\nexport const tryParse = (str: string) => {\n try {\n return typeof str === 'object' ? str : JSON.parse(str);\n } catch (e) {\n return false;\n }\n};\n\nexport const isJson = (str: string) =>\n typeof str === 'object' || !!tryParse(str);\n\nexport const tryStringify = (obj: any) => {\n try {\n return typeof obj === 'object' ? JSON.stringify(obj) : obj;\n } catch (e) {\n return obj;\n }\n};\n\nexport const isUuid = (str: string) => {\n // Regular expression to check if string is a valid UUID\n const regexExp =\n /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/gi;\n\n return regexExp.test(str);\n};\n\nexport const url = (alias: string, project: string) => {\n const projectAndAlias =\n project && project.toLowerCase() !== 'website'\n ? `${project.toLowerCase()}-${alias}`\n : alias;\n return {\n api: `https://api-${alias}.cloud.contensis.com`,\n cms: `https://cms-${alias}.cloud.contensis.com`,\n liveWeb: `https://live-${projectAndAlias}.cloud.contensis.com`,\n previewWeb: `https://preview-${projectAndAlias}.cloud.contensis.com`,\n iisWeb: `https://iis-live-${projectAndAlias}.cloud.contensis.com`,\n iisPreviewWeb: `https://iis-preview-${projectAndAlias}.cloud.contensis.com`,\n };\n};\n\nexport const Logging = async (language = 'en-GB') => {\n const defaultMessages = enGB;\n // const { LogMessages: defaultMessages } = await import(\n // `../localisation/en-GB.js`\n // );\n let localisedMessages = defaultMessages;\n\n if (language === 'en-GB') {\n // Using a variable import e.g. `import(`../localisation/${language}.js`);`\n // does not play well with packaged executables\n // So we have to hard code the import for each language individually\n }\n return {\n messages: mergeWith(\n localisedMessages,\n defaultMessages,\n (v, s) => v || s\n ) as typeof defaultMessages,\n Log: Logger,\n };\n};\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAsB;AACtB,oBAAuB;AACvB,mBAAoC;AAE7B,MAAM,iBAAiB,CAAC,MAAM,OACnC,IAAI,SAAS,MAAM,IAAI,MAAM,GAAG,EAAE,WAAW,IAAI,MAAM;AAElD,MAAM,aAAa,CAAC,MAAM,OAC/B,CAAC,eAAe,GAAG,IAAI,MAAM;AAExB,MAAM,WAAW,CAAC,QAAgB;AACvC,MAAI;AACF,WAAO,OAAO,QAAQ,WAAW,MAAM,KAAK,MAAM,GAAG;AAAA,EACvD,SAAS,GAAP;AACA,WAAO;AAAA,EACT;AACF;AAEO,MAAM,SAAS,CAAC,QACrB,OAAO,QAAQ,YAAY,CAAC,CAAC,SAAS,GAAG;AAEpC,MAAM,eAAe,CAAC,QAAa;AACxC,MAAI;AACF,WAAO,OAAO,QAAQ,WAAW,KAAK,UAAU,GAAG,IAAI;AAAA,EACzD,SAAS,GAAP;AACA,WAAO;AAAA,EACT;AACF;AAEO,MAAM,SAAS,CAAC,QAAgB;AAErC,QAAM,WACJ;AAEF,SAAO,SAAS,KAAK,GAAG;AAC1B;AAEO,MAAM,MAAM,CAAC,OAAe,YAAoB;AACrD,QAAM,kBACJ,WAAW,QAAQ,YAAY,MAAM,YACjC,GAAG,QAAQ,YAAY,KAAK,UAC5B;AACN,SAAO;AAAA,IACL,KAAK,eAAe;AAAA,IACpB,KAAK,eAAe;AAAA,IACpB,SAAS,gBAAgB;AAAA,IACzB,YAAY,mBAAmB;AAAA,IAC/B,QAAQ,oBAAoB;AAAA,IAC5B,eAAe,uBAAuB;AAAA,EACxC;AACF;AAEO,MAAM,UAAU,OAAO,WAAW,YAAY;AACnD,QAAM,kBAAkB,aAAAA;AAIxB,MAAI,oBAAoB;AAExB,MAAI,aAAa,SAAS;AAAA,EAI1B;AACA,SAAO;AAAA,IACL,cAAU,iBAAAC;AAAA,MACR;AAAA,MACA;AAAA,MACA,CAAC,GAAG,MAAM,KAAK;AAAA,IACjB;AAAA,IACA,KAAK;AAAA,EACP;AACF;",
|
|
6
|
+
"names": ["enGB", "mergeWith"]
|
|
7
7
|
}
|
package/dist/version.js
CHANGED
|
@@ -21,7 +21,7 @@ __export(version_exports, {
|
|
|
21
21
|
LIB_VERSION: () => LIB_VERSION
|
|
22
22
|
});
|
|
23
23
|
module.exports = __toCommonJS(version_exports);
|
|
24
|
-
const LIB_VERSION = "1.0.0-beta.
|
|
24
|
+
const LIB_VERSION = "1.0.0-beta.20";
|
|
25
25
|
// Annotate the CommonJS export names for ESM import in node:
|
|
26
26
|
0 && (module.exports = {
|
|
27
27
|
LIB_VERSION
|
package/dist/version.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/version.ts"],
|
|
4
|
-
"sourcesContent": ["export const LIB_VERSION = \"1.0.0-beta.
|
|
4
|
+
"sourcesContent": ["export const LIB_VERSION = \"1.0.0-beta.20\";\n"],
|
|
5
5
|
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,MAAM,cAAc;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "contensis-cli",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.20",
|
|
4
4
|
"description": "A fully featured Contensis command line interface with a shell UI provides simple and intuitive ways to manage or profile your content in any NodeJS terminal.",
|
|
5
5
|
"repository": "https://github.com/contensis/node-cli",
|
|
6
6
|
"homepage": "https://github.com/contensis/node-cli/tree/main/packages/contensis-cli#readme",
|
|
@@ -10,6 +10,7 @@ interface Remarks {
|
|
|
10
10
|
|
|
11
11
|
class CredentialProvider {
|
|
12
12
|
private serviceId: string;
|
|
13
|
+
private keytar!: typeof keytar;
|
|
13
14
|
private userId: string = '';
|
|
14
15
|
private passwordFallback?: string;
|
|
15
16
|
|
|
@@ -29,9 +30,34 @@ class CredentialProvider {
|
|
|
29
30
|
this.passwordFallback = passwordFallback;
|
|
30
31
|
}
|
|
31
32
|
|
|
33
|
+
Import = async () => {
|
|
34
|
+
try {
|
|
35
|
+
this.keytar = (await import('keytar')).default;
|
|
36
|
+
} catch (ex) {
|
|
37
|
+
this.keytar = {
|
|
38
|
+
findCredentials: async () => {
|
|
39
|
+
throw ex;
|
|
40
|
+
},
|
|
41
|
+
getPassword: async () => {
|
|
42
|
+
throw ex;
|
|
43
|
+
},
|
|
44
|
+
findPassword: async () => {
|
|
45
|
+
throw ex;
|
|
46
|
+
},
|
|
47
|
+
setPassword: async () => {
|
|
48
|
+
throw ex;
|
|
49
|
+
},
|
|
50
|
+
deletePassword: async () => {
|
|
51
|
+
throw ex;
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
|
|
32
57
|
Init = async (): Promise<[Error, CredentialProvider]> => {
|
|
58
|
+
await this.Import();
|
|
33
59
|
const [err, stored] = (await to(
|
|
34
|
-
keytar.findCredentials(this.serviceId)
|
|
60
|
+
this.keytar.findCredentials(this.serviceId)
|
|
35
61
|
)) as [
|
|
36
62
|
Error,
|
|
37
63
|
{
|
|
@@ -62,7 +88,7 @@ class CredentialProvider {
|
|
|
62
88
|
|
|
63
89
|
Save = async (password: string) => {
|
|
64
90
|
const [err] = await to(
|
|
65
|
-
keytar.setPassword(this.serviceId, this.userId, password)
|
|
91
|
+
this.keytar.setPassword(this.serviceId, this.userId, password)
|
|
66
92
|
);
|
|
67
93
|
|
|
68
94
|
// if (!err) Logger.info(`${this.serviceId} - credentials saved`);
|
|
@@ -75,7 +101,7 @@ class CredentialProvider {
|
|
|
75
101
|
return true;
|
|
76
102
|
} else {
|
|
77
103
|
const [err] = await to(
|
|
78
|
-
keytar.deletePassword(this.serviceId, this.userId)
|
|
104
|
+
this.keytar.deletePassword(this.serviceId, this.userId)
|
|
79
105
|
);
|
|
80
106
|
|
|
81
107
|
Logger.warning(`${this.serviceId} - invalid credentials removed`);
|
|
@@ -11,7 +11,7 @@ class SessionCacheProvider {
|
|
|
11
11
|
private cache = {} as SessionCache;
|
|
12
12
|
|
|
13
13
|
constructor() {
|
|
14
|
-
this.localFilePath = path.join(
|
|
14
|
+
this.localFilePath = path.join(process.cwd(), 'environments.json');
|
|
15
15
|
this.cache = {
|
|
16
16
|
currentTimestamp: new Date().toISOString(),
|
|
17
17
|
environments: {},
|
|
@@ -54,7 +54,7 @@ class ContensisCli {
|
|
|
54
54
|
process.removeAllListeners('exit');
|
|
55
55
|
const exitCode = error ? 1 : 0;
|
|
56
56
|
|
|
57
|
-
console.info(`\nExiting contensis-cli with exit code: ${exitCode}\n`);
|
|
57
|
+
// console.info(`\nExiting contensis-cli with exit code: ${exitCode}\n`);
|
|
58
58
|
process.exit(exitCode);
|
|
59
59
|
};
|
|
60
60
|
|
package/src/shell.ts
CHANGED
package/src/util/index.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import mergeWith from 'lodash/mergeWith';
|
|
2
2
|
import { Logger } from './logger';
|
|
3
|
+
import { LogMessages as enGB } from '../localisation/en-GB.js';
|
|
3
4
|
|
|
4
5
|
export const isSharedSecret = (str = '') =>
|
|
5
6
|
str.length > 80 && str.split('-').length === 3 ? str : undefined;
|
|
@@ -50,12 +51,17 @@ export const url = (alias: string, project: string) => {
|
|
|
50
51
|
};
|
|
51
52
|
|
|
52
53
|
export const Logging = async (language = 'en-GB') => {
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
54
|
+
const defaultMessages = enGB;
|
|
55
|
+
// const { LogMessages: defaultMessages } = await import(
|
|
56
|
+
// `../localisation/en-GB.js`
|
|
57
|
+
// );
|
|
58
|
+
let localisedMessages = defaultMessages;
|
|
59
|
+
|
|
60
|
+
if (language === 'en-GB') {
|
|
61
|
+
// Using a variable import e.g. `import(`../localisation/${language}.js`);`
|
|
62
|
+
// does not play well with packaged executables
|
|
63
|
+
// So we have to hard code the import for each language individually
|
|
64
|
+
}
|
|
59
65
|
return {
|
|
60
66
|
messages: mergeWith(
|
|
61
67
|
localisedMessages,
|
package/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const LIB_VERSION = "1.0.0-beta.
|
|
1
|
+
export const LIB_VERSION = "1.0.0-beta.20";
|