@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,9 +8,9 @@ const HAS_CAMT053 = false;
|
|
|
8
8
|
const NESTED_IMPORTS = [];
|
|
9
9
|
const SUBCOMMANDS = [...["get", "update", "delete"], ...(HAS_IMPORT ? ['import'] : []), ...(HAS_EXPORT ? ['export'] : []), ...NESTED_IMPORTS.map(n => `import-${n}`)];
|
|
10
10
|
const ENDPOINTS = {
|
|
11
|
-
'get': { method: 'GET', path: '/v1/integrations/{integrationName}/{configKey}', summary: 'Get integration configuration', pathParams: ['integrationName', 'configKey'], hasBody: false, isMultipart: false },
|
|
12
|
-
'update': { method: 'PUT', path: '/v1/integrations/{integrationName}/{configKey}', summary: 'Create or update integration configuration', pathParams: ['integrationName', 'configKey'], hasBody: true, isMultipart: false },
|
|
13
|
-
'delete': { method: 'DELETE', path: '/v1/integrations/{integrationName}/{configKey}', summary: 'Delete integration configuration', pathParams: ['integrationName', 'configKey'], hasBody: false, isMultipart: false },
|
|
11
|
+
'get': { method: 'GET', path: '/v1/integrations/{integrationName}/{configKey}', summary: 'Get integration configuration', pathParams: ['integrationName', 'configKey'], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
|
|
12
|
+
'update': { method: 'PUT', path: '/v1/integrations/{integrationName}/{configKey}', summary: 'Create or update integration configuration', pathParams: ['integrationName', 'configKey'], hasBody: true, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
|
|
13
|
+
'delete': { method: 'DELETE', path: '/v1/integrations/{integrationName}/{configKey}', summary: 'Delete integration configuration', pathParams: ['integrationName', 'configKey'], hasBody: false, isMultipart: false, isBinaryResponse: false, bodyArrayFields: [] },
|
|
14
14
|
};
|
|
15
15
|
export default class Integrations extends Command {
|
|
16
16
|
static description = 'Manage integrations';
|
|
@@ -125,15 +125,7 @@ export default class Integrations extends Command {
|
|
|
125
125
|
if (eqIndex === -1)
|
|
126
126
|
this.error(`Invalid --filter format: ${f}. Use: --filter key=value`);
|
|
127
127
|
const key = f.slice(0, eqIndex);
|
|
128
|
-
|
|
129
|
-
// Check for operator prefix (with or without $)
|
|
130
|
-
const opMatch = value.match(/^\$?(eq|ne|in|like|gt|gte|lt|lte|null):/);
|
|
131
|
-
if (opMatch) {
|
|
132
|
-
value = `\$${opMatch[1]}:${value.slice(opMatch[0].length)}`;
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
value = `\$eq:${value}`;
|
|
136
|
-
}
|
|
128
|
+
const value = this.parseFilterValue(f.slice(eqIndex + 1));
|
|
137
129
|
const filterKey = `filter.${key}`;
|
|
138
130
|
if (filterKey in queryParams) {
|
|
139
131
|
// Multiple filters on same field: collect as array
|
|
@@ -166,7 +158,9 @@ export default class Integrations extends Command {
|
|
|
166
158
|
data = form;
|
|
167
159
|
}
|
|
168
160
|
else if (endpoint.hasBody) {
|
|
169
|
-
|
|
161
|
+
// For binary-response endpoints, --file is the output path, not a JSON
|
|
162
|
+
// input file — skip the read-as-body branch.
|
|
163
|
+
if (flags.file && !endpoint.isBinaryResponse) {
|
|
170
164
|
const fsModule = await import('node:fs');
|
|
171
165
|
try {
|
|
172
166
|
data = JSON.parse(fsModule.readFileSync(flags.file, 'utf-8'));
|
|
@@ -188,6 +182,7 @@ export default class Integrations extends Command {
|
|
|
188
182
|
if (!data)
|
|
189
183
|
data = {};
|
|
190
184
|
const body = data;
|
|
185
|
+
const arrayFields = new Set(endpoint.bodyArrayFields);
|
|
191
186
|
for (const pair of flags.set) {
|
|
192
187
|
const eqIndex = pair.indexOf('=');
|
|
193
188
|
if (eqIndex === -1)
|
|
@@ -199,6 +194,19 @@ export default class Integrations extends Command {
|
|
|
199
194
|
value = JSON.parse(value);
|
|
200
195
|
}
|
|
201
196
|
catch { /* keep as string */ }
|
|
197
|
+
// For top-level keys typed as array in the API schema, split bare
|
|
198
|
+
// comma-separated input (e.g. "1171,1170" -> ["1171","1170"]) and
|
|
199
|
+
// wrap a lone scalar in a single-element array. Skips when --set
|
|
200
|
+
// already provided a JSON array.
|
|
201
|
+
const isArrayField = !key.includes('.') && arrayFields.has(key);
|
|
202
|
+
if (isArrayField && !Array.isArray(value)) {
|
|
203
|
+
if (typeof value === 'string') {
|
|
204
|
+
value = value.split(',').map(v => v.trim()).filter(v => v.length > 0);
|
|
205
|
+
}
|
|
206
|
+
else if (value !== undefined && value !== null) {
|
|
207
|
+
value = [value];
|
|
208
|
+
}
|
|
209
|
+
}
|
|
202
210
|
// Support nested keys like "address.city"
|
|
203
211
|
const keys = key.split('.');
|
|
204
212
|
if (keys.some(k => k === '__proto__' || k === 'constructor' || k === 'prototype')) {
|
|
@@ -249,6 +257,26 @@ export default class Integrations extends Command {
|
|
|
249
257
|
process.stderr.write('\n');
|
|
250
258
|
}
|
|
251
259
|
try {
|
|
260
|
+
// Binary response: download to file
|
|
261
|
+
if (endpoint.isBinaryResponse) {
|
|
262
|
+
if (!flags.file) {
|
|
263
|
+
this.error(`Endpoint returns a binary file. Specify the output path with -f / --file (e.g. -f report.xlsx).`);
|
|
264
|
+
}
|
|
265
|
+
const binResponse = await apiRequest(endpoint.method, apiPath, {
|
|
266
|
+
params: Object.keys(queryParams).length > 0 ? queryParams : undefined,
|
|
267
|
+
data,
|
|
268
|
+
contextName: flags.context,
|
|
269
|
+
binary: true,
|
|
270
|
+
});
|
|
271
|
+
const fsModule = await import('node:fs');
|
|
272
|
+
const binData = binResponse.data;
|
|
273
|
+
const buffer = Buffer.isBuffer(binData)
|
|
274
|
+
? binData
|
|
275
|
+
: Buffer.from(binData);
|
|
276
|
+
fsModule.writeFileSync(flags.file, buffer);
|
|
277
|
+
this.log(`Saved ${buffer.length} bytes to ${flags.file}`);
|
|
278
|
+
return;
|
|
279
|
+
}
|
|
252
280
|
const response = await apiRequest(endpoint.method, apiPath, {
|
|
253
281
|
params: Object.keys(queryParams).length > 0 ? queryParams : undefined,
|
|
254
282
|
data,
|
|
@@ -339,6 +367,7 @@ export default class Integrations extends Command {
|
|
|
339
367
|
}
|
|
340
368
|
else if (flags.set && flags.set.length > 0) {
|
|
341
369
|
const item = {};
|
|
370
|
+
const arrayFields = new Set(ENDPOINTS['create']?.bodyArrayFields ?? []);
|
|
342
371
|
for (const pair of flags.set) {
|
|
343
372
|
const eqIndex = pair.indexOf('=');
|
|
344
373
|
if (eqIndex === -1)
|
|
@@ -349,6 +378,15 @@ export default class Integrations extends Command {
|
|
|
349
378
|
value = JSON.parse(value);
|
|
350
379
|
}
|
|
351
380
|
catch { /* keep as string */ }
|
|
381
|
+
const isArrayField = !key.includes('.') && arrayFields.has(key);
|
|
382
|
+
if (isArrayField && !Array.isArray(value)) {
|
|
383
|
+
if (typeof value === 'string') {
|
|
384
|
+
value = value.split(',').map(v => v.trim()).filter(v => v.length > 0);
|
|
385
|
+
}
|
|
386
|
+
else if (value !== undefined && value !== null) {
|
|
387
|
+
value = [value];
|
|
388
|
+
}
|
|
389
|
+
}
|
|
352
390
|
const keys = key.split('.');
|
|
353
391
|
if (keys.some(k => k === '__proto__' || k === 'constructor' || k === 'prototype')) {
|
|
354
392
|
this.error(`Invalid --set key: ${key}`);
|
|
@@ -498,14 +536,7 @@ export default class Integrations extends Command {
|
|
|
498
536
|
if (eqIndex === -1)
|
|
499
537
|
this.error(`Invalid --filter format: ${f}. Use: --filter key=value`);
|
|
500
538
|
const key = f.slice(0, eqIndex);
|
|
501
|
-
|
|
502
|
-
const opMatch = value.match(/^\$?(eq|ne|in|like|gt|gte|lt|lte|null):/);
|
|
503
|
-
if (opMatch) {
|
|
504
|
-
value = `\$${opMatch[1]}:${value.slice(opMatch[0].length)}`;
|
|
505
|
-
}
|
|
506
|
-
else {
|
|
507
|
-
value = `\$eq:${value}`;
|
|
508
|
-
}
|
|
539
|
+
const value = this.parseFilterValue(f.slice(eqIndex + 1));
|
|
509
540
|
const filterKey = `filter.${key}`;
|
|
510
541
|
if (filterKey in baseParams) {
|
|
511
542
|
const existing = baseParams[filterKey];
|
|
@@ -682,6 +713,7 @@ export default class Integrations extends Command {
|
|
|
682
713
|
}
|
|
683
714
|
else if (flags.set && flags.set.length > 0) {
|
|
684
715
|
const item = {};
|
|
716
|
+
const arrayFields = new Set(ENDPOINTS[`create-${suffix}`]?.bodyArrayFields ?? []);
|
|
685
717
|
for (const pair of flags.set) {
|
|
686
718
|
const eqIndex = pair.indexOf('=');
|
|
687
719
|
if (eqIndex === -1)
|
|
@@ -692,6 +724,15 @@ export default class Integrations extends Command {
|
|
|
692
724
|
value = JSON.parse(value);
|
|
693
725
|
}
|
|
694
726
|
catch { /* keep as string */ }
|
|
727
|
+
const isArrayField = !key.includes('.') && arrayFields.has(key);
|
|
728
|
+
if (isArrayField && !Array.isArray(value)) {
|
|
729
|
+
if (typeof value === 'string') {
|
|
730
|
+
value = value.split(',').map(v => v.trim()).filter(v => v.length > 0);
|
|
731
|
+
}
|
|
732
|
+
else if (value !== undefined && value !== null) {
|
|
733
|
+
value = [value];
|
|
734
|
+
}
|
|
735
|
+
}
|
|
695
736
|
const keys = key.split('.');
|
|
696
737
|
if (keys.some(k => k === '__proto__' || k === 'constructor' || k === 'prototype')) {
|
|
697
738
|
this.error(`Invalid --set key: ${key}`);
|
|
@@ -811,35 +852,62 @@ export default class Integrations extends Command {
|
|
|
811
852
|
this.log('');
|
|
812
853
|
this.log(`Summary: ${created} created, ${updated} updated, ${errors.length} failed`);
|
|
813
854
|
}
|
|
855
|
+
parseFilterValue(value) {
|
|
856
|
+
// Recognises the nestjs-paginate operator set (with or without the leading $)
|
|
857
|
+
// and recursively unwraps chained operators like 'not:null' -> '$not:$null'
|
|
858
|
+
// or 'not:like:John' -> '$not:$like:John'. Falls back to '$eq:<value>' when
|
|
859
|
+
// no operator prefix is present.
|
|
860
|
+
const opRe = /^\$?(and|or|not|eq|gt|gte|in|null|lt|lte|btw|ne|ilike|like|sw|contains)(?::|$)/;
|
|
861
|
+
const m = value.match(opRe);
|
|
862
|
+
if (!m)
|
|
863
|
+
return `\$eq:${value}`;
|
|
864
|
+
const op = m[1];
|
|
865
|
+
const rest = value.slice(m[0].length);
|
|
866
|
+
if (rest === '')
|
|
867
|
+
return `\$${op}`;
|
|
868
|
+
return opRe.test(rest) ? `\$${op}:${this.parseFilterValue(rest)}` : `\$${op}:${rest}`;
|
|
869
|
+
}
|
|
814
870
|
filterFields(data, fields) {
|
|
815
871
|
const isUnsafeKey = (k) => k === '__proto__' || k === 'constructor' || k === 'prototype';
|
|
816
872
|
const pick = (obj, keys) => {
|
|
817
|
-
|
|
873
|
+
// Group keys by their first segment so sibling sub-paths
|
|
874
|
+
// (e.g. 'items.amount' + 'items._type') resolve in one recursive pass
|
|
875
|
+
// and don't clobber each other on merge.
|
|
876
|
+
const directKeys = new Set();
|
|
877
|
+
const nestedKeys = new Map();
|
|
818
878
|
for (const key of keys) {
|
|
819
879
|
if (key.split('.').some(isUnsafeKey))
|
|
820
880
|
continue;
|
|
821
881
|
if (key.includes('.')) {
|
|
822
|
-
// Handle nested fields like 'customer.name' or 'allocations.salesInvoiceId'
|
|
823
882
|
const [first, ...rest] = key.split('.');
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
...pick(item, [restKey]),
|
|
833
|
-
}));
|
|
834
|
-
}
|
|
835
|
-
else {
|
|
836
|
-
const nested = pick(val, [restKey]);
|
|
837
|
-
result[first] = { ...(result[first] || {}), ...nested };
|
|
838
|
-
}
|
|
883
|
+
if (isUnsafeKey(first))
|
|
884
|
+
continue;
|
|
885
|
+
const list = nestedKeys.get(first);
|
|
886
|
+
if (list) {
|
|
887
|
+
list.push(rest.join('.'));
|
|
888
|
+
}
|
|
889
|
+
else {
|
|
890
|
+
nestedKeys.set(first, [rest.join('.')]);
|
|
839
891
|
}
|
|
840
892
|
}
|
|
841
|
-
else
|
|
893
|
+
else {
|
|
894
|
+
directKeys.add(key);
|
|
895
|
+
}
|
|
896
|
+
}
|
|
897
|
+
const result = {};
|
|
898
|
+
for (const key of directKeys) {
|
|
899
|
+
if (key in obj)
|
|
842
900
|
result[key] = obj[key];
|
|
901
|
+
}
|
|
902
|
+
for (const [first, restKeys] of nestedKeys) {
|
|
903
|
+
const val = obj[first];
|
|
904
|
+
if (!val || typeof val !== 'object')
|
|
905
|
+
continue;
|
|
906
|
+
if (Array.isArray(val)) {
|
|
907
|
+
result[first] = val.map(item => pick(item, restKeys));
|
|
908
|
+
}
|
|
909
|
+
else {
|
|
910
|
+
result[first] = pick(val, restKeys);
|
|
843
911
|
}
|
|
844
912
|
}
|
|
845
913
|
return result;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class ItemCategories 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
|
+
}
|