@@ -27,6 +27,8 @@ import {
2727} from "./gen/plugin/codegen_pb" ;
2828
2929import { argName , colName } from "./drivers/utlis" ;
30+ import { rowValuesDecl } from "./decls" ;
31+ import { assertUniqueNames } from "./validate" ;
3032import { Driver as Sqlite3Driver } from "./drivers/better-sqlite3" ;
3133import { Driver as PgDriver } from "./drivers/pg" ;
3234import { Driver as PostgresDriver } from "./drivers/postgres" ;
@@ -127,23 +129,11 @@ function codegen(input: GenerateRequest): GenerateResponse {
127129 qs ?. push ( query ) ;
128130 }
129131
130- for ( const [ filename , queries ] of querymap . entries ( ) ) {
131- const nodes = driver . preamble ( queries ) ;
132+ for ( const [ filename , queries ] of querymap . entries ( ) ) {
133+ const nodes = driver . preamble ( queries ) ;
132134
133- for ( const query of queries ) {
134- const colmap = new Map < string , number > ( ) ;
135- for ( let column of query . columns ) {
136- if ( ! column . name ) {
137- continue ;
138- }
139- const count = colmap . get ( column . name ) || 0 ;
140- if ( count > 0 ) {
141- column . name = `${ column . name } _${ count + 1 } ` ;
142- }
143- colmap . set ( column . name , count + 1 ) ;
144- }
145-
146- const lowerName = query . name [ 0 ] . toLowerCase ( ) + query . name . slice ( 1 ) ;
135+ for ( const query of queries ) {
136+ const lowerName = query . name [ 0 ] . toLowerCase ( ) + query . name . slice ( 1 ) ;
147137 const textName = `${ lowerName } Query` ;
148138
149139 nodes . push (
@@ -158,11 +148,28 @@ ${query.text}`
158148 let returnIface = undefined ;
159149 if ( query . params . length > 0 ) {
160150 argIface = `${ query . name } Args` ;
161- nodes . push ( argsDecl ( argIface , driver , query . params ) ) ;
151+ nodes . push (
152+ argsDecl ( {
153+ name : argIface ,
154+ driver,
155+ params : query . params ,
156+ queryName : query . name ,
157+ fileName : filename ,
158+ } )
159+ ) ;
162160 }
163161 if ( query . columns . length > 0 ) {
164162 returnIface = `${ query . name } Row` ;
165- nodes . push ( rowDecl ( returnIface , driver , query . columns ) ) ;
163+ nodes . push (
164+ rowDecl ( {
165+ name : returnIface ,
166+ driver,
167+ columns : query . columns ,
168+ queryName : query . name ,
169+ fileName : filename ,
170+ } )
171+ ) ;
172+ nodes . push ( rowValuesDecl ( `${ returnIface } Values` , driver , query . columns ) ) ;
166173 }
167174
168175 switch ( query . cmd ) {
@@ -244,43 +251,63 @@ function queryDecl(name: string, sql: string) {
244251 ) ;
245252}
246253
247- function argsDecl (
248- name : string ,
249- driver : Driver ,
250- params : Parameter [ ]
251- ) {
254+ function argsDecl ( options : {
255+ name : string ;
256+ driver : Driver ;
257+ params : Parameter [ ] ;
258+ queryName : string ;
259+ fileName : string ;
260+ } ) {
261+ const names = options . params . map ( ( param , i ) => argName ( i , param . column ) ) ;
262+ assertUniqueNames ( {
263+ kind : "argument" ,
264+ queryName : options . queryName ,
265+ fileName : options . fileName ,
266+ names,
267+ } ) ;
268+
252269 return factory . createInterfaceDeclaration (
253270 [ factory . createToken ( SyntaxKind . ExportKeyword ) ] ,
254- factory . createIdentifier ( name ) ,
271+ factory . createIdentifier ( options . name ) ,
255272 undefined ,
256273 undefined ,
257- params . map ( ( param , i ) =>
274+ options . params . map ( ( param , i ) =>
258275 factory . createPropertySignature (
259276 undefined ,
260277 factory . createIdentifier ( argName ( i , param . column ) ) ,
261278 undefined ,
262- driver . columnType ( param . column )
279+ options . driver . columnType ( param . column )
263280 )
264281 )
265282 ) ;
266283}
267284
268- function rowDecl (
269- name : string ,
270- driver : Driver ,
271- columns : Column [ ]
272- ) {
285+ function rowDecl ( options : {
286+ name : string ;
287+ driver : Driver ;
288+ columns : Column [ ] ;
289+ queryName : string ;
290+ fileName : string ;
291+ } ) {
292+ const names = options . columns . map ( ( column , i ) => colName ( i , column ) ) ;
293+ assertUniqueNames ( {
294+ kind : "column" ,
295+ queryName : options . queryName ,
296+ fileName : options . fileName ,
297+ names,
298+ } ) ;
299+
273300 return factory . createInterfaceDeclaration (
274301 [ factory . createToken ( SyntaxKind . ExportKeyword ) ] ,
275- factory . createIdentifier ( name ) ,
302+ factory . createIdentifier ( options . name ) ,
276303 undefined ,
277304 undefined ,
278- columns . map ( ( column , i ) =>
305+ options . columns . map ( ( column , i ) =>
279306 factory . createPropertySignature (
280307 undefined ,
281308 factory . createIdentifier ( colName ( i , column ) ) ,
282309 undefined ,
283- driver . columnType ( column )
310+ options . driver . columnType ( column )
284311 )
285312 )
286313 ) ;
0 commit comments