@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 Inbox 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;
@@ -6,11 +6,13 @@ const HAS_IMPORT = false;
6
6
  const HAS_EXPORT = false;
7
7
  const HAS_CAMT053 = false;
8
8
  const NESTED_IMPORTS = [];
9
- const SUBCOMMANDS = [...["upload", "email-webhook", "document-types"], ...(HAS_IMPORT ? ['import'] : []), ...(HAS_EXPORT ? ['export'] : []), ...NESTED_IMPORTS.map(n => `import-${n}`)];
9
+ const SUBCOMMANDS = [...["upload", "email-webhook", "document-types", "list-processing-logs", "processing-logs"], ...(HAS_IMPORT ? ['import'] : []), ...(HAS_EXPORT ? ['export'] : []), ...NESTED_IMPORTS.map(n => `import-${n}`)];
10
10
  const ENDPOINTS = {
11
- 'upload': { method: 'POST', path: '/v1/inbox/upload', summary: 'Upload document(s) to inbox for processing', pathParams: [], hasBody: false, isMultipart: true },
12
- 'email-webhook': { method: 'POST', path: '/v1/inbox/email-webhook/{secret}', summary: 'Email webhook for document ingestion (SendGrid inbound-parse)', pathParams: ['secret'], hasBody: false, isMultipart: false },
13
- 'document-types': { method: 'GET', path: '/v1/inbox/document-types', summary: 'Get available document types and per-parent allowed types', pathParams: [], hasBody: false, isMultipart: false },
11
+ 'upload': { method: 'POST', path: '/v1/inbox/upload', summary: 'Upload document(s) to inbox for processing', pathParams: [], hasBody: false, isMultipart: true, isBinaryResponse: false, bodyArrayFields: [] },
12
+ 'email-webhook': { method: 'POST', path: '/v1/inbox/email-webhook/{secret}', summary: 'Email webhook for document ingestion (SendGrid inbound-parse)', pathParams: ['secret'], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
13
+ 'document-types': { method: 'GET', path: '/v1/inbox/document-types', summary: 'Get available document types and per-parent allowed types', pathParams: [], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
14
+ 'list-processing-logs': { method: 'GET', path: '/v1/inbox/processing-logs', summary: 'List recent inbox processing logs (newest first)', pathParams: [], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
15
+ 'processing-logs': { method: 'GET', path: '/v1/inbox/processing-logs/{processingId}', summary: 'Get a processing run by its processing identifier', pathParams: ['processingId'], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
14
16
  };
15
17
  export default class Inbox extends Command {
16
18
  static description = 'Manage inbox';
@@ -121,15 +123,7 @@ export default class Inbox extends Command {
121
123
  if (eqIndex === -1)
122
124
  this.error(`Invalid --filter format: ${f}. Use: --filter key=value`);
123
125
  const key = f.slice(0, eqIndex);
124
- let value = f.slice(eqIndex + 1);
125
- // Check for operator prefix (with or without $)
126
- const opMatch = value.match(/^\$?(eq|ne|in|like|gt|gte|lt|lte|null):/);
127
- if (opMatch) {
128
- value = `\$${opMatch[1]}:${value.slice(opMatch[0].length)}`;
129
- }
130
- else {
131
- value = `\$eq:${value}`;
132
- }
126
+ const value = this.parseFilterValue(f.slice(eqIndex + 1));
133
127
  const filterKey = `filter.${key}`;
134
128
  if (filterKey in queryParams) {
135
129
  // Multiple filters on same field: collect as array
@@ -162,7 +156,9 @@ export default class Inbox extends Command {
162
156
  data = form;
163
157
  }
164
158
  else if (endpoint.hasBody) {
165
- if (flags.file) {
159
+ // For binary-response endpoints, --file is the output path, not a JSON
160
+ // input file — skip the read-as-body branch.
161
+ if (flags.file && !endpoint.isBinaryResponse) {
166
162
  const fsModule = await import('node:fs');
167
163
  try {
168
164
  data = JSON.parse(fsModule.readFileSync(flags.file, 'utf-8'));
@@ -184,6 +180,7 @@ export default class Inbox extends Command {
184
180
  if (!data)
185
181
  data = {};
186
182
  const body = data;
183
+ const arrayFields = new Set(endpoint.bodyArrayFields);
187
184
  for (const pair of flags.set) {
188
185
  const eqIndex = pair.indexOf('=');
189
186
  if (eqIndex === -1)
@@ -195,6 +192,19 @@ export default class Inbox extends Command {
195
192
  value = JSON.parse(value);
196
193
  }
197
194
  catch { /* keep as string */ }
195
+ // For top-level keys typed as array in the API schema, split bare
196
+ // comma-separated input (e.g. "1171,1170" -> ["1171","1170"]) and
197
+ // wrap a lone scalar in a single-element array. Skips when --set
198
+ // already provided a JSON array.
199
+ const isArrayField = !key.includes('.') && arrayFields.has(key);
200
+ if (isArrayField && !Array.isArray(value)) {
201
+ if (typeof value === 'string') {
202
+ value = value.split(',').map(v => v.trim()).filter(v => v.length > 0);
203
+ }
204
+ else if (value !== undefined && value !== null) {
205
+ value = [value];
206
+ }
207
+ }
198
208
  // Support nested keys like "address.city"
199
209
  const keys = key.split('.');
200
210
  if (keys.some(k => k === '__proto__' || k === 'constructor' || k === 'prototype')) {
@@ -245,6 +255,26 @@ export default class Inbox extends Command {
245
255
  process.stderr.write('\n');
246
256
  }
247
257
  try {
258
+ // Binary response: download to file
259
+ if (endpoint.isBinaryResponse) {
260
+ if (!flags.file) {
261
+ this.error(`Endpoint returns a binary file. Specify the output path with -f / --file (e.g. -f report.xlsx).`);
262
+ }
263
+ const binResponse = await apiRequest(endpoint.method, apiPath, {
264
+ params: Object.keys(queryParams).length > 0 ? queryParams : undefined,
265
+ data,
266
+ contextName: flags.context,
267
+ binary: true,
268
+ });
269
+ const fsModule = await import('node:fs');
270
+ const binData = binResponse.data;
271
+ const buffer = Buffer.isBuffer(binData)
272
+ ? binData
273
+ : Buffer.from(binData);
274
+ fsModule.writeFileSync(flags.file, buffer);
275
+ this.log(`Saved ${buffer.length} bytes to ${flags.file}`);
276
+ return;
277
+ }
248
278
  const response = await apiRequest(endpoint.method, apiPath, {
249
279
  params: Object.keys(queryParams).length > 0 ? queryParams : undefined,
250
280
  data,
@@ -335,6 +365,7 @@ export default class Inbox extends Command {
335
365
  }
336
366
  else if (flags.set && flags.set.length > 0) {
337
367
  const item = {};
368
+ const arrayFields = new Set(ENDPOINTS['create']?.bodyArrayFields ?? []);
338
369
  for (const pair of flags.set) {
339
370
  const eqIndex = pair.indexOf('=');
340
371
  if (eqIndex === -1)
@@ -345,6 +376,15 @@ export default class Inbox extends Command {
345
376
  value = JSON.parse(value);
346
377
  }
347
378
  catch { /* keep as string */ }
379
+ const isArrayField = !key.includes('.') && arrayFields.has(key);
380
+ if (isArrayField && !Array.isArray(value)) {
381
+ if (typeof value === 'string') {
382
+ value = value.split(',').map(v => v.trim()).filter(v => v.length > 0);
383
+ }
384
+ else if (value !== undefined && value !== null) {
385
+ value = [value];
386
+ }
387
+ }
348
388
  const keys = key.split('.');
349
389
  if (keys.some(k => k === '__proto__' || k === 'constructor' || k === 'prototype')) {
350
390
  this.error(`Invalid --set key: ${key}`);
@@ -494,14 +534,7 @@ export default class Inbox extends Command {
494
534
  if (eqIndex === -1)
495
535
  this.error(`Invalid --filter format: ${f}. Use: --filter key=value`);
496
536
  const key = f.slice(0, eqIndex);
497
- let value = f.slice(eqIndex + 1);
498
- const opMatch = value.match(/^\$?(eq|ne|in|like|gt|gte|lt|lte|null):/);
499
- if (opMatch) {
500
- value = `\$${opMatch[1]}:${value.slice(opMatch[0].length)}`;
501
- }
502
- else {
503
- value = `\$eq:${value}`;
504
- }
537
+ const value = this.parseFilterValue(f.slice(eqIndex + 1));
505
538
  const filterKey = `filter.${key}`;
506
539
  if (filterKey in baseParams) {
507
540
  const existing = baseParams[filterKey];
@@ -678,6 +711,7 @@ export default class Inbox extends Command {
678
711
  }
679
712
  else if (flags.set && flags.set.length > 0) {
680
713
  const item = {};
714
+ const arrayFields = new Set(ENDPOINTS[`create-${suffix}`]?.bodyArrayFields ?? []);
681
715
  for (const pair of flags.set) {
682
716
  const eqIndex = pair.indexOf('=');
683
717
  if (eqIndex === -1)
@@ -688,6 +722,15 @@ export default class Inbox extends Command {
688
722
  value = JSON.parse(value);
689
723
  }
690
724
  catch { /* keep as string */ }
725
+ const isArrayField = !key.includes('.') && arrayFields.has(key);
726
+ if (isArrayField && !Array.isArray(value)) {
727
+ if (typeof value === 'string') {
728
+ value = value.split(',').map(v => v.trim()).filter(v => v.length > 0);
729
+ }
730
+ else if (value !== undefined && value !== null) {
731
+ value = [value];
732
+ }
733
+ }
691
734
  const keys = key.split('.');
692
735
  if (keys.some(k => k === '__proto__' || k === 'constructor' || k === 'prototype')) {
693
736
  this.error(`Invalid --set key: ${key}`);
@@ -807,35 +850,62 @@ export default class Inbox extends Command {
807
850
  this.log('');
808
851
  this.log(`Summary: ${created} created, ${updated} updated, ${errors.length} failed`);
809
852
  }
853
+ parseFilterValue(value) {
854
+ // Recognises the nestjs-paginate operator set (with or without the leading $)
855
+ // and recursively unwraps chained operators like 'not:null' -> '$not:$null'
856
+ // or 'not:like:John' -> '$not:$like:John'. Falls back to '$eq:<value>' when
857
+ // no operator prefix is present.
858
+ const opRe = /^\$?(and|or|not|eq|gt|gte|in|null|lt|lte|btw|ne|ilike|like|sw|contains)(?::|$)/;
859
+ const m = value.match(opRe);
860
+ if (!m)
861
+ return `\$eq:${value}`;
862
+ const op = m[1];
863
+ const rest = value.slice(m[0].length);
864
+ if (rest === '')
865
+ return `\$${op}`;
866
+ return opRe.test(rest) ? `\$${op}:${this.parseFilterValue(rest)}` : `\$${op}:${rest}`;
867
+ }
810
868
  filterFields(data, fields) {
811
869
  const isUnsafeKey = (k) => k === '__proto__' || k === 'constructor' || k === 'prototype';
812
870
  const pick = (obj, keys) => {
813
- const result = {};
871
+ // Group keys by their first segment so sibling sub-paths
872
+ // (e.g. 'items.amount' + 'items._type') resolve in one recursive pass
873
+ // and don't clobber each other on merge.
874
+ const directKeys = new Set();
875
+ const nestedKeys = new Map();
814
876
  for (const key of keys) {
815
877
  if (key.split('.').some(isUnsafeKey))
816
878
  continue;
817
879
  if (key.includes('.')) {
818
- // Handle nested fields like 'customer.name' or 'allocations.salesInvoiceId'
819
880
  const [first, ...rest] = key.split('.');
820
- const val = obj[first];
821
- if (val && typeof val === 'object') {
822
- const restKey = rest.join('.');
823
- if (Array.isArray(val)) {
824
- // Map over array elements (e.g., allocations[].salesInvoiceId)
825
- const existing = Array.isArray(result[first]) ? result[first] : [];
826
- result[first] = val.map((item, i) => ({
827
- ...(existing[i] || {}),
828
- ...pick(item, [restKey]),
829
- }));
830
- }
831
- else {
832
- const nested = pick(val, [restKey]);
833
- result[first] = { ...(result[first] || {}), ...nested };
834
- }
881
+ if (isUnsafeKey(first))
882
+ continue;
883
+ const list = nestedKeys.get(first);
884
+ if (list) {
885
+ list.push(rest.join('.'));
886
+ }
887
+ else {
888
+ nestedKeys.set(first, [rest.join('.')]);
835
889
  }
836
890
  }
837
- else if (key in obj) {
891
+ else {
892
+ directKeys.add(key);
893
+ }
894
+ }
895
+ const result = {};
896
+ for (const key of directKeys) {
897
+ if (key in obj)
838
898
  result[key] = obj[key];
899
+ }
900
+ for (const [first, restKeys] of nestedKeys) {
901
+ const val = obj[first];
902
+ if (!val || typeof val !== 'object')
903
+ continue;
904
+ if (Array.isArray(val)) {
905
+ result[first] = val.map(item => pick(item, restKeys));
906
+ }
907
+ else {
908
+ result[first] = pick(val, restKeys);
839
909
  }
840
910
  }
841
911
  return result;
@@ -0,0 +1,41 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class Integrations extends Command {
3
+ static description: string;
4
+ static examples: string[];
5
+ static args: {
6
+ action: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
7
+ id: import("@oclif/core/interfaces").Arg<string | undefined, Record<string, unknown>>;
8
+ };
9
+ static flags: {
10
+ context: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ output: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ table: import("@oclif/core/interfaces").BooleanFlag<boolean>;
13
+ csv: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
+ data: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
+ file: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
+ set: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
17
+ 'config-key': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
18
+ page: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
+ limit: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
20
+ include: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
21
+ search: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
22
+ 'sort-by': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
23
+ filter: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
24
+ query: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
25
+ fields: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
26
+ sanitize: import("@oclif/core/interfaces").BooleanFlag<boolean>;
27
+ 'show-http-request': import("@oclif/core/interfaces").BooleanFlag<boolean>;
28
+ };
29
+ run(): Promise<void>;
30
+ private runImport;
31
+ private runExport;
32
+ private runCamt053Import;
33
+ private runNestedImport;
34
+ private parseFilterValue;
35
+ private filterFields;
36
+ private sanitizeOutput;
37
+ private getColumns;
38
+ private getValue;
39
+ private printTable;
40
+ private printCsv;
41
+ }