@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
package/dist/commands/health.js
CHANGED
|
@@ -38,7 +38,7 @@ export default class Health 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 Health 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 Health 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 Health 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 Health 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 Health 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;
|
package/dist/commands/inbox.d.ts
CHANGED
package/dist/commands/inbox.js
CHANGED
|
@@ -38,7 +38,7 @@ export default class Inbox 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 Inbox 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 Inbox 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 Inbox 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 Inbox 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 Inbox 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;
|
|
@@ -38,7 +38,7 @@ export default class Integrations 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 Integrations 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 Integrations 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 Integrations 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 Integrations 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 Integrations 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;
|
|
@@ -43,7 +43,7 @@ export default class ItemCategories extends Command {
|
|
|
43
43
|
'sort-by': Flags.string({ description: 'Sort field(s), comma-separated. Direction (:ASC/:DESC) is optional; date-like fields default to DESC, others to ASC.' }),
|
|
44
44
|
filter: Flags.string({ description: 'Filter (e.g. --filter status=ACTIVE). Operators: in:A,B, like:%, gt:, lt:, null:', multiple: true }),
|
|
45
45
|
query: Flags.string({ description: 'Additional query params as JSON' }),
|
|
46
|
-
fields: Flags.string({ description: 'Comma-separated list of fields to
|
|
46
|
+
fields: Flags.string({ description: 'Comma-separated list of fields to return, applied by the API (e.g. --fields=id,name,status)' }),
|
|
47
47
|
sanitize: Flags.boolean({ description: 'Remove null values, audit fields, and duplicate UUIDs from output' }),
|
|
48
48
|
'show-http-request': Flags.boolean({ description: 'Show HTTP request details (method, URL, body)' }),
|
|
49
49
|
};
|
|
@@ -115,6 +115,8 @@ export default class ItemCategories extends Command {
|
|
|
115
115
|
queryParams.search = flags.search;
|
|
116
116
|
if (flags['sort-by'])
|
|
117
117
|
queryParams.sortBy = normalizeSortBy(flags['sort-by']);
|
|
118
|
+
if (flags.fields)
|
|
119
|
+
queryParams.fields = flags.fields;
|
|
118
120
|
if (flags.query) {
|
|
119
121
|
try {
|
|
120
122
|
Object.assign(queryParams, JSON.parse(flags.query));
|
|
@@ -317,11 +319,6 @@ export default class ItemCategories extends Command {
|
|
|
317
319
|
output = obj[arrayKeys[0]];
|
|
318
320
|
}
|
|
319
321
|
}
|
|
320
|
-
// Filter fields if --fields flag is provided
|
|
321
|
-
if (flags.fields) {
|
|
322
|
-
const fieldList = flags.fields.split(',').map(f => f.trim());
|
|
323
|
-
output = this.filterFields(output, fieldList);
|
|
324
|
-
}
|
|
325
322
|
// Sanitize output if requested
|
|
326
323
|
if (flags.sanitize) {
|
|
327
324
|
output = this.sanitizeOutput(output);
|
|
@@ -576,6 +573,8 @@ export default class ItemCategories extends Command {
|
|
|
576
573
|
baseParams.sortBy = normalizeSortBy(flags['sort-by']);
|
|
577
574
|
if (flags.include)
|
|
578
575
|
baseParams.include = flags.include;
|
|
576
|
+
if (flags.fields)
|
|
577
|
+
baseParams.fields = flags.fields;
|
|
579
578
|
if (flags.query) {
|
|
580
579
|
try {
|
|
581
580
|
Object.assign(baseParams, JSON.parse(flags.query));
|
|
@@ -630,12 +629,7 @@ export default class ItemCategories extends Command {
|
|
|
630
629
|
}
|
|
631
630
|
}
|
|
632
631
|
process.stderr.write(' done\n');
|
|
633
|
-
// Filter fields if specified
|
|
634
632
|
let output = allItems;
|
|
635
|
-
if (flags.fields) {
|
|
636
|
-
const fieldList = flags.fields.split(',').map(f => f.trim());
|
|
637
|
-
output = this.filterFields(allItems, fieldList);
|
|
638
|
-
}
|
|
639
633
|
// Sanitize output if requested
|
|
640
634
|
if (flags.sanitize) {
|
|
641
635
|
output = this.sanitizeOutput(output);
|
|
@@ -964,56 +958,6 @@ export default class ItemCategories extends Command {
|
|
|
964
958
|
return `\$${op}`;
|
|
965
959
|
return opRe.test(rest) ? `\$${op}:${this.parseFilterValue(rest)}` : `\$${op}:${rest}`;
|
|
966
960
|
}
|
|
967
|
-
filterFields(data, fields) {
|
|
968
|
-
const isUnsafeKey = (k) => k === '__proto__' || k === 'constructor' || k === 'prototype';
|
|
969
|
-
const pick = (obj, keys) => {
|
|
970
|
-
// Group keys by their first segment so sibling sub-paths
|
|
971
|
-
// (e.g. 'items.amount' + 'items._type') resolve in one recursive pass
|
|
972
|
-
// and don't clobber each other on merge.
|
|
973
|
-
const directKeys = new Set();
|
|
974
|
-
const nestedKeys = new Map();
|
|
975
|
-
for (const key of keys) {
|
|
976
|
-
if (key.split('.').some(isUnsafeKey))
|
|
977
|
-
continue;
|
|
978
|
-
if (key.includes('.')) {
|
|
979
|
-
const [first, ...rest] = key.split('.');
|
|
980
|
-
if (isUnsafeKey(first))
|
|
981
|
-
continue;
|
|
982
|
-
const list = nestedKeys.get(first);
|
|
983
|
-
if (list) {
|
|
984
|
-
list.push(rest.join('.'));
|
|
985
|
-
}
|
|
986
|
-
else {
|
|
987
|
-
nestedKeys.set(first, [rest.join('.')]);
|
|
988
|
-
}
|
|
989
|
-
}
|
|
990
|
-
else {
|
|
991
|
-
directKeys.add(key);
|
|
992
|
-
}
|
|
993
|
-
}
|
|
994
|
-
const result = {};
|
|
995
|
-
for (const key of directKeys) {
|
|
996
|
-
if (key in obj)
|
|
997
|
-
result[key] = obj[key];
|
|
998
|
-
}
|
|
999
|
-
for (const [first, restKeys] of nestedKeys) {
|
|
1000
|
-
const val = obj[first];
|
|
1001
|
-
if (!val || typeof val !== 'object')
|
|
1002
|
-
continue;
|
|
1003
|
-
if (Array.isArray(val)) {
|
|
1004
|
-
result[first] = val.map(item => pick(item, restKeys));
|
|
1005
|
-
}
|
|
1006
|
-
else {
|
|
1007
|
-
result[first] = pick(val, restKeys);
|
|
1008
|
-
}
|
|
1009
|
-
}
|
|
1010
|
-
return result;
|
|
1011
|
-
};
|
|
1012
|
-
if (Array.isArray(data)) {
|
|
1013
|
-
return data.map(item => pick(item, fields));
|
|
1014
|
-
}
|
|
1015
|
-
return pick(data, fields);
|
|
1016
|
-
}
|
|
1017
961
|
sanitizeOutput(data) {
|
|
1018
962
|
const auditFields = ['_type', 'tenantId', 'createdAt', 'updatedAt', 'createdBy', 'updatedBy'];
|
|
1019
963
|
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/items.d.ts
CHANGED
package/dist/commands/items.js
CHANGED
|
@@ -43,7 +43,7 @@ export default class Items extends Command {
|
|
|
43
43
|
'sort-by': Flags.string({ description: 'Sort field(s), comma-separated. Direction (:ASC/:DESC) is optional; date-like fields default to DESC, others to ASC.' }),
|
|
44
44
|
filter: Flags.string({ description: 'Filter (e.g. --filter status=ACTIVE). Operators: in:A,B, like:%, gt:, lt:, null:', multiple: true }),
|
|
45
45
|
query: Flags.string({ description: 'Additional query params as JSON' }),
|
|
46
|
-
fields: Flags.string({ description: 'Comma-separated list of fields to
|
|
46
|
+
fields: Flags.string({ description: 'Comma-separated list of fields to return, applied by the API (e.g. --fields=id,name,status)' }),
|
|
47
47
|
sanitize: Flags.boolean({ description: 'Remove null values, audit fields, and duplicate UUIDs from output' }),
|
|
48
48
|
'show-http-request': Flags.boolean({ description: 'Show HTTP request details (method, URL, body)' }),
|
|
49
49
|
};
|
|
@@ -115,6 +115,8 @@ export default class Items extends Command {
|
|
|
115
115
|
queryParams.search = flags.search;
|
|
116
116
|
if (flags['sort-by'])
|
|
117
117
|
queryParams.sortBy = normalizeSortBy(flags['sort-by']);
|
|
118
|
+
if (flags.fields)
|
|
119
|
+
queryParams.fields = flags.fields;
|
|
118
120
|
if (flags.query) {
|
|
119
121
|
try {
|
|
120
122
|
Object.assign(queryParams, JSON.parse(flags.query));
|
|
@@ -317,11 +319,6 @@ export default class Items extends Command {
|
|
|
317
319
|
output = obj[arrayKeys[0]];
|
|
318
320
|
}
|
|
319
321
|
}
|
|
320
|
-
// Filter fields if --fields flag is provided
|
|
321
|
-
if (flags.fields) {
|
|
322
|
-
const fieldList = flags.fields.split(',').map(f => f.trim());
|
|
323
|
-
output = this.filterFields(output, fieldList);
|
|
324
|
-
}
|
|
325
322
|
// Sanitize output if requested
|
|
326
323
|
if (flags.sanitize) {
|
|
327
324
|
output = this.sanitizeOutput(output);
|
|
@@ -576,6 +573,8 @@ export default class Items extends Command {
|
|
|
576
573
|
baseParams.sortBy = normalizeSortBy(flags['sort-by']);
|
|
577
574
|
if (flags.include)
|
|
578
575
|
baseParams.include = flags.include;
|
|
576
|
+
if (flags.fields)
|
|
577
|
+
baseParams.fields = flags.fields;
|
|
579
578
|
if (flags.query) {
|
|
580
579
|
try {
|
|
581
580
|
Object.assign(baseParams, JSON.parse(flags.query));
|
|
@@ -630,12 +629,7 @@ export default class Items extends Command {
|
|
|
630
629
|
}
|
|
631
630
|
}
|
|
632
631
|
process.stderr.write(' done\n');
|
|
633
|
-
// Filter fields if specified
|
|
634
632
|
let output = allItems;
|
|
635
|
-
if (flags.fields) {
|
|
636
|
-
const fieldList = flags.fields.split(',').map(f => f.trim());
|
|
637
|
-
output = this.filterFields(allItems, fieldList);
|
|
638
|
-
}
|
|
639
633
|
// Sanitize output if requested
|
|
640
634
|
if (flags.sanitize) {
|
|
641
635
|
output = this.sanitizeOutput(output);
|
|
@@ -964,56 +958,6 @@ export default class Items extends Command {
|
|
|
964
958
|
return `\$${op}`;
|
|
965
959
|
return opRe.test(rest) ? `\$${op}:${this.parseFilterValue(rest)}` : `\$${op}:${rest}`;
|
|
966
960
|
}
|
|
967
|
-
filterFields(data, fields) {
|
|
968
|
-
const isUnsafeKey = (k) => k === '__proto__' || k === 'constructor' || k === 'prototype';
|
|
969
|
-
const pick = (obj, keys) => {
|
|
970
|
-
// Group keys by their first segment so sibling sub-paths
|
|
971
|
-
// (e.g. 'items.amount' + 'items._type') resolve in one recursive pass
|
|
972
|
-
// and don't clobber each other on merge.
|
|
973
|
-
const directKeys = new Set();
|
|
974
|
-
const nestedKeys = new Map();
|
|
975
|
-
for (const key of keys) {
|
|
976
|
-
if (key.split('.').some(isUnsafeKey))
|
|
977
|
-
continue;
|
|
978
|
-
if (key.includes('.')) {
|
|
979
|
-
const [first, ...rest] = key.split('.');
|
|
980
|
-
if (isUnsafeKey(first))
|
|
981
|
-
continue;
|
|
982
|
-
const list = nestedKeys.get(first);
|
|
983
|
-
if (list) {
|
|
984
|
-
list.push(rest.join('.'));
|
|
985
|
-
}
|
|
986
|
-
else {
|
|
987
|
-
nestedKeys.set(first, [rest.join('.')]);
|
|
988
|
-
}
|
|
989
|
-
}
|
|
990
|
-
else {
|
|
991
|
-
directKeys.add(key);
|
|
992
|
-
}
|
|
993
|
-
}
|
|
994
|
-
const result = {};
|
|
995
|
-
for (const key of directKeys) {
|
|
996
|
-
if (key in obj)
|
|
997
|
-
result[key] = obj[key];
|
|
998
|
-
}
|
|
999
|
-
for (const [first, restKeys] of nestedKeys) {
|
|
1000
|
-
const val = obj[first];
|
|
1001
|
-
if (!val || typeof val !== 'object')
|
|
1002
|
-
continue;
|
|
1003
|
-
if (Array.isArray(val)) {
|
|
1004
|
-
result[first] = val.map(item => pick(item, restKeys));
|
|
1005
|
-
}
|
|
1006
|
-
else {
|
|
1007
|
-
result[first] = pick(val, restKeys);
|
|
1008
|
-
}
|
|
1009
|
-
}
|
|
1010
|
-
return result;
|
|
1011
|
-
};
|
|
1012
|
-
if (Array.isArray(data)) {
|
|
1013
|
-
return data.map(item => pick(item, fields));
|
|
1014
|
-
}
|
|
1015
|
-
return pick(data, fields);
|
|
1016
|
-
}
|
|
1017
961
|
sanitizeOutput(data) {
|
|
1018
962
|
const auditFields = ['_type', 'tenantId', 'createdAt', 'updatedAt', 'createdBy', 'updatedBy'];
|
|
1019
963
|
const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|