diff --git a/src/lib/file-generators/generated/[schema_name]/[TableName].ts b/src/lib/file-generators/generated/[schema_name]/[TableName].ts index 76e41ed..45029c8 100644 --- a/src/lib/file-generators/generated/[schema_name]/[TableName].ts +++ b/src/lib/file-generators/generated/[schema_name]/[TableName].ts @@ -91,6 +91,17 @@ export const createResultingTypeFile = ( }, ], }) + statements.push({ + kind: StructureKind.TypeAlias, + isExported: true, + name: `${pascal_table_name}InitializerWithPgtuiBugs`, + type: `ReproducePgtuiBugs<${pascal_table_name}Initializer>`, + docs: [ + { + description: `@deprecated Reproduces type bugs from the legacy \`pgtui\` library and should not be used in new code.\n\nSpecifically:\n- Columns ending in \`_id\` are incorrectly typed as \`string\`, regardless of their actual database type.\n- \`jsonb\` columns are typed as \`any\` instead of a more specific type.`, + }, + ], + }) } return project.createSourceFile( diff --git a/src/lib/file-generators/generated/[schema_name]/index.ts b/src/lib/file-generators/generated/[schema_name]/index.ts index 6cea161..dfad982 100644 --- a/src/lib/file-generators/generated/[schema_name]/index.ts +++ b/src/lib/file-generators/generated/[schema_name]/index.ts @@ -32,7 +32,7 @@ export const createSchemaGeneratedTypeIndexFile = ( { kind: StructureKind.ImportDeclaration, moduleSpecifier: '../utils', - namedImports: ['KyselyTable'], + namedImports: ['KyselyTable', 'KnexTable'], isTypeOnly: true, }, ] @@ -47,7 +47,10 @@ export const createSchemaGeneratedTypeIndexFile = ( namedImports: [ pascal_table_name, ...(table.is_affected_by_pgtui_bugs - ? [`${pascal_table_name}WithPgtuiBugs`] + ? [ + `${pascal_table_name}WithPgtuiBugs`, + `${pascal_table_name}InitializerWithPgtuiBugs`, + ] : []), `${pascal_table_name}Initializer`, ], @@ -83,9 +86,15 @@ export const createSchemaGeneratedTypeIndexFile = ( schema.name === main_schema ? table.name : `"${schema.name}.${table.name}"`, - type: table.is_affected_by_pgtui_bugs - ? `${pascal_table_names[table.name]}WithPgtuiBugs` - : (pascal_table_names[table.name] ?? ''), + type: `KnexTable<${ + table.is_affected_by_pgtui_bugs + ? `${pascal_table_names[table.name]}WithPgtuiBugs` + : pascal_table_names[table.name] + }, ${ + table.is_affected_by_pgtui_bugs + ? `${pascal_table_names[table.name]}InitializerWithPgtuiBugs` + : `${pascal_table_names[table.name]}Initializer` + }>`, })), }) } diff --git a/src/lib/file-generators/generated/utils.ts b/src/lib/file-generators/generated/utils.ts index 973511b..da0ece9 100644 --- a/src/lib/file-generators/generated/utils.ts +++ b/src/lib/file-generators/generated/utils.ts @@ -13,6 +13,7 @@ export const createGeneratedUtilsFile = ( const file_source = `import type { JSONValue } from "zapatos/db" import { type ColumnType } from "kysely" +import { Knex } from "knex" type PartialWithNever = { [P in keyof T as T[P] extends never ? never : P]?: T[P] @@ -30,6 +31,16 @@ export type KyselyTable = { > } +type KnexInsertableTable = { + [K in keyof T]: Knex.MaybeRawColumn +} + +export type KnexTable = Knex.CompositeTableType< + Selectable, + Partial>, // TODO remove \`Partial\` once we fix the code + Partial> +> + type KeysOfUnion = T extends T ? keyof T : never type NullableKeys = { @@ -56,8 +67,17 @@ export type CreateCustomTypes< > = Sub // Replaces the values of From with the values of To and ignores the rest of the properties of To -type ReplaceValueTypes = Omit & - Pick> +type ReplaceValueTypes = { + [K in keyof From]: K extends keyof To ? To[K] : From[K] +} + +type AllowJsonStringify = { + [K in keyof OriginalInsertable]: K extends keyof CustomizedInsertable + ? [JSONValue] extends [OriginalInsertable[K]] + ? CustomizedInsertable[K] | string + : CustomizedInsertable[K] + : never +} // Works to make From properties optional but it would not work to make them mandatory as From[K] would include undefined // TODO improve to keep unions (if possible) @@ -75,9 +95,12 @@ export type CustomizeDbType = ReplaceValueTypes< > export type CustomizeDbTypeInitializer = - ReplaceValueTypes< + AllowJsonStringify< DbTypeInitializer, - ReplaceKeyTypes + ReplaceValueTypes< + DbTypeInitializer, + ReplaceKeyTypes + > > // TODO Migrating from pgtui to our custom types is a pain because of two bugs in pgtui.