(targetProperties)
| 534 | * @returns {TargetProperties} merged target properties |
| 535 | */ |
| 536 | const mergeTargetProperties = (targetProperties) => { |
| 537 | /** @type {Set<keyof TargetProperties>} */ |
| 538 | const keys = new Set(); |
| 539 | for (const tp of targetProperties) { |
| 540 | for (const key of Object.keys(tp)) { |
| 541 | keys.add(/** @type {keyof TargetProperties} */ (key)); |
| 542 | } |
| 543 | } |
| 544 | /** @type {TargetProperties} */ |
| 545 | const result = {}; |
| 546 | for (const key of keys) { |
| 547 | let hasTrue = false; |
| 548 | let hasFalse = false; |
| 549 | for (const tp of targetProperties) { |
| 550 | const value = tp[key]; |
| 551 | switch (value) { |
| 552 | case true: |
| 553 | hasTrue = true; |
| 554 | break; |
| 555 | case false: |
| 556 | hasFalse = true; |
| 557 | break; |
| 558 | } |
| 559 | } |
| 560 | if (hasTrue || hasFalse) { |
| 561 | /** @type {TargetProperties} */ |
| 562 | (result)[key] = hasFalse && hasTrue ? null : Boolean(hasTrue); |
| 563 | } |
| 564 | } |
| 565 | return result; |
| 566 | }; |
| 567 | |
| 568 | /** |
| 569 | * Gets targets properties. |
no test coverage detected