Skip to content

Commit 2bb6df6

Browse files
committed
Fix field type detection
Fixes #25
1 parent 82f074b commit 2bb6df6

File tree

2 files changed

+28
-2
lines changed

2 files changed

+28
-2
lines changed

src/datasource.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,15 @@ export class DataSource extends DataSourceApi<JsonApiQuery, JsonApiDataSourceOpt
151151
* @returns the detected field type and potentially converted values.
152152
*/
153153
export const detectFieldType = (values: any[]): [FieldType, any[]] => {
154+
if (values.every(_ => _ === null)) {
155+
return [FieldType.string, values];
156+
}
154157
// If all values are valid ISO 8601, the assume that it's a time field.
155-
const isValidISO = values.filter(value => value).every(value => value.length >= 10 && isValid(parseISO(value)));
158+
const isValidISO = values
159+
.filter(value => value !== null)
160+
.every(value => value.length >= 10 && isValid(parseISO(value)));
156161
if (isValidISO) {
157-
return [FieldType.time, values.map(_ => parseISO(_).valueOf())];
162+
return [FieldType.time, values.map(_ => (_ !== null ? parseISO(_).valueOf() : null))];
158163
}
159164

160165
const isNumber = values.every(value => typeof value === 'number');

src/detectFieldType.test.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,24 @@ test('iso8601 gets parsed as time', () => {
2323
[1136214373000, 1136214433000],
2424
]);
2525
});
26+
27+
test('nullable iso8601 gets parsed as time', () => {
28+
expect(detectFieldType(['2006-01-02T15:06:13Z', null])).toEqual(['time', [1136214373000, null]]);
29+
});
30+
31+
test('all zeros gets parsed as number', () => {
32+
expect(detectFieldType([0, 0, 0])).toEqual(['number', [0, 0, 0]]);
33+
expect(detectFieldType([0, 0, 1])).toEqual(['number', [0, 0, 1]]);
34+
35+
expect(detectFieldType([false, false, false])).toEqual(['boolean', [false, false, false]]);
36+
expect(detectFieldType([false, false, true])).toEqual(['boolean', [false, false, true]]);
37+
});
38+
39+
test('all false gets parsed as boolean', () => {
40+
expect(detectFieldType([false, false, false])).toEqual(['boolean', [false, false, false]]);
41+
expect(detectFieldType([false, false, true])).toEqual(['boolean', [false, false, true]]);
42+
});
43+
44+
test('all null gets parsed as string', () => {
45+
expect(detectFieldType([null, null])).toEqual(['string', [null, null]]);
46+
});

0 commit comments

Comments
 (0)