@forklaunch/better-auth-mikro-orm-fork 0.4.105 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/adapter.cjs +151 -129
- package/lib/adapter.d.cts +13 -5
- package/lib/adapter.d.ts +13 -5
- package/lib/adapter.js +152 -130
- package/package.json +25 -24
- package/readme.md +2 -2
package/lib/adapter.cjs
CHANGED
|
@@ -25,7 +25,7 @@ __export(src_exports, {
|
|
|
25
25
|
module.exports = __toCommonJS(src_exports);
|
|
26
26
|
|
|
27
27
|
// src/adapter.ts
|
|
28
|
-
var import_adapters = require("
|
|
28
|
+
var import_adapters = require("better-auth/adapters");
|
|
29
29
|
var import_dset2 = require("dset");
|
|
30
30
|
|
|
31
31
|
// src/utils/adapterUtils.ts
|
|
@@ -33,7 +33,7 @@ var import_core = require("@mikro-orm/core");
|
|
|
33
33
|
var import_dset = require("dset");
|
|
34
34
|
|
|
35
35
|
// src/utils/createAdapterError.ts
|
|
36
|
-
var import_better_auth = require("
|
|
36
|
+
var import_better_auth = require("better-auth");
|
|
37
37
|
function createAdapterError(message) {
|
|
38
38
|
throw new import_better_auth.BetterAuthError(`[Mikro ORM Adapter] ${message}`);
|
|
39
39
|
}
|
|
@@ -50,12 +50,15 @@ function createAdapterUtils(orm) {
|
|
|
50
50
|
const normalizeEntityName = (name) => naming.getEntityName(naming.classToTableName(name));
|
|
51
51
|
const getEntityMetadata = (entityName) => {
|
|
52
52
|
entityName = normalizeEntityName(entityName);
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
53
|
+
const allMetadata = metadata.getAll();
|
|
54
|
+
for (const meta of allMetadata.values()) {
|
|
55
|
+
if (meta.className === entityName) {
|
|
56
|
+
return meta;
|
|
57
|
+
}
|
|
57
58
|
}
|
|
58
|
-
|
|
59
|
+
createAdapterError(
|
|
60
|
+
`Cannot find metadata for "${entityName}" entity. Make sure it defined and listed in your Mikro ORM config.`
|
|
61
|
+
);
|
|
59
62
|
};
|
|
60
63
|
function getPropertyMetadata(metadata2, fieldName) {
|
|
61
64
|
const prop = metadata2.props.find((prop2) => {
|
|
@@ -123,11 +126,13 @@ function createAdapterUtils(orm) {
|
|
|
123
126
|
const normalizeInput = (metadata2, input) => {
|
|
124
127
|
const fields = {};
|
|
125
128
|
Object.entries(input).forEach(([key, value]) => {
|
|
126
|
-
if (typeof value === "object" && value.$in) {
|
|
127
|
-
|
|
129
|
+
if (typeof value === "object" && value !== null && value.$in) {
|
|
130
|
+
const property = getPropertyMetadata(metadata2, key);
|
|
131
|
+
(0, import_dset.dset)(fields, [property.name], value.$in);
|
|
128
132
|
} else {
|
|
129
|
-
const
|
|
130
|
-
|
|
133
|
+
const property = getPropertyMetadata(metadata2, key);
|
|
134
|
+
const normalizedValue = normalizePropertyValue(property, value);
|
|
135
|
+
(0, import_dset.dset)(fields, [property.name], normalizedValue);
|
|
131
136
|
}
|
|
132
137
|
});
|
|
133
138
|
return fields;
|
|
@@ -141,7 +146,9 @@ function createAdapterUtils(orm) {
|
|
|
141
146
|
getPropertyMetadata(metadata2, key)
|
|
142
147
|
),
|
|
143
148
|
value
|
|
144
|
-
})).forEach(({ path, value }) =>
|
|
149
|
+
})).forEach(({ path, value }) => {
|
|
150
|
+
(0, import_dset.dset)(result, path, value);
|
|
151
|
+
});
|
|
145
152
|
return result;
|
|
146
153
|
};
|
|
147
154
|
function createWhereClause(path, value, op, target = {}) {
|
|
@@ -169,6 +176,8 @@ function createAdapterUtils(orm) {
|
|
|
169
176
|
switch (w.operator) {
|
|
170
177
|
case "in":
|
|
171
178
|
return createWhereInClause(w.field, path, w.value);
|
|
179
|
+
case "not_in":
|
|
180
|
+
return createWhereClause(path, w.value, "$nin");
|
|
172
181
|
case "contains":
|
|
173
182
|
return createWhereClause(path, `%${w.value}%`, "$like");
|
|
174
183
|
case "starts_with":
|
|
@@ -188,19 +197,16 @@ function createAdapterUtils(orm) {
|
|
|
188
197
|
}
|
|
189
198
|
const result = {};
|
|
190
199
|
where.filter(({ connector }) => !connector || connector === "AND").forEach(({ field, operator, value }, index) => {
|
|
191
|
-
const path = ["$and", index].concat(
|
|
192
|
-
getFieldPath(metadata2, field, true)
|
|
193
|
-
);
|
|
200
|
+
const path = ["$and", index].concat(getFieldPath(metadata2, field, true));
|
|
194
201
|
if (operator === "in") {
|
|
195
|
-
|
|
202
|
+
createWhereInClause(field, path, value, result);
|
|
203
|
+
} else {
|
|
204
|
+
createWhereClause(path, value, "eq", result);
|
|
196
205
|
}
|
|
197
|
-
return createWhereClause(path, value, "eq", result);
|
|
198
206
|
});
|
|
199
207
|
where.filter(({ connector }) => connector === "OR").forEach(({ field, value }, index) => {
|
|
200
|
-
const path = ["$
|
|
201
|
-
|
|
202
|
-
);
|
|
203
|
-
return createWhereClause(path, value, "eq", result);
|
|
208
|
+
const path = ["$or", index].concat(getFieldPath(metadata2, field, true));
|
|
209
|
+
createWhereClause(path, value, "eq", result);
|
|
204
210
|
});
|
|
205
211
|
return result;
|
|
206
212
|
};
|
|
@@ -215,119 +221,135 @@ function createAdapterUtils(orm) {
|
|
|
215
221
|
}
|
|
216
222
|
|
|
217
223
|
// src/adapter.ts
|
|
218
|
-
var
|
|
224
|
+
var adapter = (orm) => ({ options }) => {
|
|
225
|
+
const {
|
|
226
|
+
getEntityMetadata,
|
|
227
|
+
getFieldPath,
|
|
228
|
+
normalizeInput,
|
|
229
|
+
normalizeOutput,
|
|
230
|
+
normalizeWhereClauses
|
|
231
|
+
} = createAdapterUtils(orm);
|
|
232
|
+
return {
|
|
233
|
+
async create({ model, data, select }) {
|
|
234
|
+
const metadata = getEntityMetadata(model);
|
|
235
|
+
const input = normalizeInput(metadata, data);
|
|
236
|
+
if (options.advanced?.database?.generateId === false) {
|
|
237
|
+
Reflect.deleteProperty(input, "id");
|
|
238
|
+
}
|
|
239
|
+
const entity = orm.em.create(metadata.class, input);
|
|
240
|
+
try {
|
|
241
|
+
await orm.em.persist(entity).flush();
|
|
242
|
+
} catch (error) {
|
|
243
|
+
await orm.em.remove(entity).flush();
|
|
244
|
+
throw error;
|
|
245
|
+
}
|
|
246
|
+
return normalizeOutput(metadata, entity, select);
|
|
247
|
+
},
|
|
248
|
+
async count({ model, where }) {
|
|
249
|
+
const metadata = getEntityMetadata(model);
|
|
250
|
+
return orm.em.count(
|
|
251
|
+
metadata.class,
|
|
252
|
+
normalizeWhereClauses(metadata, where)
|
|
253
|
+
);
|
|
254
|
+
},
|
|
255
|
+
async findOne({ model, where, select }) {
|
|
256
|
+
const metadata = getEntityMetadata(model);
|
|
257
|
+
const entity = await orm.em.findOne(
|
|
258
|
+
metadata.class,
|
|
259
|
+
normalizeWhereClauses(metadata, where)
|
|
260
|
+
);
|
|
261
|
+
if (!entity) {
|
|
262
|
+
return null;
|
|
263
|
+
}
|
|
264
|
+
return normalizeOutput(metadata, entity, select);
|
|
265
|
+
},
|
|
266
|
+
async findMany({ model, where, limit, offset, sortBy }) {
|
|
267
|
+
const metadata = getEntityMetadata(model);
|
|
268
|
+
const options2 = {
|
|
269
|
+
limit,
|
|
270
|
+
offset
|
|
271
|
+
};
|
|
272
|
+
if (sortBy) {
|
|
273
|
+
const path = getFieldPath(metadata, sortBy.field);
|
|
274
|
+
(0, import_dset2.dset)(options2, ["orderBy", ...path], sortBy.direction);
|
|
275
|
+
}
|
|
276
|
+
const rows = await orm.em.find(
|
|
277
|
+
metadata.class,
|
|
278
|
+
normalizeWhereClauses(metadata, where),
|
|
279
|
+
options2
|
|
280
|
+
);
|
|
281
|
+
return rows.map((row) => normalizeOutput(metadata, row));
|
|
282
|
+
},
|
|
283
|
+
async update({ model, where, update }) {
|
|
284
|
+
const metadata = getEntityMetadata(model);
|
|
285
|
+
const entity = await orm.em.findOne(
|
|
286
|
+
metadata.class,
|
|
287
|
+
normalizeWhereClauses(metadata, where)
|
|
288
|
+
);
|
|
289
|
+
if (!entity) {
|
|
290
|
+
return null;
|
|
291
|
+
}
|
|
292
|
+
orm.em.assign(entity, normalizeInput(metadata, update));
|
|
293
|
+
try {
|
|
294
|
+
await orm.em.flush();
|
|
295
|
+
} catch (error) {
|
|
296
|
+
await orm.em.remove(entity).flush();
|
|
297
|
+
throw error;
|
|
298
|
+
}
|
|
299
|
+
return normalizeOutput(metadata, entity);
|
|
300
|
+
},
|
|
301
|
+
async updateMany({ model, where, update }) {
|
|
302
|
+
const metadata = getEntityMetadata(model);
|
|
303
|
+
return orm.em.nativeUpdate(
|
|
304
|
+
metadata.class,
|
|
305
|
+
normalizeWhereClauses(metadata, where),
|
|
306
|
+
normalizeInput(metadata, update)
|
|
307
|
+
);
|
|
308
|
+
},
|
|
309
|
+
async delete({ model, where }) {
|
|
310
|
+
const metadata = getEntityMetadata(model);
|
|
311
|
+
const entity = await orm.em.findOne(
|
|
312
|
+
metadata.class,
|
|
313
|
+
normalizeWhereClauses(metadata, where),
|
|
314
|
+
{
|
|
315
|
+
fields: ["id"]
|
|
316
|
+
}
|
|
317
|
+
);
|
|
318
|
+
if (entity) {
|
|
319
|
+
await orm.em.remove(entity).flush();
|
|
320
|
+
}
|
|
321
|
+
},
|
|
322
|
+
async deleteMany({ model, where }) {
|
|
323
|
+
const metadata = getEntityMetadata(model);
|
|
324
|
+
return orm.em.nativeDelete(
|
|
325
|
+
metadata.class,
|
|
326
|
+
normalizeWhereClauses(metadata, where)
|
|
327
|
+
);
|
|
328
|
+
}
|
|
329
|
+
};
|
|
330
|
+
};
|
|
331
|
+
var mikroOrmAdapter = (orm, { debugLogs, supportsJSON = true, options } = {}) => (0, import_adapters.createAdapterFactory)({
|
|
332
|
+
adapter: adapter(orm),
|
|
219
333
|
config: {
|
|
220
334
|
debugLogs,
|
|
221
335
|
supportsJSON,
|
|
222
336
|
adapterId: "mikro-orm-adapter",
|
|
223
|
-
adapterName: "Mikro ORM Adapter"
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
const input = normalizeInput(metadata, data);
|
|
237
|
-
if (options.advanced?.generateId === false && !options.advanced?.database || options.advanced?.database?.generateId === false) {
|
|
238
|
-
Reflect.deleteProperty(input, "id");
|
|
239
|
-
}
|
|
240
|
-
const entity = orm.em.create(metadata.class, input);
|
|
241
|
-
try {
|
|
242
|
-
await orm.em.persistAndFlush(entity);
|
|
243
|
-
} catch (error) {
|
|
244
|
-
await orm.em.removeAndFlush(entity);
|
|
245
|
-
throw error;
|
|
246
|
-
}
|
|
247
|
-
return normalizeOutput(metadata, entity, select);
|
|
248
|
-
},
|
|
249
|
-
async count({ model, where }) {
|
|
250
|
-
const metadata = getEntityMetadata(model);
|
|
251
|
-
return orm.em.count(
|
|
252
|
-
metadata.class,
|
|
253
|
-
normalizeWhereClauses(metadata, where)
|
|
254
|
-
);
|
|
255
|
-
},
|
|
256
|
-
async findOne({ model, where, select }) {
|
|
257
|
-
const metadata = getEntityMetadata(model);
|
|
258
|
-
const entity = await orm.em.findOne(
|
|
259
|
-
metadata.class,
|
|
260
|
-
normalizeWhereClauses(metadata, where)
|
|
337
|
+
adapterName: "Mikro ORM Adapter",
|
|
338
|
+
transaction: async (cb) => {
|
|
339
|
+
return orm.em.transactional(async () => {
|
|
340
|
+
return cb(
|
|
341
|
+
(0, import_adapters.createAdapterFactory)({
|
|
342
|
+
adapter: adapter(orm),
|
|
343
|
+
config: {
|
|
344
|
+
debugLogs,
|
|
345
|
+
supportsJSON,
|
|
346
|
+
adapterId: "mikro-orm-adapter-transaction",
|
|
347
|
+
adapterName: "Mikro ORM Adapter Transaction"
|
|
348
|
+
}
|
|
349
|
+
})(options ?? {})
|
|
261
350
|
);
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
}
|
|
265
|
-
return normalizeOutput(metadata, entity, select);
|
|
266
|
-
},
|
|
267
|
-
async findMany({ model, where, limit, offset, sortBy }) {
|
|
268
|
-
const metadata = getEntityMetadata(model);
|
|
269
|
-
const options2 = {
|
|
270
|
-
limit,
|
|
271
|
-
offset
|
|
272
|
-
};
|
|
273
|
-
if (sortBy) {
|
|
274
|
-
const path = getFieldPath(metadata, sortBy.field);
|
|
275
|
-
(0, import_dset2.dset)(options2, ["orderBy", ...path], sortBy.direction);
|
|
276
|
-
}
|
|
277
|
-
const rows = await orm.em.find(
|
|
278
|
-
metadata.class,
|
|
279
|
-
normalizeWhereClauses(metadata, where),
|
|
280
|
-
options2
|
|
281
|
-
);
|
|
282
|
-
return rows.map((row) => normalizeOutput(metadata, row));
|
|
283
|
-
},
|
|
284
|
-
async update({ model, where, update }) {
|
|
285
|
-
const metadata = getEntityMetadata(model);
|
|
286
|
-
const entity = await orm.em.findOne(
|
|
287
|
-
metadata.class,
|
|
288
|
-
normalizeWhereClauses(metadata, where)
|
|
289
|
-
);
|
|
290
|
-
if (!entity) {
|
|
291
|
-
return null;
|
|
292
|
-
}
|
|
293
|
-
orm.em.assign(entity, normalizeInput(metadata, update));
|
|
294
|
-
try {
|
|
295
|
-
await orm.em.flush();
|
|
296
|
-
} catch (error) {
|
|
297
|
-
await orm.em.removeAndFlush(entity);
|
|
298
|
-
throw error;
|
|
299
|
-
}
|
|
300
|
-
return normalizeOutput(metadata, entity);
|
|
301
|
-
},
|
|
302
|
-
async updateMany({ model, where, update }) {
|
|
303
|
-
const metadata = getEntityMetadata(model);
|
|
304
|
-
return orm.em.nativeUpdate(
|
|
305
|
-
metadata.class,
|
|
306
|
-
normalizeWhereClauses(metadata, where),
|
|
307
|
-
normalizeInput(metadata, update)
|
|
308
|
-
);
|
|
309
|
-
},
|
|
310
|
-
async delete({ model, where }) {
|
|
311
|
-
const metadata = getEntityMetadata(model);
|
|
312
|
-
const entity = await orm.em.findOne(
|
|
313
|
-
metadata.class,
|
|
314
|
-
normalizeWhereClauses(metadata, where),
|
|
315
|
-
{
|
|
316
|
-
fields: ["id"]
|
|
317
|
-
}
|
|
318
|
-
);
|
|
319
|
-
if (entity) {
|
|
320
|
-
await orm.em.removeAndFlush(entity);
|
|
321
|
-
}
|
|
322
|
-
},
|
|
323
|
-
async deleteMany({ model, where }) {
|
|
324
|
-
const metadata = getEntityMetadata(model);
|
|
325
|
-
return orm.em.nativeDelete(
|
|
326
|
-
metadata.class,
|
|
327
|
-
normalizeWhereClauses(metadata, where)
|
|
328
|
-
);
|
|
329
|
-
}
|
|
330
|
-
};
|
|
351
|
+
});
|
|
352
|
+
}
|
|
331
353
|
}
|
|
332
354
|
});
|
|
333
355
|
// Annotate the CommonJS export names for ESM import in node:
|
package/lib/adapter.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as better_auth_adapters from 'better-auth/adapters';
|
|
2
2
|
import { MikroORM } from '@mikro-orm/core';
|
|
3
|
-
import {
|
|
3
|
+
import { BetterAuthOptions } from 'better-auth/types';
|
|
4
4
|
|
|
5
5
|
interface MikroOrmAdapterConfig {
|
|
6
6
|
/**
|
|
@@ -8,7 +8,11 @@ interface MikroOrmAdapterConfig {
|
|
|
8
8
|
*
|
|
9
9
|
* @default false
|
|
10
10
|
*/
|
|
11
|
-
debugLogs?:
|
|
11
|
+
debugLogs?: boolean | {
|
|
12
|
+
isRunningAdapterTests: boolean;
|
|
13
|
+
} | {
|
|
14
|
+
logCondition?: () => boolean;
|
|
15
|
+
};
|
|
12
16
|
/**
|
|
13
17
|
* Indicates whether or not JSON is supported by target database.
|
|
14
18
|
*
|
|
@@ -20,6 +24,10 @@ interface MikroOrmAdapterConfig {
|
|
|
20
24
|
* @default true
|
|
21
25
|
*/
|
|
22
26
|
supportsJSON?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Options for the Better Auth adapter.
|
|
29
|
+
*/
|
|
30
|
+
options?: BetterAuthOptions;
|
|
23
31
|
}
|
|
24
32
|
/**
|
|
25
33
|
* Creates Mikro ORM adapter for Better Auth.
|
|
@@ -29,9 +37,9 @@ interface MikroOrmAdapterConfig {
|
|
|
29
37
|
* * No complex primary key support
|
|
30
38
|
* * No schema generation
|
|
31
39
|
*
|
|
32
|
-
* @param orm - Instance of Mikro ORM returned from `MikroORM.init` or `MikroORM
|
|
40
|
+
* @param orm - Instance of Mikro ORM returned from `MikroORM.init` or `new MikroORM` constructor
|
|
33
41
|
* @param config - Additional configuration for Mikro ORM adapter
|
|
34
42
|
*/
|
|
35
|
-
declare const mikroOrmAdapter: (orm: MikroORM, { debugLogs, supportsJSON }?: MikroOrmAdapterConfig) =>
|
|
43
|
+
declare const mikroOrmAdapter: (orm: MikroORM, { debugLogs, supportsJSON, options }?: MikroOrmAdapterConfig) => better_auth_adapters.AdapterFactory<BetterAuthOptions>;
|
|
36
44
|
|
|
37
45
|
export { type MikroOrmAdapterConfig, mikroOrmAdapter };
|
package/lib/adapter.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import * as
|
|
1
|
+
import * as better_auth_adapters from 'better-auth/adapters';
|
|
2
2
|
import { MikroORM } from '@mikro-orm/core';
|
|
3
|
-
import {
|
|
3
|
+
import { BetterAuthOptions } from 'better-auth/types';
|
|
4
4
|
|
|
5
5
|
interface MikroOrmAdapterConfig {
|
|
6
6
|
/**
|
|
@@ -8,7 +8,11 @@ interface MikroOrmAdapterConfig {
|
|
|
8
8
|
*
|
|
9
9
|
* @default false
|
|
10
10
|
*/
|
|
11
|
-
debugLogs?:
|
|
11
|
+
debugLogs?: boolean | {
|
|
12
|
+
isRunningAdapterTests: boolean;
|
|
13
|
+
} | {
|
|
14
|
+
logCondition?: () => boolean;
|
|
15
|
+
};
|
|
12
16
|
/**
|
|
13
17
|
* Indicates whether or not JSON is supported by target database.
|
|
14
18
|
*
|
|
@@ -20,6 +24,10 @@ interface MikroOrmAdapterConfig {
|
|
|
20
24
|
* @default true
|
|
21
25
|
*/
|
|
22
26
|
supportsJSON?: boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Options for the Better Auth adapter.
|
|
29
|
+
*/
|
|
30
|
+
options?: BetterAuthOptions;
|
|
23
31
|
}
|
|
24
32
|
/**
|
|
25
33
|
* Creates Mikro ORM adapter for Better Auth.
|
|
@@ -29,9 +37,9 @@ interface MikroOrmAdapterConfig {
|
|
|
29
37
|
* * No complex primary key support
|
|
30
38
|
* * No schema generation
|
|
31
39
|
*
|
|
32
|
-
* @param orm - Instance of Mikro ORM returned from `MikroORM.init` or `MikroORM
|
|
40
|
+
* @param orm - Instance of Mikro ORM returned from `MikroORM.init` or `new MikroORM` constructor
|
|
33
41
|
* @param config - Additional configuration for Mikro ORM adapter
|
|
34
42
|
*/
|
|
35
|
-
declare const mikroOrmAdapter: (orm: MikroORM, { debugLogs, supportsJSON }?: MikroOrmAdapterConfig) =>
|
|
43
|
+
declare const mikroOrmAdapter: (orm: MikroORM, { debugLogs, supportsJSON, options }?: MikroOrmAdapterConfig) => better_auth_adapters.AdapterFactory<BetterAuthOptions>;
|
|
36
44
|
|
|
37
45
|
export { type MikroOrmAdapterConfig, mikroOrmAdapter };
|
package/lib/adapter.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// src/adapter.ts
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
} from "
|
|
3
|
+
createAdapterFactory
|
|
4
|
+
} from "better-auth/adapters";
|
|
5
5
|
import { dset as dset2 } from "dset";
|
|
6
6
|
|
|
7
7
|
// src/utils/adapterUtils.ts
|
|
@@ -9,7 +9,7 @@ import { ReferenceKind, serialize } from "@mikro-orm/core";
|
|
|
9
9
|
import { dset } from "dset";
|
|
10
10
|
|
|
11
11
|
// src/utils/createAdapterError.ts
|
|
12
|
-
import { BetterAuthError } from "
|
|
12
|
+
import { BetterAuthError } from "better-auth";
|
|
13
13
|
function createAdapterError(message) {
|
|
14
14
|
throw new BetterAuthError(`[Mikro ORM Adapter] ${message}`);
|
|
15
15
|
}
|
|
@@ -26,12 +26,15 @@ function createAdapterUtils(orm) {
|
|
|
26
26
|
const normalizeEntityName = (name) => naming.getEntityName(naming.classToTableName(name));
|
|
27
27
|
const getEntityMetadata = (entityName) => {
|
|
28
28
|
entityName = normalizeEntityName(entityName);
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
29
|
+
const allMetadata = metadata.getAll();
|
|
30
|
+
for (const meta of allMetadata.values()) {
|
|
31
|
+
if (meta.className === entityName) {
|
|
32
|
+
return meta;
|
|
33
|
+
}
|
|
33
34
|
}
|
|
34
|
-
|
|
35
|
+
createAdapterError(
|
|
36
|
+
`Cannot find metadata for "${entityName}" entity. Make sure it defined and listed in your Mikro ORM config.`
|
|
37
|
+
);
|
|
35
38
|
};
|
|
36
39
|
function getPropertyMetadata(metadata2, fieldName) {
|
|
37
40
|
const prop = metadata2.props.find((prop2) => {
|
|
@@ -99,11 +102,13 @@ function createAdapterUtils(orm) {
|
|
|
99
102
|
const normalizeInput = (metadata2, input) => {
|
|
100
103
|
const fields = {};
|
|
101
104
|
Object.entries(input).forEach(([key, value]) => {
|
|
102
|
-
if (typeof value === "object" && value.$in) {
|
|
103
|
-
|
|
105
|
+
if (typeof value === "object" && value !== null && value.$in) {
|
|
106
|
+
const property = getPropertyMetadata(metadata2, key);
|
|
107
|
+
dset(fields, [property.name], value.$in);
|
|
104
108
|
} else {
|
|
105
|
-
const
|
|
106
|
-
|
|
109
|
+
const property = getPropertyMetadata(metadata2, key);
|
|
110
|
+
const normalizedValue = normalizePropertyValue(property, value);
|
|
111
|
+
dset(fields, [property.name], normalizedValue);
|
|
107
112
|
}
|
|
108
113
|
});
|
|
109
114
|
return fields;
|
|
@@ -117,7 +122,9 @@ function createAdapterUtils(orm) {
|
|
|
117
122
|
getPropertyMetadata(metadata2, key)
|
|
118
123
|
),
|
|
119
124
|
value
|
|
120
|
-
})).forEach(({ path, value }) =>
|
|
125
|
+
})).forEach(({ path, value }) => {
|
|
126
|
+
dset(result, path, value);
|
|
127
|
+
});
|
|
121
128
|
return result;
|
|
122
129
|
};
|
|
123
130
|
function createWhereClause(path, value, op, target = {}) {
|
|
@@ -145,6 +152,8 @@ function createAdapterUtils(orm) {
|
|
|
145
152
|
switch (w.operator) {
|
|
146
153
|
case "in":
|
|
147
154
|
return createWhereInClause(w.field, path, w.value);
|
|
155
|
+
case "not_in":
|
|
156
|
+
return createWhereClause(path, w.value, "$nin");
|
|
148
157
|
case "contains":
|
|
149
158
|
return createWhereClause(path, `%${w.value}%`, "$like");
|
|
150
159
|
case "starts_with":
|
|
@@ -164,19 +173,16 @@ function createAdapterUtils(orm) {
|
|
|
164
173
|
}
|
|
165
174
|
const result = {};
|
|
166
175
|
where.filter(({ connector }) => !connector || connector === "AND").forEach(({ field, operator, value }, index) => {
|
|
167
|
-
const path = ["$and", index].concat(
|
|
168
|
-
getFieldPath(metadata2, field, true)
|
|
169
|
-
);
|
|
176
|
+
const path = ["$and", index].concat(getFieldPath(metadata2, field, true));
|
|
170
177
|
if (operator === "in") {
|
|
171
|
-
|
|
178
|
+
createWhereInClause(field, path, value, result);
|
|
179
|
+
} else {
|
|
180
|
+
createWhereClause(path, value, "eq", result);
|
|
172
181
|
}
|
|
173
|
-
return createWhereClause(path, value, "eq", result);
|
|
174
182
|
});
|
|
175
183
|
where.filter(({ connector }) => connector === "OR").forEach(({ field, value }, index) => {
|
|
176
|
-
const path = ["$
|
|
177
|
-
|
|
178
|
-
);
|
|
179
|
-
return createWhereClause(path, value, "eq", result);
|
|
184
|
+
const path = ["$or", index].concat(getFieldPath(metadata2, field, true));
|
|
185
|
+
createWhereClause(path, value, "eq", result);
|
|
180
186
|
});
|
|
181
187
|
return result;
|
|
182
188
|
};
|
|
@@ -191,119 +197,135 @@ function createAdapterUtils(orm) {
|
|
|
191
197
|
}
|
|
192
198
|
|
|
193
199
|
// src/adapter.ts
|
|
194
|
-
var
|
|
200
|
+
var adapter = (orm) => ({ options }) => {
|
|
201
|
+
const {
|
|
202
|
+
getEntityMetadata,
|
|
203
|
+
getFieldPath,
|
|
204
|
+
normalizeInput,
|
|
205
|
+
normalizeOutput,
|
|
206
|
+
normalizeWhereClauses
|
|
207
|
+
} = createAdapterUtils(orm);
|
|
208
|
+
return {
|
|
209
|
+
async create({ model, data, select }) {
|
|
210
|
+
const metadata = getEntityMetadata(model);
|
|
211
|
+
const input = normalizeInput(metadata, data);
|
|
212
|
+
if (options.advanced?.database?.generateId === false) {
|
|
213
|
+
Reflect.deleteProperty(input, "id");
|
|
214
|
+
}
|
|
215
|
+
const entity = orm.em.create(metadata.class, input);
|
|
216
|
+
try {
|
|
217
|
+
await orm.em.persist(entity).flush();
|
|
218
|
+
} catch (error) {
|
|
219
|
+
await orm.em.remove(entity).flush();
|
|
220
|
+
throw error;
|
|
221
|
+
}
|
|
222
|
+
return normalizeOutput(metadata, entity, select);
|
|
223
|
+
},
|
|
224
|
+
async count({ model, where }) {
|
|
225
|
+
const metadata = getEntityMetadata(model);
|
|
226
|
+
return orm.em.count(
|
|
227
|
+
metadata.class,
|
|
228
|
+
normalizeWhereClauses(metadata, where)
|
|
229
|
+
);
|
|
230
|
+
},
|
|
231
|
+
async findOne({ model, where, select }) {
|
|
232
|
+
const metadata = getEntityMetadata(model);
|
|
233
|
+
const entity = await orm.em.findOne(
|
|
234
|
+
metadata.class,
|
|
235
|
+
normalizeWhereClauses(metadata, where)
|
|
236
|
+
);
|
|
237
|
+
if (!entity) {
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
return normalizeOutput(metadata, entity, select);
|
|
241
|
+
},
|
|
242
|
+
async findMany({ model, where, limit, offset, sortBy }) {
|
|
243
|
+
const metadata = getEntityMetadata(model);
|
|
244
|
+
const options2 = {
|
|
245
|
+
limit,
|
|
246
|
+
offset
|
|
247
|
+
};
|
|
248
|
+
if (sortBy) {
|
|
249
|
+
const path = getFieldPath(metadata, sortBy.field);
|
|
250
|
+
dset2(options2, ["orderBy", ...path], sortBy.direction);
|
|
251
|
+
}
|
|
252
|
+
const rows = await orm.em.find(
|
|
253
|
+
metadata.class,
|
|
254
|
+
normalizeWhereClauses(metadata, where),
|
|
255
|
+
options2
|
|
256
|
+
);
|
|
257
|
+
return rows.map((row) => normalizeOutput(metadata, row));
|
|
258
|
+
},
|
|
259
|
+
async update({ model, where, update }) {
|
|
260
|
+
const metadata = getEntityMetadata(model);
|
|
261
|
+
const entity = await orm.em.findOne(
|
|
262
|
+
metadata.class,
|
|
263
|
+
normalizeWhereClauses(metadata, where)
|
|
264
|
+
);
|
|
265
|
+
if (!entity) {
|
|
266
|
+
return null;
|
|
267
|
+
}
|
|
268
|
+
orm.em.assign(entity, normalizeInput(metadata, update));
|
|
269
|
+
try {
|
|
270
|
+
await orm.em.flush();
|
|
271
|
+
} catch (error) {
|
|
272
|
+
await orm.em.remove(entity).flush();
|
|
273
|
+
throw error;
|
|
274
|
+
}
|
|
275
|
+
return normalizeOutput(metadata, entity);
|
|
276
|
+
},
|
|
277
|
+
async updateMany({ model, where, update }) {
|
|
278
|
+
const metadata = getEntityMetadata(model);
|
|
279
|
+
return orm.em.nativeUpdate(
|
|
280
|
+
metadata.class,
|
|
281
|
+
normalizeWhereClauses(metadata, where),
|
|
282
|
+
normalizeInput(metadata, update)
|
|
283
|
+
);
|
|
284
|
+
},
|
|
285
|
+
async delete({ model, where }) {
|
|
286
|
+
const metadata = getEntityMetadata(model);
|
|
287
|
+
const entity = await orm.em.findOne(
|
|
288
|
+
metadata.class,
|
|
289
|
+
normalizeWhereClauses(metadata, where),
|
|
290
|
+
{
|
|
291
|
+
fields: ["id"]
|
|
292
|
+
}
|
|
293
|
+
);
|
|
294
|
+
if (entity) {
|
|
295
|
+
await orm.em.remove(entity).flush();
|
|
296
|
+
}
|
|
297
|
+
},
|
|
298
|
+
async deleteMany({ model, where }) {
|
|
299
|
+
const metadata = getEntityMetadata(model);
|
|
300
|
+
return orm.em.nativeDelete(
|
|
301
|
+
metadata.class,
|
|
302
|
+
normalizeWhereClauses(metadata, where)
|
|
303
|
+
);
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
};
|
|
307
|
+
var mikroOrmAdapter = (orm, { debugLogs, supportsJSON = true, options } = {}) => createAdapterFactory({
|
|
308
|
+
adapter: adapter(orm),
|
|
195
309
|
config: {
|
|
196
310
|
debugLogs,
|
|
197
311
|
supportsJSON,
|
|
198
312
|
adapterId: "mikro-orm-adapter",
|
|
199
|
-
adapterName: "Mikro ORM Adapter"
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
const input = normalizeInput(metadata, data);
|
|
213
|
-
if (options.advanced?.generateId === false && !options.advanced?.database || options.advanced?.database?.generateId === false) {
|
|
214
|
-
Reflect.deleteProperty(input, "id");
|
|
215
|
-
}
|
|
216
|
-
const entity = orm.em.create(metadata.class, input);
|
|
217
|
-
try {
|
|
218
|
-
await orm.em.persistAndFlush(entity);
|
|
219
|
-
} catch (error) {
|
|
220
|
-
await orm.em.removeAndFlush(entity);
|
|
221
|
-
throw error;
|
|
222
|
-
}
|
|
223
|
-
return normalizeOutput(metadata, entity, select);
|
|
224
|
-
},
|
|
225
|
-
async count({ model, where }) {
|
|
226
|
-
const metadata = getEntityMetadata(model);
|
|
227
|
-
return orm.em.count(
|
|
228
|
-
metadata.class,
|
|
229
|
-
normalizeWhereClauses(metadata, where)
|
|
230
|
-
);
|
|
231
|
-
},
|
|
232
|
-
async findOne({ model, where, select }) {
|
|
233
|
-
const metadata = getEntityMetadata(model);
|
|
234
|
-
const entity = await orm.em.findOne(
|
|
235
|
-
metadata.class,
|
|
236
|
-
normalizeWhereClauses(metadata, where)
|
|
313
|
+
adapterName: "Mikro ORM Adapter",
|
|
314
|
+
transaction: async (cb) => {
|
|
315
|
+
return orm.em.transactional(async () => {
|
|
316
|
+
return cb(
|
|
317
|
+
createAdapterFactory({
|
|
318
|
+
adapter: adapter(orm),
|
|
319
|
+
config: {
|
|
320
|
+
debugLogs,
|
|
321
|
+
supportsJSON,
|
|
322
|
+
adapterId: "mikro-orm-adapter-transaction",
|
|
323
|
+
adapterName: "Mikro ORM Adapter Transaction"
|
|
324
|
+
}
|
|
325
|
+
})(options ?? {})
|
|
237
326
|
);
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
}
|
|
241
|
-
return normalizeOutput(metadata, entity, select);
|
|
242
|
-
},
|
|
243
|
-
async findMany({ model, where, limit, offset, sortBy }) {
|
|
244
|
-
const metadata = getEntityMetadata(model);
|
|
245
|
-
const options2 = {
|
|
246
|
-
limit,
|
|
247
|
-
offset
|
|
248
|
-
};
|
|
249
|
-
if (sortBy) {
|
|
250
|
-
const path = getFieldPath(metadata, sortBy.field);
|
|
251
|
-
dset2(options2, ["orderBy", ...path], sortBy.direction);
|
|
252
|
-
}
|
|
253
|
-
const rows = await orm.em.find(
|
|
254
|
-
metadata.class,
|
|
255
|
-
normalizeWhereClauses(metadata, where),
|
|
256
|
-
options2
|
|
257
|
-
);
|
|
258
|
-
return rows.map((row) => normalizeOutput(metadata, row));
|
|
259
|
-
},
|
|
260
|
-
async update({ model, where, update }) {
|
|
261
|
-
const metadata = getEntityMetadata(model);
|
|
262
|
-
const entity = await orm.em.findOne(
|
|
263
|
-
metadata.class,
|
|
264
|
-
normalizeWhereClauses(metadata, where)
|
|
265
|
-
);
|
|
266
|
-
if (!entity) {
|
|
267
|
-
return null;
|
|
268
|
-
}
|
|
269
|
-
orm.em.assign(entity, normalizeInput(metadata, update));
|
|
270
|
-
try {
|
|
271
|
-
await orm.em.flush();
|
|
272
|
-
} catch (error) {
|
|
273
|
-
await orm.em.removeAndFlush(entity);
|
|
274
|
-
throw error;
|
|
275
|
-
}
|
|
276
|
-
return normalizeOutput(metadata, entity);
|
|
277
|
-
},
|
|
278
|
-
async updateMany({ model, where, update }) {
|
|
279
|
-
const metadata = getEntityMetadata(model);
|
|
280
|
-
return orm.em.nativeUpdate(
|
|
281
|
-
metadata.class,
|
|
282
|
-
normalizeWhereClauses(metadata, where),
|
|
283
|
-
normalizeInput(metadata, update)
|
|
284
|
-
);
|
|
285
|
-
},
|
|
286
|
-
async delete({ model, where }) {
|
|
287
|
-
const metadata = getEntityMetadata(model);
|
|
288
|
-
const entity = await orm.em.findOne(
|
|
289
|
-
metadata.class,
|
|
290
|
-
normalizeWhereClauses(metadata, where),
|
|
291
|
-
{
|
|
292
|
-
fields: ["id"]
|
|
293
|
-
}
|
|
294
|
-
);
|
|
295
|
-
if (entity) {
|
|
296
|
-
await orm.em.removeAndFlush(entity);
|
|
297
|
-
}
|
|
298
|
-
},
|
|
299
|
-
async deleteMany({ model, where }) {
|
|
300
|
-
const metadata = getEntityMetadata(model);
|
|
301
|
-
return orm.em.nativeDelete(
|
|
302
|
-
metadata.class,
|
|
303
|
-
normalizeWhereClauses(metadata, where)
|
|
304
|
-
);
|
|
305
|
-
}
|
|
306
|
-
};
|
|
327
|
+
});
|
|
328
|
+
}
|
|
307
329
|
}
|
|
308
330
|
});
|
|
309
331
|
export {
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"private": false,
|
|
3
3
|
"type": "module",
|
|
4
4
|
"name": "@forklaunch/better-auth-mikro-orm-fork",
|
|
5
|
-
"version": "0.
|
|
5
|
+
"version": "0.5.0",
|
|
6
6
|
"description": "Mikro ORM Adapter for Better Auth",
|
|
7
7
|
"keywords": [
|
|
8
8
|
"auth",
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
"url": "git+ssh://git@github.com/octet-stream/better-auth-mikro-orm.git"
|
|
21
21
|
},
|
|
22
22
|
"engines": {
|
|
23
|
-
"node": ">=
|
|
23
|
+
"node": ">= 22.17"
|
|
24
24
|
},
|
|
25
25
|
"types": "./lib/adapter.d.cts",
|
|
26
26
|
"main": "./lib/adapter.cjs",
|
|
@@ -46,34 +46,35 @@
|
|
|
46
46
|
"lib"
|
|
47
47
|
],
|
|
48
48
|
"devDependencies": {
|
|
49
|
-
"@
|
|
50
|
-
"@
|
|
51
|
-
"@changesets/
|
|
52
|
-
"@
|
|
53
|
-
"@commitlint/
|
|
54
|
-
"@commitlint/
|
|
55
|
-
"@
|
|
56
|
-
"@
|
|
57
|
-
"@mikro-orm/core": "
|
|
58
|
-
"@
|
|
59
|
-
"@types/
|
|
60
|
-
"@
|
|
61
|
-
"@vitest/
|
|
62
|
-
"@
|
|
63
|
-
"
|
|
64
|
-
"
|
|
49
|
+
"@better-auth/test-utils": "1.5.5",
|
|
50
|
+
"@biomejs/biome": "2.4.7",
|
|
51
|
+
"@changesets/changelog-github": "0.6.0",
|
|
52
|
+
"@changesets/cli": "2.30.0",
|
|
53
|
+
"@commitlint/cli": "20.5.0",
|
|
54
|
+
"@commitlint/config-conventional": "20.5.0",
|
|
55
|
+
"@commitlint/types": "20.5.0",
|
|
56
|
+
"@faker-js/faker": "10.3.0",
|
|
57
|
+
"@mikro-orm/core": "7.0.2",
|
|
58
|
+
"@mikro-orm/sqlite": "7.0.2",
|
|
59
|
+
"@types/node": "25.5.0",
|
|
60
|
+
"@types/uuid": "11.0.0",
|
|
61
|
+
"@vitest/coverage-v8": "4.1.0",
|
|
62
|
+
"@vitest/ui": "4.1.0",
|
|
63
|
+
"better-auth": "1.5.5",
|
|
64
|
+
"del-cli": "7.0.0",
|
|
65
|
+
"es-toolkit": "1.45.1",
|
|
65
66
|
"husky": "9.1.7",
|
|
66
|
-
"is-in-ci": "
|
|
67
|
-
"tsup": "8.
|
|
68
|
-
"typescript": "5.
|
|
69
|
-
"uuid": "
|
|
70
|
-
"vitest": "
|
|
67
|
+
"is-in-ci": "2.0.0",
|
|
68
|
+
"tsup": "8.5.1",
|
|
69
|
+
"typescript": "5.9.3",
|
|
70
|
+
"uuid": "13.0.0",
|
|
71
|
+
"vitest": "4.1.0"
|
|
71
72
|
},
|
|
72
73
|
"dependencies": {
|
|
73
74
|
"dset": "3.1.4"
|
|
74
75
|
},
|
|
75
76
|
"peerDependencies": {
|
|
76
|
-
"@mikro-orm/core": "^
|
|
77
|
+
"@mikro-orm/core": "^7.0.0",
|
|
77
78
|
"better-auth": "^1.0.0"
|
|
78
79
|
},
|
|
79
80
|
"scripts": {
|
package/readme.md
CHANGED
|
@@ -32,8 +32,8 @@ pnpm add better-auth-mikro-orm
|
|
|
32
32
|
2. When you're finished with the schema definitions, you can simply pass the result of the `mikroOrmAdapter` call to the `database` option like this:
|
|
33
33
|
|
|
34
34
|
```ts
|
|
35
|
-
import { mikroOrmAdapter } from "
|
|
36
|
-
import { betterAuth } from "
|
|
35
|
+
import { mikroOrmAdapter } from "better-auth-mikro-orm";
|
|
36
|
+
import { betterAuth } from "better-auth";
|
|
37
37
|
|
|
38
38
|
import { orm } from "./orm.js"; // Your Mikro ORM instance
|
|
39
39
|
|