1- import { TailordbDialect } from "@tailor-platform/function-kysely-tailordb" ;
2- import { Kysely } from "kysely" ;
1+ import type { TableMetadata } from "kysely" ;
32import {
4- type PostgresDB ,
3+ EnumCollection ,
54 PostgresDialect ,
65 TypeScriptSerializer ,
76} from "kysely-codegen" ;
@@ -10,11 +9,69 @@ export default async (args: { namespace: string }) => {
109 const client = new tailordb . Client ( {
1110 namespace : args . namespace ,
1211 } ) ;
13- const db = new Kysely < PostgresDB > ( {
14- dialect : new TailordbDialect ( client ) ,
12+ const columns = (
13+ await client . queryObject < RawColumnMetadata > (
14+ // To avoid unstable dependencies on SQL generated by Kysely, issue a SELECT statement to the special metadata table `kysely_column_metadata`.
15+ // Tailor Platform must return results corresponding to `RawColumnMetadata` for this SQL.
16+ "SELECT * FROM kysely_column_metadata;" ,
17+ )
18+ ) . rows ;
19+ const tables = parseTableMetadata ( columns ) ;
20+ const dialect = new PostgresDialect ( ) ;
21+ const metadata = dialect . introspector . createDatabaseMetadata ( {
22+ tables,
23+ domains : [ ] ,
24+ partitions : [ ] ,
25+ enums : new EnumCollection ( ) ,
1526 } ) ;
16- const dialect = new PostgresDialect ( { domains : false } ) ;
17- const metadata = await dialect . introspector . introspect ( { db } ) ;
1827 const data = new TypeScriptSerializer ( ) . serializeFile ( metadata , dialect ) ;
1928 return { data } ;
2029} ;
30+
31+ // Since Kysely's parseTableMetadata is not exported, it is copied below.
32+ // https://github.com/kysely-org/kysely/blob/0.28.2/src/dialect/postgres/postgres-introspector.ts#L103
33+ const parseTableMetadata = ( columns : RawColumnMetadata [ ] ) : TableMetadata [ ] => {
34+ return columns . reduce < TableMetadata [ ] > ( ( tables , it ) => {
35+ let table = tables . find (
36+ ( tbl ) => tbl . name === it . table && tbl . schema === it . schema ,
37+ ) ;
38+
39+ if ( ! table ) {
40+ table = Object . freeze ( {
41+ name : it . table ,
42+ isView : it . table_type === "v" ,
43+ schema : it . schema ,
44+ columns : [ ] ,
45+ } ) ;
46+
47+ tables . push ( table ) ;
48+ }
49+
50+ table . columns . push (
51+ Object . freeze ( {
52+ name : it . column ,
53+ dataType : it . type ,
54+ dataTypeSchema : it . type_schema ,
55+ isNullable : ! it . not_null ,
56+ isAutoIncrementing : ! ! it . auto_incrementing ,
57+ hasDefaultValue : it . has_default ,
58+ comment : it . column_description ?? undefined ,
59+ } ) ,
60+ ) ;
61+
62+ return tables ;
63+ } , [ ] ) ;
64+ } ;
65+
66+ interface RawColumnMetadata {
67+ column : string ;
68+ table : string ;
69+ table_type : string ;
70+ schema : string ;
71+ not_null : boolean ;
72+ has_default : boolean ;
73+ type : string ;
74+ type_schema : string ;
75+ auto_incrementing : boolean | null ;
76+ column_description : string | null ;
77+ }
0 commit comments