@aderis-erp/cli 1.0.15 → 1.0.17

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 (163) hide show
  1. package/README.md +30 -8
  2. package/dist/commands/access-groups.d.ts +0 -1
  3. package/dist/commands/access-groups.js +5 -61
  4. package/dist/commands/account-transaction-allocations.d.ts +0 -1
  5. package/dist/commands/account-transaction-allocations.js +5 -61
  6. package/dist/commands/account-transactions.d.ts +0 -1
  7. package/dist/commands/account-transactions.js +9 -63
  8. package/dist/commands/accounts.d.ts +0 -1
  9. package/dist/commands/accounts.js +5 -61
  10. package/dist/commands/agent-platform.d.ts +0 -1
  11. package/dist/commands/agent-platform.js +5 -61
  12. package/dist/commands/analytics.d.ts +0 -1
  13. package/dist/commands/analytics.js +5 -61
  14. package/dist/commands/api-keys.d.ts +39 -0
  15. package/dist/commands/api-keys.js +1117 -0
  16. package/dist/commands/audit-log.d.ts +0 -1
  17. package/dist/commands/audit-log.js +5 -61
  18. package/dist/commands/auth/login.d.ts +9 -0
  19. package/dist/commands/auth/login.js +73 -20
  20. package/dist/commands/auth/logout.d.ts +4 -0
  21. package/dist/commands/auth/logout.js +4 -0
  22. package/dist/commands/auth/status.js +26 -17
  23. package/dist/commands/auth/tenant.js +3 -6
  24. package/dist/commands/auth.d.ts +0 -1
  25. package/dist/commands/auth.js +5 -34
  26. package/dist/commands/bank-accounts.d.ts +0 -1
  27. package/dist/commands/bank-accounts.js +5 -61
  28. package/dist/commands/bank-integrations.d.ts +0 -1
  29. package/dist/commands/bank-integrations.js +5 -61
  30. package/dist/commands/business-partners.d.ts +1 -1
  31. package/dist/commands/business-partners.js +14 -63
  32. package/dist/commands/chat.d.ts +0 -1
  33. package/dist/commands/chat.js +5 -61
  34. package/dist/commands/config/add.d.ts +3 -0
  35. package/dist/commands/config/add.js +34 -16
  36. package/dist/commands/config/current.js +3 -0
  37. package/dist/commands/config/list.js +3 -0
  38. package/dist/commands/credit-card-accounts.d.ts +0 -1
  39. package/dist/commands/credit-card-accounts.js +5 -61
  40. package/dist/commands/delivery-notes.d.ts +0 -1
  41. package/dist/commands/delivery-notes.js +7 -63
  42. package/dist/commands/dunning-configs.d.ts +0 -1
  43. package/dist/commands/dunning-configs.js +5 -61
  44. package/dist/commands/dunning-reminders.d.ts +0 -1
  45. package/dist/commands/dunning-reminders.js +5 -61
  46. package/dist/commands/dunning-runs.d.ts +0 -1
  47. package/dist/commands/dunning-runs.js +5 -61
  48. package/dist/commands/email-transactions.d.ts +0 -1
  49. package/dist/commands/email-transactions.js +5 -61
  50. package/dist/commands/employees.d.ts +0 -1
  51. package/dist/commands/employees.js +5 -61
  52. package/dist/commands/entity-configurations.d.ts +0 -1
  53. package/dist/commands/entity-configurations.js +5 -61
  54. package/dist/commands/event-processor-mappings.d.ts +0 -1
  55. package/dist/commands/event-processor-mappings.js +5 -61
  56. package/dist/commands/files.d.ts +0 -1
  57. package/dist/commands/files.js +5 -61
  58. package/dist/commands/health.d.ts +0 -1
  59. package/dist/commands/health.js +5 -61
  60. package/dist/commands/inbox.d.ts +0 -1
  61. package/dist/commands/inbox.js +5 -61
  62. package/dist/commands/integrations.d.ts +0 -1
  63. package/dist/commands/integrations.js +5 -61
  64. package/dist/commands/item-categories.d.ts +0 -1
  65. package/dist/commands/item-categories.js +5 -61
  66. package/dist/commands/items.d.ts +0 -1
  67. package/dist/commands/items.js +5 -61
  68. package/dist/commands/journal-lines.d.ts +0 -1
  69. package/dist/commands/journal-lines.js +5 -61
  70. package/dist/commands/journals.d.ts +1 -1
  71. package/dist/commands/journals.js +9 -62
  72. package/dist/commands/ledgers.d.ts +0 -1
  73. package/dist/commands/ledgers.js +5 -61
  74. package/dist/commands/nango-integrations.d.ts +39 -0
  75. package/dist/commands/nango-integrations.js +1115 -0
  76. package/dist/commands/office-locations.d.ts +0 -1
  77. package/dist/commands/office-locations.js +5 -61
  78. package/dist/commands/payment-methods.d.ts +0 -1
  79. package/dist/commands/payment-methods.js +5 -61
  80. package/dist/commands/payment-runs.d.ts +0 -1
  81. package/dist/commands/payment-runs.js +5 -61
  82. package/dist/commands/payment-terms.d.ts +0 -1
  83. package/dist/commands/payment-terms.js +5 -61
  84. package/dist/commands/payments.d.ts +0 -1
  85. package/dist/commands/payments.js +5 -61
  86. package/dist/commands/price-lists.d.ts +0 -1
  87. package/dist/commands/price-lists.js +5 -61
  88. package/dist/commands/processor-mappings.d.ts +0 -1
  89. package/dist/commands/processor-mappings.js +5 -61
  90. package/dist/commands/processors.d.ts +0 -1
  91. package/dist/commands/processors.js +5 -61
  92. package/dist/commands/purchase-order-types.d.ts +0 -1
  93. package/dist/commands/purchase-order-types.js +5 -61
  94. package/dist/commands/purchase-orders.d.ts +0 -1
  95. package/dist/commands/purchase-orders.js +7 -63
  96. package/dist/commands/reports.d.ts +0 -1
  97. package/dist/commands/reports.js +6 -62
  98. package/dist/commands/salary-types.d.ts +0 -1
  99. package/dist/commands/salary-types.js +5 -61
  100. package/dist/commands/sales-invoices.d.ts +0 -1
  101. package/dist/commands/sales-invoices.js +12 -65
  102. package/dist/commands/sales-orders.d.ts +0 -1
  103. package/dist/commands/sales-orders.js +7 -63
  104. package/dist/commands/saved-views.d.ts +0 -1
  105. package/dist/commands/saved-views.js +5 -61
  106. package/dist/commands/scheduled-processor-mappings.d.ts +0 -1
  107. package/dist/commands/scheduled-processor-mappings.js +5 -61
  108. package/dist/commands/schedules.d.ts +0 -1
  109. package/dist/commands/schedules.js +5 -61
  110. package/dist/commands/switch.js +4 -4
  111. package/dist/commands/tag-configurations.d.ts +0 -1
  112. package/dist/commands/tag-configurations.js +9 -64
  113. package/dist/commands/tags.d.ts +0 -1
  114. package/dist/commands/tags.js +5 -61
  115. package/dist/commands/tax-codes.d.ts +0 -1
  116. package/dist/commands/tax-codes.js +5 -61
  117. package/dist/commands/tax-matrix.d.ts +0 -1
  118. package/dist/commands/tax-matrix.js +5 -61
  119. package/dist/commands/tenants.d.ts +0 -1
  120. package/dist/commands/tenants.js +7 -62
  121. package/dist/commands/text-templates.d.ts +0 -1
  122. package/dist/commands/text-templates.js +5 -61
  123. package/dist/commands/tools.d.ts +0 -1
  124. package/dist/commands/tools.js +5 -61
  125. package/dist/commands/vat-declarations.d.ts +1 -1
  126. package/dist/commands/vat-declarations.js +11 -62
  127. package/dist/commands/vendor-invoices.d.ts +0 -1
  128. package/dist/commands/vendor-invoices.js +10 -65
  129. package/dist/commands/webhooks.d.ts +0 -1
  130. package/dist/commands/webhooks.js +5 -61
  131. package/dist/commands/workflows.d.ts +0 -1
  132. package/dist/commands/workflows.js +5 -61
  133. package/dist/lib/api-client.js +3 -6
  134. package/dist/lib/auth/constants.d.ts +11 -0
  135. package/dist/lib/auth/constants.js +11 -0
  136. package/dist/lib/auth/errors.d.ts +17 -0
  137. package/dist/lib/auth/errors.js +22 -0
  138. package/dist/lib/auth/flow.d.ts +27 -0
  139. package/dist/lib/auth/flow.js +163 -0
  140. package/dist/lib/auth/guards.d.ts +5 -0
  141. package/dist/lib/auth/guards.js +14 -0
  142. package/dist/lib/auth/http.d.ts +16 -0
  143. package/dist/lib/auth/http.js +49 -0
  144. package/dist/lib/auth/index.d.ts +49 -0
  145. package/dist/lib/auth/index.js +217 -0
  146. package/dist/lib/auth/keycloak-provider.d.ts +75 -0
  147. package/dist/lib/auth/keycloak-provider.js +215 -0
  148. package/dist/lib/auth/pages.d.ts +25 -0
  149. package/dist/lib/auth/pages.js +123 -0
  150. package/dist/lib/auth/pkce.d.ts +11 -0
  151. package/dist/lib/auth/pkce.js +17 -0
  152. package/dist/lib/auth/tokens.d.ts +54 -0
  153. package/dist/lib/auth/tokens.js +104 -0
  154. package/dist/lib/auth/types.d.ts +57 -0
  155. package/dist/lib/auth/types.js +1 -0
  156. package/dist/lib/auth/validated-url.d.ts +6 -0
  157. package/dist/lib/auth/validated-url.js +53 -0
  158. package/dist/lib/config.d.ts +13 -3
  159. package/dist/lib/config.js +24 -19
  160. package/oclif.manifest.json +440 -71
  161. package/package.json +2 -1
  162. package/dist/lib/auth.d.ts +0 -43
  163. package/dist/lib/auth.js +0 -610
@@ -38,7 +38,7 @@ export default class EmailTransactions extends Command {
38
38
  'sort-by': Flags.string({ description: 'Sort field(s), comma-separated. Direction (:ASC/:DESC) is optional; date-like fields default to DESC, others to ASC.' }),
39
39
  filter: Flags.string({ description: 'Filter (e.g. --filter status=ACTIVE). Operators: in:A,B, like:%, gt:, lt:, null:', multiple: true }),
40
40
  query: Flags.string({ description: 'Additional query params as JSON' }),
41
- fields: Flags.string({ description: 'Comma-separated list of fields to show (e.g. --fields=id,name,status)' }),
41
+ fields: Flags.string({ description: 'Comma-separated list of fields to return, applied by the API (e.g. --fields=id,name,status)' }),
42
42
  sanitize: Flags.boolean({ description: 'Remove null values, audit fields, and duplicate UUIDs from output' }),
43
43
  'show-http-request': Flags.boolean({ description: 'Show HTTP request details (method, URL, body)' }),
44
44
  };
@@ -110,6 +110,8 @@ export default class EmailTransactions extends Command {
110
110
  queryParams.search = flags.search;
111
111
  if (flags['sort-by'])
112
112
  queryParams.sortBy = normalizeSortBy(flags['sort-by']);
113
+ if (flags.fields)
114
+ queryParams.fields = flags.fields;
113
115
  if (flags.query) {
114
116
  try {
115
117
  Object.assign(queryParams, JSON.parse(flags.query));
@@ -312,11 +314,6 @@ export default class EmailTransactions extends Command {
312
314
  output = obj[arrayKeys[0]];
313
315
  }
314
316
  }
315
- // Filter fields if --fields flag is provided
316
- if (flags.fields) {
317
- const fieldList = flags.fields.split(',').map(f => f.trim());
318
- output = this.filterFields(output, fieldList);
319
- }
320
317
  // Sanitize output if requested
321
318
  if (flags.sanitize) {
322
319
  output = this.sanitizeOutput(output);
@@ -571,6 +568,8 @@ export default class EmailTransactions extends Command {
571
568
  baseParams.sortBy = normalizeSortBy(flags['sort-by']);
572
569
  if (flags.include)
573
570
  baseParams.include = flags.include;
571
+ if (flags.fields)
572
+ baseParams.fields = flags.fields;
574
573
  if (flags.query) {
575
574
  try {
576
575
  Object.assign(baseParams, JSON.parse(flags.query));
@@ -625,12 +624,7 @@ export default class EmailTransactions extends Command {
625
624
  }
626
625
  }
627
626
  process.stderr.write(' done\n');
628
- // Filter fields if specified
629
627
  let output = allItems;
630
- if (flags.fields) {
631
- const fieldList = flags.fields.split(',').map(f => f.trim());
632
- output = this.filterFields(allItems, fieldList);
633
- }
634
628
  // Sanitize output if requested
635
629
  if (flags.sanitize) {
636
630
  output = this.sanitizeOutput(output);
@@ -959,56 +953,6 @@ export default class EmailTransactions extends Command {
959
953
  return `\$${op}`;
960
954
  return opRe.test(rest) ? `\$${op}:${this.parseFilterValue(rest)}` : `\$${op}:${rest}`;
961
955
  }
962
- filterFields(data, fields) {
963
- const isUnsafeKey = (k) => k === '__proto__' || k === 'constructor' || k === 'prototype';
964
- const pick = (obj, keys) => {
965
- // Group keys by their first segment so sibling sub-paths
966
- // (e.g. 'items.amount' + 'items._type') resolve in one recursive pass
967
- // and don't clobber each other on merge.
968
- const directKeys = new Set();
969
- const nestedKeys = new Map();
970
- for (const key of keys) {
971
- if (key.split('.').some(isUnsafeKey))
972
- continue;
973
- if (key.includes('.')) {
974
- const [first, ...rest] = key.split('.');
975
- if (isUnsafeKey(first))
976
- continue;
977
- const list = nestedKeys.get(first);
978
- if (list) {
979
- list.push(rest.join('.'));
980
- }
981
- else {
982
- nestedKeys.set(first, [rest.join('.')]);
983
- }
984
- }
985
- else {
986
- directKeys.add(key);
987
- }
988
- }
989
- const result = {};
990
- for (const key of directKeys) {
991
- if (key in obj)
992
- result[key] = obj[key];
993
- }
994
- for (const [first, restKeys] of nestedKeys) {
995
- const val = obj[first];
996
- if (!val || typeof val !== 'object')
997
- continue;
998
- if (Array.isArray(val)) {
999
- result[first] = val.map(item => pick(item, restKeys));
1000
- }
1001
- else {
1002
- result[first] = pick(val, restKeys);
1003
- }
1004
- }
1005
- return result;
1006
- };
1007
- if (Array.isArray(data)) {
1008
- return data.map(item => pick(item, fields));
1009
- }
1010
- return pick(data, fields);
1011
- }
1012
956
  sanitizeOutput(data) {
1013
957
  const auditFields = ['_type', 'tenantId', 'createdAt', 'updatedAt', 'createdBy', 'updatedBy'];
1014
958
  const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
@@ -35,7 +35,6 @@ export default class Employees extends Command {
35
35
  private runCamt053Import;
36
36
  private runNestedImport;
37
37
  private parseFilterValue;
38
- private filterFields;
39
38
  private sanitizeOutput;
40
39
  private getColumns;
41
40
  private getValue;
@@ -74,7 +74,7 @@ export default class Employees extends Command {
74
74
  'sort-by': Flags.string({ description: 'Sort field(s), comma-separated. Direction (:ASC/:DESC) is optional; date-like fields default to DESC, others to ASC.' }),
75
75
  filter: Flags.string({ description: 'Filter (e.g. --filter status=ACTIVE). Operators: in:A,B, like:%, gt:, lt:, null:', multiple: true }),
76
76
  query: Flags.string({ description: 'Additional query params as JSON' }),
77
- fields: Flags.string({ description: 'Comma-separated list of fields to show (e.g. --fields=id,name,status)' }),
77
+ fields: Flags.string({ description: 'Comma-separated list of fields to return, applied by the API (e.g. --fields=id,name,status)' }),
78
78
  sanitize: Flags.boolean({ description: 'Remove null values, audit fields, and duplicate UUIDs from output' }),
79
79
  'show-http-request': Flags.boolean({ description: 'Show HTTP request details (method, URL, body)' }),
80
80
  };
@@ -146,6 +146,8 @@ export default class Employees extends Command {
146
146
  queryParams.search = flags.search;
147
147
  if (flags['sort-by'])
148
148
  queryParams.sortBy = normalizeSortBy(flags['sort-by']);
149
+ if (flags.fields)
150
+ queryParams.fields = flags.fields;
149
151
  if (flags.query) {
150
152
  try {
151
153
  Object.assign(queryParams, JSON.parse(flags.query));
@@ -348,11 +350,6 @@ export default class Employees extends Command {
348
350
  output = obj[arrayKeys[0]];
349
351
  }
350
352
  }
351
- // Filter fields if --fields flag is provided
352
- if (flags.fields) {
353
- const fieldList = flags.fields.split(',').map(f => f.trim());
354
- output = this.filterFields(output, fieldList);
355
- }
356
353
  // Sanitize output if requested
357
354
  if (flags.sanitize) {
358
355
  output = this.sanitizeOutput(output);
@@ -607,6 +604,8 @@ export default class Employees extends Command {
607
604
  baseParams.sortBy = normalizeSortBy(flags['sort-by']);
608
605
  if (flags.include)
609
606
  baseParams.include = flags.include;
607
+ if (flags.fields)
608
+ baseParams.fields = flags.fields;
610
609
  if (flags.query) {
611
610
  try {
612
611
  Object.assign(baseParams, JSON.parse(flags.query));
@@ -661,12 +660,7 @@ export default class Employees extends Command {
661
660
  }
662
661
  }
663
662
  process.stderr.write(' done\n');
664
- // Filter fields if specified
665
663
  let output = allItems;
666
- if (flags.fields) {
667
- const fieldList = flags.fields.split(',').map(f => f.trim());
668
- output = this.filterFields(allItems, fieldList);
669
- }
670
664
  // Sanitize output if requested
671
665
  if (flags.sanitize) {
672
666
  output = this.sanitizeOutput(output);
@@ -995,56 +989,6 @@ export default class Employees extends Command {
995
989
  return `\$${op}`;
996
990
  return opRe.test(rest) ? `\$${op}:${this.parseFilterValue(rest)}` : `\$${op}:${rest}`;
997
991
  }
998
- filterFields(data, fields) {
999
- const isUnsafeKey = (k) => k === '__proto__' || k === 'constructor' || k === 'prototype';
1000
- const pick = (obj, keys) => {
1001
- // Group keys by their first segment so sibling sub-paths
1002
- // (e.g. 'items.amount' + 'items._type') resolve in one recursive pass
1003
- // and don't clobber each other on merge.
1004
- const directKeys = new Set();
1005
- const nestedKeys = new Map();
1006
- for (const key of keys) {
1007
- if (key.split('.').some(isUnsafeKey))
1008
- continue;
1009
- if (key.includes('.')) {
1010
- const [first, ...rest] = key.split('.');
1011
- if (isUnsafeKey(first))
1012
- continue;
1013
- const list = nestedKeys.get(first);
1014
- if (list) {
1015
- list.push(rest.join('.'));
1016
- }
1017
- else {
1018
- nestedKeys.set(first, [rest.join('.')]);
1019
- }
1020
- }
1021
- else {
1022
- directKeys.add(key);
1023
- }
1024
- }
1025
- const result = {};
1026
- for (const key of directKeys) {
1027
- if (key in obj)
1028
- result[key] = obj[key];
1029
- }
1030
- for (const [first, restKeys] of nestedKeys) {
1031
- const val = obj[first];
1032
- if (!val || typeof val !== 'object')
1033
- continue;
1034
- if (Array.isArray(val)) {
1035
- result[first] = val.map(item => pick(item, restKeys));
1036
- }
1037
- else {
1038
- result[first] = pick(val, restKeys);
1039
- }
1040
- }
1041
- return result;
1042
- };
1043
- if (Array.isArray(data)) {
1044
- return data.map(item => pick(item, fields));
1045
- }
1046
- return pick(data, fields);
1047
- }
1048
992
  sanitizeOutput(data) {
1049
993
  const auditFields = ['_type', 'tenantId', 'createdAt', 'updatedAt', 'createdBy', 'updatedBy'];
1050
994
  const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
@@ -31,7 +31,6 @@ export default class EntityConfigurations extends Command {
31
31
  private runCamt053Import;
32
32
  private runNestedImport;
33
33
  private parseFilterValue;
34
- private filterFields;
35
34
  private sanitizeOutput;
36
35
  private getColumns;
37
36
  private getValue;
@@ -34,7 +34,7 @@ export default class EntityConfigurations extends Command {
34
34
  'sort-by': Flags.string({ description: 'Sort field(s), comma-separated. Direction (:ASC/:DESC) is optional; date-like fields default to DESC, others to ASC.' }),
35
35
  filter: Flags.string({ description: 'Filter (e.g. --filter status=ACTIVE). Operators: in:A,B, like:%, gt:, lt:, null:', multiple: true }),
36
36
  query: Flags.string({ description: 'Additional query params as JSON' }),
37
- fields: Flags.string({ description: 'Comma-separated list of fields to show (e.g. --fields=id,name,status)' }),
37
+ fields: Flags.string({ description: 'Comma-separated list of fields to return, applied by the API (e.g. --fields=id,name,status)' }),
38
38
  sanitize: Flags.boolean({ description: 'Remove null values, audit fields, and duplicate UUIDs from output' }),
39
39
  'show-http-request': Flags.boolean({ description: 'Show HTTP request details (method, URL, body)' }),
40
40
  };
@@ -106,6 +106,8 @@ export default class EntityConfigurations extends Command {
106
106
  queryParams.search = flags.search;
107
107
  if (flags['sort-by'])
108
108
  queryParams.sortBy = normalizeSortBy(flags['sort-by']);
109
+ if (flags.fields)
110
+ queryParams.fields = flags.fields;
109
111
  if (flags.query) {
110
112
  try {
111
113
  Object.assign(queryParams, JSON.parse(flags.query));
@@ -308,11 +310,6 @@ export default class EntityConfigurations extends Command {
308
310
  output = obj[arrayKeys[0]];
309
311
  }
310
312
  }
311
- // Filter fields if --fields flag is provided
312
- if (flags.fields) {
313
- const fieldList = flags.fields.split(',').map(f => f.trim());
314
- output = this.filterFields(output, fieldList);
315
- }
316
313
  // Sanitize output if requested
317
314
  if (flags.sanitize) {
318
315
  output = this.sanitizeOutput(output);
@@ -567,6 +564,8 @@ export default class EntityConfigurations extends Command {
567
564
  baseParams.sortBy = normalizeSortBy(flags['sort-by']);
568
565
  if (flags.include)
569
566
  baseParams.include = flags.include;
567
+ if (flags.fields)
568
+ baseParams.fields = flags.fields;
570
569
  if (flags.query) {
571
570
  try {
572
571
  Object.assign(baseParams, JSON.parse(flags.query));
@@ -621,12 +620,7 @@ export default class EntityConfigurations extends Command {
621
620
  }
622
621
  }
623
622
  process.stderr.write(' done\n');
624
- // Filter fields if specified
625
623
  let output = allItems;
626
- if (flags.fields) {
627
- const fieldList = flags.fields.split(',').map(f => f.trim());
628
- output = this.filterFields(allItems, fieldList);
629
- }
630
624
  // Sanitize output if requested
631
625
  if (flags.sanitize) {
632
626
  output = this.sanitizeOutput(output);
@@ -955,56 +949,6 @@ export default class EntityConfigurations extends Command {
955
949
  return `\$${op}`;
956
950
  return opRe.test(rest) ? `\$${op}:${this.parseFilterValue(rest)}` : `\$${op}:${rest}`;
957
951
  }
958
- filterFields(data, fields) {
959
- const isUnsafeKey = (k) => k === '__proto__' || k === 'constructor' || k === 'prototype';
960
- const pick = (obj, keys) => {
961
- // Group keys by their first segment so sibling sub-paths
962
- // (e.g. 'items.amount' + 'items._type') resolve in one recursive pass
963
- // and don't clobber each other on merge.
964
- const directKeys = new Set();
965
- const nestedKeys = new Map();
966
- for (const key of keys) {
967
- if (key.split('.').some(isUnsafeKey))
968
- continue;
969
- if (key.includes('.')) {
970
- const [first, ...rest] = key.split('.');
971
- if (isUnsafeKey(first))
972
- continue;
973
- const list = nestedKeys.get(first);
974
- if (list) {
975
- list.push(rest.join('.'));
976
- }
977
- else {
978
- nestedKeys.set(first, [rest.join('.')]);
979
- }
980
- }
981
- else {
982
- directKeys.add(key);
983
- }
984
- }
985
- const result = {};
986
- for (const key of directKeys) {
987
- if (key in obj)
988
- result[key] = obj[key];
989
- }
990
- for (const [first, restKeys] of nestedKeys) {
991
- const val = obj[first];
992
- if (!val || typeof val !== 'object')
993
- continue;
994
- if (Array.isArray(val)) {
995
- result[first] = val.map(item => pick(item, restKeys));
996
- }
997
- else {
998
- result[first] = pick(val, restKeys);
999
- }
1000
- }
1001
- return result;
1002
- };
1003
- if (Array.isArray(data)) {
1004
- return data.map(item => pick(item, fields));
1005
- }
1006
- return pick(data, fields);
1007
- }
1008
952
  sanitizeOutput(data) {
1009
953
  const auditFields = ['_type', 'tenantId', 'createdAt', 'updatedAt', 'createdBy', 'updatedBy'];
1010
954
  const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
@@ -31,7 +31,6 @@ export default class EventProcessorMappings extends Command {
31
31
  private runCamt053Import;
32
32
  private runNestedImport;
33
33
  private parseFilterValue;
34
- private filterFields;
35
34
  private sanitizeOutput;
36
35
  private getColumns;
37
36
  private getValue;
@@ -42,7 +42,7 @@ export default class EventProcessorMappings extends Command {
42
42
  'sort-by': Flags.string({ description: 'Sort field(s), comma-separated. Direction (:ASC/:DESC) is optional; date-like fields default to DESC, others to ASC.' }),
43
43
  filter: Flags.string({ description: 'Filter (e.g. --filter status=ACTIVE). Operators: in:A,B, like:%, gt:, lt:, null:', multiple: true }),
44
44
  query: Flags.string({ description: 'Additional query params as JSON' }),
45
- fields: Flags.string({ description: 'Comma-separated list of fields to show (e.g. --fields=id,name,status)' }),
45
+ fields: Flags.string({ description: 'Comma-separated list of fields to return, applied by the API (e.g. --fields=id,name,status)' }),
46
46
  sanitize: Flags.boolean({ description: 'Remove null values, audit fields, and duplicate UUIDs from output' }),
47
47
  'show-http-request': Flags.boolean({ description: 'Show HTTP request details (method, URL, body)' }),
48
48
  };
@@ -114,6 +114,8 @@ export default class EventProcessorMappings extends Command {
114
114
  queryParams.search = flags.search;
115
115
  if (flags['sort-by'])
116
116
  queryParams.sortBy = normalizeSortBy(flags['sort-by']);
117
+ if (flags.fields)
118
+ queryParams.fields = flags.fields;
117
119
  if (flags.query) {
118
120
  try {
119
121
  Object.assign(queryParams, JSON.parse(flags.query));
@@ -316,11 +318,6 @@ export default class EventProcessorMappings extends Command {
316
318
  output = obj[arrayKeys[0]];
317
319
  }
318
320
  }
319
- // Filter fields if --fields flag is provided
320
- if (flags.fields) {
321
- const fieldList = flags.fields.split(',').map(f => f.trim());
322
- output = this.filterFields(output, fieldList);
323
- }
324
321
  // Sanitize output if requested
325
322
  if (flags.sanitize) {
326
323
  output = this.sanitizeOutput(output);
@@ -575,6 +572,8 @@ export default class EventProcessorMappings extends Command {
575
572
  baseParams.sortBy = normalizeSortBy(flags['sort-by']);
576
573
  if (flags.include)
577
574
  baseParams.include = flags.include;
575
+ if (flags.fields)
576
+ baseParams.fields = flags.fields;
578
577
  if (flags.query) {
579
578
  try {
580
579
  Object.assign(baseParams, JSON.parse(flags.query));
@@ -629,12 +628,7 @@ export default class EventProcessorMappings extends Command {
629
628
  }
630
629
  }
631
630
  process.stderr.write(' done\n');
632
- // Filter fields if specified
633
631
  let output = allItems;
634
- if (flags.fields) {
635
- const fieldList = flags.fields.split(',').map(f => f.trim());
636
- output = this.filterFields(allItems, fieldList);
637
- }
638
632
  // Sanitize output if requested
639
633
  if (flags.sanitize) {
640
634
  output = this.sanitizeOutput(output);
@@ -963,56 +957,6 @@ export default class EventProcessorMappings extends Command {
963
957
  return `\$${op}`;
964
958
  return opRe.test(rest) ? `\$${op}:${this.parseFilterValue(rest)}` : `\$${op}:${rest}`;
965
959
  }
966
- filterFields(data, fields) {
967
- const isUnsafeKey = (k) => k === '__proto__' || k === 'constructor' || k === 'prototype';
968
- const pick = (obj, keys) => {
969
- // Group keys by their first segment so sibling sub-paths
970
- // (e.g. 'items.amount' + 'items._type') resolve in one recursive pass
971
- // and don't clobber each other on merge.
972
- const directKeys = new Set();
973
- const nestedKeys = new Map();
974
- for (const key of keys) {
975
- if (key.split('.').some(isUnsafeKey))
976
- continue;
977
- if (key.includes('.')) {
978
- const [first, ...rest] = key.split('.');
979
- if (isUnsafeKey(first))
980
- continue;
981
- const list = nestedKeys.get(first);
982
- if (list) {
983
- list.push(rest.join('.'));
984
- }
985
- else {
986
- nestedKeys.set(first, [rest.join('.')]);
987
- }
988
- }
989
- else {
990
- directKeys.add(key);
991
- }
992
- }
993
- const result = {};
994
- for (const key of directKeys) {
995
- if (key in obj)
996
- result[key] = obj[key];
997
- }
998
- for (const [first, restKeys] of nestedKeys) {
999
- const val = obj[first];
1000
- if (!val || typeof val !== 'object')
1001
- continue;
1002
- if (Array.isArray(val)) {
1003
- result[first] = val.map(item => pick(item, restKeys));
1004
- }
1005
- else {
1006
- result[first] = pick(val, restKeys);
1007
- }
1008
- }
1009
- return result;
1010
- };
1011
- if (Array.isArray(data)) {
1012
- return data.map(item => pick(item, fields));
1013
- }
1014
- return pick(data, fields);
1015
- }
1016
960
  sanitizeOutput(data) {
1017
961
  const auditFields = ['_type', 'tenantId', 'createdAt', 'updatedAt', 'createdBy', 'updatedBy'];
1018
962
  const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
@@ -31,7 +31,6 @@ export default class Files extends Command {
31
31
  private runCamt053Import;
32
32
  private runNestedImport;
33
33
  private parseFilterValue;
34
- private filterFields;
35
34
  private sanitizeOutput;
36
35
  private getColumns;
37
36
  private getValue;
@@ -50,7 +50,7 @@ export default class Files extends Command {
50
50
  'sort-by': Flags.string({ description: 'Sort field(s), comma-separated. Direction (:ASC/:DESC) is optional; date-like fields default to DESC, others to ASC.' }),
51
51
  filter: Flags.string({ description: 'Filter (e.g. --filter status=ACTIVE). Operators: in:A,B, like:%, gt:, lt:, null:', multiple: true }),
52
52
  query: Flags.string({ description: 'Additional query params as JSON' }),
53
- fields: Flags.string({ description: 'Comma-separated list of fields to show (e.g. --fields=id,name,status)' }),
53
+ fields: Flags.string({ description: 'Comma-separated list of fields to return, applied by the API (e.g. --fields=id,name,status)' }),
54
54
  sanitize: Flags.boolean({ description: 'Remove null values, audit fields, and duplicate UUIDs from output' }),
55
55
  'show-http-request': Flags.boolean({ description: 'Show HTTP request details (method, URL, body)' }),
56
56
  };
@@ -122,6 +122,8 @@ export default class Files extends Command {
122
122
  queryParams.search = flags.search;
123
123
  if (flags['sort-by'])
124
124
  queryParams.sortBy = normalizeSortBy(flags['sort-by']);
125
+ if (flags.fields)
126
+ queryParams.fields = flags.fields;
125
127
  if (flags.query) {
126
128
  try {
127
129
  Object.assign(queryParams, JSON.parse(flags.query));
@@ -324,11 +326,6 @@ export default class Files extends Command {
324
326
  output = obj[arrayKeys[0]];
325
327
  }
326
328
  }
327
- // Filter fields if --fields flag is provided
328
- if (flags.fields) {
329
- const fieldList = flags.fields.split(',').map(f => f.trim());
330
- output = this.filterFields(output, fieldList);
331
- }
332
329
  // Sanitize output if requested
333
330
  if (flags.sanitize) {
334
331
  output = this.sanitizeOutput(output);
@@ -583,6 +580,8 @@ export default class Files extends Command {
583
580
  baseParams.sortBy = normalizeSortBy(flags['sort-by']);
584
581
  if (flags.include)
585
582
  baseParams.include = flags.include;
583
+ if (flags.fields)
584
+ baseParams.fields = flags.fields;
586
585
  if (flags.query) {
587
586
  try {
588
587
  Object.assign(baseParams, JSON.parse(flags.query));
@@ -637,12 +636,7 @@ export default class Files extends Command {
637
636
  }
638
637
  }
639
638
  process.stderr.write(' done\n');
640
- // Filter fields if specified
641
639
  let output = allItems;
642
- if (flags.fields) {
643
- const fieldList = flags.fields.split(',').map(f => f.trim());
644
- output = this.filterFields(allItems, fieldList);
645
- }
646
640
  // Sanitize output if requested
647
641
  if (flags.sanitize) {
648
642
  output = this.sanitizeOutput(output);
@@ -971,56 +965,6 @@ export default class Files extends Command {
971
965
  return `\$${op}`;
972
966
  return opRe.test(rest) ? `\$${op}:${this.parseFilterValue(rest)}` : `\$${op}:${rest}`;
973
967
  }
974
- filterFields(data, fields) {
975
- const isUnsafeKey = (k) => k === '__proto__' || k === 'constructor' || k === 'prototype';
976
- const pick = (obj, keys) => {
977
- // Group keys by their first segment so sibling sub-paths
978
- // (e.g. 'items.amount' + 'items._type') resolve in one recursive pass
979
- // and don't clobber each other on merge.
980
- const directKeys = new Set();
981
- const nestedKeys = new Map();
982
- for (const key of keys) {
983
- if (key.split('.').some(isUnsafeKey))
984
- continue;
985
- if (key.includes('.')) {
986
- const [first, ...rest] = key.split('.');
987
- if (isUnsafeKey(first))
988
- continue;
989
- const list = nestedKeys.get(first);
990
- if (list) {
991
- list.push(rest.join('.'));
992
- }
993
- else {
994
- nestedKeys.set(first, [rest.join('.')]);
995
- }
996
- }
997
- else {
998
- directKeys.add(key);
999
- }
1000
- }
1001
- const result = {};
1002
- for (const key of directKeys) {
1003
- if (key in obj)
1004
- result[key] = obj[key];
1005
- }
1006
- for (const [first, restKeys] of nestedKeys) {
1007
- const val = obj[first];
1008
- if (!val || typeof val !== 'object')
1009
- continue;
1010
- if (Array.isArray(val)) {
1011
- result[first] = val.map(item => pick(item, restKeys));
1012
- }
1013
- else {
1014
- result[first] = pick(val, restKeys);
1015
- }
1016
- }
1017
- return result;
1018
- };
1019
- if (Array.isArray(data)) {
1020
- return data.map(item => pick(item, fields));
1021
- }
1022
- return pick(data, fields);
1023
- }
1024
968
  sanitizeOutput(data) {
1025
969
  const auditFields = ['_type', 'tenantId', 'createdAt', 'updatedAt', 'createdBy', 'updatedBy'];
1026
970
  const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
@@ -31,7 +31,6 @@ export default class Health extends Command {
31
31
  private runCamt053Import;
32
32
  private runNestedImport;
33
33
  private parseFilterValue;
34
- private filterFields;
35
34
  private sanitizeOutput;
36
35
  private getColumns;
37
36
  private getValue;