contensis-cli 1.0.0-beta.53 → 1.0.0-beta.54

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/.vscode/launch.json +15 -15
  2. package/README.md +1226 -1226
  3. package/dist/commands/connect.js.map +1 -1
  4. package/dist/commands/create.js.map +1 -1
  5. package/dist/commands/diff.js.map +1 -1
  6. package/dist/commands/get.js.map +1 -1
  7. package/dist/commands/globalOptions.js.map +1 -1
  8. package/dist/commands/import.js.map +1 -1
  9. package/dist/commands/index.js.map +1 -1
  10. package/dist/commands/list.js.map +1 -1
  11. package/dist/commands/login.js.map +1 -1
  12. package/dist/commands/push.js.map +1 -1
  13. package/dist/commands/release.js.map +1 -1
  14. package/dist/commands/remove.js.map +1 -1
  15. package/dist/commands/set.js.map +1 -1
  16. package/dist/index.js.map +1 -1
  17. package/dist/localisation/en-GB.js.map +1 -1
  18. package/dist/providers/CredentialProvider.js.map +1 -1
  19. package/dist/providers/SessionCacheProvider.js.map +1 -1
  20. package/dist/providers/file-provider.js.map +1 -1
  21. package/dist/services/ContensisAuthService.js.map +1 -1
  22. package/dist/services/ContensisCliService.js.map +1 -1
  23. package/dist/shell.js.map +1 -1
  24. package/dist/util/console.printer.js +5 -5
  25. package/dist/util/console.printer.js.map +2 -2
  26. package/dist/util/csv.formatter.js.map +1 -1
  27. package/dist/util/index.js.map +1 -1
  28. package/dist/util/json.formatter.js.map +1 -1
  29. package/dist/util/logger.js.map +1 -1
  30. package/dist/util/xml.formatter.js.map +1 -1
  31. package/dist/version.js +1 -1
  32. package/dist/version.js.map +1 -1
  33. package/esbuild.config.js +49 -49
  34. package/headless-setup.sh +6 -6
  35. package/package.json +59 -59
  36. package/src/commands/connect.ts +24 -24
  37. package/src/commands/create.ts +70 -70
  38. package/src/commands/diff.ts +41 -41
  39. package/src/commands/get.ts +214 -214
  40. package/src/commands/globalOptions.ts +127 -127
  41. package/src/commands/import.ts +128 -128
  42. package/src/commands/index.ts +80 -80
  43. package/src/commands/list.ts +116 -116
  44. package/src/commands/login.ts +34 -34
  45. package/src/commands/push.ts +127 -127
  46. package/src/commands/release.ts +32 -32
  47. package/src/commands/remove.ts +85 -85
  48. package/src/commands/set.ts +96 -96
  49. package/src/index.ts +19 -19
  50. package/src/localisation/en-GB.ts +289 -289
  51. package/src/models/AppError.d.ts +40 -40
  52. package/src/models/Cache.d.ts +25 -25
  53. package/src/models/JsModules.d.ts +1 -1
  54. package/src/providers/CredentialProvider.ts +121 -121
  55. package/src/providers/SessionCacheProvider.ts +101 -101
  56. package/src/providers/file-provider.ts +76 -76
  57. package/src/services/ContensisAuthService.ts +70 -70
  58. package/src/services/ContensisCliService.ts +1745 -1745
  59. package/src/shell.ts +270 -270
  60. package/src/util/console.printer.ts +371 -371
  61. package/src/util/csv.formatter.ts +21 -21
  62. package/src/util/index.ts +73 -73
  63. package/src/util/json.formatter.ts +1 -1
  64. package/src/util/logger.ts +234 -234
  65. package/src/util/xml.formatter.ts +20 -20
  66. package/src/version.ts +1 -1
  67. package/tsconfig.json +22 -22
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
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"],
4
+ "sourcesContent": ["import fs from 'fs';\nimport path from 'path';\nimport fetch from 'node-fetch';\nimport inquirer from 'inquirer';\nimport to from 'await-to-js';\nimport chalk from 'chalk';\nimport { Component, ContentType, Project } from 'contensis-core-api';\nimport { isPassword, isSharedSecret, isUuid, url } from '~/util';\nimport SessionCacheProvider from '../providers/SessionCacheProvider';\nimport ContensisAuthService from './ContensisAuthService';\nimport CredentialProvider from '~/providers/CredentialProvider';\nimport { logError, Logger } from '~/util/logger';\nimport { LogMessages } from '~/localisation/en-GB';\nimport {\n ContensisMigrationService,\n MigrateRequest,\n PushBlockParams,\n SourceCms,\n logEntriesTable,\n ContentTypesResult,\n Model,\n MigrateModelsResult,\n} from 'migratortron';\nimport { Entry } from 'contensis-management-api/lib/models';\n\nimport { csvFormatter } from '~/util/csv.formatter';\nimport { xmlFormatter } from '~/util/xml.formatter';\nimport { jsonFormatter } from '~/util/json.formatter';\nimport {\n printBlockVersion,\n printMigrateResult,\n printModelMigrationAnalysis,\n printModelMigrationResult,\n} from '~/util/console.printer';\nimport { readJsonFile } from '~/providers/file-provider';\n\ntype OutputFormat = 'json' | 'csv' | 'xml';\n\ntype OutputOptions = {\n format?: OutputFormat;\n output?: string;\n};\n\ninterface IConnectOptions extends IAuthOptions {\n alias?: string;\n projectId?: string;\n}\n\ninterface IAuthOptions {\n user?: string;\n password?: string;\n clientId?: string;\n sharedSecret?: string;\n}\n\ninterface IImportOptions {\n sourceAlias?: string;\n sourceProjectId?: string;\n}\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 command: CliCommand;\n private format?: OutputFormat;\n private output?: string;\n private session: SessionCacheProvider;\n\n contensis?: ContensisMigrationService;\n contensisOpts: Partial<MigrateRequest>;\n currentProject: string;\n\n sourceAlias?: string;\n targetEnv?: string;\n urls:\n | {\n api: string;\n cms: string;\n liveWeb: string;\n previewWeb: string;\n iisWeb: string;\n iisPreviewWeb: string;\n }\n | undefined;\n log = Logger;\n messages = LogMessages;\n\n verb: string;\n noun: string;\n thirdArg: string;\n\n get cache() {\n return this.session.Get();\n }\n\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 get contentTypes() {\n return this.contensis?.models.contentTypes();\n }\n\n get components() {\n return this.contensis?.models.components();\n }\n get models(): Model[] | undefined {\n return this.contensis?.models.contentModels();\n }\n\n constructor(\n args: string[],\n outputOpts?: OutputOptions & IConnectOptions & IImportOptions,\n contensisOpts: Partial<MigrateRequest> = {}\n ) {\n // console.log('args: ', JSON.stringify(args, null, 2));\n\n const [exe, script, verb = '', noun = '', ...restArgs] = args;\n this.verb = verb?.toLowerCase();\n this.noun = noun?.toLowerCase();\n this.thirdArg = restArgs?.[0];\n\n const commandText = `${this.verb} ${this.noun} ${\n restArgs ? restArgs.join(' ') : ''\n }`.trim();\n\n this.session = new SessionCacheProvider();\n\n this.contensisOpts = contensisOpts;\n this.format = outputOpts?.format;\n this.output =\n outputOpts?.output && path.join(process.cwd(), outputOpts.output);\n\n const currentEnvironment = outputOpts?.alias || this.currentEnv;\n const environments = this.cache.environments || {};\n this.currentEnv = currentEnvironment;\n\n const env = this.env;\n\n if (outputOpts?.projectId) env.currentProject = outputOpts.projectId;\n if (outputOpts?.user) env.lastUserId = outputOpts.user;\n // setting this in env means passwordFallback is written to environments.json\n if (outputOpts?.password) env.passwordFallback = outputOpts.password;\n if (outputOpts?.clientId) env.lastUserId = outputOpts.clientId;\n if (outputOpts?.sharedSecret)\n env.passwordFallback = outputOpts.sharedSecret;\n\n this.currentProject = env?.currentProject || 'null';\n this.sourceAlias = outputOpts?.sourceAlias || currentEnvironment;\n\n if (currentEnvironment) {\n this.urls = url(currentEnvironment, env?.currentProject || 'website');\n }\n\n this.command = {\n commandText,\n createdDate: new Date().toISOString(),\n createdUserId: env?.lastUserId,\n };\n\n if (currentEnvironment) {\n env.history = [this.command];\n if (commandText) {\n environments[currentEnvironment] = env;\n this.session.Update({\n currentEnvironment,\n environments,\n history: [commandText],\n });\n }\n }\n }\n\n PrintEnvironments = () => {\n const { log, messages } = this;\n const { currentEnvironment, environments = {} } = this.cache;\n const envKeys = Object.keys(environments);\n log.success(messages.envs.found(envKeys.length));\n this.HandleFormattingAndOutput(envKeys, () => {\n // print the envKeys to console\n for (const env of envKeys) {\n console.log(` - ${currentEnvironment === env ? '* ' : ''}${env}`);\n }\n });\n if (envKeys.length === 0 || !currentEnvironment) {\n log.help(messages.envs.tip());\n }\n };\n\n Connect = async (environment: string) => {\n const { log, messages, session } = this;\n\n if (environment) {\n this.currentEnv = environment;\n this.urls = url(environment, 'website');\n\n const [fetchErr, response] = await to(fetch(this.urls.cms));\n if (response && response?.status < 400) {\n log.success(messages.connect.connected(environment));\n session.UpdateEnv(this.env, environment);\n\n if (this.env?.lastUserId) {\n // await this.ConnectContensis();\n await this.PrintProjects();\n } else {\n log.warning(messages.projects.noList());\n log.help(messages.connect.tip());\n }\n } else {\n // Cannot reach environment - status X\n log.error(\n messages.connect.unreachable(this.urls.cms, response?.status || 0)\n );\n }\n } else {\n // No environment alias specified\n log.error(messages.connect.noEnv());\n }\n };\n\n ConnectContensis = async ({ commit = false } = {}) => {\n 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 | 'user-input';\n }) => {\n const source: 'contensis' | 'file' = fromFile ? 'file' : 'contensis';\n\n const fileData = fromFile\n ? readJsonFile<(Entry | ContentType | Component)[]>(fromFile) || []\n : [];\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(credentialError as any);\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 = isPassword(this.env.passwordFallback),\n promptPassword = true,\n sharedSecret = isSharedSecret(this.env.passwordFallback),\n silent = false,\n attempt = 1,\n }: {\n password?: string;\n promptPassword?: boolean;\n sharedSecret?: string;\n silent?: boolean;\n attempt?: number;\n } = {}\n ): Promise<string | undefined> => {\n let inputPassword = password || sharedSecret;\n const { log, messages } = this;\n\n if (userId) {\n const { currentEnv, env } = this;\n\n if (currentEnv) {\n const credentials = await this.GetCredentials(userId, inputPassword);\n\n if (credentials) {\n const cachedPassword = isPassword(credentials.current?.password);\n const cachedSecret = isSharedSecret(credentials.current?.password);\n\n if (!cachedPassword && !cachedSecret && promptPassword) {\n // Password prompt\n ({ inputPassword } = await inquirer.prompt([\n {\n type: 'password',\n message: messages.login.passwordPrompt(currentEnv, userId),\n name: 'inputPassword',\n mask: '*',\n prefix: undefined,\n },\n ]));\n }\n\n if (inputPassword || cachedPassword || cachedSecret) {\n const authService = new ContensisAuthService({\n username: userId,\n password: inputPassword || cachedPassword,\n projectId: env?.currentProject || 'website',\n rootUrl: this.urls?.cms || '',\n clientId: userId,\n clientSecret: sharedSecret || cachedSecret,\n });\n\n const [authError, bearerToken] = await to(\n authService.BearerToken()\n );\n\n // Login successful\n if (bearerToken) {\n // Set env vars\n env.authToken = bearerToken;\n env.lastUserId = userId;\n env.passwordFallback =\n credentials.remarks.secure !== true\n ? credentials.current?.password\n : undefined;\n\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 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 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 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 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, 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 const foundProject = projects?.find(\n p => p.id.toLowerCase() === projectId.toLowerCase()\n );\n\n if (foundProject) {\n log.raw('');\n 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 HydrateContensis = async () => {\n const { log } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve content types list for env\n const [contensisErr, models] = await to(\n contensis.models.HydrateContensisRepositories()\n );\n\n if (contensisErr) {\n log.error(contensisErr.message);\n return contensisErr;\n }\n }\n };\n\n PrintApiKeys = async () => {\n const { currentEnv, log, messages } = this;\n 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 this.HandleFormattingAndOutput(apiKeys, () => {\n // print the keys to console\n for (const {\n id,\n sharedSecret,\n name,\n description,\n dateModified,\n modifiedBy,\n } of apiKeys) {\n console.log(\n ` - ${name}${\n description ? ` (${description})` : ''\n } [${dateModified.toString().substring(0, 10)} ${modifiedBy}]`\n );\n console.log(` ${id}`);\n console.log(` ${sharedSecret}`);\n }\n });\n }\n\n if (keysErr) {\n log.error(messages.keys.noList(currentEnv));\n log.error(jsonFormatter(keysErr));\n }\n }\n };\n\n CreateApiKey = async (name: string, description?: string) => {\n const { currentEnv, log, messages } = this;\n 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 ` - ${key.name}${\n key.description ? ` (${key.description})` : ''\n } [${key.dateModified.toString().substring(0, 10)} ${key.modifiedBy}]`\n );\n console.log(` - id: ${key.id}`);\n console.log(` - sharedSecret: ${key.sharedSecret}`);\n }\n console.log('');\n\n if (err) {\n log.error(messages.keys.failedCreate(currentEnv, name), err);\n }\n }\n };\n\n RemoveApiKey = async (id: string) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis({ commit: true });\n\n if (contensis) {\n const [err, key] = 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 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 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 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 GetContentTypes = async () => {\n const { currentProject, log, messages } = this;\n let err;\n if (!this.contensis) err = await this.HydrateContensis();\n\n if (err) log.error(messages.models.noList(currentProject));\n if (!this.contensis) log.warning(messages.models.noList(currentProject));\n\n return this.contensis;\n };\n\n PrintContentModels = async (modelIds: string[] = []) => {\n const { currentProject, log, messages } = this;\n const contensis = await this.GetContentTypes();\n if (contensis) {\n // Retrieve models list for env\n const { models, contentTypes = [], components = [] } = this;\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\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 const contentModelBackup = [\n ...contentTypes.filter(c => contentTypeIds.includes(c.id)),\n ...components.filter(c => componentIds.includes(c.id)),\n ];\n\n if (Array.isArray(returnModels)) {\n log.success(messages.models.list(currentProject));\n this.HandleFormattingAndOutput(contentModelBackup, () => {\n // print the content models to console\n for (const model of returnModels) {\n log.raw('');\n log.object(model);\n }\n log.raw('');\n });\n } else {\n log.success(\n messages.models.get(currentProject, models?.length.toString() || '0')\n );\n log.raw('');\n if (models?.length) {\n this.HandleFormattingAndOutput(contentModelBackup, () => {\n // print the content models s#qto console\n for (const model of models) {\n const components = model.components?.length || 0;\n const contentTypes = model.contentTypes?.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 `{ ${components ? `components: ${components}, ` : ''}${\n contentTypes ? `contentTypes: ${contentTypes}, ` : ''\n }${\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 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 ? readJsonFile<(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 this.HandleFormattingAndOutput(result, () => {\n // print the results to console\n if (!commit) {\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 } else {\n const migrateResult = result as MigrateModelsResult;\n log.raw(log.boldText(`\\nContent types:`));\n printModelMigrationResult(\n this,\n migrateResult[currentProject].contentTypes\n );\n\n log.raw(log.boldText(`\\nComponents:`));\n printModelMigrationResult(\n this,\n migrateResult[currentProject].components\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 await this.GetContentTypes();\n if (this.contensis) {\n // Retrieve content types list for env\n const { contentTypes } = this;\n\n if (Array.isArray(contentTypes)) {\n log.success(messages.contenttypes.list(currentProject));\n this.HandleFormattingAndOutput(contentTypes, () => {\n // print the content types to console\n for (const contentType of contentTypes) {\n const fieldsLength = contentType.fields?.length || 0;\n console.log(\n ` - ${contentType.id} [${fieldsLength} field${\n fieldsLength !== 1 ? 's' : ''\n }]`\n );\n }\n });\n }\n }\n };\n\n PrintContentType = async (contentTypeId: string) => {\n const { currentProject, log, messages } = this;\n await this.GetContentTypes();\n if (this.contensis) {\n // Retrieve content types list for env\n const { contentTypes } = this;\n\n if (Array.isArray(contentTypes)) {\n const contentType = contentTypes.find(\n c => c.id.toLowerCase() === contentTypeId.toLowerCase()\n );\n if (contentType) {\n log.success(\n messages.contenttypes.get(currentProject, contentType.id)\n );\n // print the content type to console\n this.HandleFormattingAndOutput(contentType, log.object);\n } else {\n log.error(\n messages.contenttypes.failedGet(currentProject, contentTypeId)\n );\n }\n }\n }\n };\n\n RemoveContentTypes = async (contentTypeIds: string[], commit = false) => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: 'user-input',\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 this.HandleFormattingAndOutput(result, () =>\n log.object(jsonFormatter(result))\n );\n }\n }\n };\n\n ImportContentTypes = async (\n {\n commit,\n fromFile,\n }: {\n commit: boolean;\n fromFile: string;\n },\n contentTypeIds: string[] = []\n ) => {\n const { currentProject, log, messages } = this;\n\n let fileData = fromFile ? readJsonFile<ContentType[]>(fromFile) || [] : [];\n if (typeof fileData === 'string')\n throw new Error(`Import file format must be of type JSON`);\n\n if (!Array.isArray(fileData)) fileData = [fileData];\n\n const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: fromFile ? 'user-input' : undefined,\n });\n\n if (contensis) {\n // Pass each content type to the target repo\n for (const contentType of fileData) {\n // Fix invalid data\n contentType.projectId = currentProject;\n delete contentType.uuid;\n\n const [err, created, createStatus] = 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 this.HandleFormattingAndOutput(contentType, () => {});\n }\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 ? readJsonFile<ContentType[]>(fromFile) || [] : [];\n if (typeof fileData === 'string')\n throw new Error(`Import file format must be of type JSON`);\n\n if (!Array.isArray(fileData)) fileData = [fileData];\n\n 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 this.HandleFormattingAndOutput(result, () => {\n log.success(\n `Queried models ${log.infoText(\n `\"${result.query.modelIds?.join(', ')}\"`\n )}\\n`\n );\n\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(`Components:`));\n if (!result.components) log.info(`- None returned\\n`);\n else printModelMigrationAnalysis(this, result.components);\n });\n }\n };\n\n PrintComponents = async () => {\n const { currentProject, log, messages } = this;\n await this.GetContentTypes();\n if (this.contensis) {\n // Retrieve components list for env\n const { components } = this;\n\n if (Array.isArray(components)) {\n log.success(messages.components.list(currentProject));\n\n this.HandleFormattingAndOutput(components, () => {\n // print the components to console\n for (const component of components) {\n const fieldsLength = component.fields?.length || 0;\n console.log(\n ` - ${component.id} [${fieldsLength} field${\n fieldsLength !== 1 ? 's' : ''\n }]`\n );\n }\n });\n }\n }\n };\n\n PrintComponent = async (componentId: string) => {\n const { currentProject, log, messages } = this;\n await this.GetContentTypes();\n if (this.contensis) {\n // Retrieve content types list for env\n const { components } = this;\n\n if (Array.isArray(components)) {\n const component = components.find(\n c => c.id.toLowerCase() === componentId.toLowerCase()\n );\n if (component) {\n log.success(messages.components.get(currentProject, component.id));\n // print the component to console\n this.HandleFormattingAndOutput(component, log.object);\n } else {\n log.error(messages.components.failedGet(currentProject, componentId));\n }\n }\n }\n };\n\n RemoveComponents = async (componentIds: string[], commit = false) => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: 'user-input',\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 this.HandleFormattingAndOutput(result, () =>\n log.info(jsonFormatter(result))\n );\n }\n }\n };\n\n ImportComponents = async (\n {\n commit,\n fromFile,\n }: {\n commit: boolean;\n fromFile: string;\n },\n componentIds: string[] = []\n ) => {\n const { currentProject, log, messages } = this;\n\n let fileData = fromFile ? readJsonFile<Component[]>(fromFile) || [] : [];\n if (typeof fileData === 'string')\n throw new Error(`Import file format must be of type JSON`);\n\n if (!Array.isArray(fileData)) fileData = [fileData];\n\n 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 for (const component of fileData) {\n // Fix invalid data\n component.projectId = currentProject;\n delete component.uuid;\n\n const [err, created, 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 this.HandleFormattingAndOutput(component, () => {});\n }\n }\n }\n };\n\n RemoveEntries = async (commit = false) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: 'user-input',\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 this.HandleFormattingAndOutput(result, () => {\n // print the migrateResult to console\n printMigrateResult(this, result, { action: 'delete' });\n });\n if (\n !err &&\n ((!commit &&\n Object.values(result.entriesToMigrate)?.[0].totalCount > 0) ||\n (commit && result.migrateResult?.deleted))\n ) {\n log.success(messages.entries.removed(currentEnv, commit));\n if (!commit) log.help(messages.entries.commitTip());\n } else {\n log.error(messages.entries.failedRemove(currentEnv), err);\n if (!Object.values(result.entriesToMigrate)?.[0].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 this.HandleFormattingAndOutput(entries, () =>\n // print the entries to console\n logEntriesTable(\n entries,\n currentProject,\n 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 }: {\n commit: boolean;\n fromFile: string;\n }) => {\n const { 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 [migrateErr, migrateResult] = await contensis.MigrateEntries();\n\n if (migrateErr) logError(migrateErr);\n else\n this.HandleFormattingAndOutput(migrateResult, () => {\n // print the migrateResult to console\n printMigrateResult(this, migrateResult);\n });\n } else {\n log.warning(messages.models.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n PrintWebhookSubscriptions = async (\n subscriptionIds?: string[],\n name?: string\n ) => {\n const { currentEnv, log, messages } = this;\n 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 =\n typeof name === 'string'\n ? webhooks?.filter(w =>\n w.name?.toLowerCase().includes(name.toLowerCase())\n )\n : Array.isArray(subscriptionIds)\n ? webhooks?.filter(w => subscriptionIds?.some(id => id === w.id))\n : webhooks;\n\n if (Array.isArray(filteredResults)) {\n this.HandleFormattingAndOutput(filteredResults, () => {\n // print the keys to console\n log.success(messages.webhooks.list(currentEnv));\n for (const {\n id,\n description,\n method,\n name,\n version,\n url,\n } of filteredResults) {\n console.log(\n ` - ${name}${\n description ? ` (${description})` : ''\n } [${version.modified.toString().substring(0, 10)} ${\n version.modifiedBy\n }]`\n );\n console.log(` ${id}`);\n console.log(` [${method}] ${url}`);\n }\n console.log('');\n });\n }\n\n if (webhooksErr) {\n log.error(messages.webhooks.noList(currentEnv));\n log.error(jsonFormatter(webhooksErr));\n }\n }\n };\n\n PrintBlocks = async () => {\n const { currentEnv, env, log, messages } = this;\n 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)) {\n this.HandleFormattingAndOutput(blocks, () => {\n // print the blocks to console\n log.success(messages.blocks.list(currentEnv, env.currentProject));\n for (const {\n id,\n description,\n branches,\n liveVersion,\n madeLive,\n versionsSinceLive,\n } of blocks) {\n console.log(\n ` - ${id}${description ? ` (${description})` : ''}${\n madeLive\n ? ` [${madeLive.toString().substring(0, 10)} v${liveVersion}]`\n : ''\n }${\n versionsSinceLive\n ? log.warningText(` +${versionsSinceLive}`)\n : ''\n }`\n );\n for (const branch of branches)\n console.log(\n log.infoText(` [${branch.id}]: ${branch.status}`)\n );\n }\n });\n }\n\n if (err) {\n log.error(messages.blocks.noList(currentEnv));\n log.error(jsonFormatter(err));\n }\n }\n };\n\n PrintBlockVersions = async (\n blockId: string,\n branch: string,\n version: string\n ) => {\n const { currentEnv, env, log, messages } = this;\n 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 (blocks) {\n this.HandleFormattingAndOutput(blocks, () => {\n // print the version detail to console\n log.success(\n messages.blocks.get(blockId, currentEnv, env.currentProject)\n );\n for (const block of blocks)\n printBlockVersion(\n this,\n block,\n !version\n ? {\n showImage: false,\n showSource: true,\n showStaticPaths: false,\n showStatus: false,\n }\n : undefined\n );\n });\n }\n\n if (err) {\n log.error(messages.blocks.noList(currentEnv, env.currentProject));\n log.error(jsonFormatter(err));\n }\n }\n };\n\n PushBlock = async (block: PushBlockParams) => {\n const { currentEnv, env, log, messages } = this;\n\n // Output request to console\n 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 this.HandleFormattingAndOutput(blockVersion, () => {\n // print the version detail to console\n printBlockVersion(this, blockVersion);\n });\n }\n if (err)\n throw new Error(\n messages.blocks.failedPush(block.id, currentEnv, env.currentProject)\n );\n }\n };\n\n ReleaseBlock = async (blockId: string, version: string) => {\n const { currentEnv, env, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve block version\n const [err, blockVersion] = await contensis.blocks.BlockAction(\n blockId,\n 'release',\n version\n );\n\n if (blockVersion) {\n this.HandleFormattingAndOutput(blockVersion, () => {\n // print the version detail to console\n log.success(\n messages.blocks.released(blockId, currentEnv, env.currentProject)\n );\n printBlockVersion(this, blockVersion);\n });\n }\n\n if (err) {\n log.error(\n messages.blocks.failedRelease(blockId, currentEnv, env.currentProject)\n );\n log.error(jsonFormatter(err));\n }\n }\n };\n\n PrintBlockLogs = async (\n blockId: string,\n branch: string,\n version: string,\n dataCenter: 'hq' | 'manchester' | 'london'\n ) => {\n const { currentEnv, env, log, messages } = this;\n 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 (blockLogs) {\n this.HandleFormattingAndOutput(blockLogs, () => {\n // print the logs to console\n console.log(\n ` - ${blockId} ${branch} ${\n Number(version) ? `v${version}` : version\n } [${dataCenter}]`\n );\n log.line();\n console.log(log.infoText(blockLogs));\n log.line();\n });\n }\n\n if (err) {\n log.error(\n messages.blocks.failedGetLogs(blockId, currentEnv, env.currentProject)\n );\n log.error(jsonFormatter(err));\n }\n }\n };\n\n HandleFormattingAndOutput = <T>(obj: T, logFn: (obj: T) => void) => {\n const { format, log, messages, output } = this;\n if (!format) {\n // print the object to console\n logFn(obj);\n } else if (format === 'csv') {\n log.raw('');\n log.raw(log.infoText(csvFormatter(obj)));\n } else if (format === 'xml') {\n log.raw('');\n log.raw(log.infoText(xmlFormatter(obj)));\n } else if (format === 'json') {\n log.raw('');\n log.raw(log.infoText(jsonFormatter(obj)));\n }\n log.raw('');\n\n if (output) {\n let writeString = '';\n if (format === 'csv') {\n writeString = csvFormatter(obj as any);\n } else if (format === 'xml') {\n writeString = xmlFormatter(obj as any);\n } else writeString = jsonFormatter(obj);\n // write output to file\n if (writeString) {\n fs.writeFileSync(output, writeString);\n log.success(messages.app.fileOutput(format, output));\n } else {\n log.info(messages.app.noFileOutput());\n }\n }\n };\n}\n\nexport const cliCommand = (\n commandArgs: string[],\n outputOpts: OutputOptions & IConnectOptions = {},\n contensisOpts: Partial<MigrateRequest> = {}\n) => {\n return new ContensisCli(['', '', ...commandArgs], outputOpts, contensisOpts);\n};\nexport default ContensisCli;\n"],
5
5
  "mappings": "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",
