@aderis-erp/cli 1.0.15 → 1.0.17
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 +30 -8
- package/dist/commands/access-groups.d.ts +0 -1
- package/dist/commands/access-groups.js +5 -61
- package/dist/commands/account-transaction-allocations.d.ts +0 -1
- package/dist/commands/account-transaction-allocations.js +5 -61
- package/dist/commands/account-transactions.d.ts +0 -1
- package/dist/commands/account-transactions.js +9 -63
- package/dist/commands/accounts.d.ts +0 -1
- package/dist/commands/accounts.js +5 -61
- package/dist/commands/agent-platform.d.ts +0 -1
- package/dist/commands/agent-platform.js +5 -61
- package/dist/commands/analytics.d.ts +0 -1
- package/dist/commands/analytics.js +5 -61
- package/dist/commands/api-keys.d.ts +39 -0
- package/dist/commands/api-keys.js +1117 -0
- package/dist/commands/audit-log.d.ts +0 -1
- package/dist/commands/audit-log.js +5 -61
- package/dist/commands/auth/login.d.ts +9 -0
- package/dist/commands/auth/login.js +73 -20
- package/dist/commands/auth/logout.d.ts +4 -0
- package/dist/commands/auth/logout.js +4 -0
- package/dist/commands/auth/status.js +26 -17
- package/dist/commands/auth/tenant.js +3 -6
- package/dist/commands/auth.d.ts +0 -1
- package/dist/commands/auth.js +5 -34
- package/dist/commands/bank-accounts.d.ts +0 -1
- package/dist/commands/bank-accounts.js +5 -61
- package/dist/commands/bank-integrations.d.ts +0 -1
- package/dist/commands/bank-integrations.js +5 -61
- package/dist/commands/business-partners.d.ts +1 -1
- package/dist/commands/business-partners.js +14 -63
- package/dist/commands/chat.d.ts +0 -1
- package/dist/commands/chat.js +5 -61
- package/dist/commands/config/add.d.ts +3 -0
- package/dist/commands/config/add.js +34 -16
- package/dist/commands/config/current.js +3 -0
- package/dist/commands/config/list.js +3 -0
- package/dist/commands/credit-card-accounts.d.ts +0 -1
- package/dist/commands/credit-card-accounts.js +5 -61
- package/dist/commands/delivery-notes.d.ts +0 -1
- package/dist/commands/delivery-notes.js +7 -63
- package/dist/commands/dunning-configs.d.ts +0 -1
- package/dist/commands/dunning-configs.js +5 -61
- package/dist/commands/dunning-reminders.d.ts +0 -1
- package/dist/commands/dunning-reminders.js +5 -61
- package/dist/commands/dunning-runs.d.ts +0 -1
- package/dist/commands/dunning-runs.js +5 -61
- package/dist/commands/email-transactions.d.ts +0 -1
- package/dist/commands/email-transactions.js +5 -61
- package/dist/commands/employees.d.ts +0 -1
- package/dist/commands/employees.js +5 -61
- package/dist/commands/entity-configurations.d.ts +0 -1
- package/dist/commands/entity-configurations.js +5 -61
- package/dist/commands/event-processor-mappings.d.ts +0 -1
- package/dist/commands/event-processor-mappings.js +5 -61
- package/dist/commands/files.d.ts +0 -1
- package/dist/commands/files.js +5 -61
- package/dist/commands/health.d.ts +0 -1
- package/dist/commands/health.js +5 -61
- package/dist/commands/inbox.d.ts +0 -1
- package/dist/commands/inbox.js +5 -61
- package/dist/commands/integrations.d.ts +0 -1
- package/dist/commands/integrations.js +5 -61
- package/dist/commands/item-categories.d.ts +0 -1
- package/dist/commands/item-categories.js +5 -61
- package/dist/commands/items.d.ts +0 -1
- package/dist/commands/items.js +5 -61
- package/dist/commands/journal-lines.d.ts +0 -1
- package/dist/commands/journal-lines.js +5 -61
- package/dist/commands/journals.d.ts +1 -1
- package/dist/commands/journals.js +9 -62
- package/dist/commands/ledgers.d.ts +0 -1
- package/dist/commands/ledgers.js +5 -61
- package/dist/commands/nango-integrations.d.ts +39 -0
- package/dist/commands/nango-integrations.js +1115 -0
- package/dist/commands/office-locations.d.ts +0 -1
- package/dist/commands/office-locations.js +5 -61
- package/dist/commands/payment-methods.d.ts +0 -1
- package/dist/commands/payment-methods.js +5 -61
- package/dist/commands/payment-runs.d.ts +0 -1
- package/dist/commands/payment-runs.js +5 -61
- package/dist/commands/payment-terms.d.ts +0 -1
- package/dist/commands/payment-terms.js +5 -61
- package/dist/commands/payments.d.ts +0 -1
- package/dist/commands/payments.js +5 -61
- package/dist/commands/price-lists.d.ts +0 -1
- package/dist/commands/price-lists.js +5 -61
- package/dist/commands/processor-mappings.d.ts +0 -1
- package/dist/commands/processor-mappings.js +5 -61
- package/dist/commands/processors.d.ts +0 -1
- package/dist/commands/processors.js +5 -61
- package/dist/commands/purchase-order-types.d.ts +0 -1
- package/dist/commands/purchase-order-types.js +5 -61
- package/dist/commands/purchase-orders.d.ts +0 -1
- package/dist/commands/purchase-orders.js +7 -63
- package/dist/commands/reports.d.ts +0 -1
- package/dist/commands/reports.js +6 -62
- package/dist/commands/salary-types.d.ts +0 -1
- package/dist/commands/salary-types.js +5 -61
- package/dist/commands/sales-invoices.d.ts +0 -1
- package/dist/commands/sales-invoices.js +12 -65
- package/dist/commands/sales-orders.d.ts +0 -1
- package/dist/commands/sales-orders.js +7 -63
- package/dist/commands/saved-views.d.ts +0 -1
- package/dist/commands/saved-views.js +5 -61
- package/dist/commands/scheduled-processor-mappings.d.ts +0 -1
- package/dist/commands/scheduled-processor-mappings.js +5 -61
- package/dist/commands/schedules.d.ts +0 -1
- package/dist/commands/schedules.js +5 -61
- package/dist/commands/switch.js +4 -4
- package/dist/commands/tag-configurations.d.ts +0 -1
- package/dist/commands/tag-configurations.js +9 -64
- package/dist/commands/tags.d.ts +0 -1
- package/dist/commands/tags.js +5 -61
- package/dist/commands/tax-codes.d.ts +0 -1
- package/dist/commands/tax-codes.js +5 -61
- package/dist/commands/tax-matrix.d.ts +0 -1
- package/dist/commands/tax-matrix.js +5 -61
- package/dist/commands/tenants.d.ts +0 -1
- package/dist/commands/tenants.js +7 -62
- package/dist/commands/text-templates.d.ts +0 -1
- package/dist/commands/text-templates.js +5 -61
- package/dist/commands/tools.d.ts +0 -1
- package/dist/commands/tools.js +5 -61
- package/dist/commands/vat-declarations.d.ts +1 -1
- package/dist/commands/vat-declarations.js +11 -62
- package/dist/commands/vendor-invoices.d.ts +0 -1
- package/dist/commands/vendor-invoices.js +10 -65
- package/dist/commands/webhooks.d.ts +0 -1
- package/dist/commands/webhooks.js +5 -61
- package/dist/commands/workflows.d.ts +0 -1
- package/dist/commands/workflows.js +5 -61
- package/dist/lib/api-client.js +3 -6
- package/dist/lib/auth/constants.d.ts +11 -0
- package/dist/lib/auth/constants.js +11 -0
- package/dist/lib/auth/errors.d.ts +17 -0
- package/dist/lib/auth/errors.js +22 -0
- package/dist/lib/auth/flow.d.ts +27 -0
- package/dist/lib/auth/flow.js +163 -0
- package/dist/lib/auth/guards.d.ts +5 -0
- package/dist/lib/auth/guards.js +14 -0
- package/dist/lib/auth/http.d.ts +16 -0
- package/dist/lib/auth/http.js +49 -0
- package/dist/lib/auth/index.d.ts +49 -0
- package/dist/lib/auth/index.js +217 -0
- package/dist/lib/auth/keycloak-provider.d.ts +75 -0
- package/dist/lib/auth/keycloak-provider.js +215 -0
- package/dist/lib/auth/pages.d.ts +25 -0
- package/dist/lib/auth/pages.js +123 -0
- package/dist/lib/auth/pkce.d.ts +11 -0
- package/dist/lib/auth/pkce.js +17 -0
- package/dist/lib/auth/tokens.d.ts +54 -0
- package/dist/lib/auth/tokens.js +104 -0
- package/dist/lib/auth/types.d.ts +57 -0
- package/dist/lib/auth/types.js +1 -0
- package/dist/lib/auth/validated-url.d.ts +6 -0
- package/dist/lib/auth/validated-url.js +53 -0
- package/dist/lib/config.d.ts +13 -3
- package/dist/lib/config.js +24 -19
- package/oclif.manifest.json +440 -71
- package/package.json +2 -1
- package/dist/lib/auth.d.ts +0 -43
- package/dist/lib/auth.js +0 -610
|
@@ -38,7 +38,7 @@ export default class EmailTransactions extends Command {
|
|
|
38
38
|
'sort-by': Flags.string({ description: 'Sort field(s), comma-separated. Direction (:ASC/:DESC) is optional; date-like fields default to DESC, others to ASC.' }),
|
|
39
39
|
filter: Flags.string({ description: 'Filter (e.g. --filter status=ACTIVE). Operators: in:A,B, like:%, gt:, lt:, null:', multiple: true }),
|
|
40
40
|
query: Flags.string({ description: 'Additional query params as JSON' }),
|
|
41
|
-
fields: Flags.string({ description: 'Comma-separated list of fields to
|
|
41
|
+
fields: Flags.string({ description: 'Comma-separated list of fields to return, applied by the API (e.g. --fields=id,name,status)' }),
|
|
42
42
|
sanitize: Flags.boolean({ description: 'Remove null values, audit fields, and duplicate UUIDs from output' }),
|
|
43
43
|
'show-http-request': Flags.boolean({ description: 'Show HTTP request details (method, URL, body)' }),
|
|
44
44
|
};
|
|
@@ -110,6 +110,8 @@ export default class EmailTransactions extends Command {
|
|
|
110
110
|
queryParams.search = flags.search;
|
|
111
111
|
if (flags['sort-by'])
|
|
112
112
|
queryParams.sortBy = normalizeSortBy(flags['sort-by']);
|
|
113
|
+
if (flags.fields)
|
|
114
|
+
queryParams.fields = flags.fields;
|
|
113
115
|
if (flags.query) {
|
|
114
116
|
try {
|
|
115
117
|
Object.assign(queryParams, JSON.parse(flags.query));
|
|
@@ -312,11 +314,6 @@ export default class EmailTransactions extends Command {
|
|
|
312
314
|
output = obj[arrayKeys[0]];
|
|
313
315
|
}
|
|
314
316
|
}
|
|
315
|
-
// Filter fields if --fields flag is provided
|
|
316
|
-
if (flags.fields) {
|
|
317
|
-
const fieldList = flags.fields.split(',').map(f => f.trim());
|
|
318
|
-
output = this.filterFields(output, fieldList);
|
|
319
|
-
}
|
|
320
317
|
// Sanitize output if requested
|
|
321
318
|
if (flags.sanitize) {
|
|
322
319
|
output = this.sanitizeOutput(output);
|
|
@@ -571,6 +568,8 @@ export default class EmailTransactions extends Command {
|
|
|
571
568
|
baseParams.sortBy = normalizeSortBy(flags['sort-by']);
|
|
572
569
|
if (flags.include)
|
|
573
570
|
baseParams.include = flags.include;
|
|
571
|
+
if (flags.fields)
|
|
572
|
+
baseParams.fields = flags.fields;
|
|
574
573
|
if (flags.query) {
|
|
575
574
|
try {
|
|
576
575
|
Object.assign(baseParams, JSON.parse(flags.query));
|
|
@@ -625,12 +624,7 @@ export default class EmailTransactions extends Command {
|
|
|
625
624
|
}
|
|
626
625
|
}
|
|
627
626
|
process.stderr.write(' done\n');
|
|
628
|
-
// Filter fields if specified
|
|
629
627
|
let output = allItems;
|
|
630
|
-
if (flags.fields) {
|
|
631
|
-
const fieldList = flags.fields.split(',').map(f => f.trim());
|
|
632
|
-
output = this.filterFields(allItems, fieldList);
|
|
633
|
-
}
|
|
634
628
|
// Sanitize output if requested
|
|
635
629
|
if (flags.sanitize) {
|
|
636
630
|
output = this.sanitizeOutput(output);
|
|
@@ -959,56 +953,6 @@ export default class EmailTransactions extends Command {
|
|
|
959
953
|
return `\$${op}`;
|
|
960
954
|
return opRe.test(rest) ? `\$${op}:${this.parseFilterValue(rest)}` : `\$${op}:${rest}`;
|
|
961
955
|
}
|
|
962
|
-
filterFields(data, fields) {
|
|
963
|
-
const isUnsafeKey = (k) => k === '__proto__' || k === 'constructor' || k === 'prototype';
|
|
964
|
-
const pick = (obj, keys) => {
|
|
965
|
-
// Group keys by their first segment so sibling sub-paths
|
|
966
|
-
// (e.g. 'items.amount' + 'items._type') resolve in one recursive pass
|
|
967
|
-
// and don't clobber each other on merge.
|
|
968
|
-
const directKeys = new Set();
|
|
969
|
-
const nestedKeys = new Map();
|
|
970
|
-
for (const key of keys) {
|
|
971
|
-
if (key.split('.').some(isUnsafeKey))
|
|
972
|
-
continue;
|
|
973
|
-
if (key.includes('.')) {
|
|
974
|
-
const [first, ...rest] = key.split('.');
|
|
975
|
-
if (isUnsafeKey(first))
|
|
976
|
-
continue;
|
|
977
|
-
const list = nestedKeys.get(first);
|
|
978
|
-
if (list) {
|
|
979
|
-
list.push(rest.join('.'));
|
|
980
|
-
}
|
|
981
|
-
else {
|
|
982
|
-
nestedKeys.set(first, [rest.join('.')]);
|
|
983
|
-
}
|
|
984
|
-
}
|
|
985
|
-
else {
|
|
986
|
-
directKeys.add(key);
|
|
987
|
-
}
|
|
988
|
-
}
|
|
989
|
-
const result = {};
|
|
990
|
-
for (const key of directKeys) {
|
|
991
|
-
if (key in obj)
|
|
992
|
-
result[key] = obj[key];
|
|
993
|
-
}
|
|
994
|
-
for (const [first, restKeys] of nestedKeys) {
|
|
995
|
-
const val = obj[first];
|
|
996
|
-
if (!val || typeof val !== 'object')
|
|
997
|
-
continue;
|
|
998
|
-
if (Array.isArray(val)) {
|
|
999
|
-
result[first] = val.map(item => pick(item, restKeys));
|
|
1000
|
-
}
|
|
1001
|
-
else {
|
|
1002
|
-
result[first] = pick(val, restKeys);
|
|
1003
|
-
}
|
|
1004
|
-
}
|
|
1005
|
-
return result;
|
|
1006
|
-
};
|
|
1007
|
-
if (Array.isArray(data)) {
|
|
1008
|
-
return data.map(item => pick(item, fields));
|
|
1009
|
-
}
|
|
1010
|
-
return pick(data, fields);
|
|
1011
|
-
}
|
|
1012
956
|
sanitizeOutput(data) {
|
|
1013
957
|
const auditFields = ['_type', 'tenantId', 'createdAt', 'updatedAt', 'createdBy', 'updatedBy'];
|
|
1014
958
|
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
@@ -74,7 +74,7 @@ export default class Employees extends Command {
|
|
|
74
74
|
'sort-by': Flags.string({ description: 'Sort field(s), comma-separated. Direction (:ASC/:DESC) is optional; date-like fields default to DESC, others to ASC.' }),
|
|
75
75
|
filter: Flags.string({ description: 'Filter (e.g. --filter status=ACTIVE). Operators: in:A,B, like:%, gt:, lt:, null:', multiple: true }),
|
|
76
76
|
query: Flags.string({ description: 'Additional query params as JSON' }),
|
|
77
|
-
fields: Flags.string({ description: 'Comma-separated list of fields to
|
|
77
|
+
fields: Flags.string({ description: 'Comma-separated list of fields to return, applied by the API (e.g. --fields=id,name,status)' }),
|
|
78
78
|
sanitize: Flags.boolean({ description: 'Remove null values, audit fields, and duplicate UUIDs from output' }),
|
|
79
79
|
'show-http-request': Flags.boolean({ description: 'Show HTTP request details (method, URL, body)' }),
|
|
80
80
|
};
|
|
@@ -146,6 +146,8 @@ export default class Employees extends Command {
|
|
|
146
146
|
queryParams.search = flags.search;
|
|
147
147
|
if (flags['sort-by'])
|
|
148
148
|
queryParams.sortBy = normalizeSortBy(flags['sort-by']);
|
|
149
|
+
if (flags.fields)
|
|
150
|
+
queryParams.fields = flags.fields;
|
|
149
151
|
if (flags.query) {
|
|
150
152
|
try {
|
|
151
153
|
Object.assign(queryParams, JSON.parse(flags.query));
|
|
@@ -348,11 +350,6 @@ export default class Employees extends Command {
|
|
|
348
350
|
output = obj[arrayKeys[0]];
|
|
349
351
|
}
|
|
350
352
|
}
|
|
351
|
-
// Filter fields if --fields flag is provided
|
|
352
|
-
if (flags.fields) {
|
|
353
|
-
const fieldList = flags.fields.split(',').map(f => f.trim());
|
|
354
|
-
output = this.filterFields(output, fieldList);
|
|
355
|
-
}
|
|
356
353
|
// Sanitize output if requested
|
|
357
354
|
if (flags.sanitize) {
|
|
358
355
|
output = this.sanitizeOutput(output);
|
|
@@ -607,6 +604,8 @@ export default class Employees extends Command {
|
|
|
607
604
|
baseParams.sortBy = normalizeSortBy(flags['sort-by']);
|
|
608
605
|
if (flags.include)
|
|
609
606
|
baseParams.include = flags.include;
|
|
607
|
+
if (flags.fields)
|
|
608
|
+
baseParams.fields = flags.fields;
|
|
610
609
|
if (flags.query) {
|
|
611
610
|
try {
|
|
612
611
|
Object.assign(baseParams, JSON.parse(flags.query));
|
|
@@ -661,12 +660,7 @@ export default class Employees extends Command {
|
|
|
661
660
|
}
|
|
662
661
|
}
|
|
663
662
|
process.stderr.write(' done\n');
|
|
664
|
-
// Filter fields if specified
|
|
665
663
|
let output = allItems;
|
|
666
|
-
if (flags.fields) {
|
|
667
|
-
const fieldList = flags.fields.split(',').map(f => f.trim());
|
|
668
|
-
output = this.filterFields(allItems, fieldList);
|
|
669
|
-
}
|
|
670
664
|
// Sanitize output if requested
|
|
671
665
|
if (flags.sanitize) {
|
|
672
666
|
output = this.sanitizeOutput(output);
|
|
@@ -995,56 +989,6 @@ export default class Employees extends Command {
|
|
|
995
989
|
return `\$${op}`;
|
|
996
990
|
return opRe.test(rest) ? `\$${op}:${this.parseFilterValue(rest)}` : `\$${op}:${rest}`;
|
|
997
991
|
}
|
|
998
|
-
filterFields(data, fields) {
|
|
999
|
-
const isUnsafeKey = (k) => k === '__proto__' || k === 'constructor' || k === 'prototype';
|
|
1000
|
-
const pick = (obj, keys) => {
|
|
1001
|
-
// Group keys by their first segment so sibling sub-paths
|
|
1002
|
-
// (e.g. 'items.amount' + 'items._type') resolve in one recursive pass
|
|
1003
|
-
// and don't clobber each other on merge.
|
|
1004
|
-
const directKeys = new Set();
|
|
1005
|
-
const nestedKeys = new Map();
|
|
1006
|
-
for (const key of keys) {
|
|
1007
|
-
if (key.split('.').some(isUnsafeKey))
|
|
1008
|
-
continue;
|
|
1009
|
-
if (key.includes('.')) {
|
|
1010
|
-
const [first, ...rest] = key.split('.');
|
|
1011
|
-
if (isUnsafeKey(first))
|
|
1012
|
-
continue;
|
|
1013
|
-
const list = nestedKeys.get(first);
|
|
1014
|
-
if (list) {
|
|
1015
|
-
list.push(rest.join('.'));
|
|
1016
|
-
}
|
|
1017
|
-
else {
|
|
1018
|
-
nestedKeys.set(first, [rest.join('.')]);
|
|
1019
|
-
}
|
|
1020
|
-
}
|
|
1021
|
-
else {
|
|
1022
|
-
directKeys.add(key);
|
|
1023
|
-
}
|
|
1024
|
-
}
|
|
1025
|
-
const result = {};
|
|
1026
|
-
for (const key of directKeys) {
|
|
1027
|
-
if (key in obj)
|
|
1028
|
-
result[key] = obj[key];
|
|
1029
|
-
}
|
|
1030
|
-
for (const [first, restKeys] of nestedKeys) {
|
|
1031
|
-
const val = obj[first];
|
|
1032
|
-
if (!val || typeof val !== 'object')
|
|
1033
|
-
continue;
|
|
1034
|
-
if (Array.isArray(val)) {
|
|
1035
|
-
result[first] = val.map(item => pick(item, restKeys));
|
|
1036
|
-
}
|
|
1037
|
-
else {
|
|
1038
|
-
result[first] = pick(val, restKeys);
|
|
1039
|
-
}
|
|
1040
|
-
}
|
|
1041
|
-
return result;
|
|
1042
|
-
};
|
|
1043
|
-
if (Array.isArray(data)) {
|
|
1044
|
-
return data.map(item => pick(item, fields));
|
|
1045
|
-
}
|
|
1046
|
-
return pick(data, fields);
|
|
1047
|
-
}
|
|
1048
992
|
sanitizeOutput(data) {
|
|
1049
993
|
const auditFields = ['_type', 'tenantId', 'createdAt', 'updatedAt', 'createdBy', 'updatedBy'];
|
|
1050
994
|
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
@@ -34,7 +34,7 @@ export default class EntityConfigurations extends Command {
|
|
|
34
34
|
'sort-by': Flags.string({ description: 'Sort field(s), comma-separated. Direction (:ASC/:DESC) is optional; date-like fields default to DESC, others to ASC.' }),
|
|
35
35
|
filter: Flags.string({ description: 'Filter (e.g. --filter status=ACTIVE). Operators: in:A,B, like:%, gt:, lt:, null:', multiple: true }),
|
|
36
36
|
query: Flags.string({ description: 'Additional query params as JSON' }),
|
|
37
|
-
fields: Flags.string({ description: 'Comma-separated list of fields to
|
|
37
|
+
fields: Flags.string({ description: 'Comma-separated list of fields to return, applied by the API (e.g. --fields=id,name,status)' }),
|
|
38
38
|
sanitize: Flags.boolean({ description: 'Remove null values, audit fields, and duplicate UUIDs from output' }),
|
|
39
39
|
'show-http-request': Flags.boolean({ description: 'Show HTTP request details (method, URL, body)' }),
|
|
40
40
|
};
|
|
@@ -106,6 +106,8 @@ export default class EntityConfigurations extends Command {
|
|
|
106
106
|
queryParams.search = flags.search;
|
|
107
107
|
if (flags['sort-by'])
|
|
108
108
|
queryParams.sortBy = normalizeSortBy(flags['sort-by']);
|
|
109
|
+
if (flags.fields)
|
|
110
|
+
queryParams.fields = flags.fields;
|
|
109
111
|
if (flags.query) {
|
|
110
112
|
try {
|
|
111
113
|
Object.assign(queryParams, JSON.parse(flags.query));
|
|
@@ -308,11 +310,6 @@ export default class EntityConfigurations extends Command {
|
|
|
308
310
|
output = obj[arrayKeys[0]];
|
|
309
311
|
}
|
|
310
312
|
}
|
|
311
|
-
// Filter fields if --fields flag is provided
|
|
312
|
-
if (flags.fields) {
|
|
313
|
-
const fieldList = flags.fields.split(',').map(f => f.trim());
|
|
314
|
-
output = this.filterFields(output, fieldList);
|
|
315
|
-
}
|
|
316
313
|
// Sanitize output if requested
|
|
317
314
|
if (flags.sanitize) {
|
|
318
315
|
output = this.sanitizeOutput(output);
|
|
@@ -567,6 +564,8 @@ export default class EntityConfigurations extends Command {
|
|
|
567
564
|
baseParams.sortBy = normalizeSortBy(flags['sort-by']);
|
|
568
565
|
if (flags.include)
|
|
569
566
|
baseParams.include = flags.include;
|
|
567
|
+
if (flags.fields)
|
|
568
|
+
baseParams.fields = flags.fields;
|
|
570
569
|
if (flags.query) {
|
|
571
570
|
try {
|
|
572
571
|
Object.assign(baseParams, JSON.parse(flags.query));
|
|
@@ -621,12 +620,7 @@ export default class EntityConfigurations extends Command {
|
|
|
621
620
|
}
|
|
622
621
|
}
|
|
623
622
|
process.stderr.write(' done\n');
|
|
624
|
-
// Filter fields if specified
|
|
625
623
|
let output = allItems;
|
|
626
|
-
if (flags.fields) {
|
|
627
|
-
const fieldList = flags.fields.split(',').map(f => f.trim());
|
|
628
|
-
output = this.filterFields(allItems, fieldList);
|
|
629
|
-
}
|
|
630
624
|
// Sanitize output if requested
|
|
631
625
|
if (flags.sanitize) {
|
|
632
626
|
output = this.sanitizeOutput(output);
|
|
@@ -955,56 +949,6 @@ export default class EntityConfigurations extends Command {
|
|
|
955
949
|
return `\$${op}`;
|
|
956
950
|
return opRe.test(rest) ? `\$${op}:${this.parseFilterValue(rest)}` : `\$${op}:${rest}`;
|
|
957
951
|
}
|
|
958
|
-
filterFields(data, fields) {
|
|
959
|
-
const isUnsafeKey = (k) => k === '__proto__' || k === 'constructor' || k === 'prototype';
|
|
960
|
-
const pick = (obj, keys) => {
|
|
961
|
-
// Group keys by their first segment so sibling sub-paths
|
|
962
|
-
// (e.g. 'items.amount' + 'items._type') resolve in one recursive pass
|
|
963
|
-
// and don't clobber each other on merge.
|
|
964
|
-
const directKeys = new Set();
|
|
965
|
-
const nestedKeys = new Map();
|
|
966
|
-
for (const key of keys) {
|
|
967
|
-
if (key.split('.').some(isUnsafeKey))
|
|
968
|
-
continue;
|
|
969
|
-
if (key.includes('.')) {
|
|
970
|
-
const [first, ...rest] = key.split('.');
|
|
971
|
-
if (isUnsafeKey(first))
|
|
972
|
-
continue;
|
|
973
|
-
const list = nestedKeys.get(first);
|
|
974
|
-
if (list) {
|
|
975
|
-
list.push(rest.join('.'));
|
|
976
|
-
}
|
|
977
|
-
else {
|
|
978
|
-
nestedKeys.set(first, [rest.join('.')]);
|
|
979
|
-
}
|
|
980
|
-
}
|
|
981
|
-
else {
|
|
982
|
-
directKeys.add(key);
|
|
983
|
-
}
|
|
984
|
-
}
|
|
985
|
-
const result = {};
|
|
986
|
-
for (const key of directKeys) {
|
|
987
|
-
if (key in obj)
|
|
988
|
-
result[key] = obj[key];
|
|
989
|
-
}
|
|
990
|
-
for (const [first, restKeys] of nestedKeys) {
|
|
991
|
-
const val = obj[first];
|
|
992
|
-
if (!val || typeof val !== 'object')
|
|
993
|
-
continue;
|
|
994
|
-
if (Array.isArray(val)) {
|
|
995
|
-
result[first] = val.map(item => pick(item, restKeys));
|
|
996
|
-
}
|
|
997
|
-
else {
|
|
998
|
-
result[first] = pick(val, restKeys);
|
|
999
|
-
}
|
|
1000
|
-
}
|
|
1001
|
-
return result;
|
|
1002
|
-
};
|
|
1003
|
-
if (Array.isArray(data)) {
|
|
1004
|
-
return data.map(item => pick(item, fields));
|
|
1005
|
-
}
|
|
1006
|
-
return pick(data, fields);
|
|
1007
|
-
}
|
|
1008
952
|
sanitizeOutput(data) {
|
|
1009
953
|
const auditFields = ['_type', 'tenantId', 'createdAt', 'updatedAt', 'createdBy', 'updatedBy'];
|
|
1010
954
|
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
@@ -42,7 +42,7 @@ export default class EventProcessorMappings extends Command {
|
|
|
42
42
|
'sort-by': Flags.string({ description: 'Sort field(s), comma-separated. Direction (:ASC/:DESC) is optional; date-like fields default to DESC, others to ASC.' }),
|
|
43
43
|
filter: Flags.string({ description: 'Filter (e.g. --filter status=ACTIVE). Operators: in:A,B, like:%, gt:, lt:, null:', multiple: true }),
|
|
44
44
|
query: Flags.string({ description: 'Additional query params as JSON' }),
|
|
45
|
-
fields: Flags.string({ description: 'Comma-separated list of fields to
|
|
45
|
+
fields: Flags.string({ description: 'Comma-separated list of fields to return, applied by the API (e.g. --fields=id,name,status)' }),
|
|
46
46
|
sanitize: Flags.boolean({ description: 'Remove null values, audit fields, and duplicate UUIDs from output' }),
|
|
47
47
|
'show-http-request': Flags.boolean({ description: 'Show HTTP request details (method, URL, body)' }),
|
|
48
48
|
};
|
|
@@ -114,6 +114,8 @@ export default class EventProcessorMappings extends Command {
|
|
|
114
114
|
queryParams.search = flags.search;
|
|
115
115
|
if (flags['sort-by'])
|
|
116
116
|
queryParams.sortBy = normalizeSortBy(flags['sort-by']);
|
|
117
|
+
if (flags.fields)
|
|
118
|
+
queryParams.fields = flags.fields;
|
|
117
119
|
if (flags.query) {
|
|
118
120
|
try {
|
|
119
121
|
Object.assign(queryParams, JSON.parse(flags.query));
|
|
@@ -316,11 +318,6 @@ export default class EventProcessorMappings extends Command {
|
|
|
316
318
|
output = obj[arrayKeys[0]];
|
|
317
319
|
}
|
|
318
320
|
}
|
|
319
|
-
// Filter fields if --fields flag is provided
|
|
320
|
-
if (flags.fields) {
|
|
321
|
-
const fieldList = flags.fields.split(',').map(f => f.trim());
|
|
322
|
-
output = this.filterFields(output, fieldList);
|
|
323
|
-
}
|
|
324
321
|
// Sanitize output if requested
|
|
325
322
|
if (flags.sanitize) {
|
|
326
323
|
output = this.sanitizeOutput(output);
|
|
@@ -575,6 +572,8 @@ export default class EventProcessorMappings extends Command {
|
|
|
575
572
|
baseParams.sortBy = normalizeSortBy(flags['sort-by']);
|
|
576
573
|
if (flags.include)
|
|
577
574
|
baseParams.include = flags.include;
|
|
575
|
+
if (flags.fields)
|
|
576
|
+
baseParams.fields = flags.fields;
|
|
578
577
|
if (flags.query) {
|
|
579
578
|
try {
|
|
580
579
|
Object.assign(baseParams, JSON.parse(flags.query));
|
|
@@ -629,12 +628,7 @@ export default class EventProcessorMappings extends Command {
|
|
|
629
628
|
}
|
|
630
629
|
}
|
|
631
630
|
process.stderr.write(' done\n');
|
|
632
|
-
// Filter fields if specified
|
|
633
631
|
let output = allItems;
|
|
634
|
-
if (flags.fields) {
|
|
635
|
-
const fieldList = flags.fields.split(',').map(f => f.trim());
|
|
636
|
-
output = this.filterFields(allItems, fieldList);
|
|
637
|
-
}
|
|
638
632
|
// Sanitize output if requested
|
|
639
633
|
if (flags.sanitize) {
|
|
640
634
|
output = this.sanitizeOutput(output);
|
|
@@ -963,56 +957,6 @@ export default class EventProcessorMappings extends Command {
|
|
|
963
957
|
return `\$${op}`;
|
|
964
958
|
return opRe.test(rest) ? `\$${op}:${this.parseFilterValue(rest)}` : `\$${op}:${rest}`;
|
|
965
959
|
}
|
|
966
|
-
filterFields(data, fields) {
|
|
967
|
-
const isUnsafeKey = (k) => k === '__proto__' || k === 'constructor' || k === 'prototype';
|
|
968
|
-
const pick = (obj, keys) => {
|
|
969
|
-
// Group keys by their first segment so sibling sub-paths
|
|
970
|
-
// (e.g. 'items.amount' + 'items._type') resolve in one recursive pass
|
|
971
|
-
// and don't clobber each other on merge.
|
|
972
|
-
const directKeys = new Set();
|
|
973
|
-
const nestedKeys = new Map();
|
|
974
|
-
for (const key of keys) {
|
|
975
|
-
if (key.split('.').some(isUnsafeKey))
|
|
976
|
-
continue;
|
|
977
|
-
if (key.includes('.')) {
|
|
978
|
-
const [first, ...rest] = key.split('.');
|
|
979
|
-
if (isUnsafeKey(first))
|
|
980
|
-
continue;
|
|
981
|
-
const list = nestedKeys.get(first);
|
|
982
|
-
if (list) {
|
|
983
|
-
list.push(rest.join('.'));
|
|
984
|
-
}
|
|
985
|
-
else {
|
|
986
|
-
nestedKeys.set(first, [rest.join('.')]);
|
|
987
|
-
}
|
|
988
|
-
}
|
|
989
|
-
else {
|
|
990
|
-
directKeys.add(key);
|
|
991
|
-
}
|
|
992
|
-
}
|
|
993
|
-
const result = {};
|
|
994
|
-
for (const key of directKeys) {
|
|
995
|
-
if (key in obj)
|
|
996
|
-
result[key] = obj[key];
|
|
997
|
-
}
|
|
998
|
-
for (const [first, restKeys] of nestedKeys) {
|
|
999
|
-
const val = obj[first];
|
|
1000
|
-
if (!val || typeof val !== 'object')
|
|
1001
|
-
continue;
|
|
1002
|
-
if (Array.isArray(val)) {
|
|
1003
|
-
result[first] = val.map(item => pick(item, restKeys));
|
|
1004
|
-
}
|
|
1005
|
-
else {
|
|
1006
|
-
result[first] = pick(val, restKeys);
|
|
1007
|
-
}
|
|
1008
|
-
}
|
|
1009
|
-
return result;
|
|
1010
|
-
};
|
|
1011
|
-
if (Array.isArray(data)) {
|
|
1012
|
-
return data.map(item => pick(item, fields));
|
|
1013
|
-
}
|
|
1014
|
-
return pick(data, fields);
|
|
1015
|
-
}
|
|
1016
960
|
sanitizeOutput(data) {
|
|
1017
961
|
const auditFields = ['_type', 'tenantId', 'createdAt', 'updatedAt', 'createdBy', 'updatedBy'];
|
|
1018
962
|
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
package/dist/commands/files.d.ts
CHANGED
package/dist/commands/files.js
CHANGED
|
@@ -50,7 +50,7 @@ export default class Files extends Command {
|
|
|
50
50
|
'sort-by': Flags.string({ description: 'Sort field(s), comma-separated. Direction (:ASC/:DESC) is optional; date-like fields default to DESC, others to ASC.' }),
|
|
51
51
|
filter: Flags.string({ description: 'Filter (e.g. --filter status=ACTIVE). Operators: in:A,B, like:%, gt:, lt:, null:', multiple: true }),
|
|
52
52
|
query: Flags.string({ description: 'Additional query params as JSON' }),
|
|
53
|
-
fields: Flags.string({ description: 'Comma-separated list of fields to
|
|
53
|
+
fields: Flags.string({ description: 'Comma-separated list of fields to return, applied by the API (e.g. --fields=id,name,status)' }),
|
|
54
54
|
sanitize: Flags.boolean({ description: 'Remove null values, audit fields, and duplicate UUIDs from output' }),
|
|
55
55
|
'show-http-request': Flags.boolean({ description: 'Show HTTP request details (method, URL, body)' }),
|
|
56
56
|
};
|
|
@@ -122,6 +122,8 @@ export default class Files extends Command {
|
|
|
122
122
|
queryParams.search = flags.search;
|
|
123
123
|
if (flags['sort-by'])
|
|
124
124
|
queryParams.sortBy = normalizeSortBy(flags['sort-by']);
|
|
125
|
+
if (flags.fields)
|
|
126
|
+
queryParams.fields = flags.fields;
|
|
125
127
|
if (flags.query) {
|
|
126
128
|
try {
|
|
127
129
|
Object.assign(queryParams, JSON.parse(flags.query));
|
|
@@ -324,11 +326,6 @@ export default class Files extends Command {
|
|
|
324
326
|
output = obj[arrayKeys[0]];
|
|
325
327
|
}
|
|
326
328
|
}
|
|
327
|
-
// Filter fields if --fields flag is provided
|
|
328
|
-
if (flags.fields) {
|
|
329
|
-
const fieldList = flags.fields.split(',').map(f => f.trim());
|
|
330
|
-
output = this.filterFields(output, fieldList);
|
|
331
|
-
}
|
|
332
329
|
// Sanitize output if requested
|
|
333
330
|
if (flags.sanitize) {
|
|
334
331
|
output = this.sanitizeOutput(output);
|
|
@@ -583,6 +580,8 @@ export default class Files extends Command {
|
|
|
583
580
|
baseParams.sortBy = normalizeSortBy(flags['sort-by']);
|
|
584
581
|
if (flags.include)
|
|
585
582
|
baseParams.include = flags.include;
|
|
583
|
+
if (flags.fields)
|
|
584
|
+
baseParams.fields = flags.fields;
|
|
586
585
|
if (flags.query) {
|
|
587
586
|
try {
|
|
588
587
|
Object.assign(baseParams, JSON.parse(flags.query));
|
|
@@ -637,12 +636,7 @@ export default class Files extends Command {
|
|
|
637
636
|
}
|
|
638
637
|
}
|
|
639
638
|
process.stderr.write(' done\n');
|
|
640
|
-
// Filter fields if specified
|
|
641
639
|
let output = allItems;
|
|
642
|
-
if (flags.fields) {
|
|
643
|
-
const fieldList = flags.fields.split(',').map(f => f.trim());
|
|
644
|
-
output = this.filterFields(allItems, fieldList);
|
|
645
|
-
}
|
|
646
640
|
// Sanitize output if requested
|
|
647
641
|
if (flags.sanitize) {
|
|
648
642
|
output = this.sanitizeOutput(output);
|
|
@@ -971,56 +965,6 @@ export default class Files extends Command {
|
|
|
971
965
|
return `\$${op}`;
|
|
972
966
|
return opRe.test(rest) ? `\$${op}:${this.parseFilterValue(rest)}` : `\$${op}:${rest}`;
|
|
973
967
|
}
|
|
974
|
-
filterFields(data, fields) {
|
|
975
|
-
const isUnsafeKey = (k) => k === '__proto__' || k === 'constructor' || k === 'prototype';
|
|
976
|
-
const pick = (obj, keys) => {
|
|
977
|
-
// Group keys by their first segment so sibling sub-paths
|
|
978
|
-
// (e.g. 'items.amount' + 'items._type') resolve in one recursive pass
|
|
979
|
-
// and don't clobber each other on merge.
|
|
980
|
-
const directKeys = new Set();
|
|
981
|
-
const nestedKeys = new Map();
|
|
982
|
-
for (const key of keys) {
|
|
983
|
-
if (key.split('.').some(isUnsafeKey))
|
|
984
|
-
continue;
|
|
985
|
-
if (key.includes('.')) {
|
|
986
|
-
const [first, ...rest] = key.split('.');
|
|
987
|
-
if (isUnsafeKey(first))
|
|
988
|
-
continue;
|
|
989
|
-
const list = nestedKeys.get(first);
|
|
990
|
-
if (list) {
|
|
991
|
-
list.push(rest.join('.'));
|
|
992
|
-
}
|
|
993
|
-
else {
|
|
994
|
-
nestedKeys.set(first, [rest.join('.')]);
|
|
995
|
-
}
|
|
996
|
-
}
|
|
997
|
-
else {
|
|
998
|
-
directKeys.add(key);
|
|
999
|
-
}
|
|
1000
|
-
}
|
|
1001
|
-
const result = {};
|
|
1002
|
-
for (const key of directKeys) {
|
|
1003
|
-
if (key in obj)
|
|
1004
|
-
result[key] = obj[key];
|
|
1005
|
-
}
|
|
1006
|
-
for (const [first, restKeys] of nestedKeys) {
|
|
1007
|
-
const val = obj[first];
|
|
1008
|
-
if (!val || typeof val !== 'object')
|
|
1009
|
-
continue;
|
|
1010
|
-
if (Array.isArray(val)) {
|
|
1011
|
-
result[first] = val.map(item => pick(item, restKeys));
|
|
1012
|
-
}
|
|
1013
|
-
else {
|
|
1014
|
-
result[first] = pick(val, restKeys);
|
|
1015
|
-
}
|
|
1016
|
-
}
|
|
1017
|
-
return result;
|
|
1018
|
-
};
|
|
1019
|
-
if (Array.isArray(data)) {
|
|
1020
|
-
return data.map(item => pick(item, fields));
|
|
1021
|
-
}
|
|
1022
|
-
return pick(data, fields);
|
|
1023
|
-
}
|
|
1024
968
|
sanitizeOutput(data) {
|
|
1025
969
|
const auditFields = ['_type', 'tenantId', 'createdAt', 'updatedAt', 'createdBy', 'updatedBy'];
|
|
1026
970
|
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|