Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 6x 6x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 54x 1x 1x 1x 4320x 4320x 4320x 1x | /** * Previously when we get a blank for a value, or a string where we expect a number, etc, * we parse things as simply undefineds or nulls or NaN. Since authors are uploading data * from our sources at runtime, and errors in source data are extremely common, it may be helpful * to parse those invalid values into specific types, to provide better error message and perhaps * in the future suggested autocorrections or workarounds. * * For a good read on the "Errors are values" pattern: https://blog.golang.org/errors-are-values */ export abstract class ErrorValue { toString(): string { return "" } toErrorString(): string { return this.constructor.name } } class NaNButShouldBeNumber extends ErrorValue {} export class DroppedForTesting extends ErrorValue {} class InvalidOnALogScale extends ErrorValue {} class UndefinedButShouldBeNumber extends ErrorValue {} class NullButShouldBeNumber extends ErrorValue {} class BlankButShouldBeNumber extends ErrorValue {} class UndefinedButShouldBeString extends ErrorValue {} class NullButShouldBeString extends ErrorValue {} class NotAParseableNumberButShouldBeNumber extends ErrorValue {} export class DivideByZeroError extends ErrorValue {} class NoValueWithinTolerance extends ErrorValue {} class NoMatchingValueAfterJoin extends ErrorValue {} export class ValueTooLow extends ErrorValue {} class NoValueToCompareAgainst extends ErrorValue {} class FilteredValue extends ErrorValue {} class NoValueForInterpolation extends ErrorValue {} class InvalidQuarterValue extends ErrorValue {} // todo: if we don't export this, get an error in Transforms. should be fixable, see: https://github.com/microsoft/TypeScript/issues/5711 export class MissingValuePlaceholder extends ErrorValue {} export const ErrorValueTypes = { NaNButShouldBeNumber: new NaNButShouldBeNumber(), DroppedForTesting: new DroppedForTesting(), InvalidOnALogScale: new InvalidOnALogScale(), UndefinedButShouldBeNumber: new UndefinedButShouldBeNumber(), NullButShouldBeNumber: new NullButShouldBeNumber(), BlankButShouldBeNumber: new BlankButShouldBeNumber(), UndefinedButShouldBeString: new UndefinedButShouldBeString(), NullButShouldBeString: new NullButShouldBeString(), MissingValuePlaceholder: new MissingValuePlaceholder(), NotAParseableNumberButShouldBeNumber: new NotAParseableNumberButShouldBeNumber(), DivideByZeroError: new DivideByZeroError(), NoValueWithinTolerance: new NoValueWithinTolerance(), NoMatchingValueAfterJoin: new NoMatchingValueAfterJoin(), ValueTooLow: new ValueTooLow(), NoValueToCompareAgainst: new NoValueToCompareAgainst(), FilteredValue: new FilteredValue(), NoValueForInterpolation: new NoValueForInterpolation(), InvalidQuarterValue: new InvalidQuarterValue(), } // https://github.com/robertmassaioli/ts-is-present // A predicate for filtering an array of valid and error values that returns the correct type export const isNotErrorValue = <TYPE>(item: TYPE | ErrorValue): item is TYPE => !(item instanceof ErrorValue) export const isNotErrorValueOrEmptyCell = <K>( value: K ): value is Exclude<K, ErrorValue | undefined> => value !== undefined && isNotErrorValue(value) export const defaultIfErrorValue = <TYPE>( item: TYPE | ErrorValue, defaultValue?: TYPE ): TYPE | undefined => (isNotErrorValue(item) ? item : defaultValue) |