Skip to content

Commit c77e82a

Browse files
committed
feat(typegen): views
1 parent b256480 commit c77e82a

File tree

3 files changed

+75
-1
lines changed

3 files changed

+75
-1
lines changed

src/server/app.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ if (EXPORT_DOCS) {
6565
})
6666
const { data: schemas, error: schemasError } = await pgMeta.schemas.list()
6767
const { data: tables, error: tablesError } = await pgMeta.tables.list()
68+
const { data: views, error: viewsError } = await pgMeta.views.list()
6869
const { data: functions, error: functionsError } = await pgMeta.functions.list()
6970
const { data: types, error: typesError } = await pgMeta.types.list({
7071
includeSystemSchemas: true,
@@ -77,6 +78,9 @@ if (EXPORT_DOCS) {
7778
if (tablesError) {
7879
throw new Error(tablesError.message)
7980
}
81+
if (viewsError) {
82+
throw new Error(viewsError.message)
83+
}
8084
if (functionsError) {
8185
throw new Error(functionsError.message)
8286
}
@@ -92,6 +96,7 @@ if (EXPORT_DOCS) {
9296
GENERATE_TYPES_INCLUDED_SCHEMAS.includes(name)
9397
),
9498
tables,
99+
views,
95100
functions: functions.filter(
96101
({ return_type }) => !['trigger', 'event_trigger'].includes(return_type)
97102
),

src/server/routes/generators/typescript.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export default async (fastify: FastifyInstance) => {
2121
const pgMeta: PostgresMeta = new PostgresMeta({ ...DEFAULT_POOL_CONFIG, connectionString })
2222
const { data: schemas, error: schemasError } = await pgMeta.schemas.list()
2323
const { data: tables, error: tablesError } = await pgMeta.tables.list()
24+
const { data: views, error: viewsError } = await pgMeta.views.list()
2425
const { data: functions, error: functionsError } = await pgMeta.functions.list()
2526
const { data: types, error: typesError } = await pgMeta.types.list({
2627
includeSystemSchemas: true,
@@ -37,6 +38,11 @@ export default async (fastify: FastifyInstance) => {
3738
reply.code(500)
3839
return { error: tablesError.message }
3940
}
41+
if (viewsError) {
42+
request.log.error({ error: viewsError, request: extractRequestForLogging(request) })
43+
reply.code(500)
44+
return { error: viewsError.message }
45+
}
4046
if (functionsError) {
4147
request.log.error({ error: functionsError, request: extractRequestForLogging(request) })
4248
reply.code(500)
@@ -55,6 +61,7 @@ export default async (fastify: FastifyInstance) => {
5561
(includedSchemas.length === 0 || includedSchemas.includes(name))
5662
),
5763
tables,
64+
views,
5865
functions: functions.filter(
5966
({ return_type }) => !['trigger', 'event_trigger'].includes(return_type)
6067
),

src/server/templates/typescript.ts

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,22 @@
11
import prettier from 'prettier'
2-
import type { PostgresFunction, PostgresSchema, PostgresTable, PostgresType } from '../../lib'
2+
import type {
3+
PostgresFunction,
4+
PostgresSchema,
5+
PostgresTable,
6+
PostgresType,
7+
PostgresView,
8+
} from '../../lib'
39

410
export const apply = ({
511
schemas,
612
tables,
13+
views,
714
functions,
815
types,
916
}: {
1017
schemas: PostgresSchema[]
1118
tables: PostgresTable[]
19+
views: PostgresView[]
1220
functions: PostgresFunction[]
1321
types: PostgresType[]
1422
}): string => {
@@ -18,6 +26,7 @@ export type Json = string | number | boolean | null | { [key: string]: Json } |
1826
export interface Database {
1927
${schemas.map((schema) => {
2028
const schemaTables = tables.filter((table) => table.schema === schema.name)
29+
const schemaViews = views.filter((view) => view.schema === schema.name)
2130
const schemaFunctions = functions.filter((func) => func.schema === schema.name)
2231
return `${JSON.stringify(schema.name)}: {
2332
Tables: {
@@ -82,6 +91,59 @@ export interface Database {
8291
)
8392
}
8493
}
94+
Views: {
95+
${
96+
schemaViews.length === 0
97+
? '[_ in never]: never'
98+
: schemaViews.map(
99+
(view) => `${JSON.stringify(view.name)}: {
100+
Row: {
101+
${view.columns.map(
102+
(column) =>
103+
`${JSON.stringify(column.name)}: ${pgTypeToTsType(
104+
column.format,
105+
types
106+
)} | null`
107+
)}
108+
}
109+
${
110+
view.is_updatable
111+
? `Insert: {
112+
${view.columns.map((column) => {
113+
let output = JSON.stringify(column.name)
114+
115+
if (!column.is_updatable) {
116+
return `${output}?: never`
117+
}
118+
119+
output += `?: ${pgTypeToTsType(column.format, types)} | null`
120+
121+
return output
122+
})}
123+
}`
124+
: ''
125+
}
126+
${
127+
view.is_updatable
128+
? `Update: {
129+
${view.columns.map((column) => {
130+
let output = JSON.stringify(column.name)
131+
132+
if (!column.is_updatable) {
133+
return `${output}?: never`
134+
}
135+
136+
output += `?: ${pgTypeToTsType(column.format, types)} | null`
137+
138+
return output
139+
})}
140+
}`
141+
: ''
142+
}
143+
}`
144+
)
145+
}
146+
}
85147
Functions: {
86148
${
87149
schemaFunctions.length === 0

0 commit comments

Comments
 (0)