Skip to content

Commit f964a62

Browse files
committed
feat: add uuidv7 support for pgsql
1 parent 77cdb17 commit f964a62

27 files changed

Lines changed: 489 additions & 297 deletions

packages/db-d1-sqlite/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ const filename = fileURLToPath(import.meta.url)
6464

6565
export function sqliteD1Adapter(args: Args): DatabaseAdapterObj<SQLiteD1Adapter> {
6666
const sqliteIDType = args.idType || 'number'
67-
const payloadIDType = sqliteIDType === 'uuid' ? 'text' : 'number'
67+
const payloadIDType = sqliteIDType === 'uuid' || sqliteIDType === 'uuidv7' ? 'text' : 'number'
6868
const allowIDOnCreate = args.allowIDOnCreate ?? false
6969

7070
function adapter({ payload }: { payload: Payload }) {

packages/db-postgres/src/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ export type Args = {
5353
extensions?: string[]
5454
/** Generated schema from payload generate:db-schema file path */
5555
generateSchemaOutputFile?: string
56-
idType?: 'serial' | 'uuid'
56+
idType?: 'serial' | 'uuid' | 'uuidv7'
5757
localesSuffix?: string
5858
logger?: DrizzleConfig['logger']
5959
migrationDir?: string

packages/db-sqlite/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ const filename = fileURLToPath(import.meta.url)
6666

6767
export function sqliteAdapter(args: Args): DatabaseAdapterObj<SQLiteAdapter> {
6868
const sqliteIDType = args.idType || 'number'
69-
const payloadIDType = sqliteIDType === 'uuid' ? 'text' : 'number'
69+
const payloadIDType = sqliteIDType === 'uuid' || sqliteIDType === 'uuidv7' ? 'text' : 'number'
7070
const allowIDOnCreate = args.allowIDOnCreate ?? false
7171

7272
function adapter({ payload }: { payload: Payload }) {

packages/db-vercel-postgres/src/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ export type Args = {
5353
forceUseVercelPostgres?: boolean
5454
/** Generated schema from payload generate:db-schema file path */
5555
generateSchemaOutputFile?: string
56-
idType?: 'serial' | 'uuid'
56+
idType?: 'serial' | 'uuid' | 'uuidv7'
5757
localesSuffix?: string
5858
logger?: DrizzleConfig['logger']
5959
migrationDir?: string

packages/drizzle/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
"drizzle-orm": "0.44.7",
6363
"prompts": "2.4.2",
6464
"to-snake-case": "1.0.0",
65-
"uuid": "9.0.0"
65+
"uuid": "^11.1.0"
6666
},
6767
"devDependencies": {
6868
"@libsql/client": "0.14.0",

packages/drizzle/src/postgres/columnToCodeConverter.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@ export const columnToCodeConverter: ColumnToCodeConverter = ({
6868
code = `${code}.defaultRandom()`
6969
}
7070

71+
if (column.type === 'uuid' && column.defaultV7) {
72+
addImport('uuid', 'v7 as uuidv7')
73+
code = `${code}.$defaultFn(() => uuidv7())`
74+
}
75+
7176
if (column.notNull) {
7277
code = `${code}.notNull()`
7378
}

packages/drizzle/src/postgres/schema/buildDrizzleTable.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {
1818
varchar,
1919
vector,
2020
} from 'drizzle-orm/pg-core'
21+
import { v7 as uuidv7 } from 'uuid'
2122

2223
import type { RawColumn, RawTable } from '../../types.js'
2324
import type { BasePostgresAdapter } from '../types.js'
@@ -109,6 +110,10 @@ export const buildDrizzleTable = ({
109110
builder = builder.defaultRandom()
110111
}
111112

113+
if (column.defaultV7) {
114+
builder = builder.$defaultFn(() => uuidv7())
115+
}
116+
112117
columns[key] = builder
113118
break
114119
}

packages/drizzle/src/postgres/schema/setColumnID.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,17 @@ export const setColumnID: SetColumnID = ({ adapter, columns, fields }) => {
3434
return 'uuid'
3535
}
3636

37+
if (adapter.idType === 'uuidv7') {
38+
columns.id = {
39+
name: 'id',
40+
type: 'uuid',
41+
defaultV7: true,
42+
primaryKey: true,
43+
}
44+
45+
return 'uuid'
46+
}
47+
3748
columns.id = {
3849
name: 'id',
3950
type: 'serial',

packages/drizzle/src/postgres/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ export type BasePostgresAdapter = {
147147
* Used for returning properly formed errors from unique fields
148148
*/
149149
fieldConstraints: Record<string, Record<string, string>>
150-
idType: 'serial' | 'uuid'
150+
idType: 'serial' | 'uuid' | 'uuidv7'
151151
initializing: Promise<void>
152152
insert: Insert
153153
localesSuffix?: string

packages/drizzle/src/queries/getTableColumnFromPath.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import type { DrizzleAdapter, GenericColumn } from '../types.js'
1919
import type { BuildQueryJoinAliases } from './buildQuery.js'
2020

2121
import { isPolymorphicRelationship } from '../utilities/isPolymorphicRelationship.js'
22+
import { isUUIDType } from '../utilities/isUUIDType.js'
2223
import { jsonBuildObject } from '../utilities/json.js'
2324
import { DistinctSymbol } from '../utilities/rawConstraint.js'
2425
import { resolveBlockTableName } from '../utilities/validateExistingBlockIsIdentical.js'
@@ -111,7 +112,7 @@ export const getTableColumnFromPath = ({
111112
constraints,
112113
field: {
113114
name: 'id',
114-
type: adapter.idType === 'uuid' ? 'text' : 'number',
115+
type: isUUIDType(adapter.idType) ? 'text' : 'number',
115116
} as NumberField | TextField,
116117
table: adapter.tables[newTableName],
117118
}
@@ -414,7 +415,7 @@ export const getTableColumnFromPath = ({
414415
constraints,
415416
field: {
416417
name: 'id',
417-
type: adapter.idType === 'uuid' ? 'text' : 'number',
418+
type: isUUIDType(adapter.idType) ? 'text' : 'number',
418419
} as NumberField | TextField,
419420
table: aliasRelationshipTable,
420421
}
@@ -531,7 +532,7 @@ export const getTableColumnFromPath = ({
531532
constraints,
532533
field: {
533534
name: 'id',
534-
type: adapter.idType === 'uuid' ? 'text' : 'number',
535+
type: isUUIDType(adapter.idType) ? 'text' : 'number',
535536
} as NumberField | TextField,
536537
table: newAliasTable,
537538
}
@@ -706,8 +707,9 @@ export const getTableColumnFromPath = ({
706707

707708
const columns: TableColumn['columns'] = field.relationTo
708709
.map((relationTo) => {
709-
let idType: 'number' | 'text' | 'uuid' =
710-
adapter.idType === 'uuid' ? 'uuid' : 'number'
710+
let idType: 'number' | 'text' | 'uuid' = isUUIDType(adapter.idType)
711+
? 'uuid'
712+
: 'number'
711713

712714
const { customIDType } = adapter.payload.collections[relationTo]
713715

0 commit comments

Comments
 (0)