@lenne.tech/nest-server 11.6.2 → 11.7.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 (74) hide show
  1. package/dist/config.env.js +2 -11
  2. package/dist/config.env.js.map +1 -1
  3. package/dist/core/common/helpers/filter.helper.d.ts +9 -9
  4. package/dist/core/common/helpers/filter.helper.js +2 -4
  5. package/dist/core/common/helpers/filter.helper.js.map +1 -1
  6. package/dist/core/common/helpers/gridfs.helper.js +3 -3
  7. package/dist/core/common/helpers/gridfs.helper.js.map +1 -1
  8. package/dist/core/common/interfaces/server-options.interface.d.ts +4 -3
  9. package/dist/core/common/services/crud.service.d.ts +16 -16
  10. package/dist/core/common/services/crud.service.js +1 -1
  11. package/dist/core/common/services/crud.service.js.map +1 -1
  12. package/dist/core/modules/better-auth/better-auth-models.d.ts +0 -1
  13. package/dist/core/modules/better-auth/better-auth-models.js +0 -4
  14. package/dist/core/modules/better-auth/better-auth-models.js.map +1 -1
  15. package/dist/core/modules/better-auth/better-auth.config.js +3 -0
  16. package/dist/core/modules/better-auth/better-auth.config.js.map +1 -1
  17. package/dist/core/modules/better-auth/better-auth.module.d.ts +10 -2
  18. package/dist/core/modules/better-auth/better-auth.module.js +40 -52
  19. package/dist/core/modules/better-auth/better-auth.module.js.map +1 -1
  20. package/dist/core/modules/better-auth/better-auth.resolver.d.ts +8 -12
  21. package/dist/core/modules/better-auth/better-auth.resolver.js +33 -351
  22. package/dist/core/modules/better-auth/better-auth.resolver.js.map +1 -1
  23. package/dist/core/modules/better-auth/better-auth.service.d.ts +0 -1
  24. package/dist/core/modules/better-auth/better-auth.service.js +0 -3
  25. package/dist/core/modules/better-auth/better-auth.service.js.map +1 -1
  26. package/dist/core/modules/better-auth/better-auth.types.d.ts +9 -8
  27. package/dist/core/modules/better-auth/better-auth.types.js +14 -3
  28. package/dist/core/modules/better-auth/better-auth.types.js.map +1 -1
  29. package/dist/core/modules/better-auth/core-better-auth.controller.d.ts +66 -0
  30. package/dist/core/modules/better-auth/core-better-auth.controller.js +491 -0
  31. package/dist/core/modules/better-auth/core-better-auth.controller.js.map +1 -0
  32. package/dist/core/modules/better-auth/core-better-auth.resolver.d.ts +59 -0
  33. package/dist/core/modules/better-auth/core-better-auth.resolver.js +538 -0
  34. package/dist/core/modules/better-auth/core-better-auth.resolver.js.map +1 -0
  35. package/dist/core/modules/better-auth/index.d.ts +2 -0
  36. package/dist/core/modules/better-auth/index.js +2 -0
  37. package/dist/core/modules/better-auth/index.js.map +1 -1
  38. package/dist/core.module.js +1 -1
  39. package/dist/core.module.js.map +1 -1
  40. package/dist/server/modules/better-auth/better-auth.controller.d.ts +10 -0
  41. package/dist/server/modules/better-auth/better-auth.controller.js +36 -0
  42. package/dist/server/modules/better-auth/better-auth.controller.js.map +1 -0
  43. package/dist/server/modules/better-auth/better-auth.module.d.ts +9 -0
  44. package/dist/server/modules/better-auth/better-auth.module.js +44 -0
  45. package/dist/server/modules/better-auth/better-auth.module.js.map +1 -0
  46. package/dist/server/modules/better-auth/better-auth.resolver.d.ts +45 -0
  47. package/dist/server/modules/better-auth/better-auth.resolver.js +221 -0
  48. package/dist/server/modules/better-auth/better-auth.resolver.js.map +1 -0
  49. package/dist/server/modules/file/file-info.model.d.ts +71 -3
  50. package/dist/server/modules/user/user.model.d.ts +169 -3
  51. package/dist/server/server.module.js +6 -1
  52. package/dist/server/server.module.js.map +1 -1
  53. package/dist/tsconfig.build.tsbuildinfo +1 -1
  54. package/package.json +20 -29
  55. package/src/config.env.ts +2 -11
  56. package/src/core/common/helpers/filter.helper.ts +15 -17
  57. package/src/core/common/helpers/gridfs.helper.ts +5 -5
  58. package/src/core/common/interfaces/server-options.interface.ts +47 -14
  59. package/src/core/common/services/crud.service.ts +22 -22
  60. package/src/core/modules/better-auth/README.md +365 -39
  61. package/src/core/modules/better-auth/better-auth-models.ts +0 -3
  62. package/src/core/modules/better-auth/better-auth.config.ts +5 -0
  63. package/src/core/modules/better-auth/better-auth.module.ts +107 -66
  64. package/src/core/modules/better-auth/better-auth.resolver.ts +88 -553
  65. package/src/core/modules/better-auth/better-auth.service.ts +0 -9
  66. package/src/core/modules/better-auth/better-auth.types.ts +25 -10
  67. package/src/core/modules/better-auth/core-better-auth.controller.ts +605 -0
  68. package/src/core/modules/better-auth/core-better-auth.resolver.ts +705 -0
  69. package/src/core/modules/better-auth/index.ts +8 -1
  70. package/src/core.module.ts +3 -2
  71. package/src/server/modules/better-auth/better-auth.controller.ts +41 -0
  72. package/src/server/modules/better-auth/better-auth.module.ts +88 -0
  73. package/src/server/modules/better-auth/better-auth.resolver.ts +201 -0
  74. package/src/server/server.module.ts +10 -1
