@torquedev/ext-soft-delete
v0.1.0
Published
Soft-delete extension for @torquedev/datalayer. Automatically filters discarded rows from queries.
Maintainers
Readme
@torquedev/ext-soft-delete
Soft-delete extension for @torquedev/datalayer. Automatically filters discarded rows from query() and count() calls when a table has a discarded_at column. Tables without the column are completely unaffected.
Install
npm install github:michaeljabbour/torque-ext-soft-deletePeer dependency: @torquedev/datalayer >=0.1.0
Usage
Apply once at boot time to patch all BundleScopedData instances:
import { applySoftDelete } from '@torquedev/ext-soft-delete';
import { BundleScopedData } from '@torquedev/datalayer';
applySoftDelete(BundleScopedData);Every query() and count() call now auto-filters discarded rows on tables that have a discarded_at column.
How it works
Column detection is convention-based. When query() or count() is called, the extension checks whether the target table has a discarded_at column using PRAGMA table_info. Results are cached per table so the PRAGMA only runs once.
If the column exists, a discarded_at: null filter is automatically injected -- discarded rows are invisible by default.
API
Patched methods
query(table, filters, options)
Automatically adds discarded_at: null to filters when the table has the column. Pass { includeDiscarded: true } in options to bypass.
count(table, filters, options)
Same auto-filtering behaviour as query().
New methods
softDelete(table, id)
Sets discarded_at to the current ISO timestamp on the given record.
data.softDelete('deals', dealId);restore(table, id)
Clears discarded_at, restoring the record to active queries.
data.restore('deals', dealId);queryWithDiscarded(table, filters, options)
Queries without the soft-delete filter -- returns both active and discarded rows.
const all = data.queryWithDiscarded('deals', { stage: 'closed' });Standalone wrapper
For testing or when you don't want to patch the class globally, use SoftDeleteData:
import { SoftDeleteData } from '@torquedev/ext-soft-delete';
const wrapped = new SoftDeleteData(dataAdapter, db);
wrapped.query('deals', { stage: 'open' }); // auto-filters discardedSoftDeleteData proxies insert, update, and delete through to the underlying adapter.
Exports
import { applySoftDelete, SoftDeleteData } from '@torquedev/ext-soft-delete';Testing
npm testESM-only. Requires Node.js with the built-in test runner.
License
MIT
