@@ -64,12 +64,12 @@ export class Builder extends NotTagged {
64
64
this . rest = rest
65
65
}
66
66
67
- build ( before , parameters , types , transform ) {
67
+ build ( before , parameters , types , options ) {
68
68
const keyword = builders . map ( ( [ x , fn ] ) => ( { fn, i : before . search ( x ) } ) ) . sort ( ( a , b ) => a . i - b . i ) . pop ( )
69
69
if ( keyword . i === - 1 )
70
70
throw new Error ( 'Could not infer helper mode' )
71
71
72
- return keyword . fn ( this . first , this . rest , parameters , types , transform )
72
+ return keyword . fn ( this . first , this . rest , parameters , types , options )
73
73
}
74
74
}
75
75
@@ -90,40 +90,59 @@ export function handleValue(x, parameters, types) {
90
90
91
91
const defaultHandlers = typeHandlers ( types )
92
92
93
- function valuesBuilder ( first , parameters , types , transform , columns ) {
93
+ export function stringify ( q , string , value , parameters , types , options ) { // eslint-disable-line
94
+ for ( let i = 1 ; i < q . strings . length ; i ++ ) {
95
+ string += (
96
+ value instanceof Query ? fragment ( value , parameters , types ) :
97
+ value instanceof Identifier ? value . value :
98
+ value instanceof Builder ? value . build ( string , parameters , types , options ) :
99
+ handleValue ( value , parameters , types , options )
100
+ ) + q . strings [ i ]
101
+ value = q . args [ i ]
102
+ }
103
+
104
+ return string
105
+ }
106
+
107
+ function fragment ( q , parameters , types ) {
108
+ q . fragment = true
109
+ return stringify ( q , q . strings [ 0 ] , q . args [ 0 ] , parameters , types )
110
+ }
111
+
112
+ function valuesBuilder ( first , parameters , types , columns , options ) {
94
113
let value
95
114
return first . map ( row =>
96
115
'(' + columns . map ( column => {
97
116
value = row [ column ]
98
117
return (
99
- value instanceof Query ? value . strings [ 0 ] :
118
+ value instanceof Query ? fragment ( value , parameters , types ) :
100
119
value instanceof Identifier ? value . value :
101
- handleValue ( value , parameters , types )
120
+ handleValue ( value , parameters , types , options )
102
121
)
103
122
} ) . join ( ',' ) + ')'
104
123
) . join ( ',' )
105
124
}
106
125
107
- function values ( first , rest , parameters , types , transform ) {
126
+ function values ( first , rest , parameters , types , options ) {
108
127
const multi = Array . isArray ( first [ 0 ] )
109
128
const columns = rest . length ? rest . flat ( ) : Object . keys ( multi ? first [ 0 ] : first )
110
- return valuesBuilder ( multi ? first : [ first ] , parameters , types , transform , columns )
129
+ return valuesBuilder ( multi ? first : [ first ] , parameters , types , columns , options )
111
130
}
112
131
113
- function select ( first , rest , parameters , types , transform ) {
132
+ function select ( first , rest , parameters , types , options ) {
114
133
typeof first === 'string' && ( first = [ first ] . concat ( rest ) )
115
134
if ( Array . isArray ( first ) )
116
- return first . map ( x => escapeIdentifier ( transform . column . to ? transform . column . to ( x ) : x ) ) . join ( ',' )
135
+ return first . map ( x => escapeIdentifier ( options . transform . column . to ? options . transform . column . to ( x ) : x ) ) . join ( ',' )
117
136
118
137
let value
119
138
const columns = rest . length ? rest . flat ( ) : Object . keys ( first )
120
139
return columns . map ( x => {
121
140
value = first [ x ]
122
141
return (
123
- value instanceof Query ? value . strings [ 0 ] :
142
+ value instanceof Query ? fragment ( value , parameters , types ) :
124
143
value instanceof Identifier ? value . value :
125
- handleValue ( value , parameters , types )
126
- ) + ' as ' + escapeIdentifier ( transform . column . to ? transform . column . to ( x ) : x )
144
+ handleValue ( value , parameters , types , options )
145
+ ) + ' as ' + escapeIdentifier ( options . transform . column . to ? options . transform . column . to ( x ) : x )
127
146
} ) . join ( ',' )
128
147
}
129
148
@@ -133,19 +152,19 @@ const builders = Object.entries({
133
152
select,
134
153
returning : select ,
135
154
136
- update ( first , rest , parameters , types , transform ) {
155
+ update ( first , rest , parameters , types , options ) {
137
156
return ( rest . length ? rest . flat ( ) : Object . keys ( first ) ) . map ( x =>
138
- escapeIdentifier ( transform . column . to ? transform . column . to ( x ) : x ) +
139
- '=' + handleValue ( first [ x ] , parameters , types )
157
+ escapeIdentifier ( options . transform . column . to ? options . transform . column . to ( x ) : x ) +
158
+ '=' + handleValue ( first [ x ] , parameters , types , options )
140
159
)
141
160
} ,
142
161
143
- insert ( first , rest , parameters , types , transform ) {
162
+ insert ( first , rest , parameters , types , options ) {
144
163
const columns = rest . length ? rest . flat ( ) : Object . keys ( Array . isArray ( first ) ? first [ 0 ] : first )
145
164
return '(' + columns . map ( x =>
146
- escapeIdentifier ( transform . column . to ? transform . column . to ( x ) : x )
165
+ escapeIdentifier ( options . transform . column . to ? options . transform . column . to ( x ) : x )
147
166
) . join ( ',' ) + ')values' +
148
- valuesBuilder ( Array . isArray ( first ) ? first : [ first ] , parameters , types , transform , columns )
167
+ valuesBuilder ( Array . isArray ( first ) ? first : [ first ] , parameters , types , columns , options )
149
168
}
150
169
} ) . map ( ( [ x , fn ] ) => ( [ new RegExp ( '(^|[\\s(])' + x + '($|[\\s(])' , 'i' ) , fn ] ) )
151
170
0 commit comments