@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.
Files changed (85) hide show
  1. package/dist/commands/{processing-logs.d.ts → access-groups.d.ts} +1 -1
  2. package/dist/commands/{access-groups 2.js → access-groups.js} +30 -18
  3. package/dist/commands/account-transactions.d.ts +41 -0
  4. package/dist/commands/account-transactions.js +1032 -0
  5. package/dist/commands/accounts.d.ts +40 -0
  6. package/dist/commands/accounts.js +1024 -0
  7. package/dist/commands/agent-runs.d.ts +39 -0
  8. package/dist/commands/agent-runs.js +1013 -0
  9. package/dist/commands/{pubsub.d.ts → async-endpoints-internal.d.ts} +1 -1
  10. package/dist/commands/{pubsub.js → async-endpoints-internal.js} +37 -25
  11. package/dist/commands/audit-log.d.ts +39 -0
  12. package/dist/commands/{processing-logs.js → audit-log.js} +42 -28
  13. package/dist/commands/auth/login.d.ts +14 -0
  14. package/dist/commands/auth/login.js +116 -0
  15. package/dist/commands/auth/logout.d.ts +10 -0
  16. package/dist/commands/auth/logout.js +58 -0
  17. package/dist/commands/auth/status.d.ts +12 -0
  18. package/dist/commands/auth/status.js +101 -0
  19. package/dist/commands/auth/tenant.d.ts +19 -0
  20. package/dist/commands/auth/tenant.js +184 -0
  21. package/dist/commands/auth.d.ts +37 -0
  22. package/dist/commands/auth.js +871 -0
  23. package/dist/commands/bank-accounts.d.ts +41 -0
  24. package/dist/commands/bank-accounts.js +1032 -0
  25. package/dist/commands/bank-integrations.js +30 -18
  26. package/dist/commands/business-partners---contacts.js +30 -18
  27. package/dist/commands/business-partners.js +30 -18
  28. package/dist/commands/config/add.d.ts +13 -0
  29. package/dist/commands/config/add.js +120 -0
  30. package/dist/commands/config/current.d.ts +9 -0
  31. package/dist/commands/config/current.js +43 -0
  32. package/dist/commands/config/delete.d.ts +12 -0
  33. package/dist/commands/config/delete.js +67 -0
  34. package/dist/commands/config/list.d.ts +9 -0
  35. package/dist/commands/config/list.js +50 -0
  36. package/dist/commands/config/use.d.ts +9 -0
  37. package/dist/commands/config/use.js +40 -0
  38. package/dist/commands/credit-card-accounts.js +30 -18
  39. package/dist/commands/documents.js +30 -18
  40. package/dist/commands/dunning-configs.js +30 -18
  41. package/dist/commands/dunning-reminders.js +30 -18
  42. package/dist/commands/dunning-runs.js +30 -18
  43. package/dist/commands/employees.js +30 -18
  44. package/dist/commands/event-processor-mappings.js +30 -18
  45. package/dist/commands/files-internal.js +30 -18
  46. package/dist/commands/health.js +30 -18
  47. package/dist/commands/inbox.js +33 -19
  48. package/dist/commands/integrations.js +30 -18
  49. package/dist/commands/item-categories.js +30 -18
  50. package/dist/commands/items.js +30 -18
  51. package/dist/commands/journal-lines.js +30 -18
  52. package/dist/commands/journals.js +30 -18
  53. package/dist/commands/ledgers.js +30 -18
  54. package/dist/commands/office-locations.js +30 -18
  55. package/dist/commands/payment-method-ledger-mappings.js +30 -18
  56. package/dist/commands/payment-methods.js +30 -18
  57. package/dist/commands/payment-runs.js +30 -18
  58. package/dist/commands/payment-terms.js +30 -18
  59. package/dist/commands/price-lists.js +30 -18
  60. package/dist/commands/processor-mappings.js +30 -18
  61. package/dist/commands/processors.js +31 -19
  62. package/dist/commands/reconciliation.js +30 -18
  63. package/dist/commands/reports.js +30 -18
  64. package/dist/commands/salary-types.js +1018 -0
  65. package/dist/commands/sales-invoices.js +30 -18
  66. package/dist/commands/sales-orders.js +32 -19
  67. package/dist/commands/switch.d.ts +1 -0
  68. package/dist/commands/switch.js +58 -3
  69. package/dist/commands/tags.js +30 -18
  70. package/dist/commands/tax-codes.js +30 -18
  71. package/dist/commands/tax-matrix.js +30 -18
  72. package/dist/commands/tenants.js +30 -18
  73. package/dist/commands/text-templates.js +30 -18
  74. package/dist/commands/tools.js +30 -18
  75. package/dist/commands/vendor-invoices.js +33 -19
  76. package/dist/commands/webhooks.js +30 -18
  77. package/dist/commands/workflows.js +30 -18
  78. package/dist/index 2.js +1 -0
  79. package/dist/index.d 2.ts +1 -0
  80. package/dist/lib/auth.d.ts +16 -1
  81. package/dist/lib/auth.js +153 -45
  82. package/dist/lib/config.d.ts +7 -0
  83. package/dist/lib/config.js +6 -0
  84. package/oclif.manifest.json +2092 -669
  85. 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