@@ -7,9 +7,9 @@ import {
7
7
  NestModule,
8
8
  OnModuleInit,
9
9
  Optional,
10
+ Type,
10
11
  } from '@nestjs/common';
11
12
  import { getConnectionToken } from '@nestjs/mongoose';
12
- import { AuthModule, AuthService } from '@thallesp/nestjs-better-auth';
13
13
  import mongoose, { Connection } from 'mongoose';
14
14
 
15
15
  import { IBetterAuth } from '../../common/interfaces/server-options.interface';
@@ -21,6 +21,8 @@ import { BetterAuthInstance, createBetterAuthInstance } from './better-auth.conf
21
21
  import { BetterAuthMiddleware } from './better-auth.middleware';
22
22
  import { BetterAuthResolver } from './better-auth.resolver';
23
23
  import { BetterAuthService } from './better-auth.service';
24
+ import { CoreBetterAuthController } from './core-better-auth.controller';
25
+ import { CoreBetterAuthResolver } from './core-better-auth.resolver';
24
26
 
25
27
  /**
26
28
  * Token for injecting the better-auth instance
@@ -36,6 +38,31 @@ export interface BetterAuthModuleOptions {
36
38
  */
37
39
  config: IBetterAuth;
38
40
 
41
+ /**
42
+ * Custom controller class to use instead of the default CoreBetterAuthController.
43
+ * The class must extend CoreBetterAuthController.
44
+ *
45
+ * @example
46
+ * ```typescript
47
+ * // Your custom controller
48
+ * @Controller('iam')
49
+ * export class MyBetterAuthController extends CoreBetterAuthController {
50
+ * override async signUp(res: Response, input: BetterAuthSignUpInput) {
51
+ * const result = await super.signUp(res, input);
52
+ * await this.emailService.sendWelcomeEmail(result.user?.email);
53
+ * return result;
54
+ * }
55
+ * }
56
+ *
57
+ * // In your module
58
+ * BetterAuthModule.forRoot({
59
+ * config: environment.betterAuth,
60
+ * controller: MyBetterAuthController,
61
+ * })
62
+ * ```
63
+ */
64
+ controller?: Type<CoreBetterAuthController>;
65
+
39
66
  /**
40
67
  * Fallback secrets to try if no betterAuth.secret is configured.
41
68
  * The array is iterated and the first valid secret (≥32 chars) is used.
@@ -46,6 +73,31 @@ export interface BetterAuthModuleOptions {
46
73
  * ```
47
74
  */
