Skip to content

Commit 8e216e0

Browse files
committed
Preserve JSON expression casts in generated schemas
1 parent 3939fca commit 8e216e0

3 files changed

Lines changed: 20 additions & 1 deletion

File tree

‎drizzle-kit/src/introspect-pg.ts‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -775,6 +775,10 @@ const mapDefault = (
775775
}
776776

777777
if (lowered.startsWith('jsonb')) {
778+
if (isExpression) {
779+
return `.default(${mapColumnDefault(defaultValue, true)})`;
780+
}
781+
778782
const def = typeof defaultValue !== 'undefined'
779783
? defaultValue.replace(/::(.*?)(?<![^\w"])(?=$)/, '').slice(1, -1)
780784
: null;
@@ -783,6 +787,10 @@ const mapDefault = (
783787
}
784788

785789
if (lowered.startsWith('json')) {
790+
if (isExpression) {
791+
return `.default(${mapColumnDefault(defaultValue, true)})`;
792+
}
793+
786794
const def = defaultValue ? defaultValue.replace(/::(.*?)(?<![^\w"])(?=$)/, '').slice(1, -1) : null;
787795

788796
return typeof defaultValue !== 'undefined' ? `.default(${def})` : '';

‎drizzle-kit/src/serializer/pgSerializer.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2038,6 +2038,7 @@ export const defaultForColumn = (column: any, internals: PgKitInternals, tableNa
20382038
) {
20392039
return undefined;
20402040
}
2041+
const originalColumnDefault = column.column_default.toString();
20412042

20422043
if (column.column_default.endsWith('[]')) {
20432044
column.column_default = column.column_default.slice(0, -2);
@@ -2099,7 +2100,7 @@ export const defaultForColumn = (column: any, internals: PgKitInternals, tableNa
20992100
internals!.tables![tableName]!.columns[columnName]!.isDefaultAnExpression = true;
21002101
}
21012102

2102-
return columnDefaultAsString;
2103+
return originalColumnDefault;
21032104
}
21042105

21052106
const jsonWithoutSpaces = JSON.stringify(JSON.parse(columnDefaultAsString.slice(1, -1)));

‎drizzle-kit/tests/pg-json-defaults.test.ts‎

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import { expect, test } from 'vitest';
22
import { introspectPgDB } from '../src/api';
33
import type { DrizzlePgDB } from '../src/api';
4+
import { schemaToTypeScript } from '../src/introspect-pg';
5+
import { fromDatabase } from '../src/serializer/pgSerializer';
46

57
const columnRow = {
68
table_name: 'items',
@@ -49,3 +51,11 @@ test('normalizes a quoted jsonb literal default', async () => {
4951

5052
expect(schema.tables['public.items']!.columns.payload!.default).toBe(`'{"kind":"record"}'::jsonb`);
5153
});
54+
55+
test('preserves casts and generates SQL for jsonb expression defaults', async () => {
56+
const expression = "current_setting('app.payload')::jsonb";
57+
const schema = await fromDatabase(databaseWithDefault(expression), () => true, ['public']);
58+
59+
expect(schema.tables['public.items']!.columns.payload!.default).toBe(expression);
60+
expect(schemaToTypeScript(schema, 'preserve').file).toContain(`.default(sql\`${expression}\`)`);
61+
});

0 commit comments

Comments
 (0)