@aderis-erp/cli 1.0.2 → 1.0.3
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/dist/commands/{processing-logs.d.ts → access-groups.d.ts} +1 -1
- package/dist/commands/{access-groups 2.js → access-groups.js} +30 -18
- package/dist/commands/account-transactions.d.ts +41 -0
- package/dist/commands/account-transactions.js +1032 -0
- package/dist/commands/accounts.d.ts +40 -0
- package/dist/commands/accounts.js +1024 -0
- package/dist/commands/agent-runs.d.ts +39 -0
- package/dist/commands/agent-runs.js +1013 -0
- package/dist/commands/{pubsub.d.ts → async-endpoints-internal.d.ts} +1 -1
- package/dist/commands/{pubsub.js → async-endpoints-internal.js} +37 -25
- package/dist/commands/audit-log.d.ts +39 -0
- package/dist/commands/{processing-logs.js → audit-log.js} +42 -28
- 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 +41 -0
- package/dist/commands/bank-accounts.js +1032 -0
- package/dist/commands/bank-integrations.js +30 -18
- package/dist/commands/business-partners---contacts.js +30 -18
- package/dist/commands/business-partners.js +30 -18
- 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.js +30 -18
- package/dist/commands/documents.js +30 -18
- package/dist/commands/dunning-configs.js +30 -18
- package/dist/commands/dunning-reminders.js +30 -18
- package/dist/commands/dunning-runs.js +30 -18
- package/dist/commands/employees.js +30 -18
- package/dist/commands/event-processor-mappings.js +30 -18
- package/dist/commands/files-internal.js +30 -18
- package/dist/commands/health.js +30 -18
- package/dist/commands/inbox.js +33 -19
- package/dist/commands/integrations.js +30 -18
- package/dist/commands/item-categories.js +30 -18
- package/dist/commands/items.js +30 -18
- package/dist/commands/journal-lines.js +30 -18
- package/dist/commands/journals.js +30 -18
- package/dist/commands/ledgers.js +30 -18
- package/dist/commands/office-locations.js +30 -18
- package/dist/commands/payment-method-ledger-mappings.js +30 -18
- package/dist/commands/payment-methods.js +30 -18
- package/dist/commands/payment-runs.js +30 -18
- package/dist/commands/payment-terms.js +30 -18
- package/dist/commands/price-lists.js +30 -18
- package/dist/commands/processor-mappings.js +30 -18
- package/dist/commands/processors.js +31 -19
- package/dist/commands/reconciliation.js +30 -18
- package/dist/commands/reports.js +30 -18
- package/dist/commands/salary-types.js +1018 -0
- package/dist/commands/sales-invoices.js +30 -18
- package/dist/commands/sales-orders.js +32 -19
- package/dist/commands/switch.d.ts +1 -0
- package/dist/commands/switch.js +58 -3
- package/dist/commands/tags.js +30 -18
- package/dist/commands/tax-codes.js +30 -18
- package/dist/commands/tax-matrix.js +30 -18
- package/dist/commands/tenants.js +30 -18
- package/dist/commands/text-templates.js +30 -18
- package/dist/commands/tools.js +30 -18
- package/dist/commands/vendor-invoices.js +33 -19
- package/dist/commands/webhooks.js +30 -18
- package/dist/commands/workflows.js +30 -18
- package/dist/index 2.js +1 -0
- package/dist/index.d 2.ts +1 -0
- package/dist/lib/auth.d.ts +16 -1
- package/dist/lib/auth.js +153 -45
- package/dist/lib/config.d.ts +7 -0
- package/dist/lib/config.js +6 -0
- package/oclif.manifest.json +2092 -669
- package/package.json +2 -2
|
@@ -819,32 +819,44 @@ export default class ItemCategories extends Command {
|
|
|
819
819
|
filterFields(data, fields) {
|
|
820
820
|
const isUnsafeKey = (k) => k === '__proto__' || k === 'constructor' || k === 'prototype';
|
|
821
821
|
const pick = (obj, keys) => {
|
|
822
|
-
|
|
822
|
+
// Group keys by their first segment so sibling sub-paths
|
|
823
|
+
// (e.g. 'items.amount' + 'items._type') resolve in one recursive pass
|
|
824
|
+
// and don't clobber each other on merge.
|
|
825
|
+
const directKeys = new Set();
|
|
826
|
+
const nestedKeys = new Map();
|
|
823
827
|
for (const key of keys) {
|
|
824
828
|
if (key.split('.').some(isUnsafeKey))
|
|
825
829
|
continue;
|
|
826
830
|
if (key.includes('.')) {
|
|
827
|
-
// Handle nested fields like 'customer.name' or 'allocations.salesInvoiceId'
|
|
828
831
|
const [first, ...rest] = key.split('.');
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
const existing = Array.isArray(result[first]) ? result[first] : [];
|
|
835
|
-
result[first] = val.map((item, i) => ({
|
|
836
|
-
...(existing[i] || {}),
|
|
837
|
-
...pick(item, [restKey]),
|
|
838
|
-
}));
|
|
839
|
-
}
|
|
840
|
-
else {
|
|
841
|
-
const nested = pick(val, [restKey]);
|
|
842
|
-
result[first] = { ...(result[first] || {}), ...nested };
|
|
843
|
-
}
|
|
832
|
+
if (isUnsafeKey(first))
|
|
833
|
+
continue;
|
|
834
|
+
const list = nestedKeys.get(first);
|
|
835
|
+
if (list) {
|
|
836
|
+
list.push(rest.join('.'));
|
|
844
837
|
}
|
|
838
|
+
else {
|
|
839
|
+
nestedKeys.set(first, [rest.join('.')]);
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
else {
|
|
843
|
+
directKeys.add(key);
|
|
845
844
|
}
|
|
846
|
-
|
|
845
|
+
}
|
|
846
|
+
const result = {};
|
|
847
|
+
for (const key of directKeys) {
|
|
848
|
+
if (key in obj)
|
|
847
849
|
result[key] = obj[key];
|
|
850
|
+
}
|
|
851
|
+
for (const [first, restKeys] of nestedKeys) {
|
|
852
|
+
const val = obj[first];
|
|
853
|
+
if (!val || typeof val !== 'object')
|
|
854
|
+
continue;
|
|
855
|
+
if (Array.isArray(val)) {
|
|
856
|
+
result[first] = val.map(item => pick(item, restKeys));
|
|
857
|
+
}
|
|
858
|
+
else {
|
|
859
|
+
result[first] = pick(val, restKeys);
|
|
848
860
|
}
|
|
849
861
|
}
|
|
850
862
|
return result;
|
package/dist/commands/items.js
CHANGED
|
@@ -819,32 +819,44 @@ export default class Items extends Command {
|
|
|
819
819
|
filterFields(data, fields) {
|
|
820
820
|
const isUnsafeKey = (k) => k === '__proto__' || k === 'constructor' || k === 'prototype';
|
|
821
821
|
const pick = (obj, keys) => {
|
|
822
|
-
|
|
822
|
+
// Group keys by their first segment so sibling sub-paths
|
|
823
|
+
// (e.g. 'items.amount' + 'items._type') resolve in one recursive pass
|
|
824
|
+
// and don't clobber each other on merge.
|
|
825
|
+
const directKeys = new Set();
|
|
826
|
+
const nestedKeys = new Map();
|
|
823
827
|
for (const key of keys) {
|
|
824
828
|
if (key.split('.').some(isUnsafeKey))
|
|
825
829
|
continue;
|
|
826
830
|
if (key.includes('.')) {
|
|
827
|
-
// Handle nested fields like 'customer.name' or 'allocations.salesInvoiceId'
|
|
828
831
|
const [first, ...rest] = key.split('.');
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
const existing = Array.isArray(result[first]) ? result[first] : [];
|
|
835
|
-
result[first] = val.map((item, i) => ({
|
|
836
|
-
...(existing[i] || {}),
|
|
837
|
-
...pick(item, [restKey]),
|
|
838
|
-
}));
|
|
839
|
-
}
|
|
840
|
-
else {
|
|
841
|
-
const nested = pick(val, [restKey]);
|
|
842
|
-
result[first] = { ...(result[first] || {}), ...nested };
|
|
843
|
-
}
|
|
832
|
+
if (isUnsafeKey(first))
|
|
833
|
+
continue;
|
|
834
|
+
const list = nestedKeys.get(first);
|
|
835
|
+
if (list) {
|
|
836
|
+
list.push(rest.join('.'));
|
|
844
837
|
}
|
|
838
|
+
else {
|
|
839
|
+
nestedKeys.set(first, [rest.join('.')]);
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
else {
|
|
843
|
+
directKeys.add(key);
|
|
845
844
|
}
|
|
846
|
-
|
|
845
|
+
}
|
|
846
|
+
const result = {};
|
|
847
|
+
for (const key of directKeys) {
|
|
848
|
+
if (key in obj)
|
|
847
849
|
result[key] = obj[key];
|
|
850
|
+
}
|
|
851
|
+
for (const [first, restKeys] of nestedKeys) {
|
|
852
|
+
const val = obj[first];
|
|
853
|
+
if (!val || typeof val !== 'object')
|
|
854
|
+
continue;
|
|
855
|
+
if (Array.isArray(val)) {
|
|
856
|
+
result[first] = val.map(item => pick(item, restKeys));
|
|
857
|
+
}
|
|
858
|
+
else {
|
|
859
|
+
result[first] = pick(val, restKeys);
|
|
848
860
|
}
|
|
849
861
|
}
|
|
850
862
|
return result;
|
|
@@ -811,32 +811,44 @@ export default class JournalLines extends Command {
|
|
|
811
811
|
filterFields(data, fields) {
|
|
812
812
|
const isUnsafeKey = (k) => k === '__proto__' || k === 'constructor' || k === 'prototype';
|
|
813
813
|
const pick = (obj, keys) => {
|
|
814
|
-
|
|
814
|
+
// Group keys by their first segment so sibling sub-paths
|
|
815
|
+
// (e.g. 'items.amount' + 'items._type') resolve in one recursive pass
|
|
816
|
+
// and don't clobber each other on merge.
|
|
817
|
+
const directKeys = new Set();
|
|
818
|
+
const nestedKeys = new Map();
|
|
815
819
|
for (const key of keys) {
|
|
816
820
|
if (key.split('.').some(isUnsafeKey))
|
|
817
821
|
continue;
|
|
818
822
|
if (key.includes('.')) {
|
|
819
|
-
// Handle nested fields like 'customer.name' or 'allocations.salesInvoiceId'
|
|
820
823
|
const [first, ...rest] = key.split('.');
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
const existing = Array.isArray(result[first]) ? result[first] : [];
|
|
827
|
-
result[first] = val.map((item, i) => ({
|
|
828
|
-
...(existing[i] || {}),
|
|
829
|
-
...pick(item, [restKey]),
|
|
830
|
-
}));
|
|
831
|
-
}
|
|
832
|
-
else {
|
|
833
|
-
const nested = pick(val, [restKey]);
|
|
834
|
-
result[first] = { ...(result[first] || {}), ...nested };
|
|
835
|
-
}
|
|
824
|
+
if (isUnsafeKey(first))
|
|
825
|
+
continue;
|
|
826
|
+
const list = nestedKeys.get(first);
|
|
827
|
+
if (list) {
|
|
828
|
+
list.push(rest.join('.'));
|
|
836
829
|
}
|
|
830
|
+
else {
|
|
831
|
+
nestedKeys.set(first, [rest.join('.')]);
|
|
832
|
+
}
|
|
833
|
+
}
|
|
834
|
+
else {
|
|
835
|
+
directKeys.add(key);
|
|
837
836
|
}
|
|
838
|
-
|
|
837
|
+
}
|
|
838
|
+
const result = {};
|
|
839
|
+
for (const key of directKeys) {
|
|
840
|
+
if (key in obj)
|
|
839
841
|
result[key] = obj[key];
|
|
842
|
+
}
|
|
843
|
+
for (const [first, restKeys] of nestedKeys) {
|
|
844
|
+
const val = obj[first];
|
|
845
|
+
if (!val || typeof val !== 'object')
|
|
846
|
+
continue;
|
|
847
|
+
if (Array.isArray(val)) {
|
|
848
|
+
result[first] = val.map(item => pick(item, restKeys));
|
|
849
|
+
}
|
|
850
|
+
else {
|
|
851
|
+
result[first] = pick(val, restKeys);
|
|
840
852
|
}
|
|
841
853
|
}
|
|
842
854
|
return result;
|
|
@@ -835,32 +835,44 @@ export default class Journals extends Command {
|
|
|
835
835
|
filterFields(data, fields) {
|
|
836
836
|
const isUnsafeKey = (k) => k === '__proto__' || k === 'constructor' || k === 'prototype';
|
|
837
837
|
const pick = (obj, keys) => {
|
|
838
|
-
|
|
838
|
+
// Group keys by their first segment so sibling sub-paths
|
|
839
|
+
// (e.g. 'items.amount' + 'items._type') resolve in one recursive pass
|
|
840
|
+
// and don't clobber each other on merge.
|
|
841
|
+
const directKeys = new Set();
|
|
842
|
+
const nestedKeys = new Map();
|
|
839
843
|
for (const key of keys) {
|
|
840
844
|
if (key.split('.').some(isUnsafeKey))
|
|
841
845
|
continue;
|
|
842
846
|
if (key.includes('.')) {
|
|
843
|
-
// Handle nested fields like 'customer.name' or 'allocations.salesInvoiceId'
|
|
844
847
|
const [first, ...rest] = key.split('.');
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
|
|
850
|
-
const existing = Array.isArray(result[first]) ? result[first] : [];
|
|
851
|
-
result[first] = val.map((item, i) => ({
|
|
852
|
-
...(existing[i] || {}),
|
|
853
|
-
...pick(item, [restKey]),
|
|
854
|
-
}));
|
|
855
|
-
}
|
|
856
|
-
else {
|
|
857
|
-
const nested = pick(val, [restKey]);
|
|
858
|
-
result[first] = { ...(result[first] || {}), ...nested };
|
|
859
|
-
}
|
|
848
|
+
if (isUnsafeKey(first))
|
|
849
|
+
continue;
|
|
850
|
+
const list = nestedKeys.get(first);
|
|
851
|
+
if (list) {
|
|
852
|
+
list.push(rest.join('.'));
|
|
860
853
|
}
|
|
854
|
+
else {
|
|
855
|
+
nestedKeys.set(first, [rest.join('.')]);
|
|
856
|
+
}
|
|
857
|
+
}
|
|
858
|
+
else {
|
|
859
|
+
directKeys.add(key);
|
|
861
860
|
}
|
|
862
|
-
|
|
861
|
+
}
|
|
862
|
+
const result = {};
|
|
863
|
+
for (const key of directKeys) {
|
|
864
|
+
if (key in obj)
|
|
863
865
|
result[key] = obj[key];
|
|
866
|
+
}
|
|
867
|
+
for (const [first, restKeys] of nestedKeys) {
|
|
868
|
+
const val = obj[first];
|
|
869
|
+
if (!val || typeof val !== 'object')
|
|
870
|
+
continue;
|
|
871
|
+
if (Array.isArray(val)) {
|
|
872
|
+
result[first] = val.map(item => pick(item, restKeys));
|
|
873
|
+
}
|
|
874
|
+
else {
|
|
875
|
+
result[first] = pick(val, restKeys);
|
|
864
876
|
}
|
|
865
877
|
}
|
|
866
878
|
return result;
|
package/dist/commands/ledgers.js
CHANGED
|
@@ -832,32 +832,44 @@ export default class Ledgers extends Command {
|
|
|
832
832
|
filterFields(data, fields) {
|
|
833
833
|
const isUnsafeKey = (k) => k === '__proto__' || k === 'constructor' || k === 'prototype';
|
|
834
834
|
const pick = (obj, keys) => {
|
|
835
|
-
|
|
835
|
+
// Group keys by their first segment so sibling sub-paths
|
|
836
|
+
// (e.g. 'items.amount' + 'items._type') resolve in one recursive pass
|
|
837
|
+
// and don't clobber each other on merge.
|
|
838
|
+
const directKeys = new Set();
|
|
839
|
+
const nestedKeys = new Map();
|
|
836
840
|
for (const key of keys) {
|
|
837
841
|
if (key.split('.').some(isUnsafeKey))
|
|
838
842
|
continue;
|
|
839
843
|
if (key.includes('.')) {
|
|
840
|
-
// Handle nested fields like 'customer.name' or 'allocations.salesInvoiceId'
|
|
841
844
|
const [first, ...rest] = key.split('.');
|
|
842
|
-
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
const existing = Array.isArray(result[first]) ? result[first] : [];
|
|
848
|
-
result[first] = val.map((item, i) => ({
|
|
849
|
-
...(existing[i] || {}),
|
|
850
|
-
...pick(item, [restKey]),
|
|
851
|
-
}));
|
|
852
|
-
}
|
|
853
|
-
else {
|
|
854
|
-
const nested = pick(val, [restKey]);
|
|
855
|
-
result[first] = { ...(result[first] || {}), ...nested };
|
|
856
|
-
}
|
|
845
|
+
if (isUnsafeKey(first))
|
|
846
|
+
continue;
|
|
847
|
+
const list = nestedKeys.get(first);
|
|
848
|
+
if (list) {
|
|
849
|
+
list.push(rest.join('.'));
|
|
857
850
|
}
|
|
851
|
+
else {
|
|
852
|
+
nestedKeys.set(first, [rest.join('.')]);
|
|
853
|
+
}
|
|
854
|
+
}
|
|
855
|
+
else {
|
|
856
|
+
directKeys.add(key);
|
|
858
857
|
}
|
|
859
|
-
|
|
858
|
+
}
|
|
859
|
+
const result = {};
|
|
860
|
+
for (const key of directKeys) {
|
|
861
|
+
if (key in obj)
|
|
860
862
|
result[key] = obj[key];
|
|
863
|
+
}
|
|
864
|
+
for (const [first, restKeys] of nestedKeys) {
|
|
865
|
+
const val = obj[first];
|
|
866
|
+
if (!val || typeof val !== 'object')
|
|
867
|
+
continue;
|
|
868
|
+
if (Array.isArray(val)) {
|
|
869
|
+
result[first] = val.map(item => pick(item, restKeys));
|
|
870
|
+
}
|
|
871
|
+
else {
|
|
872
|
+
result[first] = pick(val, restKeys);
|
|
861
873
|
}
|
|
862
874
|
}
|
|
863
875
|
return result;
|
|
@@ -819,32 +819,44 @@ export default class OfficeLocations extends Command {
|
|
|
819
819
|
filterFields(data, fields) {
|
|
820
820
|
const isUnsafeKey = (k) => k === '__proto__' || k === 'constructor' || k === 'prototype';
|
|
821
821
|
const pick = (obj, keys) => {
|
|
822
|
-
|
|
822
|
+
// Group keys by their first segment so sibling sub-paths
|
|
823
|
+
// (e.g. 'items.amount' + 'items._type') resolve in one recursive pass
|
|
824
|
+
// and don't clobber each other on merge.
|
|
825
|
+
const directKeys = new Set();
|
|
826
|
+
const nestedKeys = new Map();
|
|
823
827
|
for (const key of keys) {
|
|
824
828
|
if (key.split('.').some(isUnsafeKey))
|
|
825
829
|
continue;
|
|
826
830
|
if (key.includes('.')) {
|
|
827
|
-
// Handle nested fields like 'customer.name' or 'allocations.salesInvoiceId'
|
|
828
831
|
const [first, ...rest] = key.split('.');
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
const existing = Array.isArray(result[first]) ? result[first] : [];
|
|
835
|
-
result[first] = val.map((item, i) => ({
|
|
836
|
-
...(existing[i] || {}),
|
|
837
|
-
...pick(item, [restKey]),
|
|
838
|
-
}));
|
|
839
|
-
}
|
|
840
|
-
else {
|
|
841
|
-
const nested = pick(val, [restKey]);
|
|
842
|
-
result[first] = { ...(result[first] || {}), ...nested };
|
|
843
|
-
}
|
|
832
|
+
if (isUnsafeKey(first))
|
|
833
|
+
continue;
|
|
834
|
+
const list = nestedKeys.get(first);
|
|
835
|
+
if (list) {
|
|
836
|
+
list.push(rest.join('.'));
|
|
844
837
|
}
|
|
838
|
+
else {
|
|
839
|
+
nestedKeys.set(first, [rest.join('.')]);
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
else {
|
|
843
|
+
directKeys.add(key);
|
|
845
844
|
}
|
|
846
|
-
|
|
845
|
+
}
|
|
846
|
+
const result = {};
|
|
847
|
+
for (const key of directKeys) {
|
|
848
|
+
if (key in obj)
|
|
847
849
|
result[key] = obj[key];
|
|
850
|
+
}
|
|
851
|
+
for (const [first, restKeys] of nestedKeys) {
|
|
852
|
+
const val = obj[first];
|
|
853
|
+
if (!val || typeof val !== 'object')
|
|
854
|
+
continue;
|
|
855
|
+
if (Array.isArray(val)) {
|
|
856
|
+
result[first] = val.map(item => pick(item, restKeys));
|
|
857
|
+
}
|
|
858
|
+
else {
|
|
859
|
+
result[first] = pick(val, restKeys);
|
|
848
860
|
}
|
|
849
861
|
}
|
|
850
862
|
return result;
|
|
@@ -813,32 +813,44 @@ export default class PaymentMethodLedgerMappings extends Command {
|
|
|
813
813
|
filterFields(data, fields) {
|
|
814
814
|
const isUnsafeKey = (k) => k === '__proto__' || k === 'constructor' || k === 'prototype';
|
|
815
815
|
const pick = (obj, keys) => {
|
|
816
|
-
|
|
816
|
+
// Group keys by their first segment so sibling sub-paths
|
|
817
|
+
// (e.g. 'items.amount' + 'items._type') resolve in one recursive pass
|
|
818
|
+
// and don't clobber each other on merge.
|
|
819
|
+
const directKeys = new Set();
|
|
820
|
+
const nestedKeys = new Map();
|
|
817
821
|
for (const key of keys) {
|
|
818
822
|
if (key.split('.').some(isUnsafeKey))
|
|
819
823
|
continue;
|
|
820
824
|
if (key.includes('.')) {
|
|
821
|
-
// Handle nested fields like 'customer.name' or 'allocations.salesInvoiceId'
|
|
822
825
|
const [first, ...rest] = key.split('.');
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
const existing = Array.isArray(result[first]) ? result[first] : [];
|
|
829
|
-
result[first] = val.map((item, i) => ({
|
|
830
|
-
...(existing[i] || {}),
|
|
831
|
-
...pick(item, [restKey]),
|
|
832
|
-
}));
|
|
833
|
-
}
|
|
834
|
-
else {
|
|
835
|
-
const nested = pick(val, [restKey]);
|
|
836
|
-
result[first] = { ...(result[first] || {}), ...nested };
|
|
837
|
-
}
|
|
826
|
+
if (isUnsafeKey(first))
|
|
827
|
+
continue;
|
|
828
|
+
const list = nestedKeys.get(first);
|
|
829
|
+
if (list) {
|
|
830
|
+
list.push(rest.join('.'));
|
|
838
831
|
}
|
|
832
|
+
else {
|
|
833
|
+
nestedKeys.set(first, [rest.join('.')]);
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
else {
|
|
837
|
+
directKeys.add(key);
|
|
839
838
|
}
|
|
840
|
-
|
|
839
|
+
}
|
|
840
|
+
const result = {};
|
|
841
|
+
for (const key of directKeys) {
|
|
842
|
+
if (key in obj)
|
|
841
843
|
result[key] = obj[key];
|
|
844
|
+
}
|
|
845
|
+
for (const [first, restKeys] of nestedKeys) {
|
|
846
|
+
const val = obj[first];
|
|
847
|
+
if (!val || typeof val !== 'object')
|
|
848
|
+
continue;
|
|
849
|
+
if (Array.isArray(val)) {
|
|
850
|
+
result[first] = val.map(item => pick(item, restKeys));
|
|
851
|
+
}
|
|
852
|
+
else {
|
|
853
|
+
result[first] = pick(val, restKeys);
|
|
842
854
|
}
|
|
843
855
|
}
|
|
844
856
|
return result;
|
|
@@ -819,32 +819,44 @@ export default class PaymentMethods extends Command {
|
|
|
819
819
|
filterFields(data, fields) {
|
|
820
820
|
const isUnsafeKey = (k) => k === '__proto__' || k === 'constructor' || k === 'prototype';
|
|
821
821
|
const pick = (obj, keys) => {
|
|
822
|
-
|
|
822
|
+
// Group keys by their first segment so sibling sub-paths
|
|
823
|
+
// (e.g. 'items.amount' + 'items._type') resolve in one recursive pass
|
|
824
|
+
// and don't clobber each other on merge.
|
|
825
|
+
const directKeys = new Set();
|
|
826
|
+
const nestedKeys = new Map();
|
|
823
827
|
for (const key of keys) {
|
|
824
828
|
if (key.split('.').some(isUnsafeKey))
|
|
825
829
|
continue;
|
|
826
830
|
if (key.includes('.')) {
|
|
827
|
-
// Handle nested fields like 'customer.name' or 'allocations.salesInvoiceId'
|
|
828
831
|
const [first, ...rest] = key.split('.');
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
const existing = Array.isArray(result[first]) ? result[first] : [];
|
|
835
|
-
result[first] = val.map((item, i) => ({
|
|
836
|
-
...(existing[i] || {}),
|
|
837
|
-
...pick(item, [restKey]),
|
|
838
|
-
}));
|
|
839
|
-
}
|
|
840
|
-
else {
|
|
841
|
-
const nested = pick(val, [restKey]);
|
|
842
|
-
result[first] = { ...(result[first] || {}), ...nested };
|
|
843
|
-
}
|
|
832
|
+
if (isUnsafeKey(first))
|
|
833
|
+
continue;
|
|
834
|
+
const list = nestedKeys.get(first);
|
|
835
|
+
if (list) {
|
|
836
|
+
list.push(rest.join('.'));
|
|
844
837
|
}
|
|
838
|
+
else {
|
|
839
|
+
nestedKeys.set(first, [rest.join('.')]);
|
|
840
|
+
}
|
|
841
|
+
}
|
|
842
|
+
else {
|
|
843
|
+
directKeys.add(key);
|
|
845
844
|
}
|
|
846
|
-
|
|
845
|
+
}
|
|
846
|
+
const result = {};
|
|
847
|
+
for (const key of directKeys) {
|
|
848
|
+
if (key in obj)
|
|
847
849
|
result[key] = obj[key];
|
|
850
|
+
}
|
|
851
|
+
for (const [first, restKeys] of nestedKeys) {
|
|
852
|
+
const val = obj[first];
|
|
853
|
+
if (!val || typeof val !== 'object')
|
|
854
|
+
continue;
|
|
855
|
+
if (Array.isArray(val)) {
|
|
856
|
+
result[first] = val.map(item => pick(item, restKeys));
|
|
857
|
+
}
|
|
858
|
+
else {
|
|
859
|
+
result[first] = pick(val, restKeys);
|
|
848
860
|
}
|
|
849
861
|
}
|
|
850
862
|
return result;
|
|
@@ -834,32 +834,44 @@ export default class PaymentRuns extends Command {
|
|
|
834
834
|
filterFields(data, fields) {
|
|
835
835
|
const isUnsafeKey = (k) => k === '__proto__' || k === 'constructor' || k === 'prototype';
|
|
836
836
|
const pick = (obj, keys) => {
|
|
837
|
-
|
|
837
|
+
// Group keys by their first segment so sibling sub-paths
|
|
838
|
+
// (e.g. 'items.amount' + 'items._type') resolve in one recursive pass
|
|
839
|
+
// and don't clobber each other on merge.
|
|
840
|
+
const directKeys = new Set();
|
|
841
|
+
const nestedKeys = new Map();
|
|
838
842
|
for (const key of keys) {
|
|
839
843
|
if (key.split('.').some(isUnsafeKey))
|
|
840
844
|
continue;
|
|
841
845
|
if (key.includes('.')) {
|
|
842
|
-
// Handle nested fields like 'customer.name' or 'allocations.salesInvoiceId'
|
|
843
846
|
const [first, ...rest] = key.split('.');
|
|
844
|
-
|
|
845
|
-
|
|
846
|
-
|
|
847
|
-
|
|
848
|
-
|
|
849
|
-
const existing = Array.isArray(result[first]) ? result[first] : [];
|
|
850
|
-
result[first] = val.map((item, i) => ({
|
|
851
|
-
...(existing[i] || {}),
|
|
852
|
-
...pick(item, [restKey]),
|
|
853
|
-
}));
|
|
854
|
-
}
|
|
855
|
-
else {
|
|
856
|
-
const nested = pick(val, [restKey]);
|
|
857
|
-
result[first] = { ...(result[first] || {}), ...nested };
|
|
858
|
-
}
|
|
847
|
+
if (isUnsafeKey(first))
|
|
848
|
+
continue;
|
|
849
|
+
const list = nestedKeys.get(first);
|
|
850
|
+
if (list) {
|
|
851
|
+
list.push(rest.join('.'));
|
|
859
852
|
}
|
|
853
|
+
else {
|
|
854
|
+
nestedKeys.set(first, [rest.join('.')]);
|
|
855
|
+
}
|
|
856
|
+
}
|
|
857
|
+
else {
|
|
858
|
+
directKeys.add(key);
|
|
860
859
|
}
|
|
861
|
-
|
|
860
|
+
}
|
|
861
|
+
const result = {};
|
|
862
|
+
for (const key of directKeys) {
|
|
863
|
+
if (key in obj)
|
|
862
864
|
result[key] = obj[key];
|
|
865
|
+
}
|
|
866
|
+
for (const [first, restKeys] of nestedKeys) {
|
|
867
|
+
const val = obj[first];
|
|
868
|
+
if (!val || typeof val !== 'object')
|
|
869
|
+
continue;
|
|
870
|
+
if (Array.isArray(val)) {
|
|
871
|
+
result[first] = val.map(item => pick(item, restKeys));
|
|
872
|
+
}
|
|
873
|
+
else {
|
|
874
|
+
result[first] = pick(val, restKeys);
|
|
863
875
|
}
|
|
864
876
|
}
|
|
865
877
|
return result;
|
|
@@ -820,32 +820,44 @@ export default class PaymentTerms extends Command {
|
|
|
820
820
|
filterFields(data, fields) {
|
|
821
821
|
const isUnsafeKey = (k) => k === '__proto__' || k === 'constructor' || k === 'prototype';
|
|
822
822
|
const pick = (obj, keys) => {
|
|
823
|
-
|
|
823
|
+
// Group keys by their first segment so sibling sub-paths
|
|
824
|
+
// (e.g. 'items.amount' + 'items._type') resolve in one recursive pass
|
|
825
|
+
// and don't clobber each other on merge.
|
|
826
|
+
const directKeys = new Set();
|
|
827
|
+
const nestedKeys = new Map();
|
|
824
828
|
for (const key of keys) {
|
|
825
829
|
if (key.split('.').some(isUnsafeKey))
|
|
826
830
|
continue;
|
|
827
831
|
if (key.includes('.')) {
|
|
828
|
-
// Handle nested fields like 'customer.name' or 'allocations.salesInvoiceId'
|
|
829
832
|
const [first, ...rest] = key.split('.');
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
const existing = Array.isArray(result[first]) ? result[first] : [];
|
|
836
|
-
result[first] = val.map((item, i) => ({
|
|
837
|
-
...(existing[i] || {}),
|
|
838
|
-
...pick(item, [restKey]),
|
|
839
|
-
}));
|
|
840
|
-
}
|
|
841
|
-
else {
|
|
842
|
-
const nested = pick(val, [restKey]);
|
|
843
|
-
result[first] = { ...(result[first] || {}), ...nested };
|
|
844
|
-
}
|
|
833
|
+
if (isUnsafeKey(first))
|
|
834
|
+
continue;
|
|
835
|
+
const list = nestedKeys.get(first);
|
|
836
|
+
if (list) {
|
|
837
|
+
list.push(rest.join('.'));
|
|
845
838
|
}
|
|
839
|
+
else {
|
|
840
|
+
nestedKeys.set(first, [rest.join('.')]);
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
else {
|
|
844
|
+
directKeys.add(key);
|
|
846
845
|
}
|
|
847
|
-
|
|
846
|
+
}
|
|
847
|
+
const result = {};
|
|
848
|
+
for (const key of directKeys) {
|
|
849
|
+
if (key in obj)
|
|
848
850
|
result[key] = obj[key];
|
|
851
|
+
}
|
|
852
|
+
for (const [first, restKeys] of nestedKeys) {
|
|
853
|
+
const val = obj[first];
|
|
854
|
+
if (!val || typeof val !== 'object')
|
|
855
|
+
continue;
|
|
856
|
+
if (Array.isArray(val)) {
|
|
857
|
+
result[first] = val.map(item => pick(item, restKeys));
|
|
858
|
+
}
|
|
859
|
+
else {
|
|
860
|
+
result[first] = pick(val, restKeys);
|
|
849
861
|
}
|
|
850
862
|
}
|
|
851
863
|
return result;
|