48
75
  fallbackSecrets?: (string | undefined)[];
76
+
77
+ /**
78
+ * Custom resolver class to use instead of the default BetterAuthResolver.
79
+ * The class must extend CoreBetterAuthResolver.
80
+ *
81
+ * @example
82
+ * ```typescript
83
+ * // Your custom resolver
84
+ * @Resolver(() => BetterAuthAuthModel)
85
+ * export class MyBetterAuthResolver extends CoreBetterAuthResolver {
86
+ * override async betterAuthSignUp(...) {
87
+ * const result = await super.betterAuthSignUp(...);
88
+ * await this.sendWelcomeEmail(result.user);
89
+ * return result;
90
+ * }
91
+ * }
92
+ *
93
+ * // In your module
94
+ * BetterAuthModule.forRoot({
95
+ * config: environment.betterAuth,
96
+ * resolver: MyBetterAuthResolver,
97
+ * })
98
+ * ```
99
+ */
100
+ resolver?: Type<CoreBetterAuthResolver>;
49
101
  }
50
102
 
51
103
  /**
@@ -53,7 +105,7 @@ export interface BetterAuthModuleOptions {
53
105
  *
54
106
  * This module:
55
107
  * - Creates and configures a better-auth instance based on server configuration
56
- * - Integrates with @thallesp/nestjs-better-auth for NestJS support
108
+ * - Provides REST controller (CoreBetterAuthController) and GraphQL resolver (CoreBetterAuthResolver)
57
109
  * - Supports JWT, 2FA, Passkey, and Social Login based on configuration
58
110
  * - Enabled by default (zero-config) - set `enabled: false` to disable explicitly
59
111
  * - Uses the global mongoose connection for MongoDB access
@@ -76,8 +128,25 @@ export class BetterAuthModule implements NestModule, OnModuleInit {
76
128
  private static logger = new Logger(BetterAuthModule.name);
77
129
  private static authInstance: BetterAuthInstance | null = null;
78
130
  private static initialized = false;
131
+ private static initLogged = false;
79
132
  private static betterAuthEnabled = false;
80
133
  private static currentConfig: IBetterAuth | null = null;
134
+ private static customController: null | Type<CoreBetterAuthController> = null;
135
+ private static customResolver: null | Type<CoreBetterAuthResolver> = null;
136
+
137
+ /**
138
+ * Gets the controller class to use (custom or default)
139
+ */
140
+ private static getControllerClass(): Type<CoreBetterAuthController> {
141
+ return this.customController || CoreBetterAuthController;
142
+ }
143
+
144
+ /**
145
+ * Gets the resolver class to use (custom or default)
146
+ */
147
+ private static getResolverClass(): Type<CoreBetterAuthResolver> {
148
+ return this.customResolver || BetterAuthResolver;
149
+ }
81
150
 