- const result = {};
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
- const val = obj[first];
830
- if (val && typeof val === 'object') {
831
- const restKey = rest.join('.');
832
- if (Array.isArray(val)) {
833
- // Map over array elements (e.g., allocations[].salesInvoiceId)
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
- else if (key in obj) {
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;
@@ -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
- const result = {};
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
- const val = obj[first];
830
- if (val && typeof val === 'object') {
831
- const restKey = rest.join('.');
832
- if (Array.isArray(val)) {
833
- // Map over array elements (e.g., allocations[].salesInvoiceId)
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
- else if (key in obj) {
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
- const result = {};
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
- const val = obj[first];
822
- if (val && typeof val === 'object') {
823
- const restKey = rest.join('.');
824
- if (Array.isArray(val)) {
825
- // Map over array elements (e.g., allocations[].salesInvoiceId)
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
- else if (key in obj) {
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
- const result = {};
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
- const val = obj[first];
846
- if (val && typeof val === 'object') {
847
- const restKey = rest.join('.');
848
- if (Array.isArray(val)) {
849
- // Map over array elements (e.g., allocations[].salesInvoiceId)
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
- else if (key in obj) {
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;
@@ -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
- const result = {};
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
- const val = obj[first];
843
- if (val && typeof val === 'object') {
844
- const restKey = rest.join('.');
845
- if (Array.isArray(val)) {
846
- // Map over array elements (e.g., allocations[].salesInvoiceId)
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
- else if (key in obj) {
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
- const result = {};
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
- const val = obj[first];
830
- if (val && typeof val === 'object') {
831
- const restKey = rest.join('.');
832
- if (Array.isArray(val)) {
833
- // Map over array elements (e.g., allocations[].salesInvoiceId)
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
- else if (key in obj) {
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
- const result = {};
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
- const val = obj[first];
824
- if (val && typeof val === 'object') {
825
- const restKey = rest.join('.');
826
- if (Array.isArray(val)) {
827
- // Map over array elements (e.g., allocations[].salesInvoiceId)
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
- else if (key in obj) {
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
- const result = {};
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
- const val = obj[first];
830
- if (val && typeof val === 'object') {
831
- const restKey = rest.join('.');
832
- if (Array.isArray(val)) {
833
- // Map over array elements (e.g., allocations[].salesInvoiceId)
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
- else if (key in obj) {
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
- const result = {};
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
- const val = obj[first];
845
- if (val && typeof val === 'object') {
846
- const restKey = rest.join('.');
847
- if (Array.isArray(val)) {
848
- // Map over array elements (e.g., allocations[].salesInvoiceId)
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
- else if (key in obj) {
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
- const result = {};
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
- const val = obj[first];
831
- if (val && typeof val === 'object') {
832
- const restKey = rest.join('.');
833
- if (Array.isArray(val)) {
834
- // Map over array elements (e.g., allocations[].salesInvoiceId)
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
- else if (key in obj) {
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;