@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
package/dist/commands/inbox.d.ts
CHANGED
package/dist/commands/inbox.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
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
|
|
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
|
+
}
|