Skip to content

Commit 1779b74

Browse files
committed
handle numerical addition/subtraction from datetime
1 parent 1c67668 commit 1779b74

File tree

2 files changed

+21
-0
lines changed

2 files changed

+21
-0
lines changed

src/typeEvaluator/typeEvaluate.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -616,6 +616,11 @@ function handleOpCallNode(node: OpCallNode, scope: Scope): TypeNode {
616616
: undefined,
617617
}
618618
}
619+
// datetime + number -> datetime (datetimes are represented as strings)
620+
// Returns null for non-datetime strings at runtime, so we include null in the union
621+
if (left.type === 'string' && right.type === 'number') {
622+
return nullUnion({type: 'string'})
623+
}
619624

620625
if (left.type === 'number' && right.type === 'number') {
621626
return {
@@ -647,6 +652,11 @@ function handleOpCallNode(node: OpCallNode, scope: Scope): TypeNode {
647652
if (left.type === 'unknown' || right.type === 'unknown') {
648653
return nullUnion({type: 'number'})
649654
}
655+
// datetime - number -> datetime (datetimes are represented as strings)
656+
// Returns null for non-datetime strings at runtime, so we include null in the union
657+
if (left.type === 'string' && right.type === 'number') {
658+
return nullUnion({type: 'string'})
659+
}
650660
if (left.type === 'number' && right.type === 'number') {
651661
return {
652662
type: 'number',

test/typeEvaluate.test.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3735,6 +3735,17 @@ t.test('splatting array', (t) => {
37353735
t.end()
37363736
})
37373737

3738+
t.test('dateTime with numerical operation', (t) => {
3739+
const query = `(global::dateTime("2025-03-01T00:00:00Z") + 60) > global::dateTime("2024-03-01T00:00:00Z")`
3740+
const ast = parse(query)
3741+
const res = typeEvaluate(ast, schemas)
3742+
t.same(res, {
3743+
type: 'union',
3744+
of: [{type: 'boolean', value: undefined}, {type: 'null'}],
3745+
})
3746+
t.end()
3747+
})
3748+
37383749
function findSchemaType(name: string): TypeNode {
37393750
const type = schemas.find((s) => s.name === name)
37403751
if (!type) {

0 commit comments

Comments
 (0)