@voyantjs/db 0.9.0 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/crud.d.ts +17 -2
- package/dist/crud.d.ts.map +1 -1
- package/dist/crud.js +27 -8
- package/dist/crud.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/typeid-prefixes.d.ts +1 -0
- package/dist/lib/typeid-prefixes.d.ts.map +1 -1
- package/dist/lib/typeid-prefixes.js +1 -0
- package/dist/lib/typeid-prefixes.js.map +1 -1
- package/dist/lifecycle.d.ts +24 -0
- package/dist/lifecycle.d.ts.map +1 -0
- package/dist/lifecycle.js +30 -0
- package/dist/lifecycle.js.map +1 -0
- package/dist/schema/infra/idempotency_keys.d.ts +186 -0
- package/dist/schema/infra/idempotency_keys.d.ts.map +1 -0
- package/dist/schema/infra/idempotency_keys.js +40 -0
- package/dist/schema/infra/idempotency_keys.js.map +1 -0
- package/dist/schema/infra/index.d.ts +1 -0
- package/dist/schema/infra/index.d.ts.map +1 -1
- package/dist/schema/infra/index.js +1 -0
- package/dist/schema/infra/index.js.map +1 -1
- package/package.json +6 -2
package/README.md
CHANGED
|
@@ -16,7 +16,7 @@ import { createDbClient } from "@voyantjs/db"
|
|
|
16
16
|
// Edge/Serverless (Cloudflare Workers) — Neon HTTP adapter
|
|
17
17
|
const db = createDbClient(url)
|
|
18
18
|
|
|
19
|
-
// Node.js (
|
|
19
|
+
// Node.js (workers, scripts) — Postgres.js adapter
|
|
20
20
|
const db = createDbClient(url, { adapter: "node" })
|
|
21
21
|
```
|
|
22
22
|
|
package/dist/crud.d.ts
CHANGED
|
@@ -26,6 +26,19 @@ export interface ListOptions {
|
|
|
26
26
|
* `asc(table.column)` / `desc(table.column)` builders.
|
|
27
27
|
*/
|
|
28
28
|
orderBy?: SQL | SQL[];
|
|
29
|
+
/**
|
|
30
|
+
* When the table has a `deletedAt` column, soft-deleted rows are filtered
|
|
31
|
+
* out by default. Pass `true` to include them — useful for admin recycle
|
|
32
|
+
* bins, audit reports, or background reconciliation jobs.
|
|
33
|
+
*/
|
|
34
|
+
includeDeleted?: boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Options for retrieve-style lookups by id.
|
|
38
|
+
*/
|
|
39
|
+
export interface RetrieveOptions {
|
|
40
|
+
/** Include soft-deleted rows. Default: false. */
|
|
41
|
+
includeDeleted?: boolean;
|
|
29
42
|
}
|
|
30
43
|
/**
|
|
31
44
|
* A generic CRUD service bound to a single Drizzle table.
|
|
@@ -54,12 +67,14 @@ export interface ListOptions {
|
|
|
54
67
|
export declare function createCrudService<TTable extends AnyPgTable, TInsertSchema extends z.ZodTypeAny = z.ZodTypeAny, TUpdateSchema extends z.ZodTypeAny = z.ZodTypeAny>(table: TTable, options?: CrudServiceOptions<TInsertSchema, TUpdateSchema>): {
|
|
55
68
|
table: TTable;
|
|
56
69
|
list: (db: DrizzleClient, opts?: ListOptions) => Promise<({ [Key in keyof TTable["_"]["columns"] & string as Key]: TTable["_"]["columns"][Key]["_"]["notNull"] extends true ? TTable["_"]["columns"][Key]["_"]["data"] : TTable["_"]["columns"][Key]["_"]["data"] | null; } extends infer T ? { [K in keyof T]: T[K]; } : never)[]>;
|
|
57
|
-
count: (db: DrizzleClient, where?: SQL
|
|
70
|
+
count: (db: DrizzleClient, where?: SQL, opts?: {
|
|
71
|
+
includeDeleted?: boolean;
|
|
72
|
+
}) => Promise<number>;
|
|
58
73
|
listAndCount: (db: DrizzleClient, opts?: ListOptions) => Promise<{
|
|
59
74
|
data: ({ [Key in keyof TTable["_"]["columns"] & string as Key]: TTable["_"]["columns"][Key]["_"]["notNull"] extends true ? TTable["_"]["columns"][Key]["_"]["data"] : TTable["_"]["columns"][Key]["_"]["data"] | null; } extends infer T ? { [K in keyof T]: T[K]; } : never)[];
|
|
60
75
|
total: number;
|
|
61
76
|
}>;
|
|
62
|
-
retrieve: (db: DrizzleClient, id: string) => Promise<({ [Key in keyof TTable["_"]["columns"] & string as Key]: TTable["_"]["columns"][Key]["_"]["notNull"] extends true ? TTable["_"]["columns"][Key]["_"]["data"] : TTable["_"]["columns"][Key]["_"]["data"] | null; } extends infer T ? { [K in keyof T]: T[K]; } : never) | null>;
|
|
77
|
+
retrieve: (db: DrizzleClient, id: string, opts?: RetrieveOptions) => Promise<({ [Key in keyof TTable["_"]["columns"] & string as Key]: TTable["_"]["columns"][Key]["_"]["notNull"] extends true ? TTable["_"]["columns"][Key]["_"]["data"] : TTable["_"]["columns"][Key]["_"]["data"] | null; } extends infer T ? { [K in keyof T]: T[K]; } : never) | null>;
|
|
63
78
|
create: (db: DrizzleClient, data: { [Key in keyof TTable["_"]["columns"] & string as import("drizzle-orm").RequiredKeyOnly<Key, TTable["_"]["columns"][Key]>]: TTable["_"]["columns"][Key]["_"]["notNull"] extends true ? TTable["_"]["columns"][Key]["_"]["data"] : TTable["_"]["columns"][Key]["_"]["data"] | null; } & { [Key_1 in keyof TTable["_"]["columns"] & string as import("drizzle-orm").OptionalKeyOnly<Key_1, TTable["_"]["columns"][Key_1], false>]?: (TTable["_"]["columns"][Key_1]["_"]["notNull"] extends true ? TTable["_"]["columns"][Key_1]["_"]["data"] : TTable["_"]["columns"][Key_1]["_"]["data"] | null) | undefined; } extends infer T ? { [K in keyof T]: T[K]; } : never) => Promise<{ [Key_2 in keyof TTable["_"]["columns"] & string as Key_2]: TTable["_"]["columns"][Key_2]["_"]["notNull"] extends true ? TTable["_"]["columns"][Key_2]["_"]["data"] : TTable["_"]["columns"][Key_2]["_"]["data"] | null; } extends infer T_1 ? { [K_1 in keyof T_1]: T_1[K_1]; } : never>;
|
|
64
79
|
update: (db: DrizzleClient, id: string, data: Partial<{ [Key in keyof TTable["_"]["columns"] & string as import("drizzle-orm").RequiredKeyOnly<Key, TTable["_"]["columns"][Key]>]: TTable["_"]["columns"][Key]["_"]["notNull"] extends true ? TTable["_"]["columns"][Key]["_"]["data"] : TTable["_"]["columns"][Key]["_"]["data"] | null; } & { [Key_1 in keyof TTable["_"]["columns"] & string as import("drizzle-orm").OptionalKeyOnly<Key_1, TTable["_"]["columns"][Key_1], false>]?: (TTable["_"]["columns"][Key_1]["_"]["notNull"] extends true ? TTable["_"]["columns"][Key_1]["_"]["data"] : TTable["_"]["columns"][Key_1]["_"]["data"] | null) | undefined; } extends infer T ? { [K in keyof T]: T[K]; } : never>) => Promise<({ [Key_2 in keyof TTable["_"]["columns"] & string as Key_2]: TTable["_"]["columns"][Key_2]["_"]["notNull"] extends true ? TTable["_"]["columns"][Key_2]["_"]["data"] : TTable["_"]["columns"][Key_2]["_"]["data"] | null; } extends infer T_1 ? { [K_1 in keyof T_1]: T_1[K_1]; } : never) | null>;
|
|
65
80
|
delete: (db: DrizzleClient, id: string) => Promise<{
|
package/dist/crud.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crud.d.ts","sourceRoot":"","sources":["../src/crud.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"crud.d.ts","sourceRoot":"","sources":["../src/crud.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoC,KAAK,GAAG,EAAO,MAAM,aAAa,CAAA;AAC7E,OAAO,KAAK,EAAE,UAAU,EAAY,MAAM,qBAAqB,CAAA;AAC/D,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAG5B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C;;GAEG;AACH,MAAM,WAAW,kBAAkB,CACjC,aAAa,SAAS,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,EACjD,aAAa,SAAS,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU;IAEjD,iEAAiE;IACjE,YAAY,CAAC,EAAE,aAAa,CAAA;IAC5B,iEAAiE;IACjE,YAAY,CAAC,EAAE,aAAa,CAAA;CAC7B;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,qDAAqD;IACrD,KAAK,CAAC,EAAE,GAAG,CAAA;IACX,oCAAoC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,6BAA6B;IAC7B,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;OAGG;IACH,OAAO,CAAC,EAAE,GAAG,GAAG,GAAG,EAAE,CAAA;IACrB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,iDAAiD;IACjD,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AAKD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,SAAS,UAAU,EACzB,aAAa,SAAS,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,EACjD,aAAa,SAAS,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,EACjD,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE,kBAAkB,CAAC,aAAa,EAAE,aAAa,CAAM;;eA4BrD,aAAa,SAAQ,WAAW,KAAQ,OAAO,CAAC,yQAAK,CAAC;gBAexE,aAAa,UACT,GAAG,SACL;QAAE,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,KACjC,OAAO,CAAC,MAAM,CAAC;uBAQZ,aAAa,SACX,WAAW,KAChB,OAAO,CAAC;QAAE,IAAI,EAAE,yQAAK,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;mBASpC,aAAa,MACb,MAAM,SACJ,eAAe,KACpB,OAAO,CAAC,0QAAM,IAAI,CAAC;iBAMI,aAAa,gpBAAsB,OAAO,2RAAK;iBAanE,aAAa,MACb,MAAM,QACJ,OAAO,qoBAAa,KACzB,OAAO,CAAC,8RAAM,IAAI,CAAC;iBAgBI,aAAa,MAAM,MAAM,KAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;qBAQtD,aAAa,MAAM,MAAM,KAAG,OAAO,CAAC,0QAAM,IAAI,CAAC;kBAYlD,aAAa,MAAM,MAAM,KAAG,OAAO,CAAC,0QAAM,IAAI,CAAC;;EAyB3E"}
|
package/dist/crud.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { eq, getTableColumns, sql } from "drizzle-orm";
|
|
1
|
+
import { and, eq, getTableColumns, isNull, sql } from "drizzle-orm";
|
|
2
2
|
/**
|
|
3
3
|
* A generic CRUD service bound to a single Drizzle table.
|
|
4
4
|
*
|
|
@@ -34,10 +34,24 @@ export function createCrudService(table, options = {}) {
|
|
|
34
34
|
// Drizzle's query builder types lose fidelity under generic TTable — cast
|
|
35
35
|
// db to AnyDb only at the Drizzle call site; return types stay strict.
|
|
36
36
|
const asDb = (db) => db;
|
|
37
|
+
function activeFilter() {
|
|
38
|
+
return deletedAtColumn ? isNull(deletedAtColumn) : undefined;
|
|
39
|
+
}
|
|
40
|
+
function composeWhere(opts) {
|
|
41
|
+
if (opts.includeDeleted)
|
|
42
|
+
return opts.where;
|
|
43
|
+
const active = activeFilter();
|
|
44
|
+
if (!active)
|
|
45
|
+
return opts.where;
|
|
46
|
+
if (!opts.where)
|
|
47
|
+
return active;
|
|
48
|
+
return and(opts.where, active);
|
|
49
|
+
}
|
|
37
50
|
async function list(db, opts = {}) {
|
|
38
51
|
let query = asDb(db).select().from(table);
|
|
39
|
-
|
|
40
|
-
|
|
52
|
+
const where = composeWhere(opts);
|
|
53
|
+
if (where)
|
|
54
|
+
query = query.where(where);
|
|
41
55
|
if (opts.orderBy) {
|
|
42
56
|
const orders = Array.isArray(opts.orderBy) ? opts.orderBy : [opts.orderBy];
|
|
43
57
|
query = query.orderBy(...orders);
|
|
@@ -49,17 +63,22 @@ export function createCrudService(table, options = {}) {
|
|
|
49
63
|
const rows = (await query);
|
|
50
64
|
return rows;
|
|
51
65
|
}
|
|
52
|
-
async function count(db, where) {
|
|
66
|
+
async function count(db, where, opts = {}) {
|
|
53
67
|
const base = asDb(db).select({ count: sql `count(*)::int` }).from(table);
|
|
54
|
-
const
|
|
68
|
+
const composed = composeWhere({ where, includeDeleted: opts.includeDeleted });
|
|
69
|
+
const rows = (composed ? await base.where(composed) : await base);
|
|
55
70
|
return rows[0]?.count ?? 0;
|
|
56
71
|
}
|
|
57
72
|
async function listAndCount(db, opts = {}) {
|
|
58
|
-
const [data, total] = await Promise.all([
|
|
73
|
+
const [data, total] = await Promise.all([
|
|
74
|
+
list(db, opts),
|
|
75
|
+
count(db, opts.where, { includeDeleted: opts.includeDeleted }),
|
|
76
|
+
]);
|
|
59
77
|
return { data, total };
|
|
60
78
|
}
|
|
61
|
-
async function retrieve(db, id) {
|
|
62
|
-
const
|
|
79
|
+
async function retrieve(db, id, opts = {}) {
|
|
80
|
+
const where = composeWhere({ where: eq(idColumn, id), includeDeleted: opts.includeDeleted });
|
|
81
|
+
const rows = (await asDb(db).select().from(table).where(where).limit(1));
|
|
63
82
|
return rows[0] ?? null;
|
|
64
83
|
}
|
|
65
84
|
async function create(db, data) {
|
package/dist/crud.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crud.js","sourceRoot":"","sources":["../src/crud.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,eAAe,EAAY,GAAG,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"crud.js","sourceRoot":"","sources":["../src/crud.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -34,6 +34,7 @@ export declare const db: (import("drizzle-orm/postgres-js").PostgresJsDatabase<R
|
|
|
34
34
|
});
|
|
35
35
|
export * from "./helpers.js";
|
|
36
36
|
export * from "./lib/index.js";
|
|
37
|
+
export * from "./lifecycle.js";
|
|
37
38
|
export * from "./queries/index.js";
|
|
38
39
|
export * from "./types.js";
|
|
39
40
|
export * from "./utils.js";
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,QAAQ,MAAM,UAAU,CAAA;AAE/B,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,CAAA;AAEvC,wBAAgB,cAAc,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAC5F,gBAAgB,EAAE,MAAM,EACxB,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;;;;;;;;GAiDF;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,OAAO,CAAC,EAAE,SAAS;;;;GAGxC;AAcD,eAAO,MAAM,EAAE;;;;;;;;EAKb,CAAA;AAGF,cAAc,WAAW,CAAA;AACzB,cAAc,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,QAAQ,MAAM,UAAU,CAAA;AAE/B,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,CAAA;AAEvC,wBAAgB,cAAc,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,EAC5F,gBAAgB,EAAE,MAAM,EACxB,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,SAAS,CAAA;IACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;IACnB,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC5B;;;;;;;;GAiDF;AAED;;;GAGG;AACH,wBAAgB,KAAK,CAAC,OAAO,CAAC,EAAE,SAAS;;;;GAGxC;AAcD,eAAO,MAAM,EAAE;;;;;;;;EAKb,CAAA;AAGF,cAAc,WAAW,CAAA;AACzB,cAAc,OAAO,CAAA;AACrB,cAAc,aAAa,CAAA;AAE3B,cAAc,WAAW,CAAA;AACzB,cAAc,SAAS,CAAA;AACvB,cAAc,SAAS,CAAA"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -17,6 +17,7 @@ export declare const PREFIXES: {
|
|
|
17
17
|
readonly webhook_deliveries: "whde";
|
|
18
18
|
readonly domains: "dom";
|
|
19
19
|
readonly email_domain_records: "emdr";
|
|
20
|
+
readonly idempotency_keys: "ikey";
|
|
20
21
|
readonly communication_log: "clog";
|
|
21
22
|
readonly notification_templates: "ntpl";
|
|
22
23
|
readonly notification_deliveries: "ntdl";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeid-prefixes.d.ts","sourceRoot":"","sources":["../../src/lib/typeid-prefixes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,QAAQ
|
|
1
|
+
{"version":3,"file":"typeid-prefixes.d.ts","sourceRoot":"","sources":["../../src/lib/typeid-prefixes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkRX,CAAA;AAEV,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,QAAQ,CAAA;AAC7C,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"typeid-prefixes.js","sourceRoot":"","sources":["../../src/lib/typeid-prefixes.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,cAAc;IACd,aAAa,EAAE,MAAM;IACrB,gBAAgB,EAAE,MAAM;IACxB,kBAAkB,EAAE,MAAM;IAE1B,gBAAgB;IAChB,qBAAqB,EAAE,OAAO;IAC9B,kBAAkB,EAAE,MAAM;IAC1B,OAAO,EAAE,KAAK;IACd,oBAAoB,EAAE,MAAM;
|
|
1
|
+
{"version":3,"file":"typeid-prefixes.js","sourceRoot":"","sources":["../../src/lib/typeid-prefixes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type SQL } from "drizzle-orm";
|
|
2
|
+
import type { AnyPgTable } from "drizzle-orm/pg-core";
|
|
3
|
+
/**
|
|
4
|
+
* Returns true when the table declares a `deletedAt` column.
|
|
5
|
+
*
|
|
6
|
+
* Use this to branch in code paths that need to know whether a soft-delete
|
|
7
|
+
* filter applies (e.g. when composing dynamic WHERE clauses).
|
|
8
|
+
*/
|
|
9
|
+
export declare function hasSoftDelete(table: AnyPgTable): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Returns a `deletedAt IS NULL` predicate for tables that declare a
|
|
12
|
+
* `deletedAt` column. Returns `undefined` for tables without one, so callers
|
|
13
|
+
* can compose the result with `and(...)` without conditional branching:
|
|
14
|
+
*
|
|
15
|
+
* ```ts
|
|
16
|
+
* await db.select().from(bookings).where(and(eq(bookings.id, id), whereActive(bookings)))
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* The naming is "active" rather than "not deleted" because the predicate
|
|
20
|
+
* filters to the active (non-tombstoned) rows. `and(undefined, x)` collapses
|
|
21
|
+
* to `x` in drizzle, so the helper is safe to apply unconditionally.
|
|
22
|
+
*/
|
|
23
|
+
export declare function whereActive(table: AnyPgTable): SQL | undefined;
|
|
24
|
+
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,GAAG,EAAE,MAAM,aAAa,CAAA;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAY,MAAM,qBAAqB,CAAA;AAE/D;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAGxD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,GAAG,GAAG,SAAS,CAI9D"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { getTableColumns, isNull } from "drizzle-orm";
|
|
2
|
+
/**
|
|
3
|
+
* Returns true when the table declares a `deletedAt` column.
|
|
4
|
+
*
|
|
5
|
+
* Use this to branch in code paths that need to know whether a soft-delete
|
|
6
|
+
* filter applies (e.g. when composing dynamic WHERE clauses).
|
|
7
|
+
*/
|
|
8
|
+
export function hasSoftDelete(table) {
|
|
9
|
+
const columns = getTableColumns(table);
|
|
10
|
+
return Boolean(columns.deletedAt);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Returns a `deletedAt IS NULL` predicate for tables that declare a
|
|
14
|
+
* `deletedAt` column. Returns `undefined` for tables without one, so callers
|
|
15
|
+
* can compose the result with `and(...)` without conditional branching:
|
|
16
|
+
*
|
|
17
|
+
* ```ts
|
|
18
|
+
* await db.select().from(bookings).where(and(eq(bookings.id, id), whereActive(bookings)))
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* The naming is "active" rather than "not deleted" because the predicate
|
|
22
|
+
* filters to the active (non-tombstoned) rows. `and(undefined, x)` collapses
|
|
23
|
+
* to `x` in drizzle, so the helper is safe to apply unconditionally.
|
|
24
|
+
*/
|
|
25
|
+
export function whereActive(table) {
|
|
26
|
+
const columns = getTableColumns(table);
|
|
27
|
+
const deletedAt = columns.deletedAt;
|
|
28
|
+
return deletedAt ? isNull(deletedAt) : undefined;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../src/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,EAAY,MAAM,aAAa,CAAA;AAG/D;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,KAAiB;IAC7C,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAA6B,CAAA;IAClE,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;AACnC,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,WAAW,CAAC,KAAiB;IAC3C,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAA6B,CAAA;IAClE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,CAAA;IACnC,OAAO,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;AAClD,CAAC"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Idempotency keys store the response of a previously-handled request keyed
|
|
3
|
+
* by `(scope, key)`. Replays of the same key with the same body hash return
|
|
4
|
+
* the stored response; replays with a *different* body hash conflict (409).
|
|
5
|
+
*
|
|
6
|
+
* Designed for non-idempotent POST endpoints — primarily booking creation,
|
|
7
|
+
* payment intent issuance, and similar money-affecting flows where a
|
|
8
|
+
* client retry must not produce duplicate side effects.
|
|
9
|
+
*
|
|
10
|
+
* Rows expire after `expiresAt`. Cleanup is the deployment's responsibility
|
|
11
|
+
* (typically a daily cron sweep).
|
|
12
|
+
*
|
|
13
|
+
* `scope` namespaces keys per endpoint family so that two unrelated
|
|
14
|
+
* endpoints can safely accept overlapping keys without colliding.
|
|
15
|
+
*
|
|
16
|
+
* `bodyHash` is a SHA-256 of the canonical request body — when the same
|
|
17
|
+
* key replays with the same hash, we return `responseStatus` /
|
|
18
|
+
* `responseBody` verbatim. Different hash → 409.
|
|
19
|
+
*
|
|
20
|
+
* `referenceId` (optional) lets callers point at the resource the original
|
|
21
|
+
* request created — typically a booking id — so that operational queries
|
|
22
|
+
* can correlate replays with the underlying entity.
|
|
23
|
+
*/
|
|
24
|
+
export declare const infraIdempotencyKeysTable: Omit<import("drizzle-orm/pg-core").PgTableWithColumns<{
|
|
25
|
+
name: "idempotency_keys";
|
|
26
|
+
schema: undefined;
|
|
27
|
+
columns: {
|
|
28
|
+
id: import("drizzle-orm/pg-core").PgColumn<{
|
|
29
|
+
name: string;
|
|
30
|
+
tableName: "idempotency_keys";
|
|
31
|
+
dataType: "string";
|
|
32
|
+
columnType: "PgText";
|
|
33
|
+
data: string;
|
|
34
|
+
driverParam: string;
|
|
35
|
+
notNull: true;
|
|
36
|
+
hasDefault: true;
|
|
37
|
+
isPrimaryKey: true;
|
|
38
|
+
isAutoincrement: false;
|
|
39
|
+
hasRuntimeDefault: true;
|
|
40
|
+
enumValues: [string, ...string[]];
|
|
41
|
+
baseColumn: never;
|
|
42
|
+
identity: undefined;
|
|
43
|
+
generated: undefined;
|
|
44
|
+
}, {}, {}>;
|
|
45
|
+
scope: import("drizzle-orm/pg-core").PgColumn<{
|
|
46
|
+
name: "scope";
|
|
47
|
+
tableName: "idempotency_keys";
|
|
48
|
+
dataType: "string";
|
|
49
|
+
columnType: "PgText";
|
|
50
|
+
data: string;
|
|
51
|
+
driverParam: string;
|
|
52
|
+
notNull: true;
|
|
53
|
+
hasDefault: false;
|
|
54
|
+
isPrimaryKey: false;
|
|
55
|
+
isAutoincrement: false;
|
|
56
|
+
hasRuntimeDefault: false;
|
|
57
|
+
enumValues: [string, ...string[]];
|
|
58
|
+
baseColumn: never;
|
|
59
|
+
identity: undefined;
|
|
60
|
+
generated: undefined;
|
|
61
|
+
}, {}, {}>;
|
|
62
|
+
key: import("drizzle-orm/pg-core").PgColumn<{
|
|
63
|
+
name: "key";
|
|
64
|
+
tableName: "idempotency_keys";
|
|
65
|
+
dataType: "string";
|
|
66
|
+
columnType: "PgText";
|
|
67
|
+
data: string;
|
|
68
|
+
driverParam: string;
|
|
69
|
+
notNull: true;
|
|
70
|
+
hasDefault: false;
|
|
71
|
+
isPrimaryKey: false;
|
|
72
|
+
isAutoincrement: false;
|
|
73
|
+
hasRuntimeDefault: false;
|
|
74
|
+
enumValues: [string, ...string[]];
|
|
75
|
+
baseColumn: never;
|
|
76
|
+
identity: undefined;
|
|
77
|
+
generated: undefined;
|
|
78
|
+
}, {}, {}>;
|
|
79
|
+
bodyHash: import("drizzle-orm/pg-core").PgColumn<{
|
|
80
|
+
name: "body_hash";
|
|
81
|
+
tableName: "idempotency_keys";
|
|
82
|
+
dataType: "string";
|
|
83
|
+
columnType: "PgText";
|
|
84
|
+
data: string;
|
|
85
|
+
driverParam: string;
|
|
86
|
+
notNull: true;
|
|
87
|
+
hasDefault: false;
|
|
88
|
+
isPrimaryKey: false;
|
|
89
|
+
isAutoincrement: false;
|
|
90
|
+
hasRuntimeDefault: false;
|
|
91
|
+
enumValues: [string, ...string[]];
|
|
92
|
+
baseColumn: never;
|
|
93
|
+
identity: undefined;
|
|
94
|
+
generated: undefined;
|
|
95
|
+
}, {}, {}>;
|
|
96
|
+
responseStatus: import("drizzle-orm/pg-core").PgColumn<{
|
|
97
|
+
name: "response_status";
|
|
98
|
+
tableName: "idempotency_keys";
|
|
99
|
+
dataType: "number";
|
|
100
|
+
columnType: "PgInteger";
|
|
101
|
+
data: number;
|
|
102
|
+
driverParam: string | number;
|
|
103
|
+
notNull: true;
|
|
104
|
+
hasDefault: false;
|
|
105
|
+
isPrimaryKey: false;
|
|
106
|
+
isAutoincrement: false;
|
|
107
|
+
hasRuntimeDefault: false;
|
|
108
|
+
enumValues: undefined;
|
|
109
|
+
baseColumn: never;
|
|
110
|
+
identity: undefined;
|
|
111
|
+
generated: undefined;
|
|
112
|
+
}, {}, {}>;
|
|
113
|
+
responseBody: import("drizzle-orm/pg-core").PgColumn<{
|
|
114
|
+
name: "response_body";
|
|
115
|
+
tableName: "idempotency_keys";
|
|
116
|
+
dataType: "json";
|
|
117
|
+
columnType: "PgJsonb";
|
|
118
|
+
data: unknown;
|
|
119
|
+
driverParam: unknown;
|
|
120
|
+
notNull: true;
|
|
121
|
+
hasDefault: false;
|
|
122
|
+
isPrimaryKey: false;
|
|
123
|
+
isAutoincrement: false;
|
|
124
|
+
hasRuntimeDefault: false;
|
|
125
|
+
enumValues: undefined;
|
|
126
|
+
baseColumn: never;
|
|
127
|
+
identity: undefined;
|
|
128
|
+
generated: undefined;
|
|
129
|
+
}, {}, {}>;
|
|
130
|
+
referenceId: import("drizzle-orm/pg-core").PgColumn<{
|
|
131
|
+
name: "reference_id";
|
|
132
|
+
tableName: "idempotency_keys";
|
|
133
|
+
dataType: "string";
|
|
134
|
+
columnType: "PgText";
|
|
135
|
+
data: string;
|
|
136
|
+
driverParam: string;
|
|
137
|
+
notNull: false;
|
|
138
|
+
hasDefault: false;
|
|
139
|
+
isPrimaryKey: false;
|
|
140
|
+
isAutoincrement: false;
|
|
141
|
+
hasRuntimeDefault: false;
|
|
142
|
+
enumValues: [string, ...string[]];
|
|
143
|
+
baseColumn: never;
|
|
144
|
+
identity: undefined;
|
|
145
|
+
generated: undefined;
|
|
146
|
+
}, {}, {}>;
|
|
147
|
+
createdAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
148
|
+
name: "created_at";
|
|
149
|
+
tableName: "idempotency_keys";
|
|
150
|
+
dataType: "date";
|
|
151
|
+
columnType: "PgTimestamp";
|
|
152
|
+
data: Date;
|
|
153
|
+
driverParam: string;
|
|
154
|
+
notNull: true;
|
|
155
|
+
hasDefault: true;
|
|
156
|
+
isPrimaryKey: false;
|
|
157
|
+
isAutoincrement: false;
|
|
158
|
+
hasRuntimeDefault: false;
|
|
159
|
+
enumValues: undefined;
|
|
160
|
+
baseColumn: never;
|
|
161
|
+
identity: undefined;
|
|
162
|
+
generated: undefined;
|
|
163
|
+
}, {}, {}>;
|
|
164
|
+
expiresAt: import("drizzle-orm/pg-core").PgColumn<{
|
|
165
|
+
name: "expires_at";
|
|
166
|
+
tableName: "idempotency_keys";
|
|
167
|
+
dataType: "date";
|
|
168
|
+
columnType: "PgTimestamp";
|
|
169
|
+
data: Date;
|
|
170
|
+
driverParam: string;
|
|
171
|
+
notNull: true;
|
|
172
|
+
hasDefault: false;
|
|
173
|
+
isPrimaryKey: false;
|
|
174
|
+
isAutoincrement: false;
|
|
175
|
+
hasRuntimeDefault: false;
|
|
176
|
+
enumValues: undefined;
|
|
177
|
+
baseColumn: never;
|
|
178
|
+
identity: undefined;
|
|
179
|
+
generated: undefined;
|
|
180
|
+
}, {}, {}>;
|
|
181
|
+
};
|
|
182
|
+
dialect: "pg";
|
|
183
|
+
}>, "enableRLS">;
|
|
184
|
+
export type InsertInfraIdempotencyKey = typeof infraIdempotencyKeysTable.$inferInsert;
|
|
185
|
+
export type SelectInfraIdempotencyKey = typeof infraIdempotencyKeysTable.$inferSelect;
|
|
186
|
+
//# sourceMappingURL=idempotency_keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idempotency_keys.d.ts","sourceRoot":"","sources":["../../../src/schema/infra/idempotency_keys.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gBAiBzB,CAAA;AAEb,MAAM,MAAM,yBAAyB,GAAG,OAAO,yBAAyB,CAAC,YAAY,CAAA;AACrF,MAAM,MAAM,yBAAyB,GAAG,OAAO,yBAAyB,CAAC,YAAY,CAAA"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { index, integer, jsonb, pgTable, text, timestamp, uniqueIndex } from "drizzle-orm/pg-core";
|
|
2
|
+
import { typeId } from "../../lib/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* Idempotency keys store the response of a previously-handled request keyed
|
|
5
|
+
* by `(scope, key)`. Replays of the same key with the same body hash return
|
|
6
|
+
* the stored response; replays with a *different* body hash conflict (409).
|
|
7
|
+
*
|
|
8
|
+
* Designed for non-idempotent POST endpoints — primarily booking creation,
|
|
9
|
+
* payment intent issuance, and similar money-affecting flows where a
|
|
10
|
+
* client retry must not produce duplicate side effects.
|
|
11
|
+
*
|
|
12
|
+
* Rows expire after `expiresAt`. Cleanup is the deployment's responsibility
|
|
13
|
+
* (typically a daily cron sweep).
|
|
14
|
+
*
|
|
15
|
+
* `scope` namespaces keys per endpoint family so that two unrelated
|
|
16
|
+
* endpoints can safely accept overlapping keys without colliding.
|
|
17
|
+
*
|
|
18
|
+
* `bodyHash` is a SHA-256 of the canonical request body — when the same
|
|
19
|
+
* key replays with the same hash, we return `responseStatus` /
|
|
20
|
+
* `responseBody` verbatim. Different hash → 409.
|
|
21
|
+
*
|
|
22
|
+
* `referenceId` (optional) lets callers point at the resource the original
|
|
23
|
+
* request created — typically a booking id — so that operational queries
|
|
24
|
+
* can correlate replays with the underlying entity.
|
|
25
|
+
*/
|
|
26
|
+
export const infraIdempotencyKeysTable = pgTable("idempotency_keys", {
|
|
27
|
+
id: typeId("idempotency_keys"),
|
|
28
|
+
scope: text("scope").notNull(),
|
|
29
|
+
key: text("key").notNull(),
|
|
30
|
+
bodyHash: text("body_hash").notNull(),
|
|
31
|
+
responseStatus: integer("response_status").notNull(),
|
|
32
|
+
responseBody: jsonb("response_body").notNull(),
|
|
33
|
+
referenceId: text("reference_id"),
|
|
34
|
+
createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
|
|
35
|
+
expiresAt: timestamp("expires_at", { withTimezone: true }).notNull(),
|
|
36
|
+
}, (table) => [
|
|
37
|
+
uniqueIndex("idx_infra_idempotency_keys_scope_key").on(table.scope, table.key),
|
|
38
|
+
index("idx_infra_idempotency_keys_expires_at").on(table.expiresAt),
|
|
39
|
+
]).enableRLS();
|
|
40
|
+
//# sourceMappingURL=idempotency_keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"idempotency_keys.js","sourceRoot":"","sources":["../../../src/schema/infra/idempotency_keys.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAElG,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAA;AAElC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,OAAO,CAC9C,kBAAkB,EAClB;IACE,EAAE,EAAE,MAAM,CAAC,kBAAkB,CAAC;IAC9B,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;IAC9B,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE;IAC1B,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,OAAO,EAAE;IACrC,cAAc,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC,OAAO,EAAE;IACpD,YAAY,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,OAAO,EAAE;IAC9C,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC;IACjC,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;IACjF,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE;CACrE,EACD,CAAC,KAAK,EAAE,EAAE,CAAC;IACT,WAAW,CAAC,sCAAsC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC;IAC9E,KAAK,CAAC,uCAAuC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC;CACnE,CACF,CAAC,SAAS,EAAE,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/schema/infra/index.ts"],"names":[],"mappings":"AACA,cAAc,WAAW,CAAA;AACzB,cAAc,yBAAyB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/schema/infra/index.ts"],"names":[],"mappings":"AACA,cAAc,WAAW,CAAA;AACzB,cAAc,oBAAoB,CAAA;AAClC,cAAc,yBAAyB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/schema/infra/index.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,cAAc,WAAW,CAAA;AACzB,cAAc,yBAAyB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/schema/infra/index.ts"],"names":[],"mappings":"AAAA,mEAAmE;AACnE,cAAc,WAAW,CAAA;AACzB,cAAc,oBAAoB,CAAA;AAClC,cAAc,yBAAyB,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@voyantjs/db",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.10.0",
|
|
4
4
|
"license": "FSL-1.1-Apache-2.0",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -57,6 +57,10 @@
|
|
|
57
57
|
"types": "./dist/crud.d.ts",
|
|
58
58
|
"import": "./dist/crud.js"
|
|
59
59
|
},
|
|
60
|
+
"./lifecycle": {
|
|
61
|
+
"types": "./dist/lifecycle.d.ts",
|
|
62
|
+
"import": "./dist/lifecycle.js"
|
|
63
|
+
},
|
|
60
64
|
"./links": {
|
|
61
65
|
"types": "./dist/links.d.ts",
|
|
62
66
|
"import": "./dist/links.js"
|
|
@@ -126,7 +130,7 @@
|
|
|
126
130
|
"postgres": "^3.4.8",
|
|
127
131
|
"typeid-js": "^1.2.0",
|
|
128
132
|
"zod": "^4.3.6",
|
|
129
|
-
"@voyantjs/core": "0.
|
|
133
|
+
"@voyantjs/core": "0.10.0"
|
|
130
134
|
},
|
|
131
135
|
"devDependencies": {
|
|
132
136
|
"typescript": "^6.0.2",
|