contensis-cli 1.3.1-beta.5 → 1.3.1-beta.6

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.
@@ -85,8 +85,8 @@ const output = new import_commander.Option(
85
85
  );
86
86
  const format = new import_commander.Option(
87
87
  "-f --format <format>",
88
- "format output as csv, json, xml or table (default)"
89
- ).choices(["csv", "json", "xml", "table"]);
88
+ "format output as csv, json, html, xml or default"
89
+ ).choices(["csv", "json", "html", "xml", "table"]);
90
90
  const alias = new import_commander.Option(
91
91
  "-a --alias <alias>",
92
92
  "the cloud CMS alias to connect your request with"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/commands/globalOptions.ts"],
4
- "sourcesContent": ["import { Command, Option } from 'commander';\nimport { MigrateRequest } from 'migratortron';\nimport { url } from '~/util';\n\n// Map various input options into a request to be processed\n// by Migratortron / Contensis import library\nexport const mapContensisOpts = (opts: any = {}): MigrateRequest => ({\n source:\n opts.sourceAlias || opts.sourceProjectId\n ? {\n url: opts.sourceAlias\n ? url(opts.sourceAlias, 'website').cms\n : (undefined as any),\n project: opts.sourceProjectId || (undefined as any),\n }\n : undefined,\n models: opts.modelIds,\n copyField: opts.copyField,\n // convert various cli options into MigrateRequest.query format\n query:\n opts.id ||\n opts.entryIds ||\n opts.search ||\n opts.fields ||\n opts.orderBy ||\n opts.paths ||\n opts.assetType ||\n opts.contentType ||\n opts.dataFormat ||\n opts.deliveryApi ||\n opts.latest ||\n opts.versionStatus\n ? {\n assetTypes: opts.assetType,\n contentTypeIds: opts.contentType,\n dataFormats: opts.dataFormat ? [opts.dataFormat] : undefined,\n fields: opts.fields,\n includeIds: opts.id || opts.entryIds,\n includePaths: opts.paths,\n orderBy: opts.orderBy,\n searchTerm: opts.search,\n useDelivery: opts.deliveryApi,\n versionStatus: opts.latest ? 'latest' : opts.versionStatus,\n }\n : undefined,\n zenQL: opts.zenql,\n transformGuids: !opts.preserveGuids,\n ignoreErrors: opts.ignoreErrors,\n noCache: !opts.cache, // arg is inverted automatically from `--no-cache` to `cache: false`\n includeDefaults: opts.defaults, // arg is inverted automatically from `--no-defaults` to `defaults: false`\n concurrency: opts.concurrency ? Number(opts.concurrency) : undefined,\n noPublish: !opts.publish, // arg is inverted automatically from `--no-publish` to `publish: false`\n});\n\n/* Output options */\nconst output = new Option(\n '-o --output <output>',\n 'save output to a file e.g. --output ./output.txt'\n);\n\nconst format = new Option(\n '-f --format <format>',\n 'format output as csv, json, xml or table (default)'\n).choices(['csv', 'json', 'xml', 'table']);\n\n/* Connect options */\nconst alias = new Option(\n '-a --alias <alias>',\n 'the cloud CMS alias to connect your request with'\n);\n\nexport const project = new Option(\n '-p --project-id <projectId>',\n 'the projectId to make your request with'\n);\n\n/* Authentication options */\nconst user = new Option(\n '-u --user <user>',\n 'the username to authenticate your request with'\n);\nconst password = new Option(\n '-pw --password <password>',\n 'the password to use to login with (optional/insecure)'\n);\nconst clientId = new Option(\n '-id --client-id <clientId>',\n 'the clientId to authenticate your request with'\n);\nconst sharedSecret = new Option(\n '-s --shared-secret <sharedSecret>',\n 'the shared secret to use when logging in with a client id'\n);\n\n/* Model get options */\nexport const requiredBy = new Option(\n '--required-by',\n 'shows the id(s) that created each dependency'\n);\nexport const exportOption = new Option(\n '--export',\n 'export the raw resources that make up the content model(s) (used with --output)'\n);\n\n/* Entry get options */\nexport const delivery = new Option(\n '-delivery --delivery-api',\n 'use delivery api to get the entries'\n);\nexport const search = new Option(\n '--search <phrase>',\n 'get entries with the search phrase, use quotes for multiple words'\n);\nexport const zenql = new Option(\n '-q --zenql <zenql>',\n 'get entries with a supplied ZenQL statement'\n);\n\nexport const entryId = new Option('-i --id <id...>', 'the entry id(s) to get');\nexport const contentTypes = new Option(\n '-c --content-type <contentType...>',\n 'get entries of these content type(s)'\n);\nexport const assetTypes = new Option(\n '-at --asset-type <assetType...>',\n 'get assets of given content type(s) e.g. image word pdf'\n);\nexport const versionStatus = new Option(\n '-vs --version-status <versionStatus>',\n 'the entry versions to get'\n)\n .choices(['latest', 'published'])\n .default('published');\n\nexport const latest = new Option('--latest', 'get the latest entry versions');\n\n/* Import options */\nexport const fromFile = new Option(\n '-file --from-file <fromFile>',\n 'file path to import asset(s) from'\n);\n\nexport const fromCms = new Option(\n '-source --source-alias <fromCms>',\n 'the cloud CMS alias to import asset(s) from'\n);\nexport const fromProject = new Option(\n '-sp --source-project-id <fromProject>',\n 'the id of the Contensis project to import asset(s) from (Default: [last connected project])'\n);\n\nexport const commit = new Option(\n '--commit',\n 'add this flag only after you have run a preview of the import and agree with the analysis'\n).default(false);\n\nexport const ignoreErrors = new Option(\n '-ignore --ignore-errors',\n 'commit the import ignoring any reported errors'\n).default(false);\n\nexport const outputDetail = new Option(\n '-od --output-detail <outputDetail>',\n 'how much detail to output from the import'\n)\n .choices(['errors', 'changes', 'all'])\n .default('errors');\n\nexport const saveEntries = new Option(\n '-save --save-entries',\n \"save the entries we're migrating instead of the migration preview (used with --output)\"\n);\n\nexport const concurrency = new Option(\n '-conc --concurrency <concurrency>',\n 'the number of entries to load in parallel'\n).default(2);\n\nexport const noCache = new Option(\n '--no-cache',\n 'ignore internal cache and rebuild all resources from scratch'\n);\n\nexport const noPublish = new Option(\n '--no-publish',\n 'don\\'t publish created or updated entries'\n);\n\nexport const addConnectOptions = (program: Command) =>\n program.addOption(alias.hideHelp()).addOption(project.hideHelp());\n\nexport const addAuthenticationOptions = (program: Command) =>\n program\n .addOption(user.hideHelp())\n .addOption(password.hideHelp())\n .addOption(clientId.hideHelp())\n .addOption(sharedSecret.hideHelp());\n\nconst addOutputAndFormatOptions = (program: Command) =>\n program.addOption(output).addOption(format);\n\nexport const addImportOptions = (program: Command) => {\n for (const command of program.commands) {\n command.addOption(fromCms).addOption(fromProject).addOption(fromFile);\n }\n return program;\n};\n\nexport const addGlobalOptions = (program: Command) => {\n for (const command of program.commands) {\n addOutputAndFormatOptions(command);\n addConnectOptions(command);\n addAuthenticationOptions(command);\n }\n return program;\n};\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { Command, Option } from 'commander';\nimport { MigrateRequest } from 'migratortron';\nimport { url } from '~/util';\n\n// Map various input options into a request to be processed\n// by Migratortron / Contensis import library\nexport const mapContensisOpts = (opts: any = {}): MigrateRequest => ({\n source:\n opts.sourceAlias || opts.sourceProjectId\n ? {\n url: opts.sourceAlias\n ? url(opts.sourceAlias, 'website').cms\n : (undefined as any),\n project: opts.sourceProjectId || (undefined as any),\n }\n : undefined,\n models: opts.modelIds,\n copyField: opts.copyField,\n // convert various cli options into MigrateRequest.query format\n query:\n opts.id ||\n opts.entryIds ||\n opts.search ||\n opts.fields ||\n opts.orderBy ||\n opts.paths ||\n opts.assetType ||\n opts.contentType ||\n opts.dataFormat ||\n opts.deliveryApi ||\n opts.latest ||\n opts.versionStatus\n ? {\n assetTypes: opts.assetType,\n contentTypeIds: opts.contentType,\n dataFormats: opts.dataFormat ? [opts.dataFormat] : undefined,\n fields: opts.fields,\n includeIds: opts.id || opts.entryIds,\n includePaths: opts.paths,\n orderBy: opts.orderBy,\n searchTerm: opts.search,\n useDelivery: opts.deliveryApi,\n versionStatus: opts.latest ? 'latest' : opts.versionStatus,\n }\n : undefined,\n zenQL: opts.zenql,\n transformGuids: !opts.preserveGuids,\n ignoreErrors: opts.ignoreErrors,\n noCache: !opts.cache, // arg is inverted automatically from `--no-cache` to `cache: false`\n includeDefaults: opts.defaults, // arg is inverted automatically from `--no-defaults` to `defaults: false`\n concurrency: opts.concurrency ? Number(opts.concurrency) : undefined,\n noPublish: !opts.publish, // arg is inverted automatically from `--no-publish` to `publish: false`\n});\n\n/* Output options */\nconst output = new Option(\n '-o --output <output>',\n 'save output to a file e.g. --output ./output.txt'\n);\n\nconst format = new Option(\n '-f --format <format>',\n 'format output as csv, json, html, xml or default'\n).choices(['csv', 'json', 'html', 'xml', 'table']);\n\n/* Connect options */\nconst alias = new Option(\n '-a --alias <alias>',\n 'the cloud CMS alias to connect your request with'\n);\n\nexport const project = new Option(\n '-p --project-id <projectId>',\n 'the projectId to make your request with'\n);\n\n/* Authentication options */\nconst user = new Option(\n '-u --user <user>',\n 'the username to authenticate your request with'\n);\nconst password = new Option(\n '-pw --password <password>',\n 'the password to use to login with (optional/insecure)'\n);\nconst clientId = new Option(\n '-id --client-id <clientId>',\n 'the clientId to authenticate your request with'\n);\nconst sharedSecret = new Option(\n '-s --shared-secret <sharedSecret>',\n 'the shared secret to use when logging in with a client id'\n);\n\n/* Model get options */\nexport const requiredBy = new Option(\n '--required-by',\n 'shows the id(s) that created each dependency'\n);\nexport const exportOption = new Option(\n '--export',\n 'export the raw resources that make up the content model(s) (used with --output)'\n);\n\n/* Entry get options */\nexport const delivery = new Option(\n '-delivery --delivery-api',\n 'use delivery api to get the entries'\n);\nexport const search = new Option(\n '--search <phrase>',\n 'get entries with the search phrase, use quotes for multiple words'\n);\nexport const zenql = new Option(\n '-q --zenql <zenql>',\n 'get entries with a supplied ZenQL statement'\n);\n\nexport const entryId = new Option('-i --id <id...>', 'the entry id(s) to get');\nexport const contentTypes = new Option(\n '-c --content-type <contentType...>',\n 'get entries of these content type(s)'\n);\nexport const assetTypes = new Option(\n '-at --asset-type <assetType...>',\n 'get assets of given content type(s) e.g. image word pdf'\n);\nexport const versionStatus = new Option(\n '-vs --version-status <versionStatus>',\n 'the entry versions to get'\n)\n .choices(['latest', 'published'])\n .default('published');\n\nexport const latest = new Option('--latest', 'get the latest entry versions');\n\n/* Import options */\nexport const fromFile = new Option(\n '-file --from-file <fromFile>',\n 'file path to import asset(s) from'\n);\n\nexport const fromCms = new Option(\n '-source --source-alias <fromCms>',\n 'the cloud CMS alias to import asset(s) from'\n);\nexport const fromProject = new Option(\n '-sp --source-project-id <fromProject>',\n 'the id of the Contensis project to import asset(s) from (Default: [last connected project])'\n);\n\nexport const commit = new Option(\n '--commit',\n 'add this flag only after you have run a preview of the import and agree with the analysis'\n).default(false);\n\nexport const ignoreErrors = new Option(\n '-ignore --ignore-errors',\n 'commit the import ignoring any reported errors'\n).default(false);\n\nexport const outputDetail = new Option(\n '-od --output-detail <outputDetail>',\n 'how much detail to output from the import'\n)\n .choices(['errors', 'changes', 'all'])\n .default('errors');\n\nexport const saveEntries = new Option(\n '-save --save-entries',\n \"save the entries we're migrating instead of the migration preview (used with --output)\"\n);\n\nexport const concurrency = new Option(\n '-conc --concurrency <concurrency>',\n 'the number of entries to load in parallel'\n).default(2);\n\nexport const noCache = new Option(\n '--no-cache',\n 'ignore internal cache and rebuild all resources from scratch'\n);\n\nexport const noPublish = new Option(\n '--no-publish',\n \"don't publish created or updated entries\"\n);\n\nexport const addConnectOptions = (program: Command) =>\n program.addOption(alias.hideHelp()).addOption(project.hideHelp());\n\nexport const addAuthenticationOptions = (program: Command) =>\n program\n .addOption(user.hideHelp())\n .addOption(password.hideHelp())\n .addOption(clientId.hideHelp())\n .addOption(sharedSecret.hideHelp());\n\nconst addOutputAndFormatOptions = (program: Command) =>\n program.addOption(output).addOption(format);\n\nexport const addImportOptions = (program: Command) => {\n for (const command of program.commands) {\n command.addOption(fromCms).addOption(fromProject).addOption(fromFile);\n }\n return program;\n};\n\nexport const addGlobalOptions = (program: Command) => {\n for (const command of program.commands) {\n addOutputAndFormatOptions(command);\n addConnectOptions(command);\n addAuthenticationOptions(command);\n }\n return program;\n};\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/models/CliService.d.ts"],
4
- "sourcesContent": ["export type CliUrls =\n | {\n api: string;\n cms: string;\n liveWeb: string;\n previewWeb: string;\n iisWeb: string;\n iisPreviewWeb: string;\n }\n | undefined;\n\nexport type OutputFormat = 'json' | 'csv' | 'xml';\n\nexport type OutputOptions = {\n format?: OutputFormat;\n output?: string;\n};\n\nexport interface IConnectOptions extends IAuthOptions {\n alias?: string;\n projectId?: string;\n}\n\nexport interface IAuthOptions {\n user?: string;\n password?: string;\n clientId?: string;\n sharedSecret?: string;\n}\n\nexport interface IImportOptions {\n sourceAlias?: string;\n sourceProjectId?: string;\n}\n\nexport type OutputOptionsConstructorArg = OutputOptions &\n IConnectOptions &\n IImportOptions;\n\nexport interface ContensisCliConstructor {\n new (\n args: string[],\n outputOpts?: OutputOptionsConstructorArg,\n contensisOpts?: Partial<MigrateRequest>\n ): ContensisCli;\n}\n"],
4
+ "sourcesContent": ["export type CliUrls =\n | {\n api: string;\n cms: string;\n liveWeb: string;\n previewWeb: string;\n iisWeb: string;\n iisPreviewWeb: string;\n }\n | undefined;\n\nexport type OutputFormat = 'json' | 'csv' | 'html' | 'xml';\n\nexport type OutputOptions = {\n format?: OutputFormat;\n output?: string;\n};\n\nexport interface IConnectOptions extends IAuthOptions {\n alias?: string;\n projectId?: string;\n}\n\nexport interface IAuthOptions {\n user?: string;\n password?: string;\n clientId?: string;\n sharedSecret?: string;\n}\n\nexport interface IImportOptions {\n sourceAlias?: string;\n sourceProjectId?: string;\n}\n\nexport type OutputOptionsConstructorArg = OutputOptions &\n IConnectOptions &\n IImportOptions;\n\nexport interface ContensisCliConstructor {\n new (\n args: string[],\n outputOpts?: OutputOptionsConstructorArg,\n contensisOpts?: Partial<MigrateRequest>\n ): ContensisCli;\n}\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;AAAA;AAAA;",
6
6
  "names": []
7
7
  }
@@ -49,6 +49,7 @@ var import_util = require("../util");
49
49
  var import_api_ids = require("../util/api-ids");
50
50
  var import_console = require("../util/console.printer");
51
51
  var import_csv = require("../util/csv.formatter");
52
+ var import_html = require("../util/html.formatter");
52
53
  var import_json = require("../util/json.formatter");
53
54
  var import_xml = require("../util/xml.formatter");
54
55
  var import_debug = require("../util/debug");
@@ -2127,6 +2128,9 @@ Components:`));
2127
2128
  } else if (format === "csv") {
2128
2129
  log.raw("");
2129
2130
  log.raw(log.infoText(await (0, import_csv.csvFormatter)((0, import_json.limitFields)(obj, fields))));
2131
+ } else if (format === "html") {
2132
+ log.raw("");
2133
+ log.raw(log.infoText((0, import_html.htmlFormatter)((0, import_json.limitFields)(obj, fields))));
2130
2134
  } else if (format === "xml") {
2131
2135
  log.raw("");
2132
2136
  log.raw(log.infoText((0, import_xml.xmlFormatter)((0, import_json.limitFields)(obj, fields))));
@@ -2140,6 +2144,8 @@ Components:`));
2140
2144
  const isText = !(0, import_util.tryParse)(obj) && typeof obj === "string";
