contensis-cli 1.3.1-beta.1 → 1.3.1-beta.2
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.
|
@@ -93,7 +93,7 @@ class ContensisCli {
|
|
|
93
93
|
const currentEnvironment = this.currentEnv;
|
|
94
94
|
const environments = this.cache.environments || {};
|
|
95
95
|
if (!currentEnvironment) return {};
|
|
96
|
-
else if (
|
|
96
|
+
else if (environments[currentEnvironment])
|
|
97
97
|
return environments[currentEnvironment];
|
|
98
98
|
else {
|
|
99
99
|
return {
|
|
@@ -1396,20 +1396,22 @@ Components:`));
|
|
|
1396
1396
|
if (contensis) {
|
|
1397
1397
|
log.line();
|
|
1398
1398
|
const entries = await contensis.GetEntries({ withDependents });
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1399
|
+
const nodes = contensis.content.source.nodes.raw;
|
|
1400
|
+
const combinedOutput = [...entries, ...nodes];
|
|
1401
|
+
await this.HandleFormattingAndOutput(combinedOutput, () => {
|
|
1402
|
+
var _a, _b;
|
|
1403
|
+
(0, import_migratortron.logEntitiesTable)({
|
|
1404
|
+
entries,
|
|
1405
|
+
projectId: currentProject,
|
|
1406
|
+
fields: (_a = contensis.payload.query) == null ? void 0 : _a.fields
|
|
1407
|
+
});
|
|
1408
|
+
if (nodes.length)
|
|
1409
|
+
(0, import_migratortron.logEntitiesTable)({
|
|
1410
|
+
nodes,
|
|
1411
|
+
projectId: currentProject,
|
|
1412
|
+
fields: (_b = contensis.payload.query) == null ? void 0 : _b.fields
|
|
1413
|
+
});
|
|
1414
|
+
});
|
|
1413
1415
|
} else {
|
|
1414
1416
|
log.warning(messages.models.noList(currentProject));
|
|
1415
1417
|
log.help(messages.connect.tip());
|
|
@@ -1439,7 +1441,13 @@ Components:`));
|
|
|
1439
1441
|
if (err) (0, import_logger.logError)(err);
|
|
1440
1442
|
else {
|
|
1441
1443
|
const { entries, nodes } = contensis.content.targets[currentProject];
|
|
1442
|
-
const output = saveEntries ? (
|
|
1444
|
+
const output = saveEntries ? (
|
|
1445
|
+
// include entries and dependent nodes when saving entries
|
|
1446
|
+
[
|
|
1447
|
+
((_a = entries.migrate) == null ? void 0 : _a.map((me) => me.toJSON())) || [],
|
|
1448
|
+
nodes.migrateNodes.map((mn) => mn.node)
|
|
1449
|
+
].flat()
|
|
1450
|
+
) : result;
|
|
1443
1451
|
await this.HandleFormattingAndOutput(output, () => {
|
|
1444
1452
|
(0, import_console.printEntriesMigrateResult)(this, result, {
|
|
1445
1453
|
showAll: logOutput === "all",
|
|
@@ -1826,9 +1834,7 @@ Components:`));
|
|
|
1826
1834
|
console.log((0, import_json.jsonFormatter)(block));
|
|
1827
1835
|
const contensis = await this.ConnectContensis();
|
|
1828
1836
|
if (contensis) {
|
|
1829
|
-
const [err, blockVersion] = await contensis.blocks.PushBlockVersion(
|
|
1830
|
-
block
|
|
1831
|
-
);
|
|
1837
|
+
const [err, blockVersion] = await contensis.blocks.PushBlockVersion(block);
|
|
1832
1838
|
if (!err) {
|
|
1833
1839
|
log.success(
|
|
1834
1840
|
messages.blocks.pushed(
|
|
@@ -1884,9 +1890,7 @@ Components:`));
|
|
|
1884
1890
|
if (contensis) {
|
|
1885
1891
|
let actionOnBlockVersion = version;
|
|
1886
1892
|
if (action === "release" && version === "latest") {
|
|
1887
|
-
const [getErr, blockVersion2] = await this.GetLatestBlockVersion(
|
|
1888
|
-
blockId
|
|
1889
|
-
);
|
|
1893
|
+
const [getErr, blockVersion2] = await this.GetLatestBlockVersion(blockId);
|
|
1890
1894
|
if (getErr) {
|
|
1891
1895
|
throw new Error(
|
|
1892
1896
|
`${messages.blocks.noList(
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/services/ContensisCliService.ts"],
|
|
4
|
-
"sourcesContent": ["import to from 'await-to-js';\nimport chalk from 'chalk';\nimport fs from 'fs';\nimport inquirer from 'inquirer';\nimport fetch from 'node-fetch';\nimport path from 'path';\nimport clone from 'rfdc';\n\nimport { Component, ContentType, Project } from 'contensis-core-api';\nimport { Role } from 'contensis-management-api/lib/models';\nimport {\n ContensisMigrationService,\n MigrateRequest,\n PushBlockParams,\n SourceCms,\n ContentTypesResult,\n Model,\n BlockActionType,\n logEntitiesTable,\n} from 'migratortron';\n\nimport ContensisAuthService from './ContensisAuthService';\n\nimport { LogMessages } from '~/localisation/en-GB';\nimport {\n CliUrls,\n OutputFormat,\n OutputOptionsConstructorArg,\n} from '~/models/CliService';\n\nimport { readFileAsJSON } from '~/providers/file-provider';\nimport SessionCacheProvider from '../providers/SessionCacheProvider';\nimport CredentialProvider from '~/providers/CredentialProvider';\n\nimport {\n isPassword,\n isSharedSecret,\n isUuid,\n tryParse,\n tryStringify,\n url,\n} from '~/util';\nimport { sanitiseIds } from '~/util/api-ids';\nimport {\n printBlockVersion,\n printEntriesMigrateResult,\n printModelMigrationAnalysis,\n printModelMigrationResult,\n printNodeTreeOutput,\n printNodesMigrateResult,\n} from '~/util/console.printer';\nimport { csvFormatter } from '~/util/csv.formatter';\nimport { jsonFormatter, limitFields } from '~/util/json.formatter';\nimport { xmlFormatter } from '~/util/xml.formatter';\nimport { isDebug } from '~/util/debug';\nimport { diffLogStrings } from '~/util/diff';\nimport { findByIdOrName } from '~/util/find';\nimport { logError, Logger } from '~/util/logger';\nimport { promiseDelay } from '~/util/timers';\n\nlet insecurePasswordWarningShown = false;\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 format?: OutputFormat;\n private output?: string;\n private session: SessionCacheProvider;\n\n auth?: ContensisAuthService;\n command: CliCommand;\n contensis?: ContensisMigrationService;\n contensisOpts: Partial<MigrateRequest>;\n currentProject: string;\n debug = isDebug();\n\n sourceAlias?: string;\n targetEnv?: string;\n urls: CliUrls;\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\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?: OutputOptionsConstructorArg,\n contensisOpts: Partial<MigrateRequest> = {}\n ) {\n // console.log('args: ', JSON.stringify(args, null, 2));\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\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} ${restArgs ? restArgs.join(' ') : ''\n }`.trim();\n\n this.session = new SessionCacheProvider();\n\n this.contensisOpts = contensisOpts;\n\n // Explicitly sanitise supplied fields to api-friendly ids\n if (Array.isArray(this.contensisOpts.query?.fields)) {\n this.contensisOpts.query.fields = sanitiseIds(\n this.contensisOpts.query.fields\n );\n }\n\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 // Set env from command options\n const env = this.env;\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 if (outputOpts.sharedSecret.startsWith('-'))\n throw new Error(\n `Shared secret option provided a value of ${outputOpts.sharedSecret}`\n );\n else env.passwordFallback = outputOpts.sharedSecret;\n\n this.currentProject = env?.currentProject || 'null';\n this.sourceAlias = outputOpts?.sourceAlias || currentEnvironment;\n\n if (currentEnvironment) {\n this.urls = url(currentEnvironment, env?.currentProject || 'website');\n }\n\n this.command = {\n commandText,\n options: outputOpts as any,\n createdDate: new Date().toISOString(),\n invokedBy: 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 = async () => {\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 await 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 // eslint-disable-next-line @typescript-eslint/no-unused-vars\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 if (!this.contensis) {\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 return this.contensis;\n };\n\n ConnectContensisImport = async ({\n commit = false,\n fromFile,\n importDataType,\n }: {\n commit?: boolean;\n fromFile?: string;\n importDataType?:\n | 'entries'\n | 'contentTypes'\n | 'components'\n | 'models'\n | 'nodes'\n | 'user-input';\n }) => {\n const source: 'contensis' | 'file' = fromFile ? 'file' : 'contensis';\n\n const fileData = fromFile ? (await readFileAsJSON(fromFile)) || [] : [];\n\n if (typeof fileData === 'string')\n throw new Error(`Import file format must be of type JSON`);\n\n const { contensisOpts, currentEnv, env, log, messages, sourceAlias } = this;\n const environments = this.cache.environments || {};\n const sourceEnvironment = environments[sourceAlias || ''] || {};\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(sourceAlias || '', 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 sourceAlias,\n false\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' || importDataType === 'user-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 ...(importDataType ? { [importDataType]: fileData } : {}),\n },\n !commit\n );\n } else 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 return this.contensis;\n };\n\n GetCredentials = async (\n userId: string,\n password?: string,\n currentEnv = this.currentEnv,\n saveCurrentEnv = true\n ): Promise<CredentialProvider | undefined> => {\n const { 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(\n `Unable to find credentials for user ${userId} at ${currentEnv}`,\n credentialError as any\n );\n return;\n }\n\n if (credentials.remarks.secure !== true) {\n if (!insecurePasswordWarningShown) {\n log.warning(messages.login.insecurePassword());\n insecurePasswordWarningShown = true;\n }\n } else {\n const env = this.cache.environments[currentEnv];\n env.passwordFallback = undefined;\n this.session.UpdateEnv(env, currentEnv, saveCurrentEnv);\n }\n return credentials;\n }\n };\n\n Login = async (\n userId: string,\n {\n password = '',\n promptPassword = true,\n sharedSecret = '',\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\n if (!inputPassword)\n inputPassword =\n isSharedSecret(this.env.passwordFallback) ||\n isPassword(this.env.passwordFallback) ||\n '';\n\n const { 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 this.auth = 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(this.auth.BearerToken());\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\n // Persist env before finding projects or doing anything else\n this.session.UpdateEnv(env);\n if (inputPassword) await credentials.Save(inputPassword);\n if (sharedSecret) await credentials.Save(sharedSecret);\n\n if (!silent) {\n Logger.success(messages.login.success(currentEnv, userId));\n await this.PrintProjects();\n }\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 PrintContensisVersion = async () => {\n const { log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve projects list for env\n const [projectsErr, projects] = await to(\n contensis.projects.GetSourceProjects()\n );\n\n if (Array.isArray(projects)) {\n // Print contensis version to console\n await this.HandleFormattingAndOutput(contensis.contensisVersion, () =>\n log.raw(log.highlightText(contensis.contensisVersion))\n );\n }\n\n if (projectsErr) {\n log.error(messages.projects.noList());\n log.error(projectsErr.message);\n }\n }\n };\n\n PrintBearerToken = async () => {\n const { log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve token for env\n const [error, token] = await to(\n contensis.content.sourceRepo.repo.BearerToken()\n );\n if (token) {\n // Print bearer token to console\n await this.HandleFormattingAndOutput(token, () =>\n log.raw(log.highlightText(token))\n );\n }\n\n if (error) {\n log.error(messages.projects.noList());\n log.error(error.message);\n }\n }\n };\n\n PrintProjects = async () => {\n const { currentProject, log, messages, session } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve projects list for env\n const [projectsErr, projects] = await to(\n 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 log.raw('');\n\n await this.HandleFormattingAndOutput(projects, () => {\n // print the projects to console\n for (const project of projects.sort((a, b) =>\n a.id.localeCompare(b.id)\n )) {\n let color;\n try {\n color = chalk.keyword((project as any).color);\n } catch (ex) {\n Logger.debug(`${ex}`);\n color = chalk.white;\n }\n console.log(\n `${nextCurrentProject === project.id\n ? `>> ${log.boldText(color(project.id))}`\n : ` ${color(project.id)}`\n } ${log.infoText(\n `[${project.supportedLanguages\n .map(l =>\n l === project.primaryLanguage ? `*${log.boldText(l)}` : l\n )\n .join(' ')}]`\n )}`\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 PrintProject = async (projectId = this.currentProject) => {\n const { log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve projects list for env\n const [projectsErr, projects] = await to(\n contensis.projects.GetSourceProjects()\n );\n\n const foundProject = projects?.find(\n p => p.id.toLowerCase() === projectId.toLowerCase()\n );\n\n if (foundProject) {\n log.raw('');\n await this.HandleFormattingAndOutput(foundProject, log.object);\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 log.raw('');\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 PrintApiKeys = async () => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve keys list for env\n const [keysErr, apiKeys] = await contensis.apiKeys.GetKeys();\n\n if (Array.isArray(apiKeys)) {\n log.success(messages.keys.list(currentEnv));\n await 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}${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 = '') => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n const [err, key] = await contensis.apiKeys.CreateKey(name, description);\n\n if (key) {\n log.success(messages.keys.created(currentEnv, name));\n\n // print the key details to console\n console.log(\n ` - ${chalk.bold(key.name)} [${key.dateModified\n .toString()\n .substring(0, 10)} ${key.modifiedBy}]`\n );\n if (key.description)\n console.log(` ${log.infoText(key.description)}`);\n console.log(` ${chalk.bold.grey`id`}: ${key.id}`);\n console.log(\n ` ${chalk.bold.grey`sharedSecret`}: ${key.sharedSecret}`\n );\n console.log('');\n log.help(messages.keys.tip());\n }\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 const contensis = await this.ConnectContensis({ commit: true });\n\n if (contensis) {\n const [err] = await 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 PrintRoles = async () => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve roles list for env\n const [rolesErr, roles] = await to(contensis.roles.GetRoles());\n\n if (Array.isArray(roles)) {\n log.success(messages.roles.list(currentEnv));\n\n if (!roles.length) log.help(messages.roles.noneExist());\n\n await this.HandleFormattingAndOutput(roles, () => {\n // print the roles to console\n for (const {\n id,\n name,\n description,\n enabled,\n assignments,\n permissions,\n } of roles) {\n const color = enabled ? (s: string) => s : log.infoText;\n\n console.log(color(` - ${chalk.bold(name)} ${log.infoText(id)}`));\n if (description) console.log(log.infoText(` ${description}`));\n if (enabled === false)\n console.log(` ${chalk.bold.grey('enabled')}: false`);\n if (assignments.groups?.length)\n console.log(\n ` ${chalk.bold.grey('groups')}: ${assignments.groups.join(\n ', '\n )}`\n );\n if (assignments.users?.length)\n console.log(\n ` ${chalk.bold.grey('users')}: ${assignments.users.join(\n ', '\n )}`\n );\n if (assignments.apiKeys?.length)\n console.log(\n ` ${chalk.bold.grey('keys')}: ${assignments.apiKeys.join(\n ', '\n )}`\n );\n\n if (permissions.entries?.length) {\n console.log(` ${chalk.bold.grey('entries')}:`);\n for (const p of permissions.entries)\n console.log(\n ` ${p.id}: ${log.infoText(\n p.actions.length > 2\n ? p.actions.length\n : p.actions.join(', ')\n )}`\n );\n }\n if (permissions.contentTypes?.length)\n console.log(\n ` ${chalk.bold.grey(\n 'contentTypes'\n )}: ${permissions.contentTypes\n .map(\n p =>\n `${p.id} [${p.actions.join(',')}] ${(\n p as any\n ).languages.join(' ')}`\n )\n .join(', ')}`\n );\n }\n });\n }\n\n if (rolesErr) {\n log.error(messages.roles.noList(currentEnv));\n log.error(jsonFormatter(rolesErr));\n }\n }\n };\n\n PrintRole = async (roleNameOrId: string) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve roles list for env\n const [rolesErr, roles] = await to(contensis.roles.GetRoles());\n\n if (Array.isArray(roles)) {\n log.success(messages.roles.list(currentEnv));\n\n const role = findByIdOrName(roles, roleNameOrId);\n\n if (role) await this.HandleFormattingAndOutput(role, log.object);\n else log.error(messages.roles.failedGet(currentEnv, roleNameOrId));\n }\n\n if (rolesErr) {\n log.error(messages.roles.noList(currentEnv));\n log.error(jsonFormatter(rolesErr));\n }\n }\n };\n\n CreateRole = async (role: Partial<Role>) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n const [err, created] = await contensis.roles.CreateRole(role as Role);\n\n if (created) {\n log.success(\n messages.roles.created(currentEnv, role.id || role.name || '')\n );\n\n await this.HandleFormattingAndOutput(created, log.object);\n\n log.help(messages.roles.tip());\n return role.id;\n }\n\n if (err) {\n log.error(\n messages.roles.failedCreate(currentEnv, role.id || role.name || ''),\n err\n );\n }\n }\n };\n\n UpdateRole = async (roleNameOrId: string, role: Partial<Role>) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve roles list for env\n const [rolesErr, roles] = await to(contensis.roles.GetRoles());\n\n if (Array.isArray(roles)) {\n log.success(messages.roles.list(currentEnv));\n\n const existingRole = findByIdOrName(roles, roleNameOrId, true);\n if (existingRole) {\n log.info(messages.roles.setPayload());\n log.object(role);\n log.raw(``);\n const [updateErr, updated] = await contensis.roles.UpdateRole(\n existingRole.id,\n role\n );\n if (updateErr)\n log.error(messages.roles.failedSet(currentEnv, roleNameOrId));\n else {\n log.success(messages.roles.set());\n\n await this.HandleFormattingAndOutput(updated, log.object);\n }\n } else {\n // Role does not exist\n log.error(messages.roles.failedGet(currentEnv, roleNameOrId));\n }\n }\n\n if (rolesErr) {\n log.error(messages.roles.noList(currentEnv));\n log.error(jsonFormatter(rolesErr));\n }\n }\n };\n\n RemoveRole = async (roleNameOrId: string) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve roles list for env\n const [rolesErr, roles] = await to(contensis.roles.GetRoles());\n\n if (Array.isArray(roles)) {\n log.success(messages.roles.list(currentEnv));\n\n const existingRole = findByIdOrName(roles, roleNameOrId, true);\n\n if (existingRole) {\n const [deleteErr] = await contensis.roles.RemoveRole(existingRole.id);\n\n if (deleteErr)\n log.error(messages.roles.failedRemove(currentEnv, roleNameOrId));\n else log.success(messages.roles.removed(currentEnv, roleNameOrId));\n } else {\n // Role does not exist\n log.error(messages.roles.failedGet(currentEnv, roleNameOrId));\n }\n }\n\n if (rolesErr) {\n log.error(messages.roles.noList(currentEnv));\n log.error(jsonFormatter(rolesErr));\n }\n }\n };\n\n PrintWorkflows = async () => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve workflows list for env\n const [workflowsErr, workflows] =\n await contensis.content.sourceRepo.workflows.GetWorkflows();\n\n if (Array.isArray(workflows)) {\n log.success(messages.workflows.list(currentEnv));\n\n if (!workflows.length) log.help(messages.workflows.noneExist());\n\n const stringFromLanguageObject = (o: { [lang: string]: string }) =>\n Object.values(o || {})?.[0];\n\n await this.HandleFormattingAndOutput(workflows, () => {\n // print the workflows to console\n // log.object(workflows);\n for (const {\n id,\n name,\n description,\n states,\n eventGroups,\n isSystem,\n } of workflows as any) {\n const color = isSystem ? (s: string) => s : log.infoText;\n\n console.log(\n color(\n ` - ${chalk.bold(\n stringFromLanguageObject(name)\n )} ${log.infoText(id)}`\n )\n );\n if (description)\n console.log(\n log.infoText(` ${stringFromLanguageObject(description)}`)\n );\n if (isSystem === false)\n console.log(` ${chalk.bold.grey('isSystem')}: false`);\n if (states?.length)\n console.log(\n ` ${chalk.bold.grey('states')}: ${states\n .map((state: any) => state.id)\n .join(', ')}`\n );\n if (eventGroups?.length)\n console.log(\n ` ${chalk.bold.grey('eventGroups')}: ${eventGroups\n .map((evtGrp: any) => evtGrp.id)\n .join(', ')}`\n );\n }\n });\n }\n\n if (workflowsErr) {\n log.error(messages.workflows.noList(currentEnv));\n log.error(jsonFormatter(workflowsErr));\n }\n }\n };\n\n PrintWorkflow = async (workflowNameOrId: string) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve workflows list for env\n const [workflowsErr, workflows] =\n await contensis.content.sourceRepo.workflows.GetWorkflows();\n\n if (Array.isArray(workflows)) {\n log.success(messages.workflows.list(currentEnv));\n\n const workflow = findByIdOrName(workflows, workflowNameOrId);\n\n if (workflow)\n await this.HandleFormattingAndOutput(workflow, log.object);\n else\n log.error(messages.workflows.failedGet(currentEnv, workflowNameOrId));\n }\n\n if (workflowsErr) {\n log.error(messages.workflows.noList(currentEnv));\n log.error(jsonFormatter(workflowsErr));\n }\n }\n };\n\n CreateProject = async (project: Project) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n const [err, created] = await contensis.projects.CreateProject(project);\n\n if (created) {\n log.success(messages.projects.created(currentEnv, project.id));\n\n await this.HandleFormattingAndOutput(created, () => {\n // set the CLI project to the newly created project\n this.SetProject(project.id);\n // print all the projects to console\n this.PrintProjects();\n });\n return project.id;\n }\n\n if (err) {\n log.error(messages.projects.failedCreate(currentEnv, project.id), err);\n }\n }\n };\n\n UpdateProject = async (project: Partial<Project>) => {\n const { currentEnv, currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n const [err, updated] = await contensis.projects.UpdateProject({\n id: currentProject,\n ...project,\n });\n\n if (updated) {\n log.success(messages.projects.updated(currentEnv, currentProject));\n\n await this.HandleFormattingAndOutput(updated, log.object);\n return updated.id;\n }\n\n if (err) {\n log.error(\n messages.projects.failedUpdate(currentEnv, currentProject),\n err\n );\n }\n }\n };\n\n PrintContentModels = async (\n modelIds: string[] = [],\n opts: { export?: boolean; requiredBy?: boolean }\n ) => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve models list for env\n const models = await contensis.models.contentModels();\n const contentTypes = await contensis.models.contentTypes();\n const components = await contensis.models.components();\n\n // Models to output to console\n const returnModels = modelIds?.length\n ? models?.filter((m: Model) =>\n modelIds.some(id => id.toLowerCase() === m.id.toLowerCase())\n )\n : undefined;\n const exportResources: (ContentType | Component)[] = [];\n\n if (opts.export) {\n // Generate a list of contentTypeIds and componentIds from all models\n // and dependencies\n const contentTypeIds = Array.from(\n new Set([\n ...(returnModels || models || []).map(m => m.id),\n ...(returnModels || models || [])\n .map(m => m.dependencies?.contentTypes?.map(c => c[0]) || [])\n .flat(),\n ])\n );\n const componentIds = Array.from(\n new Set(\n (returnModels || models || [])\n .map(m => m.dependencies?.components?.map(c => c[0]) || [])\n .flat()\n )\n );\n\n // Create an array of all the content types and component definitions\n // we will use this when outputting to a file\n exportResources.push(\n ...contentTypes.filter(c =>\n contentTypeIds\n .map(i => i.toLowerCase())\n .includes(c.id.toLowerCase())\n ),\n ...components.filter(c =>\n componentIds.map(i => i.toLowerCase()).includes(c.id.toLowerCase())\n )\n );\n }\n\n if (Array.isArray(returnModels)) {\n log.success(messages.models.list(currentProject));\n await this.HandleFormattingAndOutput(\n opts.export ? exportResources : returnModels,\n () => {\n // print the content models to console\n for (const model of returnModels) {\n // create a clone of each model to safely modify\n const draft = clone()(model);\n if (!opts.requiredBy) {\n // truncate parts of the output\n delete draft.dependencyOf;\n if (draft.dependencies?.contentTypes)\n draft.dependencies.contentTypes.forEach(id => id.pop());\n if (draft.dependencies?.components)\n draft.dependencies.components.forEach(id => id.pop());\n }\n\n log.raw('');\n log.object(draft);\n }\n log.raw('');\n }\n );\n } else {\n log.success(\n messages.models.get(currentProject, models?.length.toString() || '0')\n );\n log.raw('');\n if (models?.length) {\n await this.HandleFormattingAndOutput(\n opts.export ? exportResources : models,\n () => {\n // print the content models to console\n for (const model of models) {\n const components = model.components?.length || 0;\n const contentTypes = model.contentTypes?.length || 0;\n const defaults =\n (model.defaults?.length || 0) + (model.nodes?.length || 0);\n const dependencies =\n (model.dependencies?.components?.length || 0) +\n (model.dependencies?.contentTypes?.length || 0);\n const dependencyOf =\n (model.dependencyOf?.components?.length || 0) +\n (model.dependencyOf?.contentTypes?.length || 0);\n\n const hasAny =\n components + contentTypes + dependencies + dependencyOf;\n log.raw(\n ` - ${log.highlightText(log.boldText(model.id))} ${hasAny\n ? log.infoText(\n `{ ${components ? `components: ${components}, ` : ''\n }${contentTypes\n ? `contentTypes: ${contentTypes}, `\n : ''\n }${defaults ? `defaults: ${defaults}, ` : ''}${dependencies ? `references: ${dependencies}, ` : ''\n }${dependencyOf ? `required by: ${dependencyOf}` : ''\n } }`\n )\n : ''\n }`\n );\n }\n log.raw('');\n }\n );\n }\n }\n }\n };\n\n ImportContentModels = async ({\n commit,\n fromFile,\n }: {\n commit: boolean;\n fromFile: string;\n }) => {\n const { currentProject, log, messages } = this;\n\n const fileData = fromFile\n ? (await readFileAsJSON<(ContentType | Component)[]>(fromFile)) || []\n : [];\n if (typeof fileData === 'string')\n throw new Error(`Import file format must be of type JSON`);\n\n const contensis = await this.ConnectContensisImport({\n commit,\n fromFile,\n importDataType: 'models',\n });\n\n if (contensis) {\n log.line();\n if (contensis.isPreview) {\n console.log(log.successText(` -- IMPORT PREVIEW -- `));\n } else {\n console.log(log.warningText(` *** COMMITTING IMPORT *** `));\n }\n\n const [migrateErr, result] = await contensis.MigrateContentModels();\n\n if (migrateErr) logError(migrateErr);\n else\n await this.HandleFormattingAndOutput(result, () => {\n // print the results to console\n if (!result.committed) {\n log.raw(log.boldText(`\\nContent types:`));\n if (!result.contentTypes) log.info(`- None returned\\n`);\n else printModelMigrationAnalysis(this, result.contentTypes);\n\n log.raw(log.boldText(`\\nComponents:`));\n if (!result.components) log.info(`- None returned\\n`);\n else printModelMigrationAnalysis(this, result.components);\n\n if (result.defaults && Object.keys(result.defaults).length) {\n log.raw(log.boldText(`\\nDefaults:`));\n printModelMigrationAnalysis(this, result.defaults);\n }\n if (result.nodes && Object.keys(result.nodes).length) {\n log.raw(log.boldText(`\\nNodes:`));\n printModelMigrationAnalysis(this, result.nodes);\n }\n if (result.errors) {\n log.raw(log.boldText(`\\nErrors:`));\n log.object(result.errors);\n }\n } else {\n const { modelsResult = {} } = result;\n log.raw(log.boldText(`\\nContent types:`));\n printModelMigrationResult(\n this,\n modelsResult[currentProject].contentTypes\n );\n // Only output for components if any status has any results\n if (\n Object.values(modelsResult[currentProject].components).some(\n r => r.length > 0\n )\n ) {\n log.raw(log.boldText(`\\nComponents:`));\n printModelMigrationResult(\n this,\n modelsResult[currentProject].components\n );\n }\n if (\n Object.values(modelsResult[currentProject].defaults || {}).some(\n r => r.length > 0\n )\n ) {\n log.raw(log.boldText(`\\nDefaults:`));\n printModelMigrationResult(\n this,\n modelsResult[currentProject].defaults\n );\n }\n if (\n Object.values(modelsResult[currentProject].nodes || {}).some(\n r => r.length > 0\n )\n ) {\n log.raw(log.boldText(`\\nNodes:`));\n printModelMigrationResult(\n this,\n modelsResult[currentProject].nodes\n );\n }\n }\n });\n } else {\n log.warning(messages.models.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n PrintContentTypes = async () => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve content types list for env\n const contentTypes = await contensis.models.contentTypes();\n\n if (Array.isArray(contentTypes)) {\n log.success(messages.contenttypes.list(currentProject));\n await 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${fieldsLength !== 1 ? 's' : ''\n }]`\n );\n }\n });\n }\n }\n };\n\n PrintContentType = async (contentTypeId: string) => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve content types list for env\n const contentTypes = await contensis.models.contentTypes();\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 await 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 const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: 'user-input', // 'user-input' import type does not require a source cms\n });\n if (contensis) {\n const [err, result] = await contensis.DeleteContentTypes(contentTypeIds);\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 !contensis.isPreview\n )\n );\n // print the results to console\n await this.HandleFormattingAndOutput(result, log.object);\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\n ? (await readFileAsJSON<ContentType[]>(fromFile)) || []\n : [];\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 const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: fromFile ? 'user-input' : undefined,\n });\n\n if (contensis) {\n if (fromFile)\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, , createStatus] =\n await 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 await this.HandleFormattingAndOutput(contentType, () => { });\n }\n }\n else {\n const result = await contensis.simpleMigration.Migrate(\n contentTypeIds,\n []\n );\n await this.HandleFormattingAndOutput(result, log.object);\n }\n }\n };\n\n DiffModels = async (\n {\n fromFile,\n }: {\n fromFile: string;\n },\n modelIds: string[] = []\n ) => {\n const { log } = this;\n\n let fileData = fromFile\n ? (await readFileAsJSON<ContentType[]>(fromFile)) || []\n : [];\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 const contensis = await this.ConnectContensisImport({\n fromFile,\n importDataType: 'models',\n });\n\n if (contensis) {\n const [err, result] = (await to(\n contensis.models.Diff(fileData.length ? fileData : modelIds)\n )) as [Error | null, ContentTypesResult | undefined];\n\n if (err) log.error(err.message, err);\n if (result)\n // print the content type to console\n await this.HandleFormattingAndOutput(result, () => {\n log.success(\n `Queried models ${log.infoText(\n `\"${result.query.modelIds?.join(', ')}\"`\n )}\\n`\n );\n if (result.committed === false) {\n log.raw(log.boldText(`Content types:`));\n if (!result.contentTypes) log.info(`- None returned\\n`);\n else printModelMigrationAnalysis(this, result.contentTypes);\n\n log.raw(log.boldText(`\\nComponents:`));\n if (!result.components) log.info(`- None returned\\n`);\n else printModelMigrationAnalysis(this, result.components);\n }\n });\n }\n };\n\n PrintComponents = async () => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve components list for env\n const components = await contensis.models.components();\n\n if (Array.isArray(components)) {\n log.success(messages.components.list(currentProject));\n\n await 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${fieldsLength !== 1 ? 's' : ''\n }]`\n );\n }\n });\n }\n }\n };\n\n PrintComponent = async (componentId: string) => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve content types list for env\n const components = await contensis.models.components();\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 await 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 const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: 'user-input', // 'user-input' import type does not require a source cms\n });\n if (contensis) {\n const [err, result] = await 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 !contensis.isPreview\n )\n );\n // print the results to console\n await this.HandleFormattingAndOutput(result, log.object);\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\n ? (await readFileAsJSON<Component[]>(fromFile)) || []\n : [];\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 const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: fromFile ? 'user-input' : undefined,\n });\n\n if (contensis) {\n // Pass each component to the target repo\n if (fromFile)\n for (const component of fileData) {\n // Fix invalid data\n component.projectId = currentProject;\n delete component.uuid;\n\n const [err, , createStatus] =\n await 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 await this.HandleFormattingAndOutput(component, () => { });\n }\n }\n else {\n const result = await contensis.simpleMigration.Migrate(\n [],\n componentIds\n );\n await this.HandleFormattingAndOutput(result, log.object);\n }\n }\n };\n\n RemoveEntries = async (commit = false) => {\n const { currentEnv, currentProject, log, messages } = this;\n const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: 'user-input', // 'user-input' import type does not require a source cms\n });\n\n if (contensis) {\n if (contensis.isPreview) {\n console.log(log.successText(` -- PREVIEW -- `));\n } else {\n console.log(log.warningText(` *** COMMITTING DELETE *** `));\n }\n const [err, result] = await contensis.DeleteEntries();\n if (result)\n await this.HandleFormattingAndOutput(result, () => {\n // print the migrateResult to console\n printEntriesMigrateResult(this, result, {\n action: 'delete',\n showAll: true,\n });\n });\n if (\n !err &&\n ((!commit && result.entriesToMigrate[currentProject].totalCount) ||\n (commit && result.migrateResult?.deleted))\n ) {\n log.success(messages.entries.removed(currentEnv, commit));\n if (!commit) {\n log.raw(``);\n log.help(messages.entries.commitTip());\n }\n } else {\n log.error(messages.entries.failedRemove(currentEnv), err);\n if (!result?.entriesToMigrate?.[currentProject]?.totalCount)\n log.help(messages.entries.notFound(currentEnv));\n }\n }\n };\n\n GetEntries = async ({\n withDependents = false,\n }: {\n withDependents?: boolean;\n } = {}) => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n log.line();\n const entries = await contensis.GetEntries({ withDependents });\n // TODO: iterate entries and add some extra details to help\n // with importing later\n // Add a full sys.uri to asset entries\n // Add sys.metadata.exportCms\n // Add sys.metadata.exportProjectId\n\n await this.HandleFormattingAndOutput(entries, () =>\n // print the entries to console\n logEntitiesTable({\n entries,\n projectId: currentProject,\n fields: contensis.payload.query?.fields,\n })\n );\n } else {\n log.warning(messages.models.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n ImportEntries = async ({\n commit,\n fromFile,\n logOutput,\n saveEntries,\n }: {\n commit: boolean;\n fromFile: string;\n logOutput: string;\n saveEntries: boolean;\n }) => {\n const { currentEnv, currentProject, log, messages } = this;\n\n const contensis = await this.ConnectContensisImport({\n commit,\n fromFile,\n importDataType: 'entries',\n });\n\n if (contensis) {\n log.line();\n if (contensis.isPreview) {\n console.log(log.successText(` -- IMPORT PREVIEW -- `));\n } else {\n console.log(log.warningText(` *** COMMITTING IMPORT *** `));\n }\n\n const [err, result] = await contensis.MigrateEntries();\n\n if (err) logError(err);\n else {\n const { entries, nodes } = contensis.content.targets[currentProject];\n\n const output = saveEntries\n ? entries.migrate?.map(me => me.toJSON())\n : result;\n await this.HandleFormattingAndOutput(output, () => {\n // print the migrateResult to console\n printEntriesMigrateResult(this, result, {\n showAll: logOutput === 'all',\n showDiff: logOutput === 'all' || logOutput === 'changes',\n showChanged: logOutput === 'changes',\n });\n if (['all', 'changes'].includes(logOutput))\n printNodeTreeOutput(\n this,\n {\n ...nodes.rootAncestor,\n status: 'no change',\n children: nodes.migrateNodes as any,\n },\n logOutput\n );\n });\n }\n if (\n !err &&\n !result.errors?.length &&\n ((!commit && result.entriesToMigrate[currentProject].totalCount) ||\n (commit &&\n (result.migrateResult?.created || result.migrateResult?.updated)))\n ) {\n log.success(\n messages.entries.imported(\n currentEnv,\n commit,\n commit\n ? (result.migrateResult?.created || 0) +\n (result.migrateResult?.updated || 0)\n : result.entriesToMigrate[currentProject].totalCount,\n commit\n ? (result.nodesResult?.created || 0) +\n (result.nodesResult?.updated || 0)\n : (result.nodesToMigrate?.[currentProject]\n .totalCount as number) || 0\n )\n );\n if (!commit) {\n log.raw(``);\n log.help(messages.entries.commitTip());\n }\n } else {\n log.error(messages.entries.failedImport(currentEnv), err);\n if (!result?.entriesToMigrate?.[currentProject]?.totalCount)\n log.help(messages.entries.notFound(currentEnv));\n }\n } else {\n log.warning(messages.models.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n CopyEntryField = async ({\n commit,\n fromFile,\n logOutput,\n saveEntries,\n }: {\n commit: boolean;\n fromFile: string;\n logOutput: string;\n saveEntries: boolean;\n }) => {\n const { currentEnv, currentProject, log, messages } = this;\n\n const contensis = await this.ConnectContensisImport({\n commit,\n fromFile,\n importDataType: 'entries',\n });\n\n if (contensis) {\n log.line();\n if (contensis.isPreview) {\n console.log(log.successText(` -- IMPORT PREVIEW -- `));\n } else {\n console.log(log.warningText(` *** COMMITTING IMPORT *** `));\n }\n\n const [err, result] = await to(\n contensis.content.copy.MigrateFieldContent()\n );\n\n if (err) logError(err);\n if (result) {\n const output = saveEntries\n ? contensis.content.copy.targets[currentProject].entries.migrate?.map(\n me => me.toJSON()\n )\n : result;\n await this.HandleFormattingAndOutput(output, () => {\n // print the migrateResult to console\n printEntriesMigrateResult(this, result, {\n showAll: logOutput === 'all',\n showDiff: logOutput === 'all' || logOutput === 'changes',\n showChanged: logOutput === 'changes',\n });\n });\n }\n\n if (\n result &&\n !err &&\n !result.errors?.length &&\n ((!commit && result.entriesToMigrate[currentProject].totalCount) ||\n (commit &&\n (result.migrateResult?.created || result.migrateResult?.updated)))\n ) {\n log.success(\n messages.entries.imported(\n currentEnv,\n commit,\n commit\n ? (result.migrateResult?.created || 0) +\n (result.migrateResult?.updated || 0)\n : result.entriesToMigrate[currentProject].totalCount\n )\n );\n if (!commit) {\n log.raw(``);\n log.help(messages.entries.commitTip());\n }\n } else {\n log.error(messages.entries.failedImport(currentEnv), err);\n if (!result?.entriesToMigrate?.[currentProject]?.totalCount)\n log.help(messages.entries.notFound(currentEnv));\n }\n } else {\n log.warning(messages.models.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n GetNodes = async (rootPath: string, depth = 0) => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n log.line();\n const [err, nodes] = await to(contensis.nodes.GetNodes(rootPath, depth));\n if (err) {\n log.error(messages.nodes.failedGet(currentProject), err);\n return;\n }\n const root = contensis.nodes.sourceRepo.nodes.tree;\n\n log.success(messages.nodes.get(currentProject, rootPath, depth));\n\n await this.HandleFormattingAndOutput(nodes, () => {\n // print the nodes to console\n log.object({ ...root, children: undefined, language: undefined });\n printNodeTreeOutput(this, root);\n });\n } else {\n log.warning(messages.models.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n ImportNodes = async ({\n commit,\n fromFile,\n logOutput,\n logLimit,\n }: {\n commit: boolean;\n fromFile: string;\n logOutput: string;\n logLimit: number;\n }) => {\n const { currentEnv, currentProject, log, messages } = this;\n\n const contensis = await this.ConnectContensisImport({\n commit,\n fromFile,\n importDataType: 'nodes',\n });\n\n if (contensis) {\n log.line();\n if (contensis.isPreview) {\n console.log(log.successText(` -- IMPORT PREVIEW -- `));\n } else {\n console.log(log.warningText(` *** COMMITTING IMPORT *** `));\n }\n\n const [err, result] = await contensis.MigrateNodes();\n\n if (err) log.raw(``);\n else\n await this.HandleFormattingAndOutput(result, () => {\n // print the migrateResult to console\n const migrateTree =\n contensis.nodes.targetRepos[currentProject].nodes\n .migrateNodesTreeView;\n printNodeTreeOutput(this, migrateTree, logOutput, logLimit);\n printNodesMigrateResult(this, result, {\n showAll: logOutput === 'all',\n showChanged: logOutput === 'changes',\n });\n });\n\n const nodesMigrateCount =\n result?.nodesToMigrate?.[currentProject].totalCount;\n const nodesCreated = result?.nodesResult?.['created'] || 0;\n const nodesUpdated = result?.nodesResult?.['updated'] || 0;\n const nodesErrored = result?.nodesResult?.['errors'] || 0;\n const noChanges =\n result?.nodesToMigrate?.[currentProject]['no change'] &&\n nodesMigrateCount === 0;\n\n if (\n !err &&\n (!result.errors?.length || this.contensisOpts.ignoreErrors) &&\n ((!commit && nodesMigrateCount) ||\n (commit && (nodesCreated || nodesUpdated || result.errors?.length)))\n ) {\n let totalCount: number;\n if (commit) {\n const created = typeof nodesCreated === 'number' ? nodesCreated : 0;\n const updated = typeof nodesUpdated === 'number' ? nodesUpdated : 0;\n\n totalCount = created + updated;\n } else {\n totalCount =\n typeof nodesMigrateCount === 'number' ? nodesMigrateCount : 0;\n }\n\n log.success(messages.nodes.imported(currentEnv, commit, totalCount));\n log.raw(``);\n if (!commit) {\n log.help(messages.nodes.commitTip());\n }\n } else {\n if (noChanges && !err && !nodesErrored) {\n log.help(messages.nodes.noChange(currentEnv));\n } else {\n log.error(messages.nodes.failedImport(currentEnv), err);\n if (!nodesMigrateCount) log.help(messages.nodes.notFound(currentEnv));\n }\n }\n } else {\n log.warning(messages.models.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n RemoveNodes = async (commit = false) => {\n const { currentEnv, currentProject, log, messages } = this;\n const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: 'user-input', // 'user-input' import type does not require a source cms\n });\n\n if (contensis) {\n if (contensis.isPreview) {\n console.log(log.successText(` -- PREVIEW -- `));\n } else {\n console.log(log.warningText(` *** COMMITTING DELETE *** `));\n }\n const [err, result] = await contensis.DeleteNodes();\n if (result) {\n await this.HandleFormattingAndOutput(result, () => {\n // print the migrateResult to console\n printNodeTreeOutput(\n this,\n contensis.nodes.targetRepos[currentProject].nodes\n .migrateNodesTreeView\n );\n // printNodesMigrateResult(this, result, {\n // action: 'delete',\n // showAll: true,\n // });\n });\n }\n if (\n !err &&\n ((!commit && result.nodesToMigrate[currentProject].totalCount) ||\n (commit && result.nodesResult?.deleted))\n ) {\n log.success(\n messages.nodes.removed(currentEnv, commit, contensis.nodes.rootPath)\n );\n log.raw(``);\n if (!commit) {\n log.help(messages.nodes.commitTip());\n }\n } else {\n log.error(messages.nodes.failedRemove(currentEnv), err);\n if (!result?.nodesToMigrate?.[currentProject]?.totalCount)\n log.help(messages.nodes.notFound(currentEnv));\n }\n }\n };\n\n PrintWebhookSubscriptions = async (subscriptionIdsOrNames?: string[]) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve webhooks list for env\n const [webhooksErr, webhooks] =\n await contensis.subscriptions.webhooks.GetSubscriptions();\n\n const filteredResults = subscriptionIdsOrNames?.length\n ? webhooks?.filter(\n w =>\n subscriptionIdsOrNames?.some(idname =>\n w.name?.toLowerCase().includes(idname.toLowerCase())\n ) ||\n subscriptionIdsOrNames?.some(\n id => id.toLowerCase() === w.id.toLowerCase()\n )\n )\n : webhooks;\n\n if (Array.isArray(filteredResults)) {\n log.success(messages.webhooks.list(currentEnv));\n if (!webhooks?.length) log.warning(messages.webhooks.noneExist());\n else {\n await this.HandleFormattingAndOutput(filteredResults, () => {\n // print the keys to console\n for (const {\n id,\n description,\n method,\n name,\n version,\n url,\n enabled,\n topics,\n templates,\n headers,\n } of filteredResults) {\n console.log(\n log.infoText(\n ` ${chalk.bold.white`- ${name}`} ${id} [${(\n version.modified || version.created\n )\n .toString()\n .substring(0, 10)} ${version.modifiedBy || version.createdBy\n }]`\n )\n );\n if (description) console.log(log.infoText` ${description}`);\n console.log(` ${log.infoText`[${method}]`} ${url}`);\n if (headers && Object.keys(headers).length) {\n console.log(` ${log.infoText`headers`}:`);\n\n for (const [key, { value, secret }] of Object.entries(headers))\n console.log(\n ` ${chalk.bold.gray(key)}: ${secret ? '\uD83E\uDD10' : value}`\n );\n }\n if (topics?.length)\n if (topics?.length === 1)\n console.log(\n ` ${log.infoText`topics`}: ${topics\n .map(t => JSON.stringify(t))\n .join(' ')\n .replaceAll('\"', '')\n .replaceAll(',', ' ')\n .replaceAll('{', '')\n .replaceAll('}', '')}`\n );\n else {\n console.log(` ${log.infoText`topics`}:`);\n log.objectRecurse(topics, 1, ' ');\n }\n if (templates && Object.keys(templates).length)\n console.log(\n ` ${log.infoText`templates`}: ${Object.keys(\n templates\n ).join(' ')}`\n );\n if (enabled === false)\n console.log(` ${log.infoText`enabled`}: ${enabled}`);\n }\n });\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 const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve blocks list for env\n const [err, blocks] = await contensis.blocks.GetBlocks();\n\n if (Array.isArray(blocks) && blocks.length) {\n await 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})` : ''}${madeLive\n ? ` [${madeLive.toString().substring(0, 10)} v${liveVersion}]`\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 return blocks;\n }\n\n if (err) {\n log.error(messages.blocks.noList(currentEnv, env.currentProject));\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 const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve block version\n const [err, blocks] = await contensis.blocks.GetBlockVersions(\n blockId,\n branch,\n version\n );\n\n if (err || blocks?.length === 0) {\n log.warning(\n messages.blocks.noGet(\n blockId,\n branch,\n version,\n currentEnv,\n env.currentProject\n )\n );\n log.help(messages.blocks.noGetTip());\n // if (err) log.error(jsonFormatter(err));\n } else if (blocks) {\n await this.HandleFormattingAndOutput(blocks, () => {\n // print the version detail to console\n log.success(\n messages.blocks.get(\n blockId,\n branch,\n version,\n currentEnv,\n env.currentProject\n )\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 return blocks;\n }\n }\n };\n\n PushBlock = async (block: PushBlockParams) => {\n const { currentEnv, env, log, messages } = this;\n\n // Output request to console\n log.info(\n messages.blocks.tryPush(\n block.id,\n block.source.branch,\n currentEnv,\n env.currentProject\n )\n );\n console.log(jsonFormatter(block));\n\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Push new block version\n const [err, blockVersion] = await 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 }\n if (blockVersion) {\n await 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 } else {\n throw new Error(\n messages.blocks.failedPush(block.id, currentEnv, env.currentProject)\n );\n }\n };\n\n GetLatestBlockVersion = async (\n blockId: string,\n branch = 'default'\n ): Promise<[AppError | null, string | undefined]> => {\n const { contensis, log, messages } = this;\n\n // Look for block versions pushed to \"default\" branch\n const [getErr, blockVersions] =\n (await contensis?.blocks.GetBlockVersions(blockId, branch)) || [];\n\n if (getErr) {\n return [getErr, undefined];\n }\n\n // Parse versionNo from response\n let blockVersionNo = 'latest';\n // The first blockVersion should be the latest one\n try {\n blockVersionNo = `${blockVersions?.[0]?.version.versionNo}`;\n\n if (!Number.isNaN(blockVersionNo) && Number(blockVersionNo) > 0)\n // Is a valid versionNo\n return [null, blockVersionNo];\n else throw new Error(`'${blockVersionNo}' is not a valid version number`);\n } catch (parseVersionEx: any) {\n // Catch parsing errors in case of an unexpected response\n log.info(\n `Request for blockId: ${blockId}, branch: ${branch}, version: latest`\n );\n log.info(\n `Get block versions response was: ${tryStringify(blockVersions)}`\n );\n log.error(messages.blocks.failedParsingVersion());\n return [parseVersionEx, undefined];\n }\n };\n\n ExecuteBlockAction = async (\n action: BlockActionType,\n blockId: string,\n version = 'latest'\n ) => {\n const { currentEnv, env, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n let actionOnBlockVersion = version;\n\n // If action is release and version is latest, find the latest version number\n if (action === 'release' && version === 'latest') {\n const [getErr, blockVersion] = await this.GetLatestBlockVersion(\n blockId\n );\n\n if (getErr) {\n // Log error getting latest block version no\n // and throw the error message so the process can exit with a failure\n throw new Error(\n `${messages.blocks.noList(\n currentEnv,\n env.currentProject\n )} (${getErr})`\n );\n } else if (blockVersion) {\n actionOnBlockVersion = blockVersion;\n }\n }\n\n // Execute block action\n const [err, blockVersion] = await contensis.blocks.BlockAction(\n blockId,\n action,\n actionOnBlockVersion\n );\n\n if (blockVersion) {\n await this.HandleFormattingAndOutput(blockVersion, () => {\n // print the version detail to console\n log.success(\n messages.blocks.actionComplete(\n action,\n blockId,\n currentEnv,\n env.currentProject\n )\n );\n printBlockVersion(this, blockVersion);\n });\n }\n\n if (err) {\n log.error(jsonFormatter(err));\n throw new Error(\n messages.blocks.actionFailed(\n action,\n blockId,\n currentEnv,\n env.currentProject\n )\n );\n }\n }\n };\n\n PrintBlockLogs = async (\n blockId: string,\n branch: string,\n version: string,\n dataCenter: 'hq' | 'manchester' | 'london' | undefined,\n follow = false\n ) => {\n const { currentEnv, env, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve block logs\n log.success(\n messages.blocks.getLogs(blockId, branch, currentEnv, env.currentProject)\n );\n\n const [err, blockLogs] = await contensis.blocks.GetBlockLogs({\n blockId,\n branchId: branch,\n version,\n dataCenter,\n });\n\n if (err) {\n log.error(\n messages.blocks.failedGetLogs(blockId, currentEnv, env.currentProject)\n );\n log.error(jsonFormatter(err));\n } else if (blockLogs) {\n const removeTrailingNewline = (logs: string) =>\n logs.endsWith('\\n') ? logs.slice(0, logs.length - 1) : logs;\n const renderLogs = removeTrailingNewline(blockLogs);\n\n await this.HandleFormattingAndOutput(renderLogs, () => {\n // print the logs to console\n console.log(\n ` - ${blockId} ${branch} ${Number(version) ? `v${version}` : version\n } ${dataCenter ? `[${dataCenter}]` : ''}`\n );\n log.line();\n console.log(log.infoText(renderLogs));\n });\n\n // Code for the `--follow` options\n let following = follow;\n let alreadyShown = blockLogs;\n let needsNewLine = false;\n let counter = 0;\n\n // remove existing listeners and add them back afterwards\n const listeners = process.listeners('SIGINT');\n\n process.removeAllListeners('SIGINT');\n // add listener to update following to false and break out\n process.on('SIGINT', () => {\n Logger.warning(\n messages.blocks.stopFollow(blockId, currentEnv, env.currentProject)\n );\n stopFollowing();\n });\n\n const delay = promiseDelay(5 * 1000, null);\n const stopFollowing = () => {\n following = false;\n delay.cancel();\n\n // Add back the listeners we removed previously\n process.removeAllListeners('SIGINT');\n for (const listener of listeners)\n process.addListener('SIGINT', listener);\n };\n\n while (following) {\n if (counter++ > 300) {\n Logger.warning(\n messages.blocks.timeoutFollow(\n blockId,\n currentEnv,\n env.currentProject\n )\n );\n stopFollowing();\n }\n\n // wait n. seconds then poll for logs again\n await delay.wait();\n\n const [lastErr, lastLogs] = following\n ? await contensis.blocks.GetBlockLogs({\n blockId,\n branchId: branch,\n version,\n dataCenter,\n })\n : [null, null];\n\n if (lastLogs) {\n // Find the difference and output it next\n const difference = diffLogStrings(lastLogs, alreadyShown);\n if (difference) {\n if (needsNewLine) {\n console.log('');\n }\n // Take the trailing newline off of the logged output to\n // avoid blank lines inbetween logs fetched sequentially\n const render = removeTrailingNewline(difference);\n console.log(log.infoText(render));\n\n // Add what we've just rendered to already shown \"cache\"\n alreadyShown += `${render}\\n`;\n needsNewLine = false;\n } else {\n // If no difference output a dot\n process.stdout.write('.');\n needsNewLine = true;\n }\n } else if (lastErr) {\n // If error output an x\n process.stdout.write('x');\n needsNewLine = true;\n }\n }\n }\n }\n };\n\n PrintProxies = async (proxyId?: string) => {\n const { currentEnv, env, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve proxies list for env\n const [err, proxies] = await (contensis.proxies.GetProxies as any)(\n proxyId\n ); // TODO: resolve any cast;\n\n if (Array.isArray(proxies)) {\n await this.HandleFormattingAndOutput(proxies, () => {\n // print the proxies to console\n log.success(messages.proxies.list(currentEnv, env.currentProject));\n for (const { id, name, description, endpoints, version } of proxies) {\n console.log(\n ` - ${name} [${version.versionNo\n }] ${id} ${log.infoText`${description}`}`\n );\n for (const [language, endpoint] of Object.entries(\n endpoints as { [k: string]: any }\n )) // TODO: resolve any cast\n console.log(\n ` - ${log.infoText`language: ${language}\n server: ${endpoint.server}\n headers.host: ${endpoint.headers.host}\n ssl: ${endpoint.ssl}`}`\n );\n }\n });\n }\n\n if (err) {\n log.error(messages.proxies.noList(currentEnv, env.currentProject));\n log.error(jsonFormatter(err));\n }\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n PrintRenderers = async (rendererId?: string) => {\n const { currentEnv, env, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve renderers list for env\n const [err, renderers] = await contensis.renderers.GetRenderers();\n\n if (Array.isArray(renderers)) {\n await this.HandleFormattingAndOutput(renderers, () => {\n // print the renderers to console\n log.success(messages.renderers.list(currentEnv, env.currentProject));\n for (const {\n id,\n description,\n assignedContentTypes,\n rules,\n version,\n } of renderers) {\n console.log(\n ` - ${id} [${version.versionNo}] ${log.infoText`${description}`}`\n );\n if (assignedContentTypes?.length)\n console.log(\n log.infoText` assignedContentTypes: ${assignedContentTypes.join(\n ', '\n )}`\n );\n for (const rule of rules)\n if (rule.return)\n console.log(\n log.infoText` ${rule.return.endpointId ? 'endpointId' : 'blockId'\n }: ${rule.return.endpointId || rule.return.blockId}`\n );\n }\n });\n return renderers;\n }\n\n if (err) {\n log.error(messages.renderers.noList(currentEnv, env.currentProject));\n log.error(jsonFormatter(err));\n }\n }\n };\n\n HandleFormattingAndOutput = async <T>(obj: T, logFn: (obj: T) => void) => {\n const { format, log, messages, output } = this;\n const fields = this.contensis?.payload.query?.fields;\n\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(await csvFormatter(limitFields(obj, fields))));\n } else if (format === 'xml') {\n log.raw('');\n log.raw(log.infoText(xmlFormatter(limitFields(obj, fields))));\n } else if (format === 'json') {\n log.raw('');\n log.raw(log.infoText(jsonFormatter(obj, fields)));\n }\n log.raw('');\n\n if (output) {\n let writeString = '';\n const isText = !tryParse(obj) && typeof obj === 'string';\n if (format === 'csv') {\n writeString = await csvFormatter(limitFields(obj, fields));\n } else if (format === 'xml') {\n writeString = xmlFormatter(limitFields(obj, fields));\n } else\n writeString = isText ? (obj as string) : jsonFormatter(obj, fields);\n // write output to file\n if (writeString) {\n fs.writeFileSync(output, writeString);\n log.success(messages.app.fileOutput(isText ? 'text' : format, output));\n } else {\n log.info(messages.app.noFileOutput());\n }\n }\n };\n}\n\nexport const cliCommand = (\n commandArgs: string[],\n outputOpts?: OutputOptionsConstructorArg,\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 to from 'await-to-js';\nimport chalk from 'chalk';\nimport fs from 'fs';\nimport inquirer from 'inquirer';\nimport fetch from 'node-fetch';\nimport path from 'path';\nimport clone from 'rfdc';\n\nimport { Component, ContentType, Project } from 'contensis-core-api';\nimport { Role } from 'contensis-management-api/lib/models';\nimport {\n ContensisMigrationService,\n MigrateRequest,\n PushBlockParams,\n SourceCms,\n ContentTypesResult,\n Model,\n BlockActionType,\n logEntitiesTable,\n} from 'migratortron';\n\nimport ContensisAuthService from './ContensisAuthService';\n\nimport { LogMessages } from '~/localisation/en-GB';\nimport {\n CliUrls,\n OutputFormat,\n OutputOptionsConstructorArg,\n} from '~/models/CliService';\n\nimport { readFileAsJSON } from '~/providers/file-provider';\nimport SessionCacheProvider from '../providers/SessionCacheProvider';\nimport CredentialProvider from '~/providers/CredentialProvider';\n\nimport {\n isPassword,\n isSharedSecret,\n isUuid,\n tryParse,\n tryStringify,\n url,\n} from '~/util';\nimport { sanitiseIds } from '~/util/api-ids';\nimport {\n printBlockVersion,\n printEntriesMigrateResult,\n printModelMigrationAnalysis,\n printModelMigrationResult,\n printNodeTreeOutput,\n printNodesMigrateResult,\n} from '~/util/console.printer';\nimport { csvFormatter } from '~/util/csv.formatter';\nimport { jsonFormatter, limitFields } from '~/util/json.formatter';\nimport { xmlFormatter } from '~/util/xml.formatter';\nimport { isDebug } from '~/util/debug';\nimport { diffLogStrings } from '~/util/diff';\nimport { findByIdOrName } from '~/util/find';\nimport { logError, Logger } from '~/util/logger';\nimport { promiseDelay } from '~/util/timers';\n\nlet insecurePasswordWarningShown = false;\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 format?: OutputFormat;\n private output?: string;\n private session: SessionCacheProvider;\n\n auth?: ContensisAuthService;\n command: CliCommand;\n contensis?: ContensisMigrationService;\n contensisOpts: Partial<MigrateRequest>;\n currentProject: string;\n debug = isDebug();\n\n sourceAlias?: string;\n targetEnv?: string;\n urls: CliUrls;\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\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?: OutputOptionsConstructorArg,\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\n // Explicitly sanitise supplied fields to api-friendly ids\n if (Array.isArray(this.contensisOpts.query?.fields)) {\n this.contensisOpts.query.fields = sanitiseIds(\n this.contensisOpts.query.fields\n );\n }\n\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 // Set env from command options\n const env = this.env;\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 if (outputOpts.sharedSecret.startsWith('-'))\n throw new Error(\n `Shared secret option provided a value of ${outputOpts.sharedSecret}`\n );\n else env.passwordFallback = outputOpts.sharedSecret;\n\n this.currentProject = env?.currentProject || 'null';\n this.sourceAlias = outputOpts?.sourceAlias || currentEnvironment;\n\n if (currentEnvironment) {\n this.urls = url(currentEnvironment, env?.currentProject || 'website');\n }\n\n this.command = {\n commandText,\n options: outputOpts as any,\n createdDate: new Date().toISOString(),\n invokedBy: 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 = async () => {\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 await 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 // eslint-disable-next-line @typescript-eslint/no-unused-vars\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 if (!this.contensis) {\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 return this.contensis;\n };\n\n ConnectContensisImport = async ({\n commit = false,\n fromFile,\n importDataType,\n }: {\n commit?: boolean;\n fromFile?: string;\n importDataType?:\n | 'entries'\n | 'contentTypes'\n | 'components'\n | 'models'\n | 'nodes'\n | 'user-input';\n }) => {\n const source: 'contensis' | 'file' = fromFile ? 'file' : 'contensis';\n\n const fileData = fromFile ? (await readFileAsJSON(fromFile)) || [] : [];\n\n if (typeof fileData === 'string')\n throw new Error(`Import file format must be of type JSON`);\n\n const { contensisOpts, currentEnv, env, log, messages, sourceAlias } = this;\n const environments = this.cache.environments || {};\n const sourceEnvironment = environments[sourceAlias || ''] || {};\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(sourceAlias || '', 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 sourceAlias,\n false\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' || importDataType === 'user-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 ...(importDataType ? { [importDataType]: fileData } : {}),\n },\n !commit\n );\n } else 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 return this.contensis;\n };\n\n GetCredentials = async (\n userId: string,\n password?: string,\n currentEnv = this.currentEnv,\n saveCurrentEnv = true\n ): Promise<CredentialProvider | undefined> => {\n const { 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(\n `Unable to find credentials for user ${userId} at ${currentEnv}`,\n credentialError as any\n );\n return;\n }\n\n if (credentials.remarks.secure !== true) {\n if (!insecurePasswordWarningShown) {\n log.warning(messages.login.insecurePassword());\n insecurePasswordWarningShown = true;\n }\n } else {\n const env = this.cache.environments[currentEnv];\n env.passwordFallback = undefined;\n this.session.UpdateEnv(env, currentEnv, saveCurrentEnv);\n }\n return credentials;\n }\n };\n\n Login = async (\n userId: string,\n {\n password = '',\n promptPassword = true,\n sharedSecret = '',\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\n if (!inputPassword)\n inputPassword =\n isSharedSecret(this.env.passwordFallback) ||\n isPassword(this.env.passwordFallback) ||\n '';\n\n const { 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 this.auth = 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(this.auth.BearerToken());\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\n // Persist env before finding projects or doing anything else\n this.session.UpdateEnv(env);\n if (inputPassword) await credentials.Save(inputPassword);\n if (sharedSecret) await credentials.Save(sharedSecret);\n\n if (!silent) {\n Logger.success(messages.login.success(currentEnv, userId));\n await this.PrintProjects();\n }\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 PrintContensisVersion = async () => {\n const { log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve projects list for env\n const [projectsErr, projects] = await to(\n contensis.projects.GetSourceProjects()\n );\n\n if (Array.isArray(projects)) {\n // Print contensis version to console\n await this.HandleFormattingAndOutput(contensis.contensisVersion, () =>\n log.raw(log.highlightText(contensis.contensisVersion))\n );\n }\n\n if (projectsErr) {\n log.error(messages.projects.noList());\n log.error(projectsErr.message);\n }\n }\n };\n\n PrintBearerToken = async () => {\n const { log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve token for env\n const [error, token] = await to(\n contensis.content.sourceRepo.repo.BearerToken()\n );\n if (token) {\n // Print bearer token to console\n await this.HandleFormattingAndOutput(token, () =>\n log.raw(log.highlightText(token))\n );\n }\n\n if (error) {\n log.error(messages.projects.noList());\n log.error(error.message);\n }\n }\n };\n\n PrintProjects = async () => {\n const { currentProject, log, messages, session } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve projects list for env\n const [projectsErr, projects] = await to(\n 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 log.raw('');\n\n await this.HandleFormattingAndOutput(projects, () => {\n // print the projects to console\n for (const project of projects.sort((a, b) =>\n a.id.localeCompare(b.id)\n )) {\n let color;\n try {\n color = chalk.keyword((project as any).color);\n } catch (ex) {\n Logger.debug(`${ex}`);\n color = chalk.white;\n }\n console.log(\n `${\n nextCurrentProject === project.id\n ? `>> ${log.boldText(color(project.id))}`\n : ` ${color(project.id)}`\n } ${log.infoText(\n `[${project.supportedLanguages\n .map(l =>\n l === project.primaryLanguage ? `*${log.boldText(l)}` : l\n )\n .join(' ')}]`\n )}`\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 PrintProject = async (projectId = this.currentProject) => {\n const { log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve projects list for env\n const [projectsErr, projects] = await to(\n contensis.projects.GetSourceProjects()\n );\n\n const foundProject = projects?.find(\n p => p.id.toLowerCase() === projectId.toLowerCase()\n );\n\n if (foundProject) {\n log.raw('');\n await this.HandleFormattingAndOutput(foundProject, log.object);\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 log.raw('');\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 PrintApiKeys = async () => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve keys list for env\n const [keysErr, apiKeys] = await contensis.apiKeys.GetKeys();\n\n if (Array.isArray(apiKeys)) {\n log.success(messages.keys.list(currentEnv));\n await 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 = '') => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n const [err, key] = await contensis.apiKeys.CreateKey(name, description);\n\n if (key) {\n log.success(messages.keys.created(currentEnv, name));\n\n // print the key details to console\n console.log(\n ` - ${chalk.bold(key.name)} [${key.dateModified\n .toString()\n .substring(0, 10)} ${key.modifiedBy}]`\n );\n if (key.description)\n console.log(` ${log.infoText(key.description)}`);\n console.log(` ${chalk.bold.grey`id`}: ${key.id}`);\n console.log(\n ` ${chalk.bold.grey`sharedSecret`}: ${key.sharedSecret}`\n );\n console.log('');\n log.help(messages.keys.tip());\n }\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 const contensis = await this.ConnectContensis({ commit: true });\n\n if (contensis) {\n const [err] = await 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 PrintRoles = async () => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve roles list for env\n const [rolesErr, roles] = await to(contensis.roles.GetRoles());\n\n if (Array.isArray(roles)) {\n log.success(messages.roles.list(currentEnv));\n\n if (!roles.length) log.help(messages.roles.noneExist());\n\n await this.HandleFormattingAndOutput(roles, () => {\n // print the roles to console\n for (const {\n id,\n name,\n description,\n enabled,\n assignments,\n permissions,\n } of roles) {\n const color = enabled ? (s: string) => s : log.infoText;\n\n console.log(color(` - ${chalk.bold(name)} ${log.infoText(id)}`));\n if (description) console.log(log.infoText(` ${description}`));\n if (enabled === false)\n console.log(` ${chalk.bold.grey('enabled')}: false`);\n if (assignments.groups?.length)\n console.log(\n ` ${chalk.bold.grey('groups')}: ${assignments.groups.join(\n ', '\n )}`\n );\n if (assignments.users?.length)\n console.log(\n ` ${chalk.bold.grey('users')}: ${assignments.users.join(\n ', '\n )}`\n );\n if (assignments.apiKeys?.length)\n console.log(\n ` ${chalk.bold.grey('keys')}: ${assignments.apiKeys.join(\n ', '\n )}`\n );\n\n if (permissions.entries?.length) {\n console.log(` ${chalk.bold.grey('entries')}:`);\n for (const p of permissions.entries)\n console.log(\n ` ${p.id}: ${log.infoText(\n p.actions.length > 2\n ? p.actions.length\n : p.actions.join(', ')\n )}`\n );\n }\n if (permissions.contentTypes?.length)\n console.log(\n ` ${chalk.bold.grey(\n 'contentTypes'\n )}: ${permissions.contentTypes\n .map(\n p =>\n `${p.id} [${p.actions.join(',')}] ${(\n p as any\n ).languages.join(' ')}`\n )\n .join(', ')}`\n );\n }\n });\n }\n\n if (rolesErr) {\n log.error(messages.roles.noList(currentEnv));\n log.error(jsonFormatter(rolesErr));\n }\n }\n };\n\n PrintRole = async (roleNameOrId: string) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve roles list for env\n const [rolesErr, roles] = await to(contensis.roles.GetRoles());\n\n if (Array.isArray(roles)) {\n log.success(messages.roles.list(currentEnv));\n\n const role = findByIdOrName(roles, roleNameOrId);\n\n if (role) await this.HandleFormattingAndOutput(role, log.object);\n else log.error(messages.roles.failedGet(currentEnv, roleNameOrId));\n }\n\n if (rolesErr) {\n log.error(messages.roles.noList(currentEnv));\n log.error(jsonFormatter(rolesErr));\n }\n }\n };\n\n CreateRole = async (role: Partial<Role>) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n const [err, created] = await contensis.roles.CreateRole(role as Role);\n\n if (created) {\n log.success(\n messages.roles.created(currentEnv, role.id || role.name || '')\n );\n\n await this.HandleFormattingAndOutput(created, log.object);\n\n log.help(messages.roles.tip());\n return role.id;\n }\n\n if (err) {\n log.error(\n messages.roles.failedCreate(currentEnv, role.id || role.name || ''),\n err\n );\n }\n }\n };\n\n UpdateRole = async (roleNameOrId: string, role: Partial<Role>) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve roles list for env\n const [rolesErr, roles] = await to(contensis.roles.GetRoles());\n\n if (Array.isArray(roles)) {\n log.success(messages.roles.list(currentEnv));\n\n const existingRole = findByIdOrName(roles, roleNameOrId, true);\n if (existingRole) {\n log.info(messages.roles.setPayload());\n log.object(role);\n log.raw(``);\n const [updateErr, updated] = await contensis.roles.UpdateRole(\n existingRole.id,\n role\n );\n if (updateErr)\n log.error(messages.roles.failedSet(currentEnv, roleNameOrId));\n else {\n log.success(messages.roles.set());\n\n await this.HandleFormattingAndOutput(updated, log.object);\n }\n } else {\n // Role does not exist\n log.error(messages.roles.failedGet(currentEnv, roleNameOrId));\n }\n }\n\n if (rolesErr) {\n log.error(messages.roles.noList(currentEnv));\n log.error(jsonFormatter(rolesErr));\n }\n }\n };\n\n RemoveRole = async (roleNameOrId: string) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve roles list for env\n const [rolesErr, roles] = await to(contensis.roles.GetRoles());\n\n if (Array.isArray(roles)) {\n log.success(messages.roles.list(currentEnv));\n\n const existingRole = findByIdOrName(roles, roleNameOrId, true);\n\n if (existingRole) {\n const [deleteErr] = await contensis.roles.RemoveRole(existingRole.id);\n\n if (deleteErr)\n log.error(messages.roles.failedRemove(currentEnv, roleNameOrId));\n else log.success(messages.roles.removed(currentEnv, roleNameOrId));\n } else {\n // Role does not exist\n log.error(messages.roles.failedGet(currentEnv, roleNameOrId));\n }\n }\n\n if (rolesErr) {\n log.error(messages.roles.noList(currentEnv));\n log.error(jsonFormatter(rolesErr));\n }\n }\n };\n\n PrintWorkflows = async () => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve workflows list for env\n const [workflowsErr, workflows] =\n await contensis.content.sourceRepo.workflows.GetWorkflows();\n\n if (Array.isArray(workflows)) {\n log.success(messages.workflows.list(currentEnv));\n\n if (!workflows.length) log.help(messages.workflows.noneExist());\n\n const stringFromLanguageObject = (o: { [lang: string]: string }) =>\n Object.values(o || {})?.[0];\n\n await this.HandleFormattingAndOutput(workflows, () => {\n // print the workflows to console\n // log.object(workflows);\n for (const {\n id,\n name,\n description,\n states,\n eventGroups,\n isSystem,\n } of workflows as any) {\n const color = isSystem ? (s: string) => s : log.infoText;\n\n console.log(\n color(\n ` - ${chalk.bold(\n stringFromLanguageObject(name)\n )} ${log.infoText(id)}`\n )\n );\n if (description)\n console.log(\n log.infoText(` ${stringFromLanguageObject(description)}`)\n );\n if (isSystem === false)\n console.log(` ${chalk.bold.grey('isSystem')}: false`);\n if (states?.length)\n console.log(\n ` ${chalk.bold.grey('states')}: ${states\n .map((state: any) => state.id)\n .join(', ')}`\n );\n if (eventGroups?.length)\n console.log(\n ` ${chalk.bold.grey('eventGroups')}: ${eventGroups\n .map((evtGrp: any) => evtGrp.id)\n .join(', ')}`\n );\n }\n });\n }\n\n if (workflowsErr) {\n log.error(messages.workflows.noList(currentEnv));\n log.error(jsonFormatter(workflowsErr));\n }\n }\n };\n\n PrintWorkflow = async (workflowNameOrId: string) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve workflows list for env\n const [workflowsErr, workflows] =\n await contensis.content.sourceRepo.workflows.GetWorkflows();\n\n if (Array.isArray(workflows)) {\n log.success(messages.workflows.list(currentEnv));\n\n const workflow = findByIdOrName(workflows, workflowNameOrId);\n\n if (workflow)\n await this.HandleFormattingAndOutput(workflow, log.object);\n else\n log.error(messages.workflows.failedGet(currentEnv, workflowNameOrId));\n }\n\n if (workflowsErr) {\n log.error(messages.workflows.noList(currentEnv));\n log.error(jsonFormatter(workflowsErr));\n }\n }\n };\n\n CreateProject = async (project: Project) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n const [err, created] = await contensis.projects.CreateProject(project);\n\n if (created) {\n log.success(messages.projects.created(currentEnv, project.id));\n\n await this.HandleFormattingAndOutput(created, () => {\n // set the CLI project to the newly created project\n this.SetProject(project.id);\n // print all the projects to console\n this.PrintProjects();\n });\n return project.id;\n }\n\n if (err) {\n log.error(messages.projects.failedCreate(currentEnv, project.id), err);\n }\n }\n };\n\n UpdateProject = async (project: Partial<Project>) => {\n const { currentEnv, currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n const [err, updated] = await contensis.projects.UpdateProject({\n id: currentProject,\n ...project,\n });\n\n if (updated) {\n log.success(messages.projects.updated(currentEnv, currentProject));\n\n await this.HandleFormattingAndOutput(updated, log.object);\n return updated.id;\n }\n\n if (err) {\n log.error(\n messages.projects.failedUpdate(currentEnv, currentProject),\n err\n );\n }\n }\n };\n\n PrintContentModels = async (\n modelIds: string[] = [],\n opts: { export?: boolean; requiredBy?: boolean }\n ) => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve models list for env\n const models = await contensis.models.contentModels();\n const contentTypes = await contensis.models.contentTypes();\n const components = await contensis.models.components();\n\n // Models to output to console\n const returnModels = modelIds?.length\n ? models?.filter((m: Model) =>\n modelIds.some(id => id.toLowerCase() === m.id.toLowerCase())\n )\n : undefined;\n const exportResources: (ContentType | Component)[] = [];\n\n if (opts.export) {\n // Generate a list of contentTypeIds and componentIds from all models\n // and dependencies\n const contentTypeIds = Array.from(\n new Set([\n ...(returnModels || models || []).map(m => m.id),\n ...(returnModels || models || [])\n .map(m => m.dependencies?.contentTypes?.map(c => c[0]) || [])\n .flat(),\n ])\n );\n const componentIds = Array.from(\n new Set(\n (returnModels || models || [])\n .map(m => m.dependencies?.components?.map(c => c[0]) || [])\n .flat()\n )\n );\n\n // Create an array of all the content types and component definitions\n // we will use this when outputting to a file\n exportResources.push(\n ...contentTypes.filter(c =>\n contentTypeIds\n .map(i => i.toLowerCase())\n .includes(c.id.toLowerCase())\n ),\n ...components.filter(c =>\n componentIds.map(i => i.toLowerCase()).includes(c.id.toLowerCase())\n )\n );\n }\n\n if (Array.isArray(returnModels)) {\n log.success(messages.models.list(currentProject));\n await this.HandleFormattingAndOutput(\n opts.export ? exportResources : returnModels,\n () => {\n // print the content models to console\n for (const model of returnModels) {\n // create a clone of each model to safely modify\n const draft = clone()(model);\n if (!opts.requiredBy) {\n // truncate parts of the output\n delete draft.dependencyOf;\n if (draft.dependencies?.contentTypes)\n draft.dependencies.contentTypes.forEach(id => id.pop());\n if (draft.dependencies?.components)\n draft.dependencies.components.forEach(id => id.pop());\n }\n\n log.raw('');\n log.object(draft);\n }\n log.raw('');\n }\n );\n } else {\n log.success(\n messages.models.get(currentProject, models?.length.toString() || '0')\n );\n log.raw('');\n if (models?.length) {\n await this.HandleFormattingAndOutput(\n opts.export ? exportResources : models,\n () => {\n // print the content models to console\n for (const model of models) {\n const components = model.components?.length || 0;\n const contentTypes = model.contentTypes?.length || 0;\n const defaults =\n (model.defaults?.length || 0) + (model.nodes?.length || 0);\n const dependencies =\n (model.dependencies?.components?.length || 0) +\n (model.dependencies?.contentTypes?.length || 0);\n const dependencyOf =\n (model.dependencyOf?.components?.length || 0) +\n (model.dependencyOf?.contentTypes?.length || 0);\n\n const hasAny =\n components + contentTypes + dependencies + dependencyOf;\n log.raw(\n ` - ${log.highlightText(log.boldText(model.id))} ${\n hasAny\n ? log.infoText(\n `{ ${\n components ? `components: ${components}, ` : ''\n }${\n contentTypes\n ? `contentTypes: ${contentTypes}, `\n : ''\n }${defaults ? `defaults: ${defaults}, ` : ''}${\n dependencies ? `references: ${dependencies}, ` : ''\n }${\n dependencyOf ? `required by: ${dependencyOf}` : ''\n } }`\n )\n : ''\n }`\n );\n }\n log.raw('');\n }\n );\n }\n }\n }\n };\n\n ImportContentModels = async ({\n commit,\n fromFile,\n }: {\n commit: boolean;\n fromFile: string;\n }) => {\n const { currentProject, log, messages } = this;\n\n const fileData = fromFile\n ? (await readFileAsJSON<(ContentType | Component)[]>(fromFile)) || []\n : [];\n if (typeof fileData === 'string')\n throw new Error(`Import file format must be of type JSON`);\n\n const contensis = await this.ConnectContensisImport({\n commit,\n fromFile,\n importDataType: 'models',\n });\n\n if (contensis) {\n log.line();\n if (contensis.isPreview) {\n console.log(log.successText(` -- IMPORT PREVIEW -- `));\n } else {\n console.log(log.warningText(` *** COMMITTING IMPORT *** `));\n }\n\n const [migrateErr, result] = await contensis.MigrateContentModels();\n\n if (migrateErr) logError(migrateErr);\n else\n await this.HandleFormattingAndOutput(result, () => {\n // print the results to console\n if (!result.committed) {\n log.raw(log.boldText(`\\nContent types:`));\n if (!result.contentTypes) log.info(`- None returned\\n`);\n else printModelMigrationAnalysis(this, result.contentTypes);\n\n log.raw(log.boldText(`\\nComponents:`));\n if (!result.components) log.info(`- None returned\\n`);\n else printModelMigrationAnalysis(this, result.components);\n\n if (result.defaults && Object.keys(result.defaults).length) {\n log.raw(log.boldText(`\\nDefaults:`));\n printModelMigrationAnalysis(this, result.defaults);\n }\n if (result.nodes && Object.keys(result.nodes).length) {\n log.raw(log.boldText(`\\nNodes:`));\n printModelMigrationAnalysis(this, result.nodes);\n }\n if (result.errors) {\n log.raw(log.boldText(`\\nErrors:`));\n log.object(result.errors);\n }\n } else {\n const { modelsResult = {} } = result;\n log.raw(log.boldText(`\\nContent types:`));\n printModelMigrationResult(\n this,\n modelsResult[currentProject].contentTypes\n );\n // Only output for components if any status has any results\n if (\n Object.values(modelsResult[currentProject].components).some(\n r => r.length > 0\n )\n ) {\n log.raw(log.boldText(`\\nComponents:`));\n printModelMigrationResult(\n this,\n modelsResult[currentProject].components\n );\n }\n if (\n Object.values(modelsResult[currentProject].defaults || {}).some(\n r => r.length > 0\n )\n ) {\n log.raw(log.boldText(`\\nDefaults:`));\n printModelMigrationResult(\n this,\n modelsResult[currentProject].defaults\n );\n }\n if (\n Object.values(modelsResult[currentProject].nodes || {}).some(\n r => r.length > 0\n )\n ) {\n log.raw(log.boldText(`\\nNodes:`));\n printModelMigrationResult(\n this,\n modelsResult[currentProject].nodes\n );\n }\n }\n });\n } else {\n log.warning(messages.models.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n PrintContentTypes = async () => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve content types list for env\n const contentTypes = await contensis.models.contentTypes();\n\n if (Array.isArray(contentTypes)) {\n log.success(messages.contenttypes.list(currentProject));\n await 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 const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve content types list for env\n const contentTypes = await contensis.models.contentTypes();\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 await 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 const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: 'user-input', // 'user-input' import type does not require a source cms\n });\n if (contensis) {\n const [err, result] = await contensis.DeleteContentTypes(contentTypeIds);\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 !contensis.isPreview\n )\n );\n // print the results to console\n await this.HandleFormattingAndOutput(result, log.object);\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\n ? (await readFileAsJSON<ContentType[]>(fromFile)) || []\n : [];\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 const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: fromFile ? 'user-input' : undefined,\n });\n\n if (contensis) {\n if (fromFile)\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, , createStatus] = await 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 await this.HandleFormattingAndOutput(contentType, () => {});\n }\n }\n else {\n const result = await contensis.simpleMigration.Migrate(\n contentTypeIds,\n []\n );\n await this.HandleFormattingAndOutput(result, log.object);\n }\n }\n };\n\n DiffModels = async (\n {\n fromFile,\n }: {\n fromFile: string;\n },\n modelIds: string[] = []\n ) => {\n const { log } = this;\n\n let fileData = fromFile\n ? (await readFileAsJSON<ContentType[]>(fromFile)) || []\n : [];\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 const contensis = await this.ConnectContensisImport({\n fromFile,\n importDataType: 'models',\n });\n\n if (contensis) {\n const [err, result] = (await to(\n contensis.models.Diff(fileData.length ? fileData : modelIds)\n )) as [Error | null, ContentTypesResult | undefined];\n\n if (err) log.error(err.message, err);\n if (result)\n // print the content type to console\n await this.HandleFormattingAndOutput(result, () => {\n log.success(\n `Queried models ${log.infoText(\n `\"${result.query.modelIds?.join(', ')}\"`\n )}\\n`\n );\n if (result.committed === false) {\n log.raw(log.boldText(`Content types:`));\n if (!result.contentTypes) log.info(`- None returned\\n`);\n else printModelMigrationAnalysis(this, result.contentTypes);\n\n log.raw(log.boldText(`\\nComponents:`));\n if (!result.components) log.info(`- None returned\\n`);\n else printModelMigrationAnalysis(this, result.components);\n }\n });\n }\n };\n\n PrintComponents = async () => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve components list for env\n const components = await contensis.models.components();\n\n if (Array.isArray(components)) {\n log.success(messages.components.list(currentProject));\n\n await 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 const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve content types list for env\n const components = await contensis.models.components();\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 await 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 const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: 'user-input', // 'user-input' import type does not require a source cms\n });\n if (contensis) {\n const [err, result] = await 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 !contensis.isPreview\n )\n );\n // print the results to console\n await this.HandleFormattingAndOutput(result, log.object);\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\n ? (await readFileAsJSON<Component[]>(fromFile)) || []\n : [];\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 const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: fromFile ? 'user-input' : undefined,\n });\n\n if (contensis) {\n // Pass each component to the target repo\n if (fromFile)\n for (const component of fileData) {\n // Fix invalid data\n component.projectId = currentProject;\n delete component.uuid;\n\n const [err, , createStatus] = await 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 await this.HandleFormattingAndOutput(component, () => {});\n }\n }\n else {\n const result = await contensis.simpleMigration.Migrate(\n [],\n componentIds\n );\n await this.HandleFormattingAndOutput(result, log.object);\n }\n }\n };\n\n RemoveEntries = async (commit = false) => {\n const { currentEnv, currentProject, log, messages } = this;\n const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: 'user-input', // 'user-input' import type does not require a source cms\n });\n\n if (contensis) {\n if (contensis.isPreview) {\n console.log(log.successText(` -- PREVIEW -- `));\n } else {\n console.log(log.warningText(` *** COMMITTING DELETE *** `));\n }\n const [err, result] = await contensis.DeleteEntries();\n if (result)\n await this.HandleFormattingAndOutput(result, () => {\n // print the migrateResult to console\n printEntriesMigrateResult(this, result, {\n action: 'delete',\n showAll: true,\n });\n });\n if (\n !err &&\n ((!commit && result.entriesToMigrate[currentProject].totalCount) ||\n (commit && result.migrateResult?.deleted))\n ) {\n log.success(messages.entries.removed(currentEnv, commit));\n if (!commit) {\n log.raw(``);\n log.help(messages.entries.commitTip());\n }\n } else {\n log.error(messages.entries.failedRemove(currentEnv), err);\n if (!result?.entriesToMigrate?.[currentProject]?.totalCount)\n log.help(messages.entries.notFound(currentEnv));\n }\n }\n };\n\n GetEntries = async ({\n withDependents = false,\n }: {\n withDependents?: boolean;\n } = {}) => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n log.line();\n const entries = await contensis.GetEntries({ withDependents });\n // TODO: iterate entries and add some extra details to help\n // with importing later\n // Add a full sys.uri to asset entries\n // Add sys.metadata.exportCms\n // Add sys.metadata.exportProjectId\n const nodes = contensis.content.source.nodes.raw;\n const combinedOutput = [...entries, ...nodes];\n\n await this.HandleFormattingAndOutput(combinedOutput, () => {\n // print the entries to console\n logEntitiesTable({\n entries,\n projectId: currentProject,\n fields: contensis.payload.query?.fields,\n });\n if (nodes.length)\n logEntitiesTable({\n nodes,\n projectId: currentProject,\n fields: contensis.payload.query?.fields,\n });\n });\n } else {\n log.warning(messages.models.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n ImportEntries = async ({\n commit,\n fromFile,\n logOutput,\n saveEntries,\n }: {\n commit: boolean;\n fromFile: string;\n logOutput: string;\n saveEntries: boolean;\n }) => {\n const { currentEnv, currentProject, log, messages } = this;\n\n const contensis = await this.ConnectContensisImport({\n commit,\n fromFile,\n importDataType: 'entries',\n });\n\n if (contensis) {\n log.line();\n if (contensis.isPreview) {\n console.log(log.successText(` -- IMPORT PREVIEW -- `));\n } else {\n console.log(log.warningText(` *** COMMITTING IMPORT *** `));\n }\n\n const [err, result] = await contensis.MigrateEntries();\n\n if (err) logError(err);\n else {\n const { entries, nodes } = contensis.content.targets[currentProject];\n\n const output = saveEntries\n ? // include entries and dependent nodes when saving entries\n [\n entries.migrate?.map(me => me.toJSON()) || [],\n nodes.migrateNodes.map(mn => mn.node),\n ].flat()\n : result;\n await this.HandleFormattingAndOutput(output, () => {\n // print the migrateResult to console\n printEntriesMigrateResult(this, result, {\n showAll: logOutput === 'all',\n showDiff: logOutput === 'all' || logOutput === 'changes',\n showChanged: logOutput === 'changes',\n });\n if (['all', 'changes'].includes(logOutput))\n printNodeTreeOutput(\n this,\n {\n ...nodes.rootAncestor,\n status: 'no change',\n children: nodes.migrateNodes as any,\n },\n logOutput\n );\n });\n }\n if (\n !err &&\n !result.errors?.length &&\n ((!commit && result.entriesToMigrate[currentProject].totalCount) ||\n (commit &&\n (result.migrateResult?.created || result.migrateResult?.updated)))\n ) {\n log.success(\n messages.entries.imported(\n currentEnv,\n commit,\n commit\n ? (result.migrateResult?.created || 0) +\n (result.migrateResult?.updated || 0)\n : result.entriesToMigrate[currentProject].totalCount,\n commit\n ? (result.nodesResult?.created || 0) +\n (result.nodesResult?.updated || 0)\n : (result.nodesToMigrate?.[currentProject]\n .totalCount as number) || 0\n )\n );\n if (!commit) {\n log.raw(``);\n log.help(messages.entries.commitTip());\n }\n } else {\n log.error(messages.entries.failedImport(currentEnv), err);\n if (!result?.entriesToMigrate?.[currentProject]?.totalCount)\n log.help(messages.entries.notFound(currentEnv));\n }\n } else {\n log.warning(messages.models.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n CopyEntryField = async ({\n commit,\n fromFile,\n logOutput,\n saveEntries,\n }: {\n commit: boolean;\n fromFile: string;\n logOutput: string;\n saveEntries: boolean;\n }) => {\n const { currentEnv, currentProject, log, messages } = this;\n\n const contensis = await this.ConnectContensisImport({\n commit,\n fromFile,\n importDataType: 'entries',\n });\n\n if (contensis) {\n log.line();\n if (contensis.isPreview) {\n console.log(log.successText(` -- IMPORT PREVIEW -- `));\n } else {\n console.log(log.warningText(` *** COMMITTING IMPORT *** `));\n }\n\n const [err, result] = await to(\n contensis.content.copy.MigrateFieldContent()\n );\n\n if (err) logError(err);\n if (result) {\n const output = saveEntries\n ? contensis.content.copy.targets[currentProject].entries.migrate?.map(\n me => me.toJSON()\n )\n : result;\n await this.HandleFormattingAndOutput(output, () => {\n // print the migrateResult to console\n printEntriesMigrateResult(this, result, {\n showAll: logOutput === 'all',\n showDiff: logOutput === 'all' || logOutput === 'changes',\n showChanged: logOutput === 'changes',\n });\n });\n }\n\n if (\n result &&\n !err &&\n !result.errors?.length &&\n ((!commit && result.entriesToMigrate[currentProject].totalCount) ||\n (commit &&\n (result.migrateResult?.created || result.migrateResult?.updated)))\n ) {\n log.success(\n messages.entries.imported(\n currentEnv,\n commit,\n commit\n ? (result.migrateResult?.created || 0) +\n (result.migrateResult?.updated || 0)\n : result.entriesToMigrate[currentProject].totalCount\n )\n );\n if (!commit) {\n log.raw(``);\n log.help(messages.entries.commitTip());\n }\n } else {\n log.error(messages.entries.failedImport(currentEnv), err);\n if (!result?.entriesToMigrate?.[currentProject]?.totalCount)\n log.help(messages.entries.notFound(currentEnv));\n }\n } else {\n log.warning(messages.models.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n GetNodes = async (rootPath: string, depth = 0) => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n log.line();\n const [err, nodes] = await to(contensis.nodes.GetNodes(rootPath, depth));\n if (err) {\n log.error(messages.nodes.failedGet(currentProject), err);\n return;\n }\n const root = contensis.nodes.sourceRepo.nodes.tree;\n\n log.success(messages.nodes.get(currentProject, rootPath, depth));\n\n await this.HandleFormattingAndOutput(nodes, () => {\n // print the nodes to console\n log.object({ ...root, children: undefined, language: undefined });\n printNodeTreeOutput(this, root);\n });\n } else {\n log.warning(messages.models.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n ImportNodes = async ({\n commit,\n fromFile,\n logOutput,\n logLimit,\n }: {\n commit: boolean;\n fromFile: string;\n logOutput: string;\n logLimit: number;\n }) => {\n const { currentEnv, currentProject, log, messages } = this;\n\n const contensis = await this.ConnectContensisImport({\n commit,\n fromFile,\n importDataType: 'nodes',\n });\n\n if (contensis) {\n log.line();\n if (contensis.isPreview) {\n console.log(log.successText(` -- IMPORT PREVIEW -- `));\n } else {\n console.log(log.warningText(` *** COMMITTING IMPORT *** `));\n }\n\n const [err, result] = await contensis.MigrateNodes();\n\n if (err) log.raw(``);\n else\n await this.HandleFormattingAndOutput(result, () => {\n // print the migrateResult to console\n const migrateTree =\n contensis.nodes.targetRepos[currentProject].nodes\n .migrateNodesTreeView;\n printNodeTreeOutput(this, migrateTree, logOutput, logLimit);\n printNodesMigrateResult(this, result, {\n showAll: logOutput === 'all',\n showChanged: logOutput === 'changes',\n });\n });\n\n const nodesMigrateCount =\n result?.nodesToMigrate?.[currentProject].totalCount;\n const nodesCreated = result?.nodesResult?.['created'] || 0;\n const nodesUpdated = result?.nodesResult?.['updated'] || 0;\n const nodesErrored = result?.nodesResult?.['errors'] || 0;\n const noChanges =\n result?.nodesToMigrate?.[currentProject]['no change'] &&\n nodesMigrateCount === 0;\n\n if (\n !err &&\n (!result.errors?.length || this.contensisOpts.ignoreErrors) &&\n ((!commit && nodesMigrateCount) ||\n (commit && (nodesCreated || nodesUpdated || result.errors?.length)))\n ) {\n let totalCount: number;\n if (commit) {\n const created = typeof nodesCreated === 'number' ? nodesCreated : 0;\n const updated = typeof nodesUpdated === 'number' ? nodesUpdated : 0;\n\n totalCount = created + updated;\n } else {\n totalCount =\n typeof nodesMigrateCount === 'number' ? nodesMigrateCount : 0;\n }\n\n log.success(messages.nodes.imported(currentEnv, commit, totalCount));\n log.raw(``);\n if (!commit) {\n log.help(messages.nodes.commitTip());\n }\n } else {\n if (noChanges && !err && !nodesErrored) {\n log.help(messages.nodes.noChange(currentEnv));\n } else {\n log.error(messages.nodes.failedImport(currentEnv), err);\n if (!nodesMigrateCount) log.help(messages.nodes.notFound(currentEnv));\n }\n }\n } else {\n log.warning(messages.models.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n RemoveNodes = async (commit = false) => {\n const { currentEnv, currentProject, log, messages } = this;\n const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: 'user-input', // 'user-input' import type does not require a source cms\n });\n\n if (contensis) {\n if (contensis.isPreview) {\n console.log(log.successText(` -- PREVIEW -- `));\n } else {\n console.log(log.warningText(` *** COMMITTING DELETE *** `));\n }\n const [err, result] = await contensis.DeleteNodes();\n if (result) {\n await this.HandleFormattingAndOutput(result, () => {\n // print the migrateResult to console\n printNodeTreeOutput(\n this,\n contensis.nodes.targetRepos[currentProject].nodes\n .migrateNodesTreeView\n );\n // printNodesMigrateResult(this, result, {\n // action: 'delete',\n // showAll: true,\n // });\n });\n }\n if (\n !err &&\n ((!commit && result.nodesToMigrate[currentProject].totalCount) ||\n (commit && result.nodesResult?.deleted))\n ) {\n log.success(\n messages.nodes.removed(currentEnv, commit, contensis.nodes.rootPath)\n );\n log.raw(``);\n if (!commit) {\n log.help(messages.nodes.commitTip());\n }\n } else {\n log.error(messages.nodes.failedRemove(currentEnv), err);\n if (!result?.nodesToMigrate?.[currentProject]?.totalCount)\n log.help(messages.nodes.notFound(currentEnv));\n }\n }\n };\n\n PrintWebhookSubscriptions = async (subscriptionIdsOrNames?: string[]) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve webhooks list for env\n const [webhooksErr, webhooks] =\n await contensis.subscriptions.webhooks.GetSubscriptions();\n\n const filteredResults = subscriptionIdsOrNames?.length\n ? webhooks?.filter(\n w =>\n subscriptionIdsOrNames?.some(idname =>\n w.name?.toLowerCase().includes(idname.toLowerCase())\n ) ||\n subscriptionIdsOrNames?.some(\n id => id.toLowerCase() === w.id.toLowerCase()\n )\n )\n : webhooks;\n\n if (Array.isArray(filteredResults)) {\n log.success(messages.webhooks.list(currentEnv));\n if (!webhooks?.length) log.warning(messages.webhooks.noneExist());\n else {\n await this.HandleFormattingAndOutput(filteredResults, () => {\n // print the keys to console\n for (const {\n id,\n description,\n method,\n name,\n version,\n url,\n enabled,\n topics,\n templates,\n headers,\n } of filteredResults) {\n console.log(\n log.infoText(\n ` ${chalk.bold.white`- ${name}`} ${id} [${(\n version.modified || version.created\n )\n .toString()\n .substring(0, 10)} ${\n version.modifiedBy || version.createdBy\n }]`\n )\n );\n if (description) console.log(log.infoText` ${description}`);\n console.log(` ${log.infoText`[${method}]`} ${url}`);\n if (headers && Object.keys(headers).length) {\n console.log(` ${log.infoText`headers`}:`);\n\n for (const [key, { value, secret }] of Object.entries(headers))\n console.log(\n ` ${chalk.bold.gray(key)}: ${secret ? '\uD83E\uDD10' : value}`\n );\n }\n if (topics?.length)\n if (topics?.length === 1)\n console.log(\n ` ${log.infoText`topics`}: ${topics\n .map(t => JSON.stringify(t))\n .join(' ')\n .replaceAll('\"', '')\n .replaceAll(',', ' ')\n .replaceAll('{', '')\n .replaceAll('}', '')}`\n );\n else {\n console.log(` ${log.infoText`topics`}:`);\n log.objectRecurse(topics, 1, ' ');\n }\n if (templates && Object.keys(templates).length)\n console.log(\n ` ${log.infoText`templates`}: ${Object.keys(\n templates\n ).join(' ')}`\n );\n if (enabled === false)\n console.log(` ${log.infoText`enabled`}: ${enabled}`);\n }\n });\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 const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve blocks list for env\n const [err, blocks] = await contensis.blocks.GetBlocks();\n\n if (Array.isArray(blocks) && blocks.length) {\n await 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 return blocks;\n }\n\n if (err) {\n log.error(messages.blocks.noList(currentEnv, env.currentProject));\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 const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve block version\n const [err, blocks] = await contensis.blocks.GetBlockVersions(\n blockId,\n branch,\n version\n );\n\n if (err || blocks?.length === 0) {\n log.warning(\n messages.blocks.noGet(\n blockId,\n branch,\n version,\n currentEnv,\n env.currentProject\n )\n );\n log.help(messages.blocks.noGetTip());\n // if (err) log.error(jsonFormatter(err));\n } else if (blocks) {\n await this.HandleFormattingAndOutput(blocks, () => {\n // print the version detail to console\n log.success(\n messages.blocks.get(\n blockId,\n branch,\n version,\n currentEnv,\n env.currentProject\n )\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 return blocks;\n }\n }\n };\n\n PushBlock = async (block: PushBlockParams) => {\n const { currentEnv, env, log, messages } = this;\n\n // Output request to console\n log.info(\n messages.blocks.tryPush(\n block.id,\n block.source.branch,\n currentEnv,\n env.currentProject\n )\n );\n console.log(jsonFormatter(block));\n\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Push new block version\n const [err, blockVersion] =\n await contensis.blocks.PushBlockVersion(block);\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 }\n if (blockVersion) {\n await 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 } else {\n throw new Error(\n messages.blocks.failedPush(block.id, currentEnv, env.currentProject)\n );\n }\n };\n\n GetLatestBlockVersion = async (\n blockId: string,\n branch = 'default'\n ): Promise<[AppError | null, string | undefined]> => {\n const { contensis, log, messages } = this;\n\n // Look for block versions pushed to \"default\" branch\n const [getErr, blockVersions] =\n (await contensis?.blocks.GetBlockVersions(blockId, branch)) || [];\n\n if (getErr) {\n return [getErr, undefined];\n }\n\n // Parse versionNo from response\n let blockVersionNo = 'latest';\n // The first blockVersion should be the latest one\n try {\n blockVersionNo = `${blockVersions?.[0]?.version.versionNo}`;\n\n if (!Number.isNaN(blockVersionNo) && Number(blockVersionNo) > 0)\n // Is a valid versionNo\n return [null, blockVersionNo];\n else throw new Error(`'${blockVersionNo}' is not a valid version number`);\n } catch (parseVersionEx: any) {\n // Catch parsing errors in case of an unexpected response\n log.info(\n `Request for blockId: ${blockId}, branch: ${branch}, version: latest`\n );\n log.info(\n `Get block versions response was: ${tryStringify(blockVersions)}`\n );\n log.error(messages.blocks.failedParsingVersion());\n return [parseVersionEx, undefined];\n }\n };\n\n ExecuteBlockAction = async (\n action: BlockActionType,\n blockId: string,\n version = 'latest'\n ) => {\n const { currentEnv, env, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n let actionOnBlockVersion = version;\n\n // If action is release and version is latest, find the latest version number\n if (action === 'release' && version === 'latest') {\n const [getErr, blockVersion] =\n await this.GetLatestBlockVersion(blockId);\n\n if (getErr) {\n // Log error getting latest block version no\n // and throw the error message so the process can exit with a failure\n throw new Error(\n `${messages.blocks.noList(\n currentEnv,\n env.currentProject\n )} (${getErr})`\n );\n } else if (blockVersion) {\n actionOnBlockVersion = blockVersion;\n }\n }\n\n // Execute block action\n const [err, blockVersion] = await contensis.blocks.BlockAction(\n blockId,\n action,\n actionOnBlockVersion\n );\n\n if (blockVersion) {\n await this.HandleFormattingAndOutput(blockVersion, () => {\n // print the version detail to console\n log.success(\n messages.blocks.actionComplete(\n action,\n blockId,\n currentEnv,\n env.currentProject\n )\n );\n printBlockVersion(this, blockVersion);\n });\n }\n\n if (err) {\n log.error(jsonFormatter(err));\n throw new Error(\n messages.blocks.actionFailed(\n action,\n blockId,\n currentEnv,\n env.currentProject\n )\n );\n }\n }\n };\n\n PrintBlockLogs = async (\n blockId: string,\n branch: string,\n version: string,\n dataCenter: 'hq' | 'manchester' | 'london' | undefined,\n follow = false\n ) => {\n const { currentEnv, env, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve block logs\n log.success(\n messages.blocks.getLogs(blockId, branch, currentEnv, env.currentProject)\n );\n\n const [err, blockLogs] = await contensis.blocks.GetBlockLogs({\n blockId,\n branchId: branch,\n version,\n dataCenter,\n });\n\n if (err) {\n log.error(\n messages.blocks.failedGetLogs(blockId, currentEnv, env.currentProject)\n );\n log.error(jsonFormatter(err));\n } else if (blockLogs) {\n const removeTrailingNewline = (logs: string) =>\n logs.endsWith('\\n') ? logs.slice(0, logs.length - 1) : logs;\n const renderLogs = removeTrailingNewline(blockLogs);\n\n await this.HandleFormattingAndOutput(renderLogs, () => {\n // print the logs to console\n console.log(\n ` - ${blockId} ${branch} ${\n Number(version) ? `v${version}` : version\n } ${dataCenter ? `[${dataCenter}]` : ''}`\n );\n log.line();\n console.log(log.infoText(renderLogs));\n });\n\n // Code for the `--follow` options\n let following = follow;\n let alreadyShown = blockLogs;\n let needsNewLine = false;\n let counter = 0;\n\n // remove existing listeners and add them back afterwards\n const listeners = process.listeners('SIGINT');\n\n process.removeAllListeners('SIGINT');\n // add listener to update following to false and break out\n process.on('SIGINT', () => {\n Logger.warning(\n messages.blocks.stopFollow(blockId, currentEnv, env.currentProject)\n );\n stopFollowing();\n });\n\n const delay = promiseDelay(5 * 1000, null);\n const stopFollowing = () => {\n following = false;\n delay.cancel();\n\n // Add back the listeners we removed previously\n process.removeAllListeners('SIGINT');\n for (const listener of listeners)\n process.addListener('SIGINT', listener);\n };\n\n while (following) {\n if (counter++ > 300) {\n Logger.warning(\n messages.blocks.timeoutFollow(\n blockId,\n currentEnv,\n env.currentProject\n )\n );\n stopFollowing();\n }\n\n // wait n. seconds then poll for logs again\n await delay.wait();\n\n const [lastErr, lastLogs] = following\n ? await contensis.blocks.GetBlockLogs({\n blockId,\n branchId: branch,\n version,\n dataCenter,\n })\n : [null, null];\n\n if (lastLogs) {\n // Find the difference and output it next\n const difference = diffLogStrings(lastLogs, alreadyShown);\n if (difference) {\n if (needsNewLine) {\n console.log('');\n }\n // Take the trailing newline off of the logged output to\n // avoid blank lines inbetween logs fetched sequentially\n const render = removeTrailingNewline(difference);\n console.log(log.infoText(render));\n\n // Add what we've just rendered to already shown \"cache\"\n alreadyShown += `${render}\\n`;\n needsNewLine = false;\n } else {\n // If no difference output a dot\n process.stdout.write('.');\n needsNewLine = true;\n }\n } else if (lastErr) {\n // If error output an x\n process.stdout.write('x');\n needsNewLine = true;\n }\n }\n }\n }\n };\n\n PrintProxies = async (proxyId?: string) => {\n const { currentEnv, env, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve proxies list for env\n const [err, proxies] = await (contensis.proxies.GetProxies as any)(\n proxyId\n ); // TODO: resolve any cast;\n\n if (Array.isArray(proxies)) {\n await this.HandleFormattingAndOutput(proxies, () => {\n // print the proxies to console\n log.success(messages.proxies.list(currentEnv, env.currentProject));\n for (const { id, name, description, endpoints, version } of proxies) {\n console.log(\n ` - ${name} [${\n version.versionNo\n }] ${id} ${log.infoText`${description}`}`\n );\n for (const [language, endpoint] of Object.entries(\n endpoints as { [k: string]: any }\n )) // TODO: resolve any cast\n console.log(\n ` - ${log.infoText`language: ${language}\n server: ${endpoint.server}\n headers.host: ${endpoint.headers.host}\n ssl: ${endpoint.ssl}`}`\n );\n }\n });\n }\n\n if (err) {\n log.error(messages.proxies.noList(currentEnv, env.currentProject));\n log.error(jsonFormatter(err));\n }\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n PrintRenderers = async (rendererId?: string) => {\n const { currentEnv, env, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve renderers list for env\n const [err, renderers] = await contensis.renderers.GetRenderers();\n\n if (Array.isArray(renderers)) {\n await this.HandleFormattingAndOutput(renderers, () => {\n // print the renderers to console\n log.success(messages.renderers.list(currentEnv, env.currentProject));\n for (const {\n id,\n description,\n assignedContentTypes,\n rules,\n version,\n } of renderers) {\n console.log(\n ` - ${id} [${version.versionNo}] ${log.infoText`${description}`}`\n );\n if (assignedContentTypes?.length)\n console.log(\n log.infoText` assignedContentTypes: ${assignedContentTypes.join(\n ', '\n )}`\n );\n for (const rule of rules)\n if (rule.return)\n console.log(\n log.infoText` ${\n rule.return.endpointId ? 'endpointId' : 'blockId'\n }: ${rule.return.endpointId || rule.return.blockId}`\n );\n }\n });\n return renderers;\n }\n\n if (err) {\n log.error(messages.renderers.noList(currentEnv, env.currentProject));\n log.error(jsonFormatter(err));\n }\n }\n };\n\n HandleFormattingAndOutput = async <T>(obj: T, logFn: (obj: T) => void) => {\n const { format, log, messages, output } = this;\n const fields = this.contensis?.payload.query?.fields;\n\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(await csvFormatter(limitFields(obj, fields))));\n } else if (format === 'xml') {\n log.raw('');\n log.raw(log.infoText(xmlFormatter(limitFields(obj, fields))));\n } else if (format === 'json') {\n log.raw('');\n log.raw(log.infoText(jsonFormatter(obj, fields)));\n }\n log.raw('');\n\n if (output) {\n let writeString = '';\n const isText = !tryParse(obj) && typeof obj === 'string';\n if (format === 'csv') {\n writeString = await csvFormatter(limitFields(obj, fields));\n } else if (format === 'xml') {\n writeString = xmlFormatter(limitFields(obj, fields));\n } else\n writeString = isText ? (obj as string) : jsonFormatter(obj, fields);\n // write output to file\n if (writeString) {\n fs.writeFileSync(output, writeString);\n log.success(messages.app.fileOutput(isText ? 'text' : format, output));\n } else {\n log.info(messages.app.noFileOutput());\n }\n }\n };\n}\n\nexport const cliCommand = (\n commandArgs: string[],\n outputOpts?: OutputOptionsConstructorArg,\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", "chalk", "clone", "components", "contentTypes", "url", "blockVersion", "fs"]
|
|
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.3.1-beta.
|
|
24
|
+
const LIB_VERSION = "1.3.1-beta.2";
|
|
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.3.1-beta.
|
|
4
|
+
"sourcesContent": ["export const LIB_VERSION = \"1.3.1-beta.2\";\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.3.1-beta.
|
|
3
|
+
"version": "1.3.1-beta.2",
|
|
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/cli",
|
|
6
6
|
"homepage": "https://github.com/contensis/cli/tree/main/packages/contensis-cli#readme",
|
|
@@ -107,7 +107,7 @@ class ContensisCli {
|
|
|
107
107
|
const environments = this.cache.environments || {};
|
|
108
108
|
|
|
109
109
|
if (!currentEnvironment) return {} as EnvironmentCache;
|
|
110
|
-
else if (
|
|
110
|
+
else if (environments[currentEnvironment])
|
|
111
111
|
return environments[currentEnvironment];
|
|
112
112
|
else {
|
|
113
113
|
return {
|
|
@@ -126,14 +126,14 @@ class ContensisCli {
|
|
|
126
126
|
) {
|
|
127
127
|
// console.log('args: ', JSON.stringify(args, null, 2));
|
|
128
128
|
|
|
129
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
130
129
|
const [exe, script, verb = '', noun = '', ...restArgs] = args;
|
|
131
130
|
this.verb = verb?.toLowerCase();
|
|
132
131
|
this.noun = noun?.toLowerCase();
|
|
133
132
|
this.thirdArg = restArgs?.[0];
|
|
134
133
|
|
|
135
|
-
const commandText = `${this.verb} ${this.noun} ${
|
|
136
|
-
|
|
134
|
+
const commandText = `${this.verb} ${this.noun} ${
|
|
135
|
+
restArgs ? restArgs.join(' ') : ''
|
|
136
|
+
}`.trim();
|
|
137
137
|
|
|
138
138
|
this.session = new SessionCacheProvider();
|
|
139
139
|
|
|
@@ -295,12 +295,12 @@ class ContensisCli {
|
|
|
295
295
|
commit?: boolean;
|
|
296
296
|
fromFile?: string;
|
|
297
297
|
importDataType?:
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
298
|
+
| 'entries'
|
|
299
|
+
| 'contentTypes'
|
|
300
|
+
| 'components'
|
|
301
|
+
| 'models'
|
|
302
|
+
| 'nodes'
|
|
303
|
+
| 'user-input';
|
|
304
304
|
}) => {
|
|
305
305
|
const source: 'contensis' | 'file' = fromFile ? 'file' : 'contensis';
|
|
306
306
|
|
|
@@ -645,9 +645,10 @@ class ContensisCli {
|
|
|
645
645
|
color = chalk.white;
|
|
646
646
|
}
|
|
647
647
|
console.log(
|
|
648
|
-
`${
|
|
649
|
-
|
|
650
|
-
|
|
648
|
+
`${
|
|
649
|
+
nextCurrentProject === project.id
|
|
650
|
+
? `>> ${log.boldText(color(project.id))}`
|
|
651
|
+
: ` ${color(project.id)}`
|
|
651
652
|
} ${log.infoText(
|
|
652
653
|
`[${project.supportedLanguages
|
|
653
654
|
.map(l =>
|
|
@@ -762,7 +763,8 @@ class ContensisCli {
|
|
|
762
763
|
modifiedBy,
|
|
763
764
|
} of apiKeys) {
|
|
764
765
|
console.log(
|
|
765
|
-
` - ${name}${
|
|
766
|
+
` - ${name}${
|
|
767
|
+
description ? ` (${description})` : ''
|
|
766
768
|
} [${dateModified.toString().substring(0, 10)} ${modifiedBy}]`
|
|
767
769
|
);
|
|
768
770
|
console.log(` ${id}`);
|
|
@@ -1191,8 +1193,8 @@ class ContensisCli {
|
|
|
1191
1193
|
// Models to output to console
|
|
1192
1194
|
const returnModels = modelIds?.length
|
|
1193
1195
|
? models?.filter((m: Model) =>
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
+
modelIds.some(id => id.toLowerCase() === m.id.toLowerCase())
|
|
1197
|
+
)
|
|
1196
1198
|
: undefined;
|
|
1197
1199
|
const exportResources: (ContentType | Component)[] = [];
|
|
1198
1200
|
|
|
@@ -1278,17 +1280,22 @@ class ContensisCli {
|
|
|
1278
1280
|
const hasAny =
|
|
1279
1281
|
components + contentTypes + dependencies + dependencyOf;
|
|
1280
1282
|
log.raw(
|
|
1281
|
-
` - ${log.highlightText(log.boldText(model.id))} ${
|
|
1282
|
-
|
|
1283
|
-
|
|
1284
|
-
|
|
1285
|
-
|
|
1286
|
-
|
|
1287
|
-
|
|
1288
|
-
|
|
1289
|
-
|
|
1290
|
-
|
|
1291
|
-
|
|
1283
|
+
` - ${log.highlightText(log.boldText(model.id))} ${
|
|
1284
|
+
hasAny
|
|
1285
|
+
? log.infoText(
|
|
1286
|
+
`{ ${
|
|
1287
|
+
components ? `components: ${components}, ` : ''
|
|
1288
|
+
}${
|
|
1289
|
+
contentTypes
|
|
1290
|
+
? `contentTypes: ${contentTypes}, `
|
|
1291
|
+
: ''
|
|
1292
|
+
}${defaults ? `defaults: ${defaults}, ` : ''}${
|
|
1293
|
+
dependencies ? `references: ${dependencies}, ` : ''
|
|
1294
|
+
}${
|
|
1295
|
+
dependencyOf ? `required by: ${dependencyOf}` : ''
|
|
1296
|
+
} }`
|
|
1297
|
+
)
|
|
1298
|
+
: ''
|
|
1292
1299
|
}`
|
|
1293
1300
|
);
|
|
1294
1301
|
}
|
|
@@ -1419,7 +1426,8 @@ class ContensisCli {
|
|
|
1419
1426
|
for (const contentType of contentTypes) {
|
|
1420
1427
|
const fieldsLength = contentType.fields?.length || 0;
|
|
1421
1428
|
console.log(
|
|
1422
|
-
` - ${contentType.id} [${fieldsLength} field${
|
|
1429
|
+
` - ${contentType.id} [${fieldsLength} field${
|
|
1430
|
+
fieldsLength !== 1 ? 's' : ''
|
|
1423
1431
|
}]`
|
|
1424
1432
|
);
|
|
1425
1433
|
}
|
|
@@ -1518,10 +1526,9 @@ class ContensisCli {
|
|
|
1518
1526
|
contentType.projectId = currentProject;
|
|
1519
1527
|
delete contentType.uuid;
|
|
1520
1528
|
|
|
1521
|
-
const [err, , createStatus] =
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
].repo.UpsertContentType(false, contentType);
|
|
1529
|
+
const [err, , createStatus] = await contensis.models.targetRepos[
|
|
1530
|
+
currentProject
|
|
1531
|
+
].repo.UpsertContentType(false, contentType);
|
|
1525
1532
|
|
|
1526
1533
|
if (err) log.error(err.message, err);
|
|
1527
1534
|
if (createStatus) {
|
|
@@ -1533,7 +1540,7 @@ class ContensisCli {
|
|
|
1533
1540
|
)
|
|
1534
1541
|
);
|
|
1535
1542
|
// print the content type to console
|
|
1536
|
-
await this.HandleFormattingAndOutput(contentType, () => {
|
|
1543
|
+
await this.HandleFormattingAndOutput(contentType, () => {});
|
|
1537
1544
|
}
|
|
1538
1545
|
}
|
|
1539
1546
|
else {
|
|
@@ -1611,7 +1618,8 @@ class ContensisCli {
|
|
|
1611
1618
|
for (const component of components) {
|
|
1612
1619
|
const fieldsLength = component.fields?.length || 0;
|
|
1613
1620
|
console.log(
|
|
1614
|
-
` - ${component.id} [${fieldsLength} field${
|
|
1621
|
+
` - ${component.id} [${fieldsLength} field${
|
|
1622
|
+
fieldsLength !== 1 ? 's' : ''
|
|
1615
1623
|
}]`
|
|
1616
1624
|
);
|
|
1617
1625
|
}
|
|
@@ -1709,10 +1717,9 @@ class ContensisCli {
|
|
|
1709
1717
|
component.projectId = currentProject;
|
|
1710
1718
|
delete component.uuid;
|
|
1711
1719
|
|
|
1712
|
-
const [err, , createStatus] =
|
|
1713
|
-
|
|
1714
|
-
|
|
1715
|
-
].repo.UpsertComponent(false, component);
|
|
1720
|
+
const [err, , createStatus] = await contensis.models.targetRepos[
|
|
1721
|
+
currentProject
|
|
1722
|
+
].repo.UpsertComponent(false, component);
|
|
1716
1723
|
|
|
1717
1724
|
if (err) log.error(err.message, err);
|
|
1718
1725
|
if (createStatus) {
|
|
@@ -1724,7 +1731,7 @@ class ContensisCli {
|
|
|
1724
1731
|
)
|
|
1725
1732
|
);
|
|
1726
1733
|
// print the component to console
|
|
1727
|
-
await this.HandleFormattingAndOutput(component, () => {
|
|
1734
|
+
await this.HandleFormattingAndOutput(component, () => {});
|
|
1728
1735
|
}
|
|
1729
1736
|
}
|
|
1730
1737
|
else {
|
|
@@ -1793,15 +1800,23 @@ class ContensisCli {
|
|
|
1793
1800
|
// Add a full sys.uri to asset entries
|
|
1794
1801
|
// Add sys.metadata.exportCms
|
|
1795
1802
|
// Add sys.metadata.exportProjectId
|
|
1803
|
+
const nodes = contensis.content.source.nodes.raw;
|
|
1804
|
+
const combinedOutput = [...entries, ...nodes];
|
|
1796
1805
|
|
|
1797
|
-
await this.HandleFormattingAndOutput(
|
|
1806
|
+
await this.HandleFormattingAndOutput(combinedOutput, () => {
|
|
1798
1807
|
// print the entries to console
|
|
1799
1808
|
logEntitiesTable({
|
|
1800
1809
|
entries,
|
|
1801
1810
|
projectId: currentProject,
|
|
1802
1811
|
fields: contensis.payload.query?.fields,
|
|
1803
|
-
})
|
|
1804
|
-
|
|
1812
|
+
});
|
|
1813
|
+
if (nodes.length)
|
|
1814
|
+
logEntitiesTable({
|
|
1815
|
+
nodes,
|
|
1816
|
+
projectId: currentProject,
|
|
1817
|
+
fields: contensis.payload.query?.fields,
|
|
1818
|
+
});
|
|
1819
|
+
});
|
|
1805
1820
|
} else {
|
|
1806
1821
|
log.warning(messages.models.noList(currentProject));
|
|
1807
1822
|
log.help(messages.connect.tip());
|
|
@@ -1842,7 +1857,11 @@ class ContensisCli {
|
|
|
1842
1857
|
const { entries, nodes } = contensis.content.targets[currentProject];
|
|
1843
1858
|
|
|
1844
1859
|
const output = saveEntries
|
|
1845
|
-
? entries
|
|
1860
|
+
? // include entries and dependent nodes when saving entries
|
|
1861
|
+
[
|
|
1862
|
+
entries.migrate?.map(me => me.toJSON()) || [],
|
|
1863
|
+
nodes.migrateNodes.map(mn => mn.node),
|
|
1864
|
+
].flat()
|
|
1846
1865
|
: result;
|
|
1847
1866
|
await this.HandleFormattingAndOutput(output, () => {
|
|
1848
1867
|
// print the migrateResult to console
|
|
@@ -1876,13 +1895,13 @@ class ContensisCli {
|
|
|
1876
1895
|
commit,
|
|
1877
1896
|
commit
|
|
1878
1897
|
? (result.migrateResult?.created || 0) +
|
|
1879
|
-
|
|
1898
|
+
(result.migrateResult?.updated || 0)
|
|
1880
1899
|
: result.entriesToMigrate[currentProject].totalCount,
|
|
1881
1900
|
commit
|
|
1882
1901
|
? (result.nodesResult?.created || 0) +
|
|
1883
|
-
|
|
1902
|
+
(result.nodesResult?.updated || 0)
|
|
1884
1903
|
: (result.nodesToMigrate?.[currentProject]
|
|
1885
|
-
|
|
1904
|
+
.totalCount as number) || 0
|
|
1886
1905
|
)
|
|
1887
1906
|
);
|
|
1888
1907
|
if (!commit) {
|
|
@@ -1935,8 +1954,8 @@ class ContensisCli {
|
|
|
1935
1954
|
if (result) {
|
|
1936
1955
|
const output = saveEntries
|
|
1937
1956
|
? contensis.content.copy.targets[currentProject].entries.migrate?.map(
|
|
1938
|
-
|
|
1939
|
-
|
|
1957
|
+
me => me.toJSON()
|
|
1958
|
+
)
|
|
1940
1959
|
: result;
|
|
1941
1960
|
await this.HandleFormattingAndOutput(output, () => {
|
|
1942
1961
|
// print the migrateResult to console
|
|
@@ -1962,7 +1981,7 @@ class ContensisCli {
|
|
|
1962
1981
|
commit,
|
|
1963
1982
|
commit
|
|
1964
1983
|
? (result.migrateResult?.created || 0) +
|
|
1965
|
-
|
|
1984
|
+
(result.migrateResult?.updated || 0)
|
|
1966
1985
|
: result.entriesToMigrate[currentProject].totalCount
|
|
1967
1986
|
)
|
|
1968
1987
|
);
|
|
@@ -2153,14 +2172,14 @@ class ContensisCli {
|
|
|
2153
2172
|
|
|
2154
2173
|
const filteredResults = subscriptionIdsOrNames?.length
|
|
2155
2174
|
? webhooks?.filter(
|
|
2156
|
-
|
|
2157
|
-
|
|
2158
|
-
|
|
2159
|
-
|
|
2160
|
-
|
|
2161
|
-
|
|
2162
|
-
|
|
2163
|
-
|
|
2175
|
+
w =>
|
|
2176
|
+
subscriptionIdsOrNames?.some(idname =>
|
|
2177
|
+
w.name?.toLowerCase().includes(idname.toLowerCase())
|
|
2178
|
+
) ||
|
|
2179
|
+
subscriptionIdsOrNames?.some(
|
|
2180
|
+
id => id.toLowerCase() === w.id.toLowerCase()
|
|
2181
|
+
)
|
|
2182
|
+
)
|
|
2164
2183
|
: webhooks;
|
|
2165
2184
|
|
|
2166
2185
|
if (Array.isArray(filteredResults)) {
|
|
@@ -2187,7 +2206,8 @@ class ContensisCli {
|
|
|
2187
2206
|
version.modified || version.created
|
|
2188
2207
|
)
|
|
2189
2208
|
.toString()
|
|
2190
|
-
.substring(0, 10)} ${
|
|
2209
|
+
.substring(0, 10)} ${
|
|
2210
|
+
version.modifiedBy || version.createdBy
|
|
2191
2211
|
}]`
|
|
2192
2212
|
)
|
|
2193
2213
|
);
|
|
@@ -2256,12 +2276,14 @@ class ContensisCli {
|
|
|
2256
2276
|
versionsSinceLive,
|
|
2257
2277
|
} of blocks) {
|
|
2258
2278
|
console.log(
|
|
2259
|
-
` - ${id}${description ? ` (${description})` : ''}${
|
|
2260
|
-
|
|
2261
|
-
|
|
2262
|
-
|
|
2263
|
-
|
|
2264
|
-
|
|
2279
|
+
` - ${id}${description ? ` (${description})` : ''}${
|
|
2280
|
+
madeLive
|
|
2281
|
+
? ` [${madeLive.toString().substring(0, 10)} v${liveVersion}]`
|
|
2282
|
+
: ''
|
|
2283
|
+
}${
|
|
2284
|
+
versionsSinceLive
|
|
2285
|
+
? log.warningText(` +${versionsSinceLive}`)
|
|
2286
|
+
: ''
|
|
2265
2287
|
}`
|
|
2266
2288
|
);
|
|
2267
2289
|
for (const branch of branches)
|
|
@@ -2326,11 +2348,11 @@ class ContensisCli {
|
|
|
2326
2348
|
block,
|
|
2327
2349
|
!version
|
|
2328
2350
|
? {
|
|
2329
|
-
|
|
2330
|
-
|
|
2331
|
-
|
|
2332
|
-
|
|
2333
|
-
|
|
2351
|
+
showImage: false,
|
|
2352
|
+
showSource: true,
|
|
2353
|
+
showStaticPaths: false,
|
|
2354
|
+
showStatus: false,
|
|
2355
|
+
}
|
|
2334
2356
|
: undefined
|
|
2335
2357
|
);
|
|
2336
2358
|
});
|
|
@@ -2357,9 +2379,8 @@ class ContensisCli {
|
|
|
2357
2379
|
const contensis = await this.ConnectContensis();
|
|
2358
2380
|
if (contensis) {
|
|
2359
2381
|
// Push new block version
|
|
2360
|
-
const [err, blockVersion] =
|
|
2361
|
-
block
|
|
2362
|
-
);
|
|
2382
|
+
const [err, blockVersion] =
|
|
2383
|
+
await contensis.blocks.PushBlockVersion(block);
|
|
2363
2384
|
if (!err) {
|
|
2364
2385
|
log.success(
|
|
2365
2386
|
messages.blocks.pushed(
|
|
@@ -2436,9 +2457,8 @@ class ContensisCli {
|
|
|
2436
2457
|
|
|
2437
2458
|
// If action is release and version is latest, find the latest version number
|
|
2438
2459
|
if (action === 'release' && version === 'latest') {
|
|
2439
|
-
const [getErr, blockVersion] =
|
|
2440
|
-
blockId
|
|
2441
|
-
);
|
|
2460
|
+
const [getErr, blockVersion] =
|
|
2461
|
+
await this.GetLatestBlockVersion(blockId);
|
|
2442
2462
|
|
|
2443
2463
|
if (getErr) {
|
|
2444
2464
|
// Log error getting latest block version no
|
|
@@ -2525,7 +2545,8 @@ class ContensisCli {
|
|
|
2525
2545
|
await this.HandleFormattingAndOutput(renderLogs, () => {
|
|
2526
2546
|
// print the logs to console
|
|
2527
2547
|
console.log(
|
|
2528
|
-
` - ${blockId} ${branch} ${
|
|
2548
|
+
` - ${blockId} ${branch} ${
|
|
2549
|
+
Number(version) ? `v${version}` : version
|
|
2529
2550
|
} ${dataCenter ? `[${dataCenter}]` : ''}`
|
|
2530
2551
|
);
|
|
2531
2552
|
log.line();
|
|
@@ -2578,11 +2599,11 @@ class ContensisCli {
|
|
|
2578
2599
|
|
|
2579
2600
|
const [lastErr, lastLogs] = following
|
|
2580
2601
|
? await contensis.blocks.GetBlockLogs({
|
|
2581
|
-
|
|
2582
|
-
|
|
2583
|
-
|
|
2584
|
-
|
|
2585
|
-
|
|
2602
|
+
blockId,
|
|
2603
|
+
branchId: branch,
|
|
2604
|
+
version,
|
|
2605
|
+
dataCenter,
|
|
2606
|
+
})
|
|
2586
2607
|
: [null, null];
|
|
2587
2608
|
|
|
2588
2609
|
if (lastLogs) {
|
|
@@ -2630,7 +2651,8 @@ class ContensisCli {
|
|
|
2630
2651
|
log.success(messages.proxies.list(currentEnv, env.currentProject));
|
|
2631
2652
|
for (const { id, name, description, endpoints, version } of proxies) {
|
|
2632
2653
|
console.log(
|
|
2633
|
-
` - ${name} [${
|
|
2654
|
+
` - ${name} [${
|
|
2655
|
+
version.versionNo
|
|
2634
2656
|
}] ${id} ${log.infoText`${description}`}`
|
|
2635
2657
|
);
|
|
2636
2658
|
for (const [language, endpoint] of Object.entries(
|
|
@@ -2684,8 +2706,9 @@ class ContensisCli {
|
|
|
2684
2706
|
for (const rule of rules)
|
|
2685
2707
|
if (rule.return)
|
|
2686
2708
|
console.log(
|
|
2687
|
-
log.infoText` ${
|
|
2688
|
-
|
|
2709
|
+
log.infoText` ${
|
|
2710
|
+
rule.return.endpointId ? 'endpointId' : 'blockId'
|
|
2711
|
+
}: ${rule.return.endpointId || rule.return.blockId}`
|
|
2689
2712
|
);
|
|
2690
2713
|
}
|
|
2691
2714
|
});
|
package/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const LIB_VERSION = "1.3.1-beta.
|
|
1
|
+
export const LIB_VERSION = "1.3.1-beta.2";
|