6
6
  "names": ["SessionCacheProvider", "path", "to", "fetch", "CredentialProvider", "inquirer", "ContensisAuthService", "chalk", "components", "contentTypes", "name", "url", "fs"]
7
7
  }
package/dist/shell.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/shell.ts"],
4
- "sourcesContent": ["import 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"],
4
+ "sourcesContent": ["import figlet from 'figlet';\nimport inquirer from 'inquirer';\nimport inquirerPrompt from 'inquirer-command-prompt';\nimport commands from './commands';\nimport { LogMessages } from './localisation/en-GB';\nimport CredentialProvider from './providers/CredentialProvider';\nimport { appRootDir } from './providers/file-provider';\nimport ContensisCli, { cliCommand } from './services/ContensisCliService';\nimport { Logging } from './util';\nimport { logError, Logger } from './util/logger';\nimport { LIB_VERSION } from './version';\n\nclass ContensisShell {\n private currentEnvironment!: string;\n private emptyInputCounter: number = 0;\n private env!: EnvironmentCache;\n private firstStart = true;\n private userId: string = '';\n private log = Logger;\n private messages = LogMessages;\n\n private refreshEnvironment = () => {\n // Reload any persisted changes from the disk cache\n const {\n cache: { currentEnvironment = '', environments = {} },\n } = new ContensisCli([]);\n // console.log(`refreshing env w/${currentEnvironment}`);\n this.currentEnvironment = currentEnvironment;\n this.env = environments[currentEnvironment];\n\n // Reload logging here to support changing language\n Logging('en-GB').then(({ messages, Log }) => {\n this.log = Log;\n this.messages = messages;\n });\n };\n\n constructor() {\n this.refreshEnvironment();\n inquirerPrompt.setConfig({\n history: {\n save: true,\n folder: appRootDir,\n limit: 100,\n blacklist: ['quit'],\n },\n });\n\n const { log, messages } = this;\n\n figlet.text(\n messages.app.contensis(),\n {\n font: 'Block',\n horizontalLayout: 'default',\n verticalLayout: 'default',\n width: process.stdout.columns,\n whitespaceBreak: true,\n },\n (err, data) => {\n if (err) {\n log.error(messages.app.unknownError());\n console.dir(err);\n return;\n }\n console.log(log.successText(data));\n console.log(log.infoText(messages.app.startup(LIB_VERSION)));\n console.log(log.helpText(messages.app.help()));\n\n this.start().catch(ex => log.error(ex));\n }\n );\n }\n\n restart = async () => {\n this.firstStart = false;\n this.log.line(); // add a line so we can see where the shell has been restarted\n await this.start();\n };\n\n start = async () => {\n this.refreshEnvironment();\n this.userId = '';\n const { currentEnvironment, env, log, messages } = this;\n\n if (env?.lastUserId) {\n const [credsErr, credentials] = await new CredentialProvider(\n {\n userId: env.lastUserId,\n alias: currentEnvironment,\n },\n env.passwordFallback\n ).Init();\n if (credsErr && !credentials.current) {\n log.error(credsErr.message);\n }\n if (credentials.current) {\n if (this.firstStart) {\n const token = await cliCommand(['login', env.lastUserId]).Login(\n env.lastUserId,\n {\n promptPassword: false,\n silent: true,\n }\n );\n if (token) {\n this.userId = env.lastUserId;\n if (!env.currentProject) log.warning(messages.projects.tip());\n }\n this.firstStart = false;\n this.refreshEnvironment();\n } else {\n this.userId = env.lastUserId;\n }\n }\n }\n await this.contensisPrompt();\n };\n\n contensisPrompt = async (): Promise<any> => {\n const { currentEnvironment, env, log, messages, userId } = this;\n\n const availableCommands = [\n {\n filter: (str: string) => {\n return str.replace(/ \\[.*$/, '');\n },\n },\n 'connect',\n 'list envs',\n 'quit',\n ];\n\n if (currentEnvironment)\n availableCommands.push('login', 'list projects', 'set project');\n if (userId)\n availableCommands.push(\n 'create project',\n 'diff models',\n 'get block',\n 'get block logs',\n 'get contenttype',\n 'get component',\n 'get entries',\n 'get model',\n 'get project',\n 'get version',\n 'import contenttypes',\n 'import components',\n 'import entries',\n 'import models',\n 'list blocks',\n 'list contenttypes',\n 'list components',\n 'list models',\n 'list keys',\n 'list webhooks',\n 'create key',\n 'push block',\n 'release block',\n 'remove key',\n 'remove entries',\n 'remove contenttypes',\n 'remove components',\n 'set project name',\n 'set project description'\n );\n\n const prompt = inquirer.createPromptModule();\n prompt.registerPrompt('command', inquirerPrompt);\n return prompt([\n {\n type: 'command',\n name: 'cmd',\n autoCompletion: availableCommands,\n autocompletePrompt: log.infoText(messages.app.autocomplete()),\n message: `${userId ? `${userId}@` : ''}${currentEnvironment || ''}>`,\n context: 0,\n validate: (val: string) => {\n if (!val) this.emptyInputCounter++;\n if (this.emptyInputCounter > 1)\n console.log(this.log.infoText(this.messages.app.suggestions()));\n if (val) {\n this.emptyInputCounter = 0;\n return true;\n }\n },\n prefix: `${env?.currentProject || log.infoText('contensis')}`,\n short: true,\n },\n ])\n .then(async (answers: { cmd: string }) => {\n if (answers.cmd === 'quit') {\n this.quit();\n } else {\n try {\n if (answers.cmd) {\n const program = commands();\n await program.parseAsync(\n answers.cmd\n .match(/\"[^\"]+\"|[^\\s]+/g)\n ?.map(e => e.replace(/\"(.+)\"/, '$1')),\n {\n from: 'user',\n }\n );\n }\n } catch (ex: any) {\n const str = ex.toString();\n if (!str.includes('CommanderError'))\n logError(ex, `Shell ${ex.toString()}`);\n } finally {\n return this.contensisPrompt();\n }\n }\n })\n .catch((err: Error) => {\n log.error(err.message);\n this.quit();\n });\n };\n\n quit = (error?: Error) => {\n const { log, messages } = this;\n process.removeAllListeners('exit');\n\n if (error) {\n log.error(error.message);\n process.exit(1);\n } else {\n log.success(messages.app.quit());\n process.exitCode = 0;\n process.exit(0);\n }\n };\n}\n\nlet globalShell: ContensisShell;\n\nexport const shell = () => {\n // Return a benign function for shell().restart() when used in cli context\n // as some commands need to restart the shell to show an updated prompt\n // after successful connect / login / set project\n if (typeof process.argv?.[2] !== 'undefined') return { restart() {} } as any;\n if (!globalShell) globalShell = new ContensisShell();\n return globalShell;\n};\n\nprocess.on('uncaughtException', function (err) {\n // Handle the error safely\n console.log(err);\n});\n\nprocess.on('SIGINT', () => {\n console.log('catching SIGINT');\n shell().quit();\n});\n\nprocess.on('SIGTERM', () => {\n console.log('catching SIGTERM');\n shell().quit();\n});\n\nprocess.stdin.on('data', key => {\n if ((key as any) == '\\u0003') {\n console.log('');\n Logger.info(`[CTRL]+[C] detected, exiting shell...`);\n shell().quit();\n }\n});\n"],
5
5
  "mappings": "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",
6
6
  "names": ["ContensisCli", "inquirerPrompt", "figlet", "CredentialProvider", "inquirer", "commands"]
7
7
  }
@@ -127,7 +127,7 @@ const printMigrateResult = ({ log, messages, contensis, currentProject }, migrat
127
127
  showAllEntries = false,
128
128
  showChangedEntries = false
129
129
  } = {}) => {
130
- var _a, _b, _c, _d, _e, _f, _g;
130
+ var _a, _b, _c, _d, _e;
131
131
  if (Object.keys(migrateResult.entriesToMigrate.entryIds).length)
132
132
  console.log(``);
133
133
  for (const [contentTypeId, entryRes] of Object.entries(
@@ -187,10 +187,10 @@ const printMigrateResult = ({ log, messages, contensis, currentProject }, migrat
187
187
  for (const [contentTypeId, count] of Object.entries(
188
188
  contentTypeCounts
189
189
  )) {
190
- const entriesToMigrate = (_d = (_c = migrateResult.entriesToMigrate) == null ? void 0 : _c[projectId]) == null ? void 0 : _d[contentTypeId];
191
- const existingCount = ((_f = (_e = migrateResult.existing) == null ? void 0 : _e[projectId]) == null ? void 0 : _f[contentTypeId]) || 0;
190
+ const migrateStatusAndCount = migrateResult.entriesToMigrate[currentProject][contentTypeId];
191
+ const existingCount = ((_d = (_c = migrateResult.existing) == null ? void 0 : _c[currentProject]) == null ? void 0 : _d[contentTypeId]) || 0;
192
192
  const existingPercent = (existingCount / count * 100).toFixed(0);
193
- const noChangeOrTotalEntriesCount = typeof entriesToMigrate !== "number" ? (entriesToMigrate == null ? void 0 : entriesToMigrate["no change"]) || 0 : entriesToMigrate;
193
+ const noChangeOrTotalEntriesCount = typeof migrateStatusAndCount !== "number" ? (migrateStatusAndCount == null ? void 0 : migrateStatusAndCount["no change"]) || 0 : migrateStatusAndCount;
194
194
  const isTotalCountRow = contentTypeId === "totalCount";
195
195
  const changedPercentage = (noChangeOrTotalEntriesCount / count * 100).toFixed(0);
196
196
  const existingColor = existingPercent === "0" ? log.warningText : log.infoText;
@@ -204,7 +204,7 @@ const printMigrateResult = ({ log, messages, contensis, currentProject }, migrat
204
204
  );
205
205
  }
206
206
  }
207
- if ((_g = migrateResult.errors) == null ? void 0 : _g.length) {
207
+ if ((_e = migrateResult.errors) == null ? void 0 : _e.length) {
208
208
  console.log(
209
209
  ` - ${log.errorText(`errors: ${migrateResult.errors.length}`)}
210
210
  `
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/util/console.printer.ts"],
4
- "sourcesContent": ["import dayjs from 'dayjs';\r\nimport { BlockVersion, MigrateModelsResult, MigrateStatus } from 'migratortron';\r\nimport ContensisCli from '~/services/ContensisCliService';\r\nimport { Logger } from './logger';\r\n\r\nconst formatDate = (date: Date | string, format = 'DD/MM/YYYY HH:mm') =>\r\n dayjs(date).format(format);\r\n\r\nexport const printBlockVersion = (\r\n { log, messages }: ContensisCli,\r\n block: BlockVersion,\r\n printOptions = {\r\n showSource: true,\r\n showStatus: true,\r\n showStaticPaths: true,\r\n showImage: true,\r\n }\r\n) => {\r\n console.log(\r\n ` ${log.standardText(`v${block.version.versionNo}`)} ${block.id}`\r\n );\r\n console.log(\r\n ` state: ${messages.blocks.runningStatus(\r\n block.status.broken ? 'broken' : block.status.running.global\r\n )}`\r\n );\r\n console.log(\r\n ` released: ${log.infoText(\r\n block.version.released\r\n ? `[${formatDate(block.version.released)}] ${block.version.releasedBy}`\r\n : 'no'\r\n )}`\r\n );\r\n if (block.version.madeLive)\r\n console.log(\r\n ` live: ${log.infoText(\r\n `[${formatDate(block.version.madeLive)}] ${block.version.madeLiveBy}`\r\n )}`\r\n );\r\n if (printOptions.showStatus) {\r\n console.log(` status:`);\r\n console.log(` deployment: ${log.infoText(block.status.deployment)}`);\r\n console.log(` workflow: ${log.infoText(block.status.workflow)}`);\r\n console.log(\r\n ` running status: ${messages.blocks.runningStatus(\r\n block.status.running.global\r\n )}`\r\n );\r\n console.log(` datacentres:`);\r\n console.log(\r\n ` hq: ${messages.blocks.runningStatus(\r\n block.status.running.dataCenters.hq\r\n )}`\r\n );\r\n console.log(\r\n ` london: ${messages.blocks.runningStatus(\r\n block.status.running.dataCenters.london\r\n )}`\r\n );\r\n console.log(\r\n ` manchester: ${messages.blocks.runningStatus(\r\n block.status.running.dataCenters.manchester\r\n )}`\r\n );\r\n }\r\n if (printOptions.showSource) {\r\n console.log(` source:`);\r\n console.log(` commit: ${log.helpText(block.source.commit.id)}`);\r\n console.log(\r\n ` message: ${log.infoText(\r\n block.source.commit.message\r\n ?.replaceAll('\\n', '\\\\n')\r\n .replaceAll('\\\\n\\\\n', '\\\\n')\r\n .replaceAll('\\\\n', '; ')\r\n )}`\r\n );\r\n console.log(\r\n ` committed: ${log.infoText(\r\n `[${formatDate(block.source.commit.dateTime)}] ${\r\n block.source.commit.authorEmail\r\n }`\r\n )}`\r\n );\r\n console.log(\r\n ` pushed: ${log.infoText(\r\n `[${formatDate(block.version.pushed)}] ${block.version.pushedBy}`\r\n )}`\r\n );\r\n console.log(` ${log.infoText(block.source.commit.commitUrl)}`);\r\n }\r\n if (printOptions.showImage) {\r\n console.log(` image:`);\r\n console.log(` uri: ${log.infoText(block.image.uri)}`);\r\n console.log(` tag: ${log.helpText(block.image.tag)}`);\r\n }\r\n if (printOptions.showStaticPaths) {\r\n if (block.staticPaths?.length) {\r\n console.log(` static paths:`);\r\n for (const path of block.staticPaths) console.log(` - ${path}`);\r\n }\r\n }\r\n if (block.stagingUrl)\r\n console.log(` staging url: ${log.infoText(block.stagingUrl)}`);\r\n console.log('');\r\n};\r\n\r\nexport const printMigrateResult = (\r\n { log, messages, contensis, currentProject }: ContensisCli,\r\n migrateResult: any,\r\n {\r\n action = 'import',\r\n showDiff = false,\r\n showAllEntries = false,\r\n showChangedEntries = false,\r\n }: {\r\n action?: 'import' | 'delete';\r\n showDiff?: boolean;\r\n showAllEntries?: boolean;\r\n showChangedEntries?: boolean;\r\n } = {}\r\n) => {\r\n if (Object.keys(migrateResult.entriesToMigrate.entryIds).length)\r\n console.log(``);\r\n\r\n for (const [contentTypeId, entryRes] of Object.entries(\r\n migrateResult.entriesToMigrate.entryIds\r\n ) as [string, any]) {\r\n for (const [originalId, entryStatus] of Object.entries(entryRes) as [\r\n string,\r\n any\r\n ][]) {\r\n // console.log(`${log.helpText(contentTypeId)} ${entryStatus.entryTitle}`);\r\n if (\r\n showAllEntries ||\r\n (showChangedEntries &&\r\n (\r\n Object.entries(\r\n Object.entries(entryStatus[currentProject])[0]\r\n )[1][1] as any\r\n ).status !== 'no change')\r\n ) {\r\n console.log(\r\n log.infoText(\r\n `${originalId} ${Object.entries(entryStatus || {})\r\n .filter(x => x[0] !== 'entryTitle')\r\n .map(([projectId, projectStatus]) => {\r\n const [targetGuid, { status }] = (Object.entries(\r\n projectStatus || {}\r\n )?.[0] as [string, { status: MigrateStatus }]) || [\r\n '',\r\n { x: { status: undefined } },\r\n ];\r\n return `${messages.migrate.status(status)(`${status}`)}${\r\n targetGuid !== originalId ? `-> ${targetGuid}` : ''\r\n }`;\r\n })}`\r\n ) + ` ${log.helpText(contentTypeId)} ${entryStatus.entryTitle}`\r\n );\r\n\r\n for (const [projectId, projectStatus] of Object.entries(\r\n entryStatus\r\n ).filter(([key]) => key !== 'entryTitle') as [string, any][]) {\r\n const [targetGuid, { error, diff, status }] = Object.entries(\r\n projectStatus\r\n )[0] as [string, any];\r\n if (error) log.error(error);\r\n if (diff && showDiff) {\r\n console.log(\r\n ` ${log.highlightText(`diff:`)} ${log.infoText(\r\n highlightDiffText(diff)\r\n )}\\n`\r\n );\r\n }\r\n }\r\n }\r\n }\r\n }\r\n console.log(``);\r\n if (\r\n contensis?.isPreview &&\r\n migrateResult.entriesToMigrate?.[currentProject]?.totalCount > 0 &&\r\n !migrateResult.errors\r\n ) {\r\n log.help(messages.entries.commitTip());\r\n }\r\n\r\n if (action === 'import') {\r\n for (const [projectId, contentTypeCounts] of Object.entries(\r\n migrateResult.entries || {}\r\n ) as [string, any][]) {\r\n log.help(\r\n `import from project ${log.highlightText(projectId)} to ${log.boldText(\r\n log.warningText(currentProject)\r\n )}`\r\n );\r\n for (const [contentTypeId, count] of Object.entries(\r\n contentTypeCounts\r\n ) as [string, number][]) {\r\n const entriesToMigrate =\r\n migrateResult.entriesToMigrate?.[projectId]?.[contentTypeId];\r\n const existingCount =\r\n migrateResult.existing?.[projectId]?.[contentTypeId] || 0;\r\n const existingPercent = ((existingCount / count) * 100).toFixed(0);\r\n const noChangeOrTotalEntriesCount =\r\n typeof entriesToMigrate !== 'number'\r\n ? entriesToMigrate?.['no change'] || 0\r\n : entriesToMigrate;\r\n\r\n const isTotalCountRow = contentTypeId === 'totalCount';\r\n\r\n const changedPercentage = (\r\n (noChangeOrTotalEntriesCount / count) *\r\n 100\r\n ).toFixed(0);\r\n\r\n const existingColor =\r\n existingPercent === '0' ? log.warningText : log.infoText;\r\n const changedColor = isTotalCountRow\r\n ? log.helpText\r\n : changedPercentage === '100'\r\n ? log.successText\r\n : log.warningText;\r\n\r\n console.log(\r\n ` - ${\r\n isTotalCountRow\r\n ? log.highlightText(`${contentTypeId}: ${count}`)\r\n : `${contentTypeId}: ${log.helpText(count)}`\r\n }${\r\n changedPercentage === '100'\r\n ? ''\r\n : existingColor(\r\n ` [existing: ${\r\n isTotalCountRow ? existingCount : `${existingPercent}%`\r\n }]`\r\n )\r\n }${\r\n existingPercent === '0'\r\n ? ''\r\n : changedColor(\r\n ` ${\r\n isTotalCountRow\r\n ? `[to change: ${noChangeOrTotalEntriesCount}]`\r\n : changedPercentage === '100'\r\n ? 'up to date'\r\n : `[needs update: ${100 - Number(changedPercentage)}%]`\r\n }`\r\n )\r\n }`\r\n );\r\n }\r\n }\r\n if (migrateResult.errors?.length) {\r\n console.log(\r\n ` - ${log.errorText(`errors: ${migrateResult.errors.length}`)}\\n`\r\n );\r\n for (const error of migrateResult.errors)\r\n log.error(error.message || error);\r\n }\r\n }\r\n};\r\n\r\nconst highlightDiffText = (str: string) => {\r\n const addedRegex = new RegExp(/<<\\+>>(.*?)<<\\/\\+>>/, 'g');\r\n const removedRegex = new RegExp(/<<->>(.*?)<<\\/->>/, 'g');\r\n return str\r\n .replace(addedRegex, match => {\r\n return Logger.successText(\r\n match.replace(/<<\\+>>/g, '<+>').replace(/<<\\/\\+>>/g, '</+>')\r\n );\r\n })\r\n .replace(removedRegex, match => {\r\n return Logger.errorText(\r\n match.replace(/<<->>/g, '<->').replace(/<<\\/->>/g, '</->')\r\n );\r\n });\r\n};\r\n\r\nexport const printModelMigrationAnalysis = (\r\n { log, messages }: ContensisCli,\r\n result: any = {}\r\n) => {\r\n for (const [contentTypeId, model] of Object.entries(result) as [\r\n string,\r\n any\r\n ][]) {\r\n let mainOutput = log.standardText(` - ${contentTypeId}`);\r\n let extraOutput = '';\r\n let errorOutput = '';\r\n let diffOutput = '';\r\n for (const [key, details] of Object.entries(model) as [string, any][]) {\r\n if (key === 'dependencies') {\r\n extraOutput += log.infoText(\r\n ` references: [${details?.join(', ')}]\\n`\r\n );\r\n }\r\n if (key === 'dependencyOf') {\r\n extraOutput += log.infoText(\r\n ` required by: [${details?.join(', ')}]\\n`\r\n );\r\n }\r\n if (key === 'projects') {\r\n for (const [projectId, projectDetails] of Object.entries(details) as [\r\n string,\r\n any\r\n ][]) {\r\n mainOutput += log.infoText(\r\n ` [${messages.migrate.status(projectDetails.status)(\r\n `${projectId}: ${projectDetails.status}`\r\n )}] v${projectDetails.versionNo}`\r\n );\r\n if (projectDetails.diff)\r\n diffOutput += ` ${log.highlightText(`diff:`)} ${log.infoText(\r\n highlightDiffText(projectDetails.diff)\r\n )}\\n`;\r\n if (projectDetails.error)\r\n errorOutput += ` ${log.highlightText(\r\n `error::`\r\n )} ${log.errorText(projectDetails.error)}`;\r\n }\r\n }\r\n }\r\n console.log(mainOutput);\r\n if (extraOutput) {\r\n const search = '\\n';\r\n const replace = '';\r\n console.log(\r\n extraOutput.replace(\r\n new RegExp(search + '([^' + search + ']*)$'),\r\n replace + '$1'\r\n )\r\n );\r\n }\r\n if (diffOutput) console.log(diffOutput);\r\n if (errorOutput) console.log(errorOutput);\r\n }\r\n};\r\n\r\ntype MigrateResultSummary = MigrateModelsResult['']['contentTypes'];\r\ntype MigrateResultStatus = keyof MigrateResultSummary;\r\n\r\nexport const printModelMigrationResult = (\r\n { log, messages }: ContensisCli,\r\n result: MigrateResultSummary\r\n) => {\r\n for (const [status, ids] of Object.entries(result) as [\r\n MigrateResultStatus,\r\n string[]\r\n ][]) {\r\n if (ids?.length) {\r\n if (status === 'errors') {\r\n const errors: [string, MappedError][] = ids as any;\r\n log.raw(\r\n ` - ${status}: [ ${messages.migrate.models.result(status)(\r\n ids.map(id => id[0]).join(', ')\r\n )} ]\\n`\r\n );\r\n for (const [contentTypeId, error] of errors)\r\n log.error(\r\n `${log.highlightText(contentTypeId)}: ${error.message}`,\r\n error\r\n );\r\n } else\r\n log.raw(\r\n ` - ${status}: [ ${messages.migrate.models.result(status)(\r\n ids.join(', ')\r\n )} ]`\r\n );\r\n }\r\n }\r\n};\r\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mBAAkB;AAGlB,oBAAuB;AAEvB,MAAM,aAAa,CAAC,MAAqB,SAAS,2BAChD,aAAAA,SAAM,IAAI,EAAE,OAAO,MAAM;AAEpB,MAAM,oBAAoB,CAC/B,EAAE,KAAK,SAAS,GAChB,OACA,eAAe;AAAA,EACb,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,iBAAiB;AAAA,EACjB,WAAW;AACb,MACG;AAjBL;AAkBE,UAAQ;AAAA,IACN,KAAK,IAAI,aAAa,IAAI,MAAM,QAAQ,WAAW,KAAK,MAAM;AAAA,EAChE;AACA,UAAQ;AAAA,IACN,cAAc,SAAS,OAAO;AAAA,MAC5B,MAAM,OAAO,SAAS,WAAW,MAAM,OAAO,QAAQ;AAAA,IACxD;AAAA,EACF;AACA,UAAQ;AAAA,IACN,iBAAiB,IAAI;AAAA,MACnB,MAAM,QAAQ,WACV,IAAI,WAAW,MAAM,QAAQ,QAAQ,MAAM,MAAM,QAAQ,eACzD;AAAA,IACN;AAAA,EACF;AACA,MAAI,MAAM,QAAQ;AAChB,YAAQ;AAAA,MACN,aAAa,IAAI;AAAA,QACf,IAAI,WAAW,MAAM,QAAQ,QAAQ,MAAM,MAAM,QAAQ;AAAA,MAC3D;AAAA,IACF;AACF,MAAI,aAAa,YAAY;AAC3B,YAAQ,IAAI,aAAa;AACzB,YAAQ,IAAI,qBAAqB,IAAI,SAAS,MAAM,OAAO,UAAU,GAAG;AACxE,YAAQ,IAAI,mBAAmB,IAAI,SAAS,MAAM,OAAO,QAAQ,GAAG;AACpE,YAAQ;AAAA,MACN,yBAAyB,SAAS,OAAO;AAAA,QACvC,MAAM,OAAO,QAAQ;AAAA,MACvB;AAAA,IACF;AACA,YAAQ,IAAI,oBAAoB;AAChC,YAAQ;AAAA,MACN,eAAe,SAAS,OAAO;AAAA,QAC7B,MAAM,OAAO,QAAQ,YAAY;AAAA,MACnC;AAAA,IACF;AACA,YAAQ;AAAA,MACN,mBAAmB,SAAS,OAAO;AAAA,QACjC,MAAM,OAAO,QAAQ,YAAY;AAAA,MACnC;AAAA,IACF;AACA,YAAQ;AAAA,MACN,uBAAuB,SAAS,OAAO;AAAA,QACrC,MAAM,OAAO,QAAQ,YAAY;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AACA,MAAI,aAAa,YAAY;AAC3B,YAAQ,IAAI,aAAa;AACzB,YAAQ,IAAI,iBAAiB,IAAI,SAAS,MAAM,OAAO,OAAO,EAAE,GAAG;AACnE,YAAQ;AAAA,MACN,kBAAkB,IAAI;AAAA,SACpB,WAAM,OAAO,OAAO,YAApB,mBACI,WAAW,MAAM,OAClB,WAAW,UAAU,OACrB,WAAW,OAAO;AAAA,MACvB;AAAA,IACF;AACA,YAAQ;AAAA,MACN,oBAAoB,IAAI;AAAA,QACtB,IAAI,WAAW,MAAM,OAAO,OAAO,QAAQ,MACzC,MAAM,OAAO,OAAO;AAAA,MAExB;AAAA,IACF;AACA,YAAQ;AAAA,MACN,iBAAiB,IAAI;AAAA,QACnB,IAAI,WAAW,MAAM,QAAQ,MAAM,MAAM,MAAM,QAAQ;AAAA,MACzD;AAAA,IACF;AACA,YAAQ,IAAI,SAAS,IAAI,SAAS,MAAM,OAAO,OAAO,SAAS,GAAG;AAAA,EACpE;AACA,MAAI,aAAa,WAAW;AAC1B,YAAQ,IAAI,YAAY;AACxB,YAAQ,IAAI,cAAc,IAAI,SAAS,MAAM,MAAM,GAAG,GAAG;AACzD,YAAQ,IAAI,cAAc,IAAI,SAAS,MAAM,MAAM,GAAG,GAAG;AAAA,EAC3D;AACA,MAAI,aAAa,iBAAiB;AAChC,SAAI,WAAM,gBAAN,mBAAmB,QAAQ;AAC7B,cAAQ,IAAI,mBAAmB;AAC/B,iBAAW,QAAQ,MAAM;AAAa,gBAAQ,IAAI,WAAW,MAAM;AAAA,IACrE;AAAA,EACF;AACA,MAAI,MAAM;AACR,YAAQ,IAAI,oBAAoB,IAAI,SAAS,MAAM,UAAU,GAAG;AAClE,UAAQ,IAAI,EAAE;AAChB;AAEO,MAAM,qBAAqB,CAChC,EAAE,KAAK,UAAU,WAAW,eAAe,GAC3C,eACA;AAAA,EACE,SAAS;AAAA,EACT,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,qBAAqB;AACvB,IAKI,CAAC,MACF;AAxHL;AAyHE,MAAI,OAAO,KAAK,cAAc,iBAAiB,QAAQ,EAAE;AACvD,YAAQ,IAAI,EAAE;AAEhB,aAAW,CAAC,eAAe,QAAQ,KAAK,OAAO;AAAA,IAC7C,cAAc,iBAAiB;AAAA,EACjC,GAAoB;AAClB,eAAW,CAAC,YAAY,WAAW,KAAK,OAAO,QAAQ,QAAQ,GAG1D;AAEH,UACE,kBACC,sBAEG,OAAO;AAAA,QACL,OAAO,QAAQ,YAAY,eAAe,EAAE;AAAA,MAC9C,EAAE,GAAG,GACL,WAAW,aACf;AACA,gBAAQ;AAAA,UACN,IAAI;AAAA,YACF,GAAG,cAAc,OAAO,QAAQ,eAAe,CAAC,CAAC,EAC9C,OAAO,OAAK,EAAE,OAAO,YAAY,EACjC,IAAI,CAAC,CAAC,WAAW,aAAa,MAAM;AAjJnD,kBAAAC;AAkJgB,oBAAM,CAAC,YAAY,EAAE,OAAO,CAAC,MAAKA,MAAA,OAAO;AAAA,gBACvC,iBAAiB,CAAC;AAAA,cACpB,MAFkC,gBAAAA,IAE9B,OAA8C;AAAA,gBAChD;AAAA,gBACA,EAAE,GAAG,EAAE,QAAQ,OAAU,EAAE;AAAA,cAC7B;AACA,qBAAO,GAAG,SAAS,QAAQ,OAAO,MAAM,EAAE,GAAG,QAAQ,IACnD,eAAe,aAAa,MAAM,eAAe;AAAA,YAErD,CAAC;AAAA,UACL,IAAI,IAAI,IAAI,SAAS,aAAa,KAAK,YAAY;AAAA,QACrD;AAEA,mBAAW,CAAC,WAAW,aAAa,KAAK,OAAO;AAAA,UAC9C;AAAA,QACF,EAAE,OAAO,CAAC,CAAC,GAAG,MAAM,QAAQ,YAAY,GAAsB;AAC5D,gBAAM,CAAC,YAAY,EAAE,OAAO,MAAM,OAAO,CAAC,IAAI,OAAO;AAAA,YACnD;AAAA,UACF,EAAE;AACF,cAAI;AAAO,gBAAI,MAAM,KAAK;AAC1B,cAAI,QAAQ,UAAU;AACpB,oBAAQ;AAAA,cACN,OAAO,IAAI,cAAc,OAAO,KAAK,IAAI;AAAA,gBACvC,kBAAkB,IAAI;AAAA,cACxB;AAAA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,UAAQ,IAAI,EAAE;AACd,OACE,uCAAW,gBACX,yBAAc,qBAAd,mBAAiC,oBAAjC,mBAAkD,cAAa,KAC/D,CAAC,cAAc,QACf;AACA,QAAI,KAAK,SAAS,QAAQ,UAAU,CAAC;AAAA,EACvC;AAEA,MAAI,WAAW,UAAU;AACvB,eAAW,CAAC,WAAW,iBAAiB,KAAK,OAAO;AAAA,MAClD,cAAc,WAAW,CAAC;AAAA,IAC5B,GAAsB;AACpB,UAAI;AAAA,QACF,uBAAuB,IAAI,cAAc,SAAS,QAAQ,IAAI;AAAA,UAC5D,IAAI,YAAY,cAAc;AAAA,QAChC;AAAA,MACF;AACA,iBAAW,CAAC,eAAe,KAAK,KAAK,OAAO;AAAA,QAC1C;AAAA,MACF,GAAyB;AACvB,cAAM,oBACJ,yBAAc,qBAAd,mBAAiC,eAAjC,mBAA8C;AAChD,cAAM,kBACJ,yBAAc,aAAd,mBAAyB,eAAzB,mBAAsC,mBAAkB;AAC1D,cAAM,mBAAoB,gBAAgB,QAAS,KAAK,QAAQ,CAAC;AACjE,cAAM,8BACJ,OAAO,qBAAqB,YACxB,qDAAmB,iBAAgB,IACnC;AAEN,cAAM,kBAAkB,kBAAkB;AAE1C,cAAM,qBACH,8BAA8B,QAC/B,KACA,QAAQ,CAAC;AAEX,cAAM,gBACJ,oBAAoB,MAAM,IAAI,cAAc,IAAI;AAClD,cAAM,eAAe,kBACjB,IAAI,WACJ,sBAAsB,QACtB,IAAI,cACJ,IAAI;AAER,gBAAQ;AAAA,UACN,OACE,kBACI,IAAI,cAAc,GAAG,kBAAkB,OAAO,IAC9C,GAAG,kBAAkB,IAAI,SAAS,KAAK,MAE3C,sBAAsB,QAClB,KACA;AAAA,YACE,eACE,kBAAkB,gBAAgB,GAAG;AAAA,UAEzC,IAEJ,oBAAoB,MAChB,KACA;AAAA,YACE,IACE,kBACI,eAAe,iCACf,sBAAsB,QACtB,eACA,kBAAkB,MAAM,OAAO,iBAAiB;AAAA,UAExD;AAAA,QAER;AAAA,MACF;AAAA,IACF;AACA,SAAI,mBAAc,WAAd,mBAAsB,QAAQ;AAChC,cAAQ;AAAA,QACN,OAAO,IAAI,UAAU,WAAW,cAAc,OAAO,QAAQ;AAAA;AAAA,MAC/D;AACA,iBAAW,SAAS,cAAc;AAChC,YAAI,MAAM,MAAM,WAAW,KAAK;AAAA,IACpC;AAAA,EACF;AACF;AAEA,MAAM,oBAAoB,CAAC,QAAgB;AACzC,QAAM,aAAa,IAAI,OAAO,uBAAuB,GAAG;AACxD,QAAM,eAAe,IAAI,OAAO,qBAAqB,GAAG;AACxD,SAAO,IACJ,QAAQ,YAAY,WAAS;AAC5B,WAAO,qBAAO;AAAA,MACZ,MAAM,QAAQ,WAAW,KAAK,EAAE,QAAQ,aAAa,MAAM;AAAA,IAC7D;AAAA,EACF,CAAC,EACA,QAAQ,cAAc,WAAS;AAC9B,WAAO,qBAAO;AAAA,MACZ,MAAM,QAAQ,UAAU,KAAK,EAAE,QAAQ,YAAY,MAAM;AAAA,IAC3D;AAAA,EACF,CAAC;AACL;AAEO,MAAM,8BAA8B,CACzC,EAAE,KAAK,SAAS,GAChB,SAAc,CAAC,MACZ;AACH,aAAW,CAAC,eAAe,KAAK,KAAK,OAAO,QAAQ,MAAM,GAGrD;AACH,QAAI,aAAa,IAAI,aAAa,OAAO,eAAe;AACxD,QAAI,cAAc;AAClB,QAAI,cAAc;AAClB,QAAI,aAAa;AACjB,eAAW,CAAC,KAAK,OAAO,KAAK,OAAO,QAAQ,KAAK,GAAsB;AACrE,UAAI,QAAQ,gBAAgB;AAC1B,uBAAe,IAAI;AAAA,UACjB,sBAAsB,mCAAS,KAAK;AAAA;AAAA,QACtC;AAAA,MACF;AACA,UAAI,QAAQ,gBAAgB;AAC1B,uBAAe,IAAI;AAAA,UACjB,uBAAuB,mCAAS,KAAK;AAAA;AAAA,QACvC;AAAA,MACF;AACA,UAAI,QAAQ,YAAY;AACtB,mBAAW,CAAC,WAAW,cAAc,KAAK,OAAO,QAAQ,OAAO,GAG3D;AACH,wBAAc,IAAI;AAAA,YAChB,KAAK,SAAS,QAAQ,OAAO,eAAe,MAAM;AAAA,cAChD,GAAG,cAAc,eAAe;AAAA,YAClC,OAAO,eAAe;AAAA,UACxB;AACA,cAAI,eAAe;AACjB,0BAAc,SAAS,IAAI,cAAc,OAAO,KAAK,IAAI;AAAA,cACvD,kBAAkB,eAAe,IAAI;AAAA,YACvC;AAAA;AACF,cAAI,eAAe;AACjB,2BAAe,SAAS,IAAI;AAAA,cAC1B;AAAA,YACF,KAAK,IAAI,UAAU,eAAe,KAAK;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AACA,YAAQ,IAAI,UAAU;AACtB,QAAI,aAAa;AACf,YAAM,SAAS;AACf,YAAM,UAAU;AAChB,cAAQ;AAAA,QACN,YAAY;AAAA,UACV,IAAI,OAAO,SAAS,QAAQ,SAAS,MAAM;AAAA,UAC3C,UAAU;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AACA,QAAI;AAAY,cAAQ,IAAI,UAAU;AACtC,QAAI;AAAa,cAAQ,IAAI,WAAW;AAAA,EAC1C;AACF;AAKO,MAAM,4BAA4B,CACvC,EAAE,KAAK,SAAS,GAChB,WACG;AACH,aAAW,CAAC,QAAQ,GAAG,KAAK,OAAO,QAAQ,MAAM,GAG5C;AACH,QAAI,2BAAK,QAAQ;AACf,UAAI,WAAW,UAAU;AACvB,cAAM,SAAkC;AACxC,YAAI;AAAA,UACF,OAAO,aAAa,SAAS,QAAQ,OAAO,OAAO,MAAM;AAAA,YACvD,IAAI,IAAI,QAAM,GAAG,EAAE,EAAE,KAAK,IAAI;AAAA,UAChC;AAAA;AAAA,QACF;AACA,mBAAW,CAAC,eAAe,KAAK,KAAK;AACnC,cAAI;AAAA,YACF,GAAG,IAAI,cAAc,aAAa,MAAM,MAAM;AAAA,YAC9C;AAAA,UACF;AAAA,MACJ;AACE,YAAI;AAAA,UACF,OAAO,aAAa,SAAS,QAAQ,OAAO,OAAO,MAAM;AAAA,YACvD,IAAI,KAAK,IAAI;AAAA,UACf;AAAA,QACF;AAAA,IACJ;AAAA,EACF;AACF;",
4
+ "sourcesContent": ["import dayjs from 'dayjs';\nimport { BlockVersion, MigrateModelsResult, MigrateStatus } from 'migratortron';\nimport ContensisCli from '~/services/ContensisCliService';\nimport { Logger } from './logger';\n\nconst formatDate = (date: Date | string, format = 'DD/MM/YYYY HH:mm') =>\n dayjs(date).format(format);\n\nexport const printBlockVersion = (\n { log, messages }: ContensisCli,\n block: BlockVersion,\n printOptions = {\n showSource: true,\n showStatus: true,\n showStaticPaths: true,\n showImage: true,\n }\n) => {\n console.log(\n ` ${log.standardText(`v${block.version.versionNo}`)} ${block.id}`\n );\n console.log(\n ` state: ${messages.blocks.runningStatus(\n block.status.broken ? 'broken' : block.status.running.global\n )}`\n );\n console.log(\n ` released: ${log.infoText(\n block.version.released\n ? `[${formatDate(block.version.released)}] ${block.version.releasedBy}`\n : 'no'\n )}`\n );\n if (block.version.madeLive)\n console.log(\n ` live: ${log.infoText(\n `[${formatDate(block.version.madeLive)}] ${block.version.madeLiveBy}`\n )}`\n );\n if (printOptions.showStatus) {\n console.log(` status:`);\n console.log(` deployment: ${log.infoText(block.status.deployment)}`);\n console.log(` workflow: ${log.infoText(block.status.workflow)}`);\n console.log(\n ` running status: ${messages.blocks.runningStatus(\n block.status.running.global\n )}`\n );\n console.log(` datacentres:`);\n console.log(\n ` hq: ${messages.blocks.runningStatus(\n block.status.running.dataCenters.hq\n )}`\n );\n console.log(\n ` london: ${messages.blocks.runningStatus(\n block.status.running.dataCenters.london\n )}`\n );\n console.log(\n ` manchester: ${messages.blocks.runningStatus(\n block.status.running.dataCenters.manchester\n )}`\n );\n }\n if (printOptions.showSource) {\n console.log(` source:`);\n console.log(` commit: ${log.helpText(block.source.commit.id)}`);\n console.log(\n ` message: ${log.infoText(\n block.source.commit.message\n ?.replaceAll('\\n', '\\\\n')\n .replaceAll('\\\\n\\\\n', '\\\\n')\n .replaceAll('\\\\n', '; ')\n )}`\n );\n console.log(\n ` committed: ${log.infoText(\n `[${formatDate(block.source.commit.dateTime)}] ${\n block.source.commit.authorEmail\n }`\n )}`\n );\n console.log(\n ` pushed: ${log.infoText(\n `[${formatDate(block.version.pushed)}] ${block.version.pushedBy}`\n )}`\n );\n console.log(` ${log.infoText(block.source.commit.commitUrl)}`);\n }\n if (printOptions.showImage) {\n console.log(` image:`);\n console.log(` uri: ${log.infoText(block.image.uri)}`);\n console.log(` tag: ${log.helpText(block.image.tag)}`);\n }\n if (printOptions.showStaticPaths) {\n if (block.staticPaths?.length) {\n console.log(` static paths:`);\n for (const path of block.staticPaths) console.log(` - ${path}`);\n }\n }\n if (block.stagingUrl)\n console.log(` staging url: ${log.infoText(block.stagingUrl)}`);\n console.log('');\n};\n\nexport const printMigrateResult = (\n { log, messages, contensis, currentProject }: ContensisCli,\n migrateResult: any,\n {\n action = 'import',\n showDiff = false,\n showAllEntries = false,\n showChangedEntries = false,\n }: {\n action?: 'import' | 'delete';\n showDiff?: boolean;\n showAllEntries?: boolean;\n showChangedEntries?: boolean;\n } = {}\n) => {\n if (Object.keys(migrateResult.entriesToMigrate.entryIds).length)\n console.log(``);\n\n for (const [contentTypeId, entryRes] of Object.entries(\n migrateResult.entriesToMigrate.entryIds\n ) as [string, any]) {\n for (const [originalId, entryStatus] of Object.entries(entryRes) as [\n string,\n any\n ][]) {\n // console.log(`${log.helpText(contentTypeId)} ${entryStatus.entryTitle}`);\n if (\n showAllEntries ||\n (showChangedEntries &&\n (\n Object.entries(\n Object.entries(entryStatus[currentProject])[0]\n )[1][1] as any\n ).status !== 'no change')\n ) {\n console.log(\n log.infoText(\n `${originalId} ${Object.entries(entryStatus || {})\n .filter(x => x[0] !== 'entryTitle')\n .map(([projectId, projectStatus]) => {\n const [targetGuid, { status }] = (Object.entries(\n projectStatus || {}\n )?.[0] as [string, { status: MigrateStatus }]) || [\n '',\n { x: { status: undefined } },\n ];\n return `${messages.migrate.status(status)(`${status}`)}${\n targetGuid !== originalId ? `-> ${targetGuid}` : ''\n }`;\n })}`\n ) + ` ${log.helpText(contentTypeId)} ${entryStatus.entryTitle}`\n );\n\n for (const [projectId, projectStatus] of Object.entries(\n entryStatus\n ).filter(([key]) => key !== 'entryTitle') as [string, any][]) {\n const [targetGuid, { error, diff, status }] = Object.entries(\n projectStatus\n )[0] as [string, any];\n if (error) log.error(error);\n if (diff && showDiff) {\n console.log(\n ` ${log.highlightText(`diff:`)} ${log.infoText(\n highlightDiffText(diff)\n )}\\n`\n );\n }\n }\n }\n }\n }\n console.log(``);\n if (\n contensis?.isPreview &&\n migrateResult.entriesToMigrate?.[currentProject]?.totalCount > 0 &&\n !migrateResult.errors\n ) {\n log.help(messages.entries.commitTip());\n }\n\n if (action === 'import') {\n for (const [projectId, contentTypeCounts] of Object.entries(\n migrateResult.entries || {}\n ) as [string, any][]) {\n log.help(\n `import from project ${log.highlightText(projectId)} to ${log.boldText(\n log.warningText(currentProject)\n )}`\n );\n for (const [contentTypeId, count] of Object.entries(\n contentTypeCounts\n ) as [string, number][]) {\n const migrateStatusAndCount =\n migrateResult.entriesToMigrate[currentProject][contentTypeId];\n const existingCount =\n migrateResult.existing?.[currentProject]?.[contentTypeId] || 0;\n const existingPercent = ((existingCount / count) * 100).toFixed(0);\n const noChangeOrTotalEntriesCount =\n typeof migrateStatusAndCount !== 'number'\n ? migrateStatusAndCount?.['no change'] || 0\n : migrateStatusAndCount;\n\n const isTotalCountRow = contentTypeId === 'totalCount';\n\n const changedPercentage = (\n (noChangeOrTotalEntriesCount / count) *\n 100\n ).toFixed(0);\n\n const existingColor =\n existingPercent === '0' ? log.warningText : log.infoText;\n const changedColor = isTotalCountRow\n ? log.helpText\n : changedPercentage === '100'\n ? log.successText\n : log.warningText;\n\n console.log(\n ` - ${\n isTotalCountRow\n ? log.highlightText(`${contentTypeId}: ${count}`)\n : `${contentTypeId}: ${log.helpText(count)}`\n }${\n changedPercentage === '100'\n ? ''\n : existingColor(\n ` [existing: ${\n isTotalCountRow ? existingCount : `${existingPercent}%`\n }]`\n )\n }${\n existingPercent === '0'\n ? ''\n : changedColor(\n ` ${\n isTotalCountRow\n ? `[to change: ${noChangeOrTotalEntriesCount}]`\n : changedPercentage === '100'\n ? 'up to date'\n : `[needs update: ${100 - Number(changedPercentage)}%]`\n }`\n )\n }`\n );\n }\n }\n if (migrateResult.errors?.length) {\n console.log(\n ` - ${log.errorText(`errors: ${migrateResult.errors.length}`)}\\n`\n );\n for (const error of migrateResult.errors)\n log.error(error.message || error);\n }\n }\n};\n\nconst highlightDiffText = (str: string) => {\n const addedRegex = new RegExp(/<<\\+>>(.*?)<<\\/\\+>>/, 'g');\n const removedRegex = new RegExp(/<<->>(.*?)<<\\/->>/, 'g');\n return str\n .replace(addedRegex, match => {\n return Logger.successText(\n match.replace(/<<\\+>>/g, '<+>').replace(/<<\\/\\+>>/g, '</+>')\n );\n })\n .replace(removedRegex, match => {\n return Logger.errorText(\n match.replace(/<<->>/g, '<->').replace(/<<\\/->>/g, '</->')\n );\n });\n};\n\nexport const printModelMigrationAnalysis = (\n { log, messages }: ContensisCli,\n result: any = {}\n) => {\n for (const [contentTypeId, model] of Object.entries(result) as [\n string,\n any\n ][]) {\n let mainOutput = log.standardText(` - ${contentTypeId}`);\n let extraOutput = '';\n let errorOutput = '';\n let diffOutput = '';\n for (const [key, details] of Object.entries(model) as [string, any][]) {\n if (key === 'dependencies') {\n extraOutput += log.infoText(\n ` references: [${details?.join(', ')}]\\n`\n );\n }\n if (key === 'dependencyOf') {\n extraOutput += log.infoText(\n ` required by: [${details?.join(', ')}]\\n`\n );\n }\n if (key === 'projects') {\n for (const [projectId, projectDetails] of Object.entries(details) as [\n string,\n any\n ][]) {\n mainOutput += log.infoText(\n ` [${messages.migrate.status(projectDetails.status)(\n `${projectId}: ${projectDetails.status}`\n )}] v${projectDetails.versionNo}`\n );\n if (projectDetails.diff)\n diffOutput += ` ${log.highlightText(`diff:`)} ${log.infoText(\n highlightDiffText(projectDetails.diff)\n )}\\n`;\n if (projectDetails.error)\n errorOutput += ` ${log.highlightText(\n `error::`\n )} ${log.errorText(projectDetails.error)}`;\n }\n }\n }\n console.log(mainOutput);\n if (extraOutput) {\n const search = '\\n';\n const replace = '';\n console.log(\n extraOutput.replace(\n new RegExp(search + '([^' + search + ']*)$'),\n replace + '$1'\n )\n );\n }\n if (diffOutput) console.log(diffOutput);\n if (errorOutput) console.log(errorOutput);\n }\n};\n\ntype MigrateResultSummary = MigrateModelsResult['']['contentTypes'];\ntype MigrateResultStatus = keyof MigrateResultSummary;\n\nexport const printModelMigrationResult = (\n { log, messages }: ContensisCli,\n result: MigrateResultSummary\n) => {\n for (const [status, ids] of Object.entries(result) as [\n MigrateResultStatus,\n string[]\n ][]) {\n if (ids?.length) {\n if (status === 'errors') {\n const errors: [string, MappedError][] = ids as any;\n log.raw(\n ` - ${status}: [ ${messages.migrate.models.result(status)(\n ids.map(id => id[0]).join(', ')\n )} ]\\n`\n );\n for (const [contentTypeId, error] of errors)\n log.error(\n `${log.highlightText(contentTypeId)}: ${error.message}`,\n error\n );\n } else\n log.raw(\n ` - ${status}: [ ${messages.migrate.models.result(status)(\n ids.join(', ')\n )} ]`\n );\n }\n }\n};\n"],
5
+ "mappings": "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",
6
6
  "names": ["dayjs", "_a"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/util/csv.formatter.ts"],
4
- "sourcesContent": ["import { flatten } from 'flat';\r\nimport { Parser } from 'json2csv';\r\nimport cleaner from 'deep-cleaner';\r\n\r\nconst flattenObject = (obj: any) => flatten(cleaner(obj, ['workflow']));\r\n\r\nexport const csvFormatter = <T>(entries: T | T[]) => {\r\n // Flatten the passed in object\r\n const flatEntries = [];\r\n if (Array.isArray(entries))\r\n for (const entry of entries) {\r\n flatEntries.push(flattenObject(entry));\r\n }\r\n else flatEntries.push(flattenObject(entries));\r\n\r\n // Parse the flattened object to csv\r\n const json2csvParser = new Parser();\r\n const csv = json2csvParser.parse(flatEntries);\r\n\r\n return csv;\r\n};\r\n"],
4
+ "sourcesContent": ["import { flatten } from 'flat';\nimport { Parser } from 'json2csv';\nimport cleaner from 'deep-cleaner';\n\nconst flattenObject = (obj: any) => flatten(cleaner(obj, ['workflow']));\n\nexport const csvFormatter = <T>(entries: T | T[]) => {\n // Flatten the passed in object\n const flatEntries = [];\n if (Array.isArray(entries))\n for (const entry of entries) {\n flatEntries.push(flattenObject(entry));\n }\n else flatEntries.push(flattenObject(entries));\n\n // Parse the flattened object to csv\n const json2csvParser = new Parser();\n const csv = json2csvParser.parse(flatEntries);\n\n return csv;\n};\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAAwB;AACxB,sBAAuB;AACvB,0BAAoB;AAEpB,MAAM,gBAAgB,CAAC,YAAa,yBAAQ,oBAAAA,SAAQ,KAAK,CAAC,UAAU,CAAC,CAAC;AAE/D,MAAM,eAAe,CAAI,YAAqB;AAEnD,QAAM,cAAc,CAAC;AACrB,MAAI,MAAM,QAAQ,OAAO;AACvB,eAAW,SAAS,SAAS;AAC3B,kBAAY,KAAK,cAAc,KAAK,CAAC;AAAA,IACvC;AAAA;AACG,gBAAY,KAAK,cAAc,OAAO,CAAC;AAG5C,QAAM,iBAAiB,IAAI,uBAAO;AAClC,QAAM,MAAM,eAAe,MAAM,WAAW;AAE5C,SAAO;AACT;",
6
6
  "names": ["cleaner"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/util/index.ts"],
4
- "sourcesContent": ["import mergeWith from 'lodash/mergeWith';\r\nimport { Logger } from './logger';\r\nimport { LogMessages as enGB } from '../localisation/en-GB.js';\r\n\r\nexport const isSharedSecret = (str = '') =>\r\n str.length > 80 && str.split('-').length === 3 ? str : undefined;\r\n\r\nexport const isPassword = (str = '') =>\r\n !isSharedSecret(str) ? str : undefined;\r\n\r\nexport const tryParse = (str: string) => {\r\n try {\r\n return typeof str === 'object' ? str : JSON.parse(str);\r\n } catch (e) {\r\n return false;\r\n }\r\n};\r\n\r\nexport const isJson = (str: string) =>\r\n typeof str === 'object' || !!tryParse(str);\r\n\r\nexport const tryStringify = (obj: any) => {\r\n try {\r\n return typeof obj === 'object' ? JSON.stringify(obj) : obj;\r\n } catch (e) {\r\n return obj;\r\n }\r\n};\r\n\r\nexport const isUuid = (str: string) => {\r\n // Regular expression to check if string is a valid UUID\r\n const regexExp =\r\n /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/gi;\r\n\r\n return regexExp.test(str);\r\n};\r\n\r\nexport const url = (alias: string, project: string) => {\r\n const projectAndAlias =\r\n project && project.toLowerCase() !== 'website'\r\n ? `${project.toLowerCase()}-${alias}`\r\n : alias;\r\n return {\r\n api: `https://api-${alias}.cloud.contensis.com`,\r\n cms: `https://cms-${alias}.cloud.contensis.com`,\r\n liveWeb: `https://live-${projectAndAlias}.cloud.contensis.com`,\r\n previewWeb: `https://preview-${projectAndAlias}.cloud.contensis.com`,\r\n iisWeb: `https://iis-live-${projectAndAlias}.cloud.contensis.com`,\r\n iisPreviewWeb: `https://iis-preview-${projectAndAlias}.cloud.contensis.com`,\r\n };\r\n};\r\n\r\nexport const Logging = async (language = 'en-GB') => {\r\n const defaultMessages = enGB;\r\n // const { LogMessages: defaultMessages } = await import(\r\n // `../localisation/en-GB.js`\r\n // );\r\n let localisedMessages = defaultMessages;\r\n\r\n if (language === 'en-GB') {\r\n // Using a variable import e.g. `import(`../localisation/${language}.js`);`\r\n // does not play well with packaged executables\r\n // So we have to hard code the import for each language individually\r\n }\r\n return {\r\n messages: mergeWith(\r\n localisedMessages,\r\n defaultMessages,\r\n (v, s) => v || s\r\n ) as typeof defaultMessages,\r\n Log: Logger,\r\n };\r\n};\r\n"],
4
+ "sourcesContent": ["import mergeWith from 'lodash/mergeWith';\nimport { Logger } from './logger';\nimport { LogMessages as enGB } from '../localisation/en-GB.js';\n\nexport const isSharedSecret = (str = '') =>\n str.length > 80 && str.split('-').length === 3 ? str : undefined;\n\nexport const isPassword = (str = '') =>\n !isSharedSecret(str) ? str : undefined;\n\nexport const tryParse = (str: string) => {\n try {\n return typeof str === 'object' ? str : JSON.parse(str);\n } catch (e) {\n return false;\n }\n};\n\nexport const isJson = (str: string) =>\n typeof str === 'object' || !!tryParse(str);\n\nexport const tryStringify = (obj: any) => {\n try {\n return typeof obj === 'object' ? JSON.stringify(obj) : obj;\n } catch (e) {\n return obj;\n }\n};\n\nexport const isUuid = (str: string) => {\n // Regular expression to check if string is a valid UUID\n const regexExp =\n /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/gi;\n\n return regexExp.test(str);\n};\n\nexport const url = (alias: string, project: string) => {\n const projectAndAlias =\n project && project.toLowerCase() !== 'website'\n ? `${project.toLowerCase()}-${alias}`\n : alias;\n return {\n api: `https://api-${alias}.cloud.contensis.com`,\n cms: `https://cms-${alias}.cloud.contensis.com`,\n liveWeb: `https://live-${projectAndAlias}.cloud.contensis.com`,\n previewWeb: `https://preview-${projectAndAlias}.cloud.contensis.com`,\n iisWeb: `https://iis-live-${projectAndAlias}.cloud.contensis.com`,\n iisPreviewWeb: `https://iis-preview-${projectAndAlias}.cloud.contensis.com`,\n };\n};\n\nexport const Logging = async (language = 'en-GB') => {\n const defaultMessages = enGB;\n // const { LogMessages: defaultMessages } = await import(\n // `../localisation/en-GB.js`\n // );\n let localisedMessages = defaultMessages;\n\n if (language === 'en-GB') {\n // Using a variable import e.g. `import(`../localisation/${language}.js`);`\n // does not play well with packaged executables\n // So we have to hard code the import for each language individually\n }\n return {\n messages: mergeWith(\n localisedMessages,\n defaultMessages,\n (v, s) => v || s\n ) as typeof defaultMessages,\n Log: Logger,\n };\n};\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAsB;AACtB,oBAAuB;AACvB,mBAAoC;AAE7B,MAAM,iBAAiB,CAAC,MAAM,OACnC,IAAI,SAAS,MAAM,IAAI,MAAM,GAAG,EAAE,WAAW,IAAI,MAAM;AAElD,MAAM,aAAa,CAAC,MAAM,OAC/B,CAAC,eAAe,GAAG,IAAI,MAAM;AAExB,MAAM,WAAW,CAAC,QAAgB;AACvC,MAAI;AACF,WAAO,OAAO,QAAQ,WAAW,MAAM,KAAK,MAAM,GAAG;AAAA,EACvD,SAAS,GAAP;AACA,WAAO;AAAA,EACT;AACF;AAEO,MAAM,SAAS,CAAC,QACrB,OAAO,QAAQ,YAAY,CAAC,CAAC,SAAS,GAAG;AAEpC,MAAM,eAAe,CAAC,QAAa;AACxC,MAAI;AACF,WAAO,OAAO,QAAQ,WAAW,KAAK,UAAU,GAAG,IAAI;AAAA,EACzD,SAAS,GAAP;AACA,WAAO;AAAA,EACT;AACF;AAEO,MAAM,SAAS,CAAC,QAAgB;AAErC,QAAM,WACJ;AAEF,SAAO,SAAS,KAAK,GAAG;AAC1B;AAEO,MAAM,MAAM,CAAC,OAAe,YAAoB;AACrD,QAAM,kBACJ,WAAW,QAAQ,YAAY,MAAM,YACjC,GAAG,QAAQ,YAAY,KAAK,UAC5B;AACN,SAAO;AAAA,IACL,KAAK,eAAe;AAAA,IACpB,KAAK,eAAe;AAAA,IACpB,SAAS,gBAAgB;AAAA,IACzB,YAAY,mBAAmB;AAAA,IAC/B,QAAQ,oBAAoB;AAAA,IAC5B,eAAe,uBAAuB;AAAA,EACxC;AACF;AAEO,MAAM,UAAU,OAAO,WAAW,YAAY;AACnD,QAAM,kBAAkB,aAAAA;AAIxB,MAAI,oBAAoB;AAExB,MAAI,aAAa,SAAS;AAAA,EAI1B;AACA,SAAO;AAAA,IACL,cAAU,iBAAAC;AAAA,MACR;AAAA,MACA;AAAA,MACA,CAAC,GAAG,MAAM,KAAK;AAAA,IACjB;AAAA,IACA,KAAK;AAAA,EACP;AACF;",
6
6
  "names": ["enGB", "mergeWith"]
7
7
  }