@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,16 @@
1
+ import type { Filter, FindOptions } from '@modern-admin/core';
2
+ import type { DrizzleTable } from './types.js';
3
+ /**
4
+ * Convert a core Filter into a drizzle `where` SQL condition. Returns
5
+ * `undefined` when no usable filter was provided so the caller can omit
6
+ * `.where()` entirely.
7
+ */
8
+ export declare const filterToWhere: (filter: Filter, table: DrizzleTable) => unknown;
9
+ export interface DrizzleFindShape {
10
+ where: unknown;
11
+ limit?: number;
12
+ offset?: number;
13
+ orderBy?: unknown;
14
+ }
15
+ export declare const findOptionsToDrizzle: (options: FindOptions, table: DrizzleTable) => Pick<DrizzleFindShape, "limit" | "offset" | "orderBy">;
16
+ //# sourceMappingURL=converters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"converters.d.ts","sourceRoot":"","sources":["../src/converters.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAA8C,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAEzG,OAAO,KAAK,EAAiB,YAAY,EAAE,MAAM,YAAY,CAAA;AAgN7D;;;;GAIG;AACH,eAAO,MAAM,aAAa,GACxB,QAAQ,MAAM,EACd,OAAO,YAAY,KAClB,OAUF,CAAA;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,eAAO,MAAM,oBAAoB,GAC/B,SAAS,WAAW,EACpB,OAAO,YAAY,KAClB,IAAI,CAAC,gBAAgB,EAAE,OAAO,GAAG,QAAQ,GAAG,SAAS,CAYvD,CAAA"}
@@ -0,0 +1,225 @@
1
+ import { and, arrayContains, arrayOverlaps, asc, desc, eq, gt, gte, ilike, inArray, isNotNull, isNull, like, lt, lte, ne, not, or } from 'drizzle-orm';
2
+ const isRangeValue = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
3
+ const coerceScalar = (value, property) => {
4
+ if (value == null || typeof value === 'boolean')
5
+ return value;
6
+ if (Array.isArray(value))
7
+ return value.map((v) => coerceScalar(v, property));
8
+ if (typeof value === 'number')
9
+ return value;
10
+ if (typeof value !== 'string')
11
+ return value;
12
+ if (!property)
13
+ return value;
14
+ switch (property.type()) {
15
+ case 'number':
16
+ case 'currency': {
17
+ const n = Number(value);
18
+ return Number.isFinite(n) ? n : value;
19
+ }
20
+ case 'float': {
21
+ const n = parseFloat(value);
22
+ return Number.isFinite(n) ? n : value;
23
+ }
24
+ case 'boolean':
25
+ return value === 'true' || value === '1';
26
+ case 'date':
27
+ case 'datetime': {
28
+ const d = new Date(value);
29
+ return Number.isNaN(d.getTime()) ? value : d;
30
+ }
31
+ default:
32
+ return value;
33
+ }
34
+ };
35
+ /** Return the case-insensitive `like` function appropriate for the dialect. */
36
+ const ciLike = (column) => column.columnType?.startsWith('Pg') ? ilike : like;
37
+ /**
38
+ * Wrap a value in `%...%` for a LIKE/ILIKE contains match.
39
+ * The `%` characters within the user value are escaped so they match literally.
40
+ */
41
+ const likeContains = (v) => `%${v}%`;
42
+ const likeStartsWith = (v) => `${v}%`;
43
+ const likeEndsWith = (v) => `%${v}`;
44
+ /**
45
+ * Build a drizzle condition for a single filter element.
46
+ * When an explicit `operator` is set, it takes precedence over legacy implicit
47
+ * behaviour. All string comparisons use `ilike` (Postgres) / `like` (others)
48
+ * for case-insensitive matching.
49
+ */
50
+ const elementToCondition = (element, table) => {
51
+ const property = element.property;
52
+ if (!property)
53
+ return null;
54
+ const column = table[element.path];
55
+ if (!column)
56
+ return null;
57
+ const { value, operator } = element;
58
+ // ── Explicit operator ────────────────────────────────────────────────
59
+ if (operator) {
60
+ return buildOperatorCondition(operator, value, property, column);
61
+ }
62
+ // ── Legacy implicit behaviour (backward compat) ──────────────────────
63
+ if (Array.isArray(value)) {
64
+ const list = value.map((v) => coerceScalar(v, property));
65
+ if (!list.length)
66
+ return null;
67
+ if (property.isArray())
68
+ return arrayOverlaps(column, list);
69
+ return inArray(column, list);
70
+ }
71
+ if (isRangeValue(value)) {
72
+ const conds = [];
73
+ if (value.from !== undefined && value.from !== '') {
74
+ conds.push(gte(column, coerceScalar(value.from, property)));
75
+ }
76
+ if (value.to !== undefined && value.to !== '') {
77
+ conds.push(lte(column, coerceScalar(value.to, property)));
78
+ }
79
+ if (!conds.length)
80
+ return null;
81
+ return conds.length === 1 ? conds[0] : and(...conds);
82
+ }
83
+ const coerced = coerceScalar(value, property);
84
+ if (property.isArray()) {
85
+ return arrayContains(column, [coerced]);
86
+ }
87
+ if (property.type() === 'string' && typeof coerced === 'string') {
88
+ const op = ciLike(column);
89
+ return op(column, likeContains(coerced));
90
+ }
91
+ return eq(column, coerced);
92
+ };
93
+ /**
94
+ * Translate an explicit FilterOperator to a drizzle SQL condition.
95
+ * String comparisons use `ilike` (PG) / `like` (others).
96
+ */
97
+ const buildOperatorCondition = (operator, value, property, column) => {
98
+ const isString = property.type() === 'string';
99
+ switch (operator) {
100
+ case 'eq': {
101
+ const coerced = coerceScalar(value, property);
102
+ if (isString && typeof coerced === 'string') {
103
+ const op = ciLike(column);
104
+ // Exact match via ILIKE without wildcards (case-insensitive equals)
105
+ return op(column, coerced);
106
+ }
107
+ return eq(column, coerced);
108
+ }
109
+ case 'neq': {
110
+ const coerced = coerceScalar(value, property);
111
+ if (isString && typeof coerced === 'string') {
112
+ const op = ciLike(column);
113
+ return not(op(column, coerced));
114
+ }
115
+ return ne(column, coerced);
116
+ }
117
+ case 'co': {
118
+ const coerced = coerceScalar(value, property);
119
+ if (typeof coerced === 'string') {
120
+ const op = ciLike(column);
121
+ return op(column, likeContains(coerced));
122
+ }
123
+ return eq(column, coerced);
124
+ }
125
+ case 'nco': {
126
+ const coerced = coerceScalar(value, property);
127
+ if (typeof coerced === 'string') {
128
+ const op = ciLike(column);
129
+ return not(op(column, likeContains(coerced)));
130
+ }
131
+ return ne(column, coerced);
132
+ }
133
+ case 'sw': {
134
+ const coerced = coerceScalar(value, property);
135
+ if (typeof coerced === 'string') {
136
+ const op = ciLike(column);
137
+ return op(column, likeStartsWith(coerced));
138
+ }
139
+ return eq(column, coerced);
140
+ }
141
+ case 'ew': {
142
+ const coerced = coerceScalar(value, property);
143
+ if (typeof coerced === 'string') {
144
+ const op = ciLike(column);
145
+ return op(column, likeEndsWith(coerced));
146
+ }
147
+ return eq(column, coerced);
148
+ }
149
+ case 'empty':
150
+ return or(isNull(column), eq(column, ''));
151
+ case 'nempty':
152
+ return and(isNotNull(column), ne(column, ''));
153
+ case 'in': {
154
+ if (Array.isArray(value)) {
155
+ const list = value.map((v) => coerceScalar(v, property));
156
+ if (!list.length)
157
+ return null;
158
+ if (property.isArray())
159
+ return arrayOverlaps(column, list);
160
+ return inArray(column, list);
161
+ }
162
+ const coerced = coerceScalar(value, property);
163
+ return eq(column, coerced);
164
+ }
165
+ case 'gt': {
166
+ const coerced = coerceScalar(value, property);
167
+ return gt(column, coerced);
168
+ }
169
+ case 'lt': {
170
+ const coerced = coerceScalar(value, property);
171
+ return lt(column, coerced);
172
+ }
173
+ case 'between': {
174
+ const str = typeof value === 'string' ? value : '';
175
+ const comma = str.indexOf(',');
176
+ const fromStr = comma >= 0 ? str.slice(0, comma) : str;
177
+ const toStr = comma >= 0 ? str.slice(comma + 1) : '';
178
+ const conds = [];
179
+ if (fromStr)
180
+ conds.push(gte(column, coerceScalar(fromStr, property)));
181
+ if (toStr)
182
+ conds.push(lte(column, coerceScalar(toStr, property)));
183
+ if (!conds.length)
184
+ return null;
185
+ return conds.length === 1 ? conds[0] : and(...conds);
186
+ }
187
+ default:
188
+ return null;
189
+ }
190
+ };
191
+ /**
192
+ * Convert a core Filter into a drizzle `where` SQL condition. Returns
193
+ * `undefined` when no usable filter was provided so the caller can omit
194
+ * `.where()` entirely.
195
+ */
196
+ export const filterToWhere = (filter, table) => {
197
+ const conditions = [];
198
+ filter.reduce((_, element) => {
199
+ const cond = elementToCondition(element, table);
200
+ if (cond != null)
201
+ conditions.push(cond);
202
+ return null;
203
+ }, null);
204
+ if (conditions.length === 0)
205
+ return undefined;
206
+ if (conditions.length === 1)
207
+ return conditions[0];
208
+ return and(...conditions);
209
+ };
210
+ export const findOptionsToDrizzle = (options, table) => {
211
+ const out = {};
212
+ if (options.limit != null)
213
+ out.limit = options.limit;
214
+ if (options.offset != null)
215
+ out.offset = options.offset;
216
+ const sortBy = options.sort?.sortBy;
217
+ if (sortBy) {
218
+ const column = table[sortBy];
219
+ if (column) {
220
+ out.orderBy = (options.sort?.direction === 'desc' ? desc : asc)(column);
221
+ }
222
+ }
223
+ return out;
224
+ };
225
+ //# sourceMappingURL=converters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"converters.js","sourceRoot":"","sources":["../src/converters.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,aAAa,EAAE,aAAa,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,aAAa,CAAA;AAKtJ,MAAM,YAAY,GAAG,CACnB,KAAkB,EACuB,EAAE,CAC3C,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;AAEtE,MAAM,YAAY,GAAG,CACnB,KAAkB,EAClB,QAAgC,EACvB,EAAE;IACX,IAAI,KAAK,IAAI,IAAI,IAAI,OAAO,KAAK,KAAK,SAAS;QAAE,OAAO,KAAK,CAAA;IAC7D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAgB,EAAE,QAAQ,CAAC,CAAC,CAAA;IAC3F,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC3C,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAA;IAC3B,QAAQ,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;QAC1B,KAAK,QAAQ,CAAC;QACd,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAA;YACvB,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QACvC,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAA;YAC3B,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;QACvC,CAAC;QACD,KAAK,SAAS;YACZ,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,GAAG,CAAA;QAC1C,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,CAAA;YACzB,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9C,CAAC;QACD;YACE,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC,CAAA;AAED,+EAA+E;AAC/E,MAAM,MAAM,GAAG,CAAC,MAAqB,EAAE,EAAE,CACtC,MAAwB,CAAC,UAAU,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;AAEvE;;;GAGG;AACH,MAAM,YAAY,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAA;AAC5C,MAAM,cAAc,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAA;AAC7C,MAAM,YAAY,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAA;AAE3C;;;;;GAKG;AACH,MAAM,kBAAkB,GAAG,CACzB,OAAsB,EACtB,KAAmB,EACV,EAAE;IACX,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAkC,CAAA;IAC3D,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAA;IAC1B,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAA8B,CAAA;IAC/D,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA;IACxB,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAA;IAEnC,wEAAwE;IACxE,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,sBAAsB,CAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;IAClE,CAAC;IAED,wEAAwE;IACxE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAgB,EAAE,QAAQ,CAAC,CAAc,CAAA;QACpF,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QAC7B,IAAI,QAAQ,CAAC,OAAO,EAAE;YAAE,OAAO,aAAa,CAAC,MAAe,EAAE,IAAa,CAAC,CAAA;QAC5E,OAAO,OAAO,CAAC,MAAe,EAAE,IAAa,CAAC,CAAA;IAChD,CAAC;IAED,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,KAAK,GAAc,EAAE,CAAA;QAC3B,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,IAAI,KAAK,CAAC,IAAI,KAAK,EAAE,EAAE,CAAC;YAClD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAe,EAAE,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAU,CAAC,CAAC,CAAA;QAC/E,CAAC;QACD,IAAI,KAAK,CAAC,EAAE,KAAK,SAAS,IAAI,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;YAC9C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAe,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,QAAQ,CAAU,CAAC,CAAC,CAAA;QAC7E,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,OAAO,IAAI,CAAA;QAC9B,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAI,KAAiB,CAAC,CAAA;IACnE,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;IAC7C,IAAI,QAAQ,CAAC,OAAO,EAAE,EAAE,CAAC;QACvB,OAAO,aAAa,CAAC,MAAe,EAAE,CAAC,OAAO,CAAU,CAAC,CAAA;IAC3D,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChE,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;QACzB,OAAO,EAAE,CAAC,MAAe,EAAE,YAAY,CAAC,OAAO,CAAU,CAAC,CAAA;IAC5D,CAAC;IACD,OAAO,EAAE,CAAC,MAAe,EAAE,OAAgB,CAAC,CAAA;AAC9C,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,sBAAsB,GAAG,CAC7B,QAAwB,EACxB,KAAkB,EAClB,QAAyB,EACzB,MAAqB,EACZ,EAAE;IACX,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAA;IAE7C,QAAQ,QAAQ,EAAE,CAAC;QACnB,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;YAC7C,IAAI,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAC5C,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;gBACzB,oEAAoE;gBACpE,OAAO,EAAE,CAAC,MAAe,EAAE,OAAgB,CAAC,CAAA;YAC9C,CAAC;YACD,OAAO,EAAE,CAAC,MAAe,EAAE,OAAgB,CAAC,CAAA;QAC9C,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;YAC7C,IAAI,QAAQ,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAC5C,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;gBACzB,OAAO,GAAG,CAAC,EAAE,CAAC,MAAe,EAAE,OAAgB,CAAC,CAAC,CAAA;YACnD,CAAC;YACD,OAAO,EAAE,CAAC,MAAe,EAAE,OAAgB,CAAC,CAAA;QAC9C,CAAC;QACD,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;YAC7C,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAChC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;gBACzB,OAAO,EAAE,CAAC,MAAe,EAAE,YAAY,CAAC,OAAO,CAAU,CAAC,CAAA;YAC5D,CAAC;YACD,OAAO,EAAE,CAAC,MAAe,EAAE,OAAgB,CAAC,CAAA;QAC9C,CAAC;QACD,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;YAC7C,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAChC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;gBACzB,OAAO,GAAG,CAAC,EAAE,CAAC,MAAe,EAAE,YAAY,CAAC,OAAO,CAAU,CAAC,CAAC,CAAA;YACjE,CAAC;YACD,OAAO,EAAE,CAAC,MAAe,EAAE,OAAgB,CAAC,CAAA;QAC9C,CAAC;QACD,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;YAC7C,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAChC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;gBACzB,OAAO,EAAE,CAAC,MAAe,EAAE,cAAc,CAAC,OAAO,CAAU,CAAC,CAAA;YAC9D,CAAC;YACD,OAAO,EAAE,CAAC,MAAe,EAAE,OAAgB,CAAC,CAAA;QAC9C,CAAC;QACD,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;YAC7C,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAChC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAA;gBACzB,OAAO,EAAE,CAAC,MAAe,EAAE,YAAY,CAAC,OAAO,CAAU,CAAC,CAAA;YAC5D,CAAC;YACD,OAAO,EAAE,CAAC,MAAe,EAAE,OAAgB,CAAC,CAAA;QAC9C,CAAC;QACD,KAAK,OAAO;YACV,OAAO,EAAE,CACP,MAAM,CAAC,MAAe,CAAC,EACvB,EAAE,CAAC,MAAe,EAAE,EAAW,CAAC,CACjC,CAAA;QACH,KAAK,QAAQ;YACX,OAAO,GAAG,CACR,SAAS,CAAC,MAAe,CAAC,EAC1B,EAAE,CAAC,MAAe,EAAE,EAAW,CAAC,CACjC,CAAA;QACH,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzB,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAgB,EAAE,QAAQ,CAAC,CAAc,CAAA;gBACpF,IAAI,CAAC,IAAI,CAAC,MAAM;oBAAE,OAAO,IAAI,CAAA;gBAC7B,IAAI,QAAQ,CAAC,OAAO,EAAE;oBAAE,OAAO,aAAa,CAAC,MAAe,EAAE,IAAa,CAAC,CAAA;gBAC5E,OAAO,OAAO,CAAC,MAAe,EAAE,IAAa,CAAC,CAAA;YAChD,CAAC;YACD,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;YAC7C,OAAO,EAAE,CAAC,MAAe,EAAE,OAAgB,CAAC,CAAA;QAC9C,CAAC;QACD,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;YAC7C,OAAO,EAAE,CAAC,MAAe,EAAE,OAAgB,CAAC,CAAA;QAC9C,CAAC;QACD,KAAK,IAAI,CAAC,CAAC,CAAC;YACV,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;YAC7C,OAAO,EAAE,CAAC,MAAe,EAAE,OAAgB,CAAC,CAAA;QAC9C,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAA;YAClD,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YAC9B,MAAM,OAAO,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;YACtD,MAAM,KAAK,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;YACpD,MAAM,KAAK,GAAc,EAAE,CAAA;YAC3B,IAAI,OAAO;gBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAe,EAAE,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAU,CAAC,CAAC,CAAA;YACvF,IAAI,KAAK;gBAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAe,EAAE,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAU,CAAC,CAAC,CAAA;YACnF,IAAI,CAAC,KAAK,CAAC,MAAM;gBAAE,OAAO,IAAI,CAAA;YAC9B,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAI,KAAiB,CAAC,CAAA;QACnE,CAAC;QACD;YACE,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,MAAc,EACd,KAAmB,EACV,EAAE;IACX,MAAM,UAAU,GAAc,EAAE,CAAA;IAChC,MAAM,CAAC,MAAM,CAAO,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE;QACjC,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAA;QAC/C,IAAI,IAAI,IAAI,IAAI;YAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACvC,OAAO,IAAI,CAAA;IACb,CAAC,EAAE,IAAI,CAAC,CAAA;IACR,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,SAAS,CAAA;IAC7C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC,CAAC,CAAC,CAAA;IACjD,OAAO,GAAG,CAAC,GAAI,UAAsB,CAAC,CAAA;AACxC,CAAC,CAAA;AASD,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAClC,OAAoB,EACpB,KAAmB,EACqC,EAAE;IAC1D,MAAM,GAAG,GAA2D,EAAE,CAAA;IACtE,IAAI,OAAO,CAAC,KAAK,IAAI,IAAI;QAAE,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAA;IACpD,IAAI,OAAO,CAAC,MAAM,IAAI,IAAI;QAAE,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;IACvD,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAA;IACnC,IAAI,MAAM,EAAE,CAAC;QACX,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAA8B,CAAA;QACzD,IAAI,MAAM,EAAE,CAAC;YACX,GAAG,CAAC,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,MAAe,CAAC,CAAA;QAClF,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA"}
@@ -0,0 +1,10 @@
1
+ import { BaseDatabase } from '@modern-admin/core';
2
+ import { DrizzleResource } from './resource.js';
3
+ import type { DrizzleDatabaseConfig } from './types.js';
4
+ export declare class DrizzleDatabase extends BaseDatabase {
5
+ readonly config: DrizzleDatabaseConfig;
6
+ constructor(config: unknown);
7
+ static isAdapterFor(db: unknown): boolean;
8
+ resources(): DrizzleResource[];
9
+ }
10
+ //# sourceMappingURL=database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,KAAK,EAAE,qBAAqB,EAAgB,MAAM,YAAY,CAAA;AA2BrE,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,SAAgB,MAAM,EAAE,qBAAqB,CAAA;gBAEjC,MAAM,EAAE,OAAO;WAQX,YAAY,CAAC,EAAE,EAAE,OAAO,GAAG,OAAO;IAIzC,SAAS,IAAI,eAAe,EAAE;CAoBxC"}
@@ -0,0 +1,56 @@
1
+ import { BaseDatabase } from '@modern-admin/core';
2
+ import { DrizzleResource } from './resource.js';
3
+ const isDrizzleDatabaseConfig = (db) => typeof db === 'object' &&
4
+ db !== null &&
5
+ 'client' in db &&
6
+ 'schema' in db &&
7
+ typeof db.schema === 'object';
8
+ const looksLikeTable = (value) => {
9
+ if (!value || typeof value !== 'object')
10
+ return false;
11
+ // Drizzle tables expose at least one column with `name` + `dataType`.
12
+ for (const key of Object.keys(value)) {
13
+ if (key === '_')
14
+ continue;
15
+ const col = value[key];
16
+ if (col &&
17
+ typeof col === 'object' &&
18
+ typeof col.name === 'string' &&
19
+ typeof col.dataType === 'string') {
20
+ return true;
21
+ }
22
+ }
23
+ return false;
24
+ };
25
+ export class DrizzleDatabase extends BaseDatabase {
26
+ constructor(config) {
27
+ super(config);
28
+ if (!isDrizzleDatabaseConfig(config)) {
29
+ throw new Error('DrizzleDatabase requires { client, schema } config');
30
+ }
31
+ this.config = config;
32
+ }
33
+ static isAdapterFor(db) {
34
+ return isDrizzleDatabaseConfig(db);
35
+ }
36
+ resources() {
37
+ const { client, schema, resources: overrides, dialect } = this.config;
38
+ const out = [];
39
+ for (const tableKey of Object.keys(schema)) {
40
+ const table = schema[tableKey];
41
+ if (!looksLikeTable(table))
42
+ continue;
43
+ const cfg = overrides?.[tableKey] ?? {};
44
+ out.push(new DrizzleResource({
45
+ client,
46
+ schema,
47
+ table,
48
+ tableKey,
49
+ dialect: dialect ?? 'pg',
50
+ ...cfg,
51
+ }));
52
+ }
53
+ return out;
54
+ }
55
+ }
56
+ //# sourceMappingURL=database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAG/C,MAAM,uBAAuB,GAAG,CAAC,EAAW,EAA+B,EAAE,CAC3E,OAAO,EAAE,KAAK,QAAQ;IACtB,EAAE,KAAK,IAAI;IACX,QAAQ,IAAI,EAAE;IACd,QAAQ,IAAI,EAAE;IACd,OAAQ,EAA0B,CAAC,MAAM,KAAK,QAAQ,CAAA;AAExD,MAAM,cAAc,GAAG,CAAC,KAAc,EAAyB,EAAE;IAC/D,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAA;IACrD,sEAAsE;IACtE,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAgC,CAAC,EAAE,CAAC;QAChE,IAAI,GAAG,KAAK,GAAG;YAAE,SAAQ;QACzB,MAAM,GAAG,GAAI,KAAiC,CAAC,GAAG,CAAC,CAAA;QACnD,IACE,GAAG;YACH,OAAO,GAAG,KAAK,QAAQ;YACvB,OAAQ,GAA0B,CAAC,IAAI,KAAK,QAAQ;YACpD,OAAQ,GAA8B,CAAC,QAAQ,KAAK,QAAQ,EAC5D,CAAC;YACD,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC,CAAA;AAED,MAAM,OAAO,eAAgB,SAAQ,YAAY;IAG/C,YAAY,MAAe;QACzB,KAAK,CAAC,MAAM,CAAC,CAAA;QACb,IAAI,CAAC,uBAAuB,CAAC,MAAM,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAA;QACvE,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAED,MAAM,CAAU,YAAY,CAAC,EAAW;QACtC,OAAO,uBAAuB,CAAC,EAAE,CAAC,CAAA;IACpC,CAAC;IAEQ,SAAS;QAChB,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM,CAAA;QACrE,MAAM,GAAG,GAAsB,EAAE,CAAA;QACjC,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAA;YAC9B,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;gBAAE,SAAQ;YACpC,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAA;YACvC,GAAG,CAAC,IAAI,CACN,IAAI,eAAe,CAAC;gBAClB,MAAM;gBACN,MAAM;gBACN,KAAK;gBACL,QAAQ;gBACR,OAAO,EAAE,OAAO,IAAI,IAAI;gBACxB,GAAG,GAAG;aACP,CAAC,CACH,CAAA;QACH,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC;CACF"}
@@ -0,0 +1,6 @@
1
+ export { DrizzleDatabase } from './database.js';
2
+ export { DrizzleResource } from './resource.js';
3
+ export { DrizzleProperty, extractForeignKeys, findPrimaryColumn } from './property.js';
4
+ export { filterToWhere, findOptionsToDrizzle } from './converters.js';
5
+ export type { DrizzleClientLike, DrizzleColumn, DrizzleDatabaseConfig, DrizzleDeleteBuilder, DrizzleDialect, DrizzleInsertBuilder, DrizzleQueryBuilder, DrizzleResourceConfig, DrizzleSchema, DrizzleSelectBuilder, DrizzleTable, DrizzleUpdateBuilder, } from './types.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACtF,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AACrE,YAAY,EACV,iBAAiB,EACjB,aAAa,EACb,qBAAqB,EACrB,oBAAoB,EACpB,cAAc,EACd,oBAAoB,EACpB,mBAAmB,EACnB,qBAAqB,EACrB,aAAa,EACb,oBAAoB,EACpB,YAAY,EACZ,oBAAoB,GACrB,MAAM,YAAY,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,17 @@
1
+ // @modern-admin/adapter-drizzle — Drizzle ORM adapter for @modern-admin/core.
2
+ //
3
+ // Usage:
4
+ // import { drizzle } from 'drizzle-orm/node-postgres'
5
+ // import * as schema from './schema'
6
+ // import { DrizzleDatabase, DrizzleResource } from '@modern-admin/adapter-drizzle'
7
+ //
8
+ // const client = drizzle(pool, { schema })
9
+ // const admin = new ModernAdmin({
10
+ // databases: [{ client, schema }],
11
+ // adapters: [{ Database: DrizzleDatabase, Resource: DrizzleResource }],
12
+ // })
13
+ export { DrizzleDatabase } from './database.js';
14
+ export { DrizzleResource } from './resource.js';
15
+ export { DrizzleProperty, extractForeignKeys, findPrimaryColumn } from './property.js';
16
+ export { filterToWhere, findOptionsToDrizzle } from './converters.js';
17
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,EAAE;AACF,SAAS;AACT,wDAAwD;AACxD,uCAAuC;AACvC,qFAAqF;AACrF,EAAE;AACF,6CAA6C;AAC7C,oCAAoC;AACpC,uCAAuC;AACvC,4EAA4E;AAC5E,OAAO;AAEP,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAC/C,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACtF,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA"}
@@ -0,0 +1,20 @@
1
+ import { BaseProperty } from '@modern-admin/core';
2
+ import type { DrizzleColumn, DrizzleTable } from './types.js';
3
+ /**
4
+ * Property descriptor backed by a Drizzle column. Maps drizzle's runtime
5
+ * dataType / columnType tags onto the core PropertyType taxonomy.
6
+ */
7
+ export declare class DrizzleProperty extends BaseProperty {
8
+ readonly column: DrizzleColumn;
9
+ constructor(column: DrizzleColumn, reference?: string | null, position?: number);
10
+ private static resolveType;
11
+ }
12
+ /** Find the primary-key column in a drizzle table. Returns null when absent. */
13
+ export declare const findPrimaryColumn: (table: DrizzleTable) => DrizzleColumn | null;
14
+ /**
15
+ * Walk drizzle's hidden inline-FK symbol on a table and return a map of
16
+ * local column name → foreign table base name. Returns an empty map when
17
+ * the table has no FKs or when the structure differs (driver-specific).
18
+ */
19
+ export declare const extractForeignKeys: (table: DrizzleTable) => Record<string, string>;
20
+ //# sourceMappingURL=property.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property.d.ts","sourceRoot":"","sources":["../src/property.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,oBAAoB,CAAA;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAiB7D;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,SAAgB,MAAM,EAAE,aAAa,CAAA;gBAEzB,MAAM,EAAE,aAAa,EAAE,SAAS,GAAE,MAAM,GAAG,IAAW,EAAE,QAAQ,SAAI;IAmBhF,OAAO,CAAC,MAAM,CAAC,WAAW;CAuB3B;AAED,gFAAgF;AAChF,eAAO,MAAM,iBAAiB,GAAI,OAAO,YAAY,KAAG,aAAa,GAAG,IAOvE,CAAA;AAsBD;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,GAAI,OAAO,YAAY,KAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAoB7E,CAAA"}
@@ -0,0 +1,112 @@
1
+ import { BaseProperty } from '@modern-admin/core';
2
+ const DATA_TYPE_TO_PROPERTY = {
3
+ string: 'string',
4
+ number: 'number',
5
+ bigint: 'number',
6
+ boolean: 'boolean',
7
+ date: 'datetime',
8
+ json: 'json',
9
+ buffer: 'string',
10
+ };
11
+ const isUuidColumn = (name, columnType) => {
12
+ if (columnType && /uuid/i.test(columnType))
13
+ return true;
14
+ return /(^id$|Id$|_id$|uuid)/i.test(name);
15
+ };
16
+ /**
17
+ * Property descriptor backed by a Drizzle column. Maps drizzle's runtime
18
+ * dataType / columnType tags onto the core PropertyType taxonomy.
19
+ */
20
+ export class DrizzleProperty extends BaseProperty {
21
+ constructor(column, reference = null, position = 1) {
22
+ const isEnum = (column.enumValues?.length ?? 0) > 0;
23
+ const isArray = column.dataType === 'array';
24
+ const type = DrizzleProperty.resolveType(column, isEnum, reference !== null);
25
+ super({
26
+ path: column.name,
27
+ type,
28
+ isId: column.primary === true,
29
+ isArray,
30
+ isSortable: type !== 'json' && type !== 'mixed' && !isArray,
31
+ isRequired: column.notNull === true && column.hasDefault !== true && column.primary !== true,
32
+ position,
33
+ reference,
34
+ availableValues: isEnum ? Array.from(column.enumValues) : null,
35
+ });
36
+ this.column = column;
37
+ }
38
+ static resolveType(column, isEnum, isReference) {
39
+ if (isReference)
40
+ return 'reference';
41
+ if (isEnum)
42
+ return 'enum';
43
+ // For PgArray columns, the *element* type lives on `baseColumn`. Surface
44
+ // that as the property type so adapters/UI render the inner kind (e.g.
45
+ // `text[]` shows as `string`).
46
+ const dataType = column.dataType === 'array' && column.baseColumn?.dataType
47
+ ? column.baseColumn.dataType
48
+ : column.dataType;
49
+ const mapped = DATA_TYPE_TO_PROPERTY[dataType];
50
+ if (mapped) {
51
+ if (mapped === 'string' && column.primary && isUuidColumn(column.name, column.columnType)) {
52
+ return 'uuid';
53
+ }
54
+ return mapped;
55
+ }
56
+ return 'mixed';
57
+ }
58
+ }
59
+ /** Find the primary-key column in a drizzle table. Returns null when absent. */
60
+ export const findPrimaryColumn = (table) => {
61
+ for (const key of Object.keys(table)) {
62
+ if (key === '_')
63
+ continue;
64
+ const col = table[key];
65
+ if (col && col.primary === true)
66
+ return col;
67
+ }
68
+ return null;
69
+ };
70
+ const FK_SYMBOL_DESC = /InlineForeignKeys$/;
71
+ const TABLE_NAME_SYMBOL_DESC = /BaseName$/;
72
+ const tableBaseName = (table) => {
73
+ for (const sym of Object.getOwnPropertySymbols(table)) {
74
+ if (TABLE_NAME_SYMBOL_DESC.test(sym.description ?? '')) {
75
+ const v = table[sym];
76
+ if (typeof v === 'string')
77
+ return v;
78
+ }
79
+ }
80
+ return null;
81
+ };
82
+ /**
83
+ * Walk drizzle's hidden inline-FK symbol on a table and return a map of
84
+ * local column name → foreign table base name. Returns an empty map when
85
+ * the table has no FKs or when the structure differs (driver-specific).
86
+ */
87
+ export const extractForeignKeys = (table) => {
88
+ const out = {};
89
+ for (const sym of Object.getOwnPropertySymbols(table)) {
90
+ if (!FK_SYMBOL_DESC.test(sym.description ?? ''))
91
+ continue;
92
+ const fks = table[sym];
93
+ if (!Array.isArray(fks))
94
+ continue;
95
+ for (const fk of fks) {
96
+ try {
97
+ const ref = fk.reference();
98
+ const targetName = tableBaseName(ref.foreignTable);
99
+ if (!targetName)
100
+ continue;
101
+ for (const c of ref.columns) {
102
+ out[c.name] = targetName;
103
+ }
104
+ }
105
+ catch {
106
+ // ignore malformed FKs — keep adapter resilient across drivers.
107
+ }
108
+ }
109
+ }
110
+ return out;
111
+ };
112
+ //# sourceMappingURL=property.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property.js","sourceRoot":"","sources":["../src/property.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAqB,MAAM,oBAAoB,CAAA;AAGpE,MAAM,qBAAqB,GAA2C;IACpE,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,IAAI,EAAE,UAAU;IAChB,IAAI,EAAE,MAAM;IACZ,MAAM,EAAE,QAAQ;CACjB,CAAA;AAED,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,UAAmB,EAAW,EAAE;IAClE,IAAI,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC;QAAE,OAAO,IAAI,CAAA;IACvD,OAAO,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAC3C,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,OAAO,eAAgB,SAAQ,YAAY;IAG/C,YAAY,MAAqB,EAAE,YAA2B,IAAI,EAAE,QAAQ,GAAG,CAAC;QAC9E,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,CAAA;QACnD,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,KAAK,OAAO,CAAA;QAC3C,MAAM,IAAI,GAAG,eAAe,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC,CAAA;QAC5E,KAAK,CAAC;YACJ,IAAI,EAAE,MAAM,CAAC,IAAI;YACjB,IAAI;YACJ,IAAI,EAAE,MAAM,CAAC,OAAO,KAAK,IAAI;YAC7B,OAAO;YACP,UAAU,EAAE,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO,IAAI,CAAC,OAAO;YAC3D,UAAU,EACR,MAAM,CAAC,OAAO,KAAK,IAAI,IAAI,MAAM,CAAC,UAAU,KAAK,IAAI,IAAI,MAAM,CAAC,OAAO,KAAK,IAAI;YAClF,QAAQ;YACR,SAAS;YACT,eAAe,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,UAAW,CAAC,CAAC,CAAC,CAAC,IAAI;SAChE,CAAC,CAAA;QACF,IAAI,CAAC,MAAM,GAAG,MAAM,CAAA;IACtB,CAAC;IAEO,MAAM,CAAC,WAAW,CACxB,MAAqB,EACrB,MAAe,EACf,WAAoB;QAEpB,IAAI,WAAW;YAAE,OAAO,WAAW,CAAA;QACnC,IAAI,MAAM;YAAE,OAAO,MAAM,CAAA;QACzB,yEAAyE;QACzE,uEAAuE;QACvE,+BAA+B;QAC/B,MAAM,QAAQ,GACZ,MAAM,CAAC,QAAQ,KAAK,OAAO,IAAI,MAAM,CAAC,UAAU,EAAE,QAAQ;YACxD,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ;YAC5B,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAA;QACrB,MAAM,MAAM,GAAG,qBAAqB,CAAC,QAAQ,CAAC,CAAA;QAC9C,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC1F,OAAO,MAAM,CAAA;YACf,CAAC;YACD,OAAO,MAAM,CAAA;QACf,CAAC;QACD,OAAO,OAAO,CAAA;IAChB,CAAC;CACF;AAED,gFAAgF;AAChF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,KAAmB,EAAwB,EAAE;IAC7E,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACrC,IAAI,GAAG,KAAK,GAAG;YAAE,SAAQ;QACzB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAA8B,CAAA;QACnD,IAAI,GAAG,IAAI,GAAG,CAAC,OAAO,KAAK,IAAI;YAAE,OAAO,GAAG,CAAA;IAC7C,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,oBAAoB,CAAA;AAC3C,MAAM,sBAAsB,GAAG,WAAW,CAAA;AAS1C,MAAM,aAAa,GAAG,CAAC,KAAa,EAAiB,EAAE;IACrD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,IAAI,sBAAsB,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC,EAAE,CAAC;YACvD,MAAM,CAAC,GAAI,KAAiC,CAAC,GAAG,CAAC,CAAA;YACjD,IAAI,OAAO,CAAC,KAAK,QAAQ;gBAAE,OAAO,CAAC,CAAA;QACrC,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAmB,EAA0B,EAAE;IAChF,MAAM,GAAG,GAA2B,EAAE,CAAA;IACtC,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,qBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,WAAW,IAAI,EAAE,CAAC;YAAE,SAAQ;QACzD,MAAM,GAAG,GAAI,KAAiC,CAAC,GAAG,CAAC,CAAA;QACnD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;YAAE,SAAQ;QACjC,KAAK,MAAM,EAAE,IAAI,GAAuB,EAAE,CAAC;YACzC,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,EAAE,CAAC,SAAS,EAAE,CAAA;gBAC1B,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;gBAClD,IAAI,CAAC,UAAU;oBAAE,SAAQ;gBACzB,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;oBAC5B,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,UAAU,CAAA;gBAC1B,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBACP,gEAAgE;YAClE,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA"}
@@ -0,0 +1,41 @@
1
+ import { BaseRecord, BaseResource, type Filter, type FindOptions, type ParamsType, type TimeSeriesQuery, type TimeSeriesResult } from '@modern-admin/core';
2
+ import { DrizzleProperty } from './property.js';
3
+ import type { DrizzleClientLike, DrizzleDialect, DrizzleTable } from './types.js';
4
+ export declare class DrizzleResource extends BaseResource {
5
+ readonly client: DrizzleClientLike;
6
+ readonly table: DrizzleTable;
7
+ readonly tableKey: string;
8
+ readonly dialect: DrizzleDialect;
9
+ private readonly _id;
10
+ private readonly _properties;
11
+ private readonly idColumn;
12
+ constructor(raw: unknown);
13
+ static isAdapterFor(raw: unknown): boolean;
14
+ id(): string;
15
+ databaseName(): string;
16
+ databaseType(): string;
17
+ properties(): DrizzleProperty[];
18
+ property(path: string): DrizzleProperty | null;
19
+ private castId;
20
+ /** Drop unknown keys so we never write to columns that don't exist. */
21
+ private writableData;
22
+ distinct(field: string, options?: {
23
+ limit?: number;
24
+ search?: string;
25
+ }): Promise<string[]>;
26
+ count(filter: Filter): Promise<number>;
27
+ find(filter: Filter, options: FindOptions): Promise<BaseRecord[]>;
28
+ search(query: string, fields: string[], options?: {
29
+ limit?: number;
30
+ }): Promise<BaseRecord[]>;
31
+ findOne(id: string): Promise<BaseRecord | null>;
32
+ findMany(ids: Array<string | number>): Promise<BaseRecord[]>;
33
+ create(params: ParamsType): Promise<ParamsType>;
34
+ update(id: string, params: ParamsType): Promise<ParamsType>;
35
+ delete(id: string): Promise<void>;
36
+ supportsTimeSeries(): boolean;
37
+ aggregateTimeSeries(filter: Filter, query: TimeSeriesQuery): Promise<TimeSeriesResult>;
38
+ private runTimeSeriesQuery;
39
+ transaction<T>(fn: () => Promise<T>): Promise<T>;
40
+ }
41
+ //# sourceMappingURL=resource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resource.d.ts","sourceRoot":"","sources":["../src/resource.ts"],"names":[],"mappings":"AACA,OAAO,EACL,UAAU,EACV,YAAY,EACZ,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,UAAU,EACf,KAAK,eAAe,EACpB,KAAK,gBAAgB,EAGtB,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EAAE,eAAe,EAAyC,MAAM,eAAe,CAAA;AAEtF,OAAO,KAAK,EACV,iBAAiB,EAEjB,cAAc,EAEd,YAAY,EACb,MAAM,YAAY,CAAA;AAgBnB,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,SAAgB,MAAM,EAAE,iBAAiB,CAAA;IACzC,SAAgB,KAAK,EAAE,YAAY,CAAA;IACnC,SAAgB,QAAQ,EAAE,MAAM,CAAA;IAChC,SAAgB,OAAO,EAAE,cAAc,CAAA;IACvC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAQ;IAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAmB;IAC/C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;gBAE5B,GAAG,EAAE,OAAO;WA4BR,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO;IAI1C,EAAE,IAAI,MAAM;IAIZ,YAAY,IAAI,MAAM;IAItB,YAAY,IAAI,MAAM;IAItB,UAAU,IAAI,eAAe,EAAE;IAI/B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAIvD,OAAO,CAAC,MAAM;IASd,uEAAuE;IACvE,OAAO,CAAC,YAAY;IASL,QAAQ,CACrB,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAC5C,OAAO,CAAC,MAAM,EAAE,CAAC;IAgCL,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAStC,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAYjE,MAAM,CACnB,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EAAE,EAChB,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,GAC3B,OAAO,CAAC,UAAU,EAAE,CAAC;IA2BT,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAU/C,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAU5D,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAQ/C,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAS3D,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMvC,kBAAkB,IAAI,OAAO;IAIvB,mBAAmB,CAChC,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,eAAe,GACrB,OAAO,CAAC,gBAAgB,CAAC;YAkBd,kBAAkB;IAuGjB,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAIhE"}