contensis-cli 1.0.0-beta.52 → 1.0.0-beta.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.vscode/launch.json +15 -15
- package/README.md +1226 -1226
- package/dist/commands/connect.js +44 -0
- package/dist/commands/connect.js.map +7 -0
- package/dist/commands/create.js +75 -0
- package/dist/commands/create.js.map +7 -0
- package/dist/commands/diff.js +57 -0
- package/dist/commands/diff.js.map +7 -0
- package/dist/commands/get.js +170 -0
- package/dist/commands/get.js.map +7 -0
- package/dist/commands/globalOptions.js +144 -0
- package/dist/commands/globalOptions.js.map +7 -0
- package/dist/commands/import.js +121 -0
- package/dist/commands/import.js.map +7 -0
- package/dist/commands/index.js +89 -0
- package/dist/commands/index.js.map +7 -0
- package/dist/commands/list.js +99 -0
- package/dist/commands/list.js.map +7 -0
- package/dist/commands/login.js +56 -0
- package/dist/commands/login.js.map +7 -0
- package/dist/commands/push.js +137 -0
- package/dist/commands/push.js.map +7 -0
- package/dist/commands/release.js +47 -0
- package/dist/commands/release.js.map +7 -0
- package/dist/commands/remove.js +79 -0
- package/dist/commands/remove.js.map +7 -0
- package/dist/commands/set.js +96 -0
- package/dist/commands/set.js.map +7 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +7 -0
- package/dist/localisation/en-GB.js +253 -0
- package/dist/localisation/en-GB.js.map +7 -0
- package/dist/models/AppError.d.js +2 -0
- package/dist/models/AppError.d.js.map +7 -0
- package/dist/models/Cache.d.js +2 -0
- package/dist/models/Cache.d.js.map +7 -0
- package/dist/models/JsModules.d.js +2 -0
- package/dist/models/JsModules.d.js.map +7 -0
- package/dist/providers/CredentialProvider.js +116 -0
- package/dist/providers/CredentialProvider.js.map +7 -0
- package/dist/providers/SessionCacheProvider.js +111 -0
- package/dist/providers/SessionCacheProvider.js.map +7 -0
- package/dist/providers/file-provider.js +117 -0
- package/dist/providers/file-provider.js.map +7 -0
- package/dist/services/ContensisAuthService.js +75 -0
- package/dist/services/ContensisAuthService.js.map +7 -0
- package/dist/services/ContensisCliService.js +1374 -0
- package/dist/services/ContensisCliService.js.map +7 -0
- package/dist/shell.js +278 -0
- package/dist/shell.js.map +7 -0
- package/dist/util/console.printer.js +317 -0
- package/dist/util/console.printer.js.map +7 -0
- package/dist/util/csv.formatter.js +50 -0
- package/dist/util/csv.formatter.js.map +7 -0
- package/dist/util/index.js +97 -0
- package/dist/util/index.js.map +7 -0
- package/dist/util/json.formatter.js +29 -0
- package/dist/util/json.formatter.js.map +7 -0
- package/dist/util/logger.js +216 -0
- package/dist/util/logger.js.map +7 -0
- package/dist/util/xml.formatter.js +51 -0
- package/dist/util/xml.formatter.js.map +7 -0
- package/dist/version.js +29 -0
- package/dist/version.js.map +7 -0
- package/esbuild.config.js +49 -49
- package/headless-setup.sh +6 -6
- package/package.json +59 -59
- package/src/commands/connect.ts +24 -24
- package/src/commands/create.ts +70 -70
- package/src/commands/diff.ts +41 -41
- package/src/commands/get.ts +214 -214
- package/src/commands/globalOptions.ts +127 -127
- package/src/commands/import.ts +128 -128
- package/src/commands/index.ts +80 -80
- package/src/commands/list.ts +116 -116
- package/src/commands/login.ts +34 -34
- package/src/commands/push.ts +127 -127
- package/src/commands/release.ts +32 -32
- package/src/commands/remove.ts +85 -85
- package/src/commands/set.ts +96 -96
- package/src/index.ts +19 -19
- package/src/localisation/en-GB.ts +289 -289
- package/src/models/AppError.d.ts +40 -40
- package/src/models/Cache.d.ts +25 -25
- package/src/models/JsModules.d.ts +1 -1
- package/src/providers/CredentialProvider.ts +121 -121
- package/src/providers/SessionCacheProvider.ts +101 -101
- package/src/providers/file-provider.ts +76 -76
- package/src/services/ContensisAuthService.ts +70 -70
- package/src/services/ContensisCliService.ts +1745 -1745
- package/src/shell.ts +270 -270
- package/src/util/console.printer.ts +371 -371
- package/src/util/csv.formatter.ts +21 -21
- package/src/util/index.ts +73 -73
- package/src/util/json.formatter.ts +1 -1
- package/src/util/logger.ts +234 -234
- package/src/util/xml.formatter.ts +20 -20
- package/src/version.ts +1 -1
- package/tsconfig.json +22 -22
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/services/ContensisCliService.ts"],
|
|
4
|
+
"sourcesContent": ["import fs from 'fs';\r\nimport path from 'path';\r\nimport fetch from 'node-fetch';\r\nimport inquirer from 'inquirer';\r\nimport to from 'await-to-js';\r\nimport chalk from 'chalk';\r\nimport { Component, ContentType, Project } from 'contensis-core-api';\r\nimport { isPassword, isSharedSecret, isUuid, url } from '~/util';\r\nimport SessionCacheProvider from '../providers/SessionCacheProvider';\r\nimport ContensisAuthService from './ContensisAuthService';\r\nimport CredentialProvider from '~/providers/CredentialProvider';\r\nimport { logError, Logger } from '~/util/logger';\r\nimport { LogMessages } from '~/localisation/en-GB';\r\nimport {\r\n ContensisMigrationService,\r\n MigrateRequest,\r\n PushBlockParams,\r\n SourceCms,\r\n logEntriesTable,\r\n ContentTypesResult,\r\n Model,\r\n MigrateModelsResult,\r\n} from 'migratortron';\r\nimport { Entry } from 'contensis-management-api/lib/models';\r\n\r\nimport { csvFormatter } from '~/util/csv.formatter';\r\nimport { xmlFormatter } from '~/util/xml.formatter';\r\nimport { jsonFormatter } from '~/util/json.formatter';\r\nimport {\r\n printBlockVersion,\r\n printMigrateResult,\r\n printModelMigrationAnalysis,\r\n printModelMigrationResult,\r\n} from '~/util/console.printer';\r\nimport { readJsonFile } from '~/providers/file-provider';\r\n\r\ntype OutputFormat = 'json' | 'csv' | 'xml';\r\n\r\ntype OutputOptions = {\r\n format?: OutputFormat;\r\n output?: string;\r\n};\r\n\r\ninterface IConnectOptions extends IAuthOptions {\r\n alias?: string;\r\n projectId?: string;\r\n}\r\n\r\ninterface IAuthOptions {\r\n user?: string;\r\n password?: string;\r\n clientId?: string;\r\n sharedSecret?: string;\r\n}\r\n\r\ninterface IImportOptions {\r\n sourceAlias?: string;\r\n sourceProjectId?: string;\r\n}\r\n\r\nlet insecurePasswordWarningShown = false;\r\n\r\nclass ContensisCli {\r\n static quit = (error?: Error) => {\r\n process.removeAllListeners('exit');\r\n const exitCode = error ? 1 : 0;\r\n\r\n // console.info(`\\nExiting contensis-cli with exit code: ${exitCode}\\n`);\r\n process.exit(exitCode);\r\n };\r\n\r\n private command: CliCommand;\r\n private format?: OutputFormat;\r\n private output?: string;\r\n private session: SessionCacheProvider;\r\n\r\n contensis?: ContensisMigrationService;\r\n contensisOpts: Partial<MigrateRequest>;\r\n currentProject: string;\r\n\r\n sourceAlias?: string;\r\n targetEnv?: string;\r\n urls:\r\n | {\r\n api: string;\r\n cms: string;\r\n liveWeb: string;\r\n previewWeb: string;\r\n iisWeb: string;\r\n iisPreviewWeb: string;\r\n }\r\n | undefined;\r\n log = Logger;\r\n messages = LogMessages;\r\n\r\n verb: string;\r\n noun: string;\r\n thirdArg: string;\r\n\r\n get cache() {\r\n return this.session.Get();\r\n }\r\n\r\n get currentEnv() {\r\n return this.cache.currentEnvironment || '';\r\n }\r\n\r\n set currentEnv(currentEnvironment: string) {\r\n this.session.Update({ currentEnvironment });\r\n }\r\n\r\n get env() {\r\n const currentEnvironment = this.currentEnv;\r\n const environments = this.cache.environments || {};\r\n\r\n if (!currentEnvironment) return {} as EnvironmentCache;\r\n else if (!!environments[currentEnvironment])\r\n return environments[currentEnvironment];\r\n else {\r\n return {\r\n history: [],\r\n lastUserId: '',\r\n projects: [],\r\n versionStatus: 'latest',\r\n } as EnvironmentCache;\r\n }\r\n }\r\n\r\n get contentTypes() {\r\n return this.contensis?.models.contentTypes();\r\n }\r\n\r\n get components() {\r\n return this.contensis?.models.components();\r\n }\r\n get models(): Model[] | undefined {\r\n return this.contensis?.models.contentModels();\r\n }\r\n\r\n constructor(\r\n args: string[],\r\n outputOpts?: OutputOptions & IConnectOptions & IImportOptions,\r\n contensisOpts: Partial<MigrateRequest> = {}\r\n ) {\r\n // console.log('args: ', JSON.stringify(args, null, 2));\r\n\r\n const [exe, script, verb = '', noun = '', ...restArgs] = args;\r\n this.verb = verb?.toLowerCase();\r\n this.noun = noun?.toLowerCase();\r\n this.thirdArg = restArgs?.[0];\r\n\r\n const commandText = `${this.verb} ${this.noun} ${\r\n restArgs ? restArgs.join(' ') : ''\r\n }`.trim();\r\n\r\n this.session = new SessionCacheProvider();\r\n\r\n this.contensisOpts = contensisOpts;\r\n this.format = outputOpts?.format;\r\n this.output =\r\n outputOpts?.output && path.join(process.cwd(), outputOpts.output);\r\n\r\n const currentEnvironment = outputOpts?.alias || this.currentEnv;\r\n const environments = this.cache.environments || {};\r\n this.currentEnv = currentEnvironment;\r\n\r\n const env = this.env;\r\n\r\n if (outputOpts?.projectId) env.currentProject = outputOpts.projectId;\r\n if (outputOpts?.user) env.lastUserId = outputOpts.user;\r\n // setting this in env means passwordFallback is written to environments.json\r\n if (outputOpts?.password) env.passwordFallback = outputOpts.password;\r\n if (outputOpts?.clientId) env.lastUserId = outputOpts.clientId;\r\n if (outputOpts?.sharedSecret)\r\n env.passwordFallback = outputOpts.sharedSecret;\r\n\r\n this.currentProject = env?.currentProject || 'null';\r\n this.sourceAlias = outputOpts?.sourceAlias || currentEnvironment;\r\n\r\n if (currentEnvironment) {\r\n this.urls = url(currentEnvironment, env?.currentProject || 'website');\r\n }\r\n\r\n this.command = {\r\n commandText,\r\n createdDate: new Date().toISOString(),\r\n createdUserId: env?.lastUserId,\r\n };\r\n\r\n if (currentEnvironment) {\r\n env.history = [this.command];\r\n if (commandText) {\r\n environments[currentEnvironment] = env;\r\n this.session.Update({\r\n currentEnvironment,\r\n environments,\r\n history: [commandText],\r\n });\r\n }\r\n }\r\n }\r\n\r\n PrintEnvironments = () => {\r\n const { log, messages } = this;\r\n const { currentEnvironment, environments = {} } = this.cache;\r\n const envKeys = Object.keys(environments);\r\n log.success(messages.envs.found(envKeys.length));\r\n this.HandleFormattingAndOutput(envKeys, () => {\r\n // print the envKeys to console\r\n for (const env of envKeys) {\r\n console.log(` - ${currentEnvironment === env ? '* ' : ''}${env}`);\r\n }\r\n });\r\n if (envKeys.length === 0 || !currentEnvironment) {\r\n log.help(messages.envs.tip());\r\n }\r\n };\r\n\r\n Connect = async (environment: string) => {\r\n const { log, messages, session } = this;\r\n\r\n if (environment) {\r\n this.currentEnv = environment;\r\n this.urls = url(environment, 'website');\r\n\r\n const [fetchErr, response] = await to(fetch(this.urls.cms));\r\n if (response && response?.status < 400) {\r\n log.success(messages.connect.connected(environment));\r\n session.UpdateEnv(this.env, environment);\r\n\r\n if (this.env?.lastUserId) {\r\n // await this.ConnectContensis();\r\n await this.PrintProjects();\r\n } else {\r\n log.warning(messages.projects.noList());\r\n log.help(messages.connect.tip());\r\n }\r\n } else {\r\n // Cannot reach environment - status X\r\n log.error(\r\n messages.connect.unreachable(this.urls.cms, response?.status || 0)\r\n );\r\n }\r\n } else {\r\n // No environment alias specified\r\n log.error(messages.connect.noEnv());\r\n }\r\n };\r\n\r\n ConnectContensis = async ({ commit = false } = {}) => {\r\n if (!this.contensis) {\r\n const { contensisOpts, currentEnv, env, log, messages } = this;\r\n const userId = env?.lastUserId;\r\n const isGuidId = userId && isUuid(userId);\r\n\r\n if (currentEnv && userId) {\r\n const credentials = await this.GetCredentials(\r\n userId,\r\n env.passwordFallback\r\n );\r\n\r\n const cachedPassword = credentials?.current?.password;\r\n\r\n if (cachedPassword) {\r\n this.contensis = new ContensisMigrationService(\r\n {\r\n ...contensisOpts,\r\n source: {\r\n url: this.urls?.cms || '',\r\n username: !isGuidId ? userId : undefined,\r\n password: !isGuidId ? cachedPassword : undefined,\r\n clientId: isGuidId ? userId : undefined,\r\n sharedSecret: isGuidId ? cachedPassword : undefined,\r\n project: env?.currentProject || '',\r\n assetHostname: this.urls?.previewWeb,\r\n },\r\n concurrency:\r\n typeof contensisOpts.concurrency !== 'undefined'\r\n ? contensisOpts.concurrency\r\n : 3,\r\n outputProgress: true,\r\n },\r\n !commit\r\n );\r\n }\r\n } else {\r\n if (!currentEnv) log.help(messages.connect.help());\r\n if (!userId) log.help(messages.connect.tip());\r\n }\r\n }\r\n return this.contensis;\r\n };\r\n\r\n ConnectContensisImport = async ({\r\n commit = false,\r\n fromFile,\r\n importDataType,\r\n }: {\r\n commit?: boolean;\r\n fromFile?: string;\r\n importDataType?:\r\n | 'entries'\r\n | 'contentTypes'\r\n | 'components'\r\n | 'models'\r\n | 'user-input';\r\n }) => {\r\n const source: 'contensis' | 'file' = fromFile ? 'file' : 'contensis';\r\n\r\n const fileData = fromFile\r\n ? readJsonFile<(Entry | ContentType | Component)[]>(fromFile) || []\r\n : [];\r\n\r\n if (typeof fileData === 'string')\r\n throw new Error(`Import file format must be of type JSON`);\r\n\r\n const { contensisOpts, currentEnv, env, log, messages, sourceAlias } = this;\r\n const environments = this.cache.environments || {};\r\n const sourceEnvironment = environments[sourceAlias || ''] || {};\r\n const sourceCms =\r\n ('source' in contensisOpts && contensisOpts.source) ||\r\n ({} as Partial<SourceCms>);\r\n const sourceUserId =\r\n sourceCms.clientId || sourceCms.username || sourceEnvironment.lastUserId;\r\n const sourceProjectId =\r\n sourceCms.project || sourceEnvironment.currentProject || 'website';\r\n const isSourceGuidId = sourceUserId && isUuid(sourceUserId);\r\n const sourceUrls = url(sourceAlias || '', sourceProjectId);\r\n\r\n const sourcePassword =\r\n sourceCms.sharedSecret ||\r\n sourceCms.password ||\r\n sourceEnvironment.passwordFallback;\r\n\r\n const targetUserId = env?.lastUserId;\r\n const isTargetGuidId = targetUserId && isUuid(targetUserId);\r\n\r\n if (sourceUserId && currentEnv && targetUserId) {\r\n const sourceCredentials = await this.GetCredentials(\r\n sourceUserId,\r\n sourcePassword,\r\n sourceAlias,\r\n false\r\n );\r\n\r\n const cachedSourcePassword = sourceCredentials?.current?.password;\r\n\r\n const targetCredentials = await this.GetCredentials(\r\n targetUserId,\r\n env.passwordFallback\r\n );\r\n\r\n const cachedTargetPassword = targetCredentials?.current?.password;\r\n\r\n if (cachedSourcePassword && cachedTargetPassword) {\r\n if (source === 'file' || importDataType === 'user-input') {\r\n this.contensis = new ContensisMigrationService(\r\n {\r\n concurrency: 3,\r\n outputProgress: true,\r\n ...contensisOpts,\r\n target: {\r\n url: this.urls?.cms || '',\r\n username: !isTargetGuidId ? targetUserId : undefined,\r\n password: !isTargetGuidId ? cachedTargetPassword : undefined,\r\n clientId: isTargetGuidId ? targetUserId : undefined,\r\n sharedSecret: isTargetGuidId ? cachedTargetPassword : undefined,\r\n targetProjects: [env.currentProject || ''],\r\n assetHostname: this.urls?.previewWeb,\r\n },\r\n ...(importDataType ? { [importDataType]: fileData } : {}),\r\n },\r\n !commit\r\n );\r\n } else if (source === 'contensis') {\r\n this.contensis = new ContensisMigrationService(\r\n {\r\n concurrency: 3,\r\n outputProgress: true,\r\n ...contensisOpts,\r\n source: {\r\n url: sourceUrls.cms || '',\r\n username: !isSourceGuidId ? sourceUserId : undefined,\r\n password: !isSourceGuidId ? cachedSourcePassword : undefined,\r\n clientId: isSourceGuidId ? sourceUserId : undefined,\r\n sharedSecret: isSourceGuidId ? cachedSourcePassword : undefined,\r\n project: sourceProjectId,\r\n assetHostname: sourceUrls.previewWeb,\r\n },\r\n target: {\r\n url: this.urls?.cms || '',\r\n username: !isTargetGuidId ? targetUserId : undefined,\r\n password: !isTargetGuidId ? cachedTargetPassword : undefined,\r\n clientId: isTargetGuidId ? targetUserId : undefined,\r\n sharedSecret: isTargetGuidId ? cachedTargetPassword : undefined,\r\n targetProjects: [env.currentProject || ''],\r\n assetHostname: this.urls?.previewWeb,\r\n },\r\n },\r\n !commit\r\n );\r\n }\r\n }\r\n } else {\r\n if (!currentEnv) log.help(messages.connect.help());\r\n if (!targetUserId) log.help(messages.connect.tip());\r\n }\r\n return this.contensis;\r\n };\r\n\r\n GetCredentials = async (\r\n userId: string,\r\n password?: string,\r\n currentEnv = this.currentEnv,\r\n saveCurrentEnv = true\r\n ): Promise<CredentialProvider | undefined> => {\r\n const { log, messages } = this;\r\n if (userId) {\r\n const [credentialError, credentials] = await new CredentialProvider(\r\n { userId, alias: currentEnv },\r\n password\r\n ).Init();\r\n\r\n if (credentialError && !credentials.current) {\r\n // Log problem with Credential Provider\r\n log.error(credentialError as any);\r\n return;\r\n }\r\n\r\n if (credentials.remarks.secure !== true) {\r\n if (!insecurePasswordWarningShown) {\r\n log.warning(messages.login.insecurePassword());\r\n insecurePasswordWarningShown = true;\r\n }\r\n } else {\r\n const env = this.cache.environments[currentEnv];\r\n env.passwordFallback = undefined;\r\n this.session.UpdateEnv(env, currentEnv, saveCurrentEnv);\r\n }\r\n return credentials;\r\n }\r\n };\r\n\r\n Login = async (\r\n userId: string,\r\n {\r\n password = isPassword(this.env.passwordFallback),\r\n promptPassword = true,\r\n sharedSecret = isSharedSecret(this.env.passwordFallback),\r\n silent = false,\r\n attempt = 1,\r\n }: {\r\n password?: string;\r\n promptPassword?: boolean;\r\n sharedSecret?: string;\r\n silent?: boolean;\r\n attempt?: number;\r\n } = {}\r\n ): Promise<string | undefined> => {\r\n let inputPassword = password || sharedSecret;\r\n const { log, messages } = this;\r\n\r\n if (userId) {\r\n const { currentEnv, env } = this;\r\n\r\n if (currentEnv) {\r\n const credentials = await this.GetCredentials(userId, inputPassword);\r\n\r\n if (credentials) {\r\n const cachedPassword = isPassword(credentials.current?.password);\r\n const cachedSecret = isSharedSecret(credentials.current?.password);\r\n\r\n if (!cachedPassword && !cachedSecret && promptPassword) {\r\n // Password prompt\r\n ({ inputPassword } = await inquirer.prompt([\r\n {\r\n type: 'password',\r\n message: messages.login.passwordPrompt(currentEnv, userId),\r\n name: 'inputPassword',\r\n mask: '*',\r\n prefix: undefined,\r\n },\r\n ]));\r\n }\r\n\r\n if (inputPassword || cachedPassword || cachedSecret) {\r\n const authService = new ContensisAuthService({\r\n username: userId,\r\n password: inputPassword || cachedPassword,\r\n projectId: env?.currentProject || 'website',\r\n rootUrl: this.urls?.cms || '',\r\n clientId: userId,\r\n clientSecret: sharedSecret || cachedSecret,\r\n });\r\n\r\n const [authError, bearerToken] = await to(\r\n authService.BearerToken()\r\n );\r\n\r\n // Login successful\r\n if (bearerToken) {\r\n // Set env vars\r\n env.authToken = bearerToken;\r\n env.lastUserId = userId;\r\n env.passwordFallback =\r\n credentials.remarks.secure !== true\r\n ? credentials.current?.password\r\n : undefined;\r\n\r\n // Persist env before finding projects or doing anything else\r\n this.session.UpdateEnv(env);\r\n if (inputPassword) await credentials.Save(inputPassword);\r\n if (sharedSecret) await credentials.Save(sharedSecret);\r\n\r\n if (!silent) {\r\n Logger.success(messages.login.success(currentEnv, userId));\r\n await this.PrintProjects();\r\n }\r\n } else if (authError) {\r\n Logger.error(authError.toString());\r\n // Clear env vars\r\n env.authToken = '';\r\n env.lastUserId = '';\r\n env.passwordFallback = undefined;\r\n // Persist env to remove cleared values\r\n this.session.UpdateEnv(env);\r\n\r\n // If the auth error was raised using a cached password\r\n if (\r\n (cachedPassword || cachedSecret) &&\r\n credentials.remarks.secure\r\n ) {\r\n // Remove any bad stored credential and trigger login prompt again\r\n await credentials.Delete();\r\n return await this.Login(userId, { password, sharedSecret });\r\n } else {\r\n throw new Error(messages.login.failed(currentEnv, userId));\r\n }\r\n }\r\n\r\n return env.authToken;\r\n } else {\r\n Logger.error(messages.login.passwordPrompt());\r\n if (attempt < 2)\r\n return await this.Login(userId, { attempt: attempt + 1 });\r\n }\r\n }\r\n } else {\r\n // No environment set, use `contensis connect {alias}` first\r\n Logger.error(messages.login.noEnv());\r\n }\r\n } else {\r\n // No user id specified\r\n Logger.error(messages.login.noUserId());\r\n }\r\n };\r\n\r\n PrintContensisVersion = async () => {\r\n const { log, messages } = this;\r\n const contensis = await this.ConnectContensis();\r\n\r\n if (contensis) {\r\n // Retrieve projects list for env\r\n const [projectsErr, projects] = await to(\r\n contensis.projects.GetSourceProjects()\r\n );\r\n\r\n if (Array.isArray(projects)) {\r\n // Print contensis version to console\r\n this.HandleFormattingAndOutput(contensis.contensisVersion, () =>\r\n log.raw(log.highlightText(contensis.contensisVersion))\r\n );\r\n }\r\n\r\n if (projectsErr) {\r\n log.error(messages.projects.noList());\r\n log.error(projectsErr.message);\r\n }\r\n }\r\n };\r\n\r\n PrintProjects = async () => {\r\n const { currentProject, log, messages, session } = this;\r\n const contensis = await this.ConnectContensis();\r\n\r\n if (contensis) {\r\n // Retrieve projects list for env\r\n const [projectsErr, projects] = await to(\r\n contensis.projects.GetSourceProjects()\r\n );\r\n\r\n if (Array.isArray(projects)) {\r\n // save these projects in cache\r\n const nextCurrentProject =\r\n currentProject && currentProject !== 'null'\r\n ? currentProject\r\n : projects.some(p => p.id === 'website')\r\n ? 'website'\r\n : undefined;\r\n\r\n session.UpdateEnv({\r\n projects: projects.map(p => p.id),\r\n currentProject: nextCurrentProject,\r\n });\r\n\r\n log.success(messages.projects.list());\r\n log.raw('');\r\n\r\n this.HandleFormattingAndOutput(projects, () => {\r\n // print the projects to console\r\n for (const project of projects.sort((a, b) =>\r\n a.id.localeCompare(b.id)\r\n )) {\r\n let color;\r\n try {\r\n color = chalk.keyword((project as any).color);\r\n } catch (ex) {\r\n color = chalk.white;\r\n }\r\n console.log(\r\n `${\r\n nextCurrentProject === project.id\r\n ? `>> ${log.boldText(color(project.id))}`\r\n : ` ${color(project.id)}`\r\n } ${log.infoText(\r\n `[${project.supportedLanguages\r\n .map(l =>\r\n l === project.primaryLanguage ? `*${log.boldText(l)}` : l\r\n )\r\n .join(' ')}]`\r\n )}`\r\n );\r\n }\r\n });\r\n\r\n if (!this.SetProject(nextCurrentProject))\r\n log.warning(messages.projects.tip());\r\n }\r\n\r\n if (projectsErr) {\r\n log.error(messages.projects.noList());\r\n log.error(projectsErr.message);\r\n }\r\n }\r\n };\r\n\r\n PrintProject = async (projectId = this.currentProject) => {\r\n const { log, messages, session } = this;\r\n const contensis = await this.ConnectContensis();\r\n\r\n if (contensis) {\r\n // Retrieve projects list for env\r\n const [projectsErr, projects] = await to(\r\n contensis.projects.GetSourceProjects()\r\n );\r\n\r\n const foundProject = projects?.find(\r\n p => p.id.toLowerCase() === projectId.toLowerCase()\r\n );\r\n\r\n if (foundProject) {\r\n log.raw('');\r\n this.HandleFormattingAndOutput(foundProject, log.object);\r\n }\r\n\r\n if (projectsErr) {\r\n log.error(messages.projects.noList());\r\n log.error(projectsErr.message);\r\n }\r\n }\r\n };\r\n\r\n SetProject = (projectId = 'website') => {\r\n const { env, log, messages, session } = this;\r\n let nextProjectId: string | undefined;\r\n if (env?.projects.length > 0 && env?.lastUserId) {\r\n nextProjectId = env.projects.find(\r\n p => p.toLowerCase() === projectId.toLowerCase()\r\n );\r\n if (nextProjectId) {\r\n env.currentProject = nextProjectId;\r\n session.UpdateEnv(env);\r\n log.success(messages.projects.set(projectId));\r\n log.raw('');\r\n } else {\r\n log.error(messages.projects.failedSet(projectId));\r\n }\r\n } else {\r\n // No projects for currentEnv, try logging in\r\n log.warning(messages.projects.noList());\r\n log.help(messages.connect.tip());\r\n }\r\n return nextProjectId;\r\n };\r\n\r\n SetVersion = (versionStatus: 'latest' | 'published') => {\r\n const { env, log, messages, session } = this;\r\n if (!['latest', 'published'].includes(versionStatus)) {\r\n log.error(messages.version.invalid(versionStatus));\r\n return false;\r\n }\r\n if (!env) {\r\n log.help(messages.version.noEnv());\r\n return false;\r\n }\r\n if (env?.projects.length > 0 && env?.lastUserId) {\r\n session.UpdateEnv({ versionStatus });\r\n log.success(messages.version.set(this.currentEnv, versionStatus));\r\n return true;\r\n } else {\r\n // No projects for currentEnv, try logging in\r\n log.warning(messages.projects.noList());\r\n log.help(messages.connect.tip());\r\n return false;\r\n }\r\n };\r\n\r\n HydrateContensis = async () => {\r\n const { log } = this;\r\n const contensis = await this.ConnectContensis();\r\n\r\n if (contensis) {\r\n // Retrieve content types list for env\r\n const [contensisErr, models] = await to(\r\n contensis.models.HydrateContensisRepositories()\r\n );\r\n\r\n if (contensisErr) {\r\n log.error(contensisErr.message);\r\n return contensisErr;\r\n }\r\n }\r\n };\r\n\r\n PrintApiKeys = async () => {\r\n const { currentEnv, log, messages } = this;\r\n const contensis = await this.ConnectContensis();\r\n\r\n if (contensis) {\r\n // Retrieve keys list for env\r\n const [keysErr, apiKeys] = await contensis.apiKeys.GetKeys();\r\n\r\n if (Array.isArray(apiKeys)) {\r\n log.success(messages.keys.list(currentEnv));\r\n this.HandleFormattingAndOutput(apiKeys, () => {\r\n // print the keys to console\r\n for (const {\r\n id,\r\n sharedSecret,\r\n name,\r\n description,\r\n dateModified,\r\n modifiedBy,\r\n } of apiKeys) {\r\n console.log(\r\n ` - ${name}${\r\n description ? ` (${description})` : ''\r\n } [${dateModified.toString().substring(0, 10)} ${modifiedBy}]`\r\n );\r\n console.log(` ${id}`);\r\n console.log(` ${sharedSecret}`);\r\n }\r\n });\r\n }\r\n\r\n if (keysErr) {\r\n log.error(messages.keys.noList(currentEnv));\r\n log.error(jsonFormatter(keysErr));\r\n }\r\n }\r\n };\r\n\r\n CreateApiKey = async (name: string, description?: string) => {\r\n const { currentEnv, log, messages } = this;\r\n const contensis = await this.ConnectContensis();\r\n\r\n if (contensis) {\r\n const [err, key] = await contensis.apiKeys.CreateKey(name, description);\r\n\r\n if (key) {\r\n log.success(messages.keys.created(currentEnv, name));\r\n\r\n // print the key details to console\r\n console.log(\r\n ` - ${key.name}${\r\n key.description ? ` (${key.description})` : ''\r\n } [${key.dateModified.toString().substring(0, 10)} ${key.modifiedBy}]`\r\n );\r\n console.log(` - id: ${key.id}`);\r\n console.log(` - sharedSecret: ${key.sharedSecret}`);\r\n }\r\n console.log('');\r\n\r\n if (err) {\r\n log.error(messages.keys.failedCreate(currentEnv, name), err);\r\n }\r\n }\r\n };\r\n\r\n RemoveApiKey = async (id: string) => {\r\n const { currentEnv, log, messages } = this;\r\n const contensis = await this.ConnectContensis({ commit: true });\r\n\r\n if (contensis) {\r\n const [err, key] = await contensis.apiKeys.RemoveKey(id);\r\n\r\n if (!err) {\r\n log.success(messages.keys.removed(currentEnv, id));\r\n console.log('');\r\n } else {\r\n log.error(messages.keys.failedRemove(currentEnv, id), err);\r\n }\r\n }\r\n };\r\n\r\n CreateProject = async (project: Project) => {\r\n const { currentEnv, log, messages } = this;\r\n const contensis = await this.ConnectContensis();\r\n\r\n if (contensis) {\r\n const [err, created] = await contensis.projects.CreateProject(project);\r\n\r\n if (created) {\r\n log.success(messages.projects.created(currentEnv, project.id));\r\n\r\n this.HandleFormattingAndOutput(created, () => {\r\n // set the CLI project to the newly created project\r\n this.SetProject(project.id);\r\n // print all the projects to console\r\n this.PrintProjects();\r\n });\r\n return project.id;\r\n }\r\n\r\n if (err) {\r\n log.error(messages.projects.failedCreate(currentEnv, project.id), err);\r\n }\r\n }\r\n };\r\n\r\n UpdateProject = async (project: Partial<Project>) => {\r\n const { currentEnv, currentProject, log, messages } = this;\r\n const contensis = await this.ConnectContensis();\r\n\r\n if (contensis) {\r\n const [err, updated] = await contensis.projects.UpdateProject({\r\n id: currentProject,\r\n ...project,\r\n });\r\n\r\n if (updated) {\r\n log.success(messages.projects.updated(currentEnv, currentProject));\r\n\r\n this.HandleFormattingAndOutput(updated, log.object);\r\n return updated.id;\r\n }\r\n\r\n if (err) {\r\n log.error(\r\n messages.projects.failedUpdate(currentEnv, currentProject),\r\n err\r\n );\r\n }\r\n }\r\n };\r\n\r\n GetContentTypes = async () => {\r\n const { currentProject, log, messages } = this;\r\n let err;\r\n if (!this.contensis) err = await this.HydrateContensis();\r\n\r\n if (err) log.error(messages.models.noList(currentProject));\r\n if (!this.contensis) log.warning(messages.models.noList(currentProject));\r\n\r\n return this.contensis;\r\n };\r\n\r\n PrintContentModels = async (modelIds: string[] = []) => {\r\n const { currentProject, log, messages } = this;\r\n const contensis = await this.GetContentTypes();\r\n if (contensis) {\r\n // Retrieve models list for env\r\n const { models, contentTypes = [], components = [] } = this;\r\n\r\n // Models to output to console\r\n const returnModels = modelIds?.length\r\n ? models?.filter((m: Model) =>\r\n modelIds.some(id => id.toLowerCase() === m.id.toLowerCase())\r\n )\r\n : undefined;\r\n\r\n // Generate a list of contentTypeIds and componentIds from all models\r\n // and dependencies\r\n const contentTypeIds = Array.from(\r\n new Set([\r\n ...(returnModels || models || []).map(m => m.id),\r\n ...(returnModels || models || [])\r\n .map(m => m.dependencies?.contentTypes?.map(c => c[0]) || [])\r\n .flat(),\r\n ])\r\n );\r\n const componentIds = Array.from(\r\n new Set(\r\n (returnModels || models || [])\r\n .map(m => m.dependencies?.components?.map(c => c[0]) || [])\r\n .flat()\r\n )\r\n );\r\n\r\n // Create an array of all the content types and component definitions\r\n // we will use this when outputting to a file\r\n const contentModelBackup = [\r\n ...contentTypes.filter(c => contentTypeIds.includes(c.id)),\r\n ...components.filter(c => componentIds.includes(c.id)),\r\n ];\r\n\r\n if (Array.isArray(returnModels)) {\r\n log.success(messages.models.list(currentProject));\r\n this.HandleFormattingAndOutput(contentModelBackup, () => {\r\n // print the content models to console\r\n for (const model of returnModels) {\r\n log.raw('');\r\n log.object(model);\r\n }\r\n log.raw('');\r\n });\r\n } else {\r\n log.success(\r\n messages.models.get(currentProject, models?.length.toString() || '0')\r\n );\r\n log.raw('');\r\n if (models?.length) {\r\n this.HandleFormattingAndOutput(contentModelBackup, () => {\r\n // print the content models s#qto console\r\n for (const model of models) {\r\n const components = model.components?.length || 0;\r\n const contentTypes = model.contentTypes?.length || 0;\r\n const dependencies =\r\n (model.dependencies?.components?.length || 0) +\r\n (model.dependencies?.contentTypes?.length || 0);\r\n const dependencyOf =\r\n (model.dependencyOf?.components?.length || 0) +\r\n (model.dependencyOf?.contentTypes?.length || 0);\r\n\r\n const hasAny =\r\n components + contentTypes + dependencies + dependencyOf;\r\n log.raw(\r\n ` - ${log.highlightText(log.boldText(model.id))} ${\r\n hasAny\r\n ? log.infoText(\r\n `{ ${components ? `components: ${components}, ` : ''}${\r\n contentTypes ? `contentTypes: ${contentTypes}, ` : ''\r\n }${\r\n dependencies ? `references: ${dependencies}, ` : ''\r\n }${\r\n dependencyOf ? `required by: ${dependencyOf}` : ''\r\n } }`\r\n )\r\n : ''\r\n }`\r\n );\r\n }\r\n log.raw('');\r\n });\r\n }\r\n }\r\n }\r\n };\r\n\r\n ImportContentModels = async ({\r\n commit,\r\n fromFile,\r\n }: {\r\n commit: boolean;\r\n fromFile: string;\r\n }) => {\r\n const { currentProject, log, messages } = this;\r\n\r\n const fileData = fromFile\r\n ? readJsonFile<(ContentType | Component)[]>(fromFile) || []\r\n : [];\r\n if (typeof fileData === 'string')\r\n throw new Error(`Import file format must be of type JSON`);\r\n\r\n const contensis = await this.ConnectContensisImport({\r\n commit,\r\n fromFile,\r\n importDataType: 'models',\r\n });\r\n\r\n if (contensis) {\r\n log.line();\r\n if (contensis.isPreview) {\r\n console.log(log.successText(` -- IMPORT PREVIEW -- `));\r\n } else {\r\n console.log(log.warningText(` *** COMMITTING IMPORT *** `));\r\n }\r\n\r\n const [migrateErr, result] = await contensis.MigrateContentModels();\r\n\r\n if (migrateErr) logError(migrateErr);\r\n else\r\n this.HandleFormattingAndOutput(result, () => {\r\n // print the results to console\r\n if (!commit) {\r\n log.raw(log.boldText(`\\nContent types:`));\r\n if (!result.contentTypes) log.info(`- None returned\\n`);\r\n else printModelMigrationAnalysis(this, result.contentTypes);\r\n\r\n log.raw(log.boldText(`\\nComponents:`));\r\n if (!result.components) log.info(`- None returned\\n`);\r\n else printModelMigrationAnalysis(this, result.components);\r\n } else {\r\n const migrateResult = result as MigrateModelsResult;\r\n log.raw(log.boldText(`\\nContent types:`));\r\n printModelMigrationResult(\r\n this,\r\n migrateResult[currentProject].contentTypes\r\n );\r\n\r\n log.raw(log.boldText(`\\nComponents:`));\r\n printModelMigrationResult(\r\n this,\r\n migrateResult[currentProject].components\r\n );\r\n }\r\n });\r\n } else {\r\n log.warning(messages.models.noList(currentProject));\r\n log.help(messages.connect.tip());\r\n }\r\n };\r\n\r\n PrintContentTypes = async () => {\r\n const { currentProject, log, messages } = this;\r\n await this.GetContentTypes();\r\n if (this.contensis) {\r\n // Retrieve content types list for env\r\n const { contentTypes } = this;\r\n\r\n if (Array.isArray(contentTypes)) {\r\n log.success(messages.contenttypes.list(currentProject));\r\n this.HandleFormattingAndOutput(contentTypes, () => {\r\n // print the content types to console\r\n for (const contentType of contentTypes) {\r\n const fieldsLength = contentType.fields?.length || 0;\r\n console.log(\r\n ` - ${contentType.id} [${fieldsLength} field${\r\n fieldsLength !== 1 ? 's' : ''\r\n }]`\r\n );\r\n }\r\n });\r\n }\r\n }\r\n };\r\n\r\n PrintContentType = async (contentTypeId: string) => {\r\n const { currentProject, log, messages } = this;\r\n await this.GetContentTypes();\r\n if (this.contensis) {\r\n // Retrieve content types list for env\r\n const { contentTypes } = this;\r\n\r\n if (Array.isArray(contentTypes)) {\r\n const contentType = contentTypes.find(\r\n c => c.id.toLowerCase() === contentTypeId.toLowerCase()\r\n );\r\n if (contentType) {\r\n log.success(\r\n messages.contenttypes.get(currentProject, contentType.id)\r\n );\r\n // print the content type to console\r\n this.HandleFormattingAndOutput(contentType, log.object);\r\n } else {\r\n log.error(\r\n messages.contenttypes.failedGet(currentProject, contentTypeId)\r\n );\r\n }\r\n }\r\n }\r\n };\r\n\r\n RemoveContentTypes = async (contentTypeIds: string[], commit = false) => {\r\n const { currentProject, log, messages } = this;\r\n const contensis = await this.ConnectContensisImport({\r\n commit,\r\n importDataType: 'user-input',\r\n });\r\n if (contensis) {\r\n const [err, result] = await contensis.DeleteContentTypes(contentTypeIds);\r\n\r\n if (err) {\r\n log.error(\r\n messages.contenttypes.failedRemove(\r\n currentProject,\r\n contentTypeIds.join('\", \"')\r\n ),\r\n err\r\n );\r\n } else {\r\n log.success(\r\n messages.contenttypes.removed(\r\n currentProject,\r\n contentTypeIds.join('\", \"'),\r\n !contensis.isPreview\r\n )\r\n );\r\n // print the results to console\r\n this.HandleFormattingAndOutput(result, () =>\r\n log.object(jsonFormatter(result))\r\n );\r\n }\r\n }\r\n };\r\n\r\n ImportContentTypes = async (\r\n {\r\n commit,\r\n fromFile,\r\n }: {\r\n commit: boolean;\r\n fromFile: string;\r\n },\r\n contentTypeIds: string[] = []\r\n ) => {\r\n const { currentProject, log, messages } = this;\r\n\r\n let fileData = fromFile ? readJsonFile<ContentType[]>(fromFile) || [] : [];\r\n if (typeof fileData === 'string')\r\n throw new Error(`Import file format must be of type JSON`);\r\n\r\n if (!Array.isArray(fileData)) fileData = [fileData];\r\n\r\n const contensis = await this.ConnectContensisImport({\r\n commit,\r\n importDataType: fromFile ? 'user-input' : undefined,\r\n });\r\n\r\n if (contensis) {\r\n // Pass each content type to the target repo\r\n for (const contentType of fileData) {\r\n // Fix invalid data\r\n contentType.projectId = currentProject;\r\n delete contentType.uuid;\r\n\r\n const [err, created, createStatus] = await contensis.models.targetRepos[\r\n currentProject\r\n ].repo.UpsertContentType(false, contentType);\r\n\r\n if (err) log.error(err.message, err);\r\n if (createStatus) {\r\n log.success(\r\n messages.contenttypes.created(\r\n currentProject,\r\n contentType.id,\r\n createStatus\r\n )\r\n );\r\n // print the content type to console\r\n this.HandleFormattingAndOutput(contentType, () => {});\r\n }\r\n }\r\n }\r\n };\r\n\r\n DiffModels = async (\r\n {\r\n fromFile,\r\n }: {\r\n fromFile: string;\r\n },\r\n modelIds: string[] = []\r\n ) => {\r\n const { log } = this;\r\n\r\n let fileData = fromFile ? readJsonFile<ContentType[]>(fromFile) || [] : [];\r\n if (typeof fileData === 'string')\r\n throw new Error(`Import file format must be of type JSON`);\r\n\r\n if (!Array.isArray(fileData)) fileData = [fileData];\r\n\r\n const contensis = await this.ConnectContensisImport({\r\n fromFile,\r\n importDataType: 'models',\r\n });\r\n\r\n if (contensis) {\r\n const [err, result] = (await to(\r\n contensis.models.Diff(fileData.length ? fileData : modelIds)\r\n )) as [Error | null, ContentTypesResult | undefined];\r\n\r\n if (err) log.error(err.message, err);\r\n if (result)\r\n // print the content type to console\r\n this.HandleFormattingAndOutput(result, () => {\r\n log.success(\r\n `Queried models ${log.infoText(\r\n `\"${result.query.modelIds?.join(', ')}\"`\r\n )}\\n`\r\n );\r\n\r\n log.raw(log.boldText(`Content types:`));\r\n if (!result.contentTypes) log.info(`- None returned\\n`);\r\n else printModelMigrationAnalysis(this, result.contentTypes);\r\n\r\n log.raw(log.boldText(`Components:`));\r\n if (!result.components) log.info(`- None returned\\n`);\r\n else printModelMigrationAnalysis(this, result.components);\r\n });\r\n }\r\n };\r\n\r\n PrintComponents = async () => {\r\n const { currentProject, log, messages } = this;\r\n await this.GetContentTypes();\r\n if (this.contensis) {\r\n // Retrieve components list for env\r\n const { components } = this;\r\n\r\n if (Array.isArray(components)) {\r\n log.success(messages.components.list(currentProject));\r\n\r\n this.HandleFormattingAndOutput(components, () => {\r\n // print the components to console\r\n for (const component of components) {\r\n const fieldsLength = component.fields?.length || 0;\r\n console.log(\r\n ` - ${component.id} [${fieldsLength} field${\r\n fieldsLength !== 1 ? 's' : ''\r\n }]`\r\n );\r\n }\r\n });\r\n }\r\n }\r\n };\r\n\r\n PrintComponent = async (componentId: string) => {\r\n const { currentProject, log, messages } = this;\r\n await this.GetContentTypes();\r\n if (this.contensis) {\r\n // Retrieve content types list for env\r\n const { components } = this;\r\n\r\n if (Array.isArray(components)) {\r\n const component = components.find(\r\n c => c.id.toLowerCase() === componentId.toLowerCase()\r\n );\r\n if (component) {\r\n log.success(messages.components.get(currentProject, component.id));\r\n // print the component to console\r\n this.HandleFormattingAndOutput(component, log.object);\r\n } else {\r\n log.error(messages.components.failedGet(currentProject, componentId));\r\n }\r\n }\r\n }\r\n };\r\n\r\n RemoveComponents = async (componentIds: string[], commit = false) => {\r\n const { currentProject, log, messages } = this;\r\n const contensis = await this.ConnectContensisImport({\r\n commit,\r\n importDataType: 'user-input',\r\n });\r\n if (contensis) {\r\n const [err, result] = await contensis.DeleteContentTypes(\r\n undefined,\r\n componentIds\r\n );\r\n\r\n if (err) {\r\n log.error(\r\n messages.components.failedRemove(\r\n currentProject,\r\n componentIds.join('\", \"')\r\n ),\r\n err\r\n );\r\n } else {\r\n log.success(\r\n messages.components.removed(\r\n currentProject,\r\n componentIds.join('\", \"'),\r\n !contensis.isPreview\r\n )\r\n );\r\n // print the results to console\r\n this.HandleFormattingAndOutput(result, () =>\r\n log.info(jsonFormatter(result))\r\n );\r\n }\r\n }\r\n };\r\n\r\n ImportComponents = async (\r\n {\r\n commit,\r\n fromFile,\r\n }: {\r\n commit: boolean;\r\n fromFile: string;\r\n },\r\n componentIds: string[] = []\r\n ) => {\r\n const { currentProject, log, messages } = this;\r\n\r\n let fileData = fromFile ? readJsonFile<Component[]>(fromFile) || [] : [];\r\n if (typeof fileData === 'string')\r\n throw new Error(`Import file format must be of type JSON`);\r\n\r\n if (!Array.isArray(fileData)) fileData = [fileData];\r\n\r\n const contensis = await this.ConnectContensisImport({\r\n commit,\r\n importDataType: fromFile ? 'user-input' : undefined,\r\n });\r\n\r\n if (contensis) {\r\n // Pass each component to the target repo\r\n for (const component of fileData) {\r\n // Fix invalid data\r\n component.projectId = currentProject;\r\n delete component.uuid;\r\n\r\n const [err, created, createStatus] = await contensis.models.targetRepos[\r\n currentProject\r\n ].repo.UpsertComponent(false, component);\r\n\r\n if (err) log.error(err.message, err);\r\n if (createStatus) {\r\n log.success(\r\n messages.components.created(\r\n currentProject,\r\n component.id,\r\n createStatus\r\n )\r\n );\r\n // print the component to console\r\n this.HandleFormattingAndOutput(component, () => {});\r\n }\r\n }\r\n }\r\n };\r\n\r\n RemoveEntries = async (commit = false) => {\r\n const { currentEnv, log, messages } = this;\r\n const contensis = await this.ConnectContensisImport({\r\n commit,\r\n importDataType: 'user-input',\r\n });\r\n\r\n if (contensis) {\r\n if (contensis.isPreview) {\r\n console.log(log.successText(` -- PREVIEW -- `));\r\n } else {\r\n console.log(log.warningText(` *** COMMITTING DELETE *** `));\r\n }\r\n const [err, result] = await contensis.DeleteEntries();\r\n if (result)\r\n this.HandleFormattingAndOutput(result, () => {\r\n // print the migrateResult to console\r\n printMigrateResult(this, result, { action: 'delete' });\r\n });\r\n if (\r\n !err &&\r\n ((!commit &&\r\n Object.values(result.entriesToMigrate)?.[0].totalCount > 0) ||\r\n (commit && result.migrateResult?.deleted))\r\n ) {\r\n log.success(messages.entries.removed(currentEnv, commit));\r\n if (!commit) log.help(messages.entries.commitTip());\r\n } else {\r\n log.error(messages.entries.failedRemove(currentEnv), err);\r\n if (!Object.values(result.entriesToMigrate)?.[0].totalCount)\r\n log.help(messages.entries.notFound(currentEnv));\r\n }\r\n }\r\n };\r\n\r\n GetEntries = async ({\r\n withDependents = false,\r\n }: {\r\n withDependents?: boolean;\r\n }) => {\r\n const { currentProject, log, messages } = this;\r\n const contensis = await this.ConnectContensis();\r\n\r\n if (contensis) {\r\n log.line();\r\n const entries = await contensis.GetEntries({ withDependents });\r\n this.HandleFormattingAndOutput(entries, () =>\r\n // print the entries to console\r\n logEntriesTable(\r\n entries,\r\n currentProject,\r\n contensis.payload.query?.fields\r\n )\r\n );\r\n } else {\r\n log.warning(messages.models.noList(currentProject));\r\n log.help(messages.connect.tip());\r\n }\r\n };\r\n\r\n ImportEntries = async ({\r\n commit,\r\n fromFile,\r\n }: {\r\n commit: boolean;\r\n fromFile: string;\r\n }) => {\r\n const { currentProject, log, messages } = this;\r\n\r\n const contensis = await this.ConnectContensisImport({\r\n commit,\r\n fromFile,\r\n importDataType: 'entries',\r\n });\r\n\r\n if (contensis) {\r\n log.line();\r\n if (contensis.isPreview) {\r\n console.log(log.successText(` -- IMPORT PREVIEW -- `));\r\n } else {\r\n console.log(log.warningText(` *** COMMITTING IMPORT *** `));\r\n }\r\n\r\n const [migrateErr, migrateResult] = await contensis.MigrateEntries();\r\n\r\n if (migrateErr) logError(migrateErr);\r\n else\r\n this.HandleFormattingAndOutput(migrateResult, () => {\r\n // print the migrateResult to console\r\n printMigrateResult(this, migrateResult);\r\n });\r\n } else {\r\n log.warning(messages.models.noList(currentProject));\r\n log.help(messages.connect.tip());\r\n }\r\n };\r\n\r\n PrintWebhookSubscriptions = async (\r\n subscriptionIds?: string[],\r\n name?: string\r\n ) => {\r\n const { currentEnv, log, messages } = this;\r\n const contensis = await this.ConnectContensis();\r\n if (contensis) {\r\n // Retrieve webhooks list for env\r\n const [webhooksErr, webhooks] =\r\n await contensis.subscriptions.webhooks.GetSubscriptions();\r\n\r\n const filteredResults =\r\n typeof name === 'string'\r\n ? webhooks?.filter(w =>\r\n w.name?.toLowerCase().includes(name.toLowerCase())\r\n )\r\n : Array.isArray(subscriptionIds)\r\n ? webhooks?.filter(w => subscriptionIds?.some(id => id === w.id))\r\n : webhooks;\r\n\r\n if (Array.isArray(filteredResults)) {\r\n this.HandleFormattingAndOutput(filteredResults, () => {\r\n // print the keys to console\r\n log.success(messages.webhooks.list(currentEnv));\r\n for (const {\r\n id,\r\n description,\r\n method,\r\n name,\r\n version,\r\n url,\r\n } of filteredResults) {\r\n console.log(\r\n ` - ${name}${\r\n description ? ` (${description})` : ''\r\n } [${version.modified.toString().substring(0, 10)} ${\r\n version.modifiedBy\r\n }]`\r\n );\r\n console.log(` ${id}`);\r\n console.log(` [${method}] ${url}`);\r\n }\r\n console.log('');\r\n });\r\n }\r\n\r\n if (webhooksErr) {\r\n log.error(messages.webhooks.noList(currentEnv));\r\n log.error(jsonFormatter(webhooksErr));\r\n }\r\n }\r\n };\r\n\r\n PrintBlocks = async () => {\r\n const { currentEnv, env, log, messages } = this;\r\n const contensis = await this.ConnectContensis();\r\n if (contensis) {\r\n // Retrieve blocks list for env\r\n const [err, blocks] = await contensis.blocks.GetBlocks();\r\n\r\n if (Array.isArray(blocks)) {\r\n this.HandleFormattingAndOutput(blocks, () => {\r\n // print the blocks to console\r\n log.success(messages.blocks.list(currentEnv, env.currentProject));\r\n for (const {\r\n id,\r\n description,\r\n branches,\r\n liveVersion,\r\n madeLive,\r\n versionsSinceLive,\r\n } of blocks) {\r\n console.log(\r\n ` - ${id}${description ? ` (${description})` : ''}${\r\n madeLive\r\n ? ` [${madeLive.toString().substring(0, 10)} v${liveVersion}]`\r\n : ''\r\n }${\r\n versionsSinceLive\r\n ? log.warningText(` +${versionsSinceLive}`)\r\n : ''\r\n }`\r\n );\r\n for (const branch of branches)\r\n console.log(\r\n log.infoText(` [${branch.id}]: ${branch.status}`)\r\n );\r\n }\r\n });\r\n }\r\n\r\n if (err) {\r\n log.error(messages.blocks.noList(currentEnv));\r\n log.error(jsonFormatter(err));\r\n }\r\n }\r\n };\r\n\r\n PrintBlockVersions = async (\r\n blockId: string,\r\n branch: string,\r\n version: string\r\n ) => {\r\n const { currentEnv, env, log, messages } = this;\r\n const contensis = await this.ConnectContensis();\r\n if (contensis) {\r\n // Retrieve block version\r\n const [err, blocks] = await contensis.blocks.GetBlockVersions(\r\n blockId,\r\n branch,\r\n version\r\n );\r\n\r\n if (blocks) {\r\n this.HandleFormattingAndOutput(blocks, () => {\r\n // print the version detail to console\r\n log.success(\r\n messages.blocks.get(blockId, currentEnv, env.currentProject)\r\n );\r\n for (const block of blocks)\r\n printBlockVersion(\r\n this,\r\n block,\r\n !version\r\n ? {\r\n showImage: false,\r\n showSource: true,\r\n showStaticPaths: false,\r\n showStatus: false,\r\n }\r\n : undefined\r\n );\r\n });\r\n }\r\n\r\n if (err) {\r\n log.error(messages.blocks.noList(currentEnv, env.currentProject));\r\n log.error(jsonFormatter(err));\r\n }\r\n }\r\n };\r\n\r\n PushBlock = async (block: PushBlockParams) => {\r\n const { currentEnv, env, log, messages } = this;\r\n\r\n // Output request to console\r\n log.info(\r\n messages.blocks.tryPush(\r\n block.id,\r\n block.source.branch,\r\n currentEnv,\r\n env.currentProject\r\n )\r\n );\r\n console.log(jsonFormatter(block));\r\n\r\n const contensis = await this.ConnectContensis();\r\n if (contensis) {\r\n // Push new block version\r\n const [err, blockVersion] = await contensis.blocks.PushBlockVersion(\r\n block\r\n );\r\n if (!err) {\r\n log.success(\r\n messages.blocks.pushed(\r\n block.id,\r\n block.source.branch,\r\n currentEnv,\r\n env.currentProject\r\n )\r\n );\r\n }\r\n if (blockVersion) {\r\n this.HandleFormattingAndOutput(blockVersion, () => {\r\n // print the version detail to console\r\n printBlockVersion(this, blockVersion);\r\n });\r\n }\r\n if (err)\r\n throw new Error(\r\n messages.blocks.failedPush(block.id, currentEnv, env.currentProject)\r\n );\r\n }\r\n };\r\n\r\n ReleaseBlock = async (blockId: string, version: string) => {\r\n const { currentEnv, env, log, messages } = this;\r\n const contensis = await this.ConnectContensis();\r\n if (contensis) {\r\n // Retrieve block version\r\n const [err, blockVersion] = await contensis.blocks.BlockAction(\r\n blockId,\r\n 'release',\r\n version\r\n );\r\n\r\n if (blockVersion) {\r\n this.HandleFormattingAndOutput(blockVersion, () => {\r\n // print the version detail to console\r\n log.success(\r\n messages.blocks.released(blockId, currentEnv, env.currentProject)\r\n );\r\n printBlockVersion(this, blockVersion);\r\n });\r\n }\r\n\r\n if (err) {\r\n log.error(\r\n messages.blocks.failedRelease(blockId, currentEnv, env.currentProject)\r\n );\r\n log.error(jsonFormatter(err));\r\n }\r\n }\r\n };\r\n\r\n PrintBlockLogs = async (\r\n blockId: string,\r\n branch: string,\r\n version: string,\r\n dataCenter: 'hq' | 'manchester' | 'london'\r\n ) => {\r\n const { currentEnv, env, log, messages } = this;\r\n const contensis = await this.ConnectContensis();\r\n if (contensis) {\r\n // Retrieve block logs\r\n log.success(\r\n messages.blocks.getLogs(blockId, branch, currentEnv, env.currentProject)\r\n );\r\n\r\n const [err, blockLogs] = await contensis.blocks.GetBlockLogs({\r\n blockId,\r\n branchId: branch,\r\n version,\r\n dataCenter,\r\n });\r\n\r\n if (blockLogs) {\r\n this.HandleFormattingAndOutput(blockLogs, () => {\r\n // print the logs to console\r\n console.log(\r\n ` - ${blockId} ${branch} ${\r\n Number(version) ? `v${version}` : version\r\n } [${dataCenter}]`\r\n );\r\n log.line();\r\n console.log(log.infoText(blockLogs));\r\n log.line();\r\n });\r\n }\r\n\r\n if (err) {\r\n log.error(\r\n messages.blocks.failedGetLogs(blockId, currentEnv, env.currentProject)\r\n );\r\n log.error(jsonFormatter(err));\r\n }\r\n }\r\n };\r\n\r\n HandleFormattingAndOutput = <T>(obj: T, logFn: (obj: T) => void) => {\r\n const { format, log, messages, output } = this;\r\n if (!format) {\r\n // print the object to console\r\n logFn(obj);\r\n } else if (format === 'csv') {\r\n log.raw('');\r\n log.raw(log.infoText(csvFormatter(obj)));\r\n } else if (format === 'xml') {\r\n log.raw('');\r\n log.raw(log.infoText(xmlFormatter(obj)));\r\n } else if (format === 'json') {\r\n log.raw('');\r\n log.raw(log.infoText(jsonFormatter(obj)));\r\n }\r\n log.raw('');\r\n\r\n if (output) {\r\n let writeString = '';\r\n if (format === 'csv') {\r\n writeString = csvFormatter(obj as any);\r\n } else if (format === 'xml') {\r\n writeString = xmlFormatter(obj as any);\r\n } else writeString = jsonFormatter(obj);\r\n // write output to file\r\n if (writeString) {\r\n fs.writeFileSync(output, writeString);\r\n log.success(messages.app.fileOutput(format, output));\r\n } else {\r\n log.info(messages.app.noFileOutput());\r\n }\r\n }\r\n };\r\n}\r\n\r\nexport const cliCommand = (\r\n commandArgs: string[],\r\n outputOpts: OutputOptions & IConnectOptions = {},\r\n contensisOpts: Partial<MigrateRequest> = {}\r\n) => {\r\n return new ContensisCli(['', '', ...commandArgs], outputOpts, contensisOpts);\r\n};\r\nexport default ContensisCli;\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["SessionCacheProvider", "path", "to", "fetch", "CredentialProvider", "inquirer", "ContensisAuthService", "chalk", "components", "contentTypes", "name", "url", "fs"]
|
|
7
|
+
}
|
package/dist/shell.js
ADDED
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
|
+
mod
|
|
23
|
+
));
|
|
24
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
25
|
+
var shell_exports = {};
|
|
26
|
+
__export(shell_exports, {
|
|
27
|
+
shell: () => shell
|
|
28
|
+
});
|
|
29
|
+
module.exports = __toCommonJS(shell_exports);
|
|
30
|
+
var import_figlet = __toESM(require("figlet"));
|
|
31
|
+
var import_inquirer = __toESM(require("inquirer"));
|
|
32
|
+
var import_inquirer_command_prompt = __toESM(require("inquirer-command-prompt"));
|
|
33
|
+
var import_commands = __toESM(require("./commands"));
|
|
34
|
+
var import_en_GB = require("./localisation/en-GB");
|
|
35
|
+
var import_CredentialProvider = __toESM(require("./providers/CredentialProvider"));
|
|
36
|
+
var import_file_provider = require("./providers/file-provider");
|
|
37
|
+
var import_ContensisCliService = __toESM(require("./services/ContensisCliService"));
|
|
38
|
+
var import_util = require("./util");
|
|
39
|
+
var import_logger = require("./util/logger");
|
|
40
|
+
var import_version = require("./version");
|
|
41
|
+
class ContensisShell {
|
|
42
|
+
currentEnvironment;
|
|
43
|
+
emptyInputCounter = 0;
|
|
44
|
+
env;
|
|
45
|
+
firstStart = true;
|
|
46
|
+
userId = "";
|
|
47
|
+
log = import_logger.Logger;
|
|
48
|
+
messages = import_en_GB.LogMessages;
|
|
49
|
+
refreshEnvironment = () => {
|
|
50
|
+
const {
|
|
51
|
+
cache: { currentEnvironment = "", environments = {} }
|
|
52
|
+
} = new import_ContensisCliService.default([]);
|
|
53
|
+
this.currentEnvironment = currentEnvironment;
|
|
54
|
+
this.env = environments[currentEnvironment];
|
|
55
|
+
(0, import_util.Logging)("en-GB").then(({ messages, Log }) => {
|
|
56
|
+
this.log = Log;
|
|
57
|
+
this.messages = messages;
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
constructor() {
|
|
61
|
+
this.refreshEnvironment();
|
|
62
|
+
import_inquirer_command_prompt.default.setConfig({
|
|
63
|
+
history: {
|
|
64
|
+
save: true,
|
|
65
|
+
folder: import_file_provider.appRootDir,
|
|
66
|
+
limit: 100,
|
|
67
|
+
blacklist: ["quit"]
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
const { log, messages } = this;
|
|
71
|
+
import_figlet.default.text(
|
|
72
|
+
messages.app.contensis(),
|
|
73
|
+
{
|
|
74
|
+
font: "Block",
|
|
75
|
+
horizontalLayout: "default",
|
|
76
|
+
verticalLayout: "default",
|
|
77
|
+
width: process.stdout.columns,
|
|
78
|
+
whitespaceBreak: true
|
|
79
|
+
},
|
|
80
|
+
(err, data) => {
|
|
81
|
+
if (err) {
|
|
82
|
+
log.error(messages.app.unknownError());
|
|
83
|
+
console.dir(err);
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
console.log(log.successText(data));
|
|
87
|
+
console.log(log.infoText(messages.app.startup(import_version.LIB_VERSION)));
|
|
88
|
+
console.log(log.helpText(messages.app.help()));
|
|
89
|
+
this.start().catch((ex) => log.error(ex));
|
|
90
|
+
}
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
restart = async () => {
|
|
94
|
+
this.firstStart = false;
|
|
95
|
+
this.log.line();
|
|
96
|
+
await this.start();
|
|
97
|
+
};
|
|
98
|
+
start = async () => {
|
|
99
|
+
this.refreshEnvironment();
|
|
100
|
+
this.userId = "";
|
|
101
|
+
const { currentEnvironment, env, log, messages } = this;
|
|
102
|
+
if (env == null ? void 0 : env.lastUserId) {
|
|
103
|
+
const [credsErr, credentials] = await new import_CredentialProvider.default(
|
|
104
|
+
{
|
|
105
|
+
userId: env.lastUserId,
|
|
106
|
+
alias: currentEnvironment
|
|
107
|
+
},
|
|
108
|
+
env.passwordFallback
|
|
109
|
+
).Init();
|
|
110
|
+
if (credsErr && !credentials.current) {
|
|
111
|
+
log.error(credsErr.message);
|
|
112
|
+
}
|
|
113
|
+
if (credentials.current) {
|
|
114
|
+
if (this.firstStart) {
|
|
115
|
+
const token = await (0, import_ContensisCliService.cliCommand)(["login", env.lastUserId]).Login(
|
|
116
|
+
env.lastUserId,
|
|
117
|
+
{
|
|
118
|
+
promptPassword: false,
|
|
119
|
+
silent: true
|
|
120
|
+
}
|
|
121
|
+
);
|
|
122
|
+
if (token) {
|
|
123
|
+
this.userId = env.lastUserId;
|
|
124
|
+
if (!env.currentProject)
|
|
125
|
+
log.warning(messages.projects.tip());
|
|
126
|
+
}
|
|
127
|
+
this.firstStart = false;
|
|
128
|
+
this.refreshEnvironment();
|
|
129
|
+
} else {
|
|
130
|
+
this.userId = env.lastUserId;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
await this.contensisPrompt();
|
|
135
|
+
};
|
|
136
|
+
contensisPrompt = async () => {
|
|
137
|
+
const { currentEnvironment, env, log, messages, userId } = this;
|
|
138
|
+
const availableCommands = [
|
|
139
|
+
{
|
|
140
|
+
filter: (str) => {
|
|
141
|
+
return str.replace(/ \[.*$/, "");
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
"connect",
|
|
145
|
+
"list envs",
|
|
146
|
+
"quit"
|
|
147
|
+
];
|
|
148
|
+
if (currentEnvironment)
|
|
149
|
+
availableCommands.push("login", "list projects", "set project");
|
|
150
|
+
if (userId)
|
|
151
|
+
availableCommands.push(
|
|
152
|
+
"create project",
|
|
153
|
+
"diff models",
|
|
154
|
+
"get block",
|
|
155
|
+
"get block logs",
|
|
156
|
+
"get contenttype",
|
|
157
|
+
"get component",
|
|
158
|
+
"get entries",
|
|
159
|
+
"get model",
|
|
160
|
+
"get project",
|
|
161
|
+
"get version",
|
|
162
|
+
"import contenttypes",
|
|
163
|
+
"import components",
|
|
164
|
+
"import entries",
|
|
165
|
+
"import models",
|
|
166
|
+
"list blocks",
|
|
167
|
+
"list contenttypes",
|
|
168
|
+
"list components",
|
|
169
|
+
"list models",
|
|
170
|
+
"list keys",
|
|
171
|
+
"list webhooks",
|
|
172
|
+
"create key",
|
|
173
|
+
"push block",
|
|
174
|
+
"release block",
|
|
175
|
+
"remove key",
|
|
176
|
+
"remove entries",
|
|
177
|
+
"remove contenttypes",
|
|
178
|
+
"remove components",
|
|
179
|
+
"set project name",
|
|
180
|
+
"set project description"
|
|
181
|
+
);
|
|
182
|
+
const prompt = import_inquirer.default.createPromptModule();
|
|
183
|
+
prompt.registerPrompt("command", import_inquirer_command_prompt.default);
|
|
184
|
+
return prompt([
|
|
185
|
+
{
|
|
186
|
+
type: "command",
|
|
187
|
+
name: "cmd",
|
|
188
|
+
autoCompletion: availableCommands,
|
|
189
|
+
autocompletePrompt: log.infoText(messages.app.autocomplete()),
|
|
190
|
+
message: `${userId ? `${userId}@` : ""}${currentEnvironment || ""}>`,
|
|
191
|
+
context: 0,
|
|
192
|
+
validate: (val) => {
|
|
193
|
+
if (!val)
|
|
194
|
+
this.emptyInputCounter++;
|
|
195
|
+
if (this.emptyInputCounter > 1)
|
|
196
|
+
console.log(this.log.infoText(this.messages.app.suggestions()));
|
|
197
|
+
if (val) {
|
|
198
|
+
this.emptyInputCounter = 0;
|
|
199
|
+
return true;
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
prefix: `${(env == null ? void 0 : env.currentProject) || log.infoText("contensis")}`,
|
|
203
|
+
short: true
|
|
204
|
+
}
|
|
205
|
+
]).then(async (answers) => {
|
|
206
|
+
var _a;
|
|
207
|
+
if (answers.cmd === "quit") {
|
|
208
|
+
this.quit();
|
|
209
|
+
} else {
|
|
210
|
+
try {
|
|
211
|
+
if (answers.cmd) {
|
|
212
|
+
const program = (0, import_commands.default)();
|
|
213
|
+
await program.parseAsync(
|
|
214
|
+
(_a = answers.cmd.match(/"[^"]+"|[^\s]+/g)) == null ? void 0 : _a.map((e) => e.replace(/"(.+)"/, "$1")),
|
|
215
|
+
{
|
|
216
|
+
from: "user"
|
|
217
|
+
}
|
|
218
|
+
);
|
|
219
|
+
}
|
|
220
|
+
} catch (ex) {
|
|
221
|
+
const str = ex.toString();
|
|
222
|
+
if (!str.includes("CommanderError"))
|
|
223
|
+
(0, import_logger.logError)(ex, `Shell ${ex.toString()}`);
|
|
224
|
+
} finally {
|
|
225
|
+
return this.contensisPrompt();
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}).catch((err) => {
|
|
229
|
+
log.error(err.message);
|
|
230
|
+
this.quit();
|
|
231
|
+
});
|
|
232
|
+
};
|
|
233
|
+
quit = (error) => {
|
|
234
|
+
const { log, messages } = this;
|
|
235
|
+
process.removeAllListeners("exit");
|
|
236
|
+
if (error) {
|
|
237
|
+
log.error(error.message);
|
|
238
|
+
process.exit(1);
|
|
239
|
+
} else {
|
|
240
|
+
log.success(messages.app.quit());
|
|
241
|
+
process.exitCode = 0;
|
|
242
|
+
process.exit(0);
|
|
243
|
+
}
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
let globalShell;
|
|
247
|
+
const shell = () => {
|
|
248
|
+
var _a;
|
|
249
|
+
if (typeof ((_a = process.argv) == null ? void 0 : _a[2]) !== "undefined")
|
|
250
|
+
return { restart() {
|
|
251
|
+
} };
|
|
252
|
+
if (!globalShell)
|
|
253
|
+
globalShell = new ContensisShell();
|
|
254
|
+
return globalShell;
|
|
255
|
+
};
|
|
256
|
+
process.on("uncaughtException", function(err) {
|
|
257
|
+
console.log(err);
|
|
258
|
+
});
|
|
259
|
+
process.on("SIGINT", () => {
|
|
260
|
+
console.log("catching SIGINT");
|
|
261
|
+
shell().quit();
|
|
262
|
+
});
|
|
263
|
+
process.on("SIGTERM", () => {
|
|
264
|
+
console.log("catching SIGTERM");
|
|
265
|
+
shell().quit();
|
|
266
|
+
});
|
|
267
|
+
process.stdin.on("data", (key) => {
|
|
268
|
+
if (key == "") {
|
|
269
|
+
console.log("");
|
|
270
|
+
import_logger.Logger.info(`[CTRL]+[C] detected, exiting shell...`);
|
|
271
|
+
shell().quit();
|
|
272
|
+
}
|
|
273
|
+
});
|
|
274
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
275
|
+
0 && (module.exports = {
|
|
276
|
+
shell
|
|
277
|
+
});
|
|
278
|
+
//# sourceMappingURL=shell.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/shell.ts"],
|
|
4
|
+
"sourcesContent": ["import figlet from 'figlet';\r\nimport inquirer from 'inquirer';\r\nimport inquirerPrompt from 'inquirer-command-prompt';\r\nimport commands from './commands';\r\nimport { LogMessages } from './localisation/en-GB';\r\nimport CredentialProvider from './providers/CredentialProvider';\r\nimport { appRootDir } from './providers/file-provider';\r\nimport ContensisCli, { cliCommand } from './services/ContensisCliService';\r\nimport { Logging } from './util';\r\nimport { logError, Logger } from './util/logger';\r\nimport { LIB_VERSION } from './version';\r\n\r\nclass ContensisShell {\r\n private currentEnvironment!: string;\r\n private emptyInputCounter: number = 0;\r\n private env!: EnvironmentCache;\r\n private firstStart = true;\r\n private userId: string = '';\r\n private log = Logger;\r\n private messages = LogMessages;\r\n\r\n private refreshEnvironment = () => {\r\n // Reload any persisted changes from the disk cache\r\n const {\r\n cache: { currentEnvironment = '', environments = {} },\r\n } = new ContensisCli([]);\r\n // console.log(`refreshing env w/${currentEnvironment}`);\r\n this.currentEnvironment = currentEnvironment;\r\n this.env = environments[currentEnvironment];\r\n\r\n // Reload logging here to support changing language\r\n Logging('en-GB').then(({ messages, Log }) => {\r\n this.log = Log;\r\n this.messages = messages;\r\n });\r\n };\r\n\r\n constructor() {\r\n this.refreshEnvironment();\r\n inquirerPrompt.setConfig({\r\n history: {\r\n save: true,\r\n folder: appRootDir,\r\n limit: 100,\r\n blacklist: ['quit'],\r\n },\r\n });\r\n\r\n const { log, messages } = this;\r\n\r\n figlet.text(\r\n messages.app.contensis(),\r\n {\r\n font: 'Block',\r\n horizontalLayout: 'default',\r\n verticalLayout: 'default',\r\n width: process.stdout.columns,\r\n whitespaceBreak: true,\r\n },\r\n (err, data) => {\r\n if (err) {\r\n log.error(messages.app.unknownError());\r\n console.dir(err);\r\n return;\r\n }\r\n console.log(log.successText(data));\r\n console.log(log.infoText(messages.app.startup(LIB_VERSION)));\r\n console.log(log.helpText(messages.app.help()));\r\n\r\n this.start().catch(ex => log.error(ex));\r\n }\r\n );\r\n }\r\n\r\n restart = async () => {\r\n this.firstStart = false;\r\n this.log.line(); // add a line so we can see where the shell has been restarted\r\n await this.start();\r\n };\r\n\r\n start = async () => {\r\n this.refreshEnvironment();\r\n this.userId = '';\r\n const { currentEnvironment, env, log, messages } = this;\r\n\r\n if (env?.lastUserId) {\r\n const [credsErr, credentials] = await new CredentialProvider(\r\n {\r\n userId: env.lastUserId,\r\n alias: currentEnvironment,\r\n },\r\n env.passwordFallback\r\n ).Init();\r\n if (credsErr && !credentials.current) {\r\n log.error(credsErr.message);\r\n }\r\n if (credentials.current) {\r\n if (this.firstStart) {\r\n const token = await cliCommand(['login', env.lastUserId]).Login(\r\n env.lastUserId,\r\n {\r\n promptPassword: false,\r\n silent: true,\r\n }\r\n );\r\n if (token) {\r\n this.userId = env.lastUserId;\r\n if (!env.currentProject) log.warning(messages.projects.tip());\r\n }\r\n this.firstStart = false;\r\n this.refreshEnvironment();\r\n } else {\r\n this.userId = env.lastUserId;\r\n }\r\n }\r\n }\r\n await this.contensisPrompt();\r\n };\r\n\r\n contensisPrompt = async (): Promise<any> => {\r\n const { currentEnvironment, env, log, messages, userId } = this;\r\n\r\n const availableCommands = [\r\n {\r\n filter: (str: string) => {\r\n return str.replace(/ \\[.*$/, '');\r\n },\r\n },\r\n 'connect',\r\n 'list envs',\r\n 'quit',\r\n ];\r\n\r\n if (currentEnvironment)\r\n availableCommands.push('login', 'list projects', 'set project');\r\n if (userId)\r\n availableCommands.push(\r\n 'create project',\r\n 'diff models',\r\n 'get block',\r\n 'get block logs',\r\n 'get contenttype',\r\n 'get component',\r\n 'get entries',\r\n 'get model',\r\n 'get project',\r\n 'get version',\r\n 'import contenttypes',\r\n 'import components',\r\n 'import entries',\r\n 'import models',\r\n 'list blocks',\r\n 'list contenttypes',\r\n 'list components',\r\n 'list models',\r\n 'list keys',\r\n 'list webhooks',\r\n 'create key',\r\n 'push block',\r\n 'release block',\r\n 'remove key',\r\n 'remove entries',\r\n 'remove contenttypes',\r\n 'remove components',\r\n 'set project name',\r\n 'set project description'\r\n );\r\n\r\n const prompt = inquirer.createPromptModule();\r\n prompt.registerPrompt('command', inquirerPrompt);\r\n return prompt([\r\n {\r\n type: 'command',\r\n name: 'cmd',\r\n autoCompletion: availableCommands,\r\n autocompletePrompt: log.infoText(messages.app.autocomplete()),\r\n message: `${userId ? `${userId}@` : ''}${currentEnvironment || ''}>`,\r\n context: 0,\r\n validate: (val: string) => {\r\n if (!val) this.emptyInputCounter++;\r\n if (this.emptyInputCounter > 1)\r\n console.log(this.log.infoText(this.messages.app.suggestions()));\r\n if (val) {\r\n this.emptyInputCounter = 0;\r\n return true;\r\n }\r\n },\r\n prefix: `${env?.currentProject || log.infoText('contensis')}`,\r\n short: true,\r\n },\r\n ])\r\n .then(async (answers: { cmd: string }) => {\r\n if (answers.cmd === 'quit') {\r\n this.quit();\r\n } else {\r\n try {\r\n if (answers.cmd) {\r\n const program = commands();\r\n await program.parseAsync(\r\n answers.cmd\r\n .match(/\"[^\"]+\"|[^\\s]+/g)\r\n ?.map(e => e.replace(/\"(.+)\"/, '$1')),\r\n {\r\n from: 'user',\r\n }\r\n );\r\n }\r\n } catch (ex: any) {\r\n const str = ex.toString();\r\n if (!str.includes('CommanderError'))\r\n logError(ex, `Shell ${ex.toString()}`);\r\n } finally {\r\n return this.contensisPrompt();\r\n }\r\n }\r\n })\r\n .catch((err: Error) => {\r\n log.error(err.message);\r\n this.quit();\r\n });\r\n };\r\n\r\n quit = (error?: Error) => {\r\n const { log, messages } = this;\r\n process.removeAllListeners('exit');\r\n\r\n if (error) {\r\n log.error(error.message);\r\n process.exit(1);\r\n } else {\r\n log.success(messages.app.quit());\r\n process.exitCode = 0;\r\n process.exit(0);\r\n }\r\n };\r\n}\r\n\r\nlet globalShell: ContensisShell;\r\n\r\nexport const shell = () => {\r\n // Return a benign function for shell().restart() when used in cli context\r\n // as some commands need to restart the shell to show an updated prompt\r\n // after successful connect / login / set project\r\n if (typeof process.argv?.[2] !== 'undefined') return { restart() {} } as any;\r\n if (!globalShell) globalShell = new ContensisShell();\r\n return globalShell;\r\n};\r\n\r\nprocess.on('uncaughtException', function (err) {\r\n // Handle the error safely\r\n console.log(err);\r\n});\r\n\r\nprocess.on('SIGINT', () => {\r\n console.log('catching SIGINT');\r\n shell().quit();\r\n});\r\n\r\nprocess.on('SIGTERM', () => {\r\n console.log('catching SIGTERM');\r\n shell().quit();\r\n});\r\n\r\nprocess.stdin.on('data', key => {\r\n if ((key as any) == '\\u0003') {\r\n console.log('');\r\n Logger.info(`[CTRL]+[C] detected, exiting shell...`);\r\n shell().quit();\r\n }\r\n});\r\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["ContensisCli", "inquirerPrompt", "figlet", "CredentialProvider", "inquirer", "commands"]
|
|
7
|
+
}
|