errors.ts•2.19 kB
import { Error as DriverAdapterErrorObject } from '@prisma/driver-adapter-utils'
export function convertDriverError(error: unknown): DriverAdapterErrorObject {
if (isDriverError(error)) {
return {
originalCode: error.code,
originalMessage: error.message,
...mapDriverError(error),
}
}
throw error
}
function mapDriverError(error: DriverError): DriverAdapterErrorObject {
switch (error.code) {
case 'SQLITE_BUSY':
return {
kind: 'SocketTimeout',
}
case 'SQLITE_CONSTRAINT_UNIQUE':
case 'SQLITE_CONSTRAINT_PRIMARYKEY': {
const fields = error.message
.split('constraint failed: ')
.at(1)
?.split(', ')
.map((field) => field.split('.').pop()!)
return {
kind: 'UniqueConstraintViolation',
constraint: fields !== undefined ? { fields } : undefined,
}
}
case 'SQLITE_CONSTRAINT_NOTNULL': {
const fields = error.message
.split('constraint failed: ')
.at(1)
?.split(', ')
.map((field) => field.split('.').pop()!)
return {
kind: 'NullConstraintViolation',
constraint: fields !== undefined ? { fields } : undefined,
}
}
case 'SQLITE_CONSTRAINT_FOREIGNKEY':
case 'SQLITE_CONSTRAINT_TRIGGER':
return {
kind: 'ForeignKeyConstraintViolation',
constraint: { foreignKey: {} },
}
default:
if (error.message.startsWith('no such table')) {
return {
kind: 'TableDoesNotExist',
table: error.message.split(': ').at(1),
}
} else if (error.message.startsWith('no such column')) {
return {
kind: 'ColumnNotFound',
column: error.message.split(': ').at(1),
}
} else if (error.message.includes('has no column named ')) {
return {
kind: 'ColumnNotFound',
column: error.message.split('has no column named ').at(1),
}
}
throw error
}
}
type DriverError = {
code: string
message: string
}
function isDriverError(error: any): error is DriverError {
return typeof error.code === 'string' && typeof error.message === 'string'
}