@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 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("@forklaunch/better-auth/adapters");
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("@forklaunch/better-auth");
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
- if (!metadata.has(entityName)) {
54
- createAdapterError(
55
- `Cannot find metadata for "${entityName}" entity. Make sure it defined and listed in your Mikro ORM config.`
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
- return metadata.get(entityName);
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
- (0, import_dset.dset)(fields, key, value.$in);
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 path = getFieldPath(metadata2, key);
130
- (0, import_dset.dset)(fields, path, value);
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 }) => (0, import_dset.dset)(result, 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
- return createWhereInClause(field, path, value, result);
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 = ["$and", index].concat(
201
- getFieldPath(metadata2, field, true)
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 mikroOrmAdapter = (orm, { debugLogs, supportsJSON = true } = {}) => (0, import_adapters.createAdapter)({
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
- adapter({ options }) {
226
- const {
227
- getEntityMetadata,
228
- getFieldPath,
229
- normalizeInput,
230
- normalizeOutput,
231
- normalizeWhereClauses
232
- } = createAdapterUtils(orm);
233
- return {
234
- async create({ model, data, select }) {
235
- const metadata = getEntityMetadata(model);
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
- if (!entity) {
263
- return null;
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 _forklaunch_better_auth from '@forklaunch/better-auth';
1
+ import * as better_auth_adapters from 'better-auth/adapters';
2
2
  import { MikroORM } from '@mikro-orm/core';
3
- import { AdapterDebugLogs } from '@forklaunch/better-auth/adapters';
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?: AdapterDebugLogs;
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.initSync` methods
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) => (options: _forklaunch_better_auth.BetterAuthOptions) => _forklaunch_better_auth.Adapter;
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 _forklaunch_better_auth from '@forklaunch/better-auth';
1
+ import * as better_auth_adapters from 'better-auth/adapters';
2
2
  import { MikroORM } from '@mikro-orm/core';
3
- import { AdapterDebugLogs } from '@forklaunch/better-auth/adapters';
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?: AdapterDebugLogs;
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.initSync` methods
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) => (options: _forklaunch_better_auth.BetterAuthOptions) => _forklaunch_better_auth.Adapter;
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
- createAdapter
4
- } from "@forklaunch/better-auth/adapters";
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 "@forklaunch/better-auth";
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
- if (!metadata.has(entityName)) {
30
- createAdapterError(
31
- `Cannot find metadata for "${entityName}" entity. Make sure it defined and listed in your Mikro ORM config.`
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
- return metadata.get(entityName);
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
- dset(fields, key, value.$in);
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 path = getFieldPath(metadata2, key);
106
- dset(fields, path, value);
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 }) => dset(result, 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
- return createWhereInClause(field, path, value, result);
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 = ["$and", index].concat(
177
- getFieldPath(metadata2, field, true)
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 mikroOrmAdapter = (orm, { debugLogs, supportsJSON = true } = {}) => createAdapter({
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
- adapter({ options }) {
202
- const {
203
- getEntityMetadata,
204
- getFieldPath,
205
- normalizeInput,
206
- normalizeOutput,
207
- normalizeWhereClauses
208
- } = createAdapterUtils(orm);
209
- return {
210
- async create({ model, data, select }) {
211
- const metadata = getEntityMetadata(model);
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
- if (!entity) {
239
- return null;
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.4.105",
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": ">= 18"
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
- "@biomejs/biome": "1.9.4",
50
- "@changesets/changelog-github": "0.5.1",
51
- "@changesets/cli": "2.29.2",
52
- "@commitlint/cli": "19.8.0",
53
- "@commitlint/config-conventional": "19.8.0",
54
- "@commitlint/types": "19.8.0",
55
- "@faker-js/faker": "9.7.0",
56
- "@mikro-orm/better-sqlite": "6.4.13",
57
- "@mikro-orm/core": "6.4.13",
58
- "@types/node": "22.14.1",
59
- "@types/uuid": "10.0.0",
60
- "@vitest/coverage-v8": "3.1.1",
61
- "@vitest/ui": "3.1.1",
62
- "@forklaunch/better-auth": "1.3.8",
63
- "del-cli": "6.0.0",
64
- "es-toolkit": "1.39.7",
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": "1.0.0",
67
- "tsup": "8.4.0",
68
- "typescript": "5.8.3",
69
- "uuid": "11.1.0",
70
- "vitest": "3.1.1"
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": "^6.0.0",
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 "@forklaunch/better-auth-mikro-orm";
36
- import { betterAuth } from "@forklaunch/better-auth";
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