diff --git a/src/server/templates/typescript.ts b/src/server/templates/typescript.ts index 3b29b823..96a30fe4 100644 --- a/src/server/templates/typescript.ts +++ b/src/server/templates/typescript.ts @@ -101,14 +101,14 @@ export interface Database { ), ...schemaFunctions .filter((fn) => fn.argument_types === table.name) - .map( - (fn) => - `${JSON.stringify(fn.name)}: ${pgTypeToTsType( - fn.return_type, - types, - schemas - )} | null` - ), + .map((fn) => { + const type = types.find(({ id }) => id === fn.return_type_id) + let tsType = 'unknown' + if (type) { + tsType = pgTypeToTsType(type.name, types, schemas) + } + return `${JSON.stringify(fn.name)}: ${tsType} | null` + }), ]} } Insert: { @@ -428,7 +428,7 @@ const pgTypeToTsType = ( ): string => { if (pgType === 'bool') { return 'boolean' - } else if (['int2', 'int4', 'int8', 'float4', 'float8', 'numeric', 'integer'].includes(pgType)) { + } else if (['int2', 'int4', 'int8', 'float4', 'float8', 'numeric'].includes(pgType)) { return 'number' } else if ( [ diff --git a/test/db/00-init.sql b/test/db/00-init.sql index 8497da49..876f46d3 100644 --- a/test/db/00-init.sql +++ b/test/db/00-init.sql @@ -61,6 +61,21 @@ $$ select substring($1.details, 1, 3); $$ language sql stable; +create function public.blurb_varchar(public.todos) returns character varying as +$$ +select substring($1.details, 1, 3); +$$ language sql stable; + +create function public.details_length(public.todos) returns integer as +$$ +select length($1.details); +$$ language sql stable; + +create function public.details_is_long(public.todos) returns boolean as +$$ +select $1.details_length > 20; +$$ language sql stable; + create extension postgres_fdw; create server foreign_server foreign data wrapper postgres_fdw options (host 'localhost', port '5432', dbname 'postgres'); create user mapping for postgres server foreign_server options (user 'postgres', password 'postgres'); diff --git a/test/server/typegen.ts b/test/server/typegen.ts index 7f1d6841..793f7450 100644 --- a/test/server/typegen.ts +++ b/test/server/typegen.ts @@ -69,6 +69,9 @@ test('typegen', async () => { id: number "user-id": number blurb: string | null + blurb_varchar: string | null + details_is_long: boolean | null + details_length: number | null } Insert: { details?: string | null @@ -278,6 +281,24 @@ test('typegen', async () => { } Returns: string } + blurb_varchar: { + Args: { + "": unknown + } + Returns: string + } + details_is_long: { + Args: { + "": unknown + } + Returns: boolean + } + details_length: { + Args: { + "": unknown + } + Returns: number + } function_returning_row: { Args: Record Returns: { @@ -420,6 +441,9 @@ test('typegen w/ one-to-one relationships', async () => { id: number "user-id": number blurb: string | null + blurb_varchar: string | null + details_is_long: boolean | null + details_length: number | null } Insert: { details?: string | null @@ -641,6 +665,24 @@ test('typegen w/ one-to-one relationships', async () => { } Returns: string } + blurb_varchar: { + Args: { + "": unknown + } + Returns: string + } + details_is_long: { + Args: { + "": unknown + } + Returns: boolean + } + details_length: { + Args: { + "": unknown + } + Returns: number + } function_returning_row: { Args: Record Returns: {