82
151
  constructor(
83
152
  @Optional() private readonly betterAuthService?: BetterAuthService,
@@ -108,13 +177,13 @@ export class BetterAuthModule implements NestModule, OnModuleInit {
108
177
 
109
178
  // Apply rate limiting to Better-Auth endpoints only
110
179
  if (BetterAuthModule.currentConfig?.rateLimit?.enabled) {
111
- consumer.apply(BetterAuthRateLimitMiddleware).forRoutes(`${basePath}/*`);
112
- BetterAuthModule.logger.debug(`Rate limiting enabled for ${basePath}/* endpoints`);
180
+ consumer.apply(BetterAuthRateLimitMiddleware).forRoutes(`${basePath}/*path`);
181
+ BetterAuthModule.logger.log(`Rate limiting enabled for ${basePath}/*path endpoints`);
113
182
  }
114
183
 
115
184
  // Apply session middleware to all routes
116
- consumer.apply(BetterAuthMiddleware).forRoutes('*');
117
- BetterAuthModule.logger.debug('BetterAuthMiddleware registered for all routes');
185
+ consumer.apply(BetterAuthMiddleware).forRoutes('(.*)'); // New path-to-regexp syntax for wildcard
186
+ BetterAuthModule.logger.log('BetterAuthMiddleware registered for all routes');
118
187
  }
119
188
  }
120
189
 
