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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/shell.js CHANGED
@@ -217,7 +217,8 @@ class ContensisShell {
217
217
  "set role description",
218
218
  "set role assignments",
219
219
  "set role enabled",
220
- "set role permissions"
220
+ "set role permissions",
221
+ "update field"
221
222
  );
222
223
  const prompt = import_inquirer.default.createPromptModule();
223
224
  prompt.registerPrompt("command", import_inquirer_command_prompt.default);
package/dist/shell.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/shell.ts"],
4
- "sourcesContent": ["import figlet from 'figlet';\nimport inquirer from 'inquirer';\nimport inquirerPrompt from 'inquirer-command-prompt';\nimport { split } from 'split-cmd';\nimport commands from './commands';\nimport { LogMessages } from './localisation/en-GB';\nimport CredentialProvider from './providers/CredentialProvider';\nimport { appRootDir } from './providers/file-provider';\nimport ContensisCli, { cliCommand } from './services/ContensisCliService';\nimport { Logging } from './util';\nimport { logError, Logger } from './util/logger';\nimport { LIB_VERSION } from './version';\n\nclass ContensisShell {\n private currentEnvironment!: string;\n private emptyInputCounter: number = 0;\n private cache!: SessionCache;\n private env!: EnvironmentCache;\n private firstStart = true;\n private userId: string = '';\n private log = Logger;\n private messages = LogMessages;\n\n private refreshEnvironment = () => {\n // Reload any persisted changes from the disk cache\n const { cache } = new ContensisCli([]);\n this.cache = cache; // read the cache to pre-load suggestions\n // console.log(`refreshing env w/${currentEnvironment}`);\n this.currentEnvironment = cache.currentEnvironment || '';\n const environments = cache.environments || {};\n this.env = environments[this.currentEnvironment];\n\n // Reload logging here to support changing language\n Logging('en-GB').then(({ messages, Log }) => {\n this.log = Log;\n this.messages = messages;\n });\n };\n\n constructor() {\n this.refreshEnvironment();\n inquirerPrompt.setConfig({\n history: {\n save: true,\n folder: appRootDir,\n limit: 100,\n blacklist: ['quit'],\n },\n });\n\n const { log, messages } = this;\n\n figlet.text(\n messages.app.contensis(),\n {\n font: 'Block',\n horizontalLayout: 'default',\n verticalLayout: 'default',\n width: process.stdout.columns,\n whitespaceBreak: true,\n },\n (err, data) => {\n if (err) {\n log.error(messages.app.unknownError());\n console.dir(err);\n return;\n }\n console.log(log.successText(data));\n console.log(log.infoText(messages.app.startup(LIB_VERSION)));\n console.log(log.helpText(messages.app.help()));\n\n this.start().catch(ex => log.error(ex));\n }\n );\n }\n\n restart = async () => {\n this.firstStart = false;\n this.log.line(); // add a line so we can see where the shell has been restarted\n await this.start();\n };\n\n start = async () => {\n this.refreshEnvironment();\n this.userId = '';\n const { currentEnvironment, env, log, messages } = this;\n\n if (env?.lastUserId) {\n const [credsErr, credentials] = await new CredentialProvider(\n {\n userId: env.lastUserId,\n alias: currentEnvironment,\n },\n env.passwordFallback\n ).Init();\n if (credsErr && !credentials.current) {\n log.error(credsErr.message);\n }\n if (credentials.current) {\n if (this.firstStart) {\n const token = await cliCommand(['login', env.lastUserId]).Login(\n env.lastUserId,\n {\n promptPassword: false,\n silent: true,\n }\n );\n if (token) {\n this.userId = env.lastUserId;\n if (!env.currentProject) log.warning(messages.projects.tip());\n }\n this.firstStart = false;\n this.refreshEnvironment();\n } else {\n this.userId = env.lastUserId;\n }\n }\n }\n await this.contensisPrompt();\n };\n\n contensisPrompt = async (): Promise<any> => {\n const { currentEnvironment, env, log, messages, userId } = this;\n\n const availableCommands = [\n {\n filter: (str: string) => {\n return str.replace(/ \\[.*$/, '');\n },\n },\n 'connect',\n ...Object.keys(this.cache.environments || {}).map(\n alias => `connect ${alias}`\n ),\n 'list envs',\n 'remove env',\n 'quit',\n ];\n\n if (currentEnvironment)\n availableCommands.push(\n 'login',\n 'list projects',\n 'set project',\n ...(this.env?.projects || []).map(project => `set project ${project}`)\n );\n if (userId)\n availableCommands.push(\n 'copy field',\n 'create key',\n 'create project',\n 'create role',\n 'diff models',\n 'execute block action release',\n 'execute block action makelive',\n 'execute block action rollback',\n 'execute block action markasbroken',\n 'get assets',\n 'get block',\n 'get block logs',\n 'get contenttype',\n 'get component',\n 'get entries',\n 'get nodes',\n 'get model',\n 'get project',\n 'get proxy',\n 'get renderer',\n 'get role',\n 'get token',\n 'get version',\n 'get webhook',\n 'get workflow',\n 'import contenttypes',\n 'import components',\n 'import entries',\n 'import models',\n 'import nodes',\n 'list blocks',\n 'list contenttypes',\n 'list components',\n 'list keys',\n 'list models',\n 'list proxies',\n 'list renderers',\n 'list roles',\n 'list webhooks',\n 'list workflows',\n 'push block',\n 'remove components',\n 'remove contenttypes',\n 'remove key',\n 'remove entries',\n 'remove nodes',\n 'remove role',\n 'set project name',\n 'set project description',\n 'set role name',\n 'set role description',\n 'set role assignments',\n 'set role enabled',\n 'set role permissions'\n );\n\n const prompt = inquirer.createPromptModule();\n prompt.registerPrompt('command', inquirerPrompt);\n return prompt([\n {\n type: 'command',\n name: 'cmd',\n autoCompletion: availableCommands.sort(),\n autocompletePrompt: log.infoText(messages.app.autocomplete()),\n message: `${userId ? `${userId}@` : ''}${currentEnvironment || ''}>`,\n context: 0,\n validate: (val: string) => {\n if (!val) this.emptyInputCounter++;\n if (this.emptyInputCounter > 1)\n console.log(this.log.infoText(this.messages.app.suggestions()));\n if (val) {\n this.emptyInputCounter = 0;\n return true;\n }\n },\n prefix: `${env?.currentProject || log.infoText('contensis')}`,\n short: true,\n },\n ])\n .then(async (answers: { cmd: string }) => {\n if (answers.cmd === 'quit') {\n this.quit();\n } else {\n try {\n if (answers.cmd) {\n const program = commands();\n await program.parseAsync(\n split(answers.cmd).map(e => e.replace(/\\\\\"/g, '\"')),\n // answers.cmd\n // .match(/\"[^\"]+\"|[^\\s]+/g)\n // ?.map(e => e.replace(/\"(.+)\"/, '$1')),\n {\n from: 'user',\n }\n );\n }\n } catch (ex: any) {\n const str = ex.toString();\n if (!str.includes('CommanderError'))\n logError(\n ex,\n `Shell ${\n ex instanceof Error\n ? ex.toString()\n : JSON.stringify(ex, null, 2)\n }`\n );\n }\n return this.contensisPrompt();\n }\n })\n .catch((err: Error) => {\n log.error(err.message);\n this.quit();\n });\n };\n\n quit = (error?: Error) => {\n const { log, messages } = this;\n process.removeAllListeners('exit');\n\n if (error) {\n log.error(error.message);\n process.exit(1);\n } else {\n log.success(messages.app.quit());\n process.exitCode = 0;\n process.exit(0);\n }\n };\n}\n\nlet globalShell: ContensisShell;\n\nexport const shell = () => {\n // Return a benign function for shell().restart() when used in cli context\n // as some commands need to restart the shell to show an updated prompt\n // after successful connect / login / set project\n if (typeof process.argv?.[2] !== 'undefined')\n return {\n quit: ContensisCli.quit,\n restart() {},\n } as any;\n if (!globalShell) globalShell = new ContensisShell();\n return globalShell;\n};\n\nprocess.on('uncaughtException', function (err) {\n // Handle the error safely\n console.log(err);\n});\n\nprocess.on('SIGINT', () => {\n Logger.warning('received SIGINT');\n shell().quit();\n // setTimeout(() => {\n // }, 2000);\n});\n\nprocess.on('SIGTERM', () => {\n Logger.warning('received SIGTERM');\n shell().quit();\n});\n\nprocess.stdin.on('data', key => {\n if ((key as any) == '\\u0003') {\n console.log('');\n Logger.info(`[CTRL]+[C] detected, exiting shell...`);\n shell().quit();\n }\n});\n\n// process.env.http_proxy = 'http://127.0.0.1:8888';\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import figlet from 'figlet';\nimport inquirer from 'inquirer';\nimport inquirerPrompt from 'inquirer-command-prompt';\nimport { split } from 'split-cmd';\nimport commands from './commands';\nimport { LogMessages } from './localisation/en-GB';\nimport CredentialProvider from './providers/CredentialProvider';\nimport { appRootDir } from './providers/file-provider';\nimport ContensisCli, { cliCommand } from './services/ContensisCliService';\nimport { Logging } from './util';\nimport { logError, Logger } from './util/logger';\nimport { LIB_VERSION } from './version';\n\nclass ContensisShell {\n private currentEnvironment!: string;\n private emptyInputCounter: number = 0;\n private cache!: SessionCache;\n private env!: EnvironmentCache;\n private firstStart = true;\n private userId: string = '';\n private log = Logger;\n private messages = LogMessages;\n\n private refreshEnvironment = () => {\n // Reload any persisted changes from the disk cache\n const { cache } = new ContensisCli([]);\n this.cache = cache; // read the cache to pre-load suggestions\n // console.log(`refreshing env w/${currentEnvironment}`);\n this.currentEnvironment = cache.currentEnvironment || '';\n const environments = cache.environments || {};\n this.env = environments[this.currentEnvironment];\n\n // Reload logging here to support changing language\n Logging('en-GB').then(({ messages, Log }) => {\n this.log = Log;\n this.messages = messages;\n });\n };\n\n constructor() {\n this.refreshEnvironment();\n inquirerPrompt.setConfig({\n history: {\n save: true,\n folder: appRootDir,\n limit: 100,\n blacklist: ['quit'],\n },\n });\n\n const { log, messages } = this;\n\n figlet.text(\n messages.app.contensis(),\n {\n font: 'Block',\n horizontalLayout: 'default',\n verticalLayout: 'default',\n width: process.stdout.columns,\n whitespaceBreak: true,\n },\n (err, data) => {\n if (err) {\n log.error(messages.app.unknownError());\n console.dir(err);\n return;\n }\n console.log(log.successText(data));\n console.log(log.infoText(messages.app.startup(LIB_VERSION)));\n console.log(log.helpText(messages.app.help()));\n\n this.start().catch(ex => log.error(ex));\n }\n );\n }\n\n restart = async () => {\n this.firstStart = false;\n this.log.line(); // add a line so we can see where the shell has been restarted\n await this.start();\n };\n\n start = async () => {\n this.refreshEnvironment();\n this.userId = '';\n const { currentEnvironment, env, log, messages } = this;\n\n if (env?.lastUserId) {\n const [credsErr, credentials] = await new CredentialProvider(\n {\n userId: env.lastUserId,\n alias: currentEnvironment,\n },\n env.passwordFallback\n ).Init();\n if (credsErr && !credentials.current) {\n log.error(credsErr.message);\n }\n if (credentials.current) {\n if (this.firstStart) {\n const token = await cliCommand(['login', env.lastUserId]).Login(\n env.lastUserId,\n {\n promptPassword: false,\n silent: true,\n }\n );\n if (token) {\n this.userId = env.lastUserId;\n if (!env.currentProject) log.warning(messages.projects.tip());\n }\n this.firstStart = false;\n this.refreshEnvironment();\n } else {\n this.userId = env.lastUserId;\n }\n }\n }\n await this.contensisPrompt();\n };\n\n contensisPrompt = async (): Promise<any> => {\n const { currentEnvironment, env, log, messages, userId } = this;\n\n const availableCommands = [\n {\n filter: (str: string) => {\n return str.replace(/ \\[.*$/, '');\n },\n },\n 'connect',\n ...Object.keys(this.cache.environments || {}).map(\n alias => `connect ${alias}`\n ),\n 'list envs',\n 'remove env',\n 'quit',\n ];\n\n if (currentEnvironment)\n availableCommands.push(\n 'login',\n 'list projects',\n 'set project',\n ...(this.env?.projects || []).map(project => `set project ${project}`)\n );\n if (userId)\n availableCommands.push(\n 'copy field',\n 'create key',\n 'create project',\n 'create role',\n 'diff models',\n 'execute block action release',\n 'execute block action makelive',\n 'execute block action rollback',\n 'execute block action markasbroken',\n 'get assets',\n 'get block',\n 'get block logs',\n 'get contenttype',\n 'get component',\n 'get entries',\n 'get nodes',\n 'get model',\n 'get project',\n 'get proxy',\n 'get renderer',\n 'get role',\n 'get token',\n 'get version',\n 'get webhook',\n 'get workflow',\n 'import contenttypes',\n 'import components',\n 'import entries',\n 'import models',\n 'import nodes',\n 'list blocks',\n 'list contenttypes',\n 'list components',\n 'list keys',\n 'list models',\n 'list proxies',\n 'list renderers',\n 'list roles',\n 'list webhooks',\n 'list workflows',\n 'push block',\n 'remove components',\n 'remove contenttypes',\n 'remove key',\n 'remove entries',\n 'remove nodes',\n 'remove role',\n 'set project name',\n 'set project description',\n 'set role name',\n 'set role description',\n 'set role assignments',\n 'set role enabled',\n 'set role permissions',\n 'update field'\n );\n\n const prompt = inquirer.createPromptModule();\n prompt.registerPrompt('command', inquirerPrompt);\n return prompt([\n {\n type: 'command',\n name: 'cmd',\n autoCompletion: availableCommands.sort(),\n autocompletePrompt: log.infoText(messages.app.autocomplete()),\n message: `${userId ? `${userId}@` : ''}${currentEnvironment || ''}>`,\n context: 0,\n validate: (val: string) => {\n if (!val) this.emptyInputCounter++;\n if (this.emptyInputCounter > 1)\n console.log(this.log.infoText(this.messages.app.suggestions()));\n if (val) {\n this.emptyInputCounter = 0;\n return true;\n }\n },\n prefix: `${env?.currentProject || log.infoText('contensis')}`,\n short: true,\n },\n ])\n .then(async (answers: { cmd: string }) => {\n if (answers.cmd === 'quit') {\n this.quit();\n } else {\n try {\n if (answers.cmd) {\n const program = commands();\n await program.parseAsync(\n split(answers.cmd).map(e => e.replace(/\\\\\"/g, '\"')),\n // answers.cmd\n // .match(/\"[^\"]+\"|[^\\s]+/g)\n // ?.map(e => e.replace(/\"(.+)\"/, '$1')),\n {\n from: 'user',\n }\n );\n }\n } catch (ex: any) {\n const str = ex.toString();\n if (!str.includes('CommanderError'))\n logError(\n ex,\n `Shell ${\n ex instanceof Error\n ? ex.toString()\n : JSON.stringify(ex, null, 2)\n }`\n );\n }\n return this.contensisPrompt();\n }\n })\n .catch((err: Error) => {\n log.error(err.message);\n this.quit();\n });\n };\n\n quit = (error?: Error) => {\n const { log, messages } = this;\n process.removeAllListeners('exit');\n\n if (error) {\n log.error(error.message);\n process.exit(1);\n } else {\n log.success(messages.app.quit());\n process.exitCode = 0;\n process.exit(0);\n }\n };\n}\n\nlet globalShell: ContensisShell;\n\nexport const shell = () => {\n // Return a benign function for shell().restart() when used in cli context\n // as some commands need to restart the shell to show an updated prompt\n // after successful connect / login / set project\n if (typeof process.argv?.[2] !== 'undefined')\n return {\n quit: ContensisCli.quit,\n restart() {},\n } as any;\n if (!globalShell) globalShell = new ContensisShell();\n return globalShell;\n};\n\nprocess.on('uncaughtException', function (err) {\n // Handle the error safely\n console.log(err);\n});\n\nprocess.on('SIGINT', () => {\n Logger.warning('received SIGINT');\n shell().quit();\n // setTimeout(() => {\n // }, 2000);\n});\n\nprocess.on('SIGTERM', () => {\n Logger.warning('received SIGTERM');\n shell().quit();\n});\n\nprocess.stdin.on('data', key => {\n if ((key as any) == '\\u0003') {\n console.log('');\n Logger.info(`[CTRL]+[C] detected, exiting shell...`);\n shell().quit();\n }\n});\n\n// process.env.http_proxy = 'http://127.0.0.1:8888';\n"],
5
+ "mappings": "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",
6
6
  "names": ["ContensisCli", "inquirerPrompt", "figlet", "CredentialProvider", "inquirer", "commands"]
7
7
  }
package/dist/version.js CHANGED
@@ -21,7 +21,7 @@ __export(version_exports, {
21
21
  LIB_VERSION: () => LIB_VERSION
22
22
  });
23
23
  module.exports = __toCommonJS(version_exports);
24
- const LIB_VERSION = "1.3.1-beta.6";
24
+ const LIB_VERSION = "1.3.1-beta.8";
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.6\";\n"],
4
+ "sourcesContent": ["export const LIB_VERSION = \"1.3.1-beta.8\";\n"],
5
5
  "mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAO,MAAM,cAAc;",
6
6
  "names": []
7
7
  }
package/esbuild.config.js CHANGED
@@ -1,4 +1,4 @@
1
- const rimraf = require('rimraf');
1
+ const { rimraf } = require('rimraf');
2
2
  const esbuild = require('esbuild');
3
3
  const chalk = require('chalk');
4
4
  const { globPlugin } = require('esbuild-plugin-glob');
@@ -11,7 +11,7 @@ const completed = `${chalk.green('[contensis-cli]')} Build successful 👍\n`;
11
11
  console.time(completed);
12
12
  console.time(' - rimraf complete');
13
13
 
14
- rimraf('./dist', () => {
14
+ rimraf('./dist').then(() => {
15
15
  console.timeEnd(' - rimraf complete');
16
16
  console.time(' - esbuild complete');
17
17
  esbuild
@@ -43,5 +43,5 @@ rimraf('./dist', () => {
43
43
  replaceTscAliasPaths();
44
44
  console.timeEnd(' - replace alias paths');
45
45
  console.timeEnd(completed);
46
- })
46
+ });
47
47
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "contensis-cli",
3
- "version": "1.3.1-beta.6",
3
+ "version": "1.3.1-beta.8",
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",
@@ -24,50 +24,49 @@
24
24
  "author": "Zengenti",
25
25
  "license": "ISC",
26
26
  "dependencies": {
27
- "@action-validator/core": "^0.5.3",
28
- "adm-zip": "^0.5.10",
27
+ "@action-validator/core": "^0.6.0",
28
+ "adm-zip": "^0.5.16",
29
29
  "app-root-path": "^3.1.0",
30
30
  "chalk": "^4.1.2",
31
- "commander": "^9.4.1",
32
- "csv": "^6.1.0",
33
- "dayjs": "^1.11.6",
34
- "diff": "^5.1.0",
35
- "figlet": "^1.5.2",
31
+ "commander": "^12.1.0",
32
+ "csv": "^6.3.11",
33
+ "dayjs": "^1.11.13",
34
+ "diff": "^7.0.0",
35
+ "figlet": "^1.8.0",
36
36
  "flat": "^5.0.2",
37
37
  "giturl": "^2.0.0",
38
- "hosted-git-info": "^6.1.1",
38
+ "hosted-git-info": "^8.0.2",
39
39
  "inquirer-command-prompt": "^0.1.0",
40
- "jsonpath-mapper": "^1.1.0",
41
40
  "keytar": "^7.9.0",
42
41
  "lodash": "^4.17.21",
43
- "migratortron": "^1.0.0-beta.64",
44
- "nanospinner": "^1.1.0",
42
+ "migratortron": "^1.0.0-beta.70",
43
+ "nanospinner": "^1.2.0",
45
44
  "node-fetch": "^2.6.7",
46
45
  "parse-git-config": "^3.0.0",
47
- "patch-package": "^6.4.7",
46
+ "patch-package": "^8.0.0",
48
47
  "printable-characters": "^1.0.42",
49
48
  "split-cmd": "^1.1.0",
50
- "xml2js": "^0.4.23",
51
- "yaml": "^2.3.1"
49
+ "xml2js": "^0.6.2",
50
+ "yaml": "^2.6.1"
52
51
  },
53
52
  "devDependencies": {
54
- "@octokit/types": "^12.4.0",
55
- "@types/adm-zip": "^0.5.5",
56
- "@types/figlet": "^1.5.4",
57
- "@types/flat": "^5.0.2",
58
- "@types/hosted-git-info": "^3.0.2",
59
- "@types/inquirer": "^8.2.1",
60
- "@types/json2csv": "^5.0.3",
61
- "@types/lodash": "^4.14.182",
62
- "@types/node-fetch": "^2.6.1",
63
- "@types/parse-git-config": "^3.0.1",
64
- "@types/xml2js": "^0.4.11",
53
+ "@octokit/types": "^13.6.2",
54
+ "@types/adm-zip": "^0.5.7",
55
+ "@types/figlet": "^1.7.0",
56
+ "@types/flat": "^5.0.5",
57
+ "@types/hosted-git-info": "^3.0.5",
58
+ "@types/inquirer": "^9.0.7",
59
+ "@types/json2csv": "^5.0.7",
60
+ "@types/lodash": "^4.17.13",
61
+ "@types/node-fetch": "^2.6.12",
62
+ "@types/parse-git-config": "^3.0.4",
63
+ "@types/xml2js": "^0.4.14",
65
64
  "esbuild": "^0.24.0",
66
65
  "esbuild-node-externals": "^1.15.0",
67
66
  "esbuild-plugin-glob": "^2.2.3",
68
67
  "nodemon": "^2.0.18",
69
- "rimraf": "^3.0.2",
70
- "tsc-alias": "^1.6.9",
71
- "typescript": "^5.6.3"
68
+ "rimraf": "^6.0.1",
69
+ "tsc-alias": "^1.8.10",
70
+ "typescript": "^5.7.2"
72
71
  }
73
72
  }
@@ -76,7 +76,7 @@ Example call:
76
76
  contentTypeId,
77
77
  fieldId,
78
78
  destinationId,
79
- template: opts.template,
79
+ template,
80
80
  rootUri: opts.rootUri,
81
81
  };
82
82
 
@@ -16,6 +16,7 @@ export const mapContensisOpts = (opts: any = {}): MigrateRequest => ({
16
16
  : undefined,
17
17
  models: opts.modelIds,
18
18
  copyField: opts.copyField,
19
+ updateField: opts.updateField,
19
20
  // convert various cli options into MigrateRequest.query format
20
21
  query:
21
22
  opts.id ||
@@ -20,6 +20,7 @@ import { makeLoginCommand } from './login';
20
20
  import { makePushCommand } from './push';
21
21
  import { makeRemoveCommand } from './remove';
22
22
  import { makeSetCommand } from './set';
23
+ import { makeUpdateCommand } from './update';
23
24
 
24
25
  const commands = () => {
25
26
  const program = new Command()
@@ -89,6 +90,9 @@ const commands = () => {
89
90
  program.addCommand(
90
91
  addConnectOptions(makeSetCommand()).copyInheritedSettings(program)
91
92
  );
93
+ program.addCommand(
94
+ addGlobalOptions(makeUpdateCommand()).copyInheritedSettings(program)
95
+ );
92
96
 
93
97
  return program;
94
98
  };
@@ -1,7 +1,18 @@
1
1
  import { Command } from 'commander';
2
2
  import mapJson from 'jsonpath-mapper';
3
- import { PushBlockParams } from 'migratortron';
3
+ import { generateGuid, PushBlockParams } from 'migratortron';
4
+ import path from 'path';
5
+ import { Asset } from 'contensis-delivery-api';
4
6
  import { cliCommand } from '~/services/ContensisCliService';
7
+ import {
8
+ commit,
9
+ mapContensisOpts,
10
+ noPublish,
11
+ outputDetail,
12
+ saveEntries,
13
+ } from './globalOptions';
14
+ import { jsonFormatter } from '~/util/json.formatter';
15
+ import { cwdPath } from '~/providers/file-provider';
5
16
 
6
17
  export const makePushCommand = () => {
7
18
  const push = new Command()
@@ -11,6 +22,119 @@ export const makePushCommand = () => {
11
22
  .showHelpAfterError(true)
12
23
  .exitOverride();
13
24
 
25
+ push
26
+ .command('asset')
27
+ .description('push an asset')
28
+ .argument('<content-type-id>', 'the content type id of the asset to push')
29
+ .argument(
30
+ '<title>',
31
+ 'the title of the asset as it appears in the cms (use quotes)'
32
+ )
33
+ .argument(
34
+ '[description]',
35
+ 'the description or altText of the asset (use quotes)'
36
+ )
37
+ .option(
38
+ '-from --from-file <fromFile>',
39
+ 'the local file path of the source asset'
40
+ )
41
+ .option('-url --from-url <fromUrl>', 'the full url of the source asset')
42
+ .option(
43
+ '-to --target-file-path <targetFilePath>',
44
+ 'the file path in the cms project to push the asset to e.g. "/asset-library/"'
45
+ )
46
+ .option(
47
+ '-name --target-file-name <targetFileName>',
48
+ 'set the file name in the cms project'
49
+ )
50
+ .option('-i --id <id>', 'push the asset with a specific guid')
51
+ .addOption(commit)
52
+ .addOption(noPublish)
53
+ .addOption(outputDetail)
54
+ .addOption(saveEntries)
55
+ .usage('<content-type-id> <title> [description] [options]')
56
+ .addHelpText(
57
+ 'after',
58
+ `
59
+ Example call:
60
+ > push asset pdf "Example file" "An example of a PDF asset" --from-file example.pdf --target-file-path /asset-library/pdf/\n`
61
+ )
62
+ .action(
63
+ async (
64
+ contentTypeId: string,
65
+ title: string,
66
+ description: string,
67
+ opts
68
+ ) => {
69
+ const cli = cliCommand(
70
+ ['push', 'asset', contentTypeId, title, description],
71
+ opts,
72
+ mapContensisOpts({ preserveGuids: true, ...opts, id: undefined })
73
+ );
74
+ const mapSourceVars = {
75
+ contentTypeId,
76
+ title,
77
+ description,
78
+ ...opts,
79
+ };
80
+
81
+ const assetEntry: Asset = mapJson(mapSourceVars, {
82
+ entryTitle: 'title',
83
+ title: 'title',
84
+ entryDescription: 'description',
85
+ description: 'description',
86
+ altText: ({ contentTypeId, description }) =>
87
+ contentTypeId === 'image' ? description : undefined,
88
+ sys: {
89
+ dataFormat: () => 'asset',
90
+ contentTypeId: 'contentTypeId',
91
+ id: 'id',
92
+ isPublished: () => true, // can be overridden by !opts.publish
93
+ properties: {
94
+ filename: {
95
+ $path: ['targetFileName', 'fromFile', 'fromUrl'],
96
+ $formatting: (nameOrPath: string) => {
97
+ return path.basename(nameOrPath);
98
+ },
99
+ },
100
+ filePath: {
101
+ $path: 'targetFilePath',
102
+ $default: (_, { fromFile, fromUrl }) => {
103
+ const toPosixPath = (windowsPath: string) =>
104
+ windowsPath.replace(/^(\w):|\\+/g, '/$1');
105
+
106
+ return path.dirname(
107
+ toPosixPath(fromFile || fromUrl.split(':/')[1])
108
+ );
109
+ },
110
+ },
111
+ },
112
+ uri: {
113
+ $path: ['fromFile', 'fromUrl'],
114
+ $formatting: (from: string) =>
115
+ from?.startsWith('http') ? from : cwdPath(from),
116
+ },
117
+ },
118
+ });
119
+
120
+ if (!assetEntry.sys.id)
121
+ assetEntry.sys.id = generateGuid(
122
+ cli.currentEnv,
123
+ cli.currentProject,
124
+ `${assetEntry.sys.contentTypeId}-${assetEntry.sys.properties.filePath.replaceAll('/', '').toLowerCase()}-${assetEntry.sys.properties.filename.toLowerCase()}`
125
+ );
126
+
127
+ console.log(jsonFormatter(assetEntry));
128
+
129
+ await cli.ImportEntries({
130
+ commit: opts.commit,
131
+ logOutput: opts.outputDetail,
132
+ saveEntries: opts.saveEntries,
133
+ data: [assetEntry],
134
+ });
135
+ }
136
+ );
137
+
14
138
  push
15
139
  .command('block')
16
140
  .description('push a block')
@@ -0,0 +1,84 @@
1
+ import { Command } from 'commander';
2
+ import { UpdateField } from 'migratortron';
3
+ import { cliCommand } from '~/services/ContensisCliService';
4
+ import {
5
+ commit,
6
+ concurrency,
7
+ entryId,
8
+ ignoreErrors,
9
+ latest,
10
+ mapContensisOpts,
11
+ noCache,
12
+ noPublish,
13
+ outputDetail,
14
+ saveEntries,
15
+ versionStatus,
16
+ zenql,
17
+ } from './globalOptions';
18
+
19
+ export const makeUpdateCommand = () => {
20
+ const update = new Command()
21
+ .command('update')
22
+ .description('update command')
23
+ .addHelpText('after', `\n`)
24
+ .showHelpAfterError(true)
25
+ .exitOverride();
26
+
27
+ update
28
+ .command('field')
29
+ .description('find and replace within entry fields')
30
+ .argument('<fieldId>', 'the id of the field to update')
31
+ .argument(
32
+ '<find>',
33
+ 'the string to find within each entry/field (surround a phrase in double quotes)'
34
+ )
35
+ .argument(
36
+ '<replace>',
37
+ 'the string to replace with (surround a phrase in double quotes)'
38
+ )
39
+ .addOption(commit)
40
+ .addOption(concurrency)
41
+ .addOption(ignoreErrors)
42
+ .addOption(outputDetail.default('changes'))
43
+ .addOption(noCache)
44
+ .addOption(noPublish)
45
+ .option(
46
+ '--search <phrase>',
47
+ 'get entries with the search phrase, use quotes for multiple words'
48
+ )
49
+ .addOption(entryId)
50
+ .addOption(zenql)
51
+ .addOption(latest)
52
+ .addOption(versionStatus)
53
+ .addOption(saveEntries)
54
+ .usage('<fieldId> <find> <replace> (all arguments required)')
55
+ .addHelpText(
56
+ 'after',
57
+ `
58
+ Example call:
59
+ > update field authorName "Emma Smith" "Emma Davies" --zenql "sys.contentTypeId=blog"\n`
60
+ )
61
+ .action(
62
+ async (fieldId: string, find: string, replace: string, opts: any) => {
63
+ const updateField: UpdateField = {
64
+ fieldId,
65
+ find,
66
+ replace,
67
+ };
68
+
69
+ return await cliCommand(
70
+ ['update', 'field', fieldId, find, replace],
71
+ opts,
72
+ mapContensisOpts({ updateField, ...opts })
73
+ ).UpdateEntryField({
74
+ commit: opts.commit,
75
+ fromFile: opts.fromFile,
76
+ logOutput: opts.outputDetail,
77
+ saveEntries: opts.saveEntries,
78
+ });
79
+ }
80
+ );
81
+
82
+ return update;
83
+ };
84
+
@@ -127,6 +127,7 @@ class ContensisCli {
127
127
  ) {
128
128
  // console.log('args: ', JSON.stringify(args, null, 2));
129
129
 
130
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
130
131
  const [exe, script, verb = '', noun = '', ...restArgs] = args;
131
132
  this.verb = verb?.toLowerCase();
132
133
  this.noun = noun?.toLowerCase();
@@ -324,6 +325,7 @@ class ContensisCli {
324
325
  commit = false,
325
326
  fromFile,
326
327
  importDataType,
328
+ importData,
327
329
  }: {
328
330
  commit?: boolean;
329
331
  fromFile?: string;
@@ -334,10 +336,13 @@ class ContensisCli {
334
336
  | 'models'
335
337
  | 'nodes'
336
338
  | 'user-input';
339
+ importData?: any[];
337
340
  }) => {
338
- const source: 'contensis' | 'file' = fromFile ? 'file' : 'contensis';
341
+ const source: 'contensis' | 'file' =
342
+ fromFile || importData ? 'file' : 'contensis';
339
343
 
340
- const fileData = fromFile ? (await readFileAsJSON(fromFile)) || [] : [];
344
+ const fileData =
345
+ importData || (fromFile ? (await readFileAsJSON(fromFile)) || [] : []);
341
346
 
342
347
  if (typeof fileData === 'string')
343
348
  throw new Error(`Import file format must be of type JSON`);
@@ -1861,11 +1866,13 @@ class ContensisCli {
1861
1866
  fromFile,
1862
1867
  logOutput,
1863
1868
  saveEntries,
1869
+ data,
1864
1870
  }: {
1865
1871
  commit: boolean;
1866
- fromFile: string;
1872
+ fromFile?: string;
1867
1873
  logOutput: string;
1868
1874
  saveEntries: boolean;
1875
+ data?: any[];
1869
1876
  }) => {
1870
1877
  const { currentEnv, currentProject, log, messages } = this;
1871
1878
 
@@ -1873,6 +1880,7 @@ class ContensisCli {
1873
1880
  commit,
1874
1881
  fromFile,
1875
1882
  importDataType: 'entries',
1883
+ importData: data,
1876
1884
  });
1877
1885
 
1878
1886
  if (contensis) {
@@ -1903,7 +1911,10 @@ class ContensisCli {
1903
1911
  showDiff: logOutput === 'all' || logOutput === 'changes',
1904
1912
  showChanged: logOutput === 'changes',
1905
1913
  });
1906
- if (['all', 'changes'].includes(logOutput))
1914
+ if (
1915
+ ['all', 'changes'].includes(logOutput) &&
1916
+ nodes.migrateNodes.length
1917
+ )
1907
1918
  printNodeTreeOutput(
1908
1919
  this,
1909
1920
  {
@@ -2033,6 +2044,86 @@ class ContensisCli {
2033
2044
  }
2034
2045
  };
2035
2046
 
2047
+ UpdateEntryField = async ({
2048
+ commit,
2049
+ fromFile,
2050
+ logOutput,
2051
+ saveEntries,
2052
+ }: {
2053
+ commit: boolean;
2054
+ fromFile: string;
2055
+ logOutput: string;
2056
+ saveEntries: boolean;
2057
+ }) => {
2058
+ const { currentEnv, currentProject, log, messages } = this;
2059
+
2060
+ const contensis = await this.ConnectContensisImport({
2061
+ commit,
2062
+ fromFile,
2063
+ importDataType: 'entries',
2064
+ });
2065
+
2066
+ if (contensis) {
2067
+ log.line();
2068
+ if (contensis.isPreview) {
2069
+ log.success(messages.migrate.preview());
2070
+ } else {
2071
+ log.warning(messages.migrate.commit());
2072
+ }
2073
+
2074
+ const [err, result] = await to(
2075
+ contensis.content.update.UpdateFieldContent()
2076
+ );
2077
+
2078
+ if (err) logError(err);
2079
+ if (result) {
2080
+ const output = saveEntries
2081
+ ? contensis.content.update.targets[
2082
+ currentProject
2083
+ ].entries.migrate?.map(me => me.toJSON())
2084
+ : result;
2085
+ await this.HandleFormattingAndOutput(output, () => {
2086
+ // print the migrateResult to console
2087
+ printEntriesMigrateResult(this, result, {
2088
+ showAll: logOutput === 'all',
2089
+ showDiff: logOutput === 'all' || logOutput === 'changes',
2090
+ showChanged: logOutput === 'changes',
2091
+ });
2092
+ });
2093
+ }
2094
+
2095
+ if (
2096
+ result &&
2097
+ !err &&
2098
+ !result.errors?.length &&
2099
+ ((!commit && result.entriesToMigrate[currentProject].totalCount) ||
2100
+ (commit &&
2101
+ (result.migrateResult?.created || result.migrateResult?.updated)))
2102
+ ) {
2103
+ log.success(
2104
+ messages.entries.imported(
2105
+ currentEnv,
2106
+ commit,
2107
+ commit
2108
+ ? (result.migrateResult?.created || 0) +
2109
+ (result.migrateResult?.updated || 0)
2110
+ : result.entriesToMigrate[currentProject].totalCount
2111
+ )
2112
+ );
2113
+ if (!commit) {
2114
+ log.raw(``);
2115
+ log.help(messages.entries.commitTip());
2116
+ }
2117
+ } else {
2118
+ log.error(messages.entries.failedImport(currentEnv), err);
2119
+ if (!result?.entriesToMigrate?.[currentProject]?.totalCount)
2120
+ log.help(messages.entries.notFound(currentEnv));
2121
+ }
2122
+ } else {
2123
+ log.warning(messages.models.noList(currentProject));
2124
+ log.help(messages.connect.tip());
2125
+ }
2126
+ };
2036
2127
  GetNodes = async (rootPath: string, depth = 0) => {
2037
2128
  const { currentProject, log, messages } = this;
2038
2129
  const contensis = await this.ConnectContensis();
package/src/shell.ts CHANGED
@@ -199,7 +199,8 @@ class ContensisShell {
199
199
  'set role description',
200
200
  'set role assignments',
201
201
  'set role enabled',
202
- 'set role permissions'
202
+ 'set role permissions',
203
+ 'update field'
203
204
  );
204
205
 
205
206
  const prompt = inquirer.createPromptModule();
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const LIB_VERSION = "1.3.1-beta.6";
1
+ export const LIB_VERSION = "1.3.1-beta.8";