( values: readonly Date[], input: TimeDomainInput = "auto" )
| 97 | }; |
| 98 | |
| 99 | export const resolveTimeDomain = ( |
| 100 | values: readonly Date[], |
| 101 | input: TimeDomainInput = "auto" |
| 102 | ): [Date, Date] => { |
| 103 | const validTimes = values |
| 104 | .map((value) => value.valueOf()) |
| 105 | .filter((value) => Number.isFinite(value)); |
| 106 | const dataMin = new Date(validTimes.length > 0 ? Math.min(...validTimes) : 0); |
| 107 | const dataMax = new Date(validTimes.length > 0 ? Math.max(...validTimes) : 0); |
| 108 | |
| 109 | let domain: [Date, Date]; |
| 110 | |
| 111 | if (input === "auto") { |
| 112 | domain = [dataMin, dataMax]; |
| 113 | } else if (Array.isArray(input)) { |
| 114 | domain = [ |
| 115 | resolveTimeInput(input[0], dataMin, dataMax, dataMin), |
| 116 | resolveTimeInput(input[1], dataMin, dataMax, dataMax) |
| 117 | ]; |
| 118 | } else { |
| 119 | domain = [ |
| 120 | resolveTimeInput(input.min, dataMin, dataMax, dataMin), |
| 121 | resolveTimeInput(input.max, dataMin, dataMax, dataMax) |
| 122 | ]; |
| 123 | } |
| 124 | |
| 125 | if (domain[0].valueOf() === domain[1].valueOf()) { |
| 126 | const center = domain[0].valueOf(); |
| 127 | return [new Date(center - 1), new Date(center + 1)]; |
| 128 | } |
| 129 | |
| 130 | return domain; |
| 131 | }; |
| 132 | |
| 133 | export const tickStep = ( |
| 134 | start: number, |
no test coverage detected