contensis-cli 1.0.12-beta.2 → 1.0.12-beta.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/README.md +9 -9
  2. package/dist/commands/get.js +13 -1
  3. package/dist/commands/get.js.map +2 -2
  4. package/dist/commands/globalOptions.js +9 -10
  5. package/dist/commands/globalOptions.js.map +2 -2
  6. package/dist/commands/import.js +22 -12
  7. package/dist/commands/import.js.map +2 -2
  8. package/dist/commands/index.js +2 -2
  9. package/dist/commands/index.js.map +2 -2
  10. package/dist/commands/list.js +9 -0
  11. package/dist/commands/list.js.map +2 -2
  12. package/dist/commands/remove.js +13 -0
  13. package/dist/commands/remove.js.map +2 -2
  14. package/dist/localisation/en-GB.js +12 -4
  15. package/dist/localisation/en-GB.js.map +2 -2
  16. package/dist/mappers/DevInit-to-CIWorkflow.js +6 -8
  17. package/dist/mappers/DevInit-to-CIWorkflow.js.map +2 -2
  18. package/dist/mappers/DevInit-to-RolePermissions.js +4 -4
  19. package/dist/mappers/DevInit-to-RolePermissions.js.map +2 -2
  20. package/dist/providers/file-provider.js +5 -1
  21. package/dist/providers/file-provider.js.map +2 -2
  22. package/dist/services/ContensisAuthService.js.map +2 -2
  23. package/dist/services/ContensisCliService.js +158 -40
  24. package/dist/services/ContensisCliService.js.map +2 -2
  25. package/dist/services/ContensisDevService.js +51 -56
  26. package/dist/services/ContensisDevService.js.map +3 -3
  27. package/dist/shell.js +6 -0
  28. package/dist/shell.js.map +2 -2
  29. package/dist/util/console.printer.js +61 -52
  30. package/dist/util/console.printer.js.map +3 -3
  31. package/dist/util/csv.formatter.js +3 -11
  32. package/dist/util/csv.formatter.js.map +3 -3
  33. package/dist/util/diff.js +1 -1
  34. package/dist/util/diff.js.map +2 -2
  35. package/dist/util/error.js +36 -0
  36. package/dist/util/error.js.map +7 -0
  37. package/dist/util/find.js +10 -2
  38. package/dist/util/find.js.map +2 -2
  39. package/dist/util/git.js +1 -0
  40. package/dist/util/git.js.map +2 -2
  41. package/dist/util/json.formatter.js +35 -3
  42. package/dist/util/json.formatter.js.map +3 -3
  43. package/dist/util/logger.js +52 -9
  44. package/dist/util/logger.js.map +3 -3
  45. package/dist/version.js +1 -1
  46. package/dist/version.js.map +1 -1
  47. package/package.json +4 -4
  48. package/src/commands/get.ts +19 -1
  49. package/src/commands/globalOptions.ts +9 -7
  50. package/src/commands/import.ts +35 -15
  51. package/src/commands/index.ts +2 -3
  52. package/src/commands/list.ts +15 -0
  53. package/src/commands/remove.ts +20 -0
  54. package/src/localisation/en-GB.ts +15 -5
  55. package/src/mappers/DevInit-to-CIWorkflow.ts +8 -8
  56. package/src/mappers/DevInit-to-RolePermissions.ts +5 -2
  57. package/src/models/Cache.d.ts +2 -1
  58. package/src/providers/file-provider.ts +5 -1
  59. package/src/services/ContensisAuthService.ts +1 -1
  60. package/src/services/ContensisCliService.ts +195 -55
  61. package/src/services/ContensisDevService.ts +76 -70
  62. package/src/shell.ts +8 -0
  63. package/src/util/console.printer.ts +151 -72
  64. package/src/util/csv.formatter.ts +1 -4
  65. package/src/util/diff.ts +1 -1
  66. package/src/util/error.ts +7 -0
  67. package/src/util/find.ts +13 -2
  68. package/src/util/git.ts +2 -1
  69. package/src/util/json.formatter.ts +32 -1
  70. package/src/util/logger.ts +90 -15
  71. package/src/version.ts +1 -1
@@ -11,7 +11,8 @@ export const appRootDir =
11
11
  : path.join(userHomeDir, '.contensis/');
12
12
 
13
13
  export const readJsonFile = <T>(filePath: string) => {
14
- const file = readFile(filePath);
14
+ const directoryPath = cwdPath(filePath);
15
+ const file = readFile(directoryPath);
15
16
  if (file) return tryParse(file) as T | string;
16
17
  return undefined;
17
18
  };
@@ -81,3 +82,6 @@ export const checkDir = (filePath: string) => {
81
82
 
82
83
  export const localPath = (filePath: string) =>
83
84
  path.isAbsolute(filePath) ? filePath : path.join(appRootDir, filePath);
85
+
86
+ export const cwdPath = (filePath: string) =>
87
+ path.isAbsolute(filePath) ? filePath : path.join(process.cwd(), filePath);
@@ -59,7 +59,7 @@ class ContensisAuthService {
59
59
  });
60
60
  }
61
61
 
62
- ClassicToken = async () => {
62
+ ClassicToken = async (): Promise<string | null | undefined> => {
63
63
  // make sure our token isn't expried.
64
64
  await this.client.ensureBearerToken();
65
65
  return (this.client as any).contensisClassicToken;
@@ -46,7 +46,7 @@ import {
46
46
  } from '~/util/console.printer';
47
47
  import { csvFormatter } from '~/util/csv.formatter';
48
48
  import { xmlFormatter } from '~/util/xml.formatter';
49
- import { jsonFormatter } from '~/util/json.formatter';
49
+ import { jsonFormatter, limitFields } from '~/util/json.formatter';
50
50
  import { diffLogStrings } from '~/util/diff';
51
51
  import { logError, Logger } from '~/util/logger';
52
52
  import { promiseDelay } from '~/util/timers';
@@ -63,23 +63,16 @@ class ContensisCli {
63
63
  process.exit(exitCode);
64
64
  };
65
65
 
66
- private command: CliCommand;
67
66
  private format?: OutputFormat;
68
67
  private output?: string;
69
68
  private session: SessionCacheProvider;
70
69
 
70
+ auth?: ContensisAuthService;
71
+ command: CliCommand;
71
72
  contensis?: ContensisMigrationService;
72
73
  contensisOpts: Partial<MigrateRequest>;
73
74
  currentProject: string;
74
75
 
75
- devinit!: {
76
- invokedBy: string;
77
- credentials: {
78
- clientId: string;
79
- clientSecret: string;
80
- };
81
- };
82
-
83
76
  sourceAlias?: string;
84
77
  targetEnv?: string;
85
78
  urls:
@@ -99,10 +92,6 @@ class ContensisCli {
99
92
  noun: string;
100
93
  thirdArg: string;
101
94
 
102
- get invokedBy() {
103
- return this.command.createdUserId;
104
- }
105
-
106
95
  get cache() {
107
96
  return this.session.Get();
108
97
  }
@@ -132,11 +121,6 @@ class ContensisCli {
132
121
  }
133
122
  }
134
123
 
135
- constructor(
136
- args: string[],
137
- outputOpts?: OutputOptionsConstructorArg,
138
- contensisOpts?: Partial<MigrateRequest>
139
- );
140
124
  constructor(
141
125
  args: string[],
142
126
  outputOpts?: OutputOptionsConstructorArg,
@@ -164,15 +148,19 @@ class ContensisCli {
164
148
  const environments = this.cache.environments || {};
165
149
  this.currentEnv = currentEnvironment;
166
150
 
151
+ // Set env from command options
167
152
  const env = this.env;
168
-
169
153
  if (outputOpts?.projectId) env.currentProject = outputOpts.projectId;
170
154
  if (outputOpts?.user) env.lastUserId = outputOpts.user;
171
155
  // setting this in env means passwordFallback is written to environments.json
172
156
  if (outputOpts?.password) env.passwordFallback = outputOpts.password;
173
157
  if (outputOpts?.clientId) env.lastUserId = outputOpts.clientId;
174
158
  if (outputOpts?.sharedSecret)
175
- env.passwordFallback = outputOpts.sharedSecret;
159
+ if (outputOpts.sharedSecret.startsWith('-'))
160
+ throw new Error(
161
+ `Shared secret option provided a value of ${outputOpts.sharedSecret}`
162
+ );
163
+ else env.passwordFallback = outputOpts.sharedSecret;
176
164
 
177
165
  this.currentProject = env?.currentProject || 'null';
178
166
  this.sourceAlias = outputOpts?.sourceAlias || currentEnvironment;
@@ -183,8 +171,9 @@ class ContensisCli {
183
171
 
184
172
  this.command = {
185
173
  commandText,
174
+ options: outputOpts as any,
186
175
  createdDate: new Date().toISOString(),
187
- createdUserId: env?.lastUserId,
176
+ invokedBy: env?.lastUserId,
188
177
  };
189
178
 
190
179
  if (currentEnvironment) {
@@ -424,7 +413,10 @@ class ContensisCli {
424
413
 
425
414
  if (credentialError && !credentials.current) {
426
415
  // Log problem with Credential Provider
427
- log.error(credentialError as any);
416
+ log.error(
417
+ `Unable to find credentials for user ${userId} at ${currentEnv}`,
418
+ credentialError as any
419
+ );
428
420
  return;
429
421
  }
430
422
 
@@ -492,7 +484,7 @@ class ContensisCli {
492
484
  }
493
485
 
494
486
  if (inputPassword || cachedPassword || cachedSecret) {
495
- const authService = new ContensisAuthService({
487
+ this.auth = new ContensisAuthService({
496
488
  username: userId,
497
489
  password: inputPassword || cachedPassword,
498
490
  projectId: env?.currentProject || 'website',
@@ -501,9 +493,7 @@ class ContensisCli {
501
493
  clientSecret: sharedSecret || cachedSecret,
502
494
  });
503
495
 
504
- const [authError, bearerToken] = await to(
505
- authService.BearerToken()
506
- );
496
+ const [authError, bearerToken] = await to(this.auth.BearerToken());
507
497
 
508
498
  // Login successful
509
499
  if (bearerToken) {
@@ -784,7 +774,7 @@ class ContensisCli {
784
774
  }
785
775
  };
786
776
 
787
- CreateApiKey = async (name: string, description?: string) => {
777
+ CreateApiKey = async (name: string, description = '') => {
788
778
  const { currentEnv, log, messages } = this;
789
779
  const contensis = await this.ConnectContensis();
790
780
 
@@ -1038,6 +1028,98 @@ class ContensisCli {
1038
1028
  }
1039
1029
  };
1040
1030
 
1031
+ PrintWorkflows = async () => {
1032
+ const { currentEnv, log, messages } = this;
1033
+ const contensis = await this.ConnectContensis();
1034
+
1035
+ if (contensis) {
1036
+ // Retrieve workflows list for env
1037
+ const [workflowsErr, workflows] =
1038
+ await contensis.content.sourceRepo.workflows.GetWorkflows();
1039
+
1040
+ if (Array.isArray(workflows)) {
1041
+ log.success(messages.workflows.list(currentEnv));
1042
+
1043
+ if (!workflows.length) log.help(messages.workflows.noneExist());
1044
+
1045
+ const stringFromLanguageObject = (o: { [lang: string]: string }) =>
1046
+ Object.values(o || {})?.[0];
1047
+
1048
+ this.HandleFormattingAndOutput(workflows, () => {
1049
+ // print the workflows to console
1050
+ // log.object(workflows);
1051
+ for (const {
1052
+ id,
1053
+ name,
1054
+ description,
1055
+ states,
1056
+ eventGroups,
1057
+ isSystem,
1058
+ } of workflows as any) {
1059
+ const color = isSystem ? (s: string) => s : log.infoText;
1060
+
1061
+ console.log(
1062
+ color(
1063
+ ` - ${chalk.bold(
1064
+ stringFromLanguageObject(name)
1065
+ )} ${log.infoText(id)}`
1066
+ )
1067
+ );
1068
+ if (description)
1069
+ console.log(
1070
+ log.infoText(` ${stringFromLanguageObject(description)}`)
1071
+ );
1072
+ if (isSystem === false)
1073
+ console.log(` ${chalk.bold.grey('isSystem')}: false`);
1074
+ if (states?.length)
1075
+ console.log(
1076
+ ` ${chalk.bold.grey('states')}: ${states
1077
+ .map((state: any) => state.id)
1078
+ .join(', ')}`
1079
+ );
1080
+ if (eventGroups?.length)
1081
+ console.log(
1082
+ ` ${chalk.bold.grey('eventGroups')}: ${eventGroups
1083
+ .map((evtGrp: any) => evtGrp.id)
1084
+ .join(', ')}`
1085
+ );
1086
+ }
1087
+ });
1088
+ }
1089
+
1090
+ if (workflowsErr) {
1091
+ log.error(messages.workflows.noList(currentEnv));
1092
+ log.error(jsonFormatter(workflowsErr));
1093
+ }
1094
+ }
1095
+ };
1096
+
1097
+ PrintWorkflow = async (workflowNameOrId: string) => {
1098
+ const { currentEnv, log, messages } = this;
1099
+ const contensis = await this.ConnectContensis();
1100
+
1101
+ if (contensis) {
1102
+ // Retrieve workflows list for env
1103
+ const [workflowsErr, workflows] =
1104
+ await contensis.content.sourceRepo.workflows.GetWorkflows();
1105
+
1106
+ if (Array.isArray(workflows)) {
1107
+ log.success(messages.workflows.list(currentEnv));
1108
+
1109
+ const workflow = findByIdOrName(workflows, workflowNameOrId);
1110
+
1111
+ if (workflow) this.HandleFormattingAndOutput(workflow, log.object);
1112
+ else
1113
+ log.error(messages.workflows.failedGet(currentEnv, workflowNameOrId));
1114
+ }
1115
+
1116
+ if (workflowsErr) {
1117
+ log.error(messages.workflows.noList(currentEnv));
1118
+ log.error(jsonFormatter(workflowsErr));
1119
+ }
1120
+ }
1121
+ };
1122
+
1041
1123
  CreateProject = async (project: Project) => {
1042
1124
  const { currentEnv, log, messages } = this;
1043
1125
  const contensis = await this.ConnectContensis();
@@ -1305,7 +1387,7 @@ class ContensisCli {
1305
1387
  const { currentProject, log, messages } = this;
1306
1388
  const contensis = await this.ConnectContensisImport({
1307
1389
  commit,
1308
- importDataType: 'user-input',
1390
+ importDataType: 'user-input', // 'user-input' import type does not require a source cms
1309
1391
  });
1310
1392
  if (contensis) {
1311
1393
  const [err, result] = await contensis.DeleteContentTypes(contentTypeIds);
@@ -1482,7 +1564,7 @@ class ContensisCli {
1482
1564
  const { currentProject, log, messages } = this;
1483
1565
  const contensis = await this.ConnectContensisImport({
1484
1566
  commit,
1485
- importDataType: 'user-input',
1567
+ importDataType: 'user-input', // 'user-input' import type does not require a source cms
1486
1568
  });
1487
1569
  if (contensis) {
1488
1570
  const [err, result] = await contensis.DeleteContentTypes(
@@ -1568,7 +1650,7 @@ class ContensisCli {
1568
1650
  const { currentEnv, currentProject, log, messages } = this;
1569
1651
  const contensis = await this.ConnectContensisImport({
1570
1652
  commit,
1571
- importDataType: 'user-input',
1653
+ importDataType: 'user-input', // 'user-input' import type does not require a source cms
1572
1654
  });
1573
1655
 
1574
1656
  if (contensis) {
@@ -1598,7 +1680,7 @@ class ContensisCli {
1598
1680
  }
1599
1681
  } else {
1600
1682
  log.error(messages.entries.failedRemove(currentEnv), err);
1601
- if (!result.entriesToMigrate[currentProject].totalCount)
1683
+ if (!result?.entriesToMigrate?.[currentProject]?.totalCount)
1602
1684
  log.help(messages.entries.notFound(currentEnv));
1603
1685
  }
1604
1686
  }
@@ -1689,7 +1771,7 @@ class ContensisCli {
1689
1771
  }
1690
1772
  } else {
1691
1773
  log.error(messages.entries.failedImport(currentEnv), err);
1692
- if (!result.entriesToMigrate[currentProject].totalCount)
1774
+ if (!result?.entriesToMigrate?.[currentProject]?.totalCount)
1693
1775
  log.help(messages.entries.notFound(currentEnv));
1694
1776
  }
1695
1777
  } else {
@@ -1704,19 +1786,18 @@ class ContensisCli {
1704
1786
 
1705
1787
  if (contensis) {
1706
1788
  log.line();
1707
- const [err] = await to(
1708
- contensis.content.sourceRepo.nodes.GetNodes(rootPath, depth)
1709
- );
1789
+ const [err, nodes] = await to(contensis.nodes.GetNodes(rootPath, depth));
1710
1790
  if (err) {
1711
1791
  log.error(messages.nodes.failedGet(currentProject), err);
1712
1792
  return;
1713
1793
  }
1714
- const root = contensis.content.sourceRepo.nodes.tree;
1794
+ const root = contensis.nodes.sourceRepo.nodes.tree;
1715
1795
 
1716
1796
  log.success(messages.nodes.get(currentProject, rootPath, depth));
1717
1797
 
1718
- this.HandleFormattingAndOutput(root, () => {
1798
+ this.HandleFormattingAndOutput(nodes, () => {
1719
1799
  // print the nodes to console
1800
+ log.object({ ...root, children: undefined, language: undefined });
1720
1801
  printNodeTreeOutput(this, root);
1721
1802
  });
1722
1803
  } else {
@@ -1729,10 +1810,12 @@ class ContensisCli {
1729
1810
  commit,
1730
1811
  fromFile,
1731
1812
  logOutput,
1813
+ logLimit,
1732
1814
  }: {
1733
1815
  commit: boolean;
1734
1816
  fromFile: string;
1735
1817
  logOutput: string;
1818
+ logLimit: number;
1736
1819
  }) => {
1737
1820
  const { currentEnv, currentProject, log, messages } = this;
1738
1821
 
@@ -1751,28 +1834,34 @@ class ContensisCli {
1751
1834
  }
1752
1835
 
1753
1836
  const [err, result] = await contensis.MigrateNodes();
1837
+ const migrateTree =
1838
+ contensis.nodes.targetRepos[currentProject].nodes.migrateNodesTreeView;
1754
1839
 
1755
- if (err) logError(err);
1840
+ if (err) log.raw(``);
1756
1841
  else
1757
1842
  this.HandleFormattingAndOutput(result, () => {
1758
1843
  // print the migrateResult to console
1759
- // TODO: fix
1844
+ printNodeTreeOutput(this, migrateTree, logOutput, logLimit);
1760
1845
  printNodesMigrateResult(this, result, {
1761
1846
  showAll: logOutput === 'all',
1762
1847
  showChanged: logOutput === 'changes',
1763
1848
  });
1764
1849
  });
1765
1850
 
1766
- const nodesTotalCount = result?.nodesToMigrate[currentProject].totalCount;
1851
+ const nodesMigrateCount =
1852
+ result?.nodesToMigrate?.[currentProject].totalCount;
1767
1853
  const nodesCreated = result?.nodesResult?.['created'] || 0;
1768
1854
  const nodesUpdated = result?.nodesResult?.['updated'] || 0;
1769
- const noChange = result.nodesToMigrate[currentProject]['no change'] !== 0;
1855
+ const nodesErrored = result?.nodesResult?.['errors'] || 0;
1856
+ const noChanges =
1857
+ result?.nodesToMigrate?.[currentProject]['no change'] &&
1858
+ nodesMigrateCount === 0;
1770
1859
 
1771
1860
  if (
1772
1861
  !err &&
1773
- !result.errors?.length &&
1774
- ((!commit && nodesTotalCount) ||
1775
- (commit && (nodesCreated || nodesUpdated)))
1862
+ (!result.errors?.length || this.contensisOpts.ignoreErrors) &&
1863
+ ((!commit && nodesMigrateCount) ||
1864
+ (commit && (nodesCreated || nodesUpdated || result.errors?.length)))
1776
1865
  ) {
1777
1866
  let totalCount: number;
1778
1867
  if (commit) {
@@ -1782,20 +1871,20 @@ class ContensisCli {
1782
1871
  totalCount = created + updated;
1783
1872
  } else {
1784
1873
  totalCount =
1785
- typeof nodesTotalCount === 'number' ? nodesTotalCount : 0;
1874
+ typeof nodesMigrateCount === 'number' ? nodesMigrateCount : 0;
1786
1875
  }
1787
1876
 
1788
1877
  log.success(messages.nodes.imported(currentEnv, commit, totalCount));
1878
+ log.raw(``);
1789
1879
  if (!commit) {
1790
- log.raw(``);
1791
1880
  log.help(messages.nodes.commitTip());
1792
1881
  }
1793
1882
  } else {
1794
- if (noChange) {
1883
+ if (noChanges && !err && !nodesErrored) {
1795
1884
  log.help(messages.nodes.noChange(currentEnv));
1796
1885
  } else {
1797
1886
  log.error(messages.nodes.failedImport(currentEnv), err);
1798
- if (!nodesTotalCount) log.help(messages.nodes.notFound(currentEnv));
1887
+ if (!nodesMigrateCount) log.help(messages.nodes.notFound(currentEnv));
1799
1888
  }
1800
1889
  }
1801
1890
  } else {
@@ -1804,6 +1893,54 @@ class ContensisCli {
1804
1893
  }
1805
1894
  };
1806
1895
 
1896
+ RemoveNodes = async (commit = false) => {
1897
+ const { currentEnv, currentProject, log, messages } = this;
1898
+ const contensis = await this.ConnectContensisImport({
1899
+ commit,
1900
+ importDataType: 'user-input', // 'user-input' import type does not require a source cms
1901
+ });
1902
+
1903
+ if (contensis) {
1904
+ if (contensis.isPreview) {
1905
+ console.log(log.successText(` -- PREVIEW -- `));
1906
+ } else {
1907
+ console.log(log.warningText(` *** COMMITTING DELETE *** `));
1908
+ }
1909
+ const [err, result] = await contensis.DeleteNodes();
1910
+ if (result) {
1911
+ this.HandleFormattingAndOutput(result, () => {
1912
+ // print the migrateResult to console
1913
+ printNodeTreeOutput(
1914
+ this,
1915
+ contensis.nodes.targetRepos[currentProject].nodes
1916
+ .migrateNodesTreeView
1917
+ );
1918
+ // printNodesMigrateResult(this, result, {
1919
+ // action: 'delete',
1920
+ // showAll: true,
1921
+ // });
1922
+ });
1923
+ }
1924
+ if (
1925
+ !err &&
1926
+ ((!commit && result.nodesToMigrate[currentProject].totalCount) ||
1927
+ (commit && result.nodesResult?.deleted))
1928
+ ) {
1929
+ log.success(
1930
+ messages.nodes.removed(currentEnv, commit, contensis.nodes.rootPath)
1931
+ );
1932
+ log.raw(``);
1933
+ if (!commit) {
1934
+ log.help(messages.nodes.commitTip());
1935
+ }
1936
+ } else {
1937
+ log.error(messages.nodes.failedRemove(currentEnv), err);
1938
+ if (!result?.nodesToMigrate?.[currentProject]?.totalCount)
1939
+ log.help(messages.nodes.notFound(currentEnv));
1940
+ }
1941
+ }
1942
+ };
1943
+
1807
1944
  PrintWebhookSubscriptions = async (subscriptionIdsOrNames?: string[]) => {
1808
1945
  const { currentEnv, log, messages } = this;
1809
1946
  const contensis = await this.ConnectContensis();
@@ -2354,18 +2491,20 @@ class ContensisCli {
2354
2491
  };
2355
2492
  HandleFormattingAndOutput = <T>(obj: T, logFn: (obj: T) => void) => {
2356
2493
  const { format, log, messages, output } = this;
2494
+ const fields = this.contensis?.payload.query?.fields;
2495
+
2357
2496
  if (!format) {
2358
2497
  // print the object to console
2359
2498
  logFn(obj);
2360
2499
  } else if (format === 'csv') {
2361
2500
  log.raw('');
2362
- log.raw(log.infoText(csvFormatter(obj)));
2501
+ log.raw(log.infoText(csvFormatter(limitFields(obj, fields))));
2363
2502
  } else if (format === 'xml') {
2364
2503
  log.raw('');
2365
- log.raw(log.infoText(xmlFormatter(obj)));
2504
+ log.raw(log.infoText(xmlFormatter(limitFields(obj, fields))));
2366
2505
  } else if (format === 'json') {
2367
2506
  log.raw('');
2368
- log.raw(log.infoText(jsonFormatter(obj)));
2507
+ log.raw(log.infoText(jsonFormatter(obj, fields)));
2369
2508
  }
2370
2509
  log.raw('');
2371
2510
 
@@ -2373,10 +2512,11 @@ class ContensisCli {
2373
2512
  let writeString = '';
2374
2513
  const isText = !tryParse(obj) && typeof obj === 'string';
2375
2514
  if (format === 'csv') {
2376
- writeString = csvFormatter(obj as any);
2515
+ writeString = csvFormatter(limitFields(obj, fields));
2377
2516
  } else if (format === 'xml') {
2378
- writeString = xmlFormatter(obj as any);
2379
- } else writeString = isText ? (obj as string) : jsonFormatter(obj);
2517
+ writeString = xmlFormatter(limitFields(obj, fields));
2518
+ } else
2519
+ writeString = isText ? (obj as string) : jsonFormatter(obj, fields);
2380
2520
  // write output to file
2381
2521
  if (writeString) {
2382
2522
  fs.writeFileSync(output, writeString);