@better-drizzle/soft-delete
v0.1.1
Published
Soft delete plugin for better-drizzle.
Maintainers
Readme
Soft delete behavior for better-drizzle.
@better-drizzle/soft-delete extends Better Drizzle's built-in methods with typed soft delete controls, default visibility filtering, and restore helpers.
Website: https://better-drizzle.vercel.app/
npm install better-drizzle @better-drizzle/soft-delete drizzle-ormUsage
import { better } from 'better-drizzle';
import { softDelete } from '@better-drizzle/soft-delete';
const client = better(db, {
schema,
plugins: [
softDelete({
column: 'deletedAt',
deletedByColumn: 'deletedById',
defaults: {
mode: 'soft',
visibility: 'without',
},
}),
],
});All options are optional.
softDelete();Defaults:
column: 'deletedAt'deletedByColumn: 'deletedById'defaults.mode: 'soft'defaults.visibility: 'without'
Reads
By default, read operations exclude soft-deleted rows:
await client.users.findMany();
await client.users.findFirst();
await client.users.count();
await client.users.exists();You can opt in per query:
await client.users.findMany({ deleted: 'with' });
await client.users.findMany({ deleted: 'only' });
await client.users.count({ deleted: 'with' });
await client.users.exists({
deleted: 'only',
where: { id: 1 },
});Deletes and restore
await client.users.delete({
where: { id: 1 },
});
await client.users.delete({
where: { id: 1 },
mode: 'hard',
});
await client.users.delete({
where: { id: 1 },
deletedBy: userId,
});
await client.users.restore({
where: { id: 1 },
});
await client.users.restoreById(1);Behavior details
- Models missing the configured soft delete column are ignored automatically.
deletedByis only written when the configured column exists on the model.restore()andrestoreById()bypass plugin transforms so they can always clear the soft delete fields directly.mode: 'hard'falls back to the built-in physical delete.
