(obj, keysToKeepOriginalValue = [])
| 607 | * @returns {T} the object without operations like "..." or DELETE |
| 608 | */ |
| 609 | const removeOperations = (obj, keysToKeepOriginalValue = []) => { |
| 610 | const newObj = /** @type {T} */ ({}); |
| 611 | for (const _key of Object.keys(obj)) { |
| 612 | const key = /** @type {keyof T} */ (_key); |
| 613 | const value = obj[key]; |
| 614 | const type = getValueType(value); |
| 615 | if (type === VALUE_TYPE_OBJECT && keysToKeepOriginalValue.includes(key)) { |
| 616 | newObj[key] = value; |
| 617 | continue; |
| 618 | } |
| 619 | switch (type) { |
| 620 | case VALUE_TYPE_UNDEFINED: |
| 621 | case VALUE_TYPE_DELETE: |
| 622 | break; |
| 623 | case VALUE_TYPE_OBJECT: |
| 624 | newObj[key] = |
| 625 | /** @type {T[keyof T]} */ |
| 626 | ( |
| 627 | removeOperations( |
| 628 | /** @type {T} */ |
| 629 | (value), |
| 630 | keysToKeepOriginalValue |
| 631 | ) |
| 632 | ); |
| 633 | break; |
| 634 | case VALUE_TYPE_ARRAY_EXTEND: |
| 635 | newObj[key] = |
| 636 | /** @type {T[keyof T]} */ |
| 637 | ( |
| 638 | /** @type {EXPECTED_ANY[]} */ |
| 639 | (value).filter((i) => i !== "...") |
| 640 | ); |
| 641 | break; |
| 642 | default: |
| 643 | newObj[key] = value; |
| 644 | break; |
| 645 | } |
| 646 | } |
| 647 | return newObj; |
| 648 | }; |
| 649 | |
| 650 | /** |
| 651 | * Resolves by property. |
no test coverage detected