@@ -2,6 +2,7 @@ import { entries } from '@seedcompany/common';
2
2
import { Clause , Query } from 'cypher-query-builder' ;
3
3
import { Parameter } from 'cypher-query-builder/dist/typings/parameter-bag' ;
4
4
import { isExp , variable } from '../query' ;
5
+ import type { YieldTerms } from './yield' ;
5
6
6
7
declare module 'cypher-query-builder/dist/typings/query' {
7
8
interface Query {
@@ -22,16 +23,19 @@ Query.prototype.call = function call(
22
23
procedure : ProcedureCall | string ,
23
24
args ?: ProcedureArgs ,
24
25
) {
25
- const clause =
26
+ const call =
26
27
typeof procedure === 'string'
27
- ? new Procedure ( procedure , args ?? [ ] )
28
- : new Procedure ( procedure . name , procedure . args ) ;
29
- return this . continueChainClause ( clause ) ;
28
+ ? { procedureName : procedure , args : args ?? [ ] }
29
+ : procedure ;
30
+ const clause = new Procedure ( call . procedureName , call . args ) ;
31
+ const next = this . continueChainClause ( clause ) ;
32
+ return call . yieldTerms ? next . yield ( call . yieldTerms ) : next ;
30
33
} ;
31
34
32
- interface ProcedureCall {
33
- name : string ;
35
+ interface ProcedureCall < Y extends string = string > {
36
+ procedureName : string ;
34
37
args : ProcedureArgs ;
38
+ yieldTerms ?: YieldTerms < Y > ;
35
39
}
36
40
type ProcedureArgs = Record < string , any > | any [ ] ;
37
41
@@ -51,3 +55,23 @@ class Procedure extends Clause {
51
55
return `CALL ${ this . name } (${ this . params . join ( ', ' ) } )` ;
52
56
}
53
57
}
58
+
59
+ export const procedure =
60
+ < const Y extends string > (
61
+ procedureName : string ,
62
+ // eslint-disable-next-line @seedcompany/no-unused-vars
63
+ yieldDefs : readonly Y [ ] ,
64
+ ) =>
65
+ ( args : ProcedureArgs ) => ( {
66
+ procedureName,
67
+ args,
68
+ yield : ( yieldTerms : YieldTerms < Y > ) =>
69
+ Object . assign (
70
+ ( query : Query ) => query . call ( procedureName , args ) . yield ( yieldTerms ) ,
71
+ {
72
+ procedureName,
73
+ args,
74
+ yieldTerms,
75
+ } ,
76
+ ) ,
77
+ } ) ;
0 commit comments