@hono-crud/drizzle 0.1.19 → 0.1.21
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/CHANGELOG.md +41 -0
- package/README.md +27 -1
- package/dist/index.d.ts +279 -3
- package/dist/index.js +2 -2
- package/package.json +3 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,46 @@
|
|
|
1
1
|
# @hono-crud/drizzle
|
|
2
2
|
|
|
3
|
+
## 0.1.21
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 60e920f: Add `DrizzleAuditLogStorage` — a durable, Drizzle-backed `AuditLogStorage` (Cloudflare D1, libsql, postgres-js, …) so audit logs survive across isolates/requests. Previously the only shipped `AuditLogStorage` was in-memory, so audit history on Workers was per-isolate and ephemeral. Ships a `sqliteAuditLogTable()` helper for D1/SQLite; one shared table backs many models (rows discriminated by the model's tableName). Semantics track `MemoryAuditLogStorage` exactly: `getAll` combines every filter (tableName, action, userId, date range) with AND, the date range is inclusive on both ends, results are oldest-first, and `limit`/`offset` slice the result. Core re-exports `AuditLogEntry`, `AuditAction`, and `AuditFieldChange` from `hono-crud/audit` so storage implementers can import them alongside the `AuditLogStorage` interface. The storage-backend contracts (`AuditLogStorage`/`AuditLogEntry`/`AuditAction`/`AuditFieldChange` and `VersioningStorage`/`VersionHistoryEntry`) are now also re-exported from `hono-crud/internal`, the curated first-party-satellite entrypoint, so `@hono-crud/*` adapters resolve them from a single internal surface instead of feature subpaths (per the Export Surface Doctrine).
|
|
8
|
+
|
|
9
|
+
## 0.1.20
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- 9a621d2: refactor: single-source tag defaulting, drop dead totalPages, short-circuit batch events
|
|
14
|
+
|
|
15
|
+
Post-pass cleanup — three internal tightenings with no change to emitted OpenAPI,
|
|
16
|
+
response envelopes, or events.
|
|
17
|
+
|
|
18
|
+
**Single-source OpenAPI tag defaulting (core).** The sugar-class factory
|
|
19
|
+
(`generateEndpointClass`) no longer bakes the model-group tag default into the
|
|
20
|
+
generated class's raw `schema` field. Tag defaulting (`Model.tag` ?? `tableName`,
|
|
21
|
+
explicit `openapi.tags` always wins) is now applied at exactly one place — the
|
|
22
|
+
emit-time choke point `resolveInstanceSchemaTags`, already used by `registerRoute`
|
|
23
|
+
and `buildPerTenantOpenApi`, and now also by `toOpenApiPaths`. Registered-route
|
|
24
|
+
and per-path OpenAPI emission are byte-identical. **Observable only to code
|
|
25
|
+
reading a generated class's raw `.schema` field (or `getSchema()`) directly:** it
|
|
26
|
+
now carries only explicitly supplied tags; the model-group default appears solely
|
|
27
|
+
in emitted output. `resolveSchemaTags` is no longer re-exported from
|
|
28
|
+
`hono-crud/internal` (no importer remained; the function stays in core).
|
|
29
|
+
|
|
30
|
+
**Dead `totalPages` dropped (drizzle, prisma).** `executeDrizzleListQuery` /
|
|
31
|
+
`executePrismaQuery` no longer compute or return `totalPages` on their offset
|
|
32
|
+
path — every call site builds the envelope's `total_pages` via core's
|
|
33
|
+
`buildOffsetPageInfo({ page, perPage, totalCount })`, so the executor value was
|
|
34
|
+
unread. Response output is unchanged.
|
|
35
|
+
|
|
36
|
+
**Batch-event no-op scheduling removed (core).** `emitBatchEvents` now resolves
|
|
37
|
+
the event emitter once per request and returns immediately when none is
|
|
38
|
+
configured, instead of scheduling a per-record `runAfterResponse` no-op. With an
|
|
39
|
+
emitter configured the emitted events, their order, and their `runAfterResponse`
|
|
40
|
+
dispatch are byte-identical (payload building moved verbatim into a shared
|
|
41
|
+
`dispatchEvent`); resolution semantics match the single-verb `emitEvent`
|
|
42
|
+
(per-request, never cached across requests).
|
|
43
|
+
|
|
3
44
|
## 0.1.19
|
|
4
45
|
|
|
5
46
|
### Patch Changes
|
package/README.md
CHANGED
|
@@ -46,4 +46,30 @@ const app = fromHono(new Hono());
|
|
|
46
46
|
registerCrud(app, '/users', { create: UserCreate, read: UserRead, list: UserList });
|
|
47
47
|
```
|
|
48
48
|
|
|
49
|
-
|
|
49
|
+
## Durable audit & version-history storage
|
|
50
|
+
|
|
51
|
+
Persist audit logs and version history in your database (Cloudflare D1, libsql, postgres-js, …) so they survive across isolates/requests — the durable counterparts to the in-memory `MemoryAuditLogStorage` / `MemoryVersioningStorage`. One shared table backs every model; rows are discriminated by the model's `tableName`.
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
import {
|
|
55
|
+
DrizzleAuditLogStorage,
|
|
56
|
+
DrizzleVersioningStorage,
|
|
57
|
+
type DrizzleDatabaseConstraint,
|
|
58
|
+
sqliteAuditLogTable,
|
|
59
|
+
sqliteVersionHistoryTable,
|
|
60
|
+
} from '@hono-crud/drizzle';
|
|
61
|
+
import { setAuditStorage } from 'hono-crud/audit';
|
|
62
|
+
import { setVersioningStorage } from 'hono-crud/versioning';
|
|
63
|
+
|
|
64
|
+
declare const db: DrizzleDatabaseConstraint; // your drizzle instance
|
|
65
|
+
|
|
66
|
+
// `sqliteAuditLogTable()` / `sqliteVersionHistoryTable()` build the D1/SQLite
|
|
67
|
+
// tables with the columns each storage expects — mirror their columns for
|
|
68
|
+
// Postgres/MySQL. The audit table's columns are: id, table_name, record_id,
|
|
69
|
+
// action, timestamp (epoch ms), user_id, record, previous_record, changes,
|
|
70
|
+
// metadata (the last four hold JSON).
|
|
71
|
+
setAuditStorage(new DrizzleAuditLogStorage({ db, table: sqliteAuditLogTable() }));
|
|
72
|
+
setVersioningStorage(new DrizzleVersioningStorage({ db, table: sqliteVersionHistoryTable() }));
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Exports `DrizzleAdapters` (the 22-entry adapter bundle), the `Drizzle*Endpoint` classes, `createDrizzleCrud`, `createDrizzleSchemas`, the `DrizzleAuditLogStorage` / `DrizzleVersioningStorage` durable storages (with their `sqlite*Table` helpers), and the `DrizzleDatabaseConstraint` type.
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { MetaInput, IncludeOptions, FilterCondition, RelationConfig, CreateEndpoint, ModelObject, ReadEndpoint, UpdateEndpoint, NestedUpdateInput, NestedWriteResult, DeleteEndpoint, ListEndpoint, ListFilters, PaginatedResult, RestoreEndpoint, BatchCreateEndpoint, BatchDeleteEndpoint, BatchRestoreEndpoint, BatchUpdateEndpoint, BatchUpdateItem, AggregateEndpoint, AggregateOptions, AggregateResult, BatchUpsertEndpoint, BulkPatchEndpoint, CloneEndpoint, UpsertEndpoint, SearchEndpoint, SearchOptions, SearchResult, ExportEndpoint, ImportEndpoint, VersionCompareEndpoint, VersionHistoryEndpoint, VersionReadEndpoint, VersionRollbackEndpoint, AdapterBundle } from 'hono-crud/internal';
|
|
1
|
+
import { MetaInput, IncludeOptions, FilterCondition, RelationConfig, CreateEndpoint, ModelObject, ReadEndpoint, UpdateEndpoint, NestedUpdateInput, NestedWriteResult, DeleteEndpoint, ListEndpoint, ListFilters, PaginatedResult, RestoreEndpoint, BatchCreateEndpoint, BatchDeleteEndpoint, BatchRestoreEndpoint, BatchUpdateEndpoint, BatchUpdateItem, AggregateEndpoint, AggregateOptions, AggregateResult, BatchUpsertEndpoint, BulkPatchEndpoint, CloneEndpoint, UpsertEndpoint, SearchEndpoint, SearchOptions, SearchResult, ExportEndpoint, ImportEndpoint, VersionCompareEndpoint, VersionHistoryEndpoint, VersionReadEndpoint, VersionRollbackEndpoint, VersioningStorage, VersionHistoryEntry, AuditLogStorage, AuditLogEntry, AuditAction, AdapterBundle } from 'hono-crud/internal';
|
|
2
2
|
import { Env } from 'hono';
|
|
3
3
|
import * as drizzle_orm_sqlite_core from 'drizzle-orm/sqlite-core';
|
|
4
|
-
import { VersioningStorage, VersionHistoryEntry } from 'hono-crud/versioning';
|
|
5
4
|
import { z } from 'zod';
|
|
6
5
|
|
|
7
6
|
/**
|
|
@@ -1182,6 +1181,283 @@ declare function sqliteVersionHistoryTable(name?: string): drizzle_orm_sqlite_co
|
|
|
1182
1181
|
dialect: "sqlite";
|
|
1183
1182
|
}>;
|
|
1184
1183
|
|
|
1184
|
+
interface DrizzleAuditLogStorageOptions {
|
|
1185
|
+
/** Any Drizzle database handle (D1/libsql/postgres-js/…). */
|
|
1186
|
+
db: DrizzleDatabaseConstraint;
|
|
1187
|
+
/**
|
|
1188
|
+
* The audit table. Must have the property names of {@link AuditLogRow}
|
|
1189
|
+
* (`id`, `tableName`, `recordId`, `action`, `timestamp`, `userId`, `record`,
|
|
1190
|
+
* `previousRecord`, `changes`, `metadata`). Use {@link sqliteAuditLogTable}
|
|
1191
|
+
* for D1/SQLite, or define your own for another dialect.
|
|
1192
|
+
*/
|
|
1193
|
+
table: DrizzleTable;
|
|
1194
|
+
}
|
|
1195
|
+
/**
|
|
1196
|
+
* Durable {@link AuditLogStorage} backed by Drizzle — the persistent
|
|
1197
|
+
* counterpart to the in-memory `MemoryAuditLogStorage`, suitable for
|
|
1198
|
+
* Cloudflare D1 and any other Drizzle-supported database. Audit entries survive
|
|
1199
|
+
* across isolates/requests (unlike the memory store, which is per-isolate).
|
|
1200
|
+
*
|
|
1201
|
+
* @remarks
|
|
1202
|
+
* JSON payloads (`record`, `previousRecord`, `changes`, `metadata`) are
|
|
1203
|
+
* persisted with `JSON.stringify` and rehydrated with `JSON.parse`, so non-JSON
|
|
1204
|
+
* values inside them are stored in their JSON form (e.g. a nested `Date` comes
|
|
1205
|
+
* back as an ISO string) — an encrypted `{ ct, iv, v }` envelope round-trips
|
|
1206
|
+
* untouched. The entry's own `timestamp` is stored as epoch milliseconds and
|
|
1207
|
+
* rehydrated to a `Date`. `recordId` is persisted as text (`String(recordId)`),
|
|
1208
|
+
* so a numeric `recordId` reads back as a string — mirroring
|
|
1209
|
+
* `DrizzleVersioningStorage`.
|
|
1210
|
+
*
|
|
1211
|
+
* Semantics track `MemoryAuditLogStorage` exactly: `getAll` combines every
|
|
1212
|
+
* filter with AND; the date range is inclusive on both ends (`>= startDate`,
|
|
1213
|
+
* `<= endDate`); results are returned oldest-first; `limit`/`offset` slice the
|
|
1214
|
+
* result, and a falsy `limit` (0 or absent) means "all remaining". The one
|
|
1215
|
+
* documented divergence: memory returns strict insertion order, while this
|
|
1216
|
+
* store orders by `timestamp` ascending with a secondary `id` ascending
|
|
1217
|
+
* tiebreaker — identical to memory whenever timestamps are distinct (the common
|
|
1218
|
+
* case, since entries are stamped at write time). For same-millisecond ties the
|
|
1219
|
+
* two diverge: memory yields insertion order, this store yields timestamp-then-id
|
|
1220
|
+
* (deterministic, not necessarily insertion order). The `id` tiebreaker is what
|
|
1221
|
+
* makes it deterministic at all — SQLite would otherwise break ties by rowid but
|
|
1222
|
+
* Postgres tie order is unspecified, so without a unique secondary key, LIMIT/
|
|
1223
|
+
* OFFSET pagination across a same-millisecond batch could duplicate or skip rows
|
|
1224
|
+
* between pages.
|
|
1225
|
+
*
|
|
1226
|
+
* @example
|
|
1227
|
+
* ```ts
|
|
1228
|
+
* import { DrizzleAuditLogStorage, sqliteAuditLogTable } from '@hono-crud/drizzle';
|
|
1229
|
+
* import { setAuditStorage } from 'hono-crud/audit';
|
|
1230
|
+
*
|
|
1231
|
+
* const auditLogs = sqliteAuditLogTable();
|
|
1232
|
+
* const db = drizzle(env.DB);
|
|
1233
|
+
* setAuditStorage(new DrizzleAuditLogStorage({ db, table: auditLogs }));
|
|
1234
|
+
* ```
|
|
1235
|
+
*/
|
|
1236
|
+
declare class DrizzleAuditLogStorage implements AuditLogStorage {
|
|
1237
|
+
private readonly db;
|
|
1238
|
+
private readonly table;
|
|
1239
|
+
constructor(options: DrizzleAuditLogStorageOptions);
|
|
1240
|
+
private col;
|
|
1241
|
+
private toEntry;
|
|
1242
|
+
store(entry: AuditLogEntry): Promise<void>;
|
|
1243
|
+
getByRecordId(tableName: string, recordId: string | number, options?: {
|
|
1244
|
+
limit?: number;
|
|
1245
|
+
offset?: number;
|
|
1246
|
+
}): Promise<AuditLogEntry[]>;
|
|
1247
|
+
getAll(options?: {
|
|
1248
|
+
tableName?: string;
|
|
1249
|
+
action?: AuditAction;
|
|
1250
|
+
userId?: string;
|
|
1251
|
+
startDate?: Date;
|
|
1252
|
+
endDate?: Date;
|
|
1253
|
+
limit?: number;
|
|
1254
|
+
offset?: number;
|
|
1255
|
+
}): Promise<AuditLogEntry[]>;
|
|
1256
|
+
}
|
|
1257
|
+
/**
|
|
1258
|
+
* Build a SQLite/D1 audit table with the columns {@link DrizzleAuditLogStorage}
|
|
1259
|
+
* expects. `tableName`/`recordId`/`timestamp` back the per-record lookups and
|
|
1260
|
+
* the `getAll` filters the storage performs.
|
|
1261
|
+
*
|
|
1262
|
+
* @param name - Table name. Default `audit_logs` (matches `AuditConfig`'s
|
|
1263
|
+
* default `tableName`).
|
|
1264
|
+
*/
|
|
1265
|
+
declare function sqliteAuditLogTable(name?: string): drizzle_orm_sqlite_core.SQLiteTableWithColumns<{
|
|
1266
|
+
name: string;
|
|
1267
|
+
schema: undefined;
|
|
1268
|
+
columns: {
|
|
1269
|
+
id: drizzle_orm_sqlite_core.SQLiteColumn<{
|
|
1270
|
+
name: "id";
|
|
1271
|
+
tableName: string;
|
|
1272
|
+
dataType: "string";
|
|
1273
|
+
columnType: "SQLiteText";
|
|
1274
|
+
data: string;
|
|
1275
|
+
driverParam: string;
|
|
1276
|
+
notNull: true;
|
|
1277
|
+
hasDefault: false;
|
|
1278
|
+
isPrimaryKey: true;
|
|
1279
|
+
isAutoincrement: false;
|
|
1280
|
+
hasRuntimeDefault: false;
|
|
1281
|
+
enumValues: [string, ...string[]];
|
|
1282
|
+
baseColumn: never;
|
|
1283
|
+
identity: undefined;
|
|
1284
|
+
generated: undefined;
|
|
1285
|
+
}, {}, {
|
|
1286
|
+
length: number | undefined;
|
|
1287
|
+
}>;
|
|
1288
|
+
tableName: drizzle_orm_sqlite_core.SQLiteColumn<{
|
|
1289
|
+
name: "table_name";
|
|
1290
|
+
tableName: string;
|
|
1291
|
+
dataType: "string";
|
|
1292
|
+
columnType: "SQLiteText";
|
|
1293
|
+
data: string;
|
|
1294
|
+
driverParam: string;
|
|
1295
|
+
notNull: true;
|
|
1296
|
+
hasDefault: false;
|
|
1297
|
+
isPrimaryKey: false;
|
|
1298
|
+
isAutoincrement: false;
|
|
1299
|
+
hasRuntimeDefault: false;
|
|
1300
|
+
enumValues: [string, ...string[]];
|
|
1301
|
+
baseColumn: never;
|
|
1302
|
+
identity: undefined;
|
|
1303
|
+
generated: undefined;
|
|
1304
|
+
}, {}, {
|
|
1305
|
+
length: number | undefined;
|
|
1306
|
+
}>;
|
|
1307
|
+
recordId: drizzle_orm_sqlite_core.SQLiteColumn<{
|
|
1308
|
+
name: "record_id";
|
|
1309
|
+
tableName: string;
|
|
1310
|
+
dataType: "string";
|
|
1311
|
+
columnType: "SQLiteText";
|
|
1312
|
+
data: string;
|
|
1313
|
+
driverParam: string;
|
|
1314
|
+
notNull: true;
|
|
1315
|
+
hasDefault: false;
|
|
1316
|
+
isPrimaryKey: false;
|
|
1317
|
+
isAutoincrement: false;
|
|
1318
|
+
hasRuntimeDefault: false;
|
|
1319
|
+
enumValues: [string, ...string[]];
|
|
1320
|
+
baseColumn: never;
|
|
1321
|
+
identity: undefined;
|
|
1322
|
+
generated: undefined;
|
|
1323
|
+
}, {}, {
|
|
1324
|
+
length: number | undefined;
|
|
1325
|
+
}>;
|
|
1326
|
+
action: drizzle_orm_sqlite_core.SQLiteColumn<{
|
|
1327
|
+
name: "action";
|
|
1328
|
+
tableName: string;
|
|
1329
|
+
dataType: "string";
|
|
1330
|
+
columnType: "SQLiteText";
|
|
1331
|
+
data: string;
|
|
1332
|
+
driverParam: string;
|
|
1333
|
+
notNull: true;
|
|
1334
|
+
hasDefault: false;
|
|
1335
|
+
isPrimaryKey: false;
|
|
1336
|
+
isAutoincrement: false;
|
|
1337
|
+
hasRuntimeDefault: false;
|
|
1338
|
+
enumValues: [string, ...string[]];
|
|
1339
|
+
baseColumn: never;
|
|
1340
|
+
identity: undefined;
|
|
1341
|
+
generated: undefined;
|
|
1342
|
+
}, {}, {
|
|
1343
|
+
length: number | undefined;
|
|
1344
|
+
}>;
|
|
1345
|
+
timestamp: drizzle_orm_sqlite_core.SQLiteColumn<{
|
|
1346
|
+
name: "timestamp";
|
|
1347
|
+
tableName: string;
|
|
1348
|
+
dataType: "number";
|
|
1349
|
+
columnType: "SQLiteInteger";
|
|
1350
|
+
data: number;
|
|
1351
|
+
driverParam: number;
|
|
1352
|
+
notNull: true;
|
|
1353
|
+
hasDefault: false;
|
|
1354
|
+
isPrimaryKey: false;
|
|
1355
|
+
isAutoincrement: false;
|
|
1356
|
+
hasRuntimeDefault: false;
|
|
1357
|
+
enumValues: undefined;
|
|
1358
|
+
baseColumn: never;
|
|
1359
|
+
identity: undefined;
|
|
1360
|
+
generated: undefined;
|
|
1361
|
+
}, {}, {}>;
|
|
1362
|
+
userId: drizzle_orm_sqlite_core.SQLiteColumn<{
|
|
1363
|
+
name: "user_id";
|
|
1364
|
+
tableName: string;
|
|
1365
|
+
dataType: "string";
|
|
1366
|
+
columnType: "SQLiteText";
|
|
1367
|
+
data: string;
|
|
1368
|
+
driverParam: string;
|
|
1369
|
+
notNull: false;
|
|
1370
|
+
hasDefault: false;
|
|
1371
|
+
isPrimaryKey: false;
|
|
1372
|
+
isAutoincrement: false;
|
|
1373
|
+
hasRuntimeDefault: false;
|
|
1374
|
+
enumValues: [string, ...string[]];
|
|
1375
|
+
baseColumn: never;
|
|
1376
|
+
identity: undefined;
|
|
1377
|
+
generated: undefined;
|
|
1378
|
+
}, {}, {
|
|
1379
|
+
length: number | undefined;
|
|
1380
|
+
}>;
|
|
1381
|
+
record: drizzle_orm_sqlite_core.SQLiteColumn<{
|
|
1382
|
+
name: "record";
|
|
1383
|
+
tableName: string;
|
|
1384
|
+
dataType: "string";
|
|
1385
|
+
columnType: "SQLiteText";
|
|
1386
|
+
data: string;
|
|
1387
|
+
driverParam: string;
|
|
1388
|
+
notNull: false;
|
|
1389
|
+
hasDefault: false;
|
|
1390
|
+
isPrimaryKey: false;
|
|
1391
|
+
isAutoincrement: false;
|
|
1392
|
+
hasRuntimeDefault: false;
|
|
1393
|
+
enumValues: [string, ...string[]];
|
|
1394
|
+
baseColumn: never;
|
|
1395
|
+
identity: undefined;
|
|
1396
|
+
generated: undefined;
|
|
1397
|
+
}, {}, {
|
|
1398
|
+
length: number | undefined;
|
|
1399
|
+
}>;
|
|
1400
|
+
previousRecord: drizzle_orm_sqlite_core.SQLiteColumn<{
|
|
1401
|
+
name: "previous_record";
|
|
1402
|
+
tableName: string;
|
|
1403
|
+
dataType: "string";
|
|
1404
|
+
columnType: "SQLiteText";
|
|
1405
|
+
data: string;
|
|
1406
|
+
driverParam: string;
|
|
1407
|
+
notNull: false;
|
|
1408
|
+
hasDefault: false;
|
|
1409
|
+
isPrimaryKey: false;
|
|
1410
|
+
isAutoincrement: false;
|
|
1411
|
+
hasRuntimeDefault: false;
|
|
1412
|
+
enumValues: [string, ...string[]];
|
|
1413
|
+
baseColumn: never;
|
|
1414
|
+
identity: undefined;
|
|
1415
|
+
generated: undefined;
|
|
1416
|
+
}, {}, {
|
|
1417
|
+
length: number | undefined;
|
|
1418
|
+
}>;
|
|
1419
|
+
changes: drizzle_orm_sqlite_core.SQLiteColumn<{
|
|
1420
|
+
name: "changes";
|
|
1421
|
+
tableName: string;
|
|
1422
|
+
dataType: "string";
|
|
1423
|
+
columnType: "SQLiteText";
|
|
1424
|
+
data: string;
|
|
1425
|
+
driverParam: string;
|
|
1426
|
+
notNull: false;
|
|
1427
|
+
hasDefault: false;
|
|
1428
|
+
isPrimaryKey: false;
|
|
1429
|
+
isAutoincrement: false;
|
|
1430
|
+
hasRuntimeDefault: false;
|
|
1431
|
+
enumValues: [string, ...string[]];
|
|
1432
|
+
baseColumn: never;
|
|
1433
|
+
identity: undefined;
|
|
1434
|
+
generated: undefined;
|
|
1435
|
+
}, {}, {
|
|
1436
|
+
length: number | undefined;
|
|
1437
|
+
}>;
|
|
1438
|
+
metadata: drizzle_orm_sqlite_core.SQLiteColumn<{
|
|
1439
|
+
name: "metadata";
|
|
1440
|
+
tableName: string;
|
|
1441
|
+
dataType: "string";
|
|
1442
|
+
columnType: "SQLiteText";
|
|
1443
|
+
data: string;
|
|
1444
|
+
driverParam: string;
|
|
1445
|
+
notNull: false;
|
|
1446
|
+
hasDefault: false;
|
|
1447
|
+
isPrimaryKey: false;
|
|
1448
|
+
isAutoincrement: false;
|
|
1449
|
+
hasRuntimeDefault: false;
|
|
1450
|
+
enumValues: [string, ...string[]];
|
|
1451
|
+
baseColumn: never;
|
|
1452
|
+
identity: undefined;
|
|
1453
|
+
generated: undefined;
|
|
1454
|
+
}, {}, {
|
|
1455
|
+
length: number | undefined;
|
|
1456
|
+
}>;
|
|
1457
|
+
};
|
|
1458
|
+
dialect: "sqlite";
|
|
1459
|
+
}>;
|
|
1460
|
+
|
|
1185
1461
|
/**
|
|
1186
1462
|
* Drizzle-Zod schema utilities.
|
|
1187
1463
|
*
|
|
@@ -1349,4 +1625,4 @@ declare function isDrizzleZodAvailable(): boolean;
|
|
|
1349
1625
|
*/
|
|
1350
1626
|
declare const DrizzleAdapters: AdapterBundle;
|
|
1351
1627
|
|
|
1352
|
-
export { type CountRow, type CreateDrizzleCrudOptions, DRIZZLE_DIALECTS, type Database, DrizzleAdapters, DrizzleAggregateEndpoint, DrizzleBatchCreateEndpoint, DrizzleBatchDeleteEndpoint, DrizzleBatchRestoreEndpoint, DrizzleBatchUpdateEndpoint, DrizzleBatchUpsertEndpoint, DrizzleBulkPatchEndpoint, DrizzleCloneEndpoint, type DrizzleColumn, DrizzleCreateEndpoint, type DrizzleCrudClasses, type DrizzleDatabaseConstraint, DrizzleDeleteEndpoint, type DrizzleDialect, type DrizzleEnv, DrizzleExportEndpoint, DrizzleImportEndpoint, DrizzleListEndpoint, DrizzleReadEndpoint, DrizzleRestoreEndpoint, type DrizzleSchemas, DrizzleSearchEndpoint, type DrizzleSql, type DrizzleTable, DrizzleUpdateEndpoint, DrizzleUpsertEndpoint, DrizzleVersionCompareEndpoint, DrizzleVersionHistoryEndpoint, DrizzleVersionReadEndpoint, DrizzleVersionRollbackEndpoint, DrizzleVersioningStorage, type DrizzleVersioningStorageOptions, type QueryBuilder, batchLoadDrizzleRelations, buildWhereCondition, cast, createDrizzleCrud, createDrizzleSchemas, createInsertSchema, createSelectSchema, createUpdateSchema, getColumn, getTable, isDrizzleZodAvailable, loadDrizzleRelation, loadDrizzleRelations, readCount, sqliteVersionHistoryTable, substringMatch };
|
|
1628
|
+
export { type CountRow, type CreateDrizzleCrudOptions, DRIZZLE_DIALECTS, type Database, DrizzleAdapters, DrizzleAggregateEndpoint, DrizzleAuditLogStorage, type DrizzleAuditLogStorageOptions, DrizzleBatchCreateEndpoint, DrizzleBatchDeleteEndpoint, DrizzleBatchRestoreEndpoint, DrizzleBatchUpdateEndpoint, DrizzleBatchUpsertEndpoint, DrizzleBulkPatchEndpoint, DrizzleCloneEndpoint, type DrizzleColumn, DrizzleCreateEndpoint, type DrizzleCrudClasses, type DrizzleDatabaseConstraint, DrizzleDeleteEndpoint, type DrizzleDialect, type DrizzleEnv, DrizzleExportEndpoint, DrizzleImportEndpoint, DrizzleListEndpoint, DrizzleReadEndpoint, DrizzleRestoreEndpoint, type DrizzleSchemas, DrizzleSearchEndpoint, type DrizzleSql, type DrizzleTable, DrizzleUpdateEndpoint, DrizzleUpsertEndpoint, DrizzleVersionCompareEndpoint, DrizzleVersionHistoryEndpoint, DrizzleVersionReadEndpoint, DrizzleVersionRollbackEndpoint, DrizzleVersioningStorage, type DrizzleVersioningStorageOptions, type QueryBuilder, batchLoadDrizzleRelations, buildWhereCondition, cast, createDrizzleCrud, createDrizzleSchemas, createInsertSchema, createSelectSchema, createUpdateSchema, getColumn, getTable, isDrizzleZodAvailable, loadDrizzleRelation, loadDrizzleRelations, readCount, sqliteAuditLogTable, sqliteVersionHistoryTable, substringMatch };
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {getTableColumns,between,isNull,isNotNull,notInArray,inArray,lte,lt,gte,gt,ne as ne$1,eq,sql,and,desc,asc,or}from'drizzle-orm';import {resolveRelationValueAsync,loadRelationsForItem,batchLoadRelations,assertNever,CreateEndpoint,getLogger,ReadEndpoint,UpdateEndpoint,DeleteEndpoint,ListEndpoint,buildIncludeOptions,buildCursorPage,buildOffsetPageInfo,RestoreEndpoint,BatchCreateEndpoint,BatchUpdateEndpoint,BatchDeleteEndpoint,BatchRestoreEndpoint,UpsertEndpoint,BatchUpsertEndpoint,BulkPatchEndpoint,VersionHistoryEndpoint,VersionReadEndpoint,VersionCompareEndpoint,VersionRollbackEndpoint,AggregateEndpoint,isFilterOperator,computeAggregations,SearchEndpoint,searchInMemory,ExportEndpoint,ImportEndpoint,CloneEndpoint,CONTEXT_KEYS,ConfigurationException,decodeCursor}from'hono-crud/internal';import {sqliteTable,text,integer}from'drizzle-orm/sqlite-core';import {z}from'zod';function
|
|
1
|
+
import {getTableColumns,between,isNull,isNotNull,notInArray,inArray,lte,lt,gte,gt,ne as ne$1,eq,sql,and,desc,asc,or}from'drizzle-orm';import {resolveRelationValueAsync,loadRelationsForItem,batchLoadRelations,assertNever,CreateEndpoint,getLogger,ReadEndpoint,UpdateEndpoint,DeleteEndpoint,ListEndpoint,buildIncludeOptions,buildCursorPage,buildOffsetPageInfo,RestoreEndpoint,BatchCreateEndpoint,BatchUpdateEndpoint,BatchDeleteEndpoint,BatchRestoreEndpoint,UpsertEndpoint,BatchUpsertEndpoint,BulkPatchEndpoint,VersionHistoryEndpoint,VersionReadEndpoint,VersionCompareEndpoint,VersionRollbackEndpoint,AggregateEndpoint,isFilterOperator,computeAggregations,SearchEndpoint,searchInMemory,ExportEndpoint,ImportEndpoint,CloneEndpoint,CONTEXT_KEYS,ConfigurationException,decodeCursor}from'hono-crud/internal';import {sqliteTable,text,integer}from'drizzle-orm/sqlite-core';import {z}from'zod';function m(o){let e=o;if(e._tx)return e._tx;if(e.db)return e.db;let t=e.context?.get?.(CONTEXT_KEYS.db);if(t)return t;throw new ConfigurationException(`Database not configured. Either:
|
|
2
2
|
1. Set db property: db = myDb;
|
|
3
3
|
2. Use middleware: c.set(CONTEXT_KEYS.db, myDb);
|
|
4
|
-
3. Use factory: createDrizzleCrud(db, meta)`)}function H(o){return o}function J(o,e){return g(o).transaction(async t=>{o._tx=t;try{return await e()}finally{o._tx=void 0;}})}function m(...o){return and(...o)}function ne(...o){return or(...o)}function R(o,e,t){e.enabled&&o.push(isNull(t(e.field)));}var Ge=["sqlite","pg","mysql"];function b(o){if(!o.model.table)throw new Error(`Model ${o.model.tableName} does not have a table reference`);return o.model.table}function p(o,e){let t=getTableColumns(o),n=t[e];if(!n)throw new Error(`Column '${e}' not found in table. Available columns: ${Object.keys(t).join(", ")}`);return n}function fe(o){return {resolveRelation:e=>e.table??null,fetchRelated:(e,t,n,r)=>{let i=[inArray(p(e,t),n)];return r?.tenantField!=null&&r.tenantValue!=null&&i.push(eq(p(e,r.tenantField),r.tenantValue)),r?.excludeDeletedField!=null&&i.push(isNull(p(e,r.excludeDeletedField))),o.select().from(e).where(i.length===1?i[0]:and(...i))}}}async function et(o,e,t,n){let r=n.table;if(!r)return e;let i=fe(o),s=await resolveRelationValueAsync(e,n,r,i.fetchRelated);return {...e,[t]:s}}async function Ce(o,e,t,n){return loadRelationsForItem(e,t,fe(o),n)}async function k(o,e,t,n){return batchLoadRelations(e,t,fe(o),n)}function X(o,e,t="sqlite"){let n=p(o,e.field);switch(e.operator){case "eq":return eq(n,e.value);case "ne":return ne$1(n,e.value);case "gt":return gt(n,e.value);case "gte":return gte(n,e.value);case "lt":return lt(n,e.value);case "lte":return lte(n,e.value);case "in":return inArray(n,e.value);case "nin":return notInArray(n,e.value);case "like":return P(n,String(e.value).replace(/%/g,""),t,{caseSensitive:true});case "ilike":return P(n,String(e.value).replace(/%/g,""),t);case "null":return e.value?isNull(n):isNotNull(n);case "between":{let[r,i]=e.value;return between(n,r,i)}default:return assertNever(e.operator)}}function B(o){return Number(o[0]?.count)||0}async function Y(o){let{db:e,table:t,filters:n,dialect:r,searchFields:i=[],softDeleteConfig:s,defaultPerPage:a=20,extraConditions:l=[],cursorField:c}=o,u=[];if(s?.enabled){let M=p(t,s.field);n.options.onlyDeleted?u.push(isNotNull(M)):n.options.withDeleted||u.push(isNull(M));}for(let M of n.filters){let S=X(t,M,r);S&&u.push(S);}if(n.options.search&&i.length>0){let M=n.options.search,S=i.map(Ie=>P(p(t,Ie),M,r));u.push(ne(...S));}u.push(...l);let d=u.length>0?m(...u):void 0,h=await e.select({count:sql`count(*)`}).from(t).where(d),f=B(h),D=c!==void 0&&(n.options.cursor!==void 0||n.options.limit!==void 0),C=d,w=false;if(D&&n.options.cursor){let M=decodeCursor(n.options.cursor);M!==null&&(C=m(d,gt(p(t,c),M)),w=true);}let y=e.select().from(t).where(C);if(n.options.order_by){let M=p(t,n.options.order_by),S=n.options.order_by_direction==="desc"?desc:asc;y=y.orderBy(S(M));}if(D){let M=n.options.limit||n.options.per_page||a;return {records:await y.limit(M+1),totalCount:f,page:0,perPage:M,totalPages:0,cursor:{limit:M,applied:w}}}let E=n.options.page||1,v=n.options.per_page||a,ee=await y.limit(v).offset((E-1)*v),W=Math.ceil(f/v);return {records:ee,totalCount:f,page:E,perPage:v,totalPages:W}}async function re(o,e,t,n,r){let i=[];for(let a of r){let l=n[a];l!==void 0&&i.push(eq(t(a),l));}return i.length===0?null:(await o.select().from(e).where(m(...i)).limit(1))[0]||null}function P(o,e,t,n){if(n?.caseSensitive)switch(t){case "pg":return sql`POSITION(${e} IN ${o}) > 0`;case "mysql":return sql`LOCATE(${e}, ${o}) > 0`;default:return sql`INSTR(${o}, ${e}) > 0`}switch(t){case "pg":return sql`POSITION(LOWER(${e}) IN LOWER(${o})) > 0`;case "mysql":return sql`LOCATE(LOWER(${e}), LOWER(${o})) > 0`;default:return sql`INSTR(LOWER(${o}), LOWER(${e})) > 0`}}var I=class extends CreateEndpoint{db;useTransaction=false;getDb(){return g(this)}getTable(){return b(this._meta)}getRelatedTable(e){return e.table}async create(e,t){let n=t??this.getDb(),r=this.getTable(),i=this.applyManagedInsertFields(e,"drizzle");return (await n.insert(r).values(i).returning())[0]}async createNested(e,t,n,r,i){let s=i??this.getDb(),a=this.getRelatedTable(n);if(!a)return getLogger().warn(`Related table not found for ${t}. Add 'table' to the relation config.`),[];let l=Array.isArray(r)?r:[r],c=[];for(let u of l){if(typeof u!="object"||u===null)continue;let d={...u,id:crypto.randomUUID(),[n.foreignKey]:e},h=await s.insert(a).values(d).returning();h[0]&&c.push(h[0]);}return c}async handle(){return this.useTransaction?J(this,()=>super.handle()):super.handle()}},_=class extends ReadEndpoint{db;getDb(){return g(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async read(e,t,n){let r=this.getTable(),i=this.getColumn(this.lookupField),s=this.getSoftDeleteConfig(),a=[eq(i,e)];if(t)for(let[u,d]of Object.entries(t))a.push(eq(this.getColumn(u),d));R(a,s,u=>this.getColumn(u));let l=await this.getDb().select().from(r).where(m(...a)).limit(1);return l[0]?await Ce(this.getDb(),l[0],this._meta,n):null}},A=class extends UpdateEndpoint{db;useTransaction=false;getDb(){return g(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}getRelatedTable(e){return e.table}async findExisting(e,t,n){let r=n??this.getDb(),i=this.getTable(),s=this.getColumn(this.lookupField),a=this.getSoftDeleteConfig(),l=[eq(s,e)];if(t)for(let[u,d]of Object.entries(t))l.push(eq(this.getColumn(u),d));return R(l,a,u=>this.getColumn(u)),(await r.select().from(i).where(m(...l)).limit(1))[0]||null}async update(e,t,n,r){let i=r??this.getDb(),s=this.getTable(),a=this.getColumn(this.lookupField),l=this.getSoftDeleteConfig(),c=[eq(a,e)];if(n)for(let[d,h]of Object.entries(n))c.push(eq(this.getColumn(d),h));return R(c,l,d=>this.getColumn(d)),(await i.update(s).set(this.applyManagedUpdateFields(t)).where(m(...c)).returning())[0]||null}async processNestedWrites(e,t,n,r,i){let s=i??this.getDb(),a=this.getRelatedTable(n);if(!a)return getLogger().warn(`Related table not found for ${t}. Add 'table' to the relation config.`),{created:[],updated:[],deleted:[],connected:[],disconnected:[]};let l={created:[],updated:[],deleted:[],connected:[],disconnected:[]},c=p(a,n.foreignKey),u=p(a,"id");if(r.create){let d=Array.isArray(r.create)?r.create:[r.create];for(let h of d){if(typeof h!="object"||h===null)continue;let f={...h,id:crypto.randomUUID(),[n.foreignKey]:e},D=await s.insert(a).values(f).returning();D[0]&&l.created.push(D[0]);}}if(r.update)for(let d of r.update){if(!d.id||!(await s.select().from(a).where(m(eq(u,d.id),eq(c,e))).limit(1))[0])continue;let{id:f,...D}=d,C=await s.update(a).set(D).where(eq(u,f)).returning();C[0]&&l.updated.push(C[0]);}if(r.delete)for(let d of r.delete)(await s.delete(a).where(m(eq(u,d),eq(c,e))).returning())[0]&&l.deleted.push(d);if(r.connect)for(let d of r.connect)(await s.update(a).set({[n.foreignKey]:e}).where(eq(u,d)).returning())[0]&&l.connected.push(d);if(r.disconnect)for(let d of r.disconnect)(await s.update(a).set({[n.foreignKey]:null}).where(m(eq(u,d),eq(c,e))).returning())[0]&&l.disconnected.push(d);return l}async handle(){return this.useTransaction?J(this,()=>super.handle()):super.handle()}},q=class extends DeleteEndpoint{db;useTransaction=false;getDb(){return g(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}getRelatedTable(e){return e.table}async findForDelete(e,t,n){let r=n??this.getDb(),i=this.getTable(),s=this.getColumn(this.lookupField),a=this.getSoftDeleteConfig(),l=[eq(s,e)];if(t)for(let[u,d]of Object.entries(t))l.push(eq(this.getColumn(u),d));return R(l,a,u=>this.getColumn(u)),(await r.select().from(i).where(m(...l)).limit(1))[0]||null}async delete(e,t,n){let r=n??this.getDb(),i=this.getTable(),s=this.getColumn(this.lookupField),a=this.getSoftDeleteConfig(),l=[eq(s,e)];if(t)for(let[c,u]of Object.entries(t))l.push(eq(this.getColumn(c),u));return R(l,a,c=>this.getColumn(c)),a.enabled?(await r.update(i).set({[a.field]:new Date}).where(m(...l)).returning())[0]||null:(await r.delete(i).where(m(...l)).returning())[0]||null}async countRelated(e,t,n,r){let i=r??this.getDb(),s=this.getRelatedTable(n);if(!s)return 0;let a=p(s,n.foreignKey),l=await i.select({count:sql`count(*)`}).from(s).where(eq(a,e));return B(l)}async deleteRelated(e,t,n,r){let i=r??this.getDb(),s=this.getRelatedTable(n);if(!s)return 0;let a=p(s,n.foreignKey);return (await i.delete(s).where(eq(a,e)).returning()).length}async nullifyRelated(e,t,n,r){let i=r??this.getDb(),s=this.getRelatedTable(n);if(!s)return 0;let a=p(s,n.foreignKey);return (await i.update(s).set({[n.foreignKey]:null}).where(eq(a,e)).returning()).length}async handle(){return this.useTransaction?J(this,()=>super.handle()):super.handle()}},F=class extends ListEndpoint{db;dialect="sqlite";supportsCursorPagination=true;getDb(){return g(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async list(e){let t=await Y({db:this.getDb(),table:this.getTable(),filters:e,dialect:this.dialect,searchFields:this.searchFields,softDeleteConfig:this.getSoftDeleteConfig(),defaultPerPage:this.defaultPerPage,cursorField:this.isCursorPaginationActive()?this.cursorField||"id":void 0}),n=buildIncludeOptions(e.options.include,this.getRelationScope(e.options.withDeleted));if(t.cursor){let{items:i,result_info:s}=buildCursorPage({rows:t.records,limit:t.cursor.limit,totalCount:t.totalCount,cursorField:this.cursorField||"id",cursorApplied:t.cursor.applied});return {result:await k(this.getDb(),i,this._meta,n),result_info:s}}return {result:await k(this.getDb(),t.records,this._meta,n),result_info:buildOffsetPageInfo({page:t.page,perPage:t.perPage,totalCount:t.totalCount})}}},U=class extends RestoreEndpoint{db;useTransaction=false;getDb(){return g(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async restore(e,t,n){let r=n??this.getDb(),i=this.getTable(),s=this.getColumn(this.lookupField),a=this.getSoftDeleteConfig(),l=[eq(s,e)];if(t)for(let[u,d]of Object.entries(t))l.push(eq(this.getColumn(u),d));return l.push(isNotNull(this.getColumn(a.field))),(await r.update(i).set({[a.field]:null}).where(m(...l)).returning())[0]||null}async handle(){return this.useTransaction?J(this,()=>super.handle()):super.handle()}};var Z=class extends BatchCreateEndpoint{db;getDb(){return g(this)}getTable(){return b(this._meta)}async batchCreate(e){let t=this.getTable(),n=e.map(i=>this.applyManagedInsertFields(i,"drizzle"));return await this.getDb().insert(t).values(n).returning()}},L=class extends BatchUpdateEndpoint{db;getDb(){return g(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async batchUpdate(e){let t=this.getTable(),n=this.getColumn(this.lookupField),r=this.getSoftDeleteConfig(),i=[],s=[],a=this.getTenantScopeFilter();for(let l of e){let c=[eq(n,l.id)];R(c,r,d=>this.getColumn(d)),a&&c.push(eq(this.getColumn(a.field),a.value));let u=await this.getDb().update(t).set(this.applyManagedUpdateFields(l.data)).where(m(...c)).returning();u[0]?i.push(u[0]):s.push(l.id);}return {updated:i,notFound:s}}},N=class extends BatchDeleteEndpoint{db;getDb(){return g(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async batchDelete(e){let t=this.getTable(),n=this.getColumn(this.lookupField),r=this.getSoftDeleteConfig(),i=[inArray(n,e)];R(i,r,d=>this.getColumn(d));let s=this.getTenantScopeFilter();s&&i.push(eq(this.getColumn(s.field),s.value));let a;r.enabled?a=await this.getDb().update(t).set({[r.field]:new Date}).where(m(...i)).returning():a=await this.getDb().delete(t).where(m(...i)).returning();let l=a,c=new Set(l.map(d=>String(d[this.lookupField]))),u=e.filter(d=>!c.has(d));return {deleted:l,notFound:u}}},V=class extends BatchRestoreEndpoint{db;getDb(){return g(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async batchRestore(e){let t=this.getTable(),n=this.getColumn(this.lookupField),r=this.getSoftDeleteConfig(),i=[inArray(n,e),isNotNull(this.getColumn(r.field))],s=this.getTenantScopeFilter();s&&i.push(eq(this.getColumn(s.field),s.value));let l=await this.getDb().update(t).set({[r.field]:null}).where(m(...i)).returning(),c=new Set(l.map(d=>String(d[this.lookupField]))),u=e.filter(d=>!c.has(d));return {restored:l,notFound:u}}};function Pt(o){return o.split(/\s+/).filter(e=>e.length>0)}var K=class extends UpsertEndpoint{db;dialect="sqlite";getDb(){return g(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async findExisting(e){return re(this.getDb(),this.getTable(),t=>this.getColumn(t),e,this.getUpsertKeys())}async create(e){let t=this.getTable(),n=this.applyManagedInsertFields(e,"drizzle");return (await this.getDb().insert(t).values(n).returning())[0]}async update(e,t){let n=this.getTable(),r=this._meta.model.primaryKeys[0],i=e[r];return (await this.getDb().update(n).set(this.applyManagedUpdateFields(t)).where(eq(this.getColumn(r),i)).returning())[0]}async nativeUpsert(e,t){let n=this.getTable(),r=this.getUpsertKeys(),i=this._meta.model.primaryKeys[0],s=this.getSoftDeleteConfig(),a=this.getTimestampsConfig(),l=this.applyManagedInsertFields(e,"drizzle"),c={};for(let[C,w]of Object.entries(e))!r.includes(C)&&C!==i&&(this.createOnlyFields?.includes(C)||(c[C]=w));a.enabled&&(c[a.updatedAt]=Date.now());let u=r.map(C=>this.getColumn(C)),d;s.enabled&&(d=isNull(this.getColumn(s.field)));let h=Object.keys(c).length>0?c:{[i]:sql`${this.getColumn(i)}`},f=this.getDb().insert(n).values(l);return this.dialect==="mysql"?{data:(await f.onDuplicateKeyUpdate({set:h}).returning())[0],created:false}:{data:(await f.onConflictDoUpdate({target:u,set:h,where:d}).returning())[0],created:false}}},$=class extends BatchUpsertEndpoint{db;dialect="sqlite";getDb(){return g(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async findExisting(e){return re(this.getDb(),this.getTable(),t=>this.getColumn(t),e,this.getUpsertKeys())}async create(e){let t=this.getTable(),n=this.applyManagedInsertFields(e,"drizzle");return (await this.getDb().insert(t).values(n).returning())[0]}async update(e,t){let n=this.getTable(),r=this._meta.model.primaryKeys[0],i=e[r];return (await this.getDb().update(n).set(this.applyManagedUpdateFields(t)).where(eq(this.getColumn(r),i)).returning())[0]}async nativeBatchUpsert(e,t){if(e.length===0)return {items:[],createdCount:0,updatedCount:0,totalCount:0};let n=this.getTable(),r=this.getUpsertKeys(),i=this._meta.model.primaryKeys[0],s=this.getTimestampsConfig(),a=e.map(D=>this.applyManagedInsertFields(D,"drizzle")),l={},c=e[0];for(let D of Object.keys(c))!r.includes(D)&&D!==i&&(this.createOnlyFields?.includes(D)||(l[D]=sql`excluded.${sql.identifier(D)}`));s.enabled&&(l[s.updatedAt]=Date.now());let u=r.map(D=>this.getColumn(D)),d=Object.keys(l).length>0?l:{[i]:sql`${this.getColumn(i)}`},h=this.getDb().insert(n).values(a),f=await(this.dialect==="mysql"?h.onDuplicateKeyUpdate({set:d}):h.onConflictDoUpdate({target:u,set:d})).returning();return {items:f.map((D,C)=>({data:D,created:false,index:C})),createdCount:0,updatedCount:f.length,totalCount:f.length}}},ie=class extends BulkPatchEndpoint{db;dialect="sqlite";getDb(){return g(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}buildConditions(e){let t=this.getTable(),n=[];for(let i of e.filters){let s=X(t,i,this.dialect);s&&n.push(s);}let r=this.getSoftDeleteConfig();return R(n,r,i=>this.getColumn(i)),n}async countMatching(e){let t=this.buildConditions(e),n=await this.getDb().select({count:sql`count(*)`}).from(this.getTable()).where(m(...t));return B(n)}async applyPatch(e,t){let n=this.buildConditions(t),r=await this.getDb().update(this.getTable()).set(this.applyManagedUpdateFields(e)).where(m(...n)).returning();return {updated:r.length,records:r}}};async function me(o,e,t,n,r){let i=r?m(eq(t,n),eq(p(e,r.field),r.value)):eq(t,n),s=await o.select({count:sql`count(*)`}).from(e).where(i);return B(s)>0}var se=class extends VersionHistoryEndpoint{db;getDb(){return g(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async recordExists(e,t){return me(this.getDb(),this.getTable(),this.getColumn("id"),e,t)}},ae=class extends VersionReadEndpoint{db;getDb(){return g(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async recordExists(e,t){return me(this.getDb(),this.getTable(),this.getColumn("id"),e,t)}},le=class extends VersionCompareEndpoint{db;getDb(){return g(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async recordExists(e,t){return me(this.getDb(),this.getTable(),this.getColumn("id"),e,t)}},de=class extends VersionRollbackEndpoint{db;getDb(){return g(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async recordExists(e,t){return me(this.getDb(),this.getTable(),this.getColumn("id"),e,t)}async rollback(e,t,n){let r=this.getTable(),i=this.getVersioningConfig().field;return (await this.getDb().update(r).set({...t,[i]:n}).where(eq(this.getColumn("id"),e)).returning())[0]}},ce=class extends AggregateEndpoint{db;dialect="sqlite";getDb(){return g(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async aggregate(e){let t=this.getTable(),n=[],r=this.getSoftDeleteConfig();if(r.enabled){let{query:a}=await this.getValidatedData();a?.withDeleted===true||a?.withDeleted==="true"||R(n,r,c=>this.getColumn(c));}if(e.filters)for(let[a,l]of Object.entries(e.filters))if(typeof l=="object"&&l!==null)for(let[c,u]of Object.entries(l)){if(!isFilterOperator(c)){n.push(sql`1 = 0`);continue}let d=X(t,{field:a,operator:c,value:u},this.dialect);d&&n.push(d);}else n.push(eq(this.getColumn(a),l));let i=n.length>0?m(...n):void 0,s=await this.getDb().select().from(t).where(i);return computeAggregations(s,e)}},Q=class extends SearchEndpoint{db;dialect="sqlite";getDb(){return g(this)}useNativeSearch=false;vectorColumn;vectorConfig="english";getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async search(e,t){let n=this.getTable(),r=[],i=this.getSearchableFields(),s=e.fields||Object.keys(i);if(this.useNativeSearch&&this.vectorColumn){let w=this.getColumn(this.vectorColumn),y=e.mode==="phrase"?sql`phraseto_tsquery(${this.vectorConfig}, ${e.query})`:e.mode==="all"?sql`plainto_tsquery(${this.vectorConfig}, ${e.query})`:sql`to_tsquery(${this.vectorConfig}, ${e.query.split(/\s+/).join(" | ")})`;r.push(sql`${w} @@ ${y}`);}else {let w=(y,E)=>{try{let v=this.getColumn(y);return P(sql`CAST(${v} AS TEXT)`,E,this.dialect)}catch{return}};if(e.mode==="all"){let y=Pt(e.query);if(y.length>0){let E=[];for(let v of y){let ee=s.map(W=>w(W,v)).filter(W=>W!==void 0);ee.length>0&&E.push(ne(...ee));}E.length>0&&r.push(m(...E));}}else {let y=s.map(E=>w(E,e.query)).filter(E=>E!==void 0);y.length>0&&r.push(ne(...y));}}let a=await Y({db:this.getDb(),table:n,filters:t,dialect:this.dialect,softDeleteConfig:this.getSoftDeleteConfig(),defaultPerPage:this.defaultPerPage,extraConditions:r}),l=a.records,c=a.totalCount,u=e.mode==="all"?{...e,mode:"any"}:e,d=searchInMemory(l,u,i),h=buildIncludeOptions(t.options.include,this.getRelationScope(t.options.withDeleted)),f=d.map(w=>w.item),D=await k(this.getDb(),f,this._meta,h);return {items:d.map((w,y)=>({...w,item:D[y]})),totalCount:c}}},ue=class extends ExportEndpoint{db;dialect="sqlite";getDb(){return g(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async list(e){let t=await Y({db:this.getDb(),table:this.getTable(),filters:e,dialect:this.dialect,searchFields:this.searchFields,softDeleteConfig:this.getSoftDeleteConfig(),defaultPerPage:this.defaultPerPage}),n=buildIncludeOptions(e.options.include,this.getRelationScope(e.options.withDeleted));return {result:await k(this.getDb(),t.records,this._meta,n),result_info:buildOffsetPageInfo({page:t.page,perPage:t.perPage,totalCount:t.totalCount})}}},pe=class extends ImportEndpoint{db;getDb(){return g(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async findExisting(e){return re(this.getDb(),this.getTable(),t=>this.getColumn(t),e,this.getUpsertKeys())}async create(e){let t=this.getTable(),n=this.applyManagedInsertFields(e,"drizzle");return (await this.getDb().insert(t).values(n).returning())[0]}async update(e,t){let n=this.getTable(),r=this._meta.model.primaryKeys[0],i=e[r];return (await this.getDb().update(n).set(this.applyManagedUpdateFields(t)).where(eq(this.getColumn(r),i)).returning())[0]}},ge=class extends CloneEndpoint{db;getDb(){return g(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}generateId(){return crypto.randomUUID()}async findSource(e,t){let n=this.getTable(),r=this.getColumn(this.lookupField),i=this.getSoftDeleteConfig(),s=[eq(r,e)];if(t)for(let[l,c]of Object.entries(t))s.push(eq(this.getColumn(l),c));R(s,i,l=>this.getColumn(l));let a=await this.getDb().select().from(n).where(m(...s)).limit(1);return a[0]?a[0]:null}async createClone(e){let t=this.getTable(),n=this.applyManagedInsertFields(e,"drizzle",()=>this.generateId());return (await this.getDb().insert(t).values(n).returning())[0]}};function _n(o,e,t){let n=t?.dialect??"sqlite";return {Create:class extends I{_meta=e;db=o},Read:class extends _{_meta=e;db=o},Update:class extends A{_meta=e;db=o},Delete:class extends q{_meta=e;db=o},List:class extends F{_meta=e;db=o;dialect=n},Restore:class extends U{_meta=e;db=o},Upsert:class extends K{_meta=e;db=o;dialect=n},Search:class extends Q{_meta=e;db=o;dialect=n},BatchCreate:class extends Z{_meta=e;db=o},BatchUpdate:class extends L{_meta=e;db=o},BatchDelete:class extends N{_meta=e;db=o},BatchRestore:class extends V{_meta=e;db=o},BatchUpsert:class extends ${_meta=e;db=o;dialect=n}}}var Be=class{db;table;constructor(e){this.db=e.db,this.table=e.table;}col(e){return p(this.table,e)}recordScope(e,t){return and(eq(this.col("resourceTable"),e),eq(this.col("recordId"),String(t)))}toEntry(e){return {id:e.id,recordId:e.recordId,version:e.version,data:JSON.parse(e.data),createdAt:new Date(e.createdAt),...e.changedBy!=null?{changedBy:e.changedBy}:{},...e.changeReason!=null?{changeReason:e.changeReason}:{},...e.changes!=null?{changes:JSON.parse(e.changes)}:{}}}async store(e,t){let n=t.createdAt instanceof Date?t.createdAt:new Date(t.createdAt);await this.db.insert(this.table).values({id:t.id,resourceTable:e,recordId:String(t.recordId),version:t.version,data:JSON.stringify(t.data),createdAt:n.getTime(),changedBy:t.changedBy??null,changeReason:t.changeReason??null,changes:t.changes?JSON.stringify(t.changes):null});}async getByRecordId(e,t,n){let r=this.db.select().from(this.table).where(this.recordScope(e,t)).orderBy(desc(this.col("version")));return (n?.limit!=null||n?.offset!=null)&&(r=r.limit(n?.limit??Number.MAX_SAFE_INTEGER)),n?.offset!=null&&(r=r.offset(n.offset)),(await r).map(s=>this.toEntry(s))}async getVersion(e,t,n){let r=await this.db.select().from(this.table).where(and(this.recordScope(e,t),eq(this.col("version"),n))).limit(1);return r.length>0?this.toEntry(r[0]):null}async getLatestVersion(e,t){let n=await this.db.select().from(this.table).where(this.recordScope(e,t)).orderBy(desc(this.col("version"))).limit(1);return n.length>0?n[0].version:0}async pruneVersions(e,t,n){if(n<=0)return this.deleteAllVersions(e,t);let r=await this.getByRecordId(e,t);if(r.length<=n)return 0;let i=r[n-1].version;return (await this.db.delete(this.table).where(and(this.recordScope(e,t),lt(this.col("version"),i))).returning()).length}async deleteAllVersions(e,t){return (await this.db.delete(this.table).where(this.recordScope(e,t)).returning()).length}};function er(o="version_history"){return sqliteTable(o,{id:text("id").primaryKey(),resourceTable:text("resource_table").notNull(),recordId:text("record_id").notNull(),version:integer("version").notNull(),data:text("data").notNull(),createdAt:integer("created_at").notNull(),changedBy:text("changed_by"),changeReason:text("change_reason"),changes:text("changes")})}var ze=null,je=false,be=null;async function he(){if(je){if(be)throw be;return ze}je=true;try{return ze=await import('drizzle-zod'),ze}catch{throw be=new Error("drizzle-zod is not installed. Please install it: npm install drizzle-zod"),be}}async function At(o,e){return (await he()).createSelectSchema(o,e)}async function qt(o,e){return (await he()).createInsertSchema(o,e)}async function Ft(o,e){let t=await he();return t.createUpdateSchema?t.createUpdateSchema(o,e):t.createInsertSchema(o,e).partial()}async function Ut(o,e){let t=await he(),n=e?.coerceDates!==false,r=n?Vt(o):new Set,i=t.createSelectSchema(o,e?.selectRefine),s=t.createInsertSchema(o,e?.insertRefine),a;return t.createUpdateSchema?a=t.createUpdateSchema(o,e?.updateRefine):a=t.createInsertSchema(o,e?.updateRefine).partial(),n&&r.size>0&&(s=Pe(s,r),a=Pe(a,r)),{select:i,insert:s,update:a}}function Zt(){return ze!==null}var Lt=z.preprocess(o=>{if(o instanceof Date)return o;if(typeof o=="string"){let e=new Date(o);if(!isNaN(e.getTime()))return e}return o},z.date()),Nt=z.preprocess(o=>{if(o==null)return null;if(o instanceof Date)return o;if(typeof o=="string"){let e=new Date(o);if(!isNaN(e.getTime()))return e}return o},z.date().nullable());function Vt(o){let e=new Set,t=o;for(let[n,r]of Object.entries(t)){if(n==="_"||n==="$inferInsert"||n==="$inferSelect")continue;let i=r;if(!i||typeof i!="object")continue;let s=String(i.dataType??"").toLowerCase(),a=String(i.columnType??"").toLowerCase(),l=i.config,c=String(l?.dataType??"").toLowerCase();(s.includes("timestamp")||s.includes("date")||s.includes("datetime")||a.includes("pgtimestamp")||a.includes("pgdate")||a.includes("mysqltimestamp")||a.includes("mysqldate")||a.includes("sqlitetimestamp")||c.includes("timestamp")||c.includes("date"))&&e.add(n);}return e}function Pe(o,e){if(e.size===0)return o;let t=o.shape,n={};for(let[r,i]of Object.entries(t))if(e.has(r)){let s=i.isOptional?.()??false,a=i.isNullable?.()??false,l=Lt;(a||s)&&(l=Nt),s&&(l=l.optional()),n[r]=l;}else n[r]=i;return z.object(n)}var ar={CreateEndpoint:I,ListEndpoint:F,ReadEndpoint:_,UpdateEndpoint:A,DeleteEndpoint:q,RestoreEndpoint:U,BatchCreateEndpoint:Z,BatchUpdateEndpoint:L,BatchDeleteEndpoint:N,BatchRestoreEndpoint:V,BatchUpsertEndpoint:$,SearchEndpoint:Q,AggregateEndpoint:ce,ExportEndpoint:ue,ImportEndpoint:pe,UpsertEndpoint:K,CloneEndpoint:ge,BulkPatchEndpoint:ie,VersionHistoryEndpoint:se,VersionReadEndpoint:ae,VersionCompareEndpoint:le,VersionRollbackEndpoint:de};export{Ge as DRIZZLE_DIALECTS,ar as DrizzleAdapters,ce as DrizzleAggregateEndpoint,Z as DrizzleBatchCreateEndpoint,N as DrizzleBatchDeleteEndpoint,V as DrizzleBatchRestoreEndpoint,L as DrizzleBatchUpdateEndpoint,$ as DrizzleBatchUpsertEndpoint,ie as DrizzleBulkPatchEndpoint,ge as DrizzleCloneEndpoint,I as DrizzleCreateEndpoint,q as DrizzleDeleteEndpoint,ue as DrizzleExportEndpoint,pe as DrizzleImportEndpoint,F as DrizzleListEndpoint,_ as DrizzleReadEndpoint,U as DrizzleRestoreEndpoint,Q as DrizzleSearchEndpoint,A as DrizzleUpdateEndpoint,K as DrizzleUpsertEndpoint,le as DrizzleVersionCompareEndpoint,se as DrizzleVersionHistoryEndpoint,ae as DrizzleVersionReadEndpoint,de as DrizzleVersionRollbackEndpoint,Be as DrizzleVersioningStorage,k as batchLoadDrizzleRelations,X as buildWhereCondition,H as cast,_n as createDrizzleCrud,Ut as createDrizzleSchemas,qt as createInsertSchema,At as createSelectSchema,Ft as createUpdateSchema,p as getColumn,b as getTable,Zt as isDrizzleZodAvailable,et as loadDrizzleRelation,Ce as loadDrizzleRelations,B as readCount,er as sqliteVersionHistoryTable,P as substringMatch};
|
|
4
|
+
3. Use factory: createDrizzleCrud(db, meta)`)}function A(o){return o}function J(o,e){return m(o).transaction(async t=>{o._tx=t;try{return await e()}finally{o._tx=void 0;}})}function g(...o){return and(...o)}function ne(...o){return or(...o)}function R(o,e,t){e.enabled&&o.push(isNull(t(e.field)));}var nt=["sqlite","pg","mysql"];function b(o){if(!o.model.table)throw new Error(`Model ${o.model.tableName} does not have a table reference`);return o.model.table}function p(o,e){let t=getTableColumns(o),n=t[e];if(!n)throw new Error(`Column '${e}' not found in table. Available columns: ${Object.keys(t).join(", ")}`);return n}function Ce(o){return {resolveRelation:e=>e.table??null,fetchRelated:(e,t,n,r)=>{let i=[inArray(p(e,t),n)];return r?.tenantField!=null&&r.tenantValue!=null&&i.push(eq(p(e,r.tenantField),r.tenantValue)),r?.excludeDeletedField!=null&&i.push(isNull(p(e,r.excludeDeletedField))),o.select().from(e).where(i.length===1?i[0]:and(...i))}}}async function rt(o,e,t,n){let r=n.table;if(!r)return e;let i=Ce(o),s=await resolveRelationValueAsync(e,n,r,i.fetchRelated);return {...e,[t]:s}}async function Me(o,e,t,n){return loadRelationsForItem(e,t,Ce(o),n)}async function k(o,e,t,n){return batchLoadRelations(e,t,Ce(o),n)}function X(o,e,t="sqlite"){let n=p(o,e.field);switch(e.operator){case "eq":return eq(n,e.value);case "ne":return ne$1(n,e.value);case "gt":return gt(n,e.value);case "gte":return gte(n,e.value);case "lt":return lt(n,e.value);case "lte":return lte(n,e.value);case "in":return inArray(n,e.value);case "nin":return notInArray(n,e.value);case "like":return P(n,String(e.value).replace(/%/g,""),t,{caseSensitive:true});case "ilike":return P(n,String(e.value).replace(/%/g,""),t);case "null":return e.value?isNull(n):isNotNull(n);case "between":{let[r,i]=e.value;return between(n,r,i)}default:return assertNever(e.operator)}}function I(o){return Number(o[0]?.count)||0}async function G(o){let{db:e,table:t,filters:n,dialect:r,searchFields:i=[],softDeleteConfig:s,defaultPerPage:a=20,extraConditions:l=[],cursorField:c}=o,u=[];if(s?.enabled){let f=p(t,s.field);n.options.onlyDeleted?u.push(isNotNull(f)):n.options.withDeleted||u.push(isNull(f));}for(let f of n.filters){let O=X(t,f,r);O&&u.push(O);}if(n.options.search&&i.length>0){let f=n.options.search,O=i.map(qe=>P(p(t,qe),f,r));u.push(ne(...O));}u.push(...l);let d=u.length>0?g(...u):void 0,z=await e.select({count:sql`count(*)`}).from(t).where(d),M=I(z),D=c!==void 0&&(n.options.cursor!==void 0||n.options.limit!==void 0),y=d,w=false;if(D&&n.options.cursor){let f=decodeCursor(n.options.cursor);f!==null&&(y=g(d,gt(p(t,c),f)),w=true);}let C=e.select().from(t).where(y);if(n.options.order_by){let f=p(t,n.options.order_by),O=n.options.order_by_direction==="desc"?desc:asc;C=C.orderBy(O(f));}if(D){let f=n.options.limit||n.options.per_page||a;return {records:await C.limit(f+1),totalCount:M,page:0,perPage:f,cursor:{limit:f,applied:w}}}let E=n.options.page||1,S=n.options.per_page||a;return {records:await C.limit(S).offset((E-1)*S),totalCount:M,page:E,perPage:S}}async function re(o,e,t,n,r){let i=[];for(let a of r){let l=n[a];l!==void 0&&i.push(eq(t(a),l));}return i.length===0?null:(await o.select().from(e).where(g(...i)).limit(1))[0]||null}function P(o,e,t,n){if(n?.caseSensitive)switch(t){case "pg":return sql`POSITION(${e} IN ${o}) > 0`;case "mysql":return sql`LOCATE(${e}, ${o}) > 0`;default:return sql`INSTR(${o}, ${e}) > 0`}switch(t){case "pg":return sql`POSITION(LOWER(${e}) IN LOWER(${o})) > 0`;case "mysql":return sql`LOCATE(LOWER(${e}), LOWER(${o})) > 0`;default:return sql`INSTR(LOWER(${o}), LOWER(${e})) > 0`}}var _=class extends CreateEndpoint{db;useTransaction=false;getDb(){return m(this)}getTable(){return b(this._meta)}getRelatedTable(e){return e.table}async create(e,t){let n=t??this.getDb(),r=this.getTable(),i=this.applyManagedInsertFields(e,"drizzle");return (await n.insert(r).values(i).returning())[0]}async createNested(e,t,n,r,i){let s=i??this.getDb(),a=this.getRelatedTable(n);if(!a)return getLogger().warn(`Related table not found for ${t}. Add 'table' to the relation config.`),[];let l=Array.isArray(r)?r:[r],c=[];for(let u of l){if(typeof u!="object"||u===null)continue;let d={...u,id:crypto.randomUUID(),[n.foreignKey]:e},z=await s.insert(a).values(d).returning();z[0]&&c.push(z[0]);}return c}async handle(){return this.useTransaction?J(this,()=>super.handle()):super.handle()}},q=class extends ReadEndpoint{db;getDb(){return m(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async read(e,t,n){let r=this.getTable(),i=this.getColumn(this.lookupField),s=this.getSoftDeleteConfig(),a=[eq(i,e)];if(t)for(let[u,d]of Object.entries(t))a.push(eq(this.getColumn(u),d));R(a,s,u=>this.getColumn(u));let l=await this.getDb().select().from(r).where(g(...a)).limit(1);return l[0]?await Me(this.getDb(),l[0],this._meta,n):null}},N=class extends UpdateEndpoint{db;useTransaction=false;getDb(){return m(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}getRelatedTable(e){return e.table}async findExisting(e,t,n){let r=n??this.getDb(),i=this.getTable(),s=this.getColumn(this.lookupField),a=this.getSoftDeleteConfig(),l=[eq(s,e)];if(t)for(let[u,d]of Object.entries(t))l.push(eq(this.getColumn(u),d));return R(l,a,u=>this.getColumn(u)),(await r.select().from(i).where(g(...l)).limit(1))[0]||null}async update(e,t,n,r){let i=r??this.getDb(),s=this.getTable(),a=this.getColumn(this.lookupField),l=this.getSoftDeleteConfig(),c=[eq(a,e)];if(n)for(let[d,z]of Object.entries(n))c.push(eq(this.getColumn(d),z));return R(c,l,d=>this.getColumn(d)),(await i.update(s).set(this.applyManagedUpdateFields(t)).where(g(...c)).returning())[0]||null}async processNestedWrites(e,t,n,r,i){let s=i??this.getDb(),a=this.getRelatedTable(n);if(!a)return getLogger().warn(`Related table not found for ${t}. Add 'table' to the relation config.`),{created:[],updated:[],deleted:[],connected:[],disconnected:[]};let l={created:[],updated:[],deleted:[],connected:[],disconnected:[]},c=p(a,n.foreignKey),u=p(a,"id");if(r.create){let d=Array.isArray(r.create)?r.create:[r.create];for(let z of d){if(typeof z!="object"||z===null)continue;let M={...z,id:crypto.randomUUID(),[n.foreignKey]:e},D=await s.insert(a).values(M).returning();D[0]&&l.created.push(D[0]);}}if(r.update)for(let d of r.update){if(!d.id||!(await s.select().from(a).where(g(eq(u,d.id),eq(c,e))).limit(1))[0])continue;let{id:M,...D}=d,y=await s.update(a).set(D).where(eq(u,M)).returning();y[0]&&l.updated.push(y[0]);}if(r.delete)for(let d of r.delete)(await s.delete(a).where(g(eq(u,d),eq(c,e))).returning())[0]&&l.deleted.push(d);if(r.connect)for(let d of r.connect)(await s.update(a).set({[n.foreignKey]:e}).where(eq(u,d)).returning())[0]&&l.connected.push(d);if(r.disconnect)for(let d of r.disconnect)(await s.update(a).set({[n.foreignKey]:null}).where(g(eq(u,d),eq(c,e))).returning())[0]&&l.disconnected.push(d);return l}async handle(){return this.useTransaction?J(this,()=>super.handle()):super.handle()}},F=class extends DeleteEndpoint{db;useTransaction=false;getDb(){return m(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}getRelatedTable(e){return e.table}async findForDelete(e,t,n){let r=n??this.getDb(),i=this.getTable(),s=this.getColumn(this.lookupField),a=this.getSoftDeleteConfig(),l=[eq(s,e)];if(t)for(let[u,d]of Object.entries(t))l.push(eq(this.getColumn(u),d));return R(l,a,u=>this.getColumn(u)),(await r.select().from(i).where(g(...l)).limit(1))[0]||null}async delete(e,t,n){let r=n??this.getDb(),i=this.getTable(),s=this.getColumn(this.lookupField),a=this.getSoftDeleteConfig(),l=[eq(s,e)];if(t)for(let[c,u]of Object.entries(t))l.push(eq(this.getColumn(c),u));return R(l,a,c=>this.getColumn(c)),a.enabled?(await r.update(i).set({[a.field]:new Date}).where(g(...l)).returning())[0]||null:(await r.delete(i).where(g(...l)).returning())[0]||null}async countRelated(e,t,n,r){let i=r??this.getDb(),s=this.getRelatedTable(n);if(!s)return 0;let a=p(s,n.foreignKey),l=await i.select({count:sql`count(*)`}).from(s).where(eq(a,e));return I(l)}async deleteRelated(e,t,n,r){let i=r??this.getDb(),s=this.getRelatedTable(n);if(!s)return 0;let a=p(s,n.foreignKey);return (await i.delete(s).where(eq(a,e)).returning()).length}async nullifyRelated(e,t,n,r){let i=r??this.getDb(),s=this.getRelatedTable(n);if(!s)return 0;let a=p(s,n.foreignKey);return (await i.update(s).set({[n.foreignKey]:null}).where(eq(a,e)).returning()).length}async handle(){return this.useTransaction?J(this,()=>super.handle()):super.handle()}},L=class extends ListEndpoint{db;dialect="sqlite";supportsCursorPagination=true;getDb(){return m(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async list(e){let t=await G({db:this.getDb(),table:this.getTable(),filters:e,dialect:this.dialect,searchFields:this.searchFields,softDeleteConfig:this.getSoftDeleteConfig(),defaultPerPage:this.defaultPerPage,cursorField:this.isCursorPaginationActive()?this.cursorField||"id":void 0}),n=buildIncludeOptions(e.options.include,this.getRelationScope(e.options.withDeleted));if(t.cursor){let{items:i,result_info:s}=buildCursorPage({rows:t.records,limit:t.cursor.limit,totalCount:t.totalCount,cursorField:this.cursorField||"id",cursorApplied:t.cursor.applied});return {result:await k(this.getDb(),i,this._meta,n),result_info:s}}return {result:await k(this.getDb(),t.records,this._meta,n),result_info:buildOffsetPageInfo({page:t.page,perPage:t.perPage,totalCount:t.totalCount})}}},U=class extends RestoreEndpoint{db;useTransaction=false;getDb(){return m(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async restore(e,t,n){let r=n??this.getDb(),i=this.getTable(),s=this.getColumn(this.lookupField),a=this.getSoftDeleteConfig(),l=[eq(s,e)];if(t)for(let[u,d]of Object.entries(t))l.push(eq(this.getColumn(u),d));return l.push(isNotNull(this.getColumn(a.field))),(await r.update(i).set({[a.field]:null}).where(g(...l)).returning())[0]||null}async handle(){return this.useTransaction?J(this,()=>super.handle()):super.handle()}};var Z=class extends BatchCreateEndpoint{db;getDb(){return m(this)}getTable(){return b(this._meta)}async batchCreate(e){let t=this.getTable(),n=e.map(i=>this.applyManagedInsertFields(i,"drizzle"));return await this.getDb().insert(t).values(n).returning()}},V=class extends BatchUpdateEndpoint{db;getDb(){return m(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async batchUpdate(e){let t=this.getTable(),n=this.getColumn(this.lookupField),r=this.getSoftDeleteConfig(),i=[],s=[],a=this.getTenantScopeFilter();for(let l of e){let c=[eq(n,l.id)];R(c,r,d=>this.getColumn(d)),a&&c.push(eq(this.getColumn(a.field),a.value));let u=await this.getDb().update(t).set(this.applyManagedUpdateFields(l.data)).where(g(...c)).returning();u[0]?i.push(u[0]):s.push(l.id);}return {updated:i,notFound:s}}},K=class extends BatchDeleteEndpoint{db;getDb(){return m(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async batchDelete(e){let t=this.getTable(),n=this.getColumn(this.lookupField),r=this.getSoftDeleteConfig(),i=[inArray(n,e)];R(i,r,d=>this.getColumn(d));let s=this.getTenantScopeFilter();s&&i.push(eq(this.getColumn(s.field),s.value));let a;r.enabled?a=await this.getDb().update(t).set({[r.field]:new Date}).where(g(...i)).returning():a=await this.getDb().delete(t).where(g(...i)).returning();let l=a,c=new Set(l.map(d=>String(d[this.lookupField]))),u=e.filter(d=>!c.has(d));return {deleted:l,notFound:u}}},$=class extends BatchRestoreEndpoint{db;getDb(){return m(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async batchRestore(e){let t=this.getTable(),n=this.getColumn(this.lookupField),r=this.getSoftDeleteConfig(),i=[inArray(n,e),isNotNull(this.getColumn(r.field))],s=this.getTenantScopeFilter();s&&i.push(eq(this.getColumn(s.field),s.value));let l=await this.getDb().update(t).set({[r.field]:null}).where(g(...i)).returning(),c=new Set(l.map(d=>String(d[this.lookupField]))),u=e.filter(d=>!c.has(d));return {restored:l,notFound:u}}};function _t(o){return o.split(/\s+/).filter(e=>e.length>0)}var Q=class extends UpsertEndpoint{db;dialect="sqlite";getDb(){return m(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async findExisting(e){return re(this.getDb(),this.getTable(),t=>this.getColumn(t),e,this.getUpsertKeys())}async create(e){let t=this.getTable(),n=this.applyManagedInsertFields(e,"drizzle");return (await this.getDb().insert(t).values(n).returning())[0]}async update(e,t){let n=this.getTable(),r=this._meta.model.primaryKeys[0],i=e[r];return (await this.getDb().update(n).set(this.applyManagedUpdateFields(t)).where(eq(this.getColumn(r),i)).returning())[0]}async nativeUpsert(e,t){let n=this.getTable(),r=this.getUpsertKeys(),i=this._meta.model.primaryKeys[0],s=this.getSoftDeleteConfig(),a=this.getTimestampsConfig(),l=this.applyManagedInsertFields(e,"drizzle"),c={};for(let[y,w]of Object.entries(e))!r.includes(y)&&y!==i&&(this.createOnlyFields?.includes(y)||(c[y]=w));a.enabled&&(c[a.updatedAt]=Date.now());let u=r.map(y=>this.getColumn(y)),d;s.enabled&&(d=isNull(this.getColumn(s.field)));let z=Object.keys(c).length>0?c:{[i]:sql`${this.getColumn(i)}`},M=this.getDb().insert(n).values(l);return this.dialect==="mysql"?{data:(await M.onDuplicateKeyUpdate({set:z}).returning())[0],created:false}:{data:(await M.onConflictDoUpdate({target:u,set:z,where:d}).returning())[0],created:false}}},W=class extends BatchUpsertEndpoint{db;dialect="sqlite";getDb(){return m(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async findExisting(e){return re(this.getDb(),this.getTable(),t=>this.getColumn(t),e,this.getUpsertKeys())}async create(e){let t=this.getTable(),n=this.applyManagedInsertFields(e,"drizzle");return (await this.getDb().insert(t).values(n).returning())[0]}async update(e,t){let n=this.getTable(),r=this._meta.model.primaryKeys[0],i=e[r];return (await this.getDb().update(n).set(this.applyManagedUpdateFields(t)).where(eq(this.getColumn(r),i)).returning())[0]}async nativeBatchUpsert(e,t){if(e.length===0)return {items:[],createdCount:0,updatedCount:0,totalCount:0};let n=this.getTable(),r=this.getUpsertKeys(),i=this._meta.model.primaryKeys[0],s=this.getTimestampsConfig(),a=e.map(D=>this.applyManagedInsertFields(D,"drizzle")),l={},c=e[0];for(let D of Object.keys(c))!r.includes(D)&&D!==i&&(this.createOnlyFields?.includes(D)||(l[D]=sql`excluded.${sql.identifier(D)}`));s.enabled&&(l[s.updatedAt]=Date.now());let u=r.map(D=>this.getColumn(D)),d=Object.keys(l).length>0?l:{[i]:sql`${this.getColumn(i)}`},z=this.getDb().insert(n).values(a),M=await(this.dialect==="mysql"?z.onDuplicateKeyUpdate({set:d}):z.onConflictDoUpdate({target:u,set:d})).returning();return {items:M.map((D,y)=>({data:D,created:false,index:y})),createdCount:0,updatedCount:M.length,totalCount:M.length}}},ie=class extends BulkPatchEndpoint{db;dialect="sqlite";getDb(){return m(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}buildConditions(e){let t=this.getTable(),n=[];for(let i of e.filters){let s=X(t,i,this.dialect);s&&n.push(s);}let r=this.getSoftDeleteConfig();return R(n,r,i=>this.getColumn(i)),n}async countMatching(e){let t=this.buildConditions(e),n=await this.getDb().select({count:sql`count(*)`}).from(this.getTable()).where(g(...t));return I(n)}async applyPatch(e,t){let n=this.buildConditions(t),r=await this.getDb().update(this.getTable()).set(this.applyManagedUpdateFields(e)).where(g(...n)).returning();return {updated:r.length,records:r}}};async function me(o,e,t,n,r){let i=r?g(eq(t,n),eq(p(e,r.field),r.value)):eq(t,n),s=await o.select({count:sql`count(*)`}).from(e).where(i);return I(s)>0}var se=class extends VersionHistoryEndpoint{db;getDb(){return m(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async recordExists(e,t){return me(this.getDb(),this.getTable(),this.getColumn("id"),e,t)}},ae=class extends VersionReadEndpoint{db;getDb(){return m(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async recordExists(e,t){return me(this.getDb(),this.getTable(),this.getColumn("id"),e,t)}},le=class extends VersionCompareEndpoint{db;getDb(){return m(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async recordExists(e,t){return me(this.getDb(),this.getTable(),this.getColumn("id"),e,t)}},de=class extends VersionRollbackEndpoint{db;getDb(){return m(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async recordExists(e,t){return me(this.getDb(),this.getTable(),this.getColumn("id"),e,t)}async rollback(e,t,n){let r=this.getTable(),i=this.getVersioningConfig().field;return (await this.getDb().update(r).set({...t,[i]:n}).where(eq(this.getColumn("id"),e)).returning())[0]}},ce=class extends AggregateEndpoint{db;dialect="sqlite";getDb(){return m(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async aggregate(e){let t=this.getTable(),n=[],r=this.getSoftDeleteConfig();if(r.enabled){let{query:a}=await this.getValidatedData();a?.withDeleted===true||a?.withDeleted==="true"||R(n,r,c=>this.getColumn(c));}if(e.filters)for(let[a,l]of Object.entries(e.filters))if(typeof l=="object"&&l!==null)for(let[c,u]of Object.entries(l)){if(!isFilterOperator(c)){n.push(sql`1 = 0`);continue}let d=X(t,{field:a,operator:c,value:u},this.dialect);d&&n.push(d);}else n.push(eq(this.getColumn(a),l));let i=n.length>0?g(...n):void 0,s=await this.getDb().select().from(t).where(i);return computeAggregations(s,e)}},H=class extends SearchEndpoint{db;dialect="sqlite";getDb(){return m(this)}useNativeSearch=false;vectorColumn;vectorConfig="english";getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async search(e,t){let n=this.getTable(),r=[],i=this.getSearchableFields(),s=e.fields||Object.keys(i);if(this.useNativeSearch&&this.vectorColumn){let w=this.getColumn(this.vectorColumn),C=e.mode==="phrase"?sql`phraseto_tsquery(${this.vectorConfig}, ${e.query})`:e.mode==="all"?sql`plainto_tsquery(${this.vectorConfig}, ${e.query})`:sql`to_tsquery(${this.vectorConfig}, ${e.query.split(/\s+/).join(" | ")})`;r.push(sql`${w} @@ ${C}`);}else {let w=(C,E)=>{try{let S=this.getColumn(C);return P(sql`CAST(${S} AS TEXT)`,E,this.dialect)}catch{return}};if(e.mode==="all"){let C=_t(e.query);if(C.length>0){let E=[];for(let S of C){let fe=s.map(f=>w(f,S)).filter(f=>f!==void 0);fe.length>0&&E.push(ne(...fe));}E.length>0&&r.push(g(...E));}}else {let C=s.map(E=>w(E,e.query)).filter(E=>E!==void 0);C.length>0&&r.push(ne(...C));}}let a=await G({db:this.getDb(),table:n,filters:t,dialect:this.dialect,softDeleteConfig:this.getSoftDeleteConfig(),defaultPerPage:this.defaultPerPage,extraConditions:r}),l=a.records,c=a.totalCount,u=e.mode==="all"?{...e,mode:"any"}:e,d=searchInMemory(l,u,i),z=buildIncludeOptions(t.options.include,this.getRelationScope(t.options.withDeleted)),M=d.map(w=>w.item),D=await k(this.getDb(),M,this._meta,z);return {items:d.map((w,C)=>({...w,item:D[C]})),totalCount:c}}},ue=class extends ExportEndpoint{db;dialect="sqlite";getDb(){return m(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async list(e){let t=await G({db:this.getDb(),table:this.getTable(),filters:e,dialect:this.dialect,searchFields:this.searchFields,softDeleteConfig:this.getSoftDeleteConfig(),defaultPerPage:this.defaultPerPage}),n=buildIncludeOptions(e.options.include,this.getRelationScope(e.options.withDeleted));return {result:await k(this.getDb(),t.records,this._meta,n),result_info:buildOffsetPageInfo({page:t.page,perPage:t.perPage,totalCount:t.totalCount})}}},pe=class extends ImportEndpoint{db;getDb(){return m(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}async findExisting(e){return re(this.getDb(),this.getTable(),t=>this.getColumn(t),e,this.getUpsertKeys())}async create(e){let t=this.getTable(),n=this.applyManagedInsertFields(e,"drizzle");return (await this.getDb().insert(t).values(n).returning())[0]}async update(e,t){let n=this.getTable(),r=this._meta.model.primaryKeys[0],i=e[r];return (await this.getDb().update(n).set(this.applyManagedUpdateFields(t)).where(eq(this.getColumn(r),i)).returning())[0]}},ge=class extends CloneEndpoint{db;getDb(){return m(this)}getTable(){return b(this._meta)}getColumn(e){return p(this.getTable(),e)}generateId(){return crypto.randomUUID()}async findSource(e,t){let n=this.getTable(),r=this.getColumn(this.lookupField),i=this.getSoftDeleteConfig(),s=[eq(r,e)];if(t)for(let[l,c]of Object.entries(t))s.push(eq(this.getColumn(l),c));R(s,i,l=>this.getColumn(l));let a=await this.getDb().select().from(n).where(g(...s)).limit(1);return a[0]?a[0]:null}async createClone(e){let t=this.getTable(),n=this.applyManagedInsertFields(e,"drizzle",()=>this.generateId());return (await this.getDb().insert(t).values(n).returning())[0]}};function Zn(o,e,t){let n=t?.dialect??"sqlite";return {Create:class extends _{_meta=e;db=o},Read:class extends q{_meta=e;db=o},Update:class extends N{_meta=e;db=o},Delete:class extends F{_meta=e;db=o},List:class extends L{_meta=e;db=o;dialect=n},Restore:class extends U{_meta=e;db=o},Upsert:class extends Q{_meta=e;db=o;dialect=n},Search:class extends H{_meta=e;db=o;dialect=n},BatchCreate:class extends Z{_meta=e;db=o},BatchUpdate:class extends V{_meta=e;db=o},BatchDelete:class extends K{_meta=e;db=o},BatchRestore:class extends ${_meta=e;db=o},BatchUpsert:class extends W{_meta=e;db=o;dialect=n}}}var je=class{db;table;constructor(e){this.db=e.db,this.table=e.table;}col(e){return p(this.table,e)}recordScope(e,t){return and(eq(this.col("resourceTable"),e),eq(this.col("recordId"),String(t)))}toEntry(e){return {id:e.id,recordId:e.recordId,version:e.version,data:JSON.parse(e.data),createdAt:new Date(e.createdAt),...e.changedBy!=null?{changedBy:e.changedBy}:{},...e.changeReason!=null?{changeReason:e.changeReason}:{},...e.changes!=null?{changes:JSON.parse(e.changes)}:{}}}async store(e,t){let n=t.createdAt instanceof Date?t.createdAt:new Date(t.createdAt);await this.db.insert(this.table).values({id:t.id,resourceTable:e,recordId:String(t.recordId),version:t.version,data:JSON.stringify(t.data),createdAt:n.getTime(),changedBy:t.changedBy??null,changeReason:t.changeReason??null,changes:t.changes?JSON.stringify(t.changes):null});}async getByRecordId(e,t,n){let r=this.db.select().from(this.table).where(this.recordScope(e,t)).orderBy(desc(this.col("version")));return (n?.limit!=null||n?.offset!=null)&&(r=r.limit(n?.limit??Number.MAX_SAFE_INTEGER)),n?.offset!=null&&(r=r.offset(n.offset)),(await r).map(s=>this.toEntry(s))}async getVersion(e,t,n){let r=await this.db.select().from(this.table).where(and(this.recordScope(e,t),eq(this.col("version"),n))).limit(1);return r.length>0?this.toEntry(r[0]):null}async getLatestVersion(e,t){let n=await this.db.select().from(this.table).where(this.recordScope(e,t)).orderBy(desc(this.col("version"))).limit(1);return n.length>0?n[0].version:0}async pruneVersions(e,t,n){if(n<=0)return this.deleteAllVersions(e,t);let r=await this.getByRecordId(e,t);if(r.length<=n)return 0;let i=r[n-1].version;return (await this.db.delete(this.table).where(and(this.recordScope(e,t),lt(this.col("version"),i))).returning()).length}async deleteAllVersions(e,t){return (await this.db.delete(this.table).where(this.recordScope(e,t)).returning()).length}};function ar(o="version_history"){return sqliteTable(o,{id:text("id").primaryKey(),resourceTable:text("resource_table").notNull(),recordId:text("record_id").notNull(),version:integer("version").notNull(),data:text("data").notNull(),createdAt:integer("created_at").notNull(),changedBy:text("changed_by"),changeReason:text("change_reason"),changes:text("changes")})}var Pe=class{db;table;constructor(e){this.db=e.db,this.table=e.table;}col(e){return p(this.table,e)}toEntry(e){return {id:e.id,timestamp:new Date(e.timestamp),action:e.action,tableName:e.tableName,recordId:e.recordId,...e.userId!=null?{userId:e.userId}:{},...e.record!=null?{record:JSON.parse(e.record)}:{},...e.previousRecord!=null?{previousRecord:JSON.parse(e.previousRecord)}:{},...e.changes!=null?{changes:JSON.parse(e.changes)}:{},...e.metadata!=null?{metadata:JSON.parse(e.metadata)}:{}}}async store(e){let t=e.timestamp instanceof Date?e.timestamp:new Date(e.timestamp);await this.db.insert(this.table).values({id:e.id,tableName:e.tableName,recordId:String(e.recordId),action:e.action,timestamp:t.getTime(),userId:e.userId??null,record:e.record!==void 0?JSON.stringify(e.record):null,previousRecord:e.previousRecord!==void 0?JSON.stringify(e.previousRecord):null,changes:e.changes!==void 0?JSON.stringify(e.changes):null,metadata:e.metadata!==void 0?JSON.stringify(e.metadata):null});}async getByRecordId(e,t,n){let r=this.db.select().from(this.table).where(g(eq(this.col("tableName"),e),eq(this.col("recordId"),String(t)))).orderBy(asc(this.col("timestamp")),asc(this.col("id"))),i=n?.offset||0,s=n?.limit||0;return s>0?(r=r.limit(s),i>0&&(r=r.offset(i))):i>0&&(r=r.limit(Number.MAX_SAFE_INTEGER),r=r.offset(i)),(await r).map(l=>this.toEntry(l))}async getAll(e){let t=[];e?.tableName&&t.push(eq(this.col("tableName"),e.tableName)),e?.action&&t.push(eq(this.col("action"),e.action)),e?.userId&&t.push(eq(this.col("userId"),e.userId)),e?.startDate&&t.push(gte(this.col("timestamp"),e.startDate.getTime())),e?.endDate&&t.push(lte(this.col("timestamp"),e.endDate.getTime()));let n=t.length>0?g(...t):void 0,r=this.db.select().from(this.table).where(n).orderBy(asc(this.col("timestamp")),asc(this.col("id"))),i=e?.offset||0,s=e?.limit||0;return s>0?(r=r.limit(s),i>0&&(r=r.offset(i))):i>0&&(r=r.limit(Number.MAX_SAFE_INTEGER),r=r.offset(i)),(await r).map(l=>this.toEntry(l))}};function pr(o="audit_logs"){return sqliteTable(o,{id:text("id").primaryKey(),tableName:text("table_name").notNull(),recordId:text("record_id").notNull(),action:text("action").notNull(),timestamp:integer("timestamp").notNull(),userId:text("user_id"),record:text("record"),previousRecord:text("previous_record"),changes:text("changes"),metadata:text("metadata")})}var ze=null,Ae=false,he=null;async function De(){if(Ae){if(he)throw he;return ze}Ae=true;try{return ze=await import('drizzle-zod'),ze}catch{throw he=new Error("drizzle-zod is not installed. Please install it: npm install drizzle-zod"),he}}async function Vt(o,e){return (await De()).createSelectSchema(o,e)}async function Kt(o,e){return (await De()).createInsertSchema(o,e)}async function $t(o,e){let t=await De();return t.createUpdateSchema?t.createUpdateSchema(o,e):t.createInsertSchema(o,e).partial()}async function Qt(o,e){let t=await De(),n=e?.coerceDates!==false,r=n?Xt(o):new Set,i=t.createSelectSchema(o,e?.selectRefine),s=t.createInsertSchema(o,e?.insertRefine),a;return t.createUpdateSchema?a=t.createUpdateSchema(o,e?.updateRefine):a=t.createInsertSchema(o,e?.updateRefine).partial(),n&&r.size>0&&(s=_e(s,r),a=_e(a,r)),{select:i,insert:s,update:a}}function Wt(){return ze!==null}var Ht=z.preprocess(o=>{if(o instanceof Date)return o;if(typeof o=="string"){let e=new Date(o);if(!isNaN(e.getTime()))return e}return o},z.date()),Jt=z.preprocess(o=>{if(o==null)return null;if(o instanceof Date)return o;if(typeof o=="string"){let e=new Date(o);if(!isNaN(e.getTime()))return e}return o},z.date().nullable());function Xt(o){let e=new Set,t=o;for(let[n,r]of Object.entries(t)){if(n==="_"||n==="$inferInsert"||n==="$inferSelect")continue;let i=r;if(!i||typeof i!="object")continue;let s=String(i.dataType??"").toLowerCase(),a=String(i.columnType??"").toLowerCase(),l=i.config,c=String(l?.dataType??"").toLowerCase();(s.includes("timestamp")||s.includes("date")||s.includes("datetime")||a.includes("pgtimestamp")||a.includes("pgdate")||a.includes("mysqltimestamp")||a.includes("mysqldate")||a.includes("sqlitetimestamp")||c.includes("timestamp")||c.includes("date"))&&e.add(n);}return e}function _e(o,e){if(e.size===0)return o;let t=o.shape,n={};for(let[r,i]of Object.entries(t))if(e.has(r)){let s=i.isOptional?.()??false,a=i.isNullable?.()??false,l=Ht;(a||s)&&(l=Jt),s&&(l=l.optional()),n[r]=l;}else n[r]=i;return z.object(n)}var fr={CreateEndpoint:_,ListEndpoint:L,ReadEndpoint:q,UpdateEndpoint:N,DeleteEndpoint:F,RestoreEndpoint:U,BatchCreateEndpoint:Z,BatchUpdateEndpoint:V,BatchDeleteEndpoint:K,BatchRestoreEndpoint:$,BatchUpsertEndpoint:W,SearchEndpoint:H,AggregateEndpoint:ce,ExportEndpoint:ue,ImportEndpoint:pe,UpsertEndpoint:Q,CloneEndpoint:ge,BulkPatchEndpoint:ie,VersionHistoryEndpoint:se,VersionReadEndpoint:ae,VersionCompareEndpoint:le,VersionRollbackEndpoint:de};export{nt as DRIZZLE_DIALECTS,fr as DrizzleAdapters,ce as DrizzleAggregateEndpoint,Pe as DrizzleAuditLogStorage,Z as DrizzleBatchCreateEndpoint,K as DrizzleBatchDeleteEndpoint,$ as DrizzleBatchRestoreEndpoint,V as DrizzleBatchUpdateEndpoint,W as DrizzleBatchUpsertEndpoint,ie as DrizzleBulkPatchEndpoint,ge as DrizzleCloneEndpoint,_ as DrizzleCreateEndpoint,F as DrizzleDeleteEndpoint,ue as DrizzleExportEndpoint,pe as DrizzleImportEndpoint,L as DrizzleListEndpoint,q as DrizzleReadEndpoint,U as DrizzleRestoreEndpoint,H as DrizzleSearchEndpoint,N as DrizzleUpdateEndpoint,Q as DrizzleUpsertEndpoint,le as DrizzleVersionCompareEndpoint,se as DrizzleVersionHistoryEndpoint,ae as DrizzleVersionReadEndpoint,de as DrizzleVersionRollbackEndpoint,je as DrizzleVersioningStorage,k as batchLoadDrizzleRelations,X as buildWhereCondition,A as cast,Zn as createDrizzleCrud,Qt as createDrizzleSchemas,Kt as createInsertSchema,Vt as createSelectSchema,$t as createUpdateSchema,p as getColumn,b as getTable,Wt as isDrizzleZodAvailable,rt as loadDrizzleRelation,Me as loadDrizzleRelations,I as readCount,pr as sqliteAuditLogTable,ar as sqliteVersionHistoryTable,P as substringMatch};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hono-crud/drizzle",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.21",
|
|
4
4
|
"description": "Drizzle ORM CRUD adapter for hono-crud",
|
|
5
5
|
"author": "Kauan Guesser <contato@kauan.net>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"drizzle-zod": ">=0.8.0",
|
|
48
48
|
"hono": ">=4.11.7 <5",
|
|
49
49
|
"zod": ">=4.0.0",
|
|
50
|
-
"hono-crud": "^0.13.
|
|
50
|
+
"hono-crud": "^0.13.27"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"drizzle-orm": "^0.45.1",
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
"tsup": "^8.4.0",
|
|
57
57
|
"typescript": "^5.8.3",
|
|
58
58
|
"zod": "^4.3.5",
|
|
59
|
-
"hono-crud": "0.13.
|
|
59
|
+
"hono-crud": "0.13.27"
|
|
60
60
|
},
|
|
61
61
|
"peerDependenciesMeta": {
|
|
62
62
|
"drizzle-zod": {
|