@lenne.tech/nest-server 11.6.0 → 11.6.2

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 (87) hide show
  1. package/dist/config.env.js +141 -0
  2. package/dist/config.env.js.map +1 -1
  3. package/dist/core/common/decorators/graphql-populate.decorator.d.ts +2 -2
  4. package/dist/core/common/decorators/restricted.decorator.d.ts +1 -0
  5. package/dist/core/common/decorators/restricted.decorator.js +1 -1
  6. package/dist/core/common/decorators/restricted.decorator.js.map +1 -1
  7. package/dist/core/common/helpers/input.helper.d.ts +1 -0
  8. package/dist/core/common/helpers/input.helper.js +1 -1
  9. package/dist/core/common/helpers/input.helper.js.map +1 -1
  10. package/dist/core/common/interceptors/check-security.interceptor.js +4 -3
  11. package/dist/core/common/interceptors/check-security.interceptor.js.map +1 -1
  12. package/dist/core/common/interfaces/server-options.interface.d.ts +50 -0
  13. package/dist/core/modules/auth/auth-guard-strategy.enum.d.ts +1 -0
  14. package/dist/core/modules/auth/auth-guard-strategy.enum.js +1 -0
  15. package/dist/core/modules/auth/auth-guard-strategy.enum.js.map +1 -1
  16. package/dist/core/modules/auth/guards/auth.guard.js +11 -5
  17. package/dist/core/modules/auth/guards/auth.guard.js.map +1 -1
  18. package/dist/core/modules/auth/tokens.decorator.d.ts +1 -1
  19. package/dist/core/modules/better-auth/better-auth-auth.model.d.ts +9 -0
  20. package/dist/core/modules/better-auth/better-auth-auth.model.js +63 -0
  21. package/dist/core/modules/better-auth/better-auth-auth.model.js.map +1 -0
  22. package/dist/core/modules/better-auth/better-auth-models.d.ts +44 -0
  23. package/dist/core/modules/better-auth/better-auth-models.js +185 -0
  24. package/dist/core/modules/better-auth/better-auth-models.js.map +1 -0
  25. package/dist/core/modules/better-auth/better-auth-rate-limit.middleware.d.ts +12 -0
  26. package/dist/core/modules/better-auth/better-auth-rate-limit.middleware.js +70 -0
  27. package/dist/core/modules/better-auth/better-auth-rate-limit.middleware.js.map +1 -0
  28. package/dist/core/modules/better-auth/better-auth-rate-limiter.service.d.ts +32 -0
  29. package/dist/core/modules/better-auth/better-auth-rate-limiter.service.js +173 -0
  30. package/dist/core/modules/better-auth/better-auth-rate-limiter.service.js.map +1 -0
  31. package/dist/core/modules/better-auth/better-auth-user.mapper.d.ts +43 -0
  32. package/dist/core/modules/better-auth/better-auth-user.mapper.js +159 -0
  33. package/dist/core/modules/better-auth/better-auth-user.mapper.js.map +1 -0
  34. package/dist/core/modules/better-auth/better-auth.config.d.ts +9 -0
  35. package/dist/core/modules/better-auth/better-auth.config.js +251 -0
  36. package/dist/core/modules/better-auth/better-auth.config.js.map +1 -0
  37. package/dist/core/modules/better-auth/better-auth.middleware.d.ts +20 -0
  38. package/dist/core/modules/better-auth/better-auth.middleware.js +79 -0
  39. package/dist/core/modules/better-auth/better-auth.middleware.js.map +1 -0
  40. package/dist/core/modules/better-auth/better-auth.module.d.ts +30 -0
  41. package/dist/core/modules/better-auth/better-auth.module.js +265 -0
  42. package/dist/core/modules/better-auth/better-auth.module.js.map +1 -0
  43. package/dist/core/modules/better-auth/better-auth.resolver.d.ts +49 -0
  44. package/dist/core/modules/better-auth/better-auth.resolver.js +539 -0
  45. package/dist/core/modules/better-auth/better-auth.resolver.js.map +1 -0
  46. package/dist/core/modules/better-auth/better-auth.service.d.ts +38 -0
  47. package/dist/core/modules/better-auth/better-auth.service.js +151 -0
  48. package/dist/core/modules/better-auth/better-auth.service.js.map +1 -0
  49. package/dist/core/modules/better-auth/better-auth.types.d.ts +38 -0
  50. package/dist/core/modules/better-auth/better-auth.types.js +15 -0
  51. package/dist/core/modules/better-auth/better-auth.types.js.map +1 -0
  52. package/dist/core/modules/better-auth/index.d.ts +11 -0
  53. package/dist/core/modules/better-auth/index.js +28 -0
  54. package/dist/core/modules/better-auth/index.js.map +1 -0
  55. package/dist/core/modules/user/core-user.model.d.ts +2 -0
  56. package/dist/core/modules/user/core-user.model.js +21 -0
  57. package/dist/core/modules/user/core-user.model.js.map +1 -1
  58. package/dist/core.module.js +7 -0
  59. package/dist/core.module.js.map +1 -1
  60. package/dist/index.d.ts +1 -0
  61. package/dist/index.js +1 -0
  62. package/dist/index.js.map +1 -1
  63. package/dist/tsconfig.build.tsbuildinfo +1 -1
  64. package/package.json +9 -1
  65. package/src/config.env.ts +148 -1
  66. package/src/core/common/decorators/restricted.decorator.ts +2 -2
  67. package/src/core/common/helpers/input.helper.ts +2 -2
  68. package/src/core/common/interceptors/check-security.interceptor.ts +6 -5
  69. package/src/core/common/interfaces/server-options.interface.ts +344 -20
  70. package/src/core/modules/auth/auth-guard-strategy.enum.ts +1 -0
  71. package/src/core/modules/auth/guards/auth.guard.ts +20 -6
  72. package/src/core/modules/better-auth/README.md +1096 -0
  73. package/src/core/modules/better-auth/better-auth-auth.model.ts +69 -0
  74. package/src/core/modules/better-auth/better-auth-models.ts +143 -0
  75. package/src/core/modules/better-auth/better-auth-rate-limit.middleware.ts +113 -0
  76. package/src/core/modules/better-auth/better-auth-rate-limiter.service.ts +326 -0
  77. package/src/core/modules/better-auth/better-auth-user.mapper.ts +269 -0
  78. package/src/core/modules/better-auth/better-auth.config.ts +483 -0
  79. package/src/core/modules/better-auth/better-auth.middleware.ts +111 -0
  80. package/src/core/modules/better-auth/better-auth.module.ts +433 -0
  81. package/src/core/modules/better-auth/better-auth.resolver.ts +678 -0
  82. package/src/core/modules/better-auth/better-auth.service.ts +323 -0
  83. package/src/core/modules/better-auth/better-auth.types.ts +75 -0
  84. package/src/core/modules/better-auth/index.ts +25 -0
  85. package/src/core/modules/user/core-user.model.ts +29 -0
  86. package/src/core.module.ts +12 -0
  87. package/src/index.ts +6 -0
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var BetterAuthUserMapper_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.BetterAuthUserMapper = void 0;
17
+ const common_1 = require("@nestjs/common");
18
+ const mongoose_1 = require("@nestjs/mongoose");
19
+ const mongoose_2 = require("mongoose");
20
+ const role_enum_1 = require("../../common/enums/role.enum");
21
+ let BetterAuthUserMapper = BetterAuthUserMapper_1 = class BetterAuthUserMapper {
22
+ constructor(connection) {
23
+ this.connection = connection;
24
+ this.logger = new common_1.Logger(BetterAuthUserMapper_1.name);
25
+ }
26
+ async mapSessionUser(sessionUser) {
27
+ if (!sessionUser?.id || !sessionUser?.email) {
28
+ return null;
29
+ }
30
+ if (!this.connection) {
31
+ this.logger.warn('No database connection available - using default role mapping');
32
+ return this.createMappedUser({
33
+ email: sessionUser.email,
34
+ emailVerified: sessionUser.emailVerified,
35
+ iamId: sessionUser.id,
36
+ id: sessionUser.id,
37
+ image: sessionUser.image,
38
+ name: sessionUser.name,
39
+ roles: [],
40
+ verified: sessionUser.emailVerified,
41
+ });
42
+ }
43
+ try {
44
+ const userCollection = this.connection.collection('users');
45
+ const dbUser = await userCollection.findOne({
46
+ $or: [{ email: sessionUser.email }, { iamId: sessionUser.id }],
47
+ });
48
+ if (dbUser) {
49
+ const roles = Array.isArray(dbUser.roles) ? dbUser.roles : [];
50
+ const verified = dbUser.verified === true || sessionUser.emailVerified === true;
51
+ return this.createMappedUser({
52
+ email: sessionUser.email,
53
+ emailVerified: sessionUser.emailVerified,
54
+ iamId: sessionUser.id,
55
+ id: dbUser._id.toString(),
56
+ image: sessionUser.image,
57
+ name: sessionUser.name,
58
+ roles,
59
+ verified,
60
+ });
61
+ }
62
+ this.logger.debug(`Better-Auth user ${sessionUser.email} not found in users collection`);
63
+ return this.createMappedUser({
64
+ email: sessionUser.email,
65
+ emailVerified: sessionUser.emailVerified,
66
+ iamId: sessionUser.id,
67
+ id: sessionUser.id,
68
+ image: sessionUser.image,
69
+ name: sessionUser.name,
70
+ roles: [],
71
+ verified: sessionUser.emailVerified,
72
+ });
73
+ }
74
+ catch (error) {
75
+ this.logger.error(`Error mapping Better-Auth user: ${error instanceof Error ? error.message : 'Unknown error'}`);
76
+ return null;
77
+ }
78
+ }
79
+ createMappedUser(userData) {
80
+ const roles = userData.roles || [];
81
+ return {
82
+ ...userData,
83
+ _authenticatedViaBetterAuth: true,
84
+ hasRole: (checkRoles) => {
85
+ const rolesToCheck = Array.isArray(checkRoles) ? checkRoles : [checkRoles];
86
+ if (rolesToCheck.includes(role_enum_1.RoleEnum.S_EVERYONE)) {
87
+ return true;
88
+ }
89
+ if (rolesToCheck.includes(role_enum_1.RoleEnum.S_USER)) {
90
+ return true;
91
+ }
92
+ if (rolesToCheck.includes(role_enum_1.RoleEnum.S_NO_ONE)) {
93
+ return false;
94
+ }
95
+ if (rolesToCheck.includes(role_enum_1.RoleEnum.S_VERIFIED)) {
96
+ return userData.verified === true;
97
+ }
98
+ return rolesToCheck.some((role) => roles.includes(role));
99
+ },
100
+ roles,
101
+ };
102
+ }
103
+ async linkOrCreateUser(sessionUser, additionalData) {
104
+ if (!sessionUser?.email) {
105
+ return null;
106
+ }
107
+ if (!this.connection) {
108
+ this.logger.warn('No database connection available - cannot sync user');
109
+ return null;
110
+ }
111
+ try {
112
+ const userCollection = this.connection.collection('users');
113
+ const existingUser = await userCollection.findOne({
114
+ $or: [{ email: sessionUser.email }, { iamId: sessionUser.id }],
115
+ });
116
+ const updateData = {
117
+ email: sessionUser.email,
118
+ ...(sessionUser.name && { firstName: sessionUser.name.split(' ')[0] }),
119
+ ...(sessionUser.name &&
120
+ sessionUser.name.includes(' ') && {
121
+ lastName: sessionUser.name.split(' ').slice(1).join(' '),
122
+ }),
123
+ ...(sessionUser.emailVerified !== undefined && { verified: sessionUser.emailVerified }),
124
+ ...(sessionUser.image && { avatar: sessionUser.image }),
125
+ iamId: sessionUser.id,
126
+ updatedAt: new Date(),
127
+ ...additionalData,
128
+ };
129
+ const updateQuery = {
130
+ $set: updateData,
131
+ };
132
+ if (!existingUser) {
133
+ updateQuery.$setOnInsert = {
134
+ createdAt: new Date(),
135
+ roles: [],
136
+ };
137
+ }
138
+ const result = await userCollection.findOneAndUpdate({
139
+ $or: [{ email: sessionUser.email }, { iamId: sessionUser.id }],
140
+ }, updateQuery, {
141
+ returnDocument: 'after',
142
+ upsert: true,
143
+ });
144
+ return result;
145
+ }
146
+ catch (error) {
147
+ this.logger.error(`Error syncing Better-Auth user: ${error instanceof Error ? error.message : 'Unknown error'}`);
148
+ return null;
149
+ }
150
+ }
151
+ };
152
+ exports.BetterAuthUserMapper = BetterAuthUserMapper;
153
+ exports.BetterAuthUserMapper = BetterAuthUserMapper = BetterAuthUserMapper_1 = __decorate([
154
+ (0, common_1.Injectable)(),
155
+ __param(0, (0, common_1.Optional)()),
156
+ __param(0, (0, mongoose_1.InjectConnection)()),
157
+ __metadata("design:paramtypes", [mongoose_2.Connection])
158
+ ], BetterAuthUserMapper);
159
+ //# sourceMappingURL=better-auth-user.mapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"better-auth-user.mapper.js","sourceRoot":"","sources":["../../../../src/core/modules/better-auth/better-auth-user.mapper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { betterAuth } from 'better-auth';
2
+ import { IBetterAuth } from '../../common/interfaces/server-options.interface';
3
+ export type BetterAuthInstance = ReturnType<typeof betterAuth>;
4
+ export interface CreateBetterAuthOptions {
5
+ config: IBetterAuth;
6
+ db: any;
7
+ fallbackSecrets?: (string | undefined)[];
8
+ }
9
+ export declare function createBetterAuthInstance(options: CreateBetterAuthOptions): BetterAuthInstance | null;
@@ -0,0 +1,251 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createBetterAuthInstance = createBetterAuthInstance;
4
+ const passkey_1 = require("@better-auth/passkey");
5
+ const common_1 = require("@nestjs/common");
6
+ const better_auth_1 = require("better-auth");
7
+ const mongodb_1 = require("better-auth/adapters/mongodb");
8
+ const plugins_1 = require("better-auth/plugins");
9
+ const crypto = require("crypto");
10
+ function generateSecureSecret() {
11
+ return crypto.randomBytes(32).toString('base64');
12
+ }
13
+ let cachedAutoGeneratedSecret = null;
14
+ function createBetterAuthInstance(options) {
15
+ const logger = new common_1.Logger('BetterAuthConfig');
16
+ const { config, db, fallbackSecrets } = options;
17
+ if (config?.enabled === false) {
18
+ return null;
19
+ }
20
+ const validation = validateConfig(config, fallbackSecrets);
21
+ for (const warning of validation.warnings) {
22
+ logger.warn(warning);
23
+ }
24
+ if (!validation.valid) {
25
+ throw new Error(`BetterAuth configuration invalid: ${validation.errors.join('; ')}`);
26
+ }
27
+ const plugins = buildPlugins(config);
28
+ const socialProviders = buildSocialProviders(config);
29
+ const trustedOrigins = buildTrustedOrigins(config);
30
+ const additionalFields = buildUserFields(config);
31
+ const betterAuthConfig = {
32
+ basePath: config.basePath || '/iam',
33
+ baseURL: config.baseUrl || 'http://localhost:3000',
34
+ database: (0, mongodb_1.mongodbAdapter)(db),
35
+ plugins,
36
+ secret: config.secret,
37
+ socialProviders,
38
+ trustedOrigins,
39
+ user: {
40
+ additionalFields,
41
+ modelName: 'users',
42
+ },
43
+ };
44
+ const finalConfig = config.options ? { ...betterAuthConfig, ...config.options } : betterAuthConfig;
45
+ return (0, better_auth_1.betterAuth)(finalConfig);
46
+ }
47
+ function buildPlugins(config) {
48
+ const plugins = [];
49
+ if (config.jwt && config.jwt.enabled !== false) {
50
+ plugins.push((0, plugins_1.jwt)({
51
+ jwt: {
52
+ expirationTime: config.jwt.expiresIn || '15m',
53
+ },
54
+ }));
55
+ }
56
+ if (config.twoFactor && config.twoFactor.enabled !== false) {
57
+ plugins.push((0, plugins_1.twoFactor)({
58
+ issuer: config.twoFactor.appName || 'Nest Server',
59
+ }));
60
+ }
61
+ if (config.passkey && config.passkey.enabled !== false) {
62
+ plugins.push((0, passkey_1.passkey)({
63
+ origin: config.passkey.origin || 'http://localhost:3000',
64
+ rpID: config.passkey.rpId || 'localhost',
65
+ rpName: config.passkey.rpName || 'Nest Server',
66
+ }));
67
+ }
68
+ if (config.plugins?.length) {
69
+ plugins.push(...config.plugins);
70
+ }
71
+ return plugins;
72
+ }
73
+ function buildSocialProviders(config) {
74
+ const socialProvidersConfig = {};
75
+ if (config.socialProviders) {
76
+ for (const [name, provider] of Object.entries(config.socialProviders)) {
77
+ if (provider?.clientId && provider?.clientSecret && provider?.enabled !== false) {
78
+ socialProvidersConfig[name] = {
79
+ clientId: provider.clientId,
80
+ clientSecret: provider.clientSecret,
81
+ };
82
+ }
83
+ }
84
+ }
85
+ return socialProvidersConfig;
86
+ }
87
+ function buildTrustedOrigins(config) {
88
+ if (config.trustedOrigins?.length) {
89
+ return config.trustedOrigins;
90
+ }
91
+ if (config.baseUrl) {
92
+ return [config.baseUrl];
93
+ }
94
+ return ['http://localhost:3000'];
95
+ }
96
+ function buildUserFields(config) {
97
+ const coreFields = {
98
+ firstName: {
99
+ defaultValue: null,
100
+ fieldName: 'firstName',
101
+ type: 'string',
102
+ },
103
+ iamId: {
104
+ defaultValue: null,
105
+ fieldName: 'iamId',
106
+ type: 'string',
107
+ },
108
+ lastName: {
109
+ defaultValue: null,
110
+ fieldName: 'lastName',
111
+ type: 'string',
112
+ },
113
+ roles: {
114
+ defaultValue: [],
115
+ fieldName: 'roles',
116
+ type: 'string[]',
117
+ },
118
+ twoFactorEnabled: {
119
+ defaultValue: false,
120
+ fieldName: 'twoFactorEnabled',
121
+ type: 'boolean',
122
+ },
123
+ verified: {
124
+ defaultValue: false,
125
+ fieldName: 'verified',
126
+ type: 'boolean',
127
+ },
128
+ };
129
+ if (config.additionalUserFields) {
130
+ for (const [key, field] of Object.entries(config.additionalUserFields)) {
131
+ coreFields[key] = {
132
+ defaultValue: field.defaultValue,
133
+ fieldName: field.fieldName || key,
134
+ required: field.required,
135
+ type: field.type,
136
+ };
137
+ }
138
+ }
139
+ return coreFields;
140
+ }
141
+ function getAutoGeneratedSecret() {
142
+ if (!cachedAutoGeneratedSecret) {
143
+ cachedAutoGeneratedSecret = generateSecureSecret();
144
+ }
145
+ return cachedAutoGeneratedSecret;
146
+ }
147
+ function isValidSecretLength(secret) {
148
+ return secret && secret.length >= 32;
149
+ }
150
+ function isValidUrl(url) {
151
+ try {
152
+ new URL(url);
153
+ return true;
154
+ }
155
+ catch {
156
+ return false;
157
+ }
158
+ }
159
+ function validateConfig(config, fallbackSecrets) {
160
+ const errors = [];
161
+ const warnings = [];
162
+ let secretSource = 'explicit';
163
+ if (!config.secret || config.secret.trim() === '') {
164
+ const validFallback = fallbackSecrets?.find((secret) => secret && isValidSecretLength(secret));
165
+ if (validFallback) {
166
+ config.secret = validFallback;
167
+ secretSource = 'fallback';
168
+ }
169
+ else {
170
+ config.secret = getAutoGeneratedSecret();
171
+ secretSource = 'auto-generated';
172
+ }
173
+ }
174
+ const secretValidation = validateSecret(config.secret);
175
+ if (!secretValidation.valid) {
176
+ errors.push(secretValidation.message);
177
+ }
178
+ else if (secretValidation.message) {
179
+ warnings.push(secretValidation.message);
180
+ }
181
+ switch (secretSource) {
182
+ case 'auto-generated':
183
+ warnings.push('⚠️ BETTER_AUTH: No secret configured - using auto-generated secret.');
184
+ warnings.push('⚠️ CONSEQUENCE: All user sessions will be invalidated on server restart!');
185
+ warnings.push('💡 FOR PRODUCTION: Set betterAuth.secret in config or provide a valid fallback secret (min 32 chars).');
186
+ warnings.push("💡 Generate with: node -e \"console.log(require('crypto').randomBytes(32).toString('base64'))\"");
187
+ break;
188
+ case 'fallback':
189
+ warnings.push('💡 BETTER_AUTH: Using fallback secret (backwards compatible). Consider setting betterAuth.secret explicitly.');
190
+ break;
191
+ }
192
+ if (config.baseUrl && !isValidUrl(config.baseUrl)) {
193
+ errors.push(`Invalid baseUrl format: ${config.baseUrl}`);
194
+ }
195
+ if (config.trustedOrigins) {
196
+ for (const origin of config.trustedOrigins) {
197
+ if (!isValidUrl(origin)) {
198
+ errors.push(`Invalid trustedOrigin format: ${origin}`);
199
+ }
200
+ }
201
+ }
202
+ if (config.passkey?.enabled && config.passkey.origin && !isValidUrl(config.passkey.origin)) {
203
+ errors.push(`Invalid passkey origin format: ${config.passkey.origin}`);
204
+ }
205
+ if (config.socialProviders) {
206
+ for (const [name, provider] of Object.entries(config.socialProviders)) {
207
+ if (provider && provider.enabled !== false) {
208
+ const hasClientId = !!provider.clientId;
209
+ const hasClientSecret = !!provider.clientSecret;
210
+ if (hasClientId && hasClientSecret) {
211
+ continue;
212
+ }
213
+ else if (hasClientId || hasClientSecret) {
214
+ if (!hasClientId) {
215
+ errors.push(`Social provider '${name}' is missing clientId`);
216
+ }
217
+ if (!hasClientSecret) {
218
+ errors.push(`Social provider '${name}' is missing clientSecret`);
219
+ }
220
+ }
221
+ else {
222
+ warnings.push(`Social provider '${name}' is configured but missing both clientId and clientSecret. ` +
223
+ `Set 'enabled: false' to disable it explicitly, or provide credentials to enable it.`);
224
+ }
225
+ }
226
+ }
227
+ }
228
+ return {
229
+ errors,
230
+ valid: errors.length === 0,
231
+ warnings,
232
+ };
233
+ }
234
+ function validateSecret(secret) {
235
+ if (!secret || secret.length < 32) {
236
+ return { message: 'Secret must be at least 32 characters long', valid: false };
237
+ }
238
+ const hasLowercase = /[a-z]/.test(secret);
239
+ const hasUppercase = /[A-Z]/.test(secret);
240
+ const hasNumbers = /[0-9]/.test(secret);
241
+ const hasSpecial = /[^a-zA-Z0-9]/.test(secret);
242
+ const diversityCount = [hasLowercase, hasUppercase, hasNumbers, hasSpecial].filter(Boolean).length;
243
+ if (diversityCount < 2) {
244
+ return {
245
+ message: 'Secret should contain at least 2 different character types (lowercase, uppercase, numbers, special)',
246
+ valid: true,
247
+ };
248
+ }
249
+ return { valid: true };
250
+ }
251
+ //# sourceMappingURL=better-auth.config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"better-auth.config.js","sourceRoot":"","sources":["../../../../src/core/modules/better-auth/better-auth.config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ import { NestMiddleware } from '@nestjs/common';
2
+ import { NextFunction, Request, Response } from 'express';
3
+ import { BetterAuthSessionUser, BetterAuthUserMapper, MappedUser } from './better-auth-user.mapper';
4
+ import { BetterAuthService } from './better-auth.service';
5
+ export interface BetterAuthRequest extends Request {
6
+ betterAuthSession?: {
7
+ session: any;
8
+ user: BetterAuthSessionUser;
9
+ };
10
+ betterAuthUser?: BetterAuthSessionUser;
11
+ user?: MappedUser | Request['user'];
12
+ }
13
+ export declare class BetterAuthMiddleware implements NestMiddleware {
14
+ private readonly betterAuthService;
15
+ private readonly userMapper;
16
+ private readonly logger;
17
+ constructor(betterAuthService: BetterAuthService, userMapper: BetterAuthUserMapper);
18
+ use(req: BetterAuthRequest, _res: Response, next: NextFunction): Promise<void>;
19
+ private getSession;
20
+ }
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var BetterAuthMiddleware_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.BetterAuthMiddleware = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const better_auth_user_mapper_1 = require("./better-auth-user.mapper");
16
+ const better_auth_service_1 = require("./better-auth.service");
17
+ let BetterAuthMiddleware = BetterAuthMiddleware_1 = class BetterAuthMiddleware {
18
+ constructor(betterAuthService, userMapper) {
19
+ this.betterAuthService = betterAuthService;
20
+ this.userMapper = userMapper;
21
+ this.logger = new common_1.Logger(BetterAuthMiddleware_1.name);
22
+ }
23
+ async use(req, _res, next) {
24
+ if (!this.betterAuthService.isEnabled()) {
25
+ return next();
26
+ }
27
+ if (req.user) {
28
+ return next();
29
+ }
30
+ try {
31
+ const session = await this.getSession(req);
32
+ if (session?.user) {
33
+ req.betterAuthSession = session;
34
+ req.betterAuthUser = session.user;
35
+ const mappedUser = await this.userMapper.mapSessionUser(session.user);
36
+ if (mappedUser) {
37
+ req.user = mappedUser;
38
+ }
39
+ }
40
+ }
41
+ catch (error) {
42
+ this.logger.debug(`Session validation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
43
+ }
44
+ next();
45
+ }
46
+ async getSession(req) {
47
+ const api = this.betterAuthService.getApi();
48
+ if (!api) {
49
+ return null;
50
+ }
51
+ try {
52
+ const headers = new Headers();
53
+ for (const [key, value] of Object.entries(req.headers)) {
54
+ if (typeof value === 'string') {
55
+ headers.set(key, value);
56
+ }
57
+ else if (Array.isArray(value)) {
58
+ headers.set(key, value.join(', '));
59
+ }
60
+ }
61
+ const response = await api.getSession({ headers });
62
+ if (response && typeof response === 'object' && 'user' in response) {
63
+ return response;
64
+ }
65
+ return null;
66
+ }
67
+ catch (error) {
68
+ this.logger.debug(`getSession error: ${error instanceof Error ? error.message : 'Unknown error'}`);
69
+ return null;
70
+ }
71
+ }
72
+ };
73
+ exports.BetterAuthMiddleware = BetterAuthMiddleware;
74
+ exports.BetterAuthMiddleware = BetterAuthMiddleware = BetterAuthMiddleware_1 = __decorate([
75
+ (0, common_1.Injectable)(),
76
+ __metadata("design:paramtypes", [better_auth_service_1.BetterAuthService,
77
+ better_auth_user_mapper_1.BetterAuthUserMapper])
78
+ ], BetterAuthMiddleware);
79
+ //# sourceMappingURL=better-auth.middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"better-auth.middleware.js","sourceRoot":"","sources":["../../../../src/core/modules/better-auth/better-auth.middleware.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import { DynamicModule, MiddlewareConsumer, NestModule, OnModuleInit } from '@nestjs/common';
2
+ import { IBetterAuth } from '../../common/interfaces/server-options.interface';
3
+ import { BetterAuthRateLimiter } from './better-auth-rate-limiter.service';
4
+ import { BetterAuthInstance } from './better-auth.config';
5
+ import { BetterAuthService } from './better-auth.service';
6
+ export declare const BETTER_AUTH_INSTANCE = "BETTER_AUTH_INSTANCE";
7
+ export interface BetterAuthModuleOptions {
8
+ config: IBetterAuth;
9
+ fallbackSecrets?: (string | undefined)[];
10
+ }
11
+ export declare class BetterAuthModule implements NestModule, OnModuleInit {
12
+ private readonly betterAuthService?;
13
+ private readonly rateLimiter?;
14
+ private static logger;
15
+ private static authInstance;
16
+ private static initialized;
17
+ private static betterAuthEnabled;
18
+ private static currentConfig;
19
+ constructor(betterAuthService?: BetterAuthService, rateLimiter?: BetterAuthRateLimiter);
20
+ onModuleInit(): void;
21
+ configure(consumer: MiddlewareConsumer): void;
22
+ private static waitForMongoConnection;
23
+ static forRoot(options: BetterAuthModuleOptions): DynamicModule;
24
+ static forRootAsync(): DynamicModule;
25
+ static getInstance(): BetterAuthInstance | null;
26
+ static reset(): void;
27
+ private static createModule;
28
+ private static createDeferredModule;
29
+ private static logEnabledFeatures;
30
+ }