@@ -155,10 +224,14 @@ export class BetterAuthModule implements NestModule, OnModuleInit {
155
224
  * @returns Dynamic module configuration
156
225
  */
157
226
  static forRoot(options: BetterAuthModuleOptions): DynamicModule {
158
- const { config, fallbackSecrets } = options;
227
+ const { config, controller, fallbackSecrets, resolver } = options;
159
228
 
160
229
  // Store config for middleware configuration
161
230
  this.currentConfig = config;
231
+ // Store custom controller if provided
232
+ this.customController = controller || null;
233
+ // Store custom resolver if provided
234
+ this.customResolver = resolver || null;
162
235
 
163
236
  // If better-auth is explicitly disabled, return minimal module
164
237
  // Note: We don't provide middleware classes when disabled because they depend on BetterAuthService
@@ -203,6 +276,7 @@ export class BetterAuthModule implements NestModule, OnModuleInit {
203
276
  */
204
277
  static forRootAsync(): DynamicModule {
205
278
  return {
279
+ controllers: [this.getControllerClass()],
206
280
  exports: [BETTER_AUTH_INSTANCE, BetterAuthService, BetterAuthUserMapper, BetterAuthRateLimiter],
207
281
  imports: [],
208
282
  module: BetterAuthModule,
@@ -249,13 +323,20 @@ export class BetterAuthModule implements NestModule, OnModuleInit {
249
323
  return this.authInstance;
250
324
  },
251
325
  },
252
- // Note: ConfigService is provided globally by CoreModule
253
- BetterAuthService,
326
+ // BetterAuthService needs to be a factory that explicitly depends on BETTER_AUTH_INSTANCE
327
+ // to ensure proper initialization order
328
+ {
329
+ inject: [BETTER_AUTH_INSTANCE, ConfigService],
330
+ provide: BetterAuthService,
331
+ useFactory: (authInstance: BetterAuthInstance | null, configService: ConfigService) => {
332
+ return new BetterAuthService(authInstance, configService);
333
+ },
334
+ },
254
335
  BetterAuthUserMapper,
255
336
  BetterAuthMiddleware,
256
337
  BetterAuthRateLimiter,
257
338
  BetterAuthRateLimitMiddleware,
258
- BetterAuthResolver,
339
+ this.getResolverClass(),
259
340
  ],
260
341
  };
261
342
  }
@@ -282,57 +363,11 @@ export class BetterAuthModule implements NestModule, OnModuleInit {
282
363
  static reset(): void {
283
364
  this.authInstance = null;
284
365
  this.initialized = false;
366
+ this.initLogged = false;
285
367
  this.betterAuthEnabled = false;
286
368
  this.currentConfig = null;
287
- this.logger.debug('BetterAuthModule state reset');
288
- }
289
-
290
- /**
291
- * Creates the actual module with better-auth
292
- */
293
- private static createModule(config: IBetterAuth, db: any, fallbackSecrets?: (string | undefined)[]): DynamicModule {
294
- // Create the better-auth instance
295
- this.authInstance = createBetterAuthInstance({ config, db, fallbackSecrets });
296
-
297
- if (!this.authInstance) {
298
- throw new Error('Failed to create better-auth instance');
299
- }
300
-
301
- this.logger.log('BetterAuth initialized successfully');
302
- this.logEnabledFeatures(config);
303
-
304
- // Use @thallesp/nestjs-better-auth's AuthModule
305
- const authModule = AuthModule.forRoot({
306
- auth: this.authInstance,
307
- disableControllers: false, // Enable REST endpoints
308
- disableGlobalAuthGuard: true, // We use our own RolesGuard
309
- });
310
-
311
- return {
312
- exports: [
313
- BETTER_AUTH_INSTANCE,
314
- AuthModule,
315
- AuthService,
316
- BetterAuthService,
317
- BetterAuthUserMapper,
318
- BetterAuthRateLimiter,
319
- ],
320
- imports: [authModule],
321
- module: BetterAuthModule,
322
- providers: [
323
- {
324
- provide: BETTER_AUTH_INSTANCE,
325
- useValue: this.authInstance,
326
- },
327
- // Note: ConfigService is provided globally by CoreModule
328
- BetterAuthService,
329
- BetterAuthUserMapper,
330
- BetterAuthMiddleware,
331
- BetterAuthRateLimiter,
332
- BetterAuthRateLimitMiddleware,
333
- BetterAuthResolver,
334
- ],
335
- };
369
+ this.customController = null;
370
+ this.customResolver = null;
336
371
  }
337
372
 
338
373
  /**
@@ -341,6 +376,7 @@ export class BetterAuthModule implements NestModule, OnModuleInit {
341
376
  */
342
377
  private static createDeferredModule(config: IBetterAuth, fallbackSecrets?: (string | undefined)[]): DynamicModule {
343
378
  return {
379
+ controllers: [this.getControllerClass()],
344
380
  exports: [BETTER_AUTH_INSTANCE, BetterAuthService, BetterAuthUserMapper, BetterAuthRateLimiter],
345
381
  module: BetterAuthModule,
346
382
  providers: [
@@ -363,7 +399,8 @@ export class BetterAuthModule implements NestModule, OnModuleInit {
363
399
  this.authInstance = createBetterAuthInstance({ config, db, fallbackSecrets });
364
400
  }
365
401
 
366
- if (this.authInstance) {
402
+ if (this.authInstance && !this.initLogged) {
403
+ this.initLogged = true;
367
404
  this.logger.log('BetterAuth initialized');
368
405
  this.logEnabledFeatures(config);
369
406
  }
@@ -371,13 +408,20 @@ export class BetterAuthModule implements NestModule, OnModuleInit {
371
408
  return this.authInstance;
372
409
  },
373
410
  },
374
- // Note: ConfigService is provided globally by CoreModule
375
- BetterAuthService,
411
+ // BetterAuthService needs to be a factory that explicitly depends on BETTER_AUTH_INSTANCE
412
+ // to ensure proper initialization order
413
+ {
414
+ inject: [BETTER_AUTH_INSTANCE, ConfigService],
415
+ provide: BetterAuthService,
416
+ useFactory: (authInstance: BetterAuthInstance | null, configService: ConfigService) => {
417
+ return new BetterAuthService(authInstance, configService);
418
+ },
419
+ },
376
420
  BetterAuthUserMapper,
377
421
  BetterAuthMiddleware,
378
422
  BetterAuthRateLimiter,
379
423
  BetterAuthRateLimitMiddleware,
380
- BetterAuthResolver,
424
+ this.getResolverClass(),
381
425
  ],
382
426
  };
383
427
  }
@@ -400,9 +444,6 @@ export class BetterAuthModule implements NestModule, OnModuleInit {
400
444
  if (config.passkey && config.passkey.enabled !== false) {
401
445
  features.push('Passkey/WebAuthn');
402
446
  }
403
- if (config.legacyPassword && config.legacyPassword.enabled !== false) {
404
- features.push('Legacy Password Handling');
405
- }
406
447
 
407
448
  // Dynamically collect enabled social providers
408
449
  // Providers are enabled by default if they have credentials configured