sveltekit-admin 0.5.0 → 0.6.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.
Files changed (41) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +32 -1
  3. package/dist/index.d.ts +3 -0
  4. package/dist/index.js +1 -0
  5. package/dist/server/adapters/drizzle/dataAdapter.d.ts +11 -0
  6. package/dist/server/adapters/drizzle/dataAdapter.js +243 -0
  7. package/dist/server/adapters/drizzle/filterCompiler.d.ts +8 -0
  8. package/dist/server/adapters/drizzle/filterCompiler.js +61 -0
  9. package/dist/server/adapters/drizzle/index.d.ts +13 -0
  10. package/dist/server/adapters/drizzle/index.js +23 -0
  11. package/dist/server/adapters/drizzle/inspect.d.ts +23 -0
  12. package/dist/server/adapters/drizzle/inspect.js +220 -0
  13. package/dist/server/adapters/drizzle/introspector.d.ts +3 -0
  14. package/dist/server/adapters/drizzle/introspector.js +3 -0
  15. package/dist/server/adapters/filter.d.ts +12 -0
  16. package/dist/server/adapters/filter.js +72 -0
  17. package/dist/server/adapters/prisma/dataAdapter.d.ts +13 -0
  18. package/dist/server/adapters/prisma/dataAdapter.js +96 -0
  19. package/dist/server/adapters/prisma/filterCompiler.d.ts +9 -0
  20. package/dist/server/adapters/prisma/filterCompiler.js +42 -0
  21. package/dist/server/adapters/prisma/index.d.ts +28 -0
  22. package/dist/server/adapters/prisma/index.js +32 -0
  23. package/dist/server/adapters/prisma/introspector.d.ts +4 -0
  24. package/dist/server/adapters/prisma/introspector.js +9 -0
  25. package/dist/server/adapters/types.d.ts +79 -0
  26. package/dist/server/adapters/types.js +1 -0
  27. package/dist/server/data.d.ts +0 -8
  28. package/dist/server/data.js +0 -41
  29. package/dist/server/handler.d.ts +18 -2
  30. package/dist/server/handler.js +170 -134
  31. package/dist/server/introspection/parser.d.ts +4 -40
  32. package/dist/server/introspection/relations.d.ts +1 -1
  33. package/dist/server/introspection/relations.js +1 -1
  34. package/dist/server/query/listQuery.d.ts +10 -13
  35. package/dist/server/query/listQuery.js +47 -55
  36. package/dist/server/types/schema.d.ts +40 -0
  37. package/dist/server/types/schema.js +8 -0
  38. package/dist/server/views/Form.svelte +1 -1
  39. package/dist/server/views/RelationCheckboxes.svelte +1 -1
  40. package/dist/server/views/theme.js +72 -19
  41. package/package.json +24 -3
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 dotNacer
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -5,7 +5,8 @@
5
5
  ![Version](https://img.shields.io/npm/v/sveltekit-admin)
6
6
  ![License](https://img.shields.io/npm/l/sveltekit-admin)
7
7
 
8
- See [CHANGELOG.md](./CHANGELOG.md) for release notes and breaking changes.
8
+ See [CHANGELOG.md](./CHANGELOG.md) for release notes and breaking changes, and
9
+ [CONTRIBUTING.md](./CONTRIBUTING.md) for the versioning policy and release process.
9
10
 
10
11
  ## Features
11
12
 
@@ -15,6 +16,7 @@ See [CHANGELOG.md](./CHANGELOG.md) for release notes and breaking changes.
15
16
  - ⚡ **Zero routes** - everything handled via a single hook
16
17
  - ðŸŠķ **3 lines of code** to setup
17
18
  - 🔧 **Customizable** - hide fields, set readonly, custom labels
19
+ - 🔌 **Drizzle adapter** (optional subpath export)
18
20
 
19
21
  ## Installation
20
22
 
@@ -42,6 +44,35 @@ That's it! Navigate to `/admin` and you'll see:
42
44
  - Create/Edit forms auto-generated from your Prisma schema
43
45
  - Delete with confirmation
44
46
 
47
+ ## Drizzle
48
+
49
+ Prisma stays the default. For Drizzle, pass an adapter from the subpath
50
+ export (this does not pull in `drizzle-orm` for Prisma apps):
51
+
52
+ ```typescript
53
+ import { createAdminHandler } from 'sveltekit-admin';
54
+ import { createDrizzleAdapter } from 'sveltekit-admin/adapters/drizzle';
55
+ import { db } from './db';
56
+ import * as schema from './db/schema';
57
+
58
+ export const handle = createAdminHandler({
59
+ adapter: createDrizzleAdapter({ db, schema }),
60
+ authCheck: (event) => event.locals.session?.user?.role === 'admin'
61
+ });
62
+ ```
63
+
64
+ Pass the same `schema` object you already export (tables + `relations()`).
65
+ Model names in `config.models` are the JS export keys (`users`, not `User`).
66
+ `config.search.mode` only applies to `createAdminHandler({ prisma })`;
67
+ pass `searchMode` to `createDrizzleAdapter` instead. Nested Prisma `where`
68
+ objects in `listWhere` are not supported — use a flat `{ tenantId: 1 }` or
69
+ a `Filter` AST.
70
+
71
+ Many-to-many writes on SQLite currently require better-sqlite3's synchronous
72
+ `db.transaction` with `.get()` and `.run()`. Async SQLite drivers such as
73
+ libsql/Turso, D1, and `bun:sqlite` are not supported for many-to-many writes in
74
+ this version; PostgreSQL and MySQL use async transactions.
75
+
45
76
  ## Configuration
46
77
 
47
78
  ```typescript
package/dist/index.d.ts CHANGED
@@ -5,3 +5,6 @@
5
5
  export { createAdminHandler, type AdminHandlerConfig } from './server/handler.js';
6
6
  export { defaultAdminCheck } from './server/auth.js';
7
7
  export { parsePrismaSchema, parseSchemaContent, type PrismaSchema, type PrismaModel, type PrismaField } from './server/introspection/parser.js';
8
+ export type { Schema, Model, Field } from './server/types/schema.js';
9
+ export { createPrismaAdapter } from './server/adapters/prisma/index.js';
10
+ export type { DataAdapter, SchemaIntrospector, Filter } from './server/adapters/types.js';
package/dist/index.js CHANGED
@@ -5,3 +5,4 @@
5
5
  export { createAdminHandler } from './server/handler.js';
6
6
  export { defaultAdminCheck } from './server/auth.js';
7
7
  export { parsePrismaSchema, parseSchemaContent } from './server/introspection/parser.js';
8
+ export { createPrismaAdapter } from './server/adapters/prisma/index.js';
@@ -0,0 +1,11 @@
1
+ import type { Table } from "drizzle-orm";
2
+ import type { DataAdapter } from "../types.js";
3
+ import type { DrizzleDialect, M2mLink } from "./inspect.js";
4
+ interface DrizzleDataAdapterContext {
5
+ tables: Record<string, Table>;
6
+ m2m: Map<string, M2mLink>;
7
+ dialect: DrizzleDialect;
8
+ caseInsensitiveSearch: boolean;
9
+ }
10
+ export declare function createDrizzleDataAdapter(db: any, ctx: DrizzleDataAdapterContext): DataAdapter;
11
+ export {};
@@ -0,0 +1,243 @@
1
+ import { asc, count, desc, eq, getTableColumns } from "drizzle-orm";
2
+ import { coerceId, primaryKeyOf } from "../../data.js";
3
+ import { compileFilterToDrizzle } from "./filterCompiler.js";
4
+ function tableFor(ctx, model) {
5
+ const table = ctx.tables[model.name];
6
+ if (!table) {
7
+ throw new Error(`[sveltekit-admin] missing Drizzle table '${model.name}'`);
8
+ }
9
+ return table;
10
+ }
11
+ function primaryKeyColumn(table, model) {
12
+ return getTableColumns(table)[primaryKeyOf(model)];
13
+ }
14
+ async function selectByPrimaryKey(db, table, model, id) {
15
+ const rows = await db
16
+ .select()
17
+ .from(table)
18
+ .where(eq(primaryKeyColumn(table, model), coerceId(String(id), model)))
19
+ .limit(1);
20
+ return rows[0] ?? null;
21
+ }
22
+ async function insertAndReturn(db, table, model, scalars, dialect) {
23
+ if (dialect === "mysql") {
24
+ const ids = await db.insert(table).values(scalars).$returningId();
25
+ const primaryKey = primaryKeyOf(model);
26
+ const rows = await db
27
+ .select()
28
+ .from(table)
29
+ .where(eq(primaryKeyColumn(table, model), ids[0][primaryKey]));
30
+ return rows[0];
31
+ }
32
+ const rows = await db.insert(table).values(scalars).returning();
33
+ return rows[0];
34
+ }
35
+ async function updateAndReturn(db, table, model, id, scalars, dialect) {
36
+ const coercedId = coerceId(String(id), model);
37
+ const where = eq(primaryKeyColumn(table, model), coercedId);
38
+ if (dialect === "mysql") {
39
+ await db.update(table).set(scalars).where(where);
40
+ return (await selectByPrimaryKey(db, table, model, coercedId));
41
+ }
42
+ const rows = await db.update(table).set(scalars).where(where).returning();
43
+ return rows[0];
44
+ }
45
+ async function insertM2mRows(db, link, parentId, ids) {
46
+ if (ids.length === 0)
47
+ return;
48
+ await db.insert(link.pivot).values(ids.map((id) => ({
49
+ [link.selfKey]: parentId,
50
+ [link.otherKey]: id,
51
+ })));
52
+ }
53
+ function insertAndReturnSqlite(db, table, scalars) {
54
+ return db.insert(table).values(scalars).returning().get();
55
+ }
56
+ function updateAndReturnSqlite(db, table, model, id, scalars) {
57
+ return db
58
+ .update(table)
59
+ .set(scalars)
60
+ .where(eq(primaryKeyColumn(table, model), coerceId(String(id), model)))
61
+ .returning()
62
+ .get();
63
+ }
64
+ function insertM2mRowsSqlite(db, link, parentId, ids) {
65
+ if (ids.length === 0)
66
+ return;
67
+ db.insert(link.pivot)
68
+ .values(ids.map((id) => ({
69
+ [link.selfKey]: parentId,
70
+ [link.otherKey]: id,
71
+ })))
72
+ .run();
73
+ }
74
+ export function createDrizzleDataAdapter(db, ctx) {
75
+ const compileHere = (table, filter) => compileFilterToDrizzle(table, filter, {
76
+ caseInsensitiveSearch: ctx.caseInsensitiveSearch,
77
+ dialect: ctx.dialect,
78
+ });
79
+ return {
80
+ async listRecords(model, opts) {
81
+ const table = tableFor(ctx, model);
82
+ const where = compileHere(table, opts.filter);
83
+ const primaryKey = primaryKeyColumn(table, model);
84
+ const [rows, totals] = await Promise.all([
85
+ db
86
+ .select()
87
+ .from(table)
88
+ .where(where)
89
+ .orderBy(desc(primaryKey))
90
+ .limit(opts.take)
91
+ .offset(opts.skip),
92
+ db.select({ n: count() }).from(table).where(where),
93
+ ]);
94
+ return { rows, total: totals[0].n };
95
+ },
96
+ async findMany(model, opts) {
97
+ const table = tableFor(ctx, model);
98
+ const columns = getTableColumns(table);
99
+ const orderBy = Object.entries(opts.orderBy ?? {}).map(([field, direction]) => {
100
+ const column = columns[field];
101
+ if (!column) {
102
+ throw new Error(`[sveltekit-admin] unknown field '${field}' on Drizzle table`);
103
+ }
104
+ return direction === "asc" ? asc(column) : desc(column);
105
+ });
106
+ let query = db
107
+ .select()
108
+ .from(table)
109
+ .where(compileHere(table, opts.filter));
110
+ if (orderBy.length > 0)
111
+ query = query.orderBy(...orderBy);
112
+ if (opts.take !== undefined)
113
+ query = query.limit(opts.take);
114
+ if (opts.skip !== undefined)
115
+ query = query.offset(opts.skip);
116
+ return query;
117
+ },
118
+ async getRecord(model, id) {
119
+ return selectByPrimaryKey(db, tableFor(ctx, model), model, id);
120
+ },
121
+ async findFirst(model, filter) {
122
+ const table = tableFor(ctx, model);
123
+ const rows = await db
124
+ .select()
125
+ .from(table)
126
+ .where(compileHere(table, filter))
127
+ .limit(1);
128
+ return rows[0] ?? null;
129
+ },
130
+ async countRecords(model, filter) {
131
+ const table = tableFor(ctx, model);
132
+ const rows = await db
133
+ .select({ n: count() })
134
+ .from(table)
135
+ .where(compileHere(table, filter));
136
+ return rows[0].n;
137
+ },
138
+ async createRecord(model, input) {
139
+ const table = tableFor(ctx, model);
140
+ const m2mFields = Object.entries(input.m2m ?? {});
141
+ if (m2mFields.length === 0) {
142
+ return insertAndReturn(db, table, model, input.scalars, ctx.dialect);
143
+ }
144
+ if (ctx.dialect === "sqlite") {
145
+ return db.transaction((tx) => {
146
+ const parent = insertAndReturnSqlite(tx, table, input.scalars);
147
+ const parentId = parent[primaryKeyOf(model)];
148
+ for (const [field, relation] of m2mFields) {
149
+ const link = ctx.m2m.get(`${model.name}.${field}`);
150
+ if (!link)
151
+ continue;
152
+ insertM2mRowsSqlite(tx, link, parentId, relation.ids);
153
+ }
154
+ return parent;
155
+ });
156
+ }
157
+ return db.transaction(async (tx) => {
158
+ const parent = await insertAndReturn(tx, table, model, input.scalars, ctx.dialect);
159
+ const parentId = parent[primaryKeyOf(model)];
160
+ for (const [field, relation] of m2mFields) {
161
+ const link = ctx.m2m.get(`${model.name}.${field}`);
162
+ if (!link)
163
+ continue;
164
+ await insertM2mRows(tx, link, parentId, relation.ids);
165
+ }
166
+ return parent;
167
+ });
168
+ },
169
+ async updateRecord(model, id, input) {
170
+ const table = tableFor(ctx, model);
171
+ const m2mFields = Object.entries(input.m2m ?? {});
172
+ if (m2mFields.length === 0) {
173
+ return updateAndReturn(db, table, model, id, input.scalars, ctx.dialect);
174
+ }
175
+ if (ctx.dialect === "sqlite") {
176
+ return db.transaction((tx) => {
177
+ const parent = updateAndReturnSqlite(tx, table, model, id, input.scalars);
178
+ const parentId = coerceId(String(id), model);
179
+ for (const [field, relation] of m2mFields) {
180
+ const link = ctx.m2m.get(`${model.name}.${field}`);
181
+ if (!link)
182
+ continue;
183
+ tx.delete(link.pivot).where(eq(link.selfColumn, parentId)).run();
184
+ insertM2mRowsSqlite(tx, link, parentId, relation.ids);
185
+ }
186
+ return parent;
187
+ });
188
+ }
189
+ return db.transaction(async (tx) => {
190
+ const parent = await updateAndReturn(tx, table, model, id, input.scalars, ctx.dialect);
191
+ const parentId = coerceId(String(id), model);
192
+ for (const [field, relation] of m2mFields) {
193
+ const link = ctx.m2m.get(`${model.name}.${field}`);
194
+ if (!link)
195
+ continue;
196
+ await tx.delete(link.pivot).where(eq(link.selfColumn, parentId));
197
+ await insertM2mRows(tx, link, parentId, relation.ids);
198
+ }
199
+ return parent;
200
+ });
201
+ },
202
+ async deleteRecord(model, id) {
203
+ const table = tableFor(ctx, model);
204
+ const coercedId = coerceId(String(id), model);
205
+ const links = [...ctx.m2m.entries()]
206
+ .filter(([key]) => key.startsWith(`${model.name}.`))
207
+ .map(([, link]) => link);
208
+ if (links.length === 0) {
209
+ await db
210
+ .delete(table)
211
+ .where(eq(primaryKeyColumn(table, model), coercedId));
212
+ return;
213
+ }
214
+ if (ctx.dialect === "sqlite") {
215
+ db.transaction((tx) => {
216
+ for (const link of links) {
217
+ tx.delete(link.pivot).where(eq(link.selfColumn, coercedId)).run();
218
+ }
219
+ tx.delete(table)
220
+ .where(eq(primaryKeyColumn(table, model), coercedId))
221
+ .run();
222
+ });
223
+ return;
224
+ }
225
+ await db.transaction(async (tx) => {
226
+ for (const link of links) {
227
+ await tx.delete(link.pivot).where(eq(link.selfColumn, coercedId));
228
+ }
229
+ await tx.delete(table).where(eq(primaryKeyColumn(table, model), coercedId));
230
+ });
231
+ },
232
+ async getM2mSelectedIds(model, edge, _targetModel, recordId) {
233
+ const link = ctx.m2m.get(`${model.name}.${edge.field}`);
234
+ if (!link)
235
+ return [];
236
+ const rows = await db
237
+ .select({ id: link.otherColumn })
238
+ .from(link.pivot)
239
+ .where(eq(link.selfColumn, coerceId(String(recordId), model)));
240
+ return rows.map((row) => row.id);
241
+ },
242
+ };
243
+ }
@@ -0,0 +1,8 @@
1
+ import type { SQL, Table } from "drizzle-orm";
2
+ import type { Filter } from "../types.js";
3
+ import type { DrizzleDialect } from "./inspect.js";
4
+ export { OPAQUE_FILTER_ERROR } from "../filter.js";
5
+ export declare function compileFilterToDrizzle(table: Table, filter: Filter | Record<string, unknown> | undefined, opts: {
6
+ caseInsensitiveSearch: boolean;
7
+ dialect: DrizzleDialect;
8
+ }): SQL | undefined;
@@ -0,0 +1,61 @@
1
+ import { and, eq, getTableColumns, gte, inArray, isNotNull, isNull, lt, lte, or, sql, } from "drizzle-orm";
2
+ import { isCompositeFilter, isLeafFilter, OPAQUE_FILTER_ERROR, } from "../filter.js";
3
+ export { OPAQUE_FILTER_ERROR } from "../filter.js";
4
+ function escapeLikePattern(value) {
5
+ return String(value).replace(/([%_!])/g, "!$1");
6
+ }
7
+ function likeWithEscape(column, pattern) {
8
+ return sql `${column} like ${pattern} escape '!'`;
9
+ }
10
+ function ilikeWithEscape(column, pattern) {
11
+ return sql `${column} ilike ${pattern} escape '!'`;
12
+ }
13
+ function compileLeaf(table, filter, opts) {
14
+ const columns = getTableColumns(table);
15
+ const column = columns[filter.field];
16
+ if (!column) {
17
+ throw new Error(`[sveltekit-admin] unknown field '${filter.field}' on Drizzle table`);
18
+ }
19
+ switch (filter.op) {
20
+ case "eq":
21
+ return eq(column, filter.value);
22
+ case "contains": {
23
+ const pattern = `%${escapeLikePattern(filter.value)}%`;
24
+ if (!opts.caseInsensitiveSearch)
25
+ return likeWithEscape(column, pattern);
26
+ if (opts.dialect === "postgresql")
27
+ return ilikeWithEscape(column, pattern);
28
+ return sql `lower(${column}) like lower(${pattern}) escape '!'`;
29
+ }
30
+ case "containsExact":
31
+ return likeWithEscape(column, `%${escapeLikePattern(filter.value)}%`);
32
+ case "startsWith":
33
+ return likeWithEscape(column, `${escapeLikePattern(filter.value)}%`);
34
+ case "gte":
35
+ return gte(column, filter.value);
36
+ case "lte":
37
+ return lte(column, filter.value);
38
+ case "lt":
39
+ return lt(column, filter.value);
40
+ case "in":
41
+ return inArray(column, filter.value);
42
+ case "isNull":
43
+ return isNull(column);
44
+ case "isNotNull":
45
+ return isNotNull(column);
46
+ }
47
+ }
48
+ function compile(table, node, opts) {
49
+ if (isCompositeFilter(node)) {
50
+ const clauses = node.clauses.map((clause) => compile(table, clause, opts));
51
+ return node.op === "and" ? and(...clauses) : or(...clauses);
52
+ }
53
+ if (isLeafFilter(node))
54
+ return compileLeaf(table, node, opts);
55
+ throw new Error(OPAQUE_FILTER_ERROR);
56
+ }
57
+ export function compileFilterToDrizzle(table, filter, opts) {
58
+ if (filter === undefined)
59
+ return undefined;
60
+ return compile(table, filter, opts);
61
+ }
@@ -0,0 +1,13 @@
1
+ import type { DataAdapter, SchemaIntrospector } from "../types.js";
2
+ import type { DrizzleDialect } from "./inspect.js";
3
+ export type { DrizzleDialect };
4
+ export declare function resolveCaseInsensitiveSearch(dialect: DrizzleDialect, searchMode?: "auto" | "insensitive" | "default"): boolean;
5
+ export declare function createDrizzleAdapter(opts: {
6
+ db: any;
7
+ schema: Record<string, unknown>;
8
+ dialect?: DrizzleDialect;
9
+ searchMode?: "auto" | "insensitive" | "default";
10
+ }): {
11
+ introspector: SchemaIntrospector;
12
+ data: DataAdapter;
13
+ };
@@ -0,0 +1,23 @@
1
+ import { createDrizzleDataAdapter } from "./dataAdapter.js";
2
+ import { inspectDrizzleSchema } from "./inspect.js";
3
+ import { createDrizzleIntrospector } from "./introspector.js";
4
+ export function resolveCaseInsensitiveSearch(dialect, searchMode = "auto") {
5
+ if (searchMode === "insensitive")
6
+ return true;
7
+ if (searchMode === "default")
8
+ return false;
9
+ return dialect === "postgresql";
10
+ }
11
+ export function createDrizzleAdapter(opts) {
12
+ const inspected = inspectDrizzleSchema(opts.schema, opts.dialect);
13
+ const caseInsensitiveSearch = resolveCaseInsensitiveSearch(inspected.dialect, opts.searchMode);
14
+ return {
15
+ introspector: createDrizzleIntrospector(inspected.schema),
16
+ data: createDrizzleDataAdapter(opts.db, {
17
+ tables: inspected.tables,
18
+ m2m: inspected.m2m,
19
+ dialect: inspected.dialect,
20
+ caseInsensitiveSearch,
21
+ }),
22
+ };
23
+ }
@@ -0,0 +1,23 @@
1
+ import { Table } from 'drizzle-orm';
2
+ import type { Column } from 'drizzle-orm';
3
+ import type { Schema } from '../../types/schema.js';
4
+ export type DrizzleDialect = 'postgresql' | 'mysql' | 'sqlite';
5
+ export interface M2mLink {
6
+ pivot: Table;
7
+ selfColumn: Column;
8
+ otherColumn: Column;
9
+ selfKey: string;
10
+ otherKey: string;
11
+ targetTsName: string;
12
+ }
13
+ export interface InspectedDrizzleSchema {
14
+ schema: Schema;
15
+ tables: Record<string, Table>;
16
+ m2m: Map<string, M2mLink>;
17
+ dialect: DrizzleDialect;
18
+ }
19
+ export declare function mapColumnType(column: Column, enumTypeName?: string): {
20
+ type: string;
21
+ isEnum: boolean;
22
+ };
23
+ export declare function inspectDrizzleSchema(schemaObj: Record<string, unknown>, dialectOverride?: DrizzleDialect): InspectedDrizzleSchema;