( value: unknown, validator: Validator, path: PropertyPath, side: WrapSide, wrapStubs = true )
| 790 | } |
| 791 | |
| 792 | function wrapResolvedValue( |
| 793 | value: unknown, |
| 794 | validator: Validator, |
| 795 | path: PropertyPath, |
| 796 | side: WrapSide, |
| 797 | wrapStubs = true |
| 798 | ): unknown { |
| 799 | if (path.length >= MAX_VALIDATION_DEPTH) return value; |
| 800 | let shape = shapeOf(validator); |
| 801 | if (!shape) return value; |
| 802 | if (shape.kind === "lazy") |
| 803 | return wrapResolvedValue(value, shape.thunk(), path, side, wrapStubs); |
| 804 | if (shape.kind === "union") { |
| 805 | for (let branch of shape.branches) { |
| 806 | try { |
| 807 | branch(value, path); |
| 808 | return wrapResolvedValue(value, branch, path, side, wrapStubs); |
| 809 | } catch (err) { |
| 810 | if (!isValidationTypeError(err)) throw err; |
| 811 | } |
| 812 | } |
| 813 | return value; |
| 814 | } |
| 815 | if (shape.kind === "stub") { |
| 816 | if (!wrapStubs) return value; |
| 817 | if (!shape.service) return value; |
| 818 | let valueType = typeof value; |
| 819 | if (value === null || (valueType !== "object" && valueType !== "function")) |
| 820 | return value; |
| 821 | return side === "server" |
| 822 | ? wrapServerTarget(value as object, shape.service) |
| 823 | : wrapClientStub(value as object, shape.service); |
| 824 | } |
| 825 | if (shape.kind === "array" || shape.kind === "tuple") { |
| 826 | if (!Array.isArray(value)) return value; |
| 827 | let next: unknown[] | undefined; |
| 828 | for (let i = 0; i < value.length; i++) { |
| 829 | let elemValidator = |
| 830 | shape.kind === "array" |
| 831 | ? shape.element |
| 832 | : (shape.elements[i] ?? shape.rest); |
| 833 | if (!elemValidator) continue; |
| 834 | let wrapped = wrapResolvedValue( |
| 835 | value[i], |
| 836 | elemValidator, |
| 837 | [...path, i], |
| 838 | side, |
| 839 | wrapStubs |
| 840 | ); |
| 841 | if (wrapped !== value[i]) { |
| 842 | next ??= value.slice(); |
| 843 | copyDisposeDescriptor(value, next); |
| 844 | next[i] = wrapped; |
| 845 | } |
| 846 | } |
| 847 | return next ?? value; |
| 848 | } |
| 849 | if (shape.kind === "map") { |
no test coverage detected
searching dependent graphs…