@modern-admin/adapter-drizzle 0.1.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.
@@ -0,0 +1,444 @@
1
+ import { and, asc, count as countFn, eq, gte, ilike, inArray, isNotNull, like, lte, ne, or, sql } from 'drizzle-orm';
2
+ import { BaseRecord, BaseResource, } from '@modern-admin/core';
3
+ import { DrizzleProperty, extractForeignKeys, findPrimaryColumn } from './property.js';
4
+ import { filterToWhere, findOptionsToDrizzle } from './converters.js';
5
+ const isInit = (raw) => typeof raw === 'object' &&
6
+ raw !== null &&
7
+ 'client' in raw &&
8
+ 'table' in raw &&
9
+ typeof raw.table === 'object';
10
+ export class DrizzleResource extends BaseResource {
11
+ constructor(raw) {
12
+ super();
13
+ if (!isInit(raw)) {
14
+ throw new Error('DrizzleResource requires { client, table, tableKey } config');
15
+ }
16
+ this.client = raw.client;
17
+ this.table = raw.table;
18
+ this.tableKey = raw.tableKey;
19
+ this.dialect = raw.dialect ?? 'pg';
20
+ this._id = raw.id ?? raw.table._?.name ?? raw.tableKey;
21
+ const idColumn = findPrimaryColumn(raw.table);
22
+ if (!idColumn) {
23
+ throw new Error(`Drizzle table "${this._id}" has no primary-key column`);
24
+ }
25
+ this.idColumn = idColumn;
26
+ const fks = extractForeignKeys(raw.table);
27
+ let position = 1;
28
+ this._properties = [];
29
+ for (const key of Object.keys(raw.table)) {
30
+ if (key === '_')
31
+ continue;
32
+ const col = raw.table[key];
33
+ if (!col || typeof col.name !== 'string')
34
+ continue;
35
+ this._properties.push(new DrizzleProperty(col, fks[col.name] ?? null, position++));
36
+ }
37
+ }
38
+ static isAdapterFor(raw) {
39
+ return isInit(raw);
40
+ }
41
+ id() {
42
+ return this._id;
43
+ }
44
+ databaseName() {
45
+ return this.table._?.name ?? this._id;
46
+ }
47
+ databaseType() {
48
+ return 'drizzle';
49
+ }
50
+ properties() {
51
+ return this._properties;
52
+ }
53
+ property(path) {
54
+ return this._properties.find((p) => p.path() === path) ?? null;
55
+ }
56
+ castId(id) {
57
+ if (typeof id === 'number')
58
+ return id;
59
+ if (this.idColumn.dataType === 'number' || this.idColumn.dataType === 'bigint') {
60
+ const n = Number(id);
61
+ return Number.isFinite(n) ? n : id;
62
+ }
63
+ return id;
64
+ }
65
+ /** Drop unknown keys so we never write to columns that don't exist. */
66
+ writableData(params) {
67
+ const out = {};
68
+ for (const prop of this._properties) {
69
+ const path = prop.path();
70
+ if (path in params)
71
+ out[path] = params[path];
72
+ }
73
+ return out;
74
+ }
75
+ async distinct(field, options) {
76
+ const column = this.table[field];
77
+ if (!column)
78
+ return [];
79
+ const prop = this.property(field);
80
+ if (!prop || prop.type() !== 'string')
81
+ return [];
82
+ const limit = options?.limit ?? 100;
83
+ const conds = [
84
+ isNotNull(column),
85
+ ne(column, ''),
86
+ ];
87
+ if (options?.search) {
88
+ const op = column.columnType?.startsWith('Pg') ? ilike : like;
89
+ conds.push(op(column, `%${options.search}%`));
90
+ }
91
+ const where = and(...conds);
92
+ // Use select + groupBy for DISTINCT — avoids requiring selectDistinct
93
+ // on the client interface while producing the same SQL result.
94
+ const rows = (await this.client
95
+ .select({ value: column })
96
+ .from(this.table)
97
+ .where(where)
98
+ .groupBy(column)
99
+ .orderBy(asc(column))
100
+ .limit(limit));
101
+ return rows
102
+ .map((r) => r.value)
103
+ .filter((v) => typeof v === 'string');
104
+ }
105
+ async count(filter) {
106
+ const where = filterToWhere(filter, this.table);
107
+ let qb = this.client.select({ value: countFn() }).from(this.table);
108
+ if (where !== undefined)
109
+ qb = qb.where(where);
110
+ const rows = (await qb);
111
+ const v = rows[0]?.value ?? 0;
112
+ return typeof v === 'number' ? v : Number(v);
113
+ }
114
+ async find(filter, options) {
115
+ const where = filterToWhere(filter, this.table);
116
+ const { limit, offset, orderBy } = findOptionsToDrizzle(options, this.table);
117
+ let qb = this.client.select().from(this.table);
118
+ if (where !== undefined)
119
+ qb = qb.where(where);
120
+ if (orderBy !== undefined)
121
+ qb = qb.orderBy(orderBy);
122
+ if (limit !== undefined)
123
+ qb = qb.limit(limit);
124
+ if (offset !== undefined)
125
+ qb = qb.offset(offset);
126
+ const rows = (await qb);
127
+ return rows.map((row) => new BaseRecord(row, this));
128
+ }
129
+ async search(query, fields, options) {
130
+ const limit = options?.limit ?? 50;
131
+ if (!query || fields.length === 0)
132
+ return [];
133
+ // Build per-field substring conditions. Only string-typed columns are
134
+ // valid for `ilike`/`like`; skip the rest defensively so a stray
135
+ // property path can't crash the query.
136
+ const isPg = this.dialect === 'pg';
137
+ const conds = [];
138
+ for (const field of fields) {
139
+ const col = this.table[field];
140
+ if (!col)
141
+ continue;
142
+ const prop = this.property(field);
143
+ if (!prop || prop.type() !== 'string')
144
+ continue;
145
+ const op = isPg ? ilike : like;
146
+ conds.push(op(col, `%${query}%`));
147
+ }
148
+ if (conds.length === 0)
149
+ return [];
150
+ const where = conds.length === 1 ? conds[0] : or(...conds);
151
+ const rows = (await this.client
152
+ .select()
153
+ .from(this.table)
154
+ .where(where)
155
+ .limit(limit));
156
+ return rows.map((row) => new BaseRecord(row, this));
157
+ }
158
+ async findOne(id) {
159
+ const rows = (await this.client
160
+ .select()
161
+ .from(this.table)
162
+ .where(eq(this.idColumn, this.castId(id)))
163
+ .limit(1));
164
+ const row = rows[0];
165
+ return row ? new BaseRecord(row, this) : null;
166
+ }
167
+ async findMany(ids) {
168
+ if (ids.length === 0)
169
+ return [];
170
+ const cast = ids.map((id) => this.castId(id));
171
+ const rows = (await this.client
172
+ .select()
173
+ .from(this.table)
174
+ .where(inArray(this.idColumn, cast)));
175
+ return rows.map((row) => new BaseRecord(row, this));
176
+ }
177
+ async create(params) {
178
+ const rows = await this.client
179
+ .insert(this.table)
180
+ .values(this.writableData(params))
181
+ .returning();
182
+ return (rows[0] ?? {});
183
+ }
184
+ async update(id, params) {
185
+ const rows = await this.client
186
+ .update(this.table)
187
+ .set(this.writableData(params))
188
+ .where(eq(this.idColumn, this.castId(id)))
189
+ .returning();
190
+ return (rows[0] ?? {});
191
+ }
192
+ async delete(id) {
193
+ await this.client
194
+ .delete(this.table)
195
+ .where(eq(this.idColumn, this.castId(id)));
196
+ }
197
+ supportsTimeSeries() {
198
+ return true;
199
+ }
200
+ async aggregateTimeSeries(filter, query) {
201
+ const series = await this.runTimeSeriesQuery(filter, query);
202
+ let previous;
203
+ if (query.comparePrevious) {
204
+ const span = query.to.getTime() - query.from.getTime();
205
+ const prevTo = new Date(query.from.getTime());
206
+ const prevFrom = new Date(query.from.getTime() - span);
207
+ previous = (await this.runTimeSeriesQuery(filter, { ...query, from: prevFrom, to: prevTo })).series;
208
+ }
209
+ return {
210
+ series: series.series,
211
+ ...(previous ? { previous } : {}),
212
+ sql: series.sql,
213
+ };
214
+ }
215
+ async runTimeSeriesQuery(filter, query) {
216
+ const dateCol = this.table[query.dateField];
217
+ if (!dateCol) {
218
+ throw new Error(`aggregateTimeSeries: dateField "${query.dateField}" not found on resource "${this._id}"`);
219
+ }
220
+ let fieldCol;
221
+ if (query.metric !== 'count') {
222
+ if (!query.field) {
223
+ throw new Error(`aggregateTimeSeries: metric "${query.metric}" requires "field"`);
224
+ }
225
+ fieldCol = this.table[query.field];
226
+ if (!fieldCol) {
227
+ throw new Error(`aggregateTimeSeries: field "${query.field}" not found`);
228
+ }
229
+ }
230
+ let groupCol;
231
+ if (query.groupBy) {
232
+ groupCol = this.table[query.groupBy];
233
+ if (!groupCol) {
234
+ throw new Error(`aggregateTimeSeries: groupBy "${query.groupBy}" not found`);
235
+ }
236
+ }
237
+ const bucketSql = bucketExpr(this.dialect, query.step, dateCol);
238
+ const metricSql = metricExpr(query.metric, fieldCol);
239
+ // WHERE = date range + user filters.
240
+ const conds = [
241
+ gte(dateCol, query.from),
242
+ lte(dateCol, query.to),
243
+ ];
244
+ const filterWhere = filterToWhere(filter, this.table);
245
+ if (filterWhere !== undefined)
246
+ conds.push(filterWhere);
247
+ const where = conds.length === 1 ? conds[0] : and(...conds);
248
+ const select = { value: metricSql };
249
+ if (query.step !== 'all')
250
+ select.bucket = bucketSql;
251
+ if (groupCol)
252
+ select.series_key = groupCol;
253
+ let qb = this.client.select(select).from(this.table).where(where);
254
+ const groupKeys = [];
255
+ if (query.step !== 'all')
256
+ groupKeys.push(bucketSql);
257
+ if (groupCol)
258
+ groupKeys.push(groupCol);
259
+ if (groupKeys.length)
260
+ qb = qb.groupBy(...groupKeys);
261
+ if (query.step !== 'all')
262
+ qb = qb.orderBy(asc(bucketSql));
263
+ const rows = (await qb);
264
+ // Bucket → series_key → numeric value.
265
+ const fromIso = isoDate(query.from);
266
+ const seriesMap = new Map();
267
+ for (const row of rows) {
268
+ const seriesKey = groupCol ? stringifyKey(row.series_key) : '__total__';
269
+ const bucketKey = query.step === 'all' ? fromIso : isoDate(toDate(row.bucket));
270
+ const num = toNumber(row.value);
271
+ let inner = seriesMap.get(seriesKey);
272
+ if (!inner) {
273
+ inner = new Map();
274
+ seriesMap.set(seriesKey, inner);
275
+ }
276
+ inner.set(bucketKey, num);
277
+ }
278
+ // Top-N truncation: rank series by total, keep top N, collapse rest into '__other__'.
279
+ const topN = query.topN ?? 10;
280
+ const totals = Array.from(seriesMap.entries()).map(([k, m]) => [k, sumValues(m)]);
281
+ totals.sort((a, b) => b[1] - a[1]);
282
+ const keep = new Set(totals.slice(0, topN).map(([k]) => k));
283
+ const otherInner = new Map();
284
+ for (const [key, inner] of seriesMap) {
285
+ if (keep.has(key))
286
+ continue;
287
+ for (const [bucket, val] of inner) {
288
+ otherInner.set(bucket, (otherInner.get(bucket) ?? 0) + val);
289
+ }
290
+ seriesMap.delete(key);
291
+ }
292
+ if (otherInner.size > 0) {
293
+ seriesMap.set('__other__', otherInner);
294
+ }
295
+ const seriesOut = [];
296
+ for (const [key, inner] of seriesMap) {
297
+ const points = Array.from(inner.entries())
298
+ .map(([date, value]) => ({ date, value }))
299
+ .sort((a, b) => a.date.localeCompare(b.date));
300
+ seriesOut.push({ key, points });
301
+ }
302
+ return {
303
+ series: seriesOut,
304
+ sql: buildDisplaySql(this.dialect, this.databaseName(), query, filter),
305
+ };
306
+ }
307
+ async transaction(fn) {
308
+ if (typeof this.client.transaction !== 'function')
309
+ return fn();
310
+ return this.client.transaction(async () => fn());
311
+ }
312
+ }
313
+ // ─── Time-series helpers ─────────────────────────────────────────────────
314
+ const bucketExpr = (dialect, step, dateCol) => {
315
+ if (step === 'all')
316
+ return sql `MIN(${dateCol})`;
317
+ if (dialect === 'pg') {
318
+ return sql `DATE_TRUNC(${step}, ${dateCol})`;
319
+ }
320
+ if (dialect === 'mysql') {
321
+ const fmt = step === 'day'
322
+ ? '%Y-%m-%d'
323
+ : step === 'week'
324
+ ? '%x-W%v'
325
+ : step === 'month'
326
+ ? '%Y-%m-01'
327
+ : '%Y-01-01';
328
+ return sql `DATE_FORMAT(${dateCol}, ${fmt})`;
329
+ }
330
+ // sqlite
331
+ const fmt = step === 'day'
332
+ ? '%Y-%m-%d'
333
+ : step === 'week'
334
+ ? '%Y-W%W'
335
+ : step === 'month'
336
+ ? '%Y-%m-01'
337
+ : '%Y-01-01';
338
+ return sql `STRFTIME(${fmt}, ${dateCol})`;
339
+ };
340
+ const metricExpr = (op, fieldCol) => {
341
+ if (op === 'count')
342
+ return sql `COUNT(*)`;
343
+ if (!fieldCol) {
344
+ throw new Error(`metric "${op}" requires field`);
345
+ }
346
+ switch (op) {
347
+ case 'sum':
348
+ return sql `SUM(${fieldCol})`;
349
+ case 'avg':
350
+ return sql `AVG(${fieldCol})`;
351
+ case 'min':
352
+ return sql `MIN(${fieldCol})`;
353
+ case 'max':
354
+ return sql `MAX(${fieldCol})`;
355
+ }
356
+ };
357
+ const isoDate = (d) => d.toISOString().slice(0, 10);
358
+ const toDate = (v) => {
359
+ if (v instanceof Date)
360
+ return v;
361
+ if (typeof v === 'string' || typeof v === 'number')
362
+ return new Date(v);
363
+ return new Date(String(v));
364
+ };
365
+ const toNumber = (v) => {
366
+ if (typeof v === 'number')
367
+ return v;
368
+ if (v == null)
369
+ return 0;
370
+ const n = Number(v);
371
+ return Number.isFinite(n) ? n : 0;
372
+ };
373
+ const stringifyKey = (v) => {
374
+ if (v == null)
375
+ return '__null__';
376
+ if (typeof v === 'string')
377
+ return v;
378
+ return String(v);
379
+ };
380
+ const sumValues = (m) => {
381
+ let s = 0;
382
+ for (const v of m.values())
383
+ s += v;
384
+ return s;
385
+ };
386
+ const buildDisplaySql = (dialect, tableName, query, filter) => {
387
+ const ident = (s) => (dialect === 'mysql' ? `\`${s}\`` : `"${s}"`);
388
+ const t = ident(tableName);
389
+ const dateCol = ident(query.dateField);
390
+ const bucket = query.step === 'all'
391
+ ? `MIN(${dateCol})`
392
+ : dialect === 'pg'
393
+ ? `DATE_TRUNC('${query.step}', ${dateCol})`
394
+ : dialect === 'mysql'
395
+ ? `DATE_FORMAT(${dateCol}, ${mysqlFmt(query.step)})`
396
+ : `STRFTIME(${sqliteFmt(query.step)}, ${dateCol})`;
397
+ const metric = query.metric === 'count'
398
+ ? 'COUNT(*)'
399
+ : `${query.metric.toUpperCase()}(${ident(query.field)})`;
400
+ const cols = [];
401
+ if (query.step !== 'all')
402
+ cols.push(`${bucket} AS bucket`);
403
+ cols.push(`${metric} AS value`);
404
+ if (query.groupBy)
405
+ cols.push(`${ident(query.groupBy)} AS series_key`);
406
+ const where = [
407
+ `${dateCol} >= '${query.from.toISOString()}'`,
408
+ `${dateCol} <= '${query.to.toISOString()}'`,
409
+ ];
410
+ filter.reduce((_, el) => {
411
+ where.push(`${ident(el.path)} = '${String(el.value)}'`);
412
+ return null;
413
+ }, null);
414
+ const groupBy = [];
415
+ if (query.step !== 'all')
416
+ groupBy.push('bucket');
417
+ if (query.groupBy)
418
+ groupBy.push('series_key');
419
+ const lines = [
420
+ `SELECT ${cols.join(', ')}`,
421
+ `FROM ${t}`,
422
+ `WHERE ${where.join(' AND ')}`,
423
+ ];
424
+ if (groupBy.length)
425
+ lines.push(`GROUP BY ${groupBy.join(', ')}`);
426
+ if (query.step !== 'all')
427
+ lines.push('ORDER BY bucket ASC');
428
+ return lines.join('\n');
429
+ };
430
+ const mysqlFmt = (step) => step === 'day'
431
+ ? "'%Y-%m-%d'"
432
+ : step === 'week'
433
+ ? "'%x-W%v'"
434
+ : step === 'month'
435
+ ? "'%Y-%m-01'"
436
+ : "'%Y-01-01'";
437
+ const sqliteFmt = (step) => step === 'day'
438
+ ? "'%Y-%m-%d'"
439
+ : step === 'week'
440
+ ? "'%Y-W%W'"
441
+ : step === 'month'
442
+ ? "'%Y-%m-01'"
443
+ : "'%Y-01-01'";
444
+ //# sourceMappingURL=resource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.js","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ export interface DrizzleColumn {
2
+ name: string;
3
+ /** drizzle's runtime data tag — 'string', 'number', 'boolean', 'date', 'json', 'bigint', 'buffer', 'array'. */
4
+ dataType: string;
5
+ /** specific column kind such as 'PgUUID', 'PgEnum', 'PgText', 'PgArray'. Optional. */
6
+ columnType?: string;
7
+ primary?: boolean;
8
+ notNull?: boolean;
9
+ hasDefault?: boolean;
10
+ enumValues?: readonly string[];
11
+ /** For PgArray columns — points to the inner element column. */
12
+ baseColumn?: DrizzleColumn;
13
+ }
14
+ export type DrizzleTable = Record<string, DrizzleColumn> & {
15
+ /** drizzle's hidden table metadata bag. */
16
+ _?: {
17
+ name?: string;
18
+ };
19
+ };
20
+ export interface DrizzleQueryBuilder<T> {
21
+ where(condition: unknown): DrizzleQueryBuilder<T>;
22
+ orderBy(...columns: unknown[]): DrizzleQueryBuilder<T>;
23
+ groupBy(...columns: unknown[]): DrizzleQueryBuilder<T>;
24
+ limit(n: number): DrizzleQueryBuilder<T>;
25
+ offset(n: number): DrizzleQueryBuilder<T>;
26
+ then<U>(onfulfilled?: (value: T[]) => U | PromiseLike<U>): Promise<U>;
27
+ }
28
+ export interface DrizzleSelectBuilder {
29
+ from(table: DrizzleTable): DrizzleQueryBuilder<Record<string, unknown>>;
30
+ }
31
+ export interface DrizzleInsertBuilder {
32
+ values(value: Record<string, unknown>): {
33
+ returning(): Promise<Array<Record<string, unknown>>>;
34
+ };
35
+ }
36
+ export interface DrizzleUpdateBuilder {
37
+ set(values: Record<string, unknown>): {
38
+ where(condition: unknown): {
39
+ returning(): Promise<Array<Record<string, unknown>>>;
40
+ };
41
+ };
42
+ }
43
+ export interface DrizzleDeleteBuilder {
44
+ where(condition: unknown): Promise<unknown>;
45
+ }
46
+ export interface DrizzleClientLike {
47
+ select(): DrizzleSelectBuilder;
48
+ select(fields: Record<string, unknown>): DrizzleSelectBuilder;
49
+ insert(table: DrizzleTable): DrizzleInsertBuilder;
50
+ update(table: DrizzleTable): DrizzleUpdateBuilder;
51
+ delete(table: DrizzleTable): DrizzleDeleteBuilder;
52
+ transaction?<T>(fn: (tx: DrizzleClientLike) => Promise<T>): Promise<T>;
53
+ }
54
+ export interface DrizzleSchema {
55
+ [tableName: string]: DrizzleTable;
56
+ }
57
+ export type DrizzleDialect = 'pg' | 'mysql' | 'sqlite';
58
+ export interface DrizzleResourceConfig {
59
+ /** Override the resource id (defaults to drizzle's table name). */
60
+ id?: string;
61
+ }
62
+ export interface DrizzleDatabaseConfig {
63
+ /** drizzle client, e.g. `drizzle(pool, { schema })`. */
64
+ client: DrizzleClientLike;
65
+ /** drizzle schema (object exporting tables). */
66
+ schema: DrizzleSchema;
67
+ /**
68
+ * Database dialect. Required to build dialect-specific SQL for
69
+ * `aggregateTimeSeries` (DATE_TRUNC vs DATE_FORMAT vs strftime).
70
+ * Defaults to `'pg'` when omitted.
71
+ */
72
+ dialect?: DrizzleDialect;
73
+ /** Optional per-table overrides. */
74
+ resources?: Record<string, DrizzleResourceConfig>;
75
+ }
76
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,6 @@
1
+ // Structural types matching the surface of `drizzle-orm` we depend on.
2
+ // Importing the real types breaks for consumers who use a different DB driver
3
+ // (pg, mysql, sqlite) since each has its own column/table classes — keeping
4
+ // this duck-typed lets the adapter work uniformly across drivers.
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,uEAAuE;AACvE,8EAA8E;AAC9E,4EAA4E;AAC5E,kEAAkE"}
package/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@modern-admin/adapter-drizzle",
3
+ "version": "0.1.0",
4
+ "description": "Drizzle ORM adapter for Modern Admin — implements BaseDatabase/BaseResource on Drizzle schemas.",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/modern-admin/modern-admin.git",
10
+ "directory": "packages/adapter-drizzle"
11
+ },
12
+ "main": "./dist/index.js",
13
+ "types": "./dist/index.d.ts",
14
+ "exports": {
15
+ ".": {
16
+ "types": "./dist/index.d.ts",
17
+ "default": "./dist/index.js"
18
+ }
19
+ },
20
+ "files": [
21
+ "dist",
22
+ "src"
23
+ ],
24
+ "publishConfig": {
25
+ "registry": "https://registry.npmjs.org",
26
+ "access": "public",
27
+ "main": "./dist/index.js",
28
+ "types": "./dist/index.d.ts",
29
+ "exports": {
30
+ ".": {
31
+ "types": "./dist/index.d.ts",
32
+ "default": "./dist/index.js"
33
+ }
34
+ }
35
+ },
36
+ "dependencies": {
37
+ "@modern-admin/core": "0.1.0"
38
+ },
39
+ "devDependencies": {
40
+ "@modern-admin/tsconfig": "0.1.0",
41
+ "@types/bun": "^1.3.13",
42
+ "drizzle-orm": "^0.45.2",
43
+ "typescript": "^6.0.3"
44
+ },
45
+ "peerDependencies": {
46
+ "drizzle-orm": "^0.45.2"
47
+ }
48
+ }