@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.
- package/README.md +6 -0
- package/dist/commands/access-groups 3.d.ts +40 -0
- package/dist/commands/{access-groups 2.js → access-groups 3.js } +106 -40
- package/dist/commands/access-groups.d.ts +40 -0
- package/dist/commands/access-groups.js +1074 -0
- package/dist/commands/account-transactions.d.ts +42 -0
- package/dist/commands/account-transactions.js +1088 -0
- package/dist/commands/accounts 2.d.ts +41 -0
- package/dist/commands/accounts 2.js +1078 -0
- package/dist/commands/accounts.d.ts +41 -0
- package/dist/commands/accounts.js +1080 -0
- package/dist/commands/agent-runs.d.ts +40 -0
- package/dist/commands/agent-runs.js +1071 -0
- package/dist/commands/async-endpoints-internal 3.d.ts +40 -0
- package/dist/commands/{processing-logs.js → async-endpoints-internal 3.js } +110 -46
- package/dist/commands/async-endpoints-internal.d.ts +40 -0
- package/dist/commands/async-endpoints-internal.js +1064 -0
- package/dist/commands/audit-log 3.d.ts +40 -0
- package/dist/commands/audit-log 3.js +1066 -0
- package/dist/commands/audit-log.d.ts +40 -0
- package/dist/commands/audit-log.js +1068 -0
- package/dist/commands/auth/login.d.ts +14 -0
- package/dist/commands/auth/login.js +116 -0
- package/dist/commands/auth/logout.d.ts +10 -0
- package/dist/commands/auth/logout.js +58 -0
- package/dist/commands/auth/status.d.ts +12 -0
- package/dist/commands/auth/status.js +101 -0
- package/dist/commands/auth/tenant.d.ts +19 -0
- package/dist/commands/auth/tenant.js +184 -0
- package/dist/commands/auth.d.ts +37 -0
- package/dist/commands/auth.js +871 -0
- package/dist/commands/bank-accounts.d.ts +42 -0
- package/dist/commands/bank-accounts.js +1088 -0
- package/dist/commands/bank-integrations.d.ts +1 -0
- package/dist/commands/bank-integrations.js +122 -54
- package/dist/commands/business-partners 3.d.ts +41 -0
- package/dist/commands/business-partners 3.js +1078 -0
- package/dist/commands/business-partners---contacts 3.d.ts +42 -0
- package/dist/commands/business-partners---contacts 3.js +1072 -0
- package/dist/commands/business-partners---contacts.d.ts +1 -0
- package/dist/commands/business-partners---contacts.js +114 -46
- package/dist/commands/business-partners.d.ts +1 -0
- package/dist/commands/business-partners.js +114 -46
- package/dist/commands/config/add.d.ts +13 -0
- package/dist/commands/config/add.js +120 -0
- package/dist/commands/config/current.d.ts +9 -0
- package/dist/commands/config/current.js +43 -0
- package/dist/commands/config/delete.d.ts +12 -0
- package/dist/commands/config/delete.js +67 -0
- package/dist/commands/config/list.d.ts +9 -0
- package/dist/commands/config/list.js +50 -0
- package/dist/commands/config/use.d.ts +9 -0
- package/dist/commands/config/use.js +40 -0
- package/dist/commands/credit-card-accounts 3.d.ts +42 -0
- package/dist/commands/credit-card-accounts 3.js +1084 -0
- package/dist/commands/credit-card-accounts.d.ts +1 -0
- package/dist/commands/credit-card-accounts.js +119 -51
- package/dist/commands/documents.d.ts +1 -0
- package/dist/commands/documents.js +110 -42
- package/dist/commands/dunning-configs 3.d.ts +40 -0
- package/dist/commands/dunning-configs 3.js +1072 -0
- package/dist/commands/dunning-configs.d.ts +1 -0
- package/dist/commands/dunning-configs.js +109 -41
- package/dist/commands/dunning-reminders.d.ts +1 -0
- package/dist/commands/dunning-reminders.js +112 -44
- package/dist/commands/dunning-runs 3.d.ts +40 -0
- package/dist/commands/{pubsub.js → dunning-runs 3.js } +108 -43
- package/dist/commands/dunning-runs.d.ts +1 -0
- package/dist/commands/dunning-runs.js +105 -37
- package/dist/commands/employees.d.ts +1 -0
- package/dist/commands/employees.js +136 -68
- package/dist/commands/event-processor-mappings 3.d.ts +40 -0
- package/dist/commands/event-processor-mappings 3.js +1071 -0
- package/dist/commands/event-processor-mappings.d.ts +1 -0
- package/dist/commands/event-processor-mappings.js +109 -41
- package/dist/commands/files-internal 3.d.ts +40 -0
- package/dist/commands/files-internal 3.js +1073 -0
- package/dist/commands/files-internal.d.ts +1 -0
- package/dist/commands/files-internal.js +113 -45
- package/dist/commands/health 3.d.ts +40 -0
- package/dist/commands/health 3.js +1067 -0
- package/dist/commands/health.d.ts +1 -0
- package/dist/commands/health.js +109 -41
- package/dist/commands/{pubsub.d.ts → inbox 3.d.ts } +2 -1
- package/dist/commands/inbox 3.js +1065 -0
- package/dist/commands/inbox.d.ts +1 -0
- package/dist/commands/inbox.js +110 -40
- package/dist/commands/integrations 3.d.ts +41 -0
- package/dist/commands/integrations 3.js +1067 -0
- package/dist/commands/integrations.d.ts +1 -0
- package/dist/commands/integrations.js +107 -39
- package/dist/commands/item-categories 3.d.ts +40 -0
- package/dist/commands/item-categories 3.js +1072 -0
- package/dist/commands/item-categories.d.ts +1 -0
- package/dist/commands/item-categories.js +109 -41
- package/dist/commands/items 3.d.ts +40 -0
- package/dist/commands/items 3.js +1072 -0
- package/dist/commands/items.d.ts +1 -0
- package/dist/commands/items.js +109 -41
- package/dist/commands/journal-lines.d.ts +1 -0
- package/dist/commands/journal-lines.js +105 -37
- package/dist/commands/journals 3.d.ts +42 -0
- package/dist/commands/journals 3.js +1088 -0
- package/dist/commands/journals.d.ts +1 -0
- package/dist/commands/journals.js +123 -55
- package/dist/commands/ledgers.d.ts +1 -0
- package/dist/commands/ledgers.js +120 -52
- package/dist/commands/office-locations 3.d.ts +40 -0
- package/dist/commands/office-locations 3.js +1072 -0
- package/dist/commands/office-locations.d.ts +1 -0
- package/dist/commands/office-locations.js +109 -41
- package/dist/commands/payment-method-ledger-mappings 3.d.ts +41 -0
- package/dist/commands/payment-method-ledger-mappings 3.js +1066 -0
- package/dist/commands/payment-method-ledger-mappings.d.ts +1 -0
- package/dist/commands/payment-method-ledger-mappings.js +109 -41
- package/dist/commands/payment-methods 3.d.ts +40 -0
- package/dist/commands/payment-methods 3.js +1072 -0
- package/dist/commands/payment-methods.d.ts +1 -0
- package/dist/commands/payment-methods.js +109 -41
- package/dist/commands/payment-runs 3.d.ts +42 -0
- package/dist/commands/payment-runs 3.js +1087 -0
- package/dist/commands/payment-runs.d.ts +1 -0
- package/dist/commands/payment-runs.js +122 -54
- package/dist/commands/payment-terms 3.d.ts +40 -0
- package/dist/commands/payment-terms 3.js +1073 -0
- package/dist/commands/payment-terms.d.ts +1 -0
- package/dist/commands/payment-terms.js +110 -42
- package/dist/commands/price-lists 3.d.ts +41 -0
- package/dist/commands/price-lists 3.js +1078 -0
- package/dist/commands/price-lists.d.ts +1 -0
- package/dist/commands/price-lists.js +114 -46
- package/dist/commands/processor-mappings 2.d.ts +40 -0
- package/dist/commands/processor-mappings 2.js +1070 -0
- package/dist/commands/processor-mappings.d.ts +1 -0
- package/dist/commands/processor-mappings.js +108 -40
- package/dist/commands/processors.d.ts +1 -0
- package/dist/commands/processors.js +113 -45
- package/dist/commands/reconciliation 3.d.ts +40 -0
- package/dist/commands/reconciliation 3.js +1069 -0
- package/dist/commands/reconciliation.d.ts +1 -0
- package/dist/commands/reconciliation.js +110 -42
- package/dist/commands/reports.d.ts +1 -0
- package/dist/commands/reports.js +110 -39
- package/dist/commands/salary-types 3.d.ts +40 -0
- package/dist/commands/salary-types 3.js +1072 -0
- package/dist/commands/salary-types.d.ts +1 -0
- package/dist/commands/salary-types.js +1074 -0
- package/dist/commands/sales-invoices 3.d.ts +43 -0
- package/dist/commands/sales-invoices 3.js +1100 -0
- package/dist/commands/sales-invoices.d.ts +1 -0
- package/dist/commands/sales-invoices.js +134 -66
- package/dist/commands/sales-orders 3.d.ts +43 -0
- package/dist/commands/sales-orders 3.js +1098 -0
- package/dist/commands/sales-orders.d.ts +1 -0
- package/dist/commands/sales-orders.js +133 -64
- package/dist/commands/switch.d.ts +1 -0
- package/dist/commands/switch.js +58 -3
- package/dist/commands/{processing-logs.d.ts → tags 3.d.ts } +2 -1
- package/dist/commands/tags 3.js +1072 -0
- package/dist/commands/tags.d.ts +1 -0
- package/dist/commands/tags.js +109 -41
- package/dist/commands/tax-codes 3.d.ts +40 -0
- package/dist/commands/tax-codes 3.js +1075 -0
- package/dist/commands/tax-codes.d.ts +1 -0
- package/dist/commands/tax-codes.js +112 -44
- package/dist/commands/tax-matrix.d.ts +1 -0
- package/dist/commands/tax-matrix.js +109 -41
- package/dist/commands/tenants.d.ts +1 -0
- package/dist/commands/tenants.js +109 -41
- package/dist/commands/text-templates 3.d.ts +40 -0
- package/dist/commands/text-templates 3.js +1072 -0
- package/dist/commands/text-templates.d.ts +1 -0
- package/dist/commands/text-templates.js +109 -41
- package/dist/commands/tools.d.ts +1 -0
- package/dist/commands/tools.js +106 -38
- package/dist/commands/vendor-invoices.d.ts +1 -0
- package/dist/commands/vendor-invoices.js +139 -69
- package/dist/commands/webhooks 3.d.ts +40 -0
- package/dist/commands/webhooks 3.js +1074 -0
- package/dist/commands/webhooks.d.ts +1 -0
- package/dist/commands/webhooks.js +111 -43
- package/dist/commands/workflows.d.ts +1 -0
- package/dist/commands/workflows.js +107 -39
- package/dist/lib/api-client.d.ts +5 -1
- package/dist/lib/api-client.js +19 -5
- package/dist/lib/auth.d.ts +16 -1
- package/dist/lib/auth.js +170 -45
- package/dist/lib/config.d.ts +7 -0
- package/dist/lib/config.js +7 -1
- package/oclif.manifest.json +7464 -653
- package/package.json +2 -2
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
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
|
|
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
|
+
}
|