2141
2145
  if (format === "csv") {
2142
2146
  writeString = await (0, import_csv.csvFormatter)((0, import_json.limitFields)(obj, fields));
2147
+ } else if (format === "html") {
2148
+ writeString = (0, import_html.htmlFormatter)((0, import_json.limitFields)(obj, fields));
2143
2149
  } else if (format === "xml") {
2144
2150
  writeString = (0, import_xml.xmlFormatter)((0, import_json.limitFields)(obj, fields));
2145
2151
  } else
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/services/ContensisCliService.ts"],
4
- "sourcesContent": ["import to from 'await-to-js';\nimport chalk from 'chalk';\nimport fs from 'fs';\nimport inquirer from 'inquirer';\nimport fetch from 'node-fetch';\nimport path from 'path';\nimport clone from 'rfdc';\n\nimport { Component, ContentType, Project } from 'contensis-core-api';\nimport { Role } from 'contensis-management-api/lib/models';\nimport {\n ContensisMigrationService,\n MigrateRequest,\n PushBlockParams,\n SourceCms,\n ContentTypesResult,\n Model,\n BlockActionType,\n logEntitiesTable,\n} from 'migratortron';\n\nimport ContensisAuthService from './ContensisAuthService';\n\nimport { LogMessages } from '~/localisation/en-GB';\nimport {\n CliUrls,\n OutputFormat,\n OutputOptionsConstructorArg,\n} from '~/models/CliService';\n\nimport { readFileAsJSON } from '~/providers/file-provider';\nimport SessionCacheProvider from '../providers/SessionCacheProvider';\nimport CredentialProvider from '~/providers/CredentialProvider';\n\nimport {\n isPassword,\n isSharedSecret,\n isUuid,\n tryParse,\n tryStringify,\n url,\n} from '~/util';\nimport { sanitiseIds } from '~/util/api-ids';\nimport {\n printBlockVersion,\n printEntriesMigrateResult,\n printModelMigrationAnalysis,\n printModelMigrationResult,\n printNodeTreeOutput,\n printNodesMigrateResult,\n} from '~/util/console.printer';\nimport { csvFormatter } from '~/util/csv.formatter';\nimport { jsonFormatter, limitFields } from '~/util/json.formatter';\nimport { xmlFormatter } from '~/util/xml.formatter';\nimport { isDebug } from '~/util/debug';\nimport { diffLogStrings } from '~/util/diff';\nimport { findByIdOrName } from '~/util/find';\nimport { logError, Logger } from '~/util/logger';\nimport { promiseDelay } from '~/util/timers';\n\nlet insecurePasswordWarningShown = false;\n\nclass ContensisCli {\n static quit = (error?: Error) => {\n process.removeAllListeners('exit');\n const exitCode = error ? 1 : 0;\n\n // console.info(`\\nExiting contensis-cli with exit code: ${exitCode}\\n`);\n process.exit(exitCode);\n };\n\n private format?: OutputFormat;\n private output?: string;\n private session: SessionCacheProvider;\n\n auth?: ContensisAuthService;\n command: CliCommand;\n contensis?: ContensisMigrationService;\n contensisOpts: Partial<MigrateRequest>;\n currentProject: string;\n debug = isDebug();\n\n sourceAlias?: string;\n targetEnv?: string;\n urls: CliUrls;\n log = Logger;\n messages = LogMessages;\n\n verb: string;\n noun: string;\n thirdArg: string;\n\n get cache() {\n return this.session.Get();\n }\n\n get currentEnv() {\n return this.cache.currentEnvironment || '';\n }\n\n set currentEnv(currentEnvironment: string) {\n this.session.Update({ currentEnvironment });\n }\n\n get env() {\n const currentEnvironment = this.currentEnv;\n const environments = this.cache.environments || {};\n\n if (!currentEnvironment) return {} as EnvironmentCache;\n else if (environments[currentEnvironment])\n return environments[currentEnvironment];\n else {\n return {\n history: [],\n lastUserId: '',\n projects: [],\n versionStatus: 'latest',\n } as EnvironmentCache;\n }\n }\n\n constructor(\n args: string[],\n outputOpts?: OutputOptionsConstructorArg,\n contensisOpts: Partial<MigrateRequest> = {}\n ) {\n // console.log('args: ', JSON.stringify(args, null, 2));\n\n const [exe, script, verb = '', noun = '', ...restArgs] = args;\n this.verb = verb?.toLowerCase();\n this.noun = noun?.toLowerCase();\n this.thirdArg = restArgs?.[0];\n\n const commandText = `${this.verb} ${this.noun} ${\n restArgs ? restArgs.join(' ') : ''\n }`.trim();\n\n this.session = new SessionCacheProvider();\n\n this.contensisOpts = contensisOpts;\n\n // Explicitly sanitise supplied fields to api-friendly ids\n if (Array.isArray(this.contensisOpts.query?.fields)) {\n this.contensisOpts.query.fields = sanitiseIds(\n this.contensisOpts.query.fields\n );\n }\n\n this.format = outputOpts?.format;\n this.output =\n outputOpts?.output && path.join(process.cwd(), outputOpts.output);\n\n const currentEnvironment = outputOpts?.alias || this.currentEnv;\n const environments = this.cache.environments || {};\n this.currentEnv = currentEnvironment;\n\n // Set env from command options\n const env = this.env;\n if (outputOpts?.projectId) env.currentProject = outputOpts.projectId;\n if (outputOpts?.user) env.lastUserId = outputOpts.user;\n // setting this in env means passwordFallback is written to environments.json\n if (outputOpts?.password) env.passwordFallback = outputOpts.password;\n if (outputOpts?.clientId) env.lastUserId = outputOpts.clientId;\n if (outputOpts?.sharedSecret)\n if (outputOpts.sharedSecret.startsWith('-'))\n throw new Error(\n `Shared secret option provided a value of ${outputOpts.sharedSecret}`\n );\n else env.passwordFallback = outputOpts.sharedSecret;\n\n this.currentProject = env?.currentProject || 'null';\n this.sourceAlias = outputOpts?.sourceAlias || currentEnvironment;\n\n if (currentEnvironment) {\n this.urls = url(currentEnvironment, env?.currentProject || 'website');\n }\n\n this.command = {\n commandText,\n options: outputOpts as any,\n createdDate: new Date().toISOString(),\n invokedBy: env?.lastUserId,\n };\n\n if (currentEnvironment) {\n env.history = [this.command];\n if (commandText) {\n environments[currentEnvironment] = env;\n this.session.Update({\n currentEnvironment,\n environments,\n history: [commandText],\n });\n }\n }\n }\n\n PrintEnvironments = async () => {\n const { log, messages } = this;\n const { currentEnvironment, environments = {} } = this.cache;\n const envKeys = Object.keys(environments);\n log.success(messages.envs.found(envKeys.length));\n await this.HandleFormattingAndOutput(envKeys, () => {\n // print the envKeys to console\n for (const env of envKeys) {\n console.log(` - ${currentEnvironment === env ? '* ' : ''}${env}`);\n }\n });\n if (envKeys.length === 0 || !currentEnvironment) {\n log.help(messages.envs.tip());\n }\n };\n\n RemoveEnvironment = async (env: string) => {\n const { log, messages, session } = this;\n const { currentEnvironment, environments = {} } = this.cache;\n const envKeys = Object.keys(environments);\n log.success(messages.envs.found(envKeys.length));\n if (environments[env]) {\n // remove env from cache\n session.RemoveEnv(env);\n // remove credentials\n const lastUserId = environments[env].lastUserId;\n if (lastUserId) {\n const [err, credentials] = await new CredentialProvider({\n userId: environments[env].lastUserId,\n alias: env,\n }).Init();\n if (!err && credentials) await credentials.Delete();\n }\n log.success(messages.envs.removed(env));\n // support the output and format options - exporting the history for the\n // removed alias\n await this.HandleFormattingAndOutput(environments[env], () => log.line());\n } else {\n log.warning(messages.envs.notFound(env));\n }\n\n const nextCurrentEnv =\n currentEnvironment === env ? undefined : currentEnvironment;\n if (envKeys.length === 0 || !nextCurrentEnv) log.help(messages.envs.tip());\n\n return nextCurrentEnv;\n };\n\n Connect = async (environment: string) => {\n const { log, messages, session } = this;\n\n if (environment) {\n this.currentEnv = environment;\n this.urls = url(environment, 'website');\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [fetchErr, response] = await to(fetch(this.urls.cms));\n if (response && response?.status < 400) {\n log.success(messages.connect.connected(environment));\n session.UpdateEnv(this.env, environment);\n\n if (this.env?.lastUserId) {\n // await this.ConnectContensis();\n await this.PrintProjects();\n } else {\n log.warning(messages.projects.noList());\n log.help(messages.connect.tip());\n }\n } else {\n // Cannot reach environment - status X\n log.error(\n messages.connect.unreachable(this.urls.cms, response?.status || 0)\n );\n }\n } else {\n // No environment alias specified\n log.error(messages.connect.noEnv());\n }\n };\n\n ConnectContensis = async ({ commit = false } = {}) => {\n if (!this.contensis) {\n const { contensisOpts, currentEnv, env, log, messages } = this;\n const userId = env?.lastUserId;\n const isGuidId = userId && isUuid(userId);\n\n if (currentEnv && userId) {\n const credentials = await this.GetCredentials(\n userId,\n env.passwordFallback\n );\n\n const cachedPassword = credentials?.current?.password;\n\n if (cachedPassword) {\n this.contensis = new ContensisMigrationService(\n {\n ...contensisOpts,\n source: {\n url: this.urls?.cms || '',\n username: !isGuidId ? userId : undefined,\n password: !isGuidId ? cachedPassword : undefined,\n clientId: isGuidId ? userId : undefined,\n sharedSecret: isGuidId ? cachedPassword : undefined,\n project: env?.currentProject || '',\n assetHostname: this.urls?.previewWeb,\n },\n concurrency:\n typeof contensisOpts.concurrency !== 'undefined'\n ? contensisOpts.concurrency\n : 3,\n outputProgress: true,\n },\n !commit\n );\n }\n } else {\n if (!currentEnv) log.help(messages.connect.help());\n if (!userId) log.help(messages.connect.tip());\n }\n }\n return this.contensis;\n };\n\n ConnectContensisImport = async ({\n commit = false,\n fromFile,\n importDataType,\n }: {\n commit?: boolean;\n fromFile?: string;\n importDataType?:\n | 'entries'\n | 'contentTypes'\n | 'components'\n | 'models'\n | 'nodes'\n | 'user-input';\n }) => {\n const source: 'contensis' | 'file' = fromFile ? 'file' : 'contensis';\n\n const fileData = fromFile ? (await readFileAsJSON(fromFile)) || [] : [];\n\n if (typeof fileData === 'string')\n throw new Error(`Import file format must be of type JSON`);\n\n const { contensisOpts, currentEnv, env, log, messages, sourceAlias } = this;\n const environments = this.cache.environments || {};\n const sourceEnvironment = environments[sourceAlias || ''] || {};\n const sourceCms =\n ('source' in contensisOpts && contensisOpts.source) ||\n ({} as Partial<SourceCms>);\n const sourceUserId =\n sourceCms.clientId || sourceCms.username || sourceEnvironment.lastUserId;\n const sourceProjectId =\n sourceCms.project || sourceEnvironment.currentProject || 'website';\n const isSourceGuidId = sourceUserId && isUuid(sourceUserId);\n const sourceUrls = url(sourceAlias || '', sourceProjectId);\n\n const sourcePassword =\n sourceCms.sharedSecret ||\n sourceCms.password ||\n sourceEnvironment.passwordFallback;\n\n const targetUserId = env?.lastUserId;\n const isTargetGuidId = targetUserId && isUuid(targetUserId);\n\n if (sourceUserId && currentEnv && targetUserId) {\n const sourceCredentials = await this.GetCredentials(\n sourceUserId,\n sourcePassword,\n sourceAlias,\n false\n );\n\n const cachedSourcePassword = sourceCredentials?.current?.password;\n\n const targetCredentials = await this.GetCredentials(\n targetUserId,\n env.passwordFallback\n );\n\n const cachedTargetPassword = targetCredentials?.current?.password;\n\n if (cachedSourcePassword && cachedTargetPassword) {\n if (source === 'file' || importDataType === 'user-input') {\n this.contensis = new ContensisMigrationService(\n {\n concurrency: 3,\n outputProgress: true,\n ...contensisOpts,\n target: {\n url: this.urls?.cms || '',\n username: !isTargetGuidId ? targetUserId : undefined,\n password: !isTargetGuidId ? cachedTargetPassword : undefined,\n clientId: isTargetGuidId ? targetUserId : undefined,\n sharedSecret: isTargetGuidId ? cachedTargetPassword : undefined,\n targetProjects: [env.currentProject || ''],\n assetHostname: this.urls?.previewWeb,\n },\n ...(importDataType ? { [importDataType]: fileData } : {}),\n },\n !commit\n );\n } else if (source === 'contensis') {\n this.contensis = new ContensisMigrationService(\n {\n concurrency: 3,\n outputProgress: true,\n ...contensisOpts,\n source: {\n url: sourceUrls.cms || '',\n username: !isSourceGuidId ? sourceUserId : undefined,\n password: !isSourceGuidId ? cachedSourcePassword : undefined,\n clientId: isSourceGuidId ? sourceUserId : undefined,\n sharedSecret: isSourceGuidId ? cachedSourcePassword : undefined,\n project: sourceProjectId,\n assetHostname: sourceUrls.previewWeb,\n },\n target: {\n url: this.urls?.cms || '',\n username: !isTargetGuidId ? targetUserId : undefined,\n password: !isTargetGuidId ? cachedTargetPassword : undefined,\n clientId: isTargetGuidId ? targetUserId : undefined,\n sharedSecret: isTargetGuidId ? cachedTargetPassword : undefined,\n targetProjects: [env.currentProject || ''],\n assetHostname: this.urls?.previewWeb,\n },\n },\n !commit\n );\n }\n }\n } else {\n if (!currentEnv) log.help(messages.connect.help());\n if (!targetUserId) log.help(messages.connect.tip());\n }\n return this.contensis;\n };\n\n GetCredentials = async (\n userId: string,\n password?: string,\n currentEnv = this.currentEnv,\n saveCurrentEnv = true\n ): Promise<CredentialProvider | undefined> => {\n const { log, messages } = this;\n if (userId) {\n const [credentialError, credentials] = await new CredentialProvider(\n { userId, alias: currentEnv },\n password\n ).Init();\n\n if (credentialError && !credentials.current) {\n // Log problem with Credential Provider\n log.error(\n `Unable to find credentials for user ${userId} at ${currentEnv}`,\n credentialError as any\n );\n return;\n }\n\n if (credentials.remarks.secure !== true) {\n if (!insecurePasswordWarningShown) {\n log.warning(messages.login.insecurePassword());\n insecurePasswordWarningShown = true;\n }\n } else {\n const env = this.cache.environments[currentEnv];\n env.passwordFallback = undefined;\n this.session.UpdateEnv(env, currentEnv, saveCurrentEnv);\n }\n return credentials;\n }\n };\n\n Login = async (\n userId: string,\n {\n password = '',\n promptPassword = true,\n sharedSecret = '',\n silent = false,\n attempt = 1,\n }: {\n password?: string;\n promptPassword?: boolean;\n sharedSecret?: string;\n silent?: boolean;\n attempt?: number;\n } = {}\n ): Promise<string | undefined> => {\n let inputPassword = password || sharedSecret;\n\n if (!inputPassword)\n inputPassword =\n isSharedSecret(this.env.passwordFallback) ||\n isPassword(this.env.passwordFallback) ||\n '';\n\n const { messages } = this;\n\n if (userId) {\n const { currentEnv, env } = this;\n\n if (currentEnv) {\n const credentials = await this.GetCredentials(userId, inputPassword);\n\n if (credentials) {\n const cachedPassword = isPassword(credentials.current?.password);\n const cachedSecret = isSharedSecret(credentials.current?.password);\n\n if (!cachedPassword && !cachedSecret && promptPassword) {\n // Password prompt\n ({ inputPassword } = await inquirer.prompt([\n {\n type: 'password',\n message: messages.login.passwordPrompt(currentEnv, userId),\n name: 'inputPassword',\n mask: '*',\n prefix: undefined,\n },\n ]));\n }\n\n if (inputPassword || cachedPassword || cachedSecret) {\n this.auth = new ContensisAuthService({\n username: userId,\n password: inputPassword || cachedPassword,\n projectId: env?.currentProject || 'website',\n rootUrl: this.urls?.cms || '',\n clientId: userId,\n clientSecret: sharedSecret || cachedSecret,\n });\n\n const [authError, bearerToken] = await to(this.auth.BearerToken());\n\n // Login successful\n if (bearerToken) {\n // Set env vars\n env.authToken = bearerToken;\n env.lastUserId = userId;\n env.passwordFallback =\n credentials.remarks.secure !== true\n ? credentials.current?.password\n : undefined;\n\n // Persist env before finding projects or doing anything else\n this.session.UpdateEnv(env);\n if (inputPassword) await credentials.Save(inputPassword);\n if (sharedSecret) await credentials.Save(sharedSecret);\n\n if (!silent) {\n Logger.success(messages.login.success(currentEnv, userId));\n await this.PrintProjects();\n }\n } else if (authError) {\n Logger.error(authError.toString());\n // Clear env vars\n env.authToken = '';\n env.lastUserId = '';\n env.passwordFallback = undefined;\n // Persist env to remove cleared values\n this.session.UpdateEnv(env);\n\n // If the auth error was raised using a cached password\n if (\n (cachedPassword || cachedSecret) &&\n credentials.remarks.secure\n ) {\n // Remove any bad stored credential and trigger login prompt again\n await credentials.Delete();\n return await this.Login(userId, { password, sharedSecret });\n } else {\n throw new Error(messages.login.failed(currentEnv, userId));\n }\n }\n\n return env.authToken;\n } else {\n Logger.error(messages.login.passwordPrompt());\n if (attempt < 2)\n return await this.Login(userId, { attempt: attempt + 1 });\n }\n }\n } else {\n // No environment set, use `contensis connect {alias}` first\n Logger.error(messages.login.noEnv());\n }\n } else {\n // No user id specified\n Logger.error(messages.login.noUserId());\n }\n };\n\n PrintContensisVersion = async () => {\n const { log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve projects list for env\n const [projectsErr, projects] = await to(\n contensis.projects.GetSourceProjects()\n );\n\n if (Array.isArray(projects)) {\n // Print contensis version to console\n await this.HandleFormattingAndOutput(contensis.contensisVersion, () =>\n log.raw(log.highlightText(contensis.contensisVersion))\n );\n }\n\n if (projectsErr) {\n log.error(messages.projects.noList());\n log.error(projectsErr.message);\n }\n }\n };\n\n PrintBearerToken = async () => {\n const { log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve token for env\n const [error, token] = await to(\n contensis.content.sourceRepo.repo.BearerToken()\n );\n if (token) {\n // Print bearer token to console\n await this.HandleFormattingAndOutput(token, () =>\n log.raw(log.highlightText(token))\n );\n }\n\n if (error) {\n log.error(messages.projects.noList());\n log.error(error.message);\n }\n }\n };\n\n PrintProjects = async () => {\n const { currentProject, log, messages, session } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve projects list for env\n const [projectsErr, projects] = await to(\n contensis.projects.GetSourceProjects()\n );\n\n if (Array.isArray(projects)) {\n // save these projects in cache\n const nextCurrentProject =\n currentProject && currentProject !== 'null'\n ? currentProject\n : projects.some(p => p.id === 'website')\n ? 'website'\n : undefined;\n\n session.UpdateEnv({\n projects: projects.map(p => p.id),\n currentProject: nextCurrentProject,\n });\n\n log.success(messages.projects.list());\n log.raw('');\n\n await this.HandleFormattingAndOutput(projects, () => {\n // print the projects to console\n for (const project of projects.sort((a, b) =>\n a.id.localeCompare(b.id)\n )) {\n let color;\n try {\n color = chalk.keyword((project as any).color);\n } catch (ex) {\n Logger.debug(`${ex}`);\n color = chalk.white;\n }\n console.log(\n `${\n nextCurrentProject === project.id\n ? `>> ${log.boldText(color(project.id))}`\n : ` ${color(project.id)}`\n } ${log.infoText(\n `[${project.supportedLanguages\n .map(l =>\n l === project.primaryLanguage ? `*${log.boldText(l)}` : l\n )\n .join(' ')}]`\n )}`\n );\n }\n });\n\n if (!this.SetProject(nextCurrentProject))\n log.warning(messages.projects.tip());\n }\n\n if (projectsErr) {\n log.error(messages.projects.noList());\n log.error(projectsErr.message);\n }\n }\n };\n\n PrintProject = async (projectId = this.currentProject) => {\n const { log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve projects list for env\n const [projectsErr, projects] = await to(\n contensis.projects.GetSourceProjects()\n );\n\n const foundProject = projects?.find(\n p => p.id.toLowerCase() === projectId.toLowerCase()\n );\n\n if (foundProject) {\n log.raw('');\n await this.HandleFormattingAndOutput(foundProject, log.object);\n }\n\n if (projectsErr) {\n log.error(messages.projects.noList());\n log.error(projectsErr.message);\n }\n }\n };\n\n SetProject = (projectId = 'website') => {\n const { env, log, messages, session } = this;\n let nextProjectId: string | undefined;\n if (env?.projects.length > 0 && env?.lastUserId) {\n nextProjectId = env.projects.find(\n p => p.toLowerCase() === projectId.toLowerCase()\n );\n if (nextProjectId) {\n env.currentProject = nextProjectId;\n session.UpdateEnv(env);\n log.success(messages.projects.set(projectId));\n log.raw('');\n } else {\n log.error(messages.projects.failedSet(projectId));\n }\n } else {\n // No projects for currentEnv, try logging in\n log.warning(messages.projects.noList());\n log.help(messages.connect.tip());\n }\n return nextProjectId;\n };\n\n SetVersion = (versionStatus: 'latest' | 'published') => {\n const { env, log, messages, session } = this;\n if (!['latest', 'published'].includes(versionStatus)) {\n log.error(messages.version.invalid(versionStatus));\n return false;\n }\n if (!env) {\n log.help(messages.version.noEnv());\n return false;\n }\n if (env?.projects.length > 0 && env?.lastUserId) {\n session.UpdateEnv({ versionStatus });\n log.success(messages.version.set(this.currentEnv, versionStatus));\n return true;\n } else {\n // No projects for currentEnv, try logging in\n log.warning(messages.projects.noList());\n log.help(messages.connect.tip());\n return false;\n }\n };\n\n PrintApiKeys = async () => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve keys list for env\n const [keysErr, apiKeys] = await contensis.apiKeys.GetKeys();\n\n if (Array.isArray(apiKeys)) {\n log.success(messages.keys.list(currentEnv));\n await this.HandleFormattingAndOutput(apiKeys, () => {\n // print the keys to console\n for (const {\n id,\n sharedSecret,\n name,\n description,\n dateModified,\n modifiedBy,\n } of apiKeys) {\n console.log(\n ` - ${name}${\n description ? ` (${description})` : ''\n } [${dateModified.toString().substring(0, 10)} ${modifiedBy}]`\n );\n console.log(` ${id}`);\n console.log(` ${sharedSecret}`);\n }\n });\n }\n\n if (keysErr) {\n log.error(messages.keys.noList(currentEnv));\n log.error(jsonFormatter(keysErr));\n }\n }\n };\n\n CreateApiKey = async (name: string, description = '') => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n const [err, key] = await contensis.apiKeys.CreateKey(name, description);\n\n if (key) {\n log.success(messages.keys.created(currentEnv, name));\n\n // print the key details to console\n console.log(\n ` - ${chalk.bold(key.name)} [${key.dateModified\n .toString()\n .substring(0, 10)} ${key.modifiedBy}]`\n );\n if (key.description)\n console.log(` ${log.infoText(key.description)}`);\n console.log(` ${chalk.bold.grey`id`}: ${key.id}`);\n console.log(\n ` ${chalk.bold.grey`sharedSecret`}: ${key.sharedSecret}`\n );\n console.log('');\n log.help(messages.keys.tip());\n }\n\n if (err) {\n log.error(messages.keys.failedCreate(currentEnv, name), err);\n }\n }\n };\n\n RemoveApiKey = async (id: string) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis({ commit: true });\n\n if (contensis) {\n const [err] = await contensis.apiKeys.RemoveKey(id);\n\n if (!err) {\n log.success(messages.keys.removed(currentEnv, id));\n console.log('');\n } else {\n log.error(messages.keys.failedRemove(currentEnv, id), err);\n }\n }\n };\n\n PrintRoles = async () => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve roles list for env\n const [rolesErr, roles] = await to(contensis.roles.GetRoles());\n\n if (Array.isArray(roles)) {\n log.success(messages.roles.list(currentEnv));\n\n if (!roles.length) log.help(messages.roles.noneExist());\n\n await this.HandleFormattingAndOutput(roles, () => {\n // print the roles to console\n for (const {\n id,\n name,\n description,\n enabled,\n assignments,\n permissions,\n } of roles) {\n const color = enabled ? (s: string) => s : log.infoText;\n\n console.log(color(` - ${chalk.bold(name)} ${log.infoText(id)}`));\n if (description) console.log(log.infoText(` ${description}`));\n if (enabled === false)\n console.log(` ${chalk.bold.grey('enabled')}: false`);\n if (assignments.groups?.length)\n console.log(\n ` ${chalk.bold.grey('groups')}: ${assignments.groups.join(\n ', '\n )}`\n );\n if (assignments.users?.length)\n console.log(\n ` ${chalk.bold.grey('users')}: ${assignments.users.join(\n ', '\n )}`\n );\n if (assignments.apiKeys?.length)\n console.log(\n ` ${chalk.bold.grey('keys')}: ${assignments.apiKeys.join(\n ', '\n )}`\n );\n\n if (permissions.entries?.length) {\n console.log(` ${chalk.bold.grey('entries')}:`);\n for (const p of permissions.entries)\n console.log(\n ` ${p.id}: ${log.infoText(\n p.actions.length > 2\n ? p.actions.length\n : p.actions.join(', ')\n )}`\n );\n }\n if (permissions.contentTypes?.length)\n console.log(\n ` ${chalk.bold.grey(\n 'contentTypes'\n )}: ${permissions.contentTypes\n .map(\n p =>\n `${p.id} [${p.actions.join(',')}] ${(\n p as any\n ).languages.join(' ')}`\n )\n .join(', ')}`\n );\n }\n });\n }\n\n if (rolesErr) {\n log.error(messages.roles.noList(currentEnv));\n log.error(jsonFormatter(rolesErr));\n }\n }\n };\n\n PrintRole = async (roleNameOrId: string) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve roles list for env\n const [rolesErr, roles] = await to(contensis.roles.GetRoles());\n\n if (Array.isArray(roles)) {\n log.success(messages.roles.list(currentEnv));\n\n const role = findByIdOrName(roles, roleNameOrId);\n\n if (role) await this.HandleFormattingAndOutput(role, log.object);\n else log.error(messages.roles.failedGet(currentEnv, roleNameOrId));\n }\n\n if (rolesErr) {\n log.error(messages.roles.noList(currentEnv));\n log.error(jsonFormatter(rolesErr));\n }\n }\n };\n\n CreateRole = async (role: Partial<Role>) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n const [err, created] = await contensis.roles.CreateRole(role as Role);\n\n if (created) {\n log.success(\n messages.roles.created(currentEnv, role.id || role.name || '')\n );\n\n await this.HandleFormattingAndOutput(created, log.object);\n\n log.help(messages.roles.tip());\n return role.id;\n }\n\n if (err) {\n log.error(\n messages.roles.failedCreate(currentEnv, role.id || role.name || ''),\n err\n );\n }\n }\n };\n\n UpdateRole = async (roleNameOrId: string, role: Partial<Role>) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve roles list for env\n const [rolesErr, roles] = await to(contensis.roles.GetRoles());\n\n if (Array.isArray(roles)) {\n log.success(messages.roles.list(currentEnv));\n\n const existingRole = findByIdOrName(roles, roleNameOrId, true);\n if (existingRole) {\n log.info(messages.roles.setPayload());\n log.object(role);\n log.raw(``);\n const [updateErr, updated] = await contensis.roles.UpdateRole(\n existingRole.id,\n role\n );\n if (updateErr)\n log.error(messages.roles.failedSet(currentEnv, roleNameOrId));\n else {\n log.success(messages.roles.set());\n\n await this.HandleFormattingAndOutput(updated, log.object);\n }\n } else {\n // Role does not exist\n log.error(messages.roles.failedGet(currentEnv, roleNameOrId));\n }\n }\n\n if (rolesErr) {\n log.error(messages.roles.noList(currentEnv));\n log.error(jsonFormatter(rolesErr));\n }\n }\n };\n\n RemoveRole = async (roleNameOrId: string) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve roles list for env\n const [rolesErr, roles] = await to(contensis.roles.GetRoles());\n\n if (Array.isArray(roles)) {\n log.success(messages.roles.list(currentEnv));\n\n const existingRole = findByIdOrName(roles, roleNameOrId, true);\n\n if (existingRole) {\n const [deleteErr] = await contensis.roles.RemoveRole(existingRole.id);\n\n if (deleteErr)\n log.error(messages.roles.failedRemove(currentEnv, roleNameOrId));\n else log.success(messages.roles.removed(currentEnv, roleNameOrId));\n } else {\n // Role does not exist\n log.error(messages.roles.failedGet(currentEnv, roleNameOrId));\n }\n }\n\n if (rolesErr) {\n log.error(messages.roles.noList(currentEnv));\n log.error(jsonFormatter(rolesErr));\n }\n }\n };\n\n PrintWorkflows = async () => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve workflows list for env\n const [workflowsErr, workflows] =\n await contensis.content.sourceRepo.workflows.GetWorkflows();\n\n if (Array.isArray(workflows)) {\n log.success(messages.workflows.list(currentEnv));\n\n if (!workflows.length) log.help(messages.workflows.noneExist());\n\n const stringFromLanguageObject = (o: { [lang: string]: string }) =>\n Object.values(o || {})?.[0];\n\n await this.HandleFormattingAndOutput(workflows, () => {\n // print the workflows to console\n // log.object(workflows);\n for (const {\n id,\n name,\n description,\n states,\n eventGroups,\n isSystem,\n } of workflows as any) {\n const color = isSystem ? (s: string) => s : log.infoText;\n\n console.log(\n color(\n ` - ${chalk.bold(\n stringFromLanguageObject(name)\n )} ${log.infoText(id)}`\n )\n );\n if (description)\n console.log(\n log.infoText(` ${stringFromLanguageObject(description)}`)\n );\n if (isSystem === false)\n console.log(` ${chalk.bold.grey('isSystem')}: false`);\n if (states?.length)\n console.log(\n ` ${chalk.bold.grey('states')}: ${states\n .map((state: any) => state.id)\n .join(', ')}`\n );\n if (eventGroups?.length)\n console.log(\n ` ${chalk.bold.grey('eventGroups')}: ${eventGroups\n .map((evtGrp: any) => evtGrp.id)\n .join(', ')}`\n );\n }\n });\n }\n\n if (workflowsErr) {\n log.error(messages.workflows.noList(currentEnv));\n log.error(jsonFormatter(workflowsErr));\n }\n }\n };\n\n PrintWorkflow = async (workflowNameOrId: string) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve workflows list for env\n const [workflowsErr, workflows] =\n await contensis.content.sourceRepo.workflows.GetWorkflows();\n\n if (Array.isArray(workflows)) {\n log.success(messages.workflows.list(currentEnv));\n\n const workflow = findByIdOrName(workflows, workflowNameOrId);\n\n if (workflow)\n await this.HandleFormattingAndOutput(workflow, log.object);\n else\n log.error(messages.workflows.failedGet(currentEnv, workflowNameOrId));\n }\n\n if (workflowsErr) {\n log.error(messages.workflows.noList(currentEnv));\n log.error(jsonFormatter(workflowsErr));\n }\n }\n };\n\n CreateProject = async (project: Project) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n const [err, created] = await contensis.projects.CreateProject(project);\n\n if (created) {\n log.success(messages.projects.created(currentEnv, project.id));\n\n await this.HandleFormattingAndOutput(created, () => {\n // set the CLI project to the newly created project\n this.SetProject(project.id);\n // print all the projects to console\n this.PrintProjects();\n });\n return project.id;\n }\n\n if (err) {\n log.error(messages.projects.failedCreate(currentEnv, project.id), err);\n }\n }\n };\n\n UpdateProject = async (project: Partial<Project>) => {\n const { currentEnv, currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n const [err, updated] = await contensis.projects.UpdateProject({\n id: currentProject,\n ...project,\n });\n\n if (updated) {\n log.success(messages.projects.updated(currentEnv, currentProject));\n\n await this.HandleFormattingAndOutput(updated, log.object);\n return updated.id;\n }\n\n if (err) {\n log.error(\n messages.projects.failedUpdate(currentEnv, currentProject),\n err\n );\n }\n }\n };\n\n PrintContentModels = async (\n modelIds: string[] = [],\n opts: { export?: boolean; requiredBy?: boolean }\n ) => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve models list for env\n const models = await contensis.models.contentModels();\n const contentTypes = await contensis.models.contentTypes();\n const components = await contensis.models.components();\n\n // Models to output to console\n const returnModels = modelIds?.length\n ? models?.filter((m: Model) =>\n modelIds.some(id => id.toLowerCase() === m.id.toLowerCase())\n )\n : undefined;\n const exportResources: (ContentType | Component)[] = [];\n\n if (opts.export) {\n // Generate a list of contentTypeIds and componentIds from all models\n // and dependencies\n const contentTypeIds = Array.from(\n new Set([\n ...(returnModels || models || []).map(m => m.id),\n ...(returnModels || models || [])\n .map(m => m.dependencies?.contentTypes?.map(c => c[0]) || [])\n .flat(),\n ])\n );\n const componentIds = Array.from(\n new Set(\n (returnModels || models || [])\n .map(m => m.dependencies?.components?.map(c => c[0]) || [])\n .flat()\n )\n );\n\n // Create an array of all the content types and component definitions\n // we will use this when outputting to a file\n exportResources.push(\n ...contentTypes.filter(c =>\n contentTypeIds\n .map(i => i.toLowerCase())\n .includes(c.id.toLowerCase())\n ),\n ...components.filter(c =>\n componentIds.map(i => i.toLowerCase()).includes(c.id.toLowerCase())\n )\n );\n }\n\n if (Array.isArray(returnModels)) {\n log.success(messages.models.list(currentProject));\n await this.HandleFormattingAndOutput(\n opts.export ? exportResources : returnModels,\n () => {\n // print the content models to console\n for (const model of returnModels) {\n // create a clone of each model to safely modify\n const draft = clone()(model);\n if (!opts.requiredBy) {\n // truncate parts of the output\n delete draft.dependencyOf;\n if (draft.dependencies?.contentTypes)\n draft.dependencies.contentTypes.forEach(id => id.pop());\n if (draft.dependencies?.components)\n draft.dependencies.components.forEach(id => id.pop());\n }\n\n log.raw('');\n log.object(draft);\n }\n log.raw('');\n }\n );\n } else {\n log.success(\n messages.models.get(currentProject, models?.length.toString() || '0')\n );\n log.raw('');\n if (models?.length) {\n await this.HandleFormattingAndOutput(\n opts.export ? exportResources : models,\n () => {\n // print the content models to console\n for (const model of models) {\n const components = model.components?.length || 0;\n const contentTypes = model.contentTypes?.length || 0;\n const defaults =\n (model.defaults?.length || 0) + (model.nodes?.length || 0);\n const dependencies =\n (model.dependencies?.components?.length || 0) +\n (model.dependencies?.contentTypes?.length || 0);\n const dependencyOf =\n (model.dependencyOf?.components?.length || 0) +\n (model.dependencyOf?.contentTypes?.length || 0);\n\n const hasAny =\n components + contentTypes + dependencies + dependencyOf;\n log.raw(\n ` - ${log.highlightText(log.boldText(model.id))} ${\n hasAny\n ? log.infoText(\n `{ ${\n components ? `components: ${components}, ` : ''\n }${\n contentTypes\n ? `contentTypes: ${contentTypes}, `\n : ''\n }${defaults ? `defaults: ${defaults}, ` : ''}${\n dependencies ? `references: ${dependencies}, ` : ''\n }${\n dependencyOf ? `required by: ${dependencyOf}` : ''\n } }`\n )\n : ''\n }`\n );\n }\n log.raw('');\n }\n );\n }\n }\n }\n };\n\n ImportContentModels = async ({\n commit,\n fromFile,\n }: {\n commit: boolean;\n fromFile: string;\n }) => {\n const { currentProject, log, messages } = this;\n\n const fileData = fromFile\n ? (await readFileAsJSON<(ContentType | Component)[]>(fromFile)) || []\n : [];\n if (typeof fileData === 'string')\n throw new Error(`Import file format must be of type JSON`);\n\n const contensis = await this.ConnectContensisImport({\n commit,\n fromFile,\n importDataType: 'models',\n });\n\n if (contensis) {\n log.line();\n if (contensis.isPreview) {\n log.success(messages.migrate.preview());\n } else {\n log.warning(messages.migrate.commit());\n }\n\n const [migrateErr, result] = await contensis.MigrateContentModels();\n\n if (migrateErr) logError(migrateErr);\n else\n await this.HandleFormattingAndOutput(result, () => {\n // print the results to console\n if (!result.committed) {\n log.raw(log.boldText(`\\nContent types:`));\n if (!result.contentTypes) log.info(`- None returned\\n`);\n else printModelMigrationAnalysis(this, result.contentTypes);\n\n log.raw(log.boldText(`\\nComponents:`));\n if (!result.components) log.info(`- None returned\\n`);\n else printModelMigrationAnalysis(this, result.components);\n\n if (result.defaults && Object.keys(result.defaults).length) {\n log.raw(log.boldText(`\\nDefaults:`));\n printModelMigrationAnalysis(this, result.defaults);\n }\n if (result.nodes && Object.keys(result.nodes).length) {\n log.raw(log.boldText(`\\nNodes:`));\n printModelMigrationAnalysis(this, result.nodes);\n }\n if (result.errors) {\n log.raw(log.boldText(`\\nErrors:`));\n log.object(result.errors);\n }\n } else {\n const { modelsResult = {} } = result;\n log.raw(log.boldText(`\\nContent types:`));\n printModelMigrationResult(\n this,\n modelsResult[currentProject].contentTypes\n );\n // Only output for components if any status has any results\n if (\n Object.values(modelsResult[currentProject].components).some(\n r => r.length > 0\n )\n ) {\n log.raw(log.boldText(`\\nComponents:`));\n printModelMigrationResult(\n this,\n modelsResult[currentProject].components\n );\n }\n if (\n Object.values(modelsResult[currentProject].defaults || {}).some(\n r => r.length > 0\n )\n ) {\n log.raw(log.boldText(`\\nDefaults:`));\n printModelMigrationResult(\n this,\n modelsResult[currentProject].defaults\n );\n }\n if (\n Object.values(modelsResult[currentProject].nodes || {}).some(\n r => r.length > 0\n )\n ) {\n log.raw(log.boldText(`\\nNodes:`));\n printModelMigrationResult(\n this,\n modelsResult[currentProject].nodes\n );\n }\n }\n });\n } else {\n log.warning(messages.models.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n PrintContentTypes = async () => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve content types list for env\n const contentTypes = await contensis.models.contentTypes();\n\n if (Array.isArray(contentTypes)) {\n log.success(messages.contenttypes.list(currentProject));\n await this.HandleFormattingAndOutput(contentTypes, () => {\n // print the content types to console\n for (const contentType of contentTypes) {\n const fieldsLength = contentType.fields?.length || 0;\n console.log(\n ` - ${contentType.id} [${fieldsLength} field${\n fieldsLength !== 1 ? 's' : ''\n }]`\n );\n }\n });\n }\n }\n };\n\n PrintContentType = async (contentTypeId: string) => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve content types list for env\n const contentTypes = await contensis.models.contentTypes();\n\n if (Array.isArray(contentTypes)) {\n const contentType = contentTypes.find(\n c => c.id.toLowerCase() === contentTypeId.toLowerCase()\n );\n if (contentType) {\n log.success(\n messages.contenttypes.get(currentProject, contentType.id)\n );\n // print the content type to console\n await this.HandleFormattingAndOutput(contentType, log.object);\n } else {\n log.error(\n messages.contenttypes.failedGet(currentProject, contentTypeId)\n );\n }\n }\n }\n };\n\n RemoveContentTypes = async (contentTypeIds: string[], commit = false) => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: 'user-input', // 'user-input' import type does not require a source cms\n });\n if (contensis) {\n const [err, result] = await contensis.DeleteContentTypes(contentTypeIds);\n\n if (err) {\n log.error(\n messages.contenttypes.failedRemove(\n currentProject,\n contentTypeIds.join(', ')\n ),\n err\n );\n } else {\n log.success(\n messages.contenttypes.removed(\n currentProject,\n contentTypeIds.join(', '),\n !contensis.isPreview\n )\n );\n // print the results to console\n await this.HandleFormattingAndOutput(result, log.object);\n }\n }\n };\n\n ImportContentTypes = async (\n {\n commit,\n fromFile,\n }: {\n commit: boolean;\n fromFile: string;\n },\n contentTypeIds: string[] = []\n ) => {\n const { currentProject, log, messages } = this;\n\n let fileData = fromFile\n ? (await readFileAsJSON<ContentType[]>(fromFile)) || []\n : [];\n if (typeof fileData === 'string')\n throw new Error(`Import file format must be of type JSON`);\n\n if (!Array.isArray(fileData)) fileData = [fileData];\n\n const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: fromFile ? 'user-input' : undefined,\n });\n\n if (contensis) {\n if (fromFile)\n // Pass each content type to the target repo\n for (const contentType of fileData) {\n // Fix invalid data\n contentType.projectId = currentProject;\n delete contentType.uuid;\n\n const [err, , createStatus] = await contensis.models.targetRepos[\n currentProject\n ].repo.UpsertContentType(false, contentType);\n\n if (err) log.error(err.message, err);\n if (createStatus) {\n log.success(\n messages.contenttypes.created(\n currentProject,\n contentType.id,\n createStatus\n )\n );\n // print the content type to console\n await this.HandleFormattingAndOutput(contentType, () => {});\n }\n }\n else {\n const result = await contensis.simpleMigration.Migrate(\n contentTypeIds,\n []\n );\n await this.HandleFormattingAndOutput(result, log.object);\n }\n }\n };\n\n DiffModels = async (\n {\n fromFile,\n }: {\n fromFile: string;\n },\n modelIds: string[] = []\n ) => {\n const { log } = this;\n\n let fileData = fromFile\n ? (await readFileAsJSON<ContentType[]>(fromFile)) || []\n : [];\n if (typeof fileData === 'string')\n throw new Error(`Import file format must be of type JSON`);\n\n if (!Array.isArray(fileData)) fileData = [fileData];\n\n const contensis = await this.ConnectContensisImport({\n fromFile,\n importDataType: 'models',\n });\n\n if (contensis) {\n const [err, result] = (await to(\n contensis.models.Diff(fileData.length ? fileData : modelIds)\n )) as [Error | null, ContentTypesResult | undefined];\n\n if (err) log.error(err.message, err);\n if (result)\n // print the content type to console\n await this.HandleFormattingAndOutput(result, () => {\n log.success(\n `Queried models ${log.infoText(\n `\"${result.query.modelIds?.join(', ')}\"`\n )}\\n`\n );\n if (result.committed === false) {\n log.raw(log.boldText(`Content types:`));\n if (!result.contentTypes) log.info(`- None returned\\n`);\n else printModelMigrationAnalysis(this, result.contentTypes);\n\n log.raw(log.boldText(`\\nComponents:`));\n if (!result.components) log.info(`- None returned\\n`);\n else printModelMigrationAnalysis(this, result.components);\n }\n });\n }\n };\n\n PrintComponents = async () => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve components list for env\n const components = await contensis.models.components();\n\n if (Array.isArray(components)) {\n log.success(messages.components.list(currentProject));\n\n await this.HandleFormattingAndOutput(components, () => {\n // print the components to console\n for (const component of components) {\n const fieldsLength = component.fields?.length || 0;\n console.log(\n ` - ${component.id} [${fieldsLength} field${\n fieldsLength !== 1 ? 's' : ''\n }]`\n );\n }\n });\n }\n }\n };\n\n PrintComponent = async (componentId: string) => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve content types list for env\n const components = await contensis.models.components();\n\n if (Array.isArray(components)) {\n const component = components.find(\n c => c.id.toLowerCase() === componentId.toLowerCase()\n );\n if (component) {\n log.success(messages.components.get(currentProject, component.id));\n // print the component to console\n await this.HandleFormattingAndOutput(component, log.object);\n } else {\n log.error(messages.components.failedGet(currentProject, componentId));\n }\n }\n }\n };\n\n RemoveComponents = async (componentIds: string[], commit = false) => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: 'user-input', // 'user-input' import type does not require a source cms\n });\n if (contensis) {\n const [err, result] = await contensis.DeleteContentTypes(\n undefined,\n componentIds\n );\n\n if (err) {\n log.error(\n messages.components.failedRemove(\n currentProject,\n componentIds.join(', ')\n ),\n err\n );\n } else {\n log.success(\n messages.components.removed(\n currentProject,\n componentIds.join(', '),\n !contensis.isPreview\n )\n );\n // print the results to console\n await this.HandleFormattingAndOutput(result, log.object);\n }\n }\n };\n\n ImportComponents = async (\n {\n commit,\n fromFile,\n }: {\n commit: boolean;\n fromFile: string;\n },\n componentIds: string[] = []\n ) => {\n const { currentProject, log, messages } = this;\n\n let fileData = fromFile\n ? (await readFileAsJSON<Component[]>(fromFile)) || []\n : [];\n if (typeof fileData === 'string')\n throw new Error(`Import file format must be of type JSON`);\n\n if (!Array.isArray(fileData)) fileData = [fileData];\n\n const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: fromFile ? 'user-input' : undefined,\n });\n\n if (contensis) {\n // Pass each component to the target repo\n if (fromFile)\n for (const component of fileData) {\n // Fix invalid data\n component.projectId = currentProject;\n delete component.uuid;\n\n const [err, , createStatus] = await contensis.models.targetRepos[\n currentProject\n ].repo.UpsertComponent(false, component);\n\n if (err) log.error(err.message, err);\n if (createStatus) {\n log.success(\n messages.components.created(\n currentProject,\n component.id,\n createStatus\n )\n );\n // print the component to console\n await this.HandleFormattingAndOutput(component, () => {});\n }\n }\n else {\n const result = await contensis.simpleMigration.Migrate(\n [],\n componentIds\n );\n await this.HandleFormattingAndOutput(result, log.object);\n }\n }\n };\n\n RemoveEntries = async (commit = false) => {\n const { currentEnv, currentProject, log, messages } = this;\n const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: 'user-input', // 'user-input' import type does not require a source cms\n });\n\n if (contensis) {\n if (contensis.isPreview) {\n console.log(log.successText(` -- PREVIEW -- `));\n } else {\n console.log(log.warningText(` *** COMMITTING DELETE *** `));\n }\n const [err, result] = await contensis.DeleteEntries();\n if (result)\n await this.HandleFormattingAndOutput(result, () => {\n // print the migrateResult to console\n printEntriesMigrateResult(this, result, {\n action: 'delete',\n showAll: true,\n });\n });\n if (\n !err &&\n ((!commit && result.entriesToMigrate[currentProject].totalCount) ||\n (commit && result.migrateResult?.deleted))\n ) {\n log.success(messages.entries.removed(currentEnv, commit));\n if (!commit) {\n log.raw(``);\n log.help(messages.entries.commitTip());\n }\n } else {\n log.error(messages.entries.failedRemove(currentEnv), err);\n if (!result?.entriesToMigrate?.[currentProject]?.totalCount)\n log.help(messages.entries.notFound(currentEnv));\n }\n }\n };\n\n GetEntries = async ({\n withDependents = false,\n }: {\n withDependents?: boolean;\n } = {}) => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n log.line();\n const entries = await contensis.GetEntries({ withDependents });\n // TODO: iterate entries and add some extra details to help\n // with importing later\n // Add a full sys.uri to asset entries\n // Add sys.metadata.exportCms\n // Add sys.metadata.exportProjectId\n const nodes = contensis.content.source.nodes.raw;\n const combinedOutput = [...entries, ...nodes];\n\n await this.HandleFormattingAndOutput(combinedOutput, () => {\n // print the entries to console\n logEntitiesTable({\n entries,\n projectId: currentProject,\n fields: contensis.payload.query?.fields,\n });\n if (nodes.length)\n logEntitiesTable({\n nodes,\n projectId: currentProject,\n fields: contensis.payload.query?.fields,\n });\n });\n } else {\n log.warning(messages.models.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n ImportEntries = async ({\n commit,\n fromFile,\n logOutput,\n saveEntries,\n }: {\n commit: boolean;\n fromFile: string;\n logOutput: string;\n saveEntries: boolean;\n }) => {\n const { currentEnv, currentProject, log, messages } = this;\n\n const contensis = await this.ConnectContensisImport({\n commit,\n fromFile,\n importDataType: 'entries',\n });\n\n if (contensis) {\n log.line();\n if (contensis.isPreview) {\n log.success(messages.migrate.preview());\n } else {\n log.warning(messages.migrate.commit());\n }\n\n const [err, result] = await contensis.MigrateEntries();\n\n if (err) logError(err);\n else {\n const { entries, nodes } = contensis.content.targets[currentProject];\n\n const output = saveEntries\n ? // include entries and dependent nodes when saving entries\n [\n entries.migrate?.map(me => me.toJSON()) || [],\n nodes.migrateNodes.map(mn => mn.node),\n ].flat()\n : result;\n await this.HandleFormattingAndOutput(output, () => {\n // print the migrateResult to console\n printEntriesMigrateResult(this, result, {\n showAll: logOutput === 'all',\n showDiff: logOutput === 'all' || logOutput === 'changes',\n showChanged: logOutput === 'changes',\n });\n if (['all', 'changes'].includes(logOutput))\n printNodeTreeOutput(\n this,\n {\n ...nodes.rootAncestor,\n status: 'no change',\n children: nodes.migrateNodes as any,\n },\n logOutput\n );\n });\n }\n if (\n !err &&\n !result.errors?.length &&\n ((!commit && result.entriesToMigrate[currentProject].totalCount) ||\n (commit &&\n (result.migrateResult?.created || result.migrateResult?.updated)))\n ) {\n log.success(\n messages.entries.imported(\n currentEnv,\n commit,\n commit\n ? (result.migrateResult?.created || 0) +\n (result.migrateResult?.updated || 0)\n : result.entriesToMigrate[currentProject].totalCount,\n commit\n ? (result.nodesResult?.created || 0) +\n (result.nodesResult?.updated || 0)\n : (result.nodesToMigrate?.[currentProject]\n .totalCount as number) || 0\n )\n );\n if (!commit) {\n log.raw(``);\n log.help(messages.entries.commitTip());\n }\n } else {\n log.error(messages.entries.failedImport(currentEnv), err);\n if (!result?.entriesToMigrate?.[currentProject]?.totalCount)\n log.help(messages.entries.notFound(currentEnv));\n }\n } else {\n log.warning(messages.models.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n CopyEntryField = async ({\n commit,\n fromFile,\n logOutput,\n saveEntries,\n }: {\n commit: boolean;\n fromFile: string;\n logOutput: string;\n saveEntries: boolean;\n }) => {\n const { currentEnv, currentProject, log, messages } = this;\n\n const contensis = await this.ConnectContensisImport({\n commit,\n fromFile,\n importDataType: 'entries',\n });\n\n if (contensis) {\n log.line();\n if (contensis.isPreview) {\n log.success(messages.migrate.preview());\n } else {\n log.warning(messages.migrate.commit());\n }\n\n const [err, result] = await to(\n contensis.content.copy.MigrateFieldContent()\n );\n\n if (err) logError(err);\n if (result) {\n const output = saveEntries\n ? contensis.content.copy.targets[currentProject].entries.migrate?.map(\n me => me.toJSON()\n )\n : result;\n await this.HandleFormattingAndOutput(output, () => {\n // print the migrateResult to console\n printEntriesMigrateResult(this, result, {\n showAll: logOutput === 'all',\n showDiff: logOutput === 'all' || logOutput === 'changes',\n showChanged: logOutput === 'changes',\n });\n });\n }\n\n if (\n result &&\n !err &&\n !result.errors?.length &&\n ((!commit && result.entriesToMigrate[currentProject].totalCount) ||\n (commit &&\n (result.migrateResult?.created || result.migrateResult?.updated)))\n ) {\n log.success(\n messages.entries.imported(\n currentEnv,\n commit,\n commit\n ? (result.migrateResult?.created || 0) +\n (result.migrateResult?.updated || 0)\n : result.entriesToMigrate[currentProject].totalCount\n )\n );\n if (!commit) {\n log.raw(``);\n log.help(messages.entries.commitTip());\n }\n } else {\n log.error(messages.entries.failedImport(currentEnv), err);\n if (!result?.entriesToMigrate?.[currentProject]?.totalCount)\n log.help(messages.entries.notFound(currentEnv));\n }\n } else {\n log.warning(messages.models.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n GetNodes = async (rootPath: string, depth = 0) => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n log.line();\n const [err, nodes] = await to(contensis.nodes.GetNodes(rootPath, depth));\n if (err) {\n log.error(messages.nodes.failedGet(currentProject), err);\n return;\n }\n const root = contensis.nodes.sourceRepo.nodes.tree;\n\n log.success(messages.nodes.get(currentProject, rootPath, depth));\n\n await this.HandleFormattingAndOutput(nodes, () => {\n // print the nodes to console\n log.object({ ...root, children: undefined, language: undefined });\n printNodeTreeOutput(this, root);\n });\n } else {\n log.warning(messages.models.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n ImportNodes = async ({\n commit,\n fromFile,\n logOutput,\n logLimit,\n }: {\n commit: boolean;\n fromFile: string;\n logOutput: string;\n logLimit: number;\n }) => {\n const { currentEnv, currentProject, log, messages } = this;\n\n const contensis = await this.ConnectContensisImport({\n commit,\n fromFile,\n importDataType: 'nodes',\n });\n\n if (contensis) {\n log.line();\n if (contensis.isPreview) {\n log.success(messages.migrate.preview());\n } else {\n log.warning(messages.migrate.commit());\n }\n\n const [err, result] = await contensis.MigrateNodes();\n\n if (err) log.raw(``);\n else\n await this.HandleFormattingAndOutput(result, () => {\n // print the migrateResult to console\n const migrateTree =\n contensis.nodes.targetRepos[currentProject].nodes\n .migrateNodesTreeView;\n printNodeTreeOutput(this, migrateTree, logOutput, logLimit);\n printNodesMigrateResult(this, result, {\n showAll: logOutput === 'all',\n showChanged: logOutput === 'changes',\n });\n });\n\n const nodesMigrateCount =\n result?.nodesToMigrate?.[currentProject].totalCount;\n const nodesCreated = result?.nodesResult?.['created'] || 0;\n const nodesUpdated = result?.nodesResult?.['updated'] || 0;\n const nodesErrored = result?.nodesResult?.['errors'] || 0;\n const noChanges =\n result?.nodesToMigrate?.[currentProject]['no change'] &&\n nodesMigrateCount === 0;\n\n if (\n !err &&\n (!result.errors?.length || this.contensisOpts.ignoreErrors) &&\n ((!commit && nodesMigrateCount) ||\n (commit && (nodesCreated || nodesUpdated || result.errors?.length)))\n ) {\n let totalCount: number;\n if (commit) {\n const created = typeof nodesCreated === 'number' ? nodesCreated : 0;\n const updated = typeof nodesUpdated === 'number' ? nodesUpdated : 0;\n\n totalCount = created + updated;\n } else {\n totalCount =\n typeof nodesMigrateCount === 'number' ? nodesMigrateCount : 0;\n }\n\n log.success(messages.nodes.imported(currentEnv, commit, totalCount));\n log.raw(``);\n if (!commit) {\n log.help(messages.nodes.commitTip());\n }\n } else {\n if (noChanges && !err && !nodesErrored) {\n log.help(messages.nodes.noChange(currentEnv));\n } else {\n log.error(messages.nodes.failedImport(currentEnv), err);\n if (!nodesMigrateCount) log.help(messages.nodes.notFound(currentEnv));\n }\n }\n } else {\n log.warning(messages.models.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n RemoveNodes = async (commit = false) => {\n const { currentEnv, currentProject, log, messages } = this;\n const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: 'user-input', // 'user-input' import type does not require a source cms\n });\n\n if (contensis) {\n if (contensis.isPreview) {\n console.log(log.successText(` -- PREVIEW -- `));\n } else {\n console.log(log.warningText(` *** COMMITTING DELETE *** `));\n }\n const [err, result] = await contensis.DeleteNodes();\n if (result) {\n await this.HandleFormattingAndOutput(result, () => {\n // print the migrateResult to console\n printNodeTreeOutput(\n this,\n contensis.nodes.targetRepos[currentProject].nodes\n .migrateNodesTreeView\n );\n // printNodesMigrateResult(this, result, {\n // action: 'delete',\n // showAll: true,\n // });\n });\n }\n if (\n !err &&\n ((!commit && result.nodesToMigrate[currentProject].totalCount) ||\n (commit && result.nodesResult?.deleted))\n ) {\n log.success(\n messages.nodes.removed(currentEnv, commit, contensis.nodes.rootPath)\n );\n log.raw(``);\n if (!commit) {\n log.help(messages.nodes.commitTip());\n }\n } else {\n log.error(messages.nodes.failedRemove(currentEnv), err);\n if (!result?.nodesToMigrate?.[currentProject]?.totalCount)\n log.help(messages.nodes.notFound(currentEnv));\n }\n }\n };\n\n PrintWebhookSubscriptions = async (subscriptionIdsOrNames?: string[]) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve webhooks list for env\n const [webhooksErr, webhooks] =\n await contensis.subscriptions.webhooks.GetSubscriptions();\n\n const filteredResults = subscriptionIdsOrNames?.length\n ? webhooks?.filter(\n w =>\n subscriptionIdsOrNames?.some(idname =>\n w.name?.toLowerCase().includes(idname.toLowerCase())\n ) ||\n subscriptionIdsOrNames?.some(\n id => id.toLowerCase() === w.id.toLowerCase()\n )\n )\n : webhooks;\n\n if (Array.isArray(filteredResults)) {\n log.success(messages.webhooks.list(currentEnv));\n if (!webhooks?.length) log.warning(messages.webhooks.noneExist());\n else {\n await this.HandleFormattingAndOutput(filteredResults, () => {\n // print the keys to console\n for (const {\n id,\n description,\n method,\n name,\n version,\n url,\n enabled,\n topics,\n templates,\n headers,\n } of filteredResults) {\n console.log(\n log.infoText(\n ` ${chalk.bold.white`- ${name}`} ${id} [${(\n version.modified || version.created\n )\n .toString()\n .substring(0, 10)} ${\n version.modifiedBy || version.createdBy\n }]`\n )\n );\n if (description) console.log(log.infoText` ${description}`);\n console.log(` ${log.infoText`[${method}]`} ${url}`);\n if (headers && Object.keys(headers).length) {\n console.log(` ${log.infoText`headers`}:`);\n\n for (const [key, { value, secret }] of Object.entries(headers))\n console.log(\n ` ${chalk.bold.gray(key)}: ${secret ? '\uD83E\uDD10' : value}`\n );\n }\n if (topics?.length)\n if (topics?.length === 1)\n console.log(\n ` ${log.infoText`topics`}: ${topics\n .map(t => JSON.stringify(t))\n .join(' ')\n .replaceAll('\"', '')\n .replaceAll(',', ' ')\n .replaceAll('{', '')\n .replaceAll('}', '')}`\n );\n else {\n console.log(` ${log.infoText`topics`}:`);\n log.objectRecurse(topics, 1, ' ');\n }\n if (templates && Object.keys(templates).length)\n console.log(\n ` ${log.infoText`templates`}: ${Object.keys(\n templates\n ).join(' ')}`\n );\n if (enabled === false)\n console.log(` ${log.infoText`enabled`}: ${enabled}`);\n }\n });\n }\n }\n\n if (webhooksErr) {\n log.error(messages.webhooks.noList(currentEnv));\n log.error(jsonFormatter(webhooksErr));\n }\n }\n };\n\n PrintBlocks = async () => {\n const { currentEnv, env, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve blocks list for env\n const [err, blocks] = await contensis.blocks.GetBlocks();\n\n if (Array.isArray(blocks) && blocks.length) {\n await this.HandleFormattingAndOutput(blocks, () => {\n // print the blocks to console\n log.success(messages.blocks.list(currentEnv, env.currentProject));\n for (const {\n id,\n description,\n branches,\n liveVersion,\n madeLive,\n versionsSinceLive,\n } of blocks) {\n console.log(\n ` - ${id}${description ? ` (${description})` : ''}${\n madeLive\n ? ` [${madeLive.toString().substring(0, 10)} v${liveVersion}]`\n : ''\n }${\n versionsSinceLive\n ? log.warningText(` +${versionsSinceLive}`)\n : ''\n }`\n );\n for (const branch of branches)\n console.log(\n log.infoText(` [${branch.id}]: ${branch.status}`)\n );\n }\n });\n\n return blocks;\n }\n\n if (err) {\n log.error(messages.blocks.noList(currentEnv, env.currentProject));\n // log.error(jsonFormatter(err));\n }\n }\n };\n\n PrintBlockVersions = async (\n blockId: string,\n branch: string,\n version: string\n ) => {\n const { currentEnv, env, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve block version\n const [err, blocks] = await contensis.blocks.GetBlockVersions(\n blockId,\n branch,\n version\n );\n\n if (err || blocks?.length === 0) {\n log.warning(\n messages.blocks.noGet(\n blockId,\n branch,\n version,\n currentEnv,\n env.currentProject\n )\n );\n log.help(messages.blocks.noGetTip());\n // if (err) log.error(jsonFormatter(err));\n } else if (blocks) {\n await this.HandleFormattingAndOutput(blocks, () => {\n // print the version detail to console\n log.success(\n messages.blocks.get(\n blockId,\n branch,\n version,\n currentEnv,\n env.currentProject\n )\n );\n for (const block of blocks)\n printBlockVersion(\n this,\n block,\n !version\n ? {\n showImage: false,\n showSource: true,\n showStaticPaths: false,\n showStatus: false,\n }\n : undefined\n );\n });\n\n return blocks;\n }\n }\n };\n\n PushBlock = async (block: PushBlockParams) => {\n const { currentEnv, env, log, messages } = this;\n\n // Output request to console\n log.info(\n messages.blocks.tryPush(\n block.id,\n block.source.branch,\n currentEnv,\n env.currentProject\n )\n );\n console.log(jsonFormatter(block));\n\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Push new block version\n const [err, blockVersion] =\n await contensis.blocks.PushBlockVersion(block);\n if (!err) {\n log.success(\n messages.blocks.pushed(\n block.id,\n block.source.branch,\n currentEnv,\n env.currentProject\n )\n );\n }\n if (blockVersion) {\n await this.HandleFormattingAndOutput(blockVersion, () => {\n // print the version detail to console\n printBlockVersion(this, blockVersion);\n });\n }\n if (err)\n throw new Error(\n messages.blocks.failedPush(block.id, currentEnv, env.currentProject)\n );\n } else {\n throw new Error(\n messages.blocks.failedPush(block.id, currentEnv, env.currentProject)\n );\n }\n };\n\n GetLatestBlockVersion = async (\n blockId: string,\n branch = 'default'\n ): Promise<[AppError | null, string | undefined]> => {\n const { contensis, log, messages } = this;\n\n // Look for block versions pushed to \"default\" branch\n const [getErr, blockVersions] =\n (await contensis?.blocks.GetBlockVersions(blockId, branch)) || [];\n\n if (getErr) {\n return [getErr, undefined];\n }\n\n // Parse versionNo from response\n let blockVersionNo = 'latest';\n // The first blockVersion should be the latest one\n try {\n blockVersionNo = `${blockVersions?.[0]?.version.versionNo}`;\n\n if (!Number.isNaN(blockVersionNo) && Number(blockVersionNo) > 0)\n // Is a valid versionNo\n return [null, blockVersionNo];\n else throw new Error(`'${blockVersionNo}' is not a valid version number`);\n } catch (parseVersionEx: any) {\n // Catch parsing errors in case of an unexpected response\n log.info(\n `Request for blockId: ${blockId}, branch: ${branch}, version: latest`\n );\n log.info(\n `Get block versions response was: ${tryStringify(blockVersions)}`\n );\n log.error(messages.blocks.failedParsingVersion());\n return [parseVersionEx, undefined];\n }\n };\n\n ExecuteBlockAction = async (\n action: BlockActionType,\n blockId: string,\n version = 'latest'\n ) => {\n const { currentEnv, env, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n let actionOnBlockVersion = version;\n\n // If action is release and version is latest, find the latest version number\n if (action === 'release' && version === 'latest') {\n const [getErr, blockVersion] =\n await this.GetLatestBlockVersion(blockId);\n\n if (getErr) {\n // Log error getting latest block version no\n // and throw the error message so the process can exit with a failure\n throw new Error(\n `${messages.blocks.noList(\n currentEnv,\n env.currentProject\n )} (${getErr})`\n );\n } else if (blockVersion) {\n actionOnBlockVersion = blockVersion;\n }\n }\n\n // Execute block action\n const [err, blockVersion] = await contensis.blocks.BlockAction(\n blockId,\n action,\n actionOnBlockVersion\n );\n\n if (blockVersion) {\n await this.HandleFormattingAndOutput(blockVersion, () => {\n // print the version detail to console\n log.success(\n messages.blocks.actionComplete(\n action,\n blockId,\n currentEnv,\n env.currentProject\n )\n );\n printBlockVersion(this, blockVersion);\n });\n }\n\n if (err) {\n log.error(jsonFormatter(err));\n throw new Error(\n messages.blocks.actionFailed(\n action,\n blockId,\n currentEnv,\n env.currentProject\n )\n );\n }\n }\n };\n\n PrintBlockLogs = async (\n blockId: string,\n branch: string,\n version: string,\n dataCenter: 'hq' | 'manchester' | 'london' | undefined,\n follow = false\n ) => {\n const { currentEnv, env, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve block logs\n log.success(\n messages.blocks.getLogs(blockId, branch, currentEnv, env.currentProject)\n );\n\n const [err, blockLogs] = await contensis.blocks.GetBlockLogs({\n blockId,\n branchId: branch,\n version,\n dataCenter,\n });\n\n if (err) {\n log.error(\n messages.blocks.failedGetLogs(blockId, currentEnv, env.currentProject)\n );\n log.error(jsonFormatter(err));\n } else if (blockLogs) {\n const removeTrailingNewline = (logs: string) =>\n logs.endsWith('\\n') ? logs.slice(0, logs.length - 1) : logs;\n const renderLogs = removeTrailingNewline(blockLogs);\n\n await this.HandleFormattingAndOutput(renderLogs, () => {\n // print the logs to console\n console.log(\n ` - ${blockId} ${branch} ${\n Number(version) ? `v${version}` : version\n } ${dataCenter ? `[${dataCenter}]` : ''}`\n );\n log.line();\n console.log(log.infoText(renderLogs));\n });\n\n // Code for the `--follow` options\n let following = follow;\n let alreadyShown = blockLogs;\n let needsNewLine = false;\n let counter = 0;\n\n // remove existing listeners and add them back afterwards\n const listeners = process.listeners('SIGINT');\n\n process.removeAllListeners('SIGINT');\n // add listener to update following to false and break out\n process.on('SIGINT', () => {\n Logger.warning(\n messages.blocks.stopFollow(blockId, currentEnv, env.currentProject)\n );\n stopFollowing();\n });\n\n const delay = promiseDelay(5 * 1000, null);\n const stopFollowing = () => {\n following = false;\n delay.cancel();\n\n // Add back the listeners we removed previously\n process.removeAllListeners('SIGINT');\n for (const listener of listeners)\n process.addListener('SIGINT', listener);\n };\n\n while (following) {\n if (counter++ > 300) {\n Logger.warning(\n messages.blocks.timeoutFollow(\n blockId,\n currentEnv,\n env.currentProject\n )\n );\n stopFollowing();\n }\n\n // wait n. seconds then poll for logs again\n await delay.wait();\n\n const [lastErr, lastLogs] = following\n ? await contensis.blocks.GetBlockLogs({\n blockId,\n branchId: branch,\n version,\n dataCenter,\n })\n : [null, null];\n\n if (lastLogs) {\n // Find the difference and output it next\n const difference = diffLogStrings(lastLogs, alreadyShown);\n if (difference) {\n if (needsNewLine) {\n console.log('');\n }\n // Take the trailing newline off of the logged output to\n // avoid blank lines inbetween logs fetched sequentially\n const render = removeTrailingNewline(difference);\n console.log(log.infoText(render));\n\n // Add what we've just rendered to already shown \"cache\"\n alreadyShown += `${render}\\n`;\n needsNewLine = false;\n } else {\n // If no difference output a dot\n process.stdout.write('.');\n needsNewLine = true;\n }\n } else if (lastErr) {\n // If error output an x\n process.stdout.write('x');\n needsNewLine = true;\n }\n }\n }\n }\n };\n\n PrintProxies = async (proxyId?: string) => {\n const { currentEnv, env, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve proxies list for env\n const [err, proxies] = await (contensis.proxies.GetProxies as any)(\n proxyId\n ); // TODO: resolve any cast;\n\n if (Array.isArray(proxies)) {\n await this.HandleFormattingAndOutput(proxies, () => {\n // print the proxies to console\n log.success(messages.proxies.list(currentEnv, env.currentProject));\n for (const { id, name, description, endpoints, version } of proxies) {\n console.log(\n ` - ${name} [${\n version.versionNo\n }] ${id} ${log.infoText`${description}`}`\n );\n for (const [language, endpoint] of Object.entries(\n endpoints as { [k: string]: any }\n )) // TODO: resolve any cast\n console.log(\n ` - ${log.infoText`language: ${language}\n server: ${endpoint.server}\n headers.host: ${endpoint.headers.host}\n ssl: ${endpoint.ssl}`}`\n );\n }\n });\n }\n\n if (err) {\n log.error(messages.proxies.noList(currentEnv, env.currentProject));\n log.error(jsonFormatter(err));\n }\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n PrintRenderers = async (rendererId?: string) => {\n const { currentEnv, env, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve renderers list for env\n const [err, renderers] = await contensis.renderers.GetRenderers();\n\n if (Array.isArray(renderers)) {\n await this.HandleFormattingAndOutput(renderers, () => {\n // print the renderers to console\n log.success(messages.renderers.list(currentEnv, env.currentProject));\n for (const {\n id,\n description,\n assignedContentTypes,\n rules,\n version,\n } of renderers) {\n console.log(\n ` - ${id} [${version.versionNo}] ${log.infoText`${description}`}`\n );\n if (assignedContentTypes?.length)\n console.log(\n log.infoText` assignedContentTypes: ${assignedContentTypes.join(\n ', '\n )}`\n );\n for (const rule of rules)\n if (rule.return)\n console.log(\n log.infoText` ${\n rule.return.endpointId ? 'endpointId' : 'blockId'\n }: ${rule.return.endpointId || rule.return.blockId}`\n );\n }\n });\n return renderers;\n }\n\n if (err) {\n log.error(messages.renderers.noList(currentEnv, env.currentProject));\n log.error(jsonFormatter(err));\n }\n }\n };\n\n HandleFormattingAndOutput = async <T>(obj: T, logFn: (obj: T) => void) => {\n const { format, log, messages, output } = this;\n const fields = this.contensis?.payload.query?.fields;\n\n if (!format) {\n // print the object to console\n logFn(obj);\n } else if (format === 'csv') {\n log.raw('');\n log.raw(log.infoText(await csvFormatter(limitFields(obj, fields))));\n } else if (format === 'xml') {\n log.raw('');\n log.raw(log.infoText(xmlFormatter(limitFields(obj, fields))));\n } else if (format === 'json') {\n log.raw('');\n log.raw(log.infoText(jsonFormatter(obj, fields)));\n }\n log.raw('');\n\n if (output) {\n let writeString = '';\n const isText = !tryParse(obj) && typeof obj === 'string';\n if (format === 'csv') {\n writeString = await csvFormatter(limitFields(obj, fields));\n } else if (format === 'xml') {\n writeString = xmlFormatter(limitFields(obj, fields));\n } else\n writeString = isText ? (obj as string) : jsonFormatter(obj, fields);\n // write output to file\n if (writeString) {\n fs.writeFileSync(output, writeString);\n log.success(messages.app.fileOutput(isText ? 'text' : format, output));\n } else {\n log.info(messages.app.noFileOutput());\n }\n }\n };\n}\n\nexport const cliCommand = (\n commandArgs: string[],\n outputOpts?: OutputOptionsConstructorArg,\n contensisOpts: Partial<MigrateRequest> = {}\n) => {\n return new ContensisCli(['', '', ...commandArgs], outputOpts, contensisOpts);\n};\nexport default ContensisCli;\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAe;AACf,mBAAkB;AAClB,gBAAe;AACf,sBAAqB;AACrB,wBAAkB;AAClB,kBAAiB;AACjB,kBAAkB;AAIlB,0BASO;AAEP,kCAAiC;AAEjC,mBAA4B;AAO5B,2BAA+B;AAC/B,kCAAiC;AACjC,gCAA+B;AAE/B,kBAOO;AACP,qBAA4B;AAC5B,qBAOO;AACP,iBAA6B;AAC7B,kBAA2C;AAC3C,iBAA6B;AAC7B,mBAAwB;AACxB,kBAA+B;AAC/B,kBAA+B;AAC/B,oBAAiC;AACjC,oBAA6B;AAE7B,IAAI,+BAA+B;AAEnC,MAAM,aAAa;AAAA,EACjB,OAAO,OAAO,CAAC,UAAkB;AAC/B,YAAQ,mBAAmB,MAAM;AACjC,UAAM,WAAW,QAAQ,IAAI;AAG7B,YAAQ,KAAK,QAAQ;AAAA,EACvB;AAAA,EAEQ;AAAA,EACA;AAAA,EACA;AAAA,EAER;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAQ,sBAAQ;AAAA,EAEhB;AAAA,EACA;AAAA,EACA;AAAA,EACA,MAAM;AAAA,EACN,WAAW;AAAA,EAEX;AAAA,EACA;AAAA,EACA;AAAA,EAEA,IAAI,QAAQ;AACV,WAAO,KAAK,QAAQ,IAAI;AAAA,EAC1B;AAAA,EAEA,IAAI,aAAa;AACf,WAAO,KAAK,MAAM,sBAAsB;AAAA,EAC1C;AAAA,EAEA,IAAI,WAAW,oBAA4B;AACzC,SAAK,QAAQ,OAAO,EAAE,mBAAmB,CAAC;AAAA,EAC5C;AAAA,EAEA,IAAI,MAAM;AACR,UAAM,qBAAqB,KAAK;AAChC,UAAM,eAAe,KAAK,MAAM,gBAAgB,CAAC;AAEjD,QAAI,CAAC,mBAAoB,QAAO,CAAC;AAAA,aACxB,aAAa,kBAAkB;AACtC,aAAO,aAAa,kBAAkB;AAAA,SACnC;AACH,aAAO;AAAA,QACL,SAAS,CAAC;AAAA,QACV,YAAY;AAAA,QACZ,UAAU,CAAC;AAAA,QACX,eAAe;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YACE,MACA,YACA,gBAAyC,CAAC,GAC1C;AA7HJ;AAgII,UAAM,CAAC,KAAK,QAAQ,OAAO,IAAI,OAAO,IAAI,GAAG,QAAQ,IAAI;AACzD,SAAK,OAAO,6BAAM;AAClB,SAAK,OAAO,6BAAM;AAClB,SAAK,WAAW,qCAAW;AAE3B,UAAM,cAAc,GAAG,KAAK,IAAI,IAAI,KAAK,IAAI,IAC3C,WAAW,SAAS,KAAK,GAAG,IAAI,EAClC,GAAG,KAAK;AAER,SAAK,UAAU,IAAI,4BAAAA,QAAqB;AAExC,SAAK,gBAAgB;AAGrB,QAAI,MAAM,SAAQ,UAAK,cAAc,UAAnB,mBAA0B,MAAM,GAAG;AACnD,WAAK,cAAc,MAAM,aAAS;AAAA,QAChC,KAAK,cAAc,MAAM;AAAA,MAC3B;AAAA,IACF;AAEA,SAAK,SAAS,yCAAY;AAC1B,SAAK,UACH,yCAAY,WAAU,YAAAC,QAAK,KAAK,QAAQ,IAAI,GAAG,WAAW,MAAM;AAElE,UAAM,sBAAqB,yCAAY,UAAS,KAAK;AACrD,UAAM,eAAe,KAAK,MAAM,gBAAgB,CAAC;AACjD,SAAK,aAAa;AAGlB,UAAM,MAAM,KAAK;AACjB,QAAI,yCAAY,UAAW,KAAI,iBAAiB,WAAW;AAC3D,QAAI,yCAAY,KAAM,KAAI,aAAa,WAAW;AAElD,QAAI,yCAAY,SAAU,KAAI,mBAAmB,WAAW;AAC5D,QAAI,yCAAY,SAAU,KAAI,aAAa,WAAW;AACtD,QAAI,yCAAY;AACd,UAAI,WAAW,aAAa,WAAW,GAAG;AACxC,cAAM,IAAI;AAAA,UACR,4CAA4C,WAAW,YAAY;AAAA,QACrE;AAAA,UACG,KAAI,mBAAmB,WAAW;AAEzC,SAAK,kBAAiB,2BAAK,mBAAkB;AAC7C,SAAK,eAAc,yCAAY,gBAAe;AAE9C,QAAI,oBAAoB;AACtB,WAAK,WAAO,iBAAI,qBAAoB,2BAAK,mBAAkB,SAAS;AAAA,IACtE;AAEA,SAAK,UAAU;AAAA,MACb;AAAA,MACA,SAAS;AAAA,MACT,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpC,WAAW,2BAAK;AAAA,IAClB;AAEA,QAAI,oBAAoB;AACtB,UAAI,UAAU,CAAC,KAAK,OAAO;AAC3B,UAAI,aAAa;AACf,qBAAa,kBAAkB,IAAI;AACnC,aAAK,QAAQ,OAAO;AAAA,UAClB;AAAA,UACA;AAAA,UACA,SAAS,CAAC,WAAW;AAAA,QACvB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,oBAAoB,YAAY;AAC9B,UAAM,EAAE,KAAK,SAAS,IAAI;AAC1B,UAAM,EAAE,oBAAoB,eAAe,CAAC,EAAE,IAAI,KAAK;AACvD,UAAM,UAAU,OAAO,KAAK,YAAY;AACxC,QAAI,QAAQ,SAAS,KAAK,MAAM,QAAQ,MAAM,CAAC;AAC/C,UAAM,KAAK,0BAA0B,SAAS,MAAM;AAElD,iBAAW,OAAO,SAAS;AACzB,gBAAQ,IAAI,OAAO,uBAAuB,MAAM,OAAO,EAAE,GAAG,GAAG,EAAE;AAAA,MACnE;AAAA,IACF,CAAC;AACD,QAAI,QAAQ,WAAW,KAAK,CAAC,oBAAoB;AAC/C,UAAI,KAAK,SAAS,KAAK,IAAI,CAAC;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,oBAAoB,OAAO,QAAgB;AACzC,UAAM,EAAE,KAAK,UAAU,QAAQ,IAAI;AACnC,UAAM,EAAE,oBAAoB,eAAe,CAAC,EAAE,IAAI,KAAK;AACvD,UAAM,UAAU,OAAO,KAAK,YAAY;AACxC,QAAI,QAAQ,SAAS,KAAK,MAAM,QAAQ,MAAM,CAAC;AAC/C,QAAI,aAAa,GAAG,GAAG;AAErB,cAAQ,UAAU,GAAG;AAErB,YAAM,aAAa,aAAa,GAAG,EAAE;AACrC,UAAI,YAAY;AACd,cAAM,CAAC,KAAK,WAAW,IAAI,MAAM,IAAI,0BAAAC,QAAmB;AAAA,UACtD,QAAQ,aAAa,GAAG,EAAE;AAAA,UAC1B,OAAO;AAAA,QACT,CAAC,EAAE,KAAK;AACR,YAAI,CAAC,OAAO,YAAa,OAAM,YAAY,OAAO;AAAA,MACpD;AACA,UAAI,QAAQ,SAAS,KAAK,QAAQ,GAAG,CAAC;AAGtC,YAAM,KAAK,0BAA0B,aAAa,GAAG,GAAG,MAAM,IAAI,KAAK,CAAC;AAAA,IAC1E,OAAO;AACL,UAAI,QAAQ,SAAS,KAAK,SAAS,GAAG,CAAC;AAAA,IACzC;AAEA,UAAM,iBACJ,uBAAuB,MAAM,SAAY;AAC3C,QAAI,QAAQ,WAAW,KAAK,CAAC,eAAgB,KAAI,KAAK,SAAS,KAAK,IAAI,CAAC;AAEzE,WAAO;AAAA,EACT;AAAA,EAEA,UAAU,OAAO,gBAAwB;AArP3C;AAsPI,UAAM,EAAE,KAAK,UAAU,QAAQ,IAAI;AAEnC,QAAI,aAAa;AACf,WAAK,aAAa;AAClB,WAAK,WAAO,iBAAI,aAAa,SAAS;AAGtC,YAAM,CAAC,UAAU,QAAQ,IAAI,UAAM,mBAAAC,aAAG,kBAAAC,SAAM,KAAK,KAAK,GAAG,CAAC;AAC1D,UAAI,aAAY,qCAAU,UAAS,KAAK;AACtC,YAAI,QAAQ,SAAS,QAAQ,UAAU,WAAW,CAAC;AACnD,gBAAQ,UAAU,KAAK,KAAK,WAAW;AAEvC,aAAI,UAAK,QAAL,mBAAU,YAAY;AAExB,gBAAM,KAAK,cAAc;AAAA,QAC3B,OAAO;AACL,cAAI,QAAQ,SAAS,SAAS,OAAO,CAAC;AACtC,cAAI,KAAK,SAAS,QAAQ,IAAI,CAAC;AAAA,QACjC;AAAA,MACF,OAAO;AAEL,YAAI;AAAA,UACF,SAAS,QAAQ,YAAY,KAAK,KAAK,MAAK,qCAAU,WAAU,CAAC;AAAA,QACnE;AAAA,MACF;AAAA,IACF,OAAO;AAEL,UAAI,MAAM,SAAS,QAAQ,MAAM,CAAC;AAAA,IACpC;AAAA,EACF;AAAA,EAEA,mBAAmB,OAAO,EAAE,SAAS,MAAM,IAAI,CAAC,MAAM;AArRxD;AAsRI,QAAI,CAAC,KAAK,WAAW;AACnB,YAAM,EAAE,eAAe,YAAY,KAAK,KAAK,SAAS,IAAI;AAC1D,YAAM,SAAS,2BAAK;AACpB,YAAM,WAAW,cAAU,oBAAO,MAAM;AAExC,UAAI,cAAc,QAAQ;AACxB,cAAM,cAAc,MAAM,KAAK;AAAA,UAC7B;AAAA,UACA,IAAI;AAAA,QACN;AAEA,cAAM,kBAAiB,gDAAa,YAAb,mBAAsB;AAE7C,YAAI,gBAAgB;AAClB,eAAK,YAAY,IAAI;AAAA,YACnB;AAAA,cACE,GAAG;AAAA,cACH,QAAQ;AAAA,gBACN,OAAK,UAAK,SAAL,mBAAW,QAAO;AAAA,gBACvB,UAAU,CAAC,WAAW,SAAS;AAAA,gBAC/B,UAAU,CAAC,WAAW,iBAAiB;AAAA,gBACvC,UAAU,WAAW,SAAS;AAAA,gBAC9B,cAAc,WAAW,iBAAiB;AAAA,gBAC1C,UAAS,2BAAK,mBAAkB;AAAA,gBAChC,gBAAe,UAAK,SAAL,mBAAW;AAAA,cAC5B;AAAA,cACA,aACE,OAAO,cAAc,gBAAgB,cACjC,cAAc,cACd;AAAA,cACN,gBAAgB;AAAA,YAClB;AAAA,YACA,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF,OAAO;AACL,YAAI,CAAC,WAAY,KAAI,KAAK,SAAS,QAAQ,KAAK,CAAC;AACjD,YAAI,CAAC,OAAQ,KAAI,KAAK,SAAS,QAAQ,IAAI,CAAC;AAAA,MAC9C;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,yBAAyB,OAAO;AAAA,IAC9B,SAAS;AAAA,IACT;AAAA,IACA;AAAA,EACF,MAUM;AA/UR;AAgVI,UAAM,SAA+B,WAAW,SAAS;AAEzD,UAAM,WAAW,WAAY,UAAM,qCAAe,QAAQ,KAAM,CAAC,IAAI,CAAC;AAEtE,QAAI,OAAO,aAAa;AACtB,YAAM,IAAI,MAAM,yCAAyC;AAE3D,UAAM,EAAE,eAAe,YAAY,KAAK,KAAK,UAAU,YAAY,IAAI;AACvE,UAAM,eAAe,KAAK,MAAM,gBAAgB,CAAC;AACjD,UAAM,oBAAoB,aAAa,eAAe,EAAE,KAAK,CAAC;AAC9D,UAAM,YACH,YAAY,iBAAiB,cAAc,UAC3C,CAAC;AACJ,UAAM,eACJ,UAAU,YAAY,UAAU,YAAY,kBAAkB;AAChE,UAAM,kBACJ,UAAU,WAAW,kBAAkB,kBAAkB;AAC3D,UAAM,iBAAiB,oBAAgB,oBAAO,YAAY;AAC1D,UAAM,iBAAa,iBAAI,eAAe,IAAI,eAAe;AAEzD,UAAM,iBACJ,UAAU,gBACV,UAAU,YACV,kBAAkB;AAEpB,UAAM,eAAe,2BAAK;AAC1B,UAAM,iBAAiB,oBAAgB,oBAAO,YAAY;AAE1D,QAAI,gBAAgB,cAAc,cAAc;AAC9C,YAAM,oBAAoB,MAAM,KAAK;AAAA,QACnC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,YAAM,wBAAuB,4DAAmB,YAAnB,mBAA4B;AAEzD,YAAM,oBAAoB,MAAM,KAAK;AAAA,QACnC;AAAA,QACA,IAAI;AAAA,MACN;AAEA,YAAM,wBAAuB,4DAAmB,YAAnB,mBAA4B;AAEzD,UAAI,wBAAwB,sBAAsB;AAChD,YAAI,WAAW,UAAU,mBAAmB,cAAc;AACxD,eAAK,YAAY,IAAI;AAAA,YACnB;AAAA,cACE,aAAa;AAAA,cACb,gBAAgB;AAAA,cAChB,GAAG;AAAA,cACH,QAAQ;AAAA,gBACN,OAAK,UAAK,SAAL,mBAAW,QAAO;AAAA,gBACvB,UAAU,CAAC,iBAAiB,eAAe;AAAA,gBAC3C,UAAU,CAAC,iBAAiB,uBAAuB;AAAA,gBACnD,UAAU,iBAAiB,eAAe;AAAA,gBAC1C,cAAc,iBAAiB,uBAAuB;AAAA,gBACtD,gBAAgB,CAAC,IAAI,kBAAkB,EAAE;AAAA,gBACzC,gBAAe,UAAK,SAAL,mBAAW;AAAA,cAC5B;AAAA,cACA,GAAI,iBAAiB,EAAE,CAAC,cAAc,GAAG,SAAS,IAAI,CAAC;AAAA,YACzD;AAAA,YACA,CAAC;AAAA,UACH;AAAA,QACF,WAAW,WAAW,aAAa;AACjC,eAAK,YAAY,IAAI;AAAA,YACnB;AAAA,cACE,aAAa;AAAA,cACb,gBAAgB;AAAA,cAChB,GAAG;AAAA,cACH,QAAQ;AAAA,gBACN,KAAK,WAAW,OAAO;AAAA,gBACvB,UAAU,CAAC,iBAAiB,eAAe;AAAA,gBAC3C,UAAU,CAAC,iBAAiB,uBAAuB;AAAA,gBACnD,UAAU,iBAAiB,eAAe;AAAA,gBAC1C,cAAc,iBAAiB,uBAAuB;AAAA,gBACtD,SAAS;AAAA,gBACT,eAAe,WAAW;AAAA,cAC5B;AAAA,cACA,QAAQ;AAAA,gBACN,OAAK,UAAK,SAAL,mBAAW,QAAO;AAAA,gBACvB,UAAU,CAAC,iBAAiB,eAAe;AAAA,gBAC3C,UAAU,CAAC,iBAAiB,uBAAuB;AAAA,gBACnD,UAAU,iBAAiB,eAAe;AAAA,gBAC1C,cAAc,iBAAiB,uBAAuB;AAAA,gBACtD,gBAAgB,CAAC,IAAI,kBAAkB,EAAE;AAAA,gBACzC,gBAAe,UAAK,SAAL,mBAAW;AAAA,cAC5B;AAAA,YACF;AAAA,YACA,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,UAAI,CAAC,WAAY,KAAI,KAAK,SAAS,QAAQ,KAAK,CAAC;AACjD,UAAI,CAAC,aAAc,KAAI,KAAK,SAAS,QAAQ,IAAI,CAAC;AAAA,IACpD;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,iBAAiB,OACf,QACA,UACA,aAAa,KAAK,YAClB,iBAAiB,SAC2B;AAC5C,UAAM,EAAE,KAAK,SAAS,IAAI;AAC1B,QAAI,QAAQ;AACV,YAAM,CAAC,iBAAiB,WAAW,IAAI,MAAM,IAAI,0BAAAF;AAAA,QAC/C,EAAE,QAAQ,OAAO,WAAW;AAAA,QAC5B;AAAA,MACF,EAAE,KAAK;AAEP,UAAI,mBAAmB,CAAC,YAAY,SAAS;AAE3C,YAAI;AAAA,UACF,uCAAuC,MAAM,OAAO,UAAU;AAAA,UAC9D;AAAA,QACF;AACA;AAAA,MACF;AAEA,UAAI,YAAY,QAAQ,WAAW,MAAM;AACvC,YAAI,CAAC,8BAA8B;AACjC,cAAI,QAAQ,SAAS,MAAM,iBAAiB,CAAC;AAC7C,yCAA+B;AAAA,QACjC;AAAA,MACF,OAAO;AACL,cAAM,MAAM,KAAK,MAAM,aAAa,UAAU;AAC9C,YAAI,mBAAmB;AACvB,aAAK,QAAQ,UAAU,KAAK,YAAY,cAAc;AAAA,MACxD;AACA,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,QAAQ,OACN,QACA;AAAA,IACE,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,eAAe;AAAA,IACf,SAAS;AAAA,IACT,UAAU;AAAA,EACZ,IAMI,CAAC,MAC2B;AAxepC;AAyeI,QAAI,gBAAgB,YAAY;AAEhC,QAAI,CAAC;AACH,0BACE,4BAAe,KAAK,IAAI,gBAAgB,SACxC,wBAAW,KAAK,IAAI,gBAAgB,KACpC;AAEJ,UAAM,EAAE,SAAS,IAAI;AAErB,QAAI,QAAQ;AACV,YAAM,EAAE,YAAY,IAAI,IAAI;AAE5B,UAAI,YAAY;AACd,cAAM,cAAc,MAAM,KAAK,eAAe,QAAQ,aAAa;AAEnE,YAAI,aAAa;AACf,gBAAM,qBAAiB,yBAAW,iBAAY,YAAZ,mBAAqB,QAAQ;AAC/D,gBAAM,mBAAe,6BAAe,iBAAY,YAAZ,mBAAqB,QAAQ;AAEjE,cAAI,CAAC,kBAAkB,CAAC,gBAAgB,gBAAgB;AAEtD,aAAC,EAAE,cAAc,IAAI,MAAM,gBAAAG,QAAS,OAAO;AAAA,cACzC;AAAA,gBACE,MAAM;AAAA,gBACN,SAAS,SAAS,MAAM,eAAe,YAAY,MAAM;AAAA,gBACzD,MAAM;AAAA,gBACN,MAAM;AAAA,gBACN,QAAQ;AAAA,cACV;AAAA,YACF,CAAC;AAAA,UACH;AAEA,cAAI,iBAAiB,kBAAkB,cAAc;AACnD,iBAAK,OAAO,IAAI,4BAAAC,QAAqB;AAAA,cACnC,UAAU;AAAA,cACV,UAAU,iBAAiB;AAAA,cAC3B,YAAW,2BAAK,mBAAkB;AAAA,cAClC,WAAS,UAAK,SAAL,mBAAW,QAAO;AAAA,cAC3B,UAAU;AAAA,cACV,cAAc,gBAAgB;AAAA,YAChC,CAAC;AAED,kBAAM,CAAC,WAAW,WAAW,IAAI,UAAM,mBAAAH,SAAG,KAAK,KAAK,YAAY,CAAC;AAGjE,gBAAI,aAAa;AAEf,kBAAI,YAAY;AAChB,kBAAI,aAAa;AACjB,kBAAI,mBACF,YAAY,QAAQ,WAAW,QAC3B,iBAAY,YAAZ,mBAAqB,WACrB;AAGN,mBAAK,QAAQ,UAAU,GAAG;AAC1B,kBAAI,cAAe,OAAM,YAAY,KAAK,aAAa;AACvD,kBAAI,aAAc,OAAM,YAAY,KAAK,YAAY;AAErD,kBAAI,CAAC,QAAQ;AACX,qCAAO,QAAQ,SAAS,MAAM,QAAQ,YAAY,MAAM,CAAC;AACzD,sBAAM,KAAK,cAAc;AAAA,cAC3B;AAAA,YACF,WAAW,WAAW;AACpB,mCAAO,MAAM,UAAU,SAAS,CAAC;AAEjC,kBAAI,YAAY;AAChB,kBAAI,aAAa;AACjB,kBAAI,mBAAmB;AAEvB,mBAAK,QAAQ,UAAU,GAAG;AAG1B,mBACG,kBAAkB,iBACnB,YAAY,QAAQ,QACpB;AAEA,sBAAM,YAAY,OAAO;AACzB,uBAAO,MAAM,KAAK,MAAM,QAAQ,EAAE,UAAU,aAAa,CAAC;AAAA,cAC5D,OAAO;AACL,sBAAM,IAAI,MAAM,SAAS,MAAM,OAAO,YAAY,MAAM,CAAC;AAAA,cAC3D;AAAA,YACF;AAEA,mBAAO,IAAI;AAAA,UACb,OAAO;AACL,iCAAO,MAAM,SAAS,MAAM,eAAe,CAAC;AAC5C,gBAAI,UAAU;AACZ,qBAAO,MAAM,KAAK,MAAM,QAAQ,EAAE,SAAS,UAAU,EAAE,CAAC;AAAA,UAC5D;AAAA,QACF;AAAA,MACF,OAAO;AAEL,6BAAO,MAAM,SAAS,MAAM,MAAM,CAAC;AAAA,MACrC;AAAA,IACF,OAAO;AAEL,2BAAO,MAAM,SAAS,MAAM,SAAS,CAAC;AAAA,IACxC;AAAA,EACF;AAAA,EAEA,wBAAwB,YAAY;AAClC,UAAM,EAAE,KAAK,SAAS,IAAI;AAC1B,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAE9C,QAAI,WAAW;AAEb,YAAM,CAAC,aAAa,QAAQ,IAAI,UAAM,mBAAAA;AAAA,QACpC,UAAU,SAAS,kBAAkB;AAAA,MACvC;AAEA,UAAI,MAAM,QAAQ,QAAQ,GAAG;AAE3B,cAAM,KAAK;AAAA,UAA0B,UAAU;AAAA,UAAkB,MAC/D,IAAI,IAAI,IAAI,cAAc,UAAU,gBAAgB,CAAC;AAAA,QACvD;AAAA,MACF;AAEA,UAAI,aAAa;AACf,YAAI,MAAM,SAAS,SAAS,OAAO,CAAC;AACpC,YAAI,MAAM,YAAY,OAAO;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,mBAAmB,YAAY;AAC7B,UAAM,EAAE,KAAK,SAAS,IAAI;AAC1B,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAE9C,QAAI,WAAW;AAEb,YAAM,CAAC,OAAO,KAAK,IAAI,UAAM,mBAAAA;AAAA,QAC3B,UAAU,QAAQ,WAAW,KAAK,YAAY;AAAA,MAChD;AACA,UAAI,OAAO;AAET,cAAM,KAAK;AAAA,UAA0B;AAAA,UAAO,MAC1C,IAAI,IAAI,IAAI,cAAc,KAAK,CAAC;AAAA,QAClC;AAAA,MACF;AAEA,UAAI,OAAO;AACT,YAAI,MAAM,SAAS,SAAS,OAAO,CAAC;AACpC,YAAI,MAAM,MAAM,OAAO;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAAA,EAEA,gBAAgB,YAAY;AAC1B,UAAM,EAAE,gBAAgB,KAAK,UAAU,QAAQ,IAAI;AACnD,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAE9C,QAAI,WAAW;AAEb,YAAM,CAAC,aAAa,QAAQ,IAAI,UAAM,mBAAAA;AAAA,QACpC,UAAU,SAAS,kBAAkB;AAAA,MACvC;AAEA,UAAI,MAAM,QAAQ,QAAQ,GAAG;AAE3B,cAAM,qBACJ,kBAAkB,mBAAmB,SACjC,iBACA,SAAS,KAAK,OAAK,EAAE,OAAO,SAAS,IACnC,YACA;AAER,gBAAQ,UAAU;AAAA,UAChB,UAAU,SAAS,IAAI,OAAK,EAAE,EAAE;AAAA,UAChC,gBAAgB;AAAA,QAClB,CAAC;AAED,YAAI,QAAQ,SAAS,SAAS,KAAK,CAAC;AACpC,YAAI,IAAI,EAAE;AAEV,cAAM,KAAK,0BAA0B,UAAU,MAAM;AAEnD,qBAAW,WAAW,SAAS;AAAA,YAAK,CAAC,GAAG,MACtC,EAAE,GAAG,cAAc,EAAE,EAAE;AAAA,UACzB,GAAG;AACD,gBAAI;AACJ,gBAAI;AACF,sBAAQ,aAAAI,QAAM,QAAS,QAAgB,KAAK;AAAA,YAC9C,SAAS,IAAI;AACX,mCAAO,MAAM,GAAG,EAAE,EAAE;AACpB,sBAAQ,aAAAA,QAAM;AAAA,YAChB;AACA,oBAAQ;AAAA,cACN,GACE,uBAAuB,QAAQ,KAC3B,MAAM,IAAI,SAAS,MAAM,QAAQ,EAAE,CAAC,CAAC,KACrC,OAAO,MAAM,QAAQ,EAAE,CAAC,EAC9B,IAAI,IAAI;AAAA,gBACN,IAAI,QAAQ,mBACT;AAAA,kBAAI,OACH,MAAM,QAAQ,kBAAkB,IAAI,IAAI,SAAS,CAAC,CAAC,KAAK;AAAA,gBAC1D,EACC,KAAK,GAAG,CAAC;AAAA,cACd,CAAC;AAAA,YACH;AAAA,UACF;AAAA,QACF,CAAC;AAED,YAAI,CAAC,KAAK,WAAW,kBAAkB;AACrC,cAAI,QAAQ,SAAS,SAAS,IAAI,CAAC;AAAA,MACvC;AAEA,UAAI,aAAa;AACf,YAAI,MAAM,SAAS,SAAS,OAAO,CAAC;AACpC,YAAI,MAAM,YAAY,OAAO;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,eAAe,OAAO,YAAY,KAAK,mBAAmB;AACxD,UAAM,EAAE,KAAK,SAAS,IAAI;AAC1B,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAE9C,QAAI,WAAW;AAEb,YAAM,CAAC,aAAa,QAAQ,IAAI,UAAM,mBAAAJ;AAAA,QACpC,UAAU,SAAS,kBAAkB;AAAA,MACvC;AAEA,YAAM,eAAe,qCAAU;AAAA,QAC7B,OAAK,EAAE,GAAG,YAAY,MAAM,UAAU,YAAY;AAAA;AAGpD,UAAI,cAAc;AAChB,YAAI,IAAI,EAAE;AACV,cAAM,KAAK,0BAA0B,cAAc,IAAI,MAAM;AAAA,MAC/D;AAEA,UAAI,aAAa;AACf,YAAI,MAAM,SAAS,SAAS,OAAO,CAAC;AACpC,YAAI,MAAM,YAAY,OAAO;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,aAAa,CAAC,YAAY,cAAc;AACtC,UAAM,EAAE,KAAK,KAAK,UAAU,QAAQ,IAAI;AACxC,QAAI;AACJ,SAAI,2BAAK,SAAS,UAAS,MAAK,2BAAK,aAAY;AAC/C,sBAAgB,IAAI,SAAS;AAAA,QAC3B,OAAK,EAAE,YAAY,MAAM,UAAU,YAAY;AAAA,MACjD;AACA,UAAI,eAAe;AACjB,YAAI,iBAAiB;AACrB,gBAAQ,UAAU,GAAG;AACrB,YAAI,QAAQ,SAAS,SAAS,IAAI,SAAS,CAAC;AAC5C,YAAI,IAAI,EAAE;AAAA,MACZ,OAAO;AACL,YAAI,MAAM,SAAS,SAAS,UAAU,SAAS,CAAC;AAAA,MAClD;AAAA,IACF,OAAO;AAEL,UAAI,QAAQ,SAAS,SAAS,OAAO,CAAC;AACtC,UAAI,KAAK,SAAS,QAAQ,IAAI,CAAC;AAAA,IACjC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,CAAC,kBAA0C;AACtD,UAAM,EAAE,KAAK,KAAK,UAAU,QAAQ,IAAI;AACxC,QAAI,CAAC,CAAC,UAAU,WAAW,EAAE,SAAS,aAAa,GAAG;AACpD,UAAI,MAAM,SAAS,QAAQ,QAAQ,aAAa,CAAC;AACjD,aAAO;AAAA,IACT;AACA,QAAI,CAAC,KAAK;AACR,UAAI,KAAK,SAAS,QAAQ,MAAM,CAAC;AACjC,aAAO;AAAA,IACT;AACA,SAAI,2BAAK,SAAS,UAAS,MAAK,2BAAK,aAAY;AAC/C,cAAQ,UAAU,EAAE,cAAc,CAAC;AACnC,UAAI,QAAQ,SAAS,QAAQ,IAAI,KAAK,YAAY,aAAa,CAAC;AAChE,aAAO;AAAA,IACT,OAAO;AAEL,UAAI,QAAQ,SAAS,SAAS,OAAO,CAAC;AACtC,UAAI,KAAK,SAAS,QAAQ,IAAI,CAAC;AAC/B,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,eAAe,YAAY;AACzB,UAAM,EAAE,YAAY,KAAK,SAAS,IAAI;AACtC,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAE9C,QAAI,WAAW;AAEb,YAAM,CAAC,SAAS,OAAO,IAAI,MAAM,UAAU,QAAQ,QAAQ;AAE3D,UAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,YAAI,QAAQ,SAAS,KAAK,KAAK,UAAU,CAAC;AAC1C,cAAM,KAAK,0BAA0B,SAAS,MAAM;AAElD,qBAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,KAAK,SAAS;AACZ,oBAAQ;AAAA,cACN,OAAO,IAAI,GACT,cAAc,KAAK,WAAW,MAAM,EACtC,KAAK,aAAa,SAAS,EAAE,UAAU,GAAG,EAAE,CAAC,IAAI,UAAU;AAAA,YAC7D;AACA,oBAAQ,IAAI,SAAS,EAAE,EAAE;AACzB,oBAAQ,IAAI,SAAS,YAAY,EAAE;AAAA,UACrC;AAAA,QACF,CAAC;AAAA,MACH;AAEA,UAAI,SAAS;AACX,YAAI,MAAM,SAAS,KAAK,OAAO,UAAU,CAAC;AAC1C,YAAI,UAAM,2BAAc,OAAO,CAAC;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,eAAe,OAAO,MAAc,cAAc,OAAO;AACvD,UAAM,EAAE,YAAY,KAAK,SAAS,IAAI;AACtC,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAE9C,QAAI,WAAW;AACb,YAAM,CAAC,KAAK,GAAG,IAAI,MAAM,UAAU,QAAQ,UAAU,MAAM,WAAW;AAEtE,UAAI,KAAK;AACP,YAAI,QAAQ,SAAS,KAAK,QAAQ,YAAY,IAAI,CAAC;AAGnD,gBAAQ;AAAA,UACN,OAAO,aAAAI,QAAM,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI,aACjC,SAAS,EACT,UAAU,GAAG,EAAE,CAAC,IAAI,IAAI,UAAU;AAAA,QACvC;AACA,YAAI,IAAI;AACN,kBAAQ,IAAI,OAAO,IAAI,SAAS,IAAI,WAAW,CAAC,EAAE;AACpD,gBAAQ,IAAI,OAAO,aAAAA,QAAM,KAAK,QAAQ,KAAK,IAAI,EAAE,EAAE;AACnD,gBAAQ;AAAA,UACN,OAAO,aAAAA,QAAM,KAAK,kBAAkB,KAAK,IAAI,YAAY;AAAA,QAC3D;AACA,gBAAQ,IAAI,EAAE;AACd,YAAI,KAAK,SAAS,KAAK,IAAI,CAAC;AAAA,MAC9B;AAEA,UAAI,KAAK;AACP,YAAI,MAAM,SAAS,KAAK,aAAa,YAAY,IAAI,GAAG,GAAG;AAAA,MAC7D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,eAAe,OAAO,OAAe;AACnC,UAAM,EAAE,YAAY,KAAK,SAAS,IAAI;AACtC,UAAM,YAAY,MAAM,KAAK,iBAAiB,EAAE,QAAQ,KAAK,CAAC;AAE9D,QAAI,WAAW;AACb,YAAM,CAAC,GAAG,IAAI,MAAM,UAAU,QAAQ,UAAU,EAAE;AAElD,UAAI,CAAC,KAAK;AACR,YAAI,QAAQ,SAAS,KAAK,QAAQ,YAAY,EAAE,CAAC;AACjD,gBAAQ,IAAI,EAAE;AAAA,MAChB,OAAO;AACL,YAAI,MAAM,SAAS,KAAK,aAAa,YAAY,EAAE,GAAG,GAAG;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,aAAa,YAAY;AACvB,UAAM,EAAE,YAAY,KAAK,SAAS,IAAI;AACtC,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAE9C,QAAI,WAAW;AAEb,YAAM,CAAC,UAAU,KAAK,IAAI,UAAM,mBAAAJ,SAAG,UAAU,MAAM,SAAS,CAAC;AAE7D,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,YAAI,QAAQ,SAAS,MAAM,KAAK,UAAU,CAAC;AAE3C,YAAI,CAAC,MAAM,OAAQ,KAAI,KAAK,SAAS,MAAM,UAAU,CAAC;AAEtD,cAAM,KAAK,0BAA0B,OAAO,MAAM;AA32B1D;AA62BU,qBAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,KAAK,OAAO;AACV,kBAAM,QAAQ,UAAU,CAAC,MAAc,IAAI,IAAI;AAE/C,oBAAQ,IAAI,MAAM,OAAO,aAAAI,QAAM,KAAK,IAAI,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC,EAAE,CAAC;AAChE,gBAAI,YAAa,SAAQ,IAAI,IAAI,SAAS,OAAO,WAAW,EAAE,CAAC;AAC/D,gBAAI,YAAY;AACd,sBAAQ,IAAI,SAAS,aAAAA,QAAM,KAAK,KAAK,SAAS,CAAC,SAAS;AAC1D,iBAAI,iBAAY,WAAZ,mBAAoB;AACtB,sBAAQ;AAAA,gBACN,SAAS,aAAAA,QAAM,KAAK,KAAK,QAAQ,CAAC,KAAK,YAAY,OAAO;AAAA,kBACxD;AAAA,gBACF,CAAC;AAAA,cACH;AACF,iBAAI,iBAAY,UAAZ,mBAAmB;AACrB,sBAAQ;AAAA,gBACN,SAAS,aAAAA,QAAM,KAAK,KAAK,OAAO,CAAC,KAAK,YAAY,MAAM;AAAA,kBACtD;AAAA,gBACF,CAAC;AAAA,cACH;AACF,iBAAI,iBAAY,YAAZ,mBAAqB;AACvB,sBAAQ;AAAA,gBACN,SAAS,aAAAA,QAAM,KAAK,KAAK,MAAM,CAAC,KAAK,YAAY,QAAQ;AAAA,kBACvD;AAAA,gBACF,CAAC;AAAA,cACH;AAEF,iBAAI,iBAAY,YAAZ,mBAAqB,QAAQ;AAC/B,sBAAQ,IAAI,SAAS,aAAAA,QAAM,KAAK,KAAK,SAAS,CAAC,GAAG;AAClD,yBAAW,KAAK,YAAY;AAC1B,wBAAQ;AAAA,kBACN,WAAW,EAAE,EAAE,KAAK,IAAI;AAAA,oBACtB,EAAE,QAAQ,SAAS,IACf,EAAE,QAAQ,SACV,EAAE,QAAQ,KAAK,IAAI;AAAA,kBACzB,CAAC;AAAA,gBACH;AAAA,YACJ;AACA,iBAAI,iBAAY,iBAAZ,mBAA0B;AAC5B,sBAAQ;AAAA,gBACN,SAAS,aAAAA,QAAM,KAAK;AAAA,kBAClB;AAAA,gBACF,CAAC,KAAK,YAAY,aACf;AAAA,kBACC,OACE,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,KAAK,GAAG,CAAC,KAC7B,EACA,UAAU,KAAK,GAAG,CAAC;AAAA,gBACzB,EACC,KAAK,IAAI,CAAC;AAAA,cACf;AAAA,UACJ;AAAA,QACF,CAAC;AAAA,MACH;AAEA,UAAI,UAAU;AACZ,YAAI,MAAM,SAAS,MAAM,OAAO,UAAU,CAAC;AAC3C,YAAI,UAAM,2BAAc,QAAQ,CAAC;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY,OAAO,iBAAyB;AAC1C,UAAM,EAAE,YAAY,KAAK,SAAS,IAAI;AACtC,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAE9C,QAAI,WAAW;AAEb,YAAM,CAAC,UAAU,KAAK,IAAI,UAAM,mBAAAJ,SAAG,UAAU,MAAM,SAAS,CAAC;AAE7D,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,YAAI,QAAQ,SAAS,MAAM,KAAK,UAAU,CAAC;AAE3C,cAAM,WAAO,4BAAe,OAAO,YAAY;AAE/C,YAAI,KAAM,OAAM,KAAK,0BAA0B,MAAM,IAAI,MAAM;AAAA,YAC1D,KAAI,MAAM,SAAS,MAAM,UAAU,YAAY,YAAY,CAAC;AAAA,MACnE;AAEA,UAAI,UAAU;AACZ,YAAI,MAAM,SAAS,MAAM,OAAO,UAAU,CAAC;AAC3C,YAAI,UAAM,2BAAc,QAAQ,CAAC;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,aAAa,OAAO,SAAwB;AAC1C,UAAM,EAAE,YAAY,KAAK,SAAS,IAAI;AACtC,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAE9C,QAAI,WAAW;AACb,YAAM,CAAC,KAAK,OAAO,IAAI,MAAM,UAAU,MAAM,WAAW,IAAY;AAEpE,UAAI,SAAS;AACX,YAAI;AAAA,UACF,SAAS,MAAM,QAAQ,YAAY,KAAK,MAAM,KAAK,QAAQ,EAAE;AAAA,QAC/D;AAEA,cAAM,KAAK,0BAA0B,SAAS,IAAI,MAAM;AAExD,YAAI,KAAK,SAAS,MAAM,IAAI,CAAC;AAC7B,eAAO,KAAK;AAAA,MACd;AAEA,UAAI,KAAK;AACP,YAAI;AAAA,UACF,SAAS,MAAM,aAAa,YAAY,KAAK,MAAM,KAAK,QAAQ,EAAE;AAAA,UAClE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,aAAa,OAAO,cAAsB,SAAwB;AAChE,UAAM,EAAE,YAAY,KAAK,SAAS,IAAI;AACtC,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAE9C,QAAI,WAAW;AAEb,YAAM,CAAC,UAAU,KAAK,IAAI,UAAM,mBAAAA,SAAG,UAAU,MAAM,SAAS,CAAC;AAE7D,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,YAAI,QAAQ,SAAS,MAAM,KAAK,UAAU,CAAC;AAE3C,cAAM,mBAAe,4BAAe,OAAO,cAAc,IAAI;AAC7D,YAAI,cAAc;AAChB,cAAI,KAAK,SAAS,MAAM,WAAW,CAAC;AACpC,cAAI,OAAO,IAAI;AACf,cAAI,IAAI,EAAE;AACV,gBAAM,CAAC,WAAW,OAAO,IAAI,MAAM,UAAU,MAAM;AAAA,YACjD,aAAa;AAAA,YACb;AAAA,UACF;AACA,cAAI;AACF,gBAAI,MAAM,SAAS,MAAM,UAAU,YAAY,YAAY,CAAC;AAAA,eACzD;AACH,gBAAI,QAAQ,SAAS,MAAM,IAAI,CAAC;AAEhC,kBAAM,KAAK,0BAA0B,SAAS,IAAI,MAAM;AAAA,UAC1D;AAAA,QACF,OAAO;AAEL,cAAI,MAAM,SAAS,MAAM,UAAU,YAAY,YAAY,CAAC;AAAA,QAC9D;AAAA,MACF;AAEA,UAAI,UAAU;AACZ,YAAI,MAAM,SAAS,MAAM,OAAO,UAAU,CAAC;AAC3C,YAAI,UAAM,2BAAc,QAAQ,CAAC;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,aAAa,OAAO,iBAAyB;AAC3C,UAAM,EAAE,YAAY,KAAK,SAAS,IAAI;AACtC,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAE9C,QAAI,WAAW;AAEb,YAAM,CAAC,UAAU,KAAK,IAAI,UAAM,mBAAAA,SAAG,UAAU,MAAM,SAAS,CAAC;AAE7D,UAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,YAAI,QAAQ,SAAS,MAAM,KAAK,UAAU,CAAC;AAE3C,cAAM,mBAAe,4BAAe,OAAO,cAAc,IAAI;AAE7D,YAAI,cAAc;AAChB,gBAAM,CAAC,SAAS,IAAI,MAAM,UAAU,MAAM,WAAW,aAAa,EAAE;AAEpE,cAAI;AACF,gBAAI,MAAM,SAAS,MAAM,aAAa,YAAY,YAAY,CAAC;AAAA,cAC5D,KAAI,QAAQ,SAAS,MAAM,QAAQ,YAAY,YAAY,CAAC;AAAA,QACnE,OAAO;AAEL,cAAI,MAAM,SAAS,MAAM,UAAU,YAAY,YAAY,CAAC;AAAA,QAC9D;AAAA,MACF;AAEA,UAAI,UAAU;AACZ,YAAI,MAAM,SAAS,MAAM,OAAO,UAAU,CAAC;AAC3C,YAAI,UAAM,2BAAc,QAAQ,CAAC;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,iBAAiB,YAAY;AAC3B,UAAM,EAAE,YAAY,KAAK,SAAS,IAAI;AACtC,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAE9C,QAAI,WAAW;AAEb,YAAM,CAAC,cAAc,SAAS,IAC5B,MAAM,UAAU,QAAQ,WAAW,UAAU,aAAa;AAE5D,UAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,YAAI,QAAQ,SAAS,UAAU,KAAK,UAAU,CAAC;AAE/C,YAAI,CAAC,UAAU,OAAQ,KAAI,KAAK,SAAS,UAAU,UAAU,CAAC;AAE9D,cAAM,2BAA2B,CAAC,MAA+B;AA1jCzE;AA2jCU,8BAAO,OAAO,KAAK,CAAC,CAAC,MAArB,mBAAyB;AAAA;AAE3B,cAAM,KAAK,0BAA0B,WAAW,MAAM;AAGpD,qBAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,KAAK,WAAkB;AACrB,kBAAM,QAAQ,WAAW,CAAC,MAAc,IAAI,IAAI;AAEhD,oBAAQ;AAAA,cACN;AAAA,gBACE,OAAO,aAAAI,QAAM;AAAA,kBACX,yBAAyB,IAAI;AAAA,gBAC/B,CAAC,IAAI,IAAI,SAAS,EAAE,CAAC;AAAA,cACvB;AAAA,YACF;AACA,gBAAI;AACF,sBAAQ;AAAA,gBACN,IAAI,SAAS,OAAO,yBAAyB,WAAW,CAAC,EAAE;AAAA,cAC7D;AACF,gBAAI,aAAa;AACf,sBAAQ,IAAI,SAAS,aAAAA,QAAM,KAAK,KAAK,UAAU,CAAC,SAAS;AAC3D,gBAAI,iCAAQ;AACV,sBAAQ;AAAA,gBACN,SAAS,aAAAA,QAAM,KAAK,KAAK,QAAQ,CAAC,KAAK,OACpC,IAAI,CAAC,UAAe,MAAM,EAAE,EAC5B,KAAK,IAAI,CAAC;AAAA,cACf;AACF,gBAAI,2CAAa;AACf,sBAAQ;AAAA,gBACN,SAAS,aAAAA,QAAM,KAAK,KAAK,aAAa,CAAC,KAAK,YACzC,IAAI,CAAC,WAAgB,OAAO,EAAE,EAC9B,KAAK,IAAI,CAAC;AAAA,cACf;AAAA,UACJ;AAAA,QACF,CAAC;AAAA,MACH;AAEA,UAAI,cAAc;AAChB,YAAI,MAAM,SAAS,UAAU,OAAO,UAAU,CAAC;AAC/C,YAAI,UAAM,2BAAc,YAAY,CAAC;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,gBAAgB,OAAO,qBAA6B;AAClD,UAAM,EAAE,YAAY,KAAK,SAAS,IAAI;AACtC,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAE9C,QAAI,WAAW;AAEb,YAAM,CAAC,cAAc,SAAS,IAC5B,MAAM,UAAU,QAAQ,WAAW,UAAU,aAAa;AAE5D,UAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,YAAI,QAAQ,SAAS,UAAU,KAAK,UAAU,CAAC;AAE/C,cAAM,eAAW,4BAAe,WAAW,gBAAgB;AAE3D,YAAI;AACF,gBAAM,KAAK,0BAA0B,UAAU,IAAI,MAAM;AAAA;AAEzD,cAAI,MAAM,SAAS,UAAU,UAAU,YAAY,gBAAgB,CAAC;AAAA,MACxE;AAEA,UAAI,cAAc;AAChB,YAAI,MAAM,SAAS,UAAU,OAAO,UAAU,CAAC;AAC/C,YAAI,UAAM,2BAAc,YAAY,CAAC;AAAA,MACvC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,gBAAgB,OAAO,YAAqB;AAC1C,UAAM,EAAE,YAAY,KAAK,SAAS,IAAI;AACtC,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAE9C,QAAI,WAAW;AACb,YAAM,CAAC,KAAK,OAAO,IAAI,MAAM,UAAU,SAAS,cAAc,OAAO;AAErE,UAAI,SAAS;AACX,YAAI,QAAQ,SAAS,SAAS,QAAQ,YAAY,QAAQ,EAAE,CAAC;AAE7D,cAAM,KAAK,0BAA0B,SAAS,MAAM;AAElD,eAAK,WAAW,QAAQ,EAAE;AAE1B,eAAK,cAAc;AAAA,QACrB,CAAC;AACD,eAAO,QAAQ;AAAA,MACjB;AAEA,UAAI,KAAK;AACP,YAAI,MAAM,SAAS,SAAS,aAAa,YAAY,QAAQ,EAAE,GAAG,GAAG;AAAA,MACvE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,gBAAgB,OAAO,YAA8B;AACnD,UAAM,EAAE,YAAY,gBAAgB,KAAK,SAAS,IAAI;AACtD,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAE9C,QAAI,WAAW;AACb,YAAM,CAAC,KAAK,OAAO,IAAI,MAAM,UAAU,SAAS,cAAc;AAAA,QAC5D,IAAI;AAAA,QACJ,GAAG;AAAA,MACL,CAAC;AAED,UAAI,SAAS;AACX,YAAI,QAAQ,SAAS,SAAS,QAAQ,YAAY,cAAc,CAAC;AAEjE,cAAM,KAAK,0BAA0B,SAAS,IAAI,MAAM;AACxD,eAAO,QAAQ;AAAA,MACjB;AAEA,UAAI,KAAK;AACP,YAAI;AAAA,UACF,SAAS,SAAS,aAAa,YAAY,cAAc;AAAA,UACzD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,qBAAqB,OACnB,WAAqB,CAAC,GACtB,SACG;AACH,UAAM,EAAE,gBAAgB,KAAK,SAAS,IAAI;AAC1C,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAC9C,QAAI,WAAW;AAEb,YAAM,SAAS,MAAM,UAAU,OAAO,cAAc;AACpD,YAAM,eAAe,MAAM,UAAU,OAAO,aAAa;AACzD,YAAM,aAAa,MAAM,UAAU,OAAO,WAAW;AAGrD,YAAM,gBAAe,qCAAU,UAC3B,iCAAQ;AAAA,QAAO,CAAC,MACd,SAAS,KAAK,QAAM,GAAG,YAAY,MAAM,EAAE,GAAG,YAAY,CAAC;AAAA,UAE7D;AACJ,YAAM,kBAA+C,CAAC;AAEtD,UAAI,KAAK,QAAQ;AAGf,cAAM,iBAAiB,MAAM;AAAA,UAC3B,oBAAI,IAAI;AAAA,YACN,IAAI,gBAAgB,UAAU,CAAC,GAAG,IAAI,OAAK,EAAE,EAAE;AAAA,YAC/C,IAAI,gBAAgB,UAAU,CAAC,GAC5B,IAAI,OAAE;AAvtCrB;AAutCwB,oCAAE,iBAAF,mBAAgB,iBAAhB,mBAA8B,IAAI,OAAK,EAAE,CAAC,OAAM,CAAC;AAAA,aAAC,EAC3D,KAAK;AAAA,UACV,CAAC;AAAA,QACH;AACA,cAAM,eAAe,MAAM;AAAA,UACzB,IAAI;AAAA,aACD,gBAAgB,UAAU,CAAC,GACzB,IAAI,OAAE;AA9tCrB;AA8tCwB,oCAAE,iBAAF,mBAAgB,eAAhB,mBAA4B,IAAI,OAAK,EAAE,CAAC,OAAM,CAAC;AAAA,aAAC,EACzD,KAAK;AAAA,UACV;AAAA,QACF;AAIA,wBAAgB;AAAA,UACd,GAAG,aAAa;AAAA,YAAO,OACrB,eACG,IAAI,OAAK,EAAE,YAAY,CAAC,EACxB,SAAS,EAAE,GAAG,YAAY,CAAC;AAAA,UAChC;AAAA,UACA,GAAG,WAAW;AAAA,YAAO,OACnB,aAAa,IAAI,OAAK,EAAE,YAAY,CAAC,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC;AAAA,UACpE;AAAA,QACF;AAAA,MACF;AAEA,UAAI,MAAM,QAAQ,YAAY,GAAG;AAC/B,YAAI,QAAQ,SAAS,OAAO,KAAK,cAAc,CAAC;AAChD,cAAM,KAAK;AAAA,UACT,KAAK,SAAS,kBAAkB;AAAA,UAChC,MAAM;AArvChB;AAuvCY,uBAAW,SAAS,cAAc;AAEhC,oBAAM,YAAQ,YAAAC,SAAM,EAAE,KAAK;AAC3B,kBAAI,CAAC,KAAK,YAAY;AAEpB,uBAAO,MAAM;AACb,qBAAI,WAAM,iBAAN,mBAAoB;AACtB,wBAAM,aAAa,aAAa,QAAQ,QAAM,GAAG,IAAI,CAAC;AACxD,qBAAI,WAAM,iBAAN,mBAAoB;AACtB,wBAAM,aAAa,WAAW,QAAQ,QAAM,GAAG,IAAI,CAAC;AAAA,cACxD;AAEA,kBAAI,IAAI,EAAE;AACV,kBAAI,OAAO,KAAK;AAAA,YAClB;AACA,gBAAI,IAAI,EAAE;AAAA,UACZ;AAAA,QACF;AAAA,MACF,OAAO;AACL,YAAI;AAAA,UACF,SAAS,OAAO,IAAI,iBAAgB,iCAAQ,OAAO,eAAc,GAAG;AAAA,QACtE;AACA,YAAI,IAAI,EAAE;AACV,YAAI,iCAAQ,QAAQ;AAClB,gBAAM,KAAK;AAAA,YACT,KAAK,SAAS,kBAAkB;AAAA,YAChC,MAAM;AAjxClB;AAmxCc,yBAAW,SAAS,QAAQ;AAC1B,sBAAMC,gBAAa,WAAM,eAAN,mBAAkB,WAAU;AAC/C,sBAAMC,kBAAe,WAAM,iBAAN,mBAAoB,WAAU;AACnD,sBAAM,cACH,WAAM,aAAN,mBAAgB,WAAU,QAAM,WAAM,UAAN,mBAAa,WAAU;AAC1D,sBAAM,kBACH,iBAAM,iBAAN,mBAAoB,eAApB,mBAAgC,WAAU,QAC1C,iBAAM,iBAAN,mBAAoB,iBAApB,mBAAkC,WAAU;AAC/C,sBAAM,kBACH,iBAAM,iBAAN,mBAAoB,eAApB,mBAAgC,WAAU,QAC1C,iBAAM,iBAAN,mBAAoB,iBAApB,mBAAkC,WAAU;AAE/C,sBAAM,SACJD,cAAaC,gBAAe,eAAe;AAC7C,oBAAI;AAAA,kBACF,OAAO,IAAI,cAAc,IAAI,SAAS,MAAM,EAAE,CAAC,CAAC,IAC9C,SACI,IAAI;AAAA,oBACF,KACED,cAAa,eAAeA,WAAU,OAAO,EAC/C,GACEC,gBACI,iBAAiBA,aAAY,OAC7B,EACN,GAAG,WAAW,aAAa,QAAQ,OAAO,EAAE,GAC1C,eAAe,eAAe,YAAY,OAAO,EACnD,GACE,eAAe,gBAAgB,YAAY,KAAK,EAClD;AAAA,kBACF,IACA,EACN;AAAA,gBACF;AAAA,cACF;AACA,kBAAI,IAAI,EAAE;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,sBAAsB,OAAO;AAAA,IAC3B;AAAA,IACA;AAAA,EACF,MAGM;AACJ,UAAM,EAAE,gBAAgB,KAAK,SAAS,IAAI;AAE1C,UAAM,WAAW,WACZ,UAAM,qCAA4C,QAAQ,KAAM,CAAC,IAClE,CAAC;AACL,QAAI,OAAO,aAAa;AACtB,YAAM,IAAI,MAAM,yCAAyC;AAE3D,UAAM,YAAY,MAAM,KAAK,uBAAuB;AAAA,MAClD;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,IAClB,CAAC;AAED,QAAI,WAAW;AACb,UAAI,KAAK;AACT,UAAI,UAAU,WAAW;AACvB,YAAI,QAAQ,SAAS,QAAQ,QAAQ,CAAC;AAAA,MACxC,OAAO;AACL,YAAI,QAAQ,SAAS,QAAQ,OAAO,CAAC;AAAA,MACvC;AAEA,YAAM,CAAC,YAAY,MAAM,IAAI,MAAM,UAAU,qBAAqB;AAElE,UAAI,WAAY,6BAAS,UAAU;AAAA;AAEjC,cAAM,KAAK,0BAA0B,QAAQ,MAAM;AAEjD,cAAI,CAAC,OAAO,WAAW;AACrB,gBAAI,IAAI,IAAI,SAAS;AAAA,eAAkB,CAAC;AACxC,gBAAI,CAAC,OAAO,aAAc,KAAI,KAAK;AAAA,CAAmB;AAAA,gBACjD,iDAA4B,MAAM,OAAO,YAAY;AAE1D,gBAAI,IAAI,IAAI,SAAS;AAAA,YAAe,CAAC;AACrC,gBAAI,CAAC,OAAO,WAAY,KAAI,KAAK;AAAA,CAAmB;AAAA,gBAC/C,iDAA4B,MAAM,OAAO,UAAU;AAExD,gBAAI,OAAO,YAAY,OAAO,KAAK,OAAO,QAAQ,EAAE,QAAQ;AAC1D,kBAAI,IAAI,IAAI,SAAS;AAAA,UAAa,CAAC;AACnC,8DAA4B,MAAM,OAAO,QAAQ;AAAA,YACnD;AACA,gBAAI,OAAO,SAAS,OAAO,KAAK,OAAO,KAAK,EAAE,QAAQ;AACpD,kBAAI,IAAI,IAAI,SAAS;AAAA,OAAU,CAAC;AAChC,8DAA4B,MAAM,OAAO,KAAK;AAAA,YAChD;AACA,gBAAI,OAAO,QAAQ;AACjB,kBAAI,IAAI,IAAI,SAAS;AAAA,QAAW,CAAC;AACjC,kBAAI,OAAO,OAAO,MAAM;AAAA,YAC1B;AAAA,UACF,OAAO;AACL,kBAAM,EAAE,eAAe,CAAC,EAAE,IAAI;AAC9B,gBAAI,IAAI,IAAI,SAAS;AAAA,eAAkB,CAAC;AACxC;AAAA,cACE;AAAA,cACA,aAAa,cAAc,EAAE;AAAA,YAC/B;AAEA,gBACE,OAAO,OAAO,aAAa,cAAc,EAAE,UAAU,EAAE;AAAA,cACrD,OAAK,EAAE,SAAS;AAAA,YAClB,GACA;AACA,kBAAI,IAAI,IAAI,SAAS;AAAA,YAAe,CAAC;AACrC;AAAA,gBACE;AAAA,gBACA,aAAa,cAAc,EAAE;AAAA,cAC/B;AAAA,YACF;AACA,gBACE,OAAO,OAAO,aAAa,cAAc,EAAE,YAAY,CAAC,CAAC,EAAE;AAAA,cACzD,OAAK,EAAE,SAAS;AAAA,YAClB,GACA;AACA,kBAAI,IAAI,IAAI,SAAS;AAAA,UAAa,CAAC;AACnC;AAAA,gBACE;AAAA,gBACA,aAAa,cAAc,EAAE;AAAA,cAC/B;AAAA,YACF;AACA,gBACE,OAAO,OAAO,aAAa,cAAc,EAAE,SAAS,CAAC,CAAC,EAAE;AAAA,cACtD,OAAK,EAAE,SAAS;AAAA,YAClB,GACA;AACA,kBAAI,IAAI,IAAI,SAAS;AAAA,OAAU,CAAC;AAChC;AAAA,gBACE;AAAA,gBACA,aAAa,cAAc,EAAE;AAAA,cAC/B;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAAA,IACL,OAAO;AACL,UAAI,QAAQ,SAAS,OAAO,OAAO,cAAc,CAAC;AAClD,UAAI,KAAK,SAAS,QAAQ,IAAI,CAAC;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,oBAAoB,YAAY;AAC9B,UAAM,EAAE,gBAAgB,KAAK,SAAS,IAAI;AAC1C,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAC9C,QAAI,WAAW;AAEb,YAAM,eAAe,MAAM,UAAU,OAAO,aAAa;AAEzD,UAAI,MAAM,QAAQ,YAAY,GAAG;AAC/B,YAAI,QAAQ,SAAS,aAAa,KAAK,cAAc,CAAC;AACtD,cAAM,KAAK,0BAA0B,cAAc,MAAM;AA/6CjE;AAi7CU,qBAAW,eAAe,cAAc;AACtC,kBAAM,iBAAe,iBAAY,WAAZ,mBAAoB,WAAU;AACnD,oBAAQ;AAAA,cACN,OAAO,YAAY,EAAE,KAAK,YAAY,SACpC,iBAAiB,IAAI,MAAM,EAC7B;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,mBAAmB,OAAO,kBAA0B;AAClD,UAAM,EAAE,gBAAgB,KAAK,SAAS,IAAI;AAC1C,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAC9C,QAAI,WAAW;AAEb,YAAM,eAAe,MAAM,UAAU,OAAO,aAAa;AAEzD,UAAI,MAAM,QAAQ,YAAY,GAAG;AAC/B,cAAM,cAAc,aAAa;AAAA,UAC/B,OAAK,EAAE,GAAG,YAAY,MAAM,cAAc,YAAY;AAAA,QACxD;AACA,YAAI,aAAa;AACf,cAAI;AAAA,YACF,SAAS,aAAa,IAAI,gBAAgB,YAAY,EAAE;AAAA,UAC1D;AAEA,gBAAM,KAAK,0BAA0B,aAAa,IAAI,MAAM;AAAA,QAC9D,OAAO;AACL,cAAI;AAAA,YACF,SAAS,aAAa,UAAU,gBAAgB,aAAa;AAAA,UAC/D;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,qBAAqB,OAAO,gBAA0B,SAAS,UAAU;AACvE,UAAM,EAAE,gBAAgB,KAAK,SAAS,IAAI;AAC1C,UAAM,YAAY,MAAM,KAAK,uBAAuB;AAAA,MAClD;AAAA,MACA,gBAAgB;AAAA;AAAA,IAClB,CAAC;AACD,QAAI,WAAW;AACb,YAAM,CAAC,KAAK,MAAM,IAAI,MAAM,UAAU,mBAAmB,cAAc;AAEvE,UAAI,KAAK;AACP,YAAI;AAAA,UACF,SAAS,aAAa;AAAA,YACpB;AAAA,YACA,eAAe,KAAK,IAAI;AAAA,UAC1B;AAAA,UACA;AAAA,QACF;AAAA,MACF,OAAO;AACL,YAAI;AAAA,UACF,SAAS,aAAa;AAAA,YACpB;AAAA,YACA,eAAe,KAAK,IAAI;AAAA,YACxB,CAAC,UAAU;AAAA,UACb;AAAA,QACF;AAEA,cAAM,KAAK,0BAA0B,QAAQ,IAAI,MAAM;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,qBAAqB,OACnB;AAAA,IACE;AAAA,IACA;AAAA,EACF,GAIA,iBAA2B,CAAC,MACzB;AACH,UAAM,EAAE,gBAAgB,KAAK,SAAS,IAAI;AAE1C,QAAI,WAAW,WACV,UAAM,qCAA8B,QAAQ,KAAM,CAAC,IACpD,CAAC;AACL,QAAI,OAAO,aAAa;AACtB,YAAM,IAAI,MAAM,yCAAyC;AAE3D,QAAI,CAAC,MAAM,QAAQ,QAAQ,EAAG,YAAW,CAAC,QAAQ;AAElD,UAAM,YAAY,MAAM,KAAK,uBAAuB;AAAA,MAClD;AAAA,MACA,gBAAgB,WAAW,eAAe;AAAA,IAC5C,CAAC;AAED,QAAI,WAAW;AACb,UAAI;AAEF,mBAAW,eAAe,UAAU;AAElC,sBAAY,YAAY;AACxB,iBAAO,YAAY;AAEnB,gBAAM,CAAC,KAAK,EAAE,YAAY,IAAI,MAAM,UAAU,OAAO,YACnD,cACF,EAAE,KAAK,kBAAkB,OAAO,WAAW;AAE3C,cAAI,IAAK,KAAI,MAAM,IAAI,SAAS,GAAG;AACnC,cAAI,cAAc;AAChB,gBAAI;AAAA,cACF,SAAS,aAAa;AAAA,gBACpB;AAAA,gBACA,YAAY;AAAA,gBACZ;AAAA,cACF;AAAA,YACF;AAEA,kBAAM,KAAK,0BAA0B,aAAa,MAAM;AAAA,YAAC,CAAC;AAAA,UAC5D;AAAA,QACF;AAAA,WACG;AACH,cAAM,SAAS,MAAM,UAAU,gBAAgB;AAAA,UAC7C;AAAA,UACA,CAAC;AAAA,QACH;AACA,cAAM,KAAK,0BAA0B,QAAQ,IAAI,MAAM;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,aAAa,OACX;AAAA,IACE;AAAA,EACF,GAGA,WAAqB,CAAC,MACnB;AACH,UAAM,EAAE,IAAI,IAAI;AAEhB,QAAI,WAAW,WACV,UAAM,qCAA8B,QAAQ,KAAM,CAAC,IACpD,CAAC;AACL,QAAI,OAAO,aAAa;AACtB,YAAM,IAAI,MAAM,yCAAyC;AAE3D,QAAI,CAAC,MAAM,QAAQ,QAAQ,EAAG,YAAW,CAAC,QAAQ;AAElD,UAAM,YAAY,MAAM,KAAK,uBAAuB;AAAA,MAClD;AAAA,MACA,gBAAgB;AAAA,IAClB,CAAC;AAED,QAAI,WAAW;AACb,YAAM,CAAC,KAAK,MAAM,IAAK,UAAM,mBAAAP;AAAA,QAC3B,UAAU,OAAO,KAAK,SAAS,SAAS,WAAW,QAAQ;AAAA,MAC7D;AAEA,UAAI,IAAK,KAAI,MAAM,IAAI,SAAS,GAAG;AACnC,UAAI;AAEF,cAAM,KAAK,0BAA0B,QAAQ,MAAM;AAllD3D;AAmlDU,cAAI;AAAA,YACF,kBAAkB,IAAI;AAAA,cACpB,KAAI,YAAO,MAAM,aAAb,mBAAuB,KAAK,KAAK;AAAA,YACvC,CAAC;AAAA;AAAA,UACH;AACA,cAAI,OAAO,cAAc,OAAO;AAC9B,gBAAI,IAAI,IAAI,SAAS,gBAAgB,CAAC;AACtC,gBAAI,CAAC,OAAO,aAAc,KAAI,KAAK;AAAA,CAAmB;AAAA,gBACjD,iDAA4B,MAAM,OAAO,YAAY;AAE1D,gBAAI,IAAI,IAAI,SAAS;AAAA,YAAe,CAAC;AACrC,gBAAI,CAAC,OAAO,WAAY,KAAI,KAAK;AAAA,CAAmB;AAAA,gBAC/C,iDAA4B,MAAM,OAAO,UAAU;AAAA,UAC1D;AAAA,QACF,CAAC;AAAA,IACL;AAAA,EACF;AAAA,EAEA,kBAAkB,YAAY;AAC5B,UAAM,EAAE,gBAAgB,KAAK,SAAS,IAAI;AAC1C,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAC9C,QAAI,WAAW;AAEb,YAAM,aAAa,MAAM,UAAU,OAAO,WAAW;AAErD,UAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,YAAI,QAAQ,SAAS,WAAW,KAAK,cAAc,CAAC;AAEpD,cAAM,KAAK,0BAA0B,YAAY,MAAM;AA/mD/D;AAinDU,qBAAW,aAAa,YAAY;AAClC,kBAAM,iBAAe,eAAU,WAAV,mBAAkB,WAAU;AACjD,oBAAQ;AAAA,cACN,OAAO,UAAU,EAAE,KAAK,YAAY,SAClC,iBAAiB,IAAI,MAAM,EAC7B;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAAA,EAEA,iBAAiB,OAAO,gBAAwB;AAC9C,UAAM,EAAE,gBAAgB,KAAK,SAAS,IAAI;AAC1C,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAC9C,QAAI,WAAW;AAEb,YAAM,aAAa,MAAM,UAAU,OAAO,WAAW;AAErD,UAAI,MAAM,QAAQ,UAAU,GAAG;AAC7B,cAAM,YAAY,WAAW;AAAA,UAC3B,OAAK,EAAE,GAAG,YAAY,MAAM,YAAY,YAAY;AAAA,QACtD;AACA,YAAI,WAAW;AACb,cAAI,QAAQ,SAAS,WAAW,IAAI,gBAAgB,UAAU,EAAE,CAAC;AAEjE,gBAAM,KAAK,0BAA0B,WAAW,IAAI,MAAM;AAAA,QAC5D,OAAO;AACL,cAAI,MAAM,SAAS,WAAW,UAAU,gBAAgB,WAAW,CAAC;AAAA,QACtE;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,mBAAmB,OAAO,cAAwB,SAAS,UAAU;AACnE,UAAM,EAAE,gBAAgB,KAAK,SAAS,IAAI;AAC1C,UAAM,YAAY,MAAM,KAAK,uBAAuB;AAAA,MAClD;AAAA,MACA,gBAAgB;AAAA;AAAA,IAClB,CAAC;AACD,QAAI,WAAW;AACb,YAAM,CAAC,KAAK,MAAM,IAAI,MAAM,UAAU;AAAA,QACpC;AAAA,QACA;AAAA,MACF;AAEA,UAAI,KAAK;AACP,YAAI;AAAA,UACF,SAAS,WAAW;AAAA,YAClB;AAAA,YACA,aAAa,KAAK,IAAI;AAAA,UACxB;AAAA,UACA;AAAA,QACF;AAAA,MACF,OAAO;AACL,YAAI;AAAA,UACF,SAAS,WAAW;AAAA,YAClB;AAAA,YACA,aAAa,KAAK,IAAI;AAAA,YACtB,CAAC,UAAU;AAAA,UACb;AAAA,QACF;AAEA,cAAM,KAAK,0BAA0B,QAAQ,IAAI,MAAM;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,mBAAmB,OACjB;AAAA,IACE;AAAA,IACA;AAAA,EACF,GAIA,eAAyB,CAAC,MACvB;AACH,UAAM,EAAE,gBAAgB,KAAK,SAAS,IAAI;AAE1C,QAAI,WAAW,WACV,UAAM,qCAA4B,QAAQ,KAAM,CAAC,IAClD,CAAC;AACL,QAAI,OAAO,aAAa;AACtB,YAAM,IAAI,MAAM,yCAAyC;AAE3D,QAAI,CAAC,MAAM,QAAQ,QAAQ,EAAG,YAAW,CAAC,QAAQ;AAElD,UAAM,YAAY,MAAM,KAAK,uBAAuB;AAAA,MAClD;AAAA,MACA,gBAAgB,WAAW,eAAe;AAAA,IAC5C,CAAC;AAED,QAAI,WAAW;AAEb,UAAI;AACF,mBAAW,aAAa,UAAU;AAEhC,oBAAU,YAAY;AACtB,iBAAO,UAAU;AAEjB,gBAAM,CAAC,KAAK,EAAE,YAAY,IAAI,MAAM,UAAU,OAAO,YACnD,cACF,EAAE,KAAK,gBAAgB,OAAO,SAAS;AAEvC,cAAI,IAAK,KAAI,MAAM,IAAI,SAAS,GAAG;AACnC,cAAI,cAAc;AAChB,gBAAI;AAAA,cACF,SAAS,WAAW;AAAA,gBAClB;AAAA,gBACA,UAAU;AAAA,gBACV;AAAA,cACF;AAAA,YACF;AAEA,kBAAM,KAAK,0BAA0B,WAAW,MAAM;AAAA,YAAC,CAAC;AAAA,UAC1D;AAAA,QACF;AAAA,WACG;AACH,cAAM,SAAS,MAAM,UAAU,gBAAgB;AAAA,UAC7C,CAAC;AAAA,UACD;AAAA,QACF;AACA,cAAM,KAAK,0BAA0B,QAAQ,IAAI,MAAM;AAAA,MACzD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,gBAAgB,OAAO,SAAS,UAAU;AAlvD5C;AAmvDI,UAAM,EAAE,YAAY,gBAAgB,KAAK,SAAS,IAAI;AACtD,UAAM,YAAY,MAAM,KAAK,uBAAuB;AAAA,MAClD;AAAA,MACA,gBAAgB;AAAA;AAAA,IAClB,CAAC;AAED,QAAI,WAAW;AACb,UAAI,UAAU,WAAW;AACvB,gBAAQ,IAAI,IAAI,YAAY,iBAAiB,CAAC;AAAA,MAChD,OAAO;AACL,gBAAQ,IAAI,IAAI,YAAY,6BAA6B,CAAC;AAAA,MAC5D;AACA,YAAM,CAAC,KAAK,MAAM,IAAI,MAAM,UAAU,cAAc;AACpD,UAAI;AACF,cAAM,KAAK,0BAA0B,QAAQ,MAAM;AAEjD,wDAA0B,MAAM,QAAQ;AAAA,YACtC,QAAQ;AAAA,YACR,SAAS;AAAA,UACX,CAAC;AAAA,QACH,CAAC;AACH,UACE,CAAC,QACC,CAAC,UAAU,OAAO,iBAAiB,cAAc,EAAE,cAClD,YAAU,YAAO,kBAAP,mBAAsB,WACnC;AACA,YAAI,QAAQ,SAAS,QAAQ,QAAQ,YAAY,MAAM,CAAC;AACxD,YAAI,CAAC,QAAQ;AACX,cAAI,IAAI,EAAE;AACV,cAAI,KAAK,SAAS,QAAQ,UAAU,CAAC;AAAA,QACvC;AAAA,MACF,OAAO;AACL,YAAI,MAAM,SAAS,QAAQ,aAAa,UAAU,GAAG,GAAG;AACxD,YAAI,GAAC,4CAAQ,qBAAR,mBAA2B,oBAA3B,mBAA4C;AAC/C,cAAI,KAAK,SAAS,QAAQ,SAAS,UAAU,CAAC;AAAA,MAClD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,aAAa,OAAO;AAAA,IAClB,iBAAiB;AAAA,EACnB,IAEI,CAAC,MAAM;AACT,UAAM,EAAE,gBAAgB,KAAK,SAAS,IAAI;AAC1C,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAE9C,QAAI,WAAW;AACb,UAAI,KAAK;AACT,YAAM,UAAU,MAAM,UAAU,WAAW,EAAE,eAAe,CAAC;AAM7D,YAAM,QAAQ,UAAU,QAAQ,OAAO,MAAM;AAC7C,YAAM,iBAAiB,CAAC,GAAG,SAAS,GAAG,KAAK;AAE5C,YAAM,KAAK,0BAA0B,gBAAgB,MAAM;AA7yDjE;AA+yDQ,kDAAiB;AAAA,UACf;AAAA,UACA,WAAW;AAAA,UACX,SAAQ,eAAU,QAAQ,UAAlB,mBAAyB;AAAA,QACnC,CAAC;AACD,YAAI,MAAM;AACR,oDAAiB;AAAA,YACf;AAAA,YACA,WAAW;AAAA,YACX,SAAQ,eAAU,QAAQ,UAAlB,mBAAyB;AAAA,UACnC,CAAC;AAAA,MACL,CAAC;AAAA,IACH,OAAO;AACL,UAAI,QAAQ,SAAS,OAAO,OAAO,cAAc,CAAC;AAClD,UAAI,KAAK,SAAS,QAAQ,IAAI,CAAC;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,gBAAgB,OAAO;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,MAKM;AA30DR;AA40DI,UAAM,EAAE,YAAY,gBAAgB,KAAK,SAAS,IAAI;AAEtD,UAAM,YAAY,MAAM,KAAK,uBAAuB;AAAA,MAClD;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,IAClB,CAAC;AAED,QAAI,WAAW;AACb,UAAI,KAAK;AACT,UAAI,UAAU,WAAW;AACvB,YAAI,QAAQ,SAAS,QAAQ,QAAQ,CAAC;AAAA,MACxC,OAAO;AACL,YAAI,QAAQ,SAAS,QAAQ,OAAO,CAAC;AAAA,MACvC;AAEA,YAAM,CAAC,KAAK,MAAM,IAAI,MAAM,UAAU,eAAe;AAErD,UAAI,IAAK,6BAAS,GAAG;AAAA,WAChB;AACH,cAAM,EAAE,SAAS,MAAM,IAAI,UAAU,QAAQ,QAAQ,cAAc;AAEnE,cAAM,SAAS;AAAA;AAAA,UAEX;AAAA,cACE,aAAQ,YAAR,mBAAiB,IAAI,QAAM,GAAG,OAAO,OAAM,CAAC;AAAA,YAC5C,MAAM,aAAa,IAAI,QAAM,GAAG,IAAI;AAAA,UACtC,EAAE,KAAK;AAAA,YACP;AACJ,cAAM,KAAK,0BAA0B,QAAQ,MAAM;AAEjD,wDAA0B,MAAM,QAAQ;AAAA,YACtC,SAAS,cAAc;AAAA,YACvB,UAAU,cAAc,SAAS,cAAc;AAAA,YAC/C,aAAa,cAAc;AAAA,UAC7B,CAAC;AACD,cAAI,CAAC,OAAO,SAAS,EAAE,SAAS,SAAS;AACvC;AAAA,cACE;AAAA,cACA;AAAA,gBACE,GAAG,MAAM;AAAA,gBACT,QAAQ;AAAA,gBACR,UAAU,MAAM;AAAA,cAClB;AAAA,cACA;AAAA,YACF;AAAA,QACJ,CAAC;AAAA,MACH;AACA,UACE,CAAC,OACD,GAAC,YAAO,WAAP,mBAAe,YACd,CAAC,UAAU,OAAO,iBAAiB,cAAc,EAAE,cAClD,aACE,YAAO,kBAAP,mBAAsB,cAAW,YAAO,kBAAP,mBAAsB,YAC5D;AACA,YAAI;AAAA,UACF,SAAS,QAAQ;AAAA,YACf;AAAA,YACA;AAAA,YACA,YACK,YAAO,kBAAP,mBAAsB,YAAW,QAC/B,YAAO,kBAAP,mBAAsB,YAAW,KACpC,OAAO,iBAAiB,cAAc,EAAE;AAAA,YAC5C,YACK,YAAO,gBAAP,mBAAoB,YAAW,QAC7B,YAAO,gBAAP,mBAAoB,YAAW,OACjC,YAAO,mBAAP,mBAAwB,gBACtB,eAAyB;AAAA,UAClC;AAAA,QACF;AACA,YAAI,CAAC,QAAQ;AACX,cAAI,IAAI,EAAE;AACV,cAAI,KAAK,SAAS,QAAQ,UAAU,CAAC;AAAA,QACvC;AAAA,MACF,OAAO;AACL,YAAI,MAAM,SAAS,QAAQ,aAAa,UAAU,GAAG,GAAG;AACxD,YAAI,GAAC,4CAAQ,qBAAR,mBAA2B,oBAA3B,mBAA4C;AAC/C,cAAI,KAAK,SAAS,QAAQ,SAAS,UAAU,CAAC;AAAA,MAClD;AAAA,IACF,OAAO;AACL,UAAI,QAAQ,SAAS,OAAO,OAAO,cAAc,CAAC;AAClD,UAAI,KAAK,SAAS,QAAQ,IAAI,CAAC;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,iBAAiB,OAAO;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,MAKM;AA36DR;AA46DI,UAAM,EAAE,YAAY,gBAAgB,KAAK,SAAS,IAAI;AAEtD,UAAM,YAAY,MAAM,KAAK,uBAAuB;AAAA,MAClD;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,IAClB,CAAC;AAED,QAAI,WAAW;AACb,UAAI,KAAK;AACT,UAAI,UAAU,WAAW;AACvB,YAAI,QAAQ,SAAS,QAAQ,QAAQ,CAAC;AAAA,MACxC,OAAO;AACL,YAAI,QAAQ,SAAS,QAAQ,OAAO,CAAC;AAAA,MACvC;AAEA,YAAM,CAAC,KAAK,MAAM,IAAI,UAAM,mBAAAA;AAAA,QAC1B,UAAU,QAAQ,KAAK,oBAAoB;AAAA,MAC7C;AAEA,UAAI,IAAK,6BAAS,GAAG;AACrB,UAAI,QAAQ;AACV,cAAM,SAAS,eACX,eAAU,QAAQ,KAAK,QAAQ,cAAc,EAAE,QAAQ,YAAvD,mBAAgE;AAAA,UAC9D,QAAM,GAAG,OAAO;AAAA,YAElB;AACJ,cAAM,KAAK,0BAA0B,QAAQ,MAAM;AAEjD,wDAA0B,MAAM,QAAQ;AAAA,YACtC,SAAS,cAAc;AAAA,YACvB,UAAU,cAAc,SAAS,cAAc;AAAA,YAC/C,aAAa,cAAc;AAAA,UAC7B,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAEA,UACE,UACA,CAAC,OACD,GAAC,YAAO,WAAP,mBAAe,YACd,CAAC,UAAU,OAAO,iBAAiB,cAAc,EAAE,cAClD,aACE,YAAO,kBAAP,mBAAsB,cAAW,YAAO,kBAAP,mBAAsB,YAC5D;AACA,YAAI;AAAA,UACF,SAAS,QAAQ;AAAA,YACf;AAAA,YACA;AAAA,YACA,YACK,YAAO,kBAAP,mBAAsB,YAAW,QAC/B,YAAO,kBAAP,mBAAsB,YAAW,KACpC,OAAO,iBAAiB,cAAc,EAAE;AAAA,UAC9C;AAAA,QACF;AACA,YAAI,CAAC,QAAQ;AACX,cAAI,IAAI,EAAE;AACV,cAAI,KAAK,SAAS,QAAQ,UAAU,CAAC;AAAA,QACvC;AAAA,MACF,OAAO;AACL,YAAI,MAAM,SAAS,QAAQ,aAAa,UAAU,GAAG,GAAG;AACxD,YAAI,GAAC,4CAAQ,qBAAR,mBAA2B,oBAA3B,mBAA4C;AAC/C,cAAI,KAAK,SAAS,QAAQ,SAAS,UAAU,CAAC;AAAA,MAClD;AAAA,IACF,OAAO;AACL,UAAI,QAAQ,SAAS,OAAO,OAAO,cAAc,CAAC;AAClD,UAAI,KAAK,SAAS,QAAQ,IAAI,CAAC;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,WAAW,OAAO,UAAkB,QAAQ,MAAM;AAChD,UAAM,EAAE,gBAAgB,KAAK,SAAS,IAAI;AAC1C,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAE9C,QAAI,WAAW;AACb,UAAI,KAAK;AACT,YAAM,CAAC,KAAK,KAAK,IAAI,UAAM,mBAAAA,SAAG,UAAU,MAAM,SAAS,UAAU,KAAK,CAAC;AACvE,UAAI,KAAK;AACP,YAAI,MAAM,SAAS,MAAM,UAAU,cAAc,GAAG,GAAG;AACvD;AAAA,MACF;AACA,YAAM,OAAO,UAAU,MAAM,WAAW,MAAM;AAE9C,UAAI,QAAQ,SAAS,MAAM,IAAI,gBAAgB,UAAU,KAAK,CAAC;AAE/D,YAAM,KAAK,0BAA0B,OAAO,MAAM;AAEhD,YAAI,OAAO,EAAE,GAAG,MAAM,UAAU,QAAW,UAAU,OAAU,CAAC;AAChE,gDAAoB,MAAM,IAAI;AAAA,MAChC,CAAC;AAAA,IACH,OAAO;AACL,UAAI,QAAQ,SAAS,OAAO,OAAO,cAAc,CAAC;AAClD,UAAI,KAAK,SAAS,QAAQ,IAAI,CAAC;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,cAAc,OAAO;AAAA,IACnB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,MAKM;AAthER;AAuhEI,UAAM,EAAE,YAAY,gBAAgB,KAAK,SAAS,IAAI;AAEtD,UAAM,YAAY,MAAM,KAAK,uBAAuB;AAAA,MAClD;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,IAClB,CAAC;AAED,QAAI,WAAW;AACb,UAAI,KAAK;AACT,UAAI,UAAU,WAAW;AACvB,YAAI,QAAQ,SAAS,QAAQ,QAAQ,CAAC;AAAA,MACxC,OAAO;AACL,YAAI,QAAQ,SAAS,QAAQ,OAAO,CAAC;AAAA,MACvC;AAEA,YAAM,CAAC,KAAK,MAAM,IAAI,MAAM,UAAU,aAAa;AAEnD,UAAI,IAAK,KAAI,IAAI,EAAE;AAAA;AAEjB,cAAM,KAAK,0BAA0B,QAAQ,MAAM;AAEjD,gBAAM,cACJ,UAAU,MAAM,YAAY,cAAc,EAAE,MACzC;AACL,kDAAoB,MAAM,aAAa,WAAW,QAAQ;AAC1D,sDAAwB,MAAM,QAAQ;AAAA,YACpC,SAAS,cAAc;AAAA,YACvB,aAAa,cAAc;AAAA,UAC7B,CAAC;AAAA,QACH,CAAC;AAEH,YAAM,qBACJ,sCAAQ,mBAAR,mBAAyB,gBAAgB;AAC3C,YAAM,iBAAe,sCAAQ,gBAAR,mBAAsB,eAAc;AACzD,YAAM,iBAAe,sCAAQ,gBAAR,mBAAsB,eAAc;AACzD,YAAM,iBAAe,sCAAQ,gBAAR,mBAAsB,cAAa;AACxD,YAAM,cACJ,sCAAQ,mBAAR,mBAAyB,gBAAgB,iBACzC,sBAAsB;AAExB,UACE,CAAC,QACA,GAAC,YAAO,WAAP,mBAAe,WAAU,KAAK,cAAc,kBAC5C,CAAC,UAAU,qBACV,WAAW,gBAAgB,kBAAgB,YAAO,WAAP,mBAAe,WAC7D;AACA,YAAI;AACJ,YAAI,QAAQ;AACV,gBAAM,UAAU,OAAO,iBAAiB,WAAW,eAAe;AAClE,gBAAM,UAAU,OAAO,iBAAiB,WAAW,eAAe;AAElE,uBAAa,UAAU;AAAA,QACzB,OAAO;AACL,uBACE,OAAO,sBAAsB,WAAW,oBAAoB;AAAA,QAChE;AAEA,YAAI,QAAQ,SAAS,MAAM,SAAS,YAAY,QAAQ,UAAU,CAAC;AACnE,YAAI,IAAI,EAAE;AACV,YAAI,CAAC,QAAQ;AACX,cAAI,KAAK,SAAS,MAAM,UAAU,CAAC;AAAA,QACrC;AAAA,MACF,OAAO;AACL,YAAI,aAAa,CAAC,OAAO,CAAC,cAAc;AACtC,cAAI,KAAK,SAAS,MAAM,SAAS,UAAU,CAAC;AAAA,QAC9C,OAAO;AACL,cAAI,MAAM,SAAS,MAAM,aAAa,UAAU,GAAG,GAAG;AACtD,cAAI,CAAC,kBAAmB,KAAI,KAAK,SAAS,MAAM,SAAS,UAAU,CAAC;AAAA,QACtE;AAAA,MACF;AAAA,IACF,OAAO;AACL,UAAI,QAAQ,SAAS,OAAO,OAAO,cAAc,CAAC;AAClD,UAAI,KAAK,SAAS,QAAQ,IAAI,CAAC;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,cAAc,OAAO,SAAS,UAAU;AApmE1C;AAqmEI,UAAM,EAAE,YAAY,gBAAgB,KAAK,SAAS,IAAI;AACtD,UAAM,YAAY,MAAM,KAAK,uBAAuB;AAAA,MAClD;AAAA,MACA,gBAAgB;AAAA;AAAA,IAClB,CAAC;AAED,QAAI,WAAW;AACb,UAAI,UAAU,WAAW;AACvB,gBAAQ,IAAI,IAAI,YAAY,iBAAiB,CAAC;AAAA,MAChD,OAAO;AACL,gBAAQ,IAAI,IAAI,YAAY,6BAA6B,CAAC;AAAA,MAC5D;AACA,YAAM,CAAC,KAAK,MAAM,IAAI,MAAM,UAAU,YAAY;AAClD,UAAI,QAAQ;AACV,cAAM,KAAK,0BAA0B,QAAQ,MAAM;AAEjD;AAAA,YACE;AAAA,YACA,UAAU,MAAM,YAAY,cAAc,EAAE,MACzC;AAAA,UACL;AAAA,QAKF,CAAC;AAAA,MACH;AACA,UACE,CAAC,QACC,CAAC,UAAU,OAAO,eAAe,cAAc,EAAE,cAChD,YAAU,YAAO,gBAAP,mBAAoB,WACjC;AACA,YAAI;AAAA,UACF,SAAS,MAAM,QAAQ,YAAY,QAAQ,UAAU,MAAM,QAAQ;AAAA,QACrE;AACA,YAAI,IAAI,EAAE;AACV,YAAI,CAAC,QAAQ;AACX,cAAI,KAAK,SAAS,MAAM,UAAU,CAAC;AAAA,QACrC;AAAA,MACF,OAAO;AACL,YAAI,MAAM,SAAS,MAAM,aAAa,UAAU,GAAG,GAAG;AACtD,YAAI,GAAC,4CAAQ,mBAAR,mBAAyB,oBAAzB,mBAA0C;AAC7C,cAAI,KAAK,SAAS,MAAM,SAAS,UAAU,CAAC;AAAA,MAChD;AAAA,IACF;AAAA,EACF;AAAA,EAEA,4BAA4B,OAAO,2BAAsC;AACvE,UAAM,EAAE,YAAY,KAAK,SAAS,IAAI;AACtC,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAC9C,QAAI,WAAW;AAEb,YAAM,CAAC,aAAa,QAAQ,IAC1B,MAAM,UAAU,cAAc,SAAS,iBAAiB;AAE1D,YAAM,mBAAkB,iEAAwB,UAC5C,qCAAU;AAAA,QACR,QACE,iEAAwB;AAAA,UAAK,YAAO;AA/pElD;AAgqEgB,2BAAE,SAAF,mBAAQ,cAAc,SAAS,OAAO,YAAY;AAAA;AAAA,eAEpD,iEAAwB;AAAA,UACtB,QAAM,GAAG,YAAY,MAAM,EAAE,GAAG,YAAY;AAAA;AAAA,UAGlD;AAEJ,UAAI,MAAM,QAAQ,eAAe,GAAG;AAClC,YAAI,QAAQ,SAAS,SAAS,KAAK,UAAU,CAAC;AAC9C,YAAI,EAAC,qCAAU,QAAQ,KAAI,QAAQ,SAAS,SAAS,UAAU,CAAC;AAAA,aAC3D;AACH,gBAAM,KAAK,0BAA0B,iBAAiB,MAAM;AAE1D,uBAAW;AAAA,cACT;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,KAAAQ;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,YACF,KAAK,iBAAiB;AACpB,sBAAQ;AAAA,gBACN,IAAI;AAAA,kBACF,KAAK,aAAAJ,QAAM,KAAK,UAAU,IAAI,EAAE,IAAI,EAAE,MACpC,QAAQ,YAAY,QAAQ,SAE3B,SAAS,EACT,UAAU,GAAG,EAAE,CAAC,IACjB,QAAQ,cAAc,QAAQ,SAChC;AAAA,gBACF;AAAA,cACF;AACA,kBAAI,YAAa,SAAQ,IAAI,IAAI,eAAe,WAAW,EAAE;AAC7D,sBAAQ,IAAI,OAAO,IAAI,YAAY,MAAM,GAAG,IAAII,IAAG,EAAE;AACrD,kBAAI,WAAW,OAAO,KAAK,OAAO,EAAE,QAAQ;AAC1C,wBAAQ,IAAI,OAAO,IAAI,iBAAiB,GAAG;AAE3C,2BAAW,CAAC,KAAK,EAAE,OAAO,OAAO,CAAC,KAAK,OAAO,QAAQ,OAAO;AAC3D,0BAAQ;AAAA,oBACN,SAAS,aAAAJ,QAAM,KAAK,KAAK,GAAG,CAAC,KAAK,SAAS,cAAO,KAAK;AAAA,kBACzD;AAAA,cACJ;AACA,kBAAI,iCAAQ;AACV,qBAAI,iCAAQ,YAAW;AACrB,0BAAQ;AAAA,oBACN,OAAO,IAAI,gBAAgB,KAAK,OAC7B,IAAI,OAAK,KAAK,UAAU,CAAC,CAAC,EAC1B,KAAK,GAAG,EACR,WAAW,KAAK,EAAE,EAClB,WAAW,KAAK,GAAG,EACnB,WAAW,KAAK,EAAE,EAClB,WAAW,KAAK,EAAE,CAAC;AAAA,kBACxB;AAAA,qBACG;AACH,0BAAQ,IAAI,OAAO,IAAI,gBAAgB,GAAG;AAC1C,sBAAI,cAAc,QAAQ,GAAG,MAAM;AAAA,gBACrC;AACF,kBAAI,aAAa,OAAO,KAAK,SAAS,EAAE;AACtC,wBAAQ;AAAA,kBACN,OAAO,IAAI,mBAAmB,KAAK,OAAO;AAAA,oBACxC;AAAA,kBACF,EAAE,KAAK,GAAG,CAAC;AAAA,gBACb;AACF,kBAAI,YAAY;AACd,wBAAQ,IAAI,OAAO,IAAI,iBAAiB,KAAK,OAAO,EAAE;AAAA,YAC1D;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAEA,UAAI,aAAa;AACf,YAAI,MAAM,SAAS,SAAS,OAAO,UAAU,CAAC;AAC9C,YAAI,UAAM,2BAAc,WAAW,CAAC;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,cAAc,YAAY;AACxB,UAAM,EAAE,YAAY,KAAK,KAAK,SAAS,IAAI;AAC3C,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAC9C,QAAI,WAAW;AAEb,YAAM,CAAC,KAAK,MAAM,IAAI,MAAM,UAAU,OAAO,UAAU;AAEvD,UAAI,MAAM,QAAQ,MAAM,KAAK,OAAO,QAAQ;AAC1C,cAAM,KAAK,0BAA0B,QAAQ,MAAM;AAEjD,cAAI,QAAQ,SAAS,OAAO,KAAK,YAAY,IAAI,cAAc,CAAC;AAChE,qBAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,KAAK,QAAQ;AACX,oBAAQ;AAAA,cACN,OAAO,EAAE,GAAG,cAAc,KAAK,WAAW,MAAM,EAAE,GAChD,WACI,KAAK,SAAS,SAAS,EAAE,UAAU,GAAG,EAAE,CAAC,KAAK,WAAW,MACzD,EACN,GACE,oBACI,IAAI,YAAY,KAAK,iBAAiB,EAAE,IACxC,EACN;AAAA,YACF;AACA,uBAAW,UAAU;AACnB,sBAAQ;AAAA,gBACN,IAAI,SAAS,UAAU,OAAO,EAAE,MAAM,OAAO,MAAM,EAAE;AAAA,cACvD;AAAA,UACJ;AAAA,QACF,CAAC;AAED,eAAO;AAAA,MACT;AAEA,UAAI,KAAK;AACP,YAAI,MAAM,SAAS,OAAO,OAAO,YAAY,IAAI,cAAc,CAAC;AAAA,MAElE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,qBAAqB,OACnB,SACA,QACA,YACG;AACH,UAAM,EAAE,YAAY,KAAK,KAAK,SAAS,IAAI;AAC3C,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAC9C,QAAI,WAAW;AAEb,YAAM,CAAC,KAAK,MAAM,IAAI,MAAM,UAAU,OAAO;AAAA,QAC3C;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,QAAO,iCAAQ,YAAW,GAAG;AAC/B,YAAI;AAAA,UACF,SAAS,OAAO;AAAA,YACd;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,IAAI;AAAA,UACN;AAAA,QACF;AACA,YAAI,KAAK,SAAS,OAAO,SAAS,CAAC;AAAA,MAErC,WAAW,QAAQ;AACjB,cAAM,KAAK,0BAA0B,QAAQ,MAAM;AAEjD,cAAI;AAAA,YACF,SAAS,OAAO;AAAA,cACd;AAAA,cACA;AAAA,cACA;AAAA,cACA;AAAA,cACA,IAAI;AAAA,YACN;AAAA,UACF;AACA,qBAAW,SAAS;AAClB;AAAA,cACE;AAAA,cACA;AAAA,cACA,CAAC,UACG;AAAA,gBACE,WAAW;AAAA,gBACX,YAAY;AAAA,gBACZ,iBAAiB;AAAA,gBACjB,YAAY;AAAA,cACd,IACA;AAAA,YACN;AAAA,QACJ,CAAC;AAED,eAAO;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAAA,EAEA,YAAY,OAAO,UAA2B;AAC5C,UAAM,EAAE,YAAY,KAAK,KAAK,SAAS,IAAI;AAG3C,QAAI;AAAA,MACF,SAAS,OAAO;AAAA,QACd,MAAM;AAAA,QACN,MAAM,OAAO;AAAA,QACb;AAAA,QACA,IAAI;AAAA,MACN;AAAA,IACF;AACA,YAAQ,QAAI,2BAAc,KAAK,CAAC;AAEhC,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAC9C,QAAI,WAAW;AAEb,YAAM,CAAC,KAAK,YAAY,IACtB,MAAM,UAAU,OAAO,iBAAiB,KAAK;AAC/C,UAAI,CAAC,KAAK;AACR,YAAI;AAAA,UACF,SAAS,OAAO;AAAA,YACd,MAAM;AAAA,YACN,MAAM,OAAO;AAAA,YACb;AAAA,YACA,IAAI;AAAA,UACN;AAAA,QACF;AAAA,MACF;AACA,UAAI,cAAc;AAChB,cAAM,KAAK,0BAA0B,cAAc,MAAM;AAEvD,gDAAkB,MAAM,YAAY;AAAA,QACtC,CAAC;AAAA,MACH;AACA,UAAI;AACF,cAAM,IAAI;AAAA,UACR,SAAS,OAAO,WAAW,MAAM,IAAI,YAAY,IAAI,cAAc;AAAA,QACrE;AAAA,IACJ,OAAO;AACL,YAAM,IAAI;AAAA,QACR,SAAS,OAAO,WAAW,MAAM,IAAI,YAAY,IAAI,cAAc;AAAA,MACrE;AAAA,IACF;AAAA,EACF;AAAA,EAEA,wBAAwB,OACtB,SACA,SAAS,cAC0C;AA74EvD;AA84EI,UAAM,EAAE,WAAW,KAAK,SAAS,IAAI;AAGrC,UAAM,CAAC,QAAQ,aAAa,IACzB,OAAM,uCAAW,OAAO,iBAAiB,SAAS,YAAY,CAAC;AAElE,QAAI,QAAQ;AACV,aAAO,CAAC,QAAQ,MAAS;AAAA,IAC3B;AAGA,QAAI,iBAAiB;AAErB,QAAI;AACF,uBAAiB,IAAG,oDAAgB,OAAhB,mBAAoB,QAAQ,SAAS;AAEzD,UAAI,CAAC,OAAO,MAAM,cAAc,KAAK,OAAO,cAAc,IAAI;AAE5D,eAAO,CAAC,MAAM,cAAc;AAAA,UACzB,OAAM,IAAI,MAAM,IAAI,cAAc,iCAAiC;AAAA,IAC1E,SAAS,gBAAqB;AAE5B,UAAI;AAAA,QACF,wBAAwB,OAAO,aAAa,MAAM;AAAA,MACpD;AACA,UAAI;AAAA,QACF,wCAAoC,0BAAa,aAAa,CAAC;AAAA,MACjE;AACA,UAAI,MAAM,SAAS,OAAO,qBAAqB,CAAC;AAChD,aAAO,CAAC,gBAAgB,MAAS;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,qBAAqB,OACnB,QACA,SACA,UAAU,aACP;AACH,UAAM,EAAE,YAAY,KAAK,KAAK,SAAS,IAAI;AAC3C,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAC9C,QAAI,WAAW;AACb,UAAI,uBAAuB;AAG3B,UAAI,WAAW,aAAa,YAAY,UAAU;AAChD,cAAM,CAAC,QAAQK,aAAY,IACzB,MAAM,KAAK,sBAAsB,OAAO;AAE1C,YAAI,QAAQ;AAGV,gBAAM,IAAI;AAAA,YACR,GAAG,SAAS,OAAO;AAAA,cACjB;AAAA,cACA,IAAI;AAAA,YACN,CAAC,KAAK,MAAM;AAAA,UACd;AAAA,QACF,WAAWA,eAAc;AACvB,iCAAuBA;AAAA,QACzB;AAAA,MACF;AAGA,YAAM,CAAC,KAAK,YAAY,IAAI,MAAM,UAAU,OAAO;AAAA,QACjD;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,UAAI,cAAc;AAChB,cAAM,KAAK,0BAA0B,cAAc,MAAM;AAEvD,cAAI;AAAA,YACF,SAAS,OAAO;AAAA,cACd;AAAA,cACA;AAAA,cACA;AAAA,cACA,IAAI;AAAA,YACN;AAAA,UACF;AACA,gDAAkB,MAAM,YAAY;AAAA,QACtC,CAAC;AAAA,MACH;AAEA,UAAI,KAAK;AACP,YAAI,UAAM,2BAAc,GAAG,CAAC;AAC5B,cAAM,IAAI;AAAA,UACR,SAAS,OAAO;AAAA,YACd;AAAA,YACA;AAAA,YACA;AAAA,YACA,IAAI;AAAA,UACN;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,iBAAiB,OACf,SACA,QACA,SACA,YACA,SAAS,UACN;AACH,UAAM,EAAE,YAAY,KAAK,KAAK,SAAS,IAAI;AAC3C,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAC9C,QAAI,WAAW;AAEb,UAAI;AAAA,QACF,SAAS,OAAO,QAAQ,SAAS,QAAQ,YAAY,IAAI,cAAc;AAAA,MACzE;AAEA,YAAM,CAAC,KAAK,SAAS,IAAI,MAAM,UAAU,OAAO,aAAa;AAAA,QAC3D;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACA;AAAA,MACF,CAAC;AAED,UAAI,KAAK;AACP,YAAI;AAAA,UACF,SAAS,OAAO,cAAc,SAAS,YAAY,IAAI,cAAc;AAAA,QACvE;AACA,YAAI,UAAM,2BAAc,GAAG,CAAC;AAAA,MAC9B,WAAW,WAAW;AACpB,cAAM,wBAAwB,CAAC,SAC7B,KAAK,SAAS,IAAI,IAAI,KAAK,MAAM,GAAG,KAAK,SAAS,CAAC,IAAI;AACzD,cAAM,aAAa,sBAAsB,SAAS;AAElD,cAAM,KAAK,0BAA0B,YAAY,MAAM;AAErD,kBAAQ;AAAA,YACN,OAAO,OAAO,IAAI,MAAM,IACtB,OAAO,OAAO,IAAI,IAAI,OAAO,KAAK,OACpC,IAAI,aAAa,IAAI,UAAU,MAAM,EAAE;AAAA,UACzC;AACA,cAAI,KAAK;AACT,kBAAQ,IAAI,IAAI,SAAS,UAAU,CAAC;AAAA,QACtC,CAAC;AAGD,YAAI,YAAY;AAChB,YAAI,eAAe;AACnB,YAAI,eAAe;AACnB,YAAI,UAAU;AAGd,cAAM,YAAY,QAAQ,UAAU,QAAQ;AAE5C,gBAAQ,mBAAmB,QAAQ;AAEnC,gBAAQ,GAAG,UAAU,MAAM;AACzB,+BAAO;AAAA,YACL,SAAS,OAAO,WAAW,SAAS,YAAY,IAAI,cAAc;AAAA,UACpE;AACA,wBAAc;AAAA,QAChB,CAAC;AAED,cAAM,YAAQ,4BAAa,IAAI,KAAM,IAAI;AACzC,cAAM,gBAAgB,MAAM;AAC1B,sBAAY;AACZ,gBAAM,OAAO;AAGb,kBAAQ,mBAAmB,QAAQ;AACnC,qBAAW,YAAY;AACrB,oBAAQ,YAAY,UAAU,QAAQ;AAAA,QAC1C;AAEA,eAAO,WAAW;AAChB,cAAI,YAAY,KAAK;AACnB,iCAAO;AAAA,cACL,SAAS,OAAO;AAAA,gBACd;AAAA,gBACA;AAAA,gBACA,IAAI;AAAA,cACN;AAAA,YACF;AACA,0BAAc;AAAA,UAChB;AAGA,gBAAM,MAAM,KAAK;AAEjB,gBAAM,CAAC,SAAS,QAAQ,IAAI,YACxB,MAAM,UAAU,OAAO,aAAa;AAAA,YAClC;AAAA,YACA,UAAU;AAAA,YACV;AAAA,YACA;AAAA,UACF,CAAC,IACD,CAAC,MAAM,IAAI;AAEf,cAAI,UAAU;AAEZ,kBAAM,iBAAa,4BAAe,UAAU,YAAY;AACxD,gBAAI,YAAY;AACd,kBAAI,cAAc;AAChB,wBAAQ,IAAI,EAAE;AAAA,cAChB;AAGA,oBAAM,SAAS,sBAAsB,UAAU;AAC/C,sBAAQ,IAAI,IAAI,SAAS,MAAM,CAAC;AAGhC,8BAAgB,GAAG,MAAM;AAAA;AACzB,6BAAe;AAAA,YACjB,OAAO;AAEL,sBAAQ,OAAO,MAAM,GAAG;AACxB,6BAAe;AAAA,YACjB;AAAA,UACF,WAAW,SAAS;AAElB,oBAAQ,OAAO,MAAM,GAAG;AACxB,2BAAe;AAAA,UACjB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEA,eAAe,OAAO,YAAqB;AACzC,UAAM,EAAE,YAAY,KAAK,KAAK,SAAS,IAAI;AAC3C,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAC9C,QAAI,WAAW;AAEb,YAAM,CAAC,KAAK,OAAO,IAAI,MAAO,UAAU,QAAQ;AAAA,QAC9C;AAAA,MACF;AAEA,UAAI,MAAM,QAAQ,OAAO,GAAG;AAC1B,cAAM,KAAK,0BAA0B,SAAS,MAAM;AAElD,cAAI,QAAQ,SAAS,QAAQ,KAAK,YAAY,IAAI,cAAc,CAAC;AACjE,qBAAW,EAAE,IAAI,MAAM,aAAa,WAAW,QAAQ,KAAK,SAAS;AACnE,oBAAQ;AAAA,cACN,OAAO,IAAI,KACT,QAAQ,SACV,KAAK,EAAE,IAAI,IAAI,WAAW,WAAW,EAAE;AAAA,YACzC;AACA,uBAAW,CAAC,UAAU,QAAQ,KAAK,OAAO;AAAA,cACxC;AAAA,YACF;AACE,sBAAQ;AAAA,gBACN,WAAW,IAAI,qBAAqB,QAAQ;AAAA,kBAC1C,SAAS,MAAM;AAAA,wBACT,SAAS,QAAQ,IAAI;AAAA,eAC9B,SAAS,GAAG,EAAE;AAAA,cACf;AAAA,UACJ;AAAA,QACF,CAAC;AAAA,MACH;AAEA,UAAI,KAAK;AACP,YAAI,MAAM,SAAS,QAAQ,OAAO,YAAY,IAAI,cAAc,CAAC;AACjE,YAAI,UAAM,2BAAc,GAAG,CAAC;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAAA;AAAA,EAGA,iBAAiB,OAAO,eAAwB;AAC9C,UAAM,EAAE,YAAY,KAAK,KAAK,SAAS,IAAI;AAC3C,UAAM,YAAY,MAAM,KAAK,iBAAiB;AAC9C,QAAI,WAAW;AAEb,YAAM,CAAC,KAAK,SAAS,IAAI,MAAM,UAAU,UAAU,aAAa;AAEhE,UAAI,MAAM,QAAQ,SAAS,GAAG;AAC5B,cAAM,KAAK,0BAA0B,WAAW,MAAM;AAEpD,cAAI,QAAQ,SAAS,UAAU,KAAK,YAAY,IAAI,cAAc,CAAC;AACnE,qBAAW;AAAA,YACT;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,KAAK,WAAW;AACd,oBAAQ;AAAA,cACN,OAAO,EAAE,KAAK,QAAQ,SAAS,KAAK,IAAI,WAAW,WAAW,EAAE;AAAA,YAClE;AACA,gBAAI,6DAAsB;AACxB,sBAAQ;AAAA,gBACN,IAAI,uCAAuC,qBAAqB;AAAA,kBAC9D;AAAA,gBACF,CAAC;AAAA,cACH;AACF,uBAAW,QAAQ;AACjB,kBAAI,KAAK;AACP,wBAAQ;AAAA,kBACN,IAAI,iBACF,KAAK,OAAO,aAAa,eAAe,SAC1C,KAAK,KAAK,OAAO,cAAc,KAAK,OAAO,OAAO;AAAA,gBACpD;AAAA,UACN;AAAA,QACF,CAAC;AACD,eAAO;AAAA,MACT;AAEA,UAAI,KAAK;AACP,YAAI,MAAM,SAAS,UAAU,OAAO,YAAY,IAAI,cAAc,CAAC;AACnE,YAAI,UAAM,2BAAc,GAAG,CAAC;AAAA,MAC9B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,4BAA4B,OAAU,KAAQ,UAA4B;AApsF5E;AAqsFI,UAAM,EAAE,QAAQ,KAAK,UAAU,OAAO,IAAI;AAC1C,UAAM,UAAS,gBAAK,cAAL,mBAAgB,QAAQ,UAAxB,mBAA+B;AAE9C,QAAI,CAAC,QAAQ;AAEX,YAAM,GAAG;AAAA,IACX,WAAW,WAAW,OAAO;AAC3B,UAAI,IAAI,EAAE;AACV,UAAI,IAAI,IAAI,SAAS,UAAM,6BAAa,yBAAY,KAAK,MAAM,CAAC,CAAC,CAAC;AAAA,IACpE,WAAW,WAAW,OAAO;AAC3B,UAAI,IAAI,EAAE;AACV,UAAI,IAAI,IAAI,aAAS,6BAAa,yBAAY,KAAK,MAAM,CAAC,CAAC,CAAC;AAAA,IAC9D,WAAW,WAAW,QAAQ;AAC5B,UAAI,IAAI,EAAE;AACV,UAAI,IAAI,IAAI,aAAS,2BAAc,KAAK,MAAM,CAAC,CAAC;AAAA,IAClD;AACA,QAAI,IAAI,EAAE;AAEV,QAAI,QAAQ;AACV,UAAI,cAAc;AAClB,YAAM,SAAS,KAAC,sBAAS,GAAG,KAAK,OAAO,QAAQ;AAChD,UAAI,WAAW,OAAO;AACpB,sBAAc,UAAM,6BAAa,yBAAY,KAAK,MAAM,CAAC;AAAA,MAC3D,WAAW,WAAW,OAAO;AAC3B,0BAAc,6BAAa,yBAAY,KAAK,MAAM,CAAC;AAAA,MACrD;AACE,sBAAc,SAAU,UAAiB,2BAAc,KAAK,MAAM;AAEpE,UAAI,aAAa;AACf,kBAAAC,QAAG,cAAc,QAAQ,WAAW;AACpC,YAAI,QAAQ,SAAS,IAAI,WAAW,SAAS,SAAS,QAAQ,MAAM,CAAC;AAAA,MACvE,OAAO;AACL,YAAI,KAAK,SAAS,IAAI,aAAa,CAAC;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AACF;AAEO,MAAM,aAAa,CACxB,aACA,YACA,gBAAyC,CAAC,MACvC;AACH,SAAO,IAAI,aAAa,CAAC,IAAI,IAAI,GAAG,WAAW,GAAG,YAAY,aAAa;AAC7E;AACA,IAAO,8BAAQ;",
4
+ "sourcesContent": ["import to from 'await-to-js';\nimport chalk from 'chalk';\nimport fs from 'fs';\nimport inquirer from 'inquirer';\nimport fetch from 'node-fetch';\nimport path from 'path';\nimport clone from 'rfdc';\n\nimport { Component, ContentType, Project } from 'contensis-core-api';\nimport { Role } from 'contensis-management-api/lib/models';\nimport {\n ContensisMigrationService,\n MigrateRequest,\n PushBlockParams,\n SourceCms,\n ContentTypesResult,\n Model,\n BlockActionType,\n logEntitiesTable,\n} from 'migratortron';\n\nimport ContensisAuthService from './ContensisAuthService';\n\nimport { LogMessages } from '~/localisation/en-GB';\nimport {\n CliUrls,\n OutputFormat,\n OutputOptionsConstructorArg,\n} from '~/models/CliService';\n\nimport { readFileAsJSON } from '~/providers/file-provider';\nimport SessionCacheProvider from '../providers/SessionCacheProvider';\nimport CredentialProvider from '~/providers/CredentialProvider';\n\nimport {\n isPassword,\n isSharedSecret,\n isUuid,\n tryParse,\n tryStringify,\n url,\n} from '~/util';\nimport { sanitiseIds } from '~/util/api-ids';\nimport {\n printBlockVersion,\n printEntriesMigrateResult,\n printModelMigrationAnalysis,\n printModelMigrationResult,\n printNodeTreeOutput,\n printNodesMigrateResult,\n} from '~/util/console.printer';\nimport { csvFormatter } from '~/util/csv.formatter';\nimport { htmlFormatter } from '~/util/html.formatter';\nimport { jsonFormatter, limitFields } from '~/util/json.formatter';\nimport { xmlFormatter } from '~/util/xml.formatter';\nimport { isDebug } from '~/util/debug';\nimport { diffLogStrings } from '~/util/diff';\nimport { findByIdOrName } from '~/util/find';\nimport { logError, Logger } from '~/util/logger';\nimport { promiseDelay } from '~/util/timers';\n\nlet insecurePasswordWarningShown = false;\n\nclass ContensisCli {\n static quit = (error?: Error) => {\n process.removeAllListeners('exit');\n const exitCode = error ? 1 : 0;\n\n // console.info(`\\nExiting contensis-cli with exit code: ${exitCode}\\n`);\n process.exit(exitCode);\n };\n\n private format?: OutputFormat;\n private output?: string;\n private session: SessionCacheProvider;\n\n auth?: ContensisAuthService;\n command: CliCommand;\n contensis?: ContensisMigrationService;\n contensisOpts: Partial<MigrateRequest>;\n currentProject: string;\n debug = isDebug();\n\n sourceAlias?: string;\n targetEnv?: string;\n urls: CliUrls;\n log = Logger;\n messages = LogMessages;\n\n verb: string;\n noun: string;\n thirdArg: string;\n\n get cache() {\n return this.session.Get();\n }\n\n get currentEnv() {\n return this.cache.currentEnvironment || '';\n }\n\n set currentEnv(currentEnvironment: string) {\n this.session.Update({ currentEnvironment });\n }\n\n get env() {\n const currentEnvironment = this.currentEnv;\n const environments = this.cache.environments || {};\n\n if (!currentEnvironment) return {} as EnvironmentCache;\n else if (environments[currentEnvironment])\n return environments[currentEnvironment];\n else {\n return {\n history: [],\n lastUserId: '',\n projects: [],\n versionStatus: 'latest',\n } as EnvironmentCache;\n }\n }\n\n constructor(\n args: string[],\n outputOpts?: OutputOptionsConstructorArg,\n contensisOpts: Partial<MigrateRequest> = {}\n ) {\n // console.log('args: ', JSON.stringify(args, null, 2));\n\n const [exe, script, verb = '', noun = '', ...restArgs] = args;\n this.verb = verb?.toLowerCase();\n this.noun = noun?.toLowerCase();\n this.thirdArg = restArgs?.[0];\n\n const commandText = `${this.verb} ${this.noun} ${\n restArgs ? restArgs.join(' ') : ''\n }`.trim();\n\n this.session = new SessionCacheProvider();\n\n this.contensisOpts = contensisOpts;\n\n // Explicitly sanitise supplied fields to api-friendly ids\n if (Array.isArray(this.contensisOpts.query?.fields)) {\n this.contensisOpts.query.fields = sanitiseIds(\n this.contensisOpts.query.fields\n );\n }\n\n this.format = outputOpts?.format;\n this.output =\n outputOpts?.output && path.join(process.cwd(), outputOpts.output);\n\n const currentEnvironment = outputOpts?.alias || this.currentEnv;\n const environments = this.cache.environments || {};\n this.currentEnv = currentEnvironment;\n\n // Set env from command options\n const env = this.env;\n if (outputOpts?.projectId) env.currentProject = outputOpts.projectId;\n if (outputOpts?.user) env.lastUserId = outputOpts.user;\n // setting this in env means passwordFallback is written to environments.json\n if (outputOpts?.password) env.passwordFallback = outputOpts.password;\n if (outputOpts?.clientId) env.lastUserId = outputOpts.clientId;\n if (outputOpts?.sharedSecret)\n if (outputOpts.sharedSecret.startsWith('-'))\n throw new Error(\n `Shared secret option provided a value of ${outputOpts.sharedSecret}`\n );\n else env.passwordFallback = outputOpts.sharedSecret;\n\n this.currentProject = env?.currentProject || 'null';\n this.sourceAlias = outputOpts?.sourceAlias || currentEnvironment;\n\n if (currentEnvironment) {\n this.urls = url(currentEnvironment, env?.currentProject || 'website');\n }\n\n this.command = {\n commandText,\n options: outputOpts as any,\n createdDate: new Date().toISOString(),\n invokedBy: env?.lastUserId,\n };\n\n if (currentEnvironment) {\n env.history = [this.command];\n if (commandText) {\n environments[currentEnvironment] = env;\n this.session.Update({\n currentEnvironment,\n environments,\n history: [commandText],\n });\n }\n }\n }\n\n PrintEnvironments = async () => {\n const { log, messages } = this;\n const { currentEnvironment, environments = {} } = this.cache;\n const envKeys = Object.keys(environments);\n log.success(messages.envs.found(envKeys.length));\n await this.HandleFormattingAndOutput(envKeys, () => {\n // print the envKeys to console\n for (const env of envKeys) {\n console.log(` - ${currentEnvironment === env ? '* ' : ''}${env}`);\n }\n });\n if (envKeys.length === 0 || !currentEnvironment) {\n log.help(messages.envs.tip());\n }\n };\n\n RemoveEnvironment = async (env: string) => {\n const { log, messages, session } = this;\n const { currentEnvironment, environments = {} } = this.cache;\n const envKeys = Object.keys(environments);\n log.success(messages.envs.found(envKeys.length));\n if (environments[env]) {\n // remove env from cache\n session.RemoveEnv(env);\n // remove credentials\n const lastUserId = environments[env].lastUserId;\n if (lastUserId) {\n const [err, credentials] = await new CredentialProvider({\n userId: environments[env].lastUserId,\n alias: env,\n }).Init();\n if (!err && credentials) await credentials.Delete();\n }\n log.success(messages.envs.removed(env));\n // support the output and format options - exporting the history for the\n // removed alias\n await this.HandleFormattingAndOutput(environments[env], () => log.line());\n } else {\n log.warning(messages.envs.notFound(env));\n }\n\n const nextCurrentEnv =\n currentEnvironment === env ? undefined : currentEnvironment;\n if (envKeys.length === 0 || !nextCurrentEnv) log.help(messages.envs.tip());\n\n return nextCurrentEnv;\n };\n\n Connect = async (environment: string) => {\n const { log, messages, session } = this;\n\n if (environment) {\n this.currentEnv = environment;\n this.urls = url(environment, 'website');\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const [fetchErr, response] = await to(fetch(this.urls.cms));\n if (response && response?.status < 400) {\n log.success(messages.connect.connected(environment));\n session.UpdateEnv(this.env, environment);\n\n if (this.env?.lastUserId) {\n // await this.ConnectContensis();\n await this.PrintProjects();\n } else {\n log.warning(messages.projects.noList());\n log.help(messages.connect.tip());\n }\n } else {\n // Cannot reach environment - status X\n log.error(\n messages.connect.unreachable(this.urls.cms, response?.status || 0)\n );\n }\n } else {\n // No environment alias specified\n log.error(messages.connect.noEnv());\n }\n };\n\n ConnectContensis = async ({ commit = false } = {}) => {\n if (!this.contensis) {\n const { contensisOpts, currentEnv, env, log, messages } = this;\n const userId = env?.lastUserId;\n const isGuidId = userId && isUuid(userId);\n\n if (currentEnv && userId) {\n const credentials = await this.GetCredentials(\n userId,\n env.passwordFallback\n );\n\n const cachedPassword = credentials?.current?.password;\n\n if (cachedPassword) {\n this.contensis = new ContensisMigrationService(\n {\n ...contensisOpts,\n source: {\n url: this.urls?.cms || '',\n username: !isGuidId ? userId : undefined,\n password: !isGuidId ? cachedPassword : undefined,\n clientId: isGuidId ? userId : undefined,\n sharedSecret: isGuidId ? cachedPassword : undefined,\n project: env?.currentProject || '',\n assetHostname: this.urls?.previewWeb,\n },\n concurrency:\n typeof contensisOpts.concurrency !== 'undefined'\n ? contensisOpts.concurrency\n : 3,\n outputProgress: true,\n },\n !commit\n );\n }\n } else {\n if (!currentEnv) log.help(messages.connect.help());\n if (!userId) log.help(messages.connect.tip());\n }\n }\n return this.contensis;\n };\n\n ConnectContensisImport = async ({\n commit = false,\n fromFile,\n importDataType,\n }: {\n commit?: boolean;\n fromFile?: string;\n importDataType?:\n | 'entries'\n | 'contentTypes'\n | 'components'\n | 'models'\n | 'nodes'\n | 'user-input';\n }) => {\n const source: 'contensis' | 'file' = fromFile ? 'file' : 'contensis';\n\n const fileData = fromFile ? (await readFileAsJSON(fromFile)) || [] : [];\n\n if (typeof fileData === 'string')\n throw new Error(`Import file format must be of type JSON`);\n\n const { contensisOpts, currentEnv, env, log, messages, sourceAlias } = this;\n const environments = this.cache.environments || {};\n const sourceEnvironment = environments[sourceAlias || ''] || {};\n const sourceCms =\n ('source' in contensisOpts && contensisOpts.source) ||\n ({} as Partial<SourceCms>);\n const sourceUserId =\n sourceCms.clientId || sourceCms.username || sourceEnvironment.lastUserId;\n const sourceProjectId =\n sourceCms.project || sourceEnvironment.currentProject || 'website';\n const isSourceGuidId = sourceUserId && isUuid(sourceUserId);\n const sourceUrls = url(sourceAlias || '', sourceProjectId);\n\n const sourcePassword =\n sourceCms.sharedSecret ||\n sourceCms.password ||\n sourceEnvironment.passwordFallback;\n\n const targetUserId = env?.lastUserId;\n const isTargetGuidId = targetUserId && isUuid(targetUserId);\n\n if (sourceUserId && currentEnv && targetUserId) {\n const sourceCredentials = await this.GetCredentials(\n sourceUserId,\n sourcePassword,\n sourceAlias,\n false\n );\n\n const cachedSourcePassword = sourceCredentials?.current?.password;\n\n const targetCredentials = await this.GetCredentials(\n targetUserId,\n env.passwordFallback\n );\n\n const cachedTargetPassword = targetCredentials?.current?.password;\n\n if (cachedSourcePassword && cachedTargetPassword) {\n if (source === 'file' || importDataType === 'user-input') {\n this.contensis = new ContensisMigrationService(\n {\n concurrency: 3,\n outputProgress: true,\n ...contensisOpts,\n target: {\n url: this.urls?.cms || '',\n username: !isTargetGuidId ? targetUserId : undefined,\n password: !isTargetGuidId ? cachedTargetPassword : undefined,\n clientId: isTargetGuidId ? targetUserId : undefined,\n sharedSecret: isTargetGuidId ? cachedTargetPassword : undefined,\n targetProjects: [env.currentProject || ''],\n assetHostname: this.urls?.previewWeb,\n },\n ...(importDataType ? { [importDataType]: fileData } : {}),\n },\n !commit\n );\n } else if (source === 'contensis') {\n this.contensis = new ContensisMigrationService(\n {\n concurrency: 3,\n outputProgress: true,\n ...contensisOpts,\n source: {\n url: sourceUrls.cms || '',\n username: !isSourceGuidId ? sourceUserId : undefined,\n password: !isSourceGuidId ? cachedSourcePassword : undefined,\n clientId: isSourceGuidId ? sourceUserId : undefined,\n sharedSecret: isSourceGuidId ? cachedSourcePassword : undefined,\n project: sourceProjectId,\n assetHostname: sourceUrls.previewWeb,\n },\n target: {\n url: this.urls?.cms || '',\n username: !isTargetGuidId ? targetUserId : undefined,\n password: !isTargetGuidId ? cachedTargetPassword : undefined,\n clientId: isTargetGuidId ? targetUserId : undefined,\n sharedSecret: isTargetGuidId ? cachedTargetPassword : undefined,\n targetProjects: [env.currentProject || ''],\n assetHostname: this.urls?.previewWeb,\n },\n },\n !commit\n );\n }\n }\n } else {\n if (!currentEnv) log.help(messages.connect.help());\n if (!targetUserId) log.help(messages.connect.tip());\n }\n return this.contensis;\n };\n\n GetCredentials = async (\n userId: string,\n password?: string,\n currentEnv = this.currentEnv,\n saveCurrentEnv = true\n ): Promise<CredentialProvider | undefined> => {\n const { log, messages } = this;\n if (userId) {\n const [credentialError, credentials] = await new CredentialProvider(\n { userId, alias: currentEnv },\n password\n ).Init();\n\n if (credentialError && !credentials.current) {\n // Log problem with Credential Provider\n log.error(\n `Unable to find credentials for user ${userId} at ${currentEnv}`,\n credentialError as any\n );\n return;\n }\n\n if (credentials.remarks.secure !== true) {\n if (!insecurePasswordWarningShown) {\n log.warning(messages.login.insecurePassword());\n insecurePasswordWarningShown = true;\n }\n } else {\n const env = this.cache.environments[currentEnv];\n env.passwordFallback = undefined;\n this.session.UpdateEnv(env, currentEnv, saveCurrentEnv);\n }\n return credentials;\n }\n };\n\n Login = async (\n userId: string,\n {\n password = '',\n promptPassword = true,\n sharedSecret = '',\n silent = false,\n attempt = 1,\n }: {\n password?: string;\n promptPassword?: boolean;\n sharedSecret?: string;\n silent?: boolean;\n attempt?: number;\n } = {}\n ): Promise<string | undefined> => {\n let inputPassword = password || sharedSecret;\n\n if (!inputPassword)\n inputPassword =\n isSharedSecret(this.env.passwordFallback) ||\n isPassword(this.env.passwordFallback) ||\n '';\n\n const { messages } = this;\n\n if (userId) {\n const { currentEnv, env } = this;\n\n if (currentEnv) {\n const credentials = await this.GetCredentials(userId, inputPassword);\n\n if (credentials) {\n const cachedPassword = isPassword(credentials.current?.password);\n const cachedSecret = isSharedSecret(credentials.current?.password);\n\n if (!cachedPassword && !cachedSecret && promptPassword) {\n // Password prompt\n ({ inputPassword } = await inquirer.prompt([\n {\n type: 'password',\n message: messages.login.passwordPrompt(currentEnv, userId),\n name: 'inputPassword',\n mask: '*',\n prefix: undefined,\n },\n ]));\n }\n\n if (inputPassword || cachedPassword || cachedSecret) {\n this.auth = new ContensisAuthService({\n username: userId,\n password: inputPassword || cachedPassword,\n projectId: env?.currentProject || 'website',\n rootUrl: this.urls?.cms || '',\n clientId: userId,\n clientSecret: sharedSecret || cachedSecret,\n });\n\n const [authError, bearerToken] = await to(this.auth.BearerToken());\n\n // Login successful\n if (bearerToken) {\n // Set env vars\n env.authToken = bearerToken;\n env.lastUserId = userId;\n env.passwordFallback =\n credentials.remarks.secure !== true\n ? credentials.current?.password\n : undefined;\n\n // Persist env before finding projects or doing anything else\n this.session.UpdateEnv(env);\n if (inputPassword) await credentials.Save(inputPassword);\n if (sharedSecret) await credentials.Save(sharedSecret);\n\n if (!silent) {\n Logger.success(messages.login.success(currentEnv, userId));\n await this.PrintProjects();\n }\n } else if (authError) {\n Logger.error(authError.toString());\n // Clear env vars\n env.authToken = '';\n env.lastUserId = '';\n env.passwordFallback = undefined;\n // Persist env to remove cleared values\n this.session.UpdateEnv(env);\n\n // If the auth error was raised using a cached password\n if (\n (cachedPassword || cachedSecret) &&\n credentials.remarks.secure\n ) {\n // Remove any bad stored credential and trigger login prompt again\n await credentials.Delete();\n return await this.Login(userId, { password, sharedSecret });\n } else {\n throw new Error(messages.login.failed(currentEnv, userId));\n }\n }\n\n return env.authToken;\n } else {\n Logger.error(messages.login.passwordPrompt());\n if (attempt < 2)\n return await this.Login(userId, { attempt: attempt + 1 });\n }\n }\n } else {\n // No environment set, use `contensis connect {alias}` first\n Logger.error(messages.login.noEnv());\n }\n } else {\n // No user id specified\n Logger.error(messages.login.noUserId());\n }\n };\n\n PrintContensisVersion = async () => {\n const { log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve projects list for env\n const [projectsErr, projects] = await to(\n contensis.projects.GetSourceProjects()\n );\n\n if (Array.isArray(projects)) {\n // Print contensis version to console\n await this.HandleFormattingAndOutput(contensis.contensisVersion, () =>\n log.raw(log.highlightText(contensis.contensisVersion))\n );\n }\n\n if (projectsErr) {\n log.error(messages.projects.noList());\n log.error(projectsErr.message);\n }\n }\n };\n\n PrintBearerToken = async () => {\n const { log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve token for env\n const [error, token] = await to(\n contensis.content.sourceRepo.repo.BearerToken()\n );\n if (token) {\n // Print bearer token to console\n await this.HandleFormattingAndOutput(token, () =>\n log.raw(log.highlightText(token))\n );\n }\n\n if (error) {\n log.error(messages.projects.noList());\n log.error(error.message);\n }\n }\n };\n\n PrintProjects = async () => {\n const { currentProject, log, messages, session } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve projects list for env\n const [projectsErr, projects] = await to(\n contensis.projects.GetSourceProjects()\n );\n\n if (Array.isArray(projects)) {\n // save these projects in cache\n const nextCurrentProject =\n currentProject && currentProject !== 'null'\n ? currentProject\n : projects.some(p => p.id === 'website')\n ? 'website'\n : undefined;\n\n session.UpdateEnv({\n projects: projects.map(p => p.id),\n currentProject: nextCurrentProject,\n });\n\n log.success(messages.projects.list());\n log.raw('');\n\n await this.HandleFormattingAndOutput(projects, () => {\n // print the projects to console\n for (const project of projects.sort((a, b) =>\n a.id.localeCompare(b.id)\n )) {\n let color;\n try {\n color = chalk.keyword((project as any).color);\n } catch (ex) {\n Logger.debug(`${ex}`);\n color = chalk.white;\n }\n console.log(\n `${\n nextCurrentProject === project.id\n ? `>> ${log.boldText(color(project.id))}`\n : ` ${color(project.id)}`\n } ${log.infoText(\n `[${project.supportedLanguages\n .map(l =>\n l === project.primaryLanguage ? `*${log.boldText(l)}` : l\n )\n .join(' ')}]`\n )}`\n );\n }\n });\n\n if (!this.SetProject(nextCurrentProject))\n log.warning(messages.projects.tip());\n }\n\n if (projectsErr) {\n log.error(messages.projects.noList());\n log.error(projectsErr.message);\n }\n }\n };\n\n PrintProject = async (projectId = this.currentProject) => {\n const { log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve projects list for env\n const [projectsErr, projects] = await to(\n contensis.projects.GetSourceProjects()\n );\n\n const foundProject = projects?.find(\n p => p.id.toLowerCase() === projectId.toLowerCase()\n );\n\n if (foundProject) {\n log.raw('');\n await this.HandleFormattingAndOutput(foundProject, log.object);\n }\n\n if (projectsErr) {\n log.error(messages.projects.noList());\n log.error(projectsErr.message);\n }\n }\n };\n\n SetProject = (projectId = 'website') => {\n const { env, log, messages, session } = this;\n let nextProjectId: string | undefined;\n if (env?.projects.length > 0 && env?.lastUserId) {\n nextProjectId = env.projects.find(\n p => p.toLowerCase() === projectId.toLowerCase()\n );\n if (nextProjectId) {\n env.currentProject = nextProjectId;\n session.UpdateEnv(env);\n log.success(messages.projects.set(projectId));\n log.raw('');\n } else {\n log.error(messages.projects.failedSet(projectId));\n }\n } else {\n // No projects for currentEnv, try logging in\n log.warning(messages.projects.noList());\n log.help(messages.connect.tip());\n }\n return nextProjectId;\n };\n\n SetVersion = (versionStatus: 'latest' | 'published') => {\n const { env, log, messages, session } = this;\n if (!['latest', 'published'].includes(versionStatus)) {\n log.error(messages.version.invalid(versionStatus));\n return false;\n }\n if (!env) {\n log.help(messages.version.noEnv());\n return false;\n }\n if (env?.projects.length > 0 && env?.lastUserId) {\n session.UpdateEnv({ versionStatus });\n log.success(messages.version.set(this.currentEnv, versionStatus));\n return true;\n } else {\n // No projects for currentEnv, try logging in\n log.warning(messages.projects.noList());\n log.help(messages.connect.tip());\n return false;\n }\n };\n\n PrintApiKeys = async () => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve keys list for env\n const [keysErr, apiKeys] = await contensis.apiKeys.GetKeys();\n\n if (Array.isArray(apiKeys)) {\n log.success(messages.keys.list(currentEnv));\n await this.HandleFormattingAndOutput(apiKeys, () => {\n // print the keys to console\n for (const {\n id,\n sharedSecret,\n name,\n description,\n dateModified,\n modifiedBy,\n } of apiKeys) {\n console.log(\n ` - ${name}${\n description ? ` (${description})` : ''\n } [${dateModified.toString().substring(0, 10)} ${modifiedBy}]`\n );\n console.log(` ${id}`);\n console.log(` ${sharedSecret}`);\n }\n });\n }\n\n if (keysErr) {\n log.error(messages.keys.noList(currentEnv));\n log.error(jsonFormatter(keysErr));\n }\n }\n };\n\n CreateApiKey = async (name: string, description = '') => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n const [err, key] = await contensis.apiKeys.CreateKey(name, description);\n\n if (key) {\n log.success(messages.keys.created(currentEnv, name));\n\n // print the key details to console\n console.log(\n ` - ${chalk.bold(key.name)} [${key.dateModified\n .toString()\n .substring(0, 10)} ${key.modifiedBy}]`\n );\n if (key.description)\n console.log(` ${log.infoText(key.description)}`);\n console.log(` ${chalk.bold.grey`id`}: ${key.id}`);\n console.log(\n ` ${chalk.bold.grey`sharedSecret`}: ${key.sharedSecret}`\n );\n console.log('');\n log.help(messages.keys.tip());\n }\n\n if (err) {\n log.error(messages.keys.failedCreate(currentEnv, name), err);\n }\n }\n };\n\n RemoveApiKey = async (id: string) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis({ commit: true });\n\n if (contensis) {\n const [err] = await contensis.apiKeys.RemoveKey(id);\n\n if (!err) {\n log.success(messages.keys.removed(currentEnv, id));\n console.log('');\n } else {\n log.error(messages.keys.failedRemove(currentEnv, id), err);\n }\n }\n };\n\n PrintRoles = async () => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve roles list for env\n const [rolesErr, roles] = await to(contensis.roles.GetRoles());\n\n if (Array.isArray(roles)) {\n log.success(messages.roles.list(currentEnv));\n\n if (!roles.length) log.help(messages.roles.noneExist());\n\n await this.HandleFormattingAndOutput(roles, () => {\n // print the roles to console\n for (const {\n id,\n name,\n description,\n enabled,\n assignments,\n permissions,\n } of roles) {\n const color = enabled ? (s: string) => s : log.infoText;\n\n console.log(color(` - ${chalk.bold(name)} ${log.infoText(id)}`));\n if (description) console.log(log.infoText(` ${description}`));\n if (enabled === false)\n console.log(` ${chalk.bold.grey('enabled')}: false`);\n if (assignments.groups?.length)\n console.log(\n ` ${chalk.bold.grey('groups')}: ${assignments.groups.join(\n ', '\n )}`\n );\n if (assignments.users?.length)\n console.log(\n ` ${chalk.bold.grey('users')}: ${assignments.users.join(\n ', '\n )}`\n );\n if (assignments.apiKeys?.length)\n console.log(\n ` ${chalk.bold.grey('keys')}: ${assignments.apiKeys.join(\n ', '\n )}`\n );\n\n if (permissions.entries?.length) {\n console.log(` ${chalk.bold.grey('entries')}:`);\n for (const p of permissions.entries)\n console.log(\n ` ${p.id}: ${log.infoText(\n p.actions.length > 2\n ? p.actions.length\n : p.actions.join(', ')\n )}`\n );\n }\n if (permissions.contentTypes?.length)\n console.log(\n ` ${chalk.bold.grey(\n 'contentTypes'\n )}: ${permissions.contentTypes\n .map(\n p =>\n `${p.id} [${p.actions.join(',')}] ${(\n p as any\n ).languages.join(' ')}`\n )\n .join(', ')}`\n );\n }\n });\n }\n\n if (rolesErr) {\n log.error(messages.roles.noList(currentEnv));\n log.error(jsonFormatter(rolesErr));\n }\n }\n };\n\n PrintRole = async (roleNameOrId: string) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve roles list for env\n const [rolesErr, roles] = await to(contensis.roles.GetRoles());\n\n if (Array.isArray(roles)) {\n log.success(messages.roles.list(currentEnv));\n\n const role = findByIdOrName(roles, roleNameOrId);\n\n if (role) await this.HandleFormattingAndOutput(role, log.object);\n else log.error(messages.roles.failedGet(currentEnv, roleNameOrId));\n }\n\n if (rolesErr) {\n log.error(messages.roles.noList(currentEnv));\n log.error(jsonFormatter(rolesErr));\n }\n }\n };\n\n CreateRole = async (role: Partial<Role>) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n const [err, created] = await contensis.roles.CreateRole(role as Role);\n\n if (created) {\n log.success(\n messages.roles.created(currentEnv, role.id || role.name || '')\n );\n\n await this.HandleFormattingAndOutput(created, log.object);\n\n log.help(messages.roles.tip());\n return role.id;\n }\n\n if (err) {\n log.error(\n messages.roles.failedCreate(currentEnv, role.id || role.name || ''),\n err\n );\n }\n }\n };\n\n UpdateRole = async (roleNameOrId: string, role: Partial<Role>) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve roles list for env\n const [rolesErr, roles] = await to(contensis.roles.GetRoles());\n\n if (Array.isArray(roles)) {\n log.success(messages.roles.list(currentEnv));\n\n const existingRole = findByIdOrName(roles, roleNameOrId, true);\n if (existingRole) {\n log.info(messages.roles.setPayload());\n log.object(role);\n log.raw(``);\n const [updateErr, updated] = await contensis.roles.UpdateRole(\n existingRole.id,\n role\n );\n if (updateErr)\n log.error(messages.roles.failedSet(currentEnv, roleNameOrId));\n else {\n log.success(messages.roles.set());\n\n await this.HandleFormattingAndOutput(updated, log.object);\n }\n } else {\n // Role does not exist\n log.error(messages.roles.failedGet(currentEnv, roleNameOrId));\n }\n }\n\n if (rolesErr) {\n log.error(messages.roles.noList(currentEnv));\n log.error(jsonFormatter(rolesErr));\n }\n }\n };\n\n RemoveRole = async (roleNameOrId: string) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve roles list for env\n const [rolesErr, roles] = await to(contensis.roles.GetRoles());\n\n if (Array.isArray(roles)) {\n log.success(messages.roles.list(currentEnv));\n\n const existingRole = findByIdOrName(roles, roleNameOrId, true);\n\n if (existingRole) {\n const [deleteErr] = await contensis.roles.RemoveRole(existingRole.id);\n\n if (deleteErr)\n log.error(messages.roles.failedRemove(currentEnv, roleNameOrId));\n else log.success(messages.roles.removed(currentEnv, roleNameOrId));\n } else {\n // Role does not exist\n log.error(messages.roles.failedGet(currentEnv, roleNameOrId));\n }\n }\n\n if (rolesErr) {\n log.error(messages.roles.noList(currentEnv));\n log.error(jsonFormatter(rolesErr));\n }\n }\n };\n\n PrintWorkflows = async () => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve workflows list for env\n const [workflowsErr, workflows] =\n await contensis.content.sourceRepo.workflows.GetWorkflows();\n\n if (Array.isArray(workflows)) {\n log.success(messages.workflows.list(currentEnv));\n\n if (!workflows.length) log.help(messages.workflows.noneExist());\n\n const stringFromLanguageObject = (o: { [lang: string]: string }) =>\n Object.values(o || {})?.[0];\n\n await this.HandleFormattingAndOutput(workflows, () => {\n // print the workflows to console\n // log.object(workflows);\n for (const {\n id,\n name,\n description,\n states,\n eventGroups,\n isSystem,\n } of workflows as any) {\n const color = isSystem ? (s: string) => s : log.infoText;\n\n console.log(\n color(\n ` - ${chalk.bold(\n stringFromLanguageObject(name)\n )} ${log.infoText(id)}`\n )\n );\n if (description)\n console.log(\n log.infoText(` ${stringFromLanguageObject(description)}`)\n );\n if (isSystem === false)\n console.log(` ${chalk.bold.grey('isSystem')}: false`);\n if (states?.length)\n console.log(\n ` ${chalk.bold.grey('states')}: ${states\n .map((state: any) => state.id)\n .join(', ')}`\n );\n if (eventGroups?.length)\n console.log(\n ` ${chalk.bold.grey('eventGroups')}: ${eventGroups\n .map((evtGrp: any) => evtGrp.id)\n .join(', ')}`\n );\n }\n });\n }\n\n if (workflowsErr) {\n log.error(messages.workflows.noList(currentEnv));\n log.error(jsonFormatter(workflowsErr));\n }\n }\n };\n\n PrintWorkflow = async (workflowNameOrId: string) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n // Retrieve workflows list for env\n const [workflowsErr, workflows] =\n await contensis.content.sourceRepo.workflows.GetWorkflows();\n\n if (Array.isArray(workflows)) {\n log.success(messages.workflows.list(currentEnv));\n\n const workflow = findByIdOrName(workflows, workflowNameOrId);\n\n if (workflow)\n await this.HandleFormattingAndOutput(workflow, log.object);\n else\n log.error(messages.workflows.failedGet(currentEnv, workflowNameOrId));\n }\n\n if (workflowsErr) {\n log.error(messages.workflows.noList(currentEnv));\n log.error(jsonFormatter(workflowsErr));\n }\n }\n };\n\n CreateProject = async (project: Project) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n const [err, created] = await contensis.projects.CreateProject(project);\n\n if (created) {\n log.success(messages.projects.created(currentEnv, project.id));\n\n await this.HandleFormattingAndOutput(created, () => {\n // set the CLI project to the newly created project\n this.SetProject(project.id);\n // print all the projects to console\n this.PrintProjects();\n });\n return project.id;\n }\n\n if (err) {\n log.error(messages.projects.failedCreate(currentEnv, project.id), err);\n }\n }\n };\n\n UpdateProject = async (project: Partial<Project>) => {\n const { currentEnv, currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n const [err, updated] = await contensis.projects.UpdateProject({\n id: currentProject,\n ...project,\n });\n\n if (updated) {\n log.success(messages.projects.updated(currentEnv, currentProject));\n\n await this.HandleFormattingAndOutput(updated, log.object);\n return updated.id;\n }\n\n if (err) {\n log.error(\n messages.projects.failedUpdate(currentEnv, currentProject),\n err\n );\n }\n }\n };\n\n PrintContentModels = async (\n modelIds: string[] = [],\n opts: { export?: boolean; requiredBy?: boolean }\n ) => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve models list for env\n const models = await contensis.models.contentModels();\n const contentTypes = await contensis.models.contentTypes();\n const components = await contensis.models.components();\n\n // Models to output to console\n const returnModels = modelIds?.length\n ? models?.filter((m: Model) =>\n modelIds.some(id => id.toLowerCase() === m.id.toLowerCase())\n )\n : undefined;\n const exportResources: (ContentType | Component)[] = [];\n\n if (opts.export) {\n // Generate a list of contentTypeIds and componentIds from all models\n // and dependencies\n const contentTypeIds = Array.from(\n new Set([\n ...(returnModels || models || []).map(m => m.id),\n ...(returnModels || models || [])\n .map(m => m.dependencies?.contentTypes?.map(c => c[0]) || [])\n .flat(),\n ])\n );\n const componentIds = Array.from(\n new Set(\n (returnModels || models || [])\n .map(m => m.dependencies?.components?.map(c => c[0]) || [])\n .flat()\n )\n );\n\n // Create an array of all the content types and component definitions\n // we will use this when outputting to a file\n exportResources.push(\n ...contentTypes.filter(c =>\n contentTypeIds\n .map(i => i.toLowerCase())\n .includes(c.id.toLowerCase())\n ),\n ...components.filter(c =>\n componentIds.map(i => i.toLowerCase()).includes(c.id.toLowerCase())\n )\n );\n }\n\n if (Array.isArray(returnModels)) {\n log.success(messages.models.list(currentProject));\n await this.HandleFormattingAndOutput(\n opts.export ? exportResources : returnModels,\n () => {\n // print the content models to console\n for (const model of returnModels) {\n // create a clone of each model to safely modify\n const draft = clone()(model);\n if (!opts.requiredBy) {\n // truncate parts of the output\n delete draft.dependencyOf;\n if (draft.dependencies?.contentTypes)\n draft.dependencies.contentTypes.forEach(id => id.pop());\n if (draft.dependencies?.components)\n draft.dependencies.components.forEach(id => id.pop());\n }\n\n log.raw('');\n log.object(draft);\n }\n log.raw('');\n }\n );\n } else {\n log.success(\n messages.models.get(currentProject, models?.length.toString() || '0')\n );\n log.raw('');\n if (models?.length) {\n await this.HandleFormattingAndOutput(\n opts.export ? exportResources : models,\n () => {\n // print the content models to console\n for (const model of models) {\n const components = model.components?.length || 0;\n const contentTypes = model.contentTypes?.length || 0;\n const defaults =\n (model.defaults?.length || 0) + (model.nodes?.length || 0);\n const dependencies =\n (model.dependencies?.components?.length || 0) +\n (model.dependencies?.contentTypes?.length || 0);\n const dependencyOf =\n (model.dependencyOf?.components?.length || 0) +\n (model.dependencyOf?.contentTypes?.length || 0);\n\n const hasAny =\n components + contentTypes + dependencies + dependencyOf;\n log.raw(\n ` - ${log.highlightText(log.boldText(model.id))} ${\n hasAny\n ? log.infoText(\n `{ ${\n components ? `components: ${components}, ` : ''\n }${\n contentTypes\n ? `contentTypes: ${contentTypes}, `\n : ''\n }${defaults ? `defaults: ${defaults}, ` : ''}${\n dependencies ? `references: ${dependencies}, ` : ''\n }${\n dependencyOf ? `required by: ${dependencyOf}` : ''\n } }`\n )\n : ''\n }`\n );\n }\n log.raw('');\n }\n );\n }\n }\n }\n };\n\n ImportContentModels = async ({\n commit,\n fromFile,\n }: {\n commit: boolean;\n fromFile: string;\n }) => {\n const { currentProject, log, messages } = this;\n\n const fileData = fromFile\n ? (await readFileAsJSON<(ContentType | Component)[]>(fromFile)) || []\n : [];\n if (typeof fileData === 'string')\n throw new Error(`Import file format must be of type JSON`);\n\n const contensis = await this.ConnectContensisImport({\n commit,\n fromFile,\n importDataType: 'models',\n });\n\n if (contensis) {\n log.line();\n if (contensis.isPreview) {\n log.success(messages.migrate.preview());\n } else {\n log.warning(messages.migrate.commit());\n }\n\n const [migrateErr, result] = await contensis.MigrateContentModels();\n\n if (migrateErr) logError(migrateErr);\n else\n await this.HandleFormattingAndOutput(result, () => {\n // print the results to console\n if (!result.committed) {\n log.raw(log.boldText(`\\nContent types:`));\n if (!result.contentTypes) log.info(`- None returned\\n`);\n else printModelMigrationAnalysis(this, result.contentTypes);\n\n log.raw(log.boldText(`\\nComponents:`));\n if (!result.components) log.info(`- None returned\\n`);\n else printModelMigrationAnalysis(this, result.components);\n\n if (result.defaults && Object.keys(result.defaults).length) {\n log.raw(log.boldText(`\\nDefaults:`));\n printModelMigrationAnalysis(this, result.defaults);\n }\n if (result.nodes && Object.keys(result.nodes).length) {\n log.raw(log.boldText(`\\nNodes:`));\n printModelMigrationAnalysis(this, result.nodes);\n }\n if (result.errors) {\n log.raw(log.boldText(`\\nErrors:`));\n log.object(result.errors);\n }\n } else {\n const { modelsResult = {} } = result;\n log.raw(log.boldText(`\\nContent types:`));\n printModelMigrationResult(\n this,\n modelsResult[currentProject].contentTypes\n );\n // Only output for components if any status has any results\n if (\n Object.values(modelsResult[currentProject].components).some(\n r => r.length > 0\n )\n ) {\n log.raw(log.boldText(`\\nComponents:`));\n printModelMigrationResult(\n this,\n modelsResult[currentProject].components\n );\n }\n if (\n Object.values(modelsResult[currentProject].defaults || {}).some(\n r => r.length > 0\n )\n ) {\n log.raw(log.boldText(`\\nDefaults:`));\n printModelMigrationResult(\n this,\n modelsResult[currentProject].defaults\n );\n }\n if (\n Object.values(modelsResult[currentProject].nodes || {}).some(\n r => r.length > 0\n )\n ) {\n log.raw(log.boldText(`\\nNodes:`));\n printModelMigrationResult(\n this,\n modelsResult[currentProject].nodes\n );\n }\n }\n });\n } else {\n log.warning(messages.models.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n PrintContentTypes = async () => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve content types list for env\n const contentTypes = await contensis.models.contentTypes();\n\n if (Array.isArray(contentTypes)) {\n log.success(messages.contenttypes.list(currentProject));\n await this.HandleFormattingAndOutput(contentTypes, () => {\n // print the content types to console\n for (const contentType of contentTypes) {\n const fieldsLength = contentType.fields?.length || 0;\n console.log(\n ` - ${contentType.id} [${fieldsLength} field${\n fieldsLength !== 1 ? 's' : ''\n }]`\n );\n }\n });\n }\n }\n };\n\n PrintContentType = async (contentTypeId: string) => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve content types list for env\n const contentTypes = await contensis.models.contentTypes();\n\n if (Array.isArray(contentTypes)) {\n const contentType = contentTypes.find(\n c => c.id.toLowerCase() === contentTypeId.toLowerCase()\n );\n if (contentType) {\n log.success(\n messages.contenttypes.get(currentProject, contentType.id)\n );\n // print the content type to console\n await this.HandleFormattingAndOutput(contentType, log.object);\n } else {\n log.error(\n messages.contenttypes.failedGet(currentProject, contentTypeId)\n );\n }\n }\n }\n };\n\n RemoveContentTypes = async (contentTypeIds: string[], commit = false) => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: 'user-input', // 'user-input' import type does not require a source cms\n });\n if (contensis) {\n const [err, result] = await contensis.DeleteContentTypes(contentTypeIds);\n\n if (err) {\n log.error(\n messages.contenttypes.failedRemove(\n currentProject,\n contentTypeIds.join(', ')\n ),\n err\n );\n } else {\n log.success(\n messages.contenttypes.removed(\n currentProject,\n contentTypeIds.join(', '),\n !contensis.isPreview\n )\n );\n // print the results to console\n await this.HandleFormattingAndOutput(result, log.object);\n }\n }\n };\n\n ImportContentTypes = async (\n {\n commit,\n fromFile,\n }: {\n commit: boolean;\n fromFile: string;\n },\n contentTypeIds: string[] = []\n ) => {\n const { currentProject, log, messages } = this;\n\n let fileData = fromFile\n ? (await readFileAsJSON<ContentType[]>(fromFile)) || []\n : [];\n if (typeof fileData === 'string')\n throw new Error(`Import file format must be of type JSON`);\n\n if (!Array.isArray(fileData)) fileData = [fileData];\n\n const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: fromFile ? 'user-input' : undefined,\n });\n\n if (contensis) {\n if (fromFile)\n // Pass each content type to the target repo\n for (const contentType of fileData) {\n // Fix invalid data\n contentType.projectId = currentProject;\n delete contentType.uuid;\n\n const [err, , createStatus] = await contensis.models.targetRepos[\n currentProject\n ].repo.UpsertContentType(false, contentType);\n\n if (err) log.error(err.message, err);\n if (createStatus) {\n log.success(\n messages.contenttypes.created(\n currentProject,\n contentType.id,\n createStatus\n )\n );\n // print the content type to console\n await this.HandleFormattingAndOutput(contentType, () => {});\n }\n }\n else {\n const result = await contensis.simpleMigration.Migrate(\n contentTypeIds,\n []\n );\n await this.HandleFormattingAndOutput(result, log.object);\n }\n }\n };\n\n DiffModels = async (\n {\n fromFile,\n }: {\n fromFile: string;\n },\n modelIds: string[] = []\n ) => {\n const { log } = this;\n\n let fileData = fromFile\n ? (await readFileAsJSON<ContentType[]>(fromFile)) || []\n : [];\n if (typeof fileData === 'string')\n throw new Error(`Import file format must be of type JSON`);\n\n if (!Array.isArray(fileData)) fileData = [fileData];\n\n const contensis = await this.ConnectContensisImport({\n fromFile,\n importDataType: 'models',\n });\n\n if (contensis) {\n const [err, result] = (await to(\n contensis.models.Diff(fileData.length ? fileData : modelIds)\n )) as [Error | null, ContentTypesResult | undefined];\n\n if (err) log.error(err.message, err);\n if (result)\n // print the content type to console\n await this.HandleFormattingAndOutput(result, () => {\n log.success(\n `Queried models ${log.infoText(\n `\"${result.query.modelIds?.join(', ')}\"`\n )}\\n`\n );\n if (result.committed === false) {\n log.raw(log.boldText(`Content types:`));\n if (!result.contentTypes) log.info(`- None returned\\n`);\n else printModelMigrationAnalysis(this, result.contentTypes);\n\n log.raw(log.boldText(`\\nComponents:`));\n if (!result.components) log.info(`- None returned\\n`);\n else printModelMigrationAnalysis(this, result.components);\n }\n });\n }\n };\n\n PrintComponents = async () => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve components list for env\n const components = await contensis.models.components();\n\n if (Array.isArray(components)) {\n log.success(messages.components.list(currentProject));\n\n await this.HandleFormattingAndOutput(components, () => {\n // print the components to console\n for (const component of components) {\n const fieldsLength = component.fields?.length || 0;\n console.log(\n ` - ${component.id} [${fieldsLength} field${\n fieldsLength !== 1 ? 's' : ''\n }]`\n );\n }\n });\n }\n }\n };\n\n PrintComponent = async (componentId: string) => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve content types list for env\n const components = await contensis.models.components();\n\n if (Array.isArray(components)) {\n const component = components.find(\n c => c.id.toLowerCase() === componentId.toLowerCase()\n );\n if (component) {\n log.success(messages.components.get(currentProject, component.id));\n // print the component to console\n await this.HandleFormattingAndOutput(component, log.object);\n } else {\n log.error(messages.components.failedGet(currentProject, componentId));\n }\n }\n }\n };\n\n RemoveComponents = async (componentIds: string[], commit = false) => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: 'user-input', // 'user-input' import type does not require a source cms\n });\n if (contensis) {\n const [err, result] = await contensis.DeleteContentTypes(\n undefined,\n componentIds\n );\n\n if (err) {\n log.error(\n messages.components.failedRemove(\n currentProject,\n componentIds.join(', ')\n ),\n err\n );\n } else {\n log.success(\n messages.components.removed(\n currentProject,\n componentIds.join(', '),\n !contensis.isPreview\n )\n );\n // print the results to console\n await this.HandleFormattingAndOutput(result, log.object);\n }\n }\n };\n\n ImportComponents = async (\n {\n commit,\n fromFile,\n }: {\n commit: boolean;\n fromFile: string;\n },\n componentIds: string[] = []\n ) => {\n const { currentProject, log, messages } = this;\n\n let fileData = fromFile\n ? (await readFileAsJSON<Component[]>(fromFile)) || []\n : [];\n if (typeof fileData === 'string')\n throw new Error(`Import file format must be of type JSON`);\n\n if (!Array.isArray(fileData)) fileData = [fileData];\n\n const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: fromFile ? 'user-input' : undefined,\n });\n\n if (contensis) {\n // Pass each component to the target repo\n if (fromFile)\n for (const component of fileData) {\n // Fix invalid data\n component.projectId = currentProject;\n delete component.uuid;\n\n const [err, , createStatus] = await contensis.models.targetRepos[\n currentProject\n ].repo.UpsertComponent(false, component);\n\n if (err) log.error(err.message, err);\n if (createStatus) {\n log.success(\n messages.components.created(\n currentProject,\n component.id,\n createStatus\n )\n );\n // print the component to console\n await this.HandleFormattingAndOutput(component, () => {});\n }\n }\n else {\n const result = await contensis.simpleMigration.Migrate(\n [],\n componentIds\n );\n await this.HandleFormattingAndOutput(result, log.object);\n }\n }\n };\n\n RemoveEntries = async (commit = false) => {\n const { currentEnv, currentProject, log, messages } = this;\n const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: 'user-input', // 'user-input' import type does not require a source cms\n });\n\n if (contensis) {\n if (contensis.isPreview) {\n console.log(log.successText(` -- PREVIEW -- `));\n } else {\n console.log(log.warningText(` *** COMMITTING DELETE *** `));\n }\n const [err, result] = await contensis.DeleteEntries();\n if (result)\n await this.HandleFormattingAndOutput(result, () => {\n // print the migrateResult to console\n printEntriesMigrateResult(this, result, {\n action: 'delete',\n showAll: true,\n });\n });\n if (\n !err &&\n ((!commit && result.entriesToMigrate[currentProject].totalCount) ||\n (commit && result.migrateResult?.deleted))\n ) {\n log.success(messages.entries.removed(currentEnv, commit));\n if (!commit) {\n log.raw(``);\n log.help(messages.entries.commitTip());\n }\n } else {\n log.error(messages.entries.failedRemove(currentEnv), err);\n if (!result?.entriesToMigrate?.[currentProject]?.totalCount)\n log.help(messages.entries.notFound(currentEnv));\n }\n }\n };\n\n GetEntries = async ({\n withDependents = false,\n }: {\n withDependents?: boolean;\n } = {}) => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n log.line();\n const entries = await contensis.GetEntries({ withDependents });\n // TODO: iterate entries and add some extra details to help\n // with importing later\n // Add a full sys.uri to asset entries\n // Add sys.metadata.exportCms\n // Add sys.metadata.exportProjectId\n const nodes = contensis.content.source.nodes.raw;\n const combinedOutput = [...entries, ...nodes];\n\n await this.HandleFormattingAndOutput(combinedOutput, () => {\n // print the entries to console\n logEntitiesTable({\n entries,\n projectId: currentProject,\n fields: contensis.payload.query?.fields,\n });\n if (nodes.length)\n logEntitiesTable({\n nodes,\n projectId: currentProject,\n fields: contensis.payload.query?.fields,\n });\n });\n } else {\n log.warning(messages.models.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n ImportEntries = async ({\n commit,\n fromFile,\n logOutput,\n saveEntries,\n }: {\n commit: boolean;\n fromFile: string;\n logOutput: string;\n saveEntries: boolean;\n }) => {\n const { currentEnv, currentProject, log, messages } = this;\n\n const contensis = await this.ConnectContensisImport({\n commit,\n fromFile,\n importDataType: 'entries',\n });\n\n if (contensis) {\n log.line();\n if (contensis.isPreview) {\n log.success(messages.migrate.preview());\n } else {\n log.warning(messages.migrate.commit());\n }\n\n const [err, result] = await contensis.MigrateEntries();\n\n if (err) logError(err);\n else {\n const { entries, nodes } = contensis.content.targets[currentProject];\n\n const output = saveEntries\n ? // include entries and dependent nodes when saving entries\n [\n entries.migrate?.map(me => me.toJSON()) || [],\n nodes.migrateNodes.map(mn => mn.node),\n ].flat()\n : result;\n await this.HandleFormattingAndOutput(output, () => {\n // print the migrateResult to console\n printEntriesMigrateResult(this, result, {\n showAll: logOutput === 'all',\n showDiff: logOutput === 'all' || logOutput === 'changes',\n showChanged: logOutput === 'changes',\n });\n if (['all', 'changes'].includes(logOutput))\n printNodeTreeOutput(\n this,\n {\n ...nodes.rootAncestor,\n status: 'no change',\n children: nodes.migrateNodes as any,\n },\n logOutput\n );\n });\n }\n if (\n !err &&\n !result.errors?.length &&\n ((!commit && result.entriesToMigrate[currentProject].totalCount) ||\n (commit &&\n (result.migrateResult?.created || result.migrateResult?.updated)))\n ) {\n log.success(\n messages.entries.imported(\n currentEnv,\n commit,\n commit\n ? (result.migrateResult?.created || 0) +\n (result.migrateResult?.updated || 0)\n : result.entriesToMigrate[currentProject].totalCount,\n commit\n ? (result.nodesResult?.created || 0) +\n (result.nodesResult?.updated || 0)\n : (result.nodesToMigrate?.[currentProject]\n .totalCount as number) || 0\n )\n );\n if (!commit) {\n log.raw(``);\n log.help(messages.entries.commitTip());\n }\n } else {\n log.error(messages.entries.failedImport(currentEnv), err);\n if (!result?.entriesToMigrate?.[currentProject]?.totalCount)\n log.help(messages.entries.notFound(currentEnv));\n }\n } else {\n log.warning(messages.models.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n CopyEntryField = async ({\n commit,\n fromFile,\n logOutput,\n saveEntries,\n }: {\n commit: boolean;\n fromFile: string;\n logOutput: string;\n saveEntries: boolean;\n }) => {\n const { currentEnv, currentProject, log, messages } = this;\n\n const contensis = await this.ConnectContensisImport({\n commit,\n fromFile,\n importDataType: 'entries',\n });\n\n if (contensis) {\n log.line();\n if (contensis.isPreview) {\n log.success(messages.migrate.preview());\n } else {\n log.warning(messages.migrate.commit());\n }\n\n const [err, result] = await to(\n contensis.content.copy.MigrateFieldContent()\n );\n\n if (err) logError(err);\n if (result) {\n const output = saveEntries\n ? contensis.content.copy.targets[currentProject].entries.migrate?.map(\n me => me.toJSON()\n )\n : result;\n await this.HandleFormattingAndOutput(output, () => {\n // print the migrateResult to console\n printEntriesMigrateResult(this, result, {\n showAll: logOutput === 'all',\n showDiff: logOutput === 'all' || logOutput === 'changes',\n showChanged: logOutput === 'changes',\n });\n });\n }\n\n if (\n result &&\n !err &&\n !result.errors?.length &&\n ((!commit && result.entriesToMigrate[currentProject].totalCount) ||\n (commit &&\n (result.migrateResult?.created || result.migrateResult?.updated)))\n ) {\n log.success(\n messages.entries.imported(\n currentEnv,\n commit,\n commit\n ? (result.migrateResult?.created || 0) +\n (result.migrateResult?.updated || 0)\n : result.entriesToMigrate[currentProject].totalCount\n )\n );\n if (!commit) {\n log.raw(``);\n log.help(messages.entries.commitTip());\n }\n } else {\n log.error(messages.entries.failedImport(currentEnv), err);\n if (!result?.entriesToMigrate?.[currentProject]?.totalCount)\n log.help(messages.entries.notFound(currentEnv));\n }\n } else {\n log.warning(messages.models.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n GetNodes = async (rootPath: string, depth = 0) => {\n const { currentProject, log, messages } = this;\n const contensis = await this.ConnectContensis();\n\n if (contensis) {\n log.line();\n const [err, nodes] = await to(contensis.nodes.GetNodes(rootPath, depth));\n if (err) {\n log.error(messages.nodes.failedGet(currentProject), err);\n return;\n }\n const root = contensis.nodes.sourceRepo.nodes.tree;\n\n log.success(messages.nodes.get(currentProject, rootPath, depth));\n\n await this.HandleFormattingAndOutput(nodes, () => {\n // print the nodes to console\n log.object({ ...root, children: undefined, language: undefined });\n printNodeTreeOutput(this, root);\n });\n } else {\n log.warning(messages.models.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n ImportNodes = async ({\n commit,\n fromFile,\n logOutput,\n logLimit,\n }: {\n commit: boolean;\n fromFile: string;\n logOutput: string;\n logLimit: number;\n }) => {\n const { currentEnv, currentProject, log, messages } = this;\n\n const contensis = await this.ConnectContensisImport({\n commit,\n fromFile,\n importDataType: 'nodes',\n });\n\n if (contensis) {\n log.line();\n if (contensis.isPreview) {\n log.success(messages.migrate.preview());\n } else {\n log.warning(messages.migrate.commit());\n }\n\n const [err, result] = await contensis.MigrateNodes();\n\n if (err) log.raw(``);\n else\n await this.HandleFormattingAndOutput(result, () => {\n // print the migrateResult to console\n const migrateTree =\n contensis.nodes.targetRepos[currentProject].nodes\n .migrateNodesTreeView;\n printNodeTreeOutput(this, migrateTree, logOutput, logLimit);\n printNodesMigrateResult(this, result, {\n showAll: logOutput === 'all',\n showChanged: logOutput === 'changes',\n });\n });\n\n const nodesMigrateCount =\n result?.nodesToMigrate?.[currentProject].totalCount;\n const nodesCreated = result?.nodesResult?.['created'] || 0;\n const nodesUpdated = result?.nodesResult?.['updated'] || 0;\n const nodesErrored = result?.nodesResult?.['errors'] || 0;\n const noChanges =\n result?.nodesToMigrate?.[currentProject]['no change'] &&\n nodesMigrateCount === 0;\n\n if (\n !err &&\n (!result.errors?.length || this.contensisOpts.ignoreErrors) &&\n ((!commit && nodesMigrateCount) ||\n (commit && (nodesCreated || nodesUpdated || result.errors?.length)))\n ) {\n let totalCount: number;\n if (commit) {\n const created = typeof nodesCreated === 'number' ? nodesCreated : 0;\n const updated = typeof nodesUpdated === 'number' ? nodesUpdated : 0;\n\n totalCount = created + updated;\n } else {\n totalCount =\n typeof nodesMigrateCount === 'number' ? nodesMigrateCount : 0;\n }\n\n log.success(messages.nodes.imported(currentEnv, commit, totalCount));\n log.raw(``);\n if (!commit) {\n log.help(messages.nodes.commitTip());\n }\n } else {\n if (noChanges && !err && !nodesErrored) {\n log.help(messages.nodes.noChange(currentEnv));\n } else {\n log.error(messages.nodes.failedImport(currentEnv), err);\n if (!nodesMigrateCount) log.help(messages.nodes.notFound(currentEnv));\n }\n }\n } else {\n log.warning(messages.models.noList(currentProject));\n log.help(messages.connect.tip());\n }\n };\n\n RemoveNodes = async (commit = false) => {\n const { currentEnv, currentProject, log, messages } = this;\n const contensis = await this.ConnectContensisImport({\n commit,\n importDataType: 'user-input', // 'user-input' import type does not require a source cms\n });\n\n if (contensis) {\n if (contensis.isPreview) {\n console.log(log.successText(` -- PREVIEW -- `));\n } else {\n console.log(log.warningText(` *** COMMITTING DELETE *** `));\n }\n const [err, result] = await contensis.DeleteNodes();\n if (result) {\n await this.HandleFormattingAndOutput(result, () => {\n // print the migrateResult to console\n printNodeTreeOutput(\n this,\n contensis.nodes.targetRepos[currentProject].nodes\n .migrateNodesTreeView\n );\n // printNodesMigrateResult(this, result, {\n // action: 'delete',\n // showAll: true,\n // });\n });\n }\n if (\n !err &&\n ((!commit && result.nodesToMigrate[currentProject].totalCount) ||\n (commit && result.nodesResult?.deleted))\n ) {\n log.success(\n messages.nodes.removed(currentEnv, commit, contensis.nodes.rootPath)\n );\n log.raw(``);\n if (!commit) {\n log.help(messages.nodes.commitTip());\n }\n } else {\n log.error(messages.nodes.failedRemove(currentEnv), err);\n if (!result?.nodesToMigrate?.[currentProject]?.totalCount)\n log.help(messages.nodes.notFound(currentEnv));\n }\n }\n };\n\n PrintWebhookSubscriptions = async (subscriptionIdsOrNames?: string[]) => {\n const { currentEnv, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve webhooks list for env\n const [webhooksErr, webhooks] =\n await contensis.subscriptions.webhooks.GetSubscriptions();\n\n const filteredResults = subscriptionIdsOrNames?.length\n ? webhooks?.filter(\n w =>\n subscriptionIdsOrNames?.some(idname =>\n w.name?.toLowerCase().includes(idname.toLowerCase())\n ) ||\n subscriptionIdsOrNames?.some(\n id => id.toLowerCase() === w.id.toLowerCase()\n )\n )\n : webhooks;\n\n if (Array.isArray(filteredResults)) {\n log.success(messages.webhooks.list(currentEnv));\n if (!webhooks?.length) log.warning(messages.webhooks.noneExist());\n else {\n await this.HandleFormattingAndOutput(filteredResults, () => {\n // print the keys to console\n for (const {\n id,\n description,\n method,\n name,\n version,\n url,\n enabled,\n topics,\n templates,\n headers,\n } of filteredResults) {\n console.log(\n log.infoText(\n ` ${chalk.bold.white`- ${name}`} ${id} [${(\n version.modified || version.created\n )\n .toString()\n .substring(0, 10)} ${\n version.modifiedBy || version.createdBy\n }]`\n )\n );\n if (description) console.log(log.infoText` ${description}`);\n console.log(` ${log.infoText`[${method}]`} ${url}`);\n if (headers && Object.keys(headers).length) {\n console.log(` ${log.infoText`headers`}:`);\n\n for (const [key, { value, secret }] of Object.entries(headers))\n console.log(\n ` ${chalk.bold.gray(key)}: ${secret ? '\uD83E\uDD10' : value}`\n );\n }\n if (topics?.length)\n if (topics?.length === 1)\n console.log(\n ` ${log.infoText`topics`}: ${topics\n .map(t => JSON.stringify(t))\n .join(' ')\n .replaceAll('\"', '')\n .replaceAll(',', ' ')\n .replaceAll('{', '')\n .replaceAll('}', '')}`\n );\n else {\n console.log(` ${log.infoText`topics`}:`);\n log.objectRecurse(topics, 1, ' ');\n }\n if (templates && Object.keys(templates).length)\n console.log(\n ` ${log.infoText`templates`}: ${Object.keys(\n templates\n ).join(' ')}`\n );\n if (enabled === false)\n console.log(` ${log.infoText`enabled`}: ${enabled}`);\n }\n });\n }\n }\n\n if (webhooksErr) {\n log.error(messages.webhooks.noList(currentEnv));\n log.error(jsonFormatter(webhooksErr));\n }\n }\n };\n\n PrintBlocks = async () => {\n const { currentEnv, env, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve blocks list for env\n const [err, blocks] = await contensis.blocks.GetBlocks();\n\n if (Array.isArray(blocks) && blocks.length) {\n await this.HandleFormattingAndOutput(blocks, () => {\n // print the blocks to console\n log.success(messages.blocks.list(currentEnv, env.currentProject));\n for (const {\n id,\n description,\n branches,\n liveVersion,\n madeLive,\n versionsSinceLive,\n } of blocks) {\n console.log(\n ` - ${id}${description ? ` (${description})` : ''}${\n madeLive\n ? ` [${madeLive.toString().substring(0, 10)} v${liveVersion}]`\n : ''\n }${\n versionsSinceLive\n ? log.warningText(` +${versionsSinceLive}`)\n : ''\n }`\n );\n for (const branch of branches)\n console.log(\n log.infoText(` [${branch.id}]: ${branch.status}`)\n );\n }\n });\n\n return blocks;\n }\n\n if (err) {\n log.error(messages.blocks.noList(currentEnv, env.currentProject));\n // log.error(jsonFormatter(err));\n }\n }\n };\n\n PrintBlockVersions = async (\n blockId: string,\n branch: string,\n version: string\n ) => {\n const { currentEnv, env, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve block version\n const [err, blocks] = await contensis.blocks.GetBlockVersions(\n blockId,\n branch,\n version\n );\n\n if (err || blocks?.length === 0) {\n log.warning(\n messages.blocks.noGet(\n blockId,\n branch,\n version,\n currentEnv,\n env.currentProject\n )\n );\n log.help(messages.blocks.noGetTip());\n // if (err) log.error(jsonFormatter(err));\n } else if (blocks) {\n await this.HandleFormattingAndOutput(blocks, () => {\n // print the version detail to console\n log.success(\n messages.blocks.get(\n blockId,\n branch,\n version,\n currentEnv,\n env.currentProject\n )\n );\n for (const block of blocks)\n printBlockVersion(\n this,\n block,\n !version\n ? {\n showImage: false,\n showSource: true,\n showStaticPaths: false,\n showStatus: false,\n }\n : undefined\n );\n });\n\n return blocks;\n }\n }\n };\n\n PushBlock = async (block: PushBlockParams) => {\n const { currentEnv, env, log, messages } = this;\n\n // Output request to console\n log.info(\n messages.blocks.tryPush(\n block.id,\n block.source.branch,\n currentEnv,\n env.currentProject\n )\n );\n console.log(jsonFormatter(block));\n\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Push new block version\n const [err, blockVersion] =\n await contensis.blocks.PushBlockVersion(block);\n if (!err) {\n log.success(\n messages.blocks.pushed(\n block.id,\n block.source.branch,\n currentEnv,\n env.currentProject\n )\n );\n }\n if (blockVersion) {\n await this.HandleFormattingAndOutput(blockVersion, () => {\n // print the version detail to console\n printBlockVersion(this, blockVersion);\n });\n }\n if (err)\n throw new Error(\n messages.blocks.failedPush(block.id, currentEnv, env.currentProject)\n );\n } else {\n throw new Error(\n messages.blocks.failedPush(block.id, currentEnv, env.currentProject)\n );\n }\n };\n\n GetLatestBlockVersion = async (\n blockId: string,\n branch = 'default'\n ): Promise<[AppError | null, string | undefined]> => {\n const { contensis, log, messages } = this;\n\n // Look for block versions pushed to \"default\" branch\n const [getErr, blockVersions] =\n (await contensis?.blocks.GetBlockVersions(blockId, branch)) || [];\n\n if (getErr) {\n return [getErr, undefined];\n }\n\n // Parse versionNo from response\n let blockVersionNo = 'latest';\n // The first blockVersion should be the latest one\n try {\n blockVersionNo = `${blockVersions?.[0]?.version.versionNo}`;\n\n if (!Number.isNaN(blockVersionNo) && Number(blockVersionNo) > 0)\n // Is a valid versionNo\n return [null, blockVersionNo];\n else throw new Error(`'${blockVersionNo}' is not a valid version number`);\n } catch (parseVersionEx: any) {\n // Catch parsing errors in case of an unexpected response\n log.info(\n `Request for blockId: ${blockId}, branch: ${branch}, version: latest`\n );\n log.info(\n `Get block versions response was: ${tryStringify(blockVersions)}`\n );\n log.error(messages.blocks.failedParsingVersion());\n return [parseVersionEx, undefined];\n }\n };\n\n ExecuteBlockAction = async (\n action: BlockActionType,\n blockId: string,\n version = 'latest'\n ) => {\n const { currentEnv, env, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n let actionOnBlockVersion = version;\n\n // If action is release and version is latest, find the latest version number\n if (action === 'release' && version === 'latest') {\n const [getErr, blockVersion] =\n await this.GetLatestBlockVersion(blockId);\n\n if (getErr) {\n // Log error getting latest block version no\n // and throw the error message so the process can exit with a failure\n throw new Error(\n `${messages.blocks.noList(\n currentEnv,\n env.currentProject\n )} (${getErr})`\n );\n } else if (blockVersion) {\n actionOnBlockVersion = blockVersion;\n }\n }\n\n // Execute block action\n const [err, blockVersion] = await contensis.blocks.BlockAction(\n blockId,\n action,\n actionOnBlockVersion\n );\n\n if (blockVersion) {\n await this.HandleFormattingAndOutput(blockVersion, () => {\n // print the version detail to console\n log.success(\n messages.blocks.actionComplete(\n action,\n blockId,\n currentEnv,\n env.currentProject\n )\n );\n printBlockVersion(this, blockVersion);\n });\n }\n\n if (err) {\n log.error(jsonFormatter(err));\n throw new Error(\n messages.blocks.actionFailed(\n action,\n blockId,\n currentEnv,\n env.currentProject\n )\n );\n }\n }\n };\n\n PrintBlockLogs = async (\n blockId: string,\n branch: string,\n version: string,\n dataCenter: 'hq' | 'manchester' | 'london' | undefined,\n follow = false\n ) => {\n const { currentEnv, env, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve block logs\n log.success(\n messages.blocks.getLogs(blockId, branch, currentEnv, env.currentProject)\n );\n\n const [err, blockLogs] = await contensis.blocks.GetBlockLogs({\n blockId,\n branchId: branch,\n version,\n dataCenter,\n });\n\n if (err) {\n log.error(\n messages.blocks.failedGetLogs(blockId, currentEnv, env.currentProject)\n );\n log.error(jsonFormatter(err));\n } else if (blockLogs) {\n const removeTrailingNewline = (logs: string) =>\n logs.endsWith('\\n') ? logs.slice(0, logs.length - 1) : logs;\n const renderLogs = removeTrailingNewline(blockLogs);\n\n await this.HandleFormattingAndOutput(renderLogs, () => {\n // print the logs to console\n console.log(\n ` - ${blockId} ${branch} ${\n Number(version) ? `v${version}` : version\n } ${dataCenter ? `[${dataCenter}]` : ''}`\n );\n log.line();\n console.log(log.infoText(renderLogs));\n });\n\n // Code for the `--follow` options\n let following = follow;\n let alreadyShown = blockLogs;\n let needsNewLine = false;\n let counter = 0;\n\n // remove existing listeners and add them back afterwards\n const listeners = process.listeners('SIGINT');\n\n process.removeAllListeners('SIGINT');\n // add listener to update following to false and break out\n process.on('SIGINT', () => {\n Logger.warning(\n messages.blocks.stopFollow(blockId, currentEnv, env.currentProject)\n );\n stopFollowing();\n });\n\n const delay = promiseDelay(5 * 1000, null);\n const stopFollowing = () => {\n following = false;\n delay.cancel();\n\n // Add back the listeners we removed previously\n process.removeAllListeners('SIGINT');\n for (const listener of listeners)\n process.addListener('SIGINT', listener);\n };\n\n while (following) {\n if (counter++ > 300) {\n Logger.warning(\n messages.blocks.timeoutFollow(\n blockId,\n currentEnv,\n env.currentProject\n )\n );\n stopFollowing();\n }\n\n // wait n. seconds then poll for logs again\n await delay.wait();\n\n const [lastErr, lastLogs] = following\n ? await contensis.blocks.GetBlockLogs({\n blockId,\n branchId: branch,\n version,\n dataCenter,\n })\n : [null, null];\n\n if (lastLogs) {\n // Find the difference and output it next\n const difference = diffLogStrings(lastLogs, alreadyShown);\n if (difference) {\n if (needsNewLine) {\n console.log('');\n }\n // Take the trailing newline off of the logged output to\n // avoid blank lines inbetween logs fetched sequentially\n const render = removeTrailingNewline(difference);\n console.log(log.infoText(render));\n\n // Add what we've just rendered to already shown \"cache\"\n alreadyShown += `${render}\\n`;\n needsNewLine = false;\n } else {\n // If no difference output a dot\n process.stdout.write('.');\n needsNewLine = true;\n }\n } else if (lastErr) {\n // If error output an x\n process.stdout.write('x');\n needsNewLine = true;\n }\n }\n }\n }\n };\n\n PrintProxies = async (proxyId?: string) => {\n const { currentEnv, env, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve proxies list for env\n const [err, proxies] = await (contensis.proxies.GetProxies as any)(\n proxyId\n ); // TODO: resolve any cast;\n\n if (Array.isArray(proxies)) {\n await this.HandleFormattingAndOutput(proxies, () => {\n // print the proxies to console\n log.success(messages.proxies.list(currentEnv, env.currentProject));\n for (const { id, name, description, endpoints, version } of proxies) {\n console.log(\n ` - ${name} [${\n version.versionNo\n }] ${id} ${log.infoText`${description}`}`\n );\n for (const [language, endpoint] of Object.entries(\n endpoints as { [k: string]: any }\n )) // TODO: resolve any cast\n console.log(\n ` - ${log.infoText`language: ${language}\n server: ${endpoint.server}\n headers.host: ${endpoint.headers.host}\n ssl: ${endpoint.ssl}`}`\n );\n }\n });\n }\n\n if (err) {\n log.error(messages.proxies.noList(currentEnv, env.currentProject));\n log.error(jsonFormatter(err));\n }\n }\n };\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n PrintRenderers = async (rendererId?: string) => {\n const { currentEnv, env, log, messages } = this;\n const contensis = await this.ConnectContensis();\n if (contensis) {\n // Retrieve renderers list for env\n const [err, renderers] = await contensis.renderers.GetRenderers();\n\n if (Array.isArray(renderers)) {\n await this.HandleFormattingAndOutput(renderers, () => {\n // print the renderers to console\n log.success(messages.renderers.list(currentEnv, env.currentProject));\n for (const {\n id,\n description,\n assignedContentTypes,\n rules,\n version,\n } of renderers) {\n console.log(\n ` - ${id} [${version.versionNo}] ${log.infoText`${description}`}`\n );\n if (assignedContentTypes?.length)\n console.log(\n log.infoText` assignedContentTypes: ${assignedContentTypes.join(\n ', '\n )}`\n );\n for (const rule of rules)\n if (rule.return)\n console.log(\n log.infoText` ${\n rule.return.endpointId ? 'endpointId' : 'blockId'\n }: ${rule.return.endpointId || rule.return.blockId}`\n );\n }\n });\n return renderers;\n }\n\n if (err) {\n log.error(messages.renderers.noList(currentEnv, env.currentProject));\n log.error(jsonFormatter(err));\n }\n }\n };\n\n HandleFormattingAndOutput = async <T>(obj: T, logFn: (obj: T) => void) => {\n const { format, log, messages, output } = this;\n const fields = this.contensis?.payload.query?.fields;\n\n if (!format) {\n // print the object to console\n logFn(obj);\n } else if (format === 'csv') {\n log.raw('');\n log.raw(log.infoText(await csvFormatter(limitFields(obj, fields))));\n } else if (format === 'html') {\n log.raw('');\n log.raw(log.infoText(htmlFormatter(limitFields(obj, fields))));\n } else if (format === 'xml') {\n log.raw('');\n log.raw(log.infoText(xmlFormatter(limitFields(obj, fields))));\n } else if (format === 'json') {\n log.raw('');\n log.raw(log.infoText(jsonFormatter(obj, fields)));\n }\n log.raw('');\n\n if (output) {\n let writeString = '';\n const isText = !tryParse(obj) && typeof obj === 'string';\n if (format === 'csv') {\n writeString = await csvFormatter(limitFields(obj, fields));\n } else if (format === 'html') {\n writeString = htmlFormatter(limitFields(obj, fields));\n } else if (format === 'xml') {\n writeString = xmlFormatter(limitFields(obj, fields));\n } else\n writeString = isText ? (obj as string) : jsonFormatter(obj, fields);\n // write output to file\n if (writeString) {\n fs.writeFileSync(output, writeString);\n log.success(messages.app.fileOutput(isText ? 'text' : format, output));\n } else {\n log.info(messages.app.noFileOutput());\n }\n }\n };\n}\n\nexport const cliCommand = (\n commandArgs: string[],\n outputOpts?: OutputOptionsConstructorArg,\n contensisOpts: Partial<MigrateRequest> = {}\n) => {\n return new ContensisCli(['', '', ...commandArgs], outputOpts, contensisOpts);\n};\nexport default ContensisCli;\n"],
5
+ "mappings": "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",
6
6
  "names": ["SessionCacheProvider", "path", "CredentialProvider", "to", "fetch", "inquirer", "ContensisAuthService", "chalk", "clone", "components", "contentTypes", "url", "blockVersion", "fs"]
7
7
  }
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+ var html_formatter_exports = {};
20
+ __export(html_formatter_exports, {
21
+ htmlFormatter: () => htmlFormatter
22
+ });
23
+ module.exports = __toCommonJS(html_formatter_exports);
24
+ var import_json = require("./json.formatter");
25
+ const htmlFormatter = (entries, isDoc = true) => {
26
+ const flatEntries = [];
27
+ if (Array.isArray(entries))
28
+ for (const entry of entries) {
29
+ flatEntries.push((0, import_json.flattenObject)(entry));
30
+ }
31
+ else flatEntries.push((0, import_json.flattenObject)(entries));
32
+ const columns = new Set(flatEntries.map((e) => Object.keys(e)).flat());
33
+ let table = `<table id="contensis-cli-table"><thead><tr>`;
34
+ for (const column of columns) {
35
+ table += `<td>${column}</td>`;
36
+ }
37
+ table += `</tr></thead><tbody>`;
38
+ for (const row of flatEntries) {
39
+ table += `<tr>`;
40
+ for (const column of columns) {
41
+ const val = row[column];
42
+ table += `<td>${typeof val === "undefined" ? "" : val}</td>`;
43
+ }
44
+ table += `</tr>`;
45
+ }
46
+ table += `</tbody></table>`;
47
+ if (isDoc)
48
+ table = `<html><head>${headTag()}</head><body>${table}${scriptTag()}</body></html>`;
49
+ return table;
50
+ };
51
+ const headTag = () => {
52
+ return `<link rel="stylesheet" href="https://cdn.datatables.net/2.1.8/css/dataTables.dataTables.css" />
53
+ <script
54
+ src="https://code.jquery.com/jquery-3.7.1.slim.min.js"
55
+ integrity="sha256-kmHvs0B+OpCW5GVHUNjv9rOmY0IvSIRcf7zGUDTDQM8="
56
+ crossorigin="anonymous"></script>
57
+ <script src="https://cdn.datatables.net/2.1.8/js/dataTables.js"></script>`;
58
+ };
59
+ const scriptTag = () => {
60
+ return `<script>
61
+ let table = new DataTable('#contensis-cli-table', {
62
+ pageLength: 50
63
+ });
64
+ </script>`;
65
+ };
66
+ // Annotate the CommonJS export names for ESM import in node:
67
+ 0 && (module.exports = {
68
+ htmlFormatter
69
+ });
70
+ //# sourceMappingURL=html.formatter.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/util/html.formatter.ts"],
4
+ "sourcesContent": ["import { flattenObject } from './json.formatter';\n\nexport const htmlFormatter = <T>(entries: T | T[], isDoc = true) => {\n // Flatten the passed in object\n const flatEntries = [] as any[];\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 csv = stringify(flatEntries, { header: true });\n // Create an exhaustive list of columns from the entries array\n const columns = new Set<string>(flatEntries.map(e => Object.keys(e)).flat());\n\n let table = `<table id=\"contensis-cli-table\"><thead><tr>`;\n for (const column of columns) {\n table += `<td>${column}</td>`;\n }\n table += `</tr></thead><tbody>`;\n for (const row of flatEntries) {\n table += `<tr>`;\n for (const column of columns) {\n const val = row[column];\n table += `<td>${typeof val === 'undefined' ? '' : val}</td>`;\n }\n table += `</tr>`;\n }\n table += `</tbody></table>`;\n\n if (isDoc)\n table = `<html><head>${headTag()}</head><body>${table}${scriptTag()}</body></html>`;\n return table;\n};\n\nconst headTag = () => {\n return `<link rel=\"stylesheet\" href=\"https://cdn.datatables.net/2.1.8/css/dataTables.dataTables.css\" />\n<script\n src=\"https://code.jquery.com/jquery-3.7.1.slim.min.js\"\n integrity=\"sha256-kmHvs0B+OpCW5GVHUNjv9rOmY0IvSIRcf7zGUDTDQM8=\"\n crossorigin=\"anonymous\"></script>\n<script src=\"https://cdn.datatables.net/2.1.8/js/dataTables.js\"></script>`;\n};\n\nconst scriptTag = () => {\n return `<script>\nlet table = new DataTable('#contensis-cli-table', {\n pageLength: 50\n});\n</script>`;\n};\n"],
5
+ "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,kBAA8B;AAEvB,MAAM,gBAAgB,CAAI,SAAkB,QAAQ,SAAS;AAElE,QAAM,cAAc,CAAC;AACrB,MAAI,MAAM,QAAQ,OAAO;AACvB,eAAW,SAAS,SAAS;AAC3B,kBAAY,SAAK,2BAAc,KAAK,CAAC;AAAA,IACvC;AAAA,MACG,aAAY,SAAK,2BAAc,OAAO,CAAC;AAK5C,QAAM,UAAU,IAAI,IAAY,YAAY,IAAI,OAAK,OAAO,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;AAE3E,MAAI,QAAQ;AACZ,aAAW,UAAU,SAAS;AAC5B,aAAS,OAAO,MAAM;AAAA,EACxB;AACA,WAAS;AACT,aAAW,OAAO,aAAa;AAC7B,aAAS;AACT,eAAW,UAAU,SAAS;AAC5B,YAAM,MAAM,IAAI,MAAM;AACtB,eAAS,OAAO,OAAO,QAAQ,cAAc,KAAK,GAAG;AAAA,IACvD;AACA,aAAS;AAAA,EACX;AACA,WAAS;AAET,MAAI;AACF,YAAQ,eAAe,QAAQ,CAAC,gBAAgB,KAAK,GAAG,UAAU,CAAC;AACrE,SAAO;AACT;AAEA,MAAM,UAAU,MAAM;AACpB,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAMT;AAEA,MAAM,YAAY,MAAM;AACtB,SAAO;AAAA;AAAA;AAAA;AAAA;AAKT;",
6
+ "names": []
7
+ }
package/dist/version.js CHANGED
@@ -21,7 +21,7 @@ __export(version_exports, {
21
21
  LIB_VERSION: () => LIB_VERSION
22
22
  });
23
23
  module.exports = __toCommonJS(version_exports);
24
- const LIB_VERSION = "1.3.1-beta.5";
24
+ const LIB_VERSION = "1.3.1-beta.6";
25
25
  // Annotate the CommonJS export names for ESM import in node:
26
26
  0 && (module.exports = {
27
27
  LIB_VERSION
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/version.ts"],
4
- "sourcesContent": ["export const LIB_VERSION = \"1.3.1-beta.5\";\n"],
4
+ "sourcesContent": ["export const LIB_VERSION = \"1.3.1-beta.6\";\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,MAAM,cAAc;",
6
6
  "names": []
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "contensis-cli",
3
- "version": "1.3.1-beta.5",
3
+ "version": "1.3.1-beta.6",
4
4
  "description": "A fully featured Contensis command line interface with a shell UI provides simple and intuitive ways to manage or profile your content in any NodeJS terminal.",
5
5
  "repository": "https://github.com/contensis/cli",
6
6
  "homepage": "https://github.com/contensis/cli/tree/main/packages/contensis-cli#readme",
@@ -60,8 +60,8 @@ const output = new Option(
60
60
 
61
61
  const format = new Option(
62
62
  '-f --format <format>',
63
- 'format output as csv, json, xml or table (default)'
64
- ).choices(['csv', 'json', 'xml', 'table']);
63
+ 'format output as csv, json, html, xml or default'
64
+ ).choices(['csv', 'json', 'html', 'xml', 'table']);
65
65
 
66
66
  /* Connect options */
67
67
  const alias = new Option(
@@ -183,7 +183,7 @@ export const noCache = new Option(
183
183
 
184
184
  export const noPublish = new Option(
185
185
  '--no-publish',
186
- 'don\'t publish created or updated entries'
186
+ "don't publish created or updated entries"
187
187
  );
188
188
 
189
189
  export const addConnectOptions = (program: Command) =>
@@ -9,7 +9,7 @@ export type CliUrls =
9
9
  }
10
10
  | undefined;
11
11
 
12
- export type OutputFormat = 'json' | 'csv' | 'xml';
12
+ export type OutputFormat = 'json' | 'csv' | 'html' | 'xml';
13
13
 
14
14
  export type OutputOptions = {
15
15
  format?: OutputFormat;
@@ -50,6 +50,7 @@ import {
50
50
  printNodesMigrateResult,
51
51
  } from '~/util/console.printer';
52
52
  import { csvFormatter } from '~/util/csv.formatter';
53
+ import { htmlFormatter } from '~/util/html.formatter';
53
54
  import { jsonFormatter, limitFields } from '~/util/json.formatter';
54
55
  import { xmlFormatter } from '~/util/xml.formatter';
55
56
  import { isDebug } from '~/util/debug';
@@ -2764,6 +2765,9 @@ class ContensisCli {
2764
2765
  } else if (format === 'csv') {
2765
2766
  log.raw('');
2766
2767
  log.raw(log.infoText(await csvFormatter(limitFields(obj, fields))));
2768
+ } else if (format === 'html') {
2769
+ log.raw('');
2770
+ log.raw(log.infoText(htmlFormatter(limitFields(obj, fields))));
2767
2771
  } else if (format === 'xml') {
2768
2772
  log.raw('');
2769
2773
  log.raw(log.infoText(xmlFormatter(limitFields(obj, fields))));
@@ -2778,6 +2782,8 @@ class ContensisCli {
2778
2782
  const isText = !tryParse(obj) && typeof obj === 'string';
2779
2783
  if (format === 'csv') {
2780
2784
  writeString = await csvFormatter(limitFields(obj, fields));
2785
+ } else if (format === 'html') {
2786
+ writeString = htmlFormatter(limitFields(obj, fields));
2781
2787
  } else if (format === 'xml') {
2782
2788
  writeString = xmlFormatter(limitFields(obj, fields));
2783
2789
  } else
@@ -0,0 +1,52 @@
1
+ import { flattenObject } from './json.formatter';
2
+
3
+ export const htmlFormatter = <T>(entries: T | T[], isDoc = true) => {
4
+ // Flatten the passed in object
5
+ const flatEntries = [] as any[];
6
+ if (Array.isArray(entries))
7
+ for (const entry of entries) {
8
+ flatEntries.push(flattenObject(entry));
9
+ }
10
+ else flatEntries.push(flattenObject(entries));
11
+
12
+ // Parse the flattened object to csv
13
+ // const csv = stringify(flatEntries, { header: true });
14
+ // Create an exhaustive list of columns from the entries array
15
+ const columns = new Set<string>(flatEntries.map(e => Object.keys(e)).flat());
16
+
17
+ let table = `<table id="contensis-cli-table"><thead><tr>`;
18
+ for (const column of columns) {
19
+ table += `<td>${column}</td>`;
20
+ }
21
+ table += `</tr></thead><tbody>`;
22
+ for (const row of flatEntries) {
23
+ table += `<tr>`;
24
+ for (const column of columns) {
25
+ const val = row[column];
26
+ table += `<td>${typeof val === 'undefined' ? '' : val}</td>`;
27
+ }
28
+ table += `</tr>`;
29
+ }
30
+ table += `</tbody></table>`;
31
+
32
+ if (isDoc)
33
+ table = `<html><head>${headTag()}</head><body>${table}${scriptTag()}</body></html>`;
34
+ return table;
35
+ };
36
+
37
+ const headTag = () => {
38
+ return `<link rel="stylesheet" href="https://cdn.datatables.net/2.1.8/css/dataTables.dataTables.css" />
39
+ <script
40
+ src="https://code.jquery.com/jquery-3.7.1.slim.min.js"
41
+ integrity="sha256-kmHvs0B+OpCW5GVHUNjv9rOmY0IvSIRcf7zGUDTDQM8="
42
+ crossorigin="anonymous"></script>
43
+ <script src="https://cdn.datatables.net/2.1.8/js/dataTables.js"></script>`;
44
+ };
45
+
46
+ const scriptTag = () => {
47
+ return `<script>
48
+ let table = new DataTable('#contensis-cli-table', {
49
+ pageLength: 50
50
+ });
51
+ </script>`;
52
+ };
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const LIB_VERSION = "1.3.1-beta.5";
1
+ export const LIB_VERSION = "1.3.1-beta.6";