@aderis-erp/cli 1.0.2 → 1.0.4

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 (191) hide show
  1. package/README.md +6 -0
  2. package/dist/commands/access-groups 3.d.ts +40 -0
  3. package/dist/commands/{access-groups 2.js → access-groups 3.js } +106 -40
  4. package/dist/commands/access-groups.d.ts +40 -0
  5. package/dist/commands/access-groups.js +1074 -0
  6. package/dist/commands/account-transactions.d.ts +42 -0
  7. package/dist/commands/account-transactions.js +1088 -0
  8. package/dist/commands/accounts 2.d.ts +41 -0
  9. package/dist/commands/accounts 2.js +1078 -0
  10. package/dist/commands/accounts.d.ts +41 -0
  11. package/dist/commands/accounts.js +1080 -0
  12. package/dist/commands/agent-runs.d.ts +40 -0
  13. package/dist/commands/agent-runs.js +1071 -0
  14. package/dist/commands/async-endpoints-internal 3.d.ts +40 -0
  15. package/dist/commands/{processing-logs.js → async-endpoints-internal 3.js } +110 -46
  16. package/dist/commands/async-endpoints-internal.d.ts +40 -0
  17. package/dist/commands/async-endpoints-internal.js +1064 -0
  18. package/dist/commands/audit-log 3.d.ts +40 -0
  19. package/dist/commands/audit-log 3.js +1066 -0
  20. package/dist/commands/audit-log.d.ts +40 -0
  21. package/dist/commands/audit-log.js +1068 -0
  22. package/dist/commands/auth/login.d.ts +14 -0
  23. package/dist/commands/auth/login.js +116 -0
  24. package/dist/commands/auth/logout.d.ts +10 -0
  25. package/dist/commands/auth/logout.js +58 -0
  26. package/dist/commands/auth/status.d.ts +12 -0
  27. package/dist/commands/auth/status.js +101 -0
  28. package/dist/commands/auth/tenant.d.ts +19 -0
  29. package/dist/commands/auth/tenant.js +184 -0
  30. package/dist/commands/auth.d.ts +37 -0
  31. package/dist/commands/auth.js +871 -0
  32. package/dist/commands/bank-accounts.d.ts +42 -0
  33. package/dist/commands/bank-accounts.js +1088 -0
  34. package/dist/commands/bank-integrations.d.ts +1 -0
  35. package/dist/commands/bank-integrations.js +122 -54
  36. package/dist/commands/business-partners 3.d.ts +41 -0
  37. package/dist/commands/business-partners 3.js +1078 -0
  38. package/dist/commands/business-partners---contacts 3.d.ts +42 -0
  39. package/dist/commands/business-partners---contacts 3.js +1072 -0
  40. package/dist/commands/business-partners---contacts.d.ts +1 -0
  41. package/dist/commands/business-partners---contacts.js +114 -46
  42. package/dist/commands/business-partners.d.ts +1 -0
  43. package/dist/commands/business-partners.js +114 -46
  44. package/dist/commands/config/add.d.ts +13 -0
  45. package/dist/commands/config/add.js +120 -0
  46. package/dist/commands/config/current.d.ts +9 -0
  47. package/dist/commands/config/current.js +43 -0
  48. package/dist/commands/config/delete.d.ts +12 -0
  49. package/dist/commands/config/delete.js +67 -0
  50. package/dist/commands/config/list.d.ts +9 -0
  51. package/dist/commands/config/list.js +50 -0
  52. package/dist/commands/config/use.d.ts +9 -0
  53. package/dist/commands/config/use.js +40 -0
  54. package/dist/commands/credit-card-accounts 3.d.ts +42 -0
  55. package/dist/commands/credit-card-accounts 3.js +1084 -0
  56. package/dist/commands/credit-card-accounts.d.ts +1 -0
  57. package/dist/commands/credit-card-accounts.js +119 -51
  58. package/dist/commands/documents.d.ts +1 -0
  59. package/dist/commands/documents.js +110 -42
  60. package/dist/commands/dunning-configs 3.d.ts +40 -0
  61. package/dist/commands/dunning-configs 3.js +1072 -0
  62. package/dist/commands/dunning-configs.d.ts +1 -0
  63. package/dist/commands/dunning-configs.js +109 -41
  64. package/dist/commands/dunning-reminders.d.ts +1 -0
  65. package/dist/commands/dunning-reminders.js +112 -44
  66. package/dist/commands/dunning-runs 3.d.ts +40 -0
  67. package/dist/commands/{pubsub.js → dunning-runs 3.js } +108 -43
  68. package/dist/commands/dunning-runs.d.ts +1 -0
  69. package/dist/commands/dunning-runs.js +105 -37
  70. package/dist/commands/employees.d.ts +1 -0
  71. package/dist/commands/employees.js +136 -68
  72. package/dist/commands/event-processor-mappings 3.d.ts +40 -0
  73. package/dist/commands/event-processor-mappings 3.js +1071 -0
  74. package/dist/commands/event-processor-mappings.d.ts +1 -0
  75. package/dist/commands/event-processor-mappings.js +109 -41
  76. package/dist/commands/files-internal 3.d.ts +40 -0
  77. package/dist/commands/files-internal 3.js +1073 -0
  78. package/dist/commands/files-internal.d.ts +1 -0
  79. package/dist/commands/files-internal.js +113 -45
  80. package/dist/commands/health 3.d.ts +40 -0
  81. package/dist/commands/health 3.js +1067 -0
  82. package/dist/commands/health.d.ts +1 -0
  83. package/dist/commands/health.js +109 -41
  84. package/dist/commands/{pubsub.d.ts → inbox 3.d.ts } +2 -1
  85. package/dist/commands/inbox 3.js +1065 -0
  86. package/dist/commands/inbox.d.ts +1 -0
  87. package/dist/commands/inbox.js +110 -40
  88. package/dist/commands/integrations 3.d.ts +41 -0
  89. package/dist/commands/integrations 3.js +1067 -0
  90. package/dist/commands/integrations.d.ts +1 -0
  91. package/dist/commands/integrations.js +107 -39
  92. package/dist/commands/item-categories 3.d.ts +40 -0
  93. package/dist/commands/item-categories 3.js +1072 -0
  94. package/dist/commands/item-categories.d.ts +1 -0
  95. package/dist/commands/item-categories.js +109 -41
  96. package/dist/commands/items 3.d.ts +40 -0
  97. package/dist/commands/items 3.js +1072 -0
  98. package/dist/commands/items.d.ts +1 -0
  99. package/dist/commands/items.js +109 -41
  100. package/dist/commands/journal-lines.d.ts +1 -0
  101. package/dist/commands/journal-lines.js +105 -37
  102. package/dist/commands/journals 3.d.ts +42 -0
  103. package/dist/commands/journals 3.js +1088 -0
  104. package/dist/commands/journals.d.ts +1 -0
  105. package/dist/commands/journals.js +123 -55
  106. package/dist/commands/ledgers.d.ts +1 -0
  107. package/dist/commands/ledgers.js +120 -52
  108. package/dist/commands/office-locations 3.d.ts +40 -0
  109. package/dist/commands/office-locations 3.js +1072 -0
  110. package/dist/commands/office-locations.d.ts +1 -0
  111. package/dist/commands/office-locations.js +109 -41
  112. package/dist/commands/payment-method-ledger-mappings 3.d.ts +41 -0
  113. package/dist/commands/payment-method-ledger-mappings 3.js +1066 -0
  114. package/dist/commands/payment-method-ledger-mappings.d.ts +1 -0
  115. package/dist/commands/payment-method-ledger-mappings.js +109 -41
  116. package/dist/commands/payment-methods 3.d.ts +40 -0
  117. package/dist/commands/payment-methods 3.js +1072 -0
  118. package/dist/commands/payment-methods.d.ts +1 -0
  119. package/dist/commands/payment-methods.js +109 -41
  120. package/dist/commands/payment-runs 3.d.ts +42 -0
  121. package/dist/commands/payment-runs 3.js +1087 -0
  122. package/dist/commands/payment-runs.d.ts +1 -0
  123. package/dist/commands/payment-runs.js +122 -54
  124. package/dist/commands/payment-terms 3.d.ts +40 -0
  125. package/dist/commands/payment-terms 3.js +1073 -0
  126. package/dist/commands/payment-terms.d.ts +1 -0
  127. package/dist/commands/payment-terms.js +110 -42
  128. package/dist/commands/price-lists 3.d.ts +41 -0
  129. package/dist/commands/price-lists 3.js +1078 -0
  130. package/dist/commands/price-lists.d.ts +1 -0
  131. package/dist/commands/price-lists.js +114 -46
  132. package/dist/commands/processor-mappings 2.d.ts +40 -0
  133. package/dist/commands/processor-mappings 2.js +1070 -0
  134. package/dist/commands/processor-mappings.d.ts +1 -0
  135. package/dist/commands/processor-mappings.js +108 -40
  136. package/dist/commands/processors.d.ts +1 -0
  137. package/dist/commands/processors.js +113 -45
  138. package/dist/commands/reconciliation 3.d.ts +40 -0
  139. package/dist/commands/reconciliation 3.js +1069 -0
  140. package/dist/commands/reconciliation.d.ts +1 -0
  141. package/dist/commands/reconciliation.js +110 -42
  142. package/dist/commands/reports.d.ts +1 -0
  143. package/dist/commands/reports.js +110 -39
  144. package/dist/commands/salary-types 3.d.ts +40 -0
  145. package/dist/commands/salary-types 3.js +1072 -0
  146. package/dist/commands/salary-types.d.ts +1 -0
  147. package/dist/commands/salary-types.js +1074 -0
  148. package/dist/commands/sales-invoices 3.d.ts +43 -0
  149. package/dist/commands/sales-invoices 3.js +1100 -0
  150. package/dist/commands/sales-invoices.d.ts +1 -0
  151. package/dist/commands/sales-invoices.js +134 -66
  152. package/dist/commands/sales-orders 3.d.ts +43 -0
  153. package/dist/commands/sales-orders 3.js +1098 -0
  154. package/dist/commands/sales-orders.d.ts +1 -0
  155. package/dist/commands/sales-orders.js +133 -64
  156. package/dist/commands/switch.d.ts +1 -0
  157. package/dist/commands/switch.js +58 -3
  158. package/dist/commands/{processing-logs.d.ts → tags 3.d.ts } +2 -1
  159. package/dist/commands/tags 3.js +1072 -0
  160. package/dist/commands/tags.d.ts +1 -0
  161. package/dist/commands/tags.js +109 -41
  162. package/dist/commands/tax-codes 3.d.ts +40 -0
  163. package/dist/commands/tax-codes 3.js +1075 -0
  164. package/dist/commands/tax-codes.d.ts +1 -0
  165. package/dist/commands/tax-codes.js +112 -44
  166. package/dist/commands/tax-matrix.d.ts +1 -0
  167. package/dist/commands/tax-matrix.js +109 -41
  168. package/dist/commands/tenants.d.ts +1 -0
  169. package/dist/commands/tenants.js +109 -41
  170. package/dist/commands/text-templates 3.d.ts +40 -0
  171. package/dist/commands/text-templates 3.js +1072 -0
  172. package/dist/commands/text-templates.d.ts +1 -0
  173. package/dist/commands/text-templates.js +109 -41
  174. package/dist/commands/tools.d.ts +1 -0
  175. package/dist/commands/tools.js +106 -38
  176. package/dist/commands/vendor-invoices.d.ts +1 -0
  177. package/dist/commands/vendor-invoices.js +139 -69
  178. package/dist/commands/webhooks 3.d.ts +40 -0
  179. package/dist/commands/webhooks 3.js +1074 -0
  180. package/dist/commands/webhooks.d.ts +1 -0
  181. package/dist/commands/webhooks.js +111 -43
  182. package/dist/commands/workflows.d.ts +1 -0
  183. package/dist/commands/workflows.js +107 -39
  184. package/dist/lib/api-client.d.ts +5 -1
  185. package/dist/lib/api-client.js +19 -5
  186. package/dist/lib/auth.d.ts +16 -1
  187. package/dist/lib/auth.js +170 -45
  188. package/dist/lib/config.d.ts +7 -0
  189. package/dist/lib/config.js +7 -1
  190. package/oclif.manifest.json +7464 -653
  191. package/package.json +2 -2
@@ -30,6 +30,7 @@ export default class Health extends Command {
30
30
  private runExport;
31
31
  private runCamt053Import;
32
32
  private runNestedImport;
33
+ private parseFilterValue;
33
34
  private filterFields;
34
35
  private sanitizeOutput;
35
36
  private getColumns;
@@ -8,11 +8,11 @@ const HAS_CAMT053 = false;
8
8
  const NESTED_IMPORTS = [];
9
9
  const SUBCOMMANDS = [...["get", "get-all", "ready", "get-3", "v1"], ...(HAS_IMPORT ? ['import'] : []), ...(HAS_EXPORT ? ['export'] : []), ...NESTED_IMPORTS.map(n => `import-${n}`)];
10
10
  const ENDPOINTS = {
11
- 'get': { method: 'GET', path: '/', summary: 'GET /', pathParams: [], hasBody: false, isMultipart: false },
12
- 'get-all': { method: 'GET', path: '/health', summary: 'GET /health', pathParams: [], hasBody: false, isMultipart: false },
13
- 'ready': { method: 'GET', path: '/ready', summary: 'GET /ready', pathParams: [], hasBody: false, isMultipart: false },
14
- 'get-3': { method: 'GET', path: '/v1/status', summary: 'GET /v1/status', pathParams: [], hasBody: false, isMultipart: false },
15
- 'v1': { method: 'GET', path: '/v1', summary: 'GET /v1', pathParams: [], hasBody: false, isMultipart: false },
11
+ 'get': { method: 'GET', path: '/', summary: 'GET /', pathParams: [], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
12
+ 'get-all': { method: 'GET', path: '/health', summary: 'GET /health', pathParams: [], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
13
+ 'ready': { method: 'GET', path: '/ready', summary: 'GET /ready', pathParams: [], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
14
+ 'get-3': { method: 'GET', path: '/v1/status', summary: 'GET /v1/status', pathParams: [], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
15
+ 'v1': { method: 'GET', path: '/v1', summary: 'GET /v1', pathParams: [], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
16
16
  };
17
17
  export default class Health extends Command {
18
18
  static description = 'Manage health';
@@ -125,15 +125,7 @@ export default class Health extends Command {
125
125
  if (eqIndex === -1)
126
126
  this.error(`Invalid --filter format: ${f}. Use: --filter key=value`);
127
127
  const key = f.slice(0, eqIndex);
128
- let value = f.slice(eqIndex + 1);
129
- // Check for operator prefix (with or without $)
130
- const opMatch = value.match(/^\$?(eq|ne|in|like|gt|gte|lt|lte|null):/);
131
- if (opMatch) {
132
- value = `\$${opMatch[1]}:${value.slice(opMatch[0].length)}`;
133
- }
134
- else {
135
- value = `\$eq:${value}`;
136
- }
128
+ const value = this.parseFilterValue(f.slice(eqIndex + 1));
137
129
  const filterKey = `filter.${key}`;
138
130
  if (filterKey in queryParams) {
139
131
  // Multiple filters on same field: collect as array
@@ -166,7 +158,9 @@ export default class Health extends Command {
166
158
  data = form;
167
159
  }
168
160
  else if (endpoint.hasBody) {
169
- if (flags.file) {
161
+ // For binary-response endpoints, --file is the output path, not a JSON
162
+ // input file — skip the read-as-body branch.
163
+ if (flags.file && !endpoint.isBinaryResponse) {
170
164
  const fsModule = await import('node:fs');
171
165
  try {
172
166
  data = JSON.parse(fsModule.readFileSync(flags.file, 'utf-8'));
@@ -188,6 +182,7 @@ export default class Health extends Command {
188
182
  if (!data)
189
183
  data = {};
190
184
  const body = data;
185
+ const arrayFields = new Set(endpoint.bodyArrayFields);
191
186
  for (const pair of flags.set) {
192
187
  const eqIndex = pair.indexOf('=');
193
188
  if (eqIndex === -1)
@@ -199,6 +194,19 @@ export default class Health extends Command {
199
194
  value = JSON.parse(value);
200
195
  }
201
196
  catch { /* keep as string */ }
197
+ // For top-level keys typed as array in the API schema, split bare
198
+ // comma-separated input (e.g. "1171,1170" -> ["1171","1170"]) and
199
+ // wrap a lone scalar in a single-element array. Skips when --set
200
+ // already provided a JSON array.
201
+ const isArrayField = !key.includes('.') && arrayFields.has(key);
202
+ if (isArrayField && !Array.isArray(value)) {
203
+ if (typeof value === 'string') {
204
+ value = value.split(',').map(v => v.trim()).filter(v => v.length > 0);
205
+ }
206
+ else if (value !== undefined && value !== null) {
207
+ value = [value];
208
+ }
209
+ }
202
210
  // Support nested keys like "address.city"
203
211
  const keys = key.split('.');
204
212
  if (keys.some(k => k === '__proto__' || k === 'constructor' || k === 'prototype')) {
@@ -249,6 +257,26 @@ export default class Health extends Command {
249
257
  process.stderr.write('\n');
250
258
  }
251
259
  try {
260
+ // Binary response: download to file
261
+ if (endpoint.isBinaryResponse) {
262
+ if (!flags.file) {
263
+ this.error(`Endpoint returns a binary file. Specify the output path with -f / --file (e.g. -f report.xlsx).`);
264
+ }
265
+ const binResponse = await apiRequest(endpoint.method, apiPath, {
266
+ params: Object.keys(queryParams).length > 0 ? queryParams : undefined,
267
+ data,
268
+ contextName: flags.context,
269
+ binary: true,
270
+ });
271
+ const fsModule = await import('node:fs');
272
+ const binData = binResponse.data;
273
+ const buffer = Buffer.isBuffer(binData)
274
+ ? binData
275
+ : Buffer.from(binData);
276
+ fsModule.writeFileSync(flags.file, buffer);
277
+ this.log(`Saved ${buffer.length} bytes to ${flags.file}`);
278
+ return;
279
+ }
252
280
  const response = await apiRequest(endpoint.method, apiPath, {
253
281
  params: Object.keys(queryParams).length > 0 ? queryParams : undefined,
254
282
  data,
@@ -339,6 +367,7 @@ export default class Health extends Command {
339
367
  }
340
368
  else if (flags.set && flags.set.length > 0) {
341
369
  const item = {};
370
+ const arrayFields = new Set(ENDPOINTS['create']?.bodyArrayFields ?? []);
342
371
  for (const pair of flags.set) {
343
372
  const eqIndex = pair.indexOf('=');
344
373
  if (eqIndex === -1)
@@ -349,6 +378,15 @@ export default class Health extends Command {
349
378
  value = JSON.parse(value);
350
379
  }
351
380
  catch { /* keep as string */ }
381
+ const isArrayField = !key.includes('.') && arrayFields.has(key);
382
+ if (isArrayField && !Array.isArray(value)) {
383
+ if (typeof value === 'string') {
384
+ value = value.split(',').map(v => v.trim()).filter(v => v.length > 0);
385
+ }
386
+ else if (value !== undefined && value !== null) {
387
+ value = [value];
388
+ }
389
+ }
352
390
  const keys = key.split('.');
353
391
  if (keys.some(k => k === '__proto__' || k === 'constructor' || k === 'prototype')) {
354
392
  this.error(`Invalid --set key: ${key}`);
@@ -498,14 +536,7 @@ export default class Health extends Command {
498
536
  if (eqIndex === -1)
499
537
  this.error(`Invalid --filter format: ${f}. Use: --filter key=value`);
500
538
  const key = f.slice(0, eqIndex);
501
- let value = f.slice(eqIndex + 1);
502
- const opMatch = value.match(/^\$?(eq|ne|in|like|gt|gte|lt|lte|null):/);
503
- if (opMatch) {
504
- value = `\$${opMatch[1]}:${value.slice(opMatch[0].length)}`;
505
- }
506
- else {
507
- value = `\$eq:${value}`;
508
- }
539
+ const value = this.parseFilterValue(f.slice(eqIndex + 1));
509
540
  const filterKey = `filter.${key}`;
510
541
  if (filterKey in baseParams) {
511
542
  const existing = baseParams[filterKey];
@@ -682,6 +713,7 @@ export default class Health extends Command {
682
713
  }
683
714
  else if (flags.set && flags.set.length > 0) {
684
715
  const item = {};
716
+ const arrayFields = new Set(ENDPOINTS[`create-${suffix}`]?.bodyArrayFields ?? []);
685
717
  for (const pair of flags.set) {
686
718
  const eqIndex = pair.indexOf('=');
687
719
  if (eqIndex === -1)
@@ -692,6 +724,15 @@ export default class Health extends Command {
692
724
  value = JSON.parse(value);
693
725
  }
694
726
  catch { /* keep as string */ }
727
+ const isArrayField = !key.includes('.') && arrayFields.has(key);
728
+ if (isArrayField && !Array.isArray(value)) {
729
+ if (typeof value === 'string') {
730
+ value = value.split(',').map(v => v.trim()).filter(v => v.length > 0);
731
+ }
732
+ else if (value !== undefined && value !== null) {
733
+ value = [value];
734
+ }
735
+ }
695
736
  const keys = key.split('.');
696
737
  if (keys.some(k => k === '__proto__' || k === 'constructor' || k === 'prototype')) {
697
738
  this.error(`Invalid --set key: ${key}`);
@@ -811,35 +852,62 @@ export default class Health extends Command {
811
852
  this.log('');
812
853
  this.log(`Summary: ${created} created, ${updated} updated, ${errors.length} failed`);
813
854
  }
855
+ parseFilterValue(value) {
856
+ // Recognises the nestjs-paginate operator set (with or without the leading $)
857
+ // and recursively unwraps chained operators like 'not:null' -> '$not:$null'
858
+ // or 'not:like:John' -> '$not:$like:John'. Falls back to '$eq:<value>' when
859
+ // no operator prefix is present.
860
+ const opRe = /^\$?(and|or|not|eq|gt|gte|in|null|lt|lte|btw|ne|ilike|like|sw|contains)(?::|$)/;
861
+ const m = value.match(opRe);
862
+ if (!m)
863
+ return `\$eq:${value}`;
864
+ const op = m[1];
865
+ const rest = value.slice(m[0].length);
866
+ if (rest === '')
867
+ return `\$${op}`;
868
+ return opRe.test(rest) ? `\$${op}:${this.parseFilterValue(rest)}` : `\$${op}:${rest}`;
869
+ }
814
870
  filterFields(data, fields) {
815
871
  const isUnsafeKey = (k) => k === '__proto__' || k === 'constructor' || k === 'prototype';
816
872
  const pick = (obj, keys) => {
817
- const result = {};
873
+ // Group keys by their first segment so sibling sub-paths
874
+ // (e.g. 'items.amount' + 'items._type') resolve in one recursive pass
875
+ // and don't clobber each other on merge.
876
+ const directKeys = new Set();
877
+ const nestedKeys = new Map();
818
878
  for (const key of keys) {
819
879
  if (key.split('.').some(isUnsafeKey))
820
880
  continue;
821
881
  if (key.includes('.')) {
822
- // Handle nested fields like 'customer.name' or 'allocations.salesInvoiceId'
823
882
  const [first, ...rest] = key.split('.');
824
- const val = obj[first];
825
- if (val && typeof val === 'object') {
826
- const restKey = rest.join('.');
827
- if (Array.isArray(val)) {
828
- // Map over array elements (e.g., allocations[].salesInvoiceId)
829
- const existing = Array.isArray(result[first]) ? result[first] : [];
830
- result[first] = val.map((item, i) => ({
831
- ...(existing[i] || {}),
832
- ...pick(item, [restKey]),
833
- }));
834
- }
835
- else {
836
- const nested = pick(val, [restKey]);
837
- result[first] = { ...(result[first] || {}), ...nested };
838
- }
883
+ if (isUnsafeKey(first))
884
+ continue;
885
+ const list = nestedKeys.get(first);
886
+ if (list) {
887
+ list.push(rest.join('.'));
888
+ }
889
+ else {
890
+ nestedKeys.set(first, [rest.join('.')]);
839
891
  }
840
892
  }
841
- else if (key in obj) {
893
+ else {
894
+ directKeys.add(key);
895
+ }
896
+ }
897
+ const result = {};
898
+ for (const key of directKeys) {
899
+ if (key in obj)
842
900
  result[key] = obj[key];
901
+ }
902
+ for (const [first, restKeys] of nestedKeys) {
903
+ const val = obj[first];
904
+ if (!val || typeof val !== 'object')
905
+ continue;
906
+ if (Array.isArray(val)) {
907
+ result[first] = val.map(item => pick(item, restKeys));
908
+ }
909
+ else {
910
+ result[first] = pick(val, restKeys);
843
911
  }
844
912
  }
845
913
  return result;
@@ -1,5 +1,5 @@
1
1
  import { Command } from '@oclif/core';
2
- export default class Pubsub extends Command {
2
+ export default class Inbox extends Command {
3
3
  static description: string;
4
4
  static examples: never[];
5
5
  static args: {
@@ -30,6 +30,7 @@ export default class Pubsub extends Command {
30
30
  private runExport;
31
31
  private runCamt053Import;
32
32
  private runNestedImport;
33
+ private parseFilterValue;
33
34
  private filterFields;
34
35
  private sanitizeOutput;
35
36
  private getColumns;