@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 EventProcessorMappings 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 = [...["events", "list", "create", "update", "delete"], ...(HAS_IMPORT ? ['import'] : []), ...(HAS_EXPORT ? ['export'] : []), ...NESTED_IMPORTS.map(n => `import-${n}`)];
10
10
  const ENDPOINTS = {
11
- 'events': { method: 'GET', path: '/v1/event-processor-mappings/events', summary: 'List all valid event types', pathParams: [], hasBody: false, isMultipart: false },
12
- 'list': { method: 'GET', path: '/v1/event-processor-mappings', summary: 'List all event type processor mappings for the tenant', pathParams: [], hasBody: false, isMultipart: false },
13
- 'create': { method: 'POST', path: '/v1/event-processor-mappings', summary: 'Create event type processor mappings', pathParams: [], hasBody: true, isMultipart: false },
14
- 'update': { method: 'PATCH', path: '/v1/event-processor-mappings/{id}', summary: 'Update an event type processor mapping', pathParams: ['id'], hasBody: true, isMultipart: false },
15
- 'delete': { method: 'DELETE', path: '/v1/event-processor-mappings/{id}', summary: 'Delete an event type processor mapping', pathParams: ['id'], hasBody: false, isMultipart: false },
11
+ 'events': { method: 'GET', path: '/v1/event-processor-mappings/events', summary: 'List all valid event types', pathParams: [], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
12
+ 'list': { method: 'GET', path: '/v1/event-processor-mappings', summary: 'List all event type processor mappings for the tenant', pathParams: [], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
13
+ 'create': { method: 'POST', path: '/v1/event-processor-mappings', summary: 'Create event type processor mappings', pathParams: [], hasBody: true, isMultipart: false, isBinaryResponse: false, bodyArrayFields: ['eventTypes', 'includes'] },
14
+ 'update': { method: 'PATCH', path: '/v1/event-processor-mappings/{id}', summary: 'Update an event type processor mapping', pathParams: ['id'], hasBody: true, isMultipart: false, isBinaryResponse: false, bodyArrayFields: ['includes'] },
15
+ 'delete': { method: 'DELETE', path: '/v1/event-processor-mappings/{id}', summary: 'Delete an event type processor mapping', pathParams: ['id'], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
16
16
  };
17
17
  export default class EventProcessorMappings extends Command {
18
18
  static description = 'Manage event processor mappings';
@@ -129,15 +129,7 @@ export default class EventProcessorMappings extends Command {
129
129
  if (eqIndex === -1)
130
130
  this.error(`Invalid --filter format: ${f}. Use: --filter key=value`);
131
131
  const key = f.slice(0, eqIndex);
132
- let value = f.slice(eqIndex + 1);
133
- // Check for operator prefix (with or without $)
134
- const opMatch = value.match(/^\$?(eq|ne|in|like|gt|gte|lt|lte|null):/);
135
- if (opMatch) {
136
- value = `\$${opMatch[1]}:${value.slice(opMatch[0].length)}`;
137
- }
138
- else {
139
- value = `\$eq:${value}`;
140
- }
132
+ const value = this.parseFilterValue(f.slice(eqIndex + 1));
141
133
  const filterKey = `filter.${key}`;
142
134
  if (filterKey in queryParams) {
143
135
  // Multiple filters on same field: collect as array
@@ -170,7 +162,9 @@ export default class EventProcessorMappings extends Command {
170
162
  data = form;
171
163
  }
172
164
  else if (endpoint.hasBody) {
173
- if (flags.file) {
165
+ // For binary-response endpoints, --file is the output path, not a JSON
166
+ // input file — skip the read-as-body branch.
167
+ if (flags.file && !endpoint.isBinaryResponse) {
174
168
  const fsModule = await import('node:fs');
175
169
  try {
176
170
  data = JSON.parse(fsModule.readFileSync(flags.file, 'utf-8'));
@@ -192,6 +186,7 @@ export default class EventProcessorMappings extends Command {
192
186
  if (!data)
193
187
  data = {};
194
188
  const body = data;
189
+ const arrayFields = new Set(endpoint.bodyArrayFields);
195
190
  for (const pair of flags.set) {
196
191
  const eqIndex = pair.indexOf('=');
197
192
  if (eqIndex === -1)
@@ -203,6 +198,19 @@ export default class EventProcessorMappings extends Command {
203
198
  value = JSON.parse(value);
204
199
  }
205
200
  catch { /* keep as string */ }
201
+ // For top-level keys typed as array in the API schema, split bare
202
+ // comma-separated input (e.g. "1171,1170" -> ["1171","1170"]) and
203
+ // wrap a lone scalar in a single-element array. Skips when --set
204
+ // already provided a JSON array.
205
+ const isArrayField = !key.includes('.') && arrayFields.has(key);
206
+ if (isArrayField && !Array.isArray(value)) {
207
+ if (typeof value === 'string') {
208
+ value = value.split(',').map(v => v.trim()).filter(v => v.length > 0);
209
+ }
210
+ else if (value !== undefined && value !== null) {
211
+ value = [value];
212
+ }
213
+ }
206
214
  // Support nested keys like "address.city"
207
215
  const keys = key.split('.');
208
216
  if (keys.some(k => k === '__proto__' || k === 'constructor' || k === 'prototype')) {
@@ -253,6 +261,26 @@ export default class EventProcessorMappings extends Command {
253
261
  process.stderr.write('\n');
254
262
  }
255
263
  try {
264
+ // Binary response: download to file
265
+ if (endpoint.isBinaryResponse) {
266
+ if (!flags.file) {
267
+ this.error(`Endpoint returns a binary file. Specify the output path with -f / --file (e.g. -f report.xlsx).`);
268
+ }
269
+ const binResponse = await apiRequest(endpoint.method, apiPath, {
270
+ params: Object.keys(queryParams).length > 0 ? queryParams : undefined,
271
+ data,
272
+ contextName: flags.context,
273
+ binary: true,
274
+ });
275
+ const fsModule = await import('node:fs');
276
+ const binData = binResponse.data;
277
+ const buffer = Buffer.isBuffer(binData)
278
+ ? binData
279
+ : Buffer.from(binData);
280
+ fsModule.writeFileSync(flags.file, buffer);
281
+ this.log(`Saved ${buffer.length} bytes to ${flags.file}`);
282
+ return;
283
+ }
256
284
  const response = await apiRequest(endpoint.method, apiPath, {
257
285
  params: Object.keys(queryParams).length > 0 ? queryParams : undefined,
258
286
  data,
@@ -343,6 +371,7 @@ export default class EventProcessorMappings extends Command {
343
371
  }
344
372
  else if (flags.set && flags.set.length > 0) {
345
373
  const item = {};
374
+ const arrayFields = new Set(ENDPOINTS['create']?.bodyArrayFields ?? []);
346
375
  for (const pair of flags.set) {
347
376
  const eqIndex = pair.indexOf('=');
348
377
  if (eqIndex === -1)
@@ -353,6 +382,15 @@ export default class EventProcessorMappings extends Command {
353
382
  value = JSON.parse(value);
354
383
  }
355
384
  catch { /* keep as string */ }
385
+ const isArrayField = !key.includes('.') && arrayFields.has(key);
386
+ if (isArrayField && !Array.isArray(value)) {
387
+ if (typeof value === 'string') {
388
+ value = value.split(',').map(v => v.trim()).filter(v => v.length > 0);
389
+ }
390
+ else if (value !== undefined && value !== null) {
391
+ value = [value];
392
+ }
393
+ }
356
394
  const keys = key.split('.');
357
395
  if (keys.some(k => k === '__proto__' || k === 'constructor' || k === 'prototype')) {
358
396
  this.error(`Invalid --set key: ${key}`);
@@ -502,14 +540,7 @@ export default class EventProcessorMappings extends Command {
502
540
  if (eqIndex === -1)
503
541
  this.error(`Invalid --filter format: ${f}. Use: --filter key=value`);
504
542
  const key = f.slice(0, eqIndex);
505
- let value = f.slice(eqIndex + 1);
506
- const opMatch = value.match(/^\$?(eq|ne|in|like|gt|gte|lt|lte|null):/);
507
- if (opMatch) {
508
- value = `\$${opMatch[1]}:${value.slice(opMatch[0].length)}`;
509
- }
510
- else {
511
- value = `\$eq:${value}`;
512
- }
543
+ const value = this.parseFilterValue(f.slice(eqIndex + 1));
513
544
  const filterKey = `filter.${key}`;
514
545
  if (filterKey in baseParams) {
515
546
  const existing = baseParams[filterKey];
@@ -686,6 +717,7 @@ export default class EventProcessorMappings extends Command {
686
717
  }
687
718
  else if (flags.set && flags.set.length > 0) {
688
719
  const item = {};
720
+ const arrayFields = new Set(ENDPOINTS[`create-${suffix}`]?.bodyArrayFields ?? []);
689
721
  for (const pair of flags.set) {
690
722
  const eqIndex = pair.indexOf('=');
691
723
  if (eqIndex === -1)
@@ -696,6 +728,15 @@ export default class EventProcessorMappings extends Command {
696
728
  value = JSON.parse(value);
697
729
  }
698
730
  catch { /* keep as string */ }
731
+ const isArrayField = !key.includes('.') && arrayFields.has(key);
732
+ if (isArrayField && !Array.isArray(value)) {
733
+ if (typeof value === 'string') {
734
+ value = value.split(',').map(v => v.trim()).filter(v => v.length > 0);
735
+ }
736
+ else if (value !== undefined && value !== null) {
737
+ value = [value];
738
+ }
739
+ }
699
740
  const keys = key.split('.');
700
741
  if (keys.some(k => k === '__proto__' || k === 'constructor' || k === 'prototype')) {
701
742
  this.error(`Invalid --set key: ${key}`);
@@ -815,35 +856,62 @@ export default class EventProcessorMappings extends Command {
815
856
  this.log('');
816
857
  this.log(`Summary: ${created} created, ${updated} updated, ${errors.length} failed`);
817
858
  }
859
+ parseFilterValue(value) {
860
+ // Recognises the nestjs-paginate operator set (with or without the leading $)
861
+ // and recursively unwraps chained operators like 'not:null' -> '$not:$null'
862
+ // or 'not:like:John' -> '$not:$like:John'. Falls back to '$eq:<value>' when
863
+ // no operator prefix is present.
864
+ const opRe = /^\$?(and|or|not|eq|gt|gte|in|null|lt|lte|btw|ne|ilike|like|sw|contains)(?::|$)/;
865
+ const m = value.match(opRe);
866
+ if (!m)
867
+ return `\$eq:${value}`;
868
+ const op = m[1];
869
+ const rest = value.slice(m[0].length);
870
+ if (rest === '')
871
+ return `\$${op}`;
872
+ return opRe.test(rest) ? `\$${op}:${this.parseFilterValue(rest)}` : `\$${op}:${rest}`;
873
+ }
818
874
  filterFields(data, fields) {
819
875
  const isUnsafeKey = (k) => k === '__proto__' || k === 'constructor' || k === 'prototype';
820
876
  const pick = (obj, keys) => {
821
- const result = {};
877
+ // Group keys by their first segment so sibling sub-paths
878
+ // (e.g. 'items.amount' + 'items._type') resolve in one recursive pass
879
+ // and don't clobber each other on merge.
880
+ const directKeys = new Set();
881
+ const nestedKeys = new Map();
822
882
  for (const key of keys) {
823
883
  if (key.split('.').some(isUnsafeKey))
824
884
  continue;
825
885
  if (key.includes('.')) {
826
- // Handle nested fields like 'customer.name' or 'allocations.salesInvoiceId'
827
886
  const [first, ...rest] = key.split('.');
828
- const val = obj[first];
829
- if (val && typeof val === 'object') {
830
- const restKey = rest.join('.');
831
- if (Array.isArray(val)) {
832
- // Map over array elements (e.g., allocations[].salesInvoiceId)
833
- const existing = Array.isArray(result[first]) ? result[first] : [];
834
- result[first] = val.map((item, i) => ({
835
- ...(existing[i] || {}),
836
- ...pick(item, [restKey]),
837
- }));
838
- }
839
- else {
840
- const nested = pick(val, [restKey]);
841
- result[first] = { ...(result[first] || {}), ...nested };
842
- }
887
+ if (isUnsafeKey(first))
888
+ continue;
889
+ const list = nestedKeys.get(first);
890
+ if (list) {
891
+ list.push(rest.join('.'));
892
+ }
893
+ else {
894
+ nestedKeys.set(first, [rest.join('.')]);
843
895
  }
844
896
  }
845
- else if (key in obj) {
897
+ else {
898
+ directKeys.add(key);
899
+ }
900
+ }
901
+ const result = {};
902
+ for (const key of directKeys) {
903
+ if (key in obj)
846
904
  result[key] = obj[key];
905
+ }
906
+ for (const [first, restKeys] of nestedKeys) {
907
+ const val = obj[first];
908
+ if (!val || typeof val !== 'object')
909
+ continue;
910
+ if (Array.isArray(val)) {
911
+ result[first] = val.map(item => pick(item, restKeys));
912
+ }
913
+ else {
914
+ result[first] = pick(val, restKeys);
847
915
  }
848
916
  }
849
917
  return result;
@@ -0,0 +1,40 @@
1
+ import { Command } from '@oclif/core';
2
+ export default class FilesInternal 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
+ page: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
18
+ limit: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
+ include: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
20
+ search: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
21
+ 'sort-by': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
22
+ filter: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
23
+ query: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
24
+ fields: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
25
+ sanitize: import("@oclif/core/interfaces").BooleanFlag<boolean>;
26
+ 'show-http-request': import("@oclif/core/interfaces").BooleanFlag<boolean>;
27
+ };
28
+ run(): Promise<void>;
29
+ private runImport;
30
+ private runExport;
31
+ private runCamt053Import;
32
+ private runNestedImport;
33
+ private parseFilterValue;
34
+ private filterFields;
35
+ private sanitizeOutput;
36
+ private getColumns;
37
+ private getValue;
38
+ private printTable;
39
+ private printCsv;
40
+ }