create-coreback 1.0.4 → 1.0.5

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 (181) hide show
  1. package/README.md +30 -1
  2. package/dist/generators/docker.d.ts.map +1 -1
  3. package/dist/generators/docker.js +61 -4
  4. package/dist/generators/docker.js.map +1 -1
  5. package/dist/generators/envExample.d.ts.map +1 -1
  6. package/dist/generators/envExample.js +26 -0
  7. package/dist/generators/envExample.js.map +1 -1
  8. package/dist/generators/index.js +1 -1
  9. package/dist/generators/index.js.map +1 -1
  10. package/dist/generators/packageJson.d.ts.map +1 -1
  11. package/dist/generators/packageJson.js +36 -0
  12. package/dist/generators/packageJson.js.map +1 -1
  13. package/dist/generators/sourceFiles/controllers/index.d.ts +3 -0
  14. package/dist/generators/sourceFiles/controllers/index.d.ts.map +1 -0
  15. package/dist/generators/sourceFiles/controllers/index.js +147 -0
  16. package/dist/generators/sourceFiles/controllers/index.js.map +1 -0
  17. package/dist/generators/sourceFiles/core/configFiles.d.ts +3 -0
  18. package/dist/generators/sourceFiles/core/configFiles.d.ts.map +1 -0
  19. package/dist/generators/sourceFiles/core/configFiles.js +148 -0
  20. package/dist/generators/sourceFiles/core/configFiles.js.map +1 -0
  21. package/dist/generators/sourceFiles/core/index.d.ts +3 -0
  22. package/dist/generators/sourceFiles/core/index.d.ts.map +1 -0
  23. package/dist/generators/sourceFiles/core/index.js +17 -0
  24. package/dist/generators/sourceFiles/core/index.js.map +1 -0
  25. package/dist/generators/sourceFiles/core/indexFile.d.ts +3 -0
  26. package/dist/generators/sourceFiles/core/indexFile.d.ts.map +1 -0
  27. package/dist/generators/sourceFiles/core/indexFile.js +47 -0
  28. package/dist/generators/sourceFiles/core/indexFile.js.map +1 -0
  29. package/dist/generators/sourceFiles/core/middlewares.d.ts +3 -0
  30. package/dist/generators/sourceFiles/core/middlewares.d.ts.map +1 -0
  31. package/dist/generators/sourceFiles/core/middlewares.js +123 -0
  32. package/dist/generators/sourceFiles/core/middlewares.js.map +1 -0
  33. package/dist/generators/sourceFiles/core/routes.d.ts +3 -0
  34. package/dist/generators/sourceFiles/core/routes.d.ts.map +1 -0
  35. package/dist/generators/sourceFiles/core/routes.js +281 -0
  36. package/dist/generators/sourceFiles/core/routes.js.map +1 -0
  37. package/dist/generators/sourceFiles/core/tests.d.ts +3 -0
  38. package/dist/generators/sourceFiles/core/tests.d.ts.map +1 -0
  39. package/dist/generators/sourceFiles/core/tests.js +48 -0
  40. package/dist/generators/sourceFiles/core/tests.js.map +1 -0
  41. package/dist/generators/sourceFiles/core/types.d.ts +2 -0
  42. package/dist/generators/sourceFiles/core/types.d.ts.map +1 -0
  43. package/dist/generators/sourceFiles/core/types.js +13 -0
  44. package/dist/generators/sourceFiles/core/types.js.map +1 -0
  45. package/dist/generators/sourceFiles/core/utils.d.ts +2 -0
  46. package/dist/generators/sourceFiles/core/utils.d.ts.map +1 -0
  47. package/dist/generators/sourceFiles/core/utils.js +173 -0
  48. package/dist/generators/sourceFiles/core/utils.js.map +1 -0
  49. package/dist/generators/sourceFiles/core/validators.d.ts +3 -0
  50. package/dist/generators/sourceFiles/core/validators.d.ts.map +1 -0
  51. package/dist/generators/sourceFiles/core/validators.js +37 -0
  52. package/dist/generators/sourceFiles/core/validators.js.map +1 -0
  53. package/dist/generators/sourceFiles/features/fileUpload.d.ts +3 -0
  54. package/dist/generators/sourceFiles/features/fileUpload.d.ts.map +1 -0
  55. package/dist/generators/sourceFiles/features/fileUpload.js +229 -0
  56. package/dist/generators/sourceFiles/features/fileUpload.js.map +1 -0
  57. package/dist/generators/sourceFiles/features/queue.d.ts +3 -0
  58. package/dist/generators/sourceFiles/features/queue.d.ts.map +1 -0
  59. package/dist/generators/sourceFiles/features/queue.js +211 -0
  60. package/dist/generators/sourceFiles/features/queue.js.map +1 -0
  61. package/dist/generators/sourceFiles/features/redis.d.ts +3 -0
  62. package/dist/generators/sourceFiles/features/redis.d.ts.map +1 -0
  63. package/dist/generators/sourceFiles/features/redis.js +68 -0
  64. package/dist/generators/sourceFiles/features/redis.js.map +1 -0
  65. package/dist/generators/sourceFiles/index.d.ts +3 -0
  66. package/dist/generators/sourceFiles/index.d.ts.map +1 -0
  67. package/dist/generators/sourceFiles/index.js +99 -0
  68. package/dist/generators/sourceFiles/index.js.map +1 -0
  69. package/dist/generators/sourceFiles/phase1/cliGenerators.d.ts +2 -0
  70. package/dist/generators/sourceFiles/phase1/cliGenerators.d.ts.map +1 -0
  71. package/dist/generators/sourceFiles/phase1/cliGenerators.js +336 -0
  72. package/dist/generators/sourceFiles/phase1/cliGenerators.js.map +1 -0
  73. package/dist/generators/sourceFiles/phase1/seedersFactories.d.ts +3 -0
  74. package/dist/generators/sourceFiles/phase1/seedersFactories.d.ts.map +1 -0
  75. package/dist/generators/sourceFiles/phase1/seedersFactories.js +89 -0
  76. package/dist/generators/sourceFiles/phase1/seedersFactories.js.map +1 -0
  77. package/dist/generators/sourceFiles/phase2/dtos.d.ts +2 -0
  78. package/dist/generators/sourceFiles/phase2/dtos.d.ts.map +1 -0
  79. package/dist/generators/sourceFiles/phase2/dtos.js +59 -0
  80. package/dist/generators/sourceFiles/phase2/dtos.js.map +1 -0
  81. package/dist/generators/sourceFiles/phase2/events.d.ts +2 -0
  82. package/dist/generators/sourceFiles/phase2/events.d.ts.map +1 -0
  83. package/dist/generators/sourceFiles/phase2/events.js +76 -0
  84. package/dist/generators/sourceFiles/phase2/events.js.map +1 -0
  85. package/dist/generators/sourceFiles/phase2/exceptionHandling.d.ts +2 -0
  86. package/dist/generators/sourceFiles/phase2/exceptionHandling.d.ts.map +1 -0
  87. package/dist/generators/sourceFiles/phase2/exceptionHandling.js +107 -0
  88. package/dist/generators/sourceFiles/phase2/exceptionHandling.js.map +1 -0
  89. package/dist/generators/sourceFiles/phase2/guards.d.ts +2 -0
  90. package/dist/generators/sourceFiles/phase2/guards.d.ts.map +1 -0
  91. package/dist/generators/sourceFiles/phase2/guards.js +98 -0
  92. package/dist/generators/sourceFiles/phase2/guards.js.map +1 -0
  93. package/dist/generators/sourceFiles/phase2/healthChecks.d.ts +3 -0
  94. package/dist/generators/sourceFiles/phase2/healthChecks.d.ts.map +1 -0
  95. package/dist/generators/sourceFiles/phase2/healthChecks.js +73 -0
  96. package/dist/generators/sourceFiles/phase2/healthChecks.js.map +1 -0
  97. package/dist/generators/sourceFiles/phase2/scheduledTasks.d.ts +2 -0
  98. package/dist/generators/sourceFiles/phase2/scheduledTasks.d.ts.map +1 -0
  99. package/dist/generators/sourceFiles/phase2/scheduledTasks.js +56 -0
  100. package/dist/generators/sourceFiles/phase2/scheduledTasks.js.map +1 -0
  101. package/dist/generators/sourceFiles/phase3/apiVersioning.d.ts +3 -0
  102. package/dist/generators/sourceFiles/phase3/apiVersioning.d.ts.map +1 -0
  103. package/dist/generators/sourceFiles/phase3/apiVersioning.js +72 -0
  104. package/dist/generators/sourceFiles/phase3/apiVersioning.js.map +1 -0
  105. package/dist/generators/sourceFiles/phase3/cliCommands.d.ts +2 -0
  106. package/dist/generators/sourceFiles/phase3/cliCommands.d.ts.map +1 -0
  107. package/dist/generators/sourceFiles/phase3/cliCommands.js +102 -0
  108. package/dist/generators/sourceFiles/phase3/cliCommands.js.map +1 -0
  109. package/dist/generators/sourceFiles/phase3/configSystem.d.ts +2 -0
  110. package/dist/generators/sourceFiles/phase3/configSystem.d.ts.map +1 -0
  111. package/dist/generators/sourceFiles/phase3/configSystem.js +57 -0
  112. package/dist/generators/sourceFiles/phase3/configSystem.js.map +1 -0
  113. package/dist/generators/sourceFiles/phase3/dependencyInjection.d.ts +2 -0
  114. package/dist/generators/sourceFiles/phase3/dependencyInjection.d.ts.map +1 -0
  115. package/dist/generators/sourceFiles/phase3/dependencyInjection.js +153 -0
  116. package/dist/generators/sourceFiles/phase3/dependencyInjection.js.map +1 -0
  117. package/dist/generators/sourceFiles/phase3/moduleSystem.d.ts +2 -0
  118. package/dist/generators/sourceFiles/phase3/moduleSystem.d.ts.map +1 -0
  119. package/dist/generators/sourceFiles/phase3/moduleSystem.js +166 -0
  120. package/dist/generators/sourceFiles/phase3/moduleSystem.js.map +1 -0
  121. package/dist/generators/sourceFiles/phase3/structuredLogging.d.ts +3 -0
  122. package/dist/generators/sourceFiles/phase3/structuredLogging.d.ts.map +1 -0
  123. package/dist/generators/sourceFiles/phase3/structuredLogging.js +155 -0
  124. package/dist/generators/sourceFiles/phase3/structuredLogging.js.map +1 -0
  125. package/dist/generators/sourceFiles/repositories/index.d.ts +3 -0
  126. package/dist/generators/sourceFiles/repositories/index.d.ts.map +1 -0
  127. package/dist/generators/sourceFiles/repositories/index.js +109 -0
  128. package/dist/generators/sourceFiles/repositories/index.js.map +1 -0
  129. package/dist/generators/sourceFiles/services/index.d.ts +3 -0
  130. package/dist/generators/sourceFiles/services/index.d.ts.map +1 -0
  131. package/dist/generators/sourceFiles/services/index.js +353 -0
  132. package/dist/generators/sourceFiles/services/index.js.map +1 -0
  133. package/dist/generators/sourceFiles.d.ts +1 -2
  134. package/dist/generators/sourceFiles.d.ts.map +1 -1
  135. package/dist/generators/sourceFiles.js +2 -1238
  136. package/dist/generators/sourceFiles.js.map +1 -1
  137. package/dist/prompts.d.ts.map +1 -1
  138. package/dist/prompts.js +35 -0
  139. package/dist/prompts.js.map +1 -1
  140. package/dist/types.d.ts +5 -0
  141. package/dist/types.d.ts.map +1 -1
  142. package/jest.config.js +21 -0
  143. package/package.json +4 -1
  144. package/src/generators/docker.ts +61 -4
  145. package/src/generators/envExample.ts +28 -0
  146. package/src/generators/index.ts +1 -1
  147. package/src/generators/packageJson.ts +40 -1
  148. package/src/generators/sourceFiles/controllers/index.ts +157 -0
  149. package/src/generators/sourceFiles/core/configFiles.ts +158 -0
  150. package/src/generators/sourceFiles/core/index.ts +28 -0
  151. package/src/generators/sourceFiles/core/indexFile.ts +49 -0
  152. package/src/generators/sourceFiles/core/middlewares.ts +129 -0
  153. package/src/generators/sourceFiles/core/routes.ts +295 -0
  154. package/src/generators/sourceFiles/core/tests.ts +62 -0
  155. package/src/generators/sourceFiles/core/types.ts +14 -0
  156. package/src/generators/sourceFiles/core/utils.ts +178 -0
  157. package/src/generators/sourceFiles/core/validators.ts +39 -0
  158. package/src/generators/sourceFiles/features/fileUpload.ts +241 -0
  159. package/src/generators/sourceFiles/features/queue.ts +226 -0
  160. package/src/generators/sourceFiles/features/redis.ts +73 -0
  161. package/src/generators/sourceFiles/index.ts +125 -0
  162. package/src/generators/sourceFiles/phase1/cliGenerators.ts +338 -0
  163. package/src/generators/sourceFiles/phase1/seedersFactories.ts +97 -0
  164. package/src/generators/sourceFiles/phase2/dtos.ts +60 -0
  165. package/src/generators/sourceFiles/phase2/events.ts +80 -0
  166. package/src/generators/sourceFiles/phase2/exceptionHandling.ts +111 -0
  167. package/src/generators/sourceFiles/phase2/guards.ts +99 -0
  168. package/src/generators/sourceFiles/phase2/healthChecks.ts +81 -0
  169. package/src/generators/sourceFiles/phase2/scheduledTasks.ts +58 -0
  170. package/src/generators/sourceFiles/phase3/apiVersioning.ts +77 -0
  171. package/src/generators/sourceFiles/phase3/cliCommands.ts +110 -0
  172. package/src/generators/sourceFiles/phase3/configSystem.ts +64 -0
  173. package/src/generators/sourceFiles/phase3/dependencyInjection.ts +155 -0
  174. package/src/generators/sourceFiles/phase3/moduleSystem.ts +170 -0
  175. package/src/generators/sourceFiles/phase3/structuredLogging.ts +160 -0
  176. package/src/generators/sourceFiles/repositories/index.ts +114 -0
  177. package/src/generators/sourceFiles/services/index.ts +363 -0
  178. package/src/generators/sourceFiles.ts +2 -1317
  179. package/src/prompts.ts +36 -1
  180. package/src/types.ts +5 -0
  181. package/tests/integration.test.ts +233 -0
@@ -0,0 +1,170 @@
1
+ import fs from 'fs-extra';
2
+ import path from 'path';
3
+
4
+ export async function generateModuleSystem(srcDir: string): Promise<void> {
5
+ const modulesDir = path.join(srcDir, 'modules');
6
+ await fs.ensureDir(modulesDir);
7
+
8
+ const moduleContent = `import { Express } from 'express';
9
+ import { container } from '../di/container.js';
10
+
11
+ export interface ModuleConfig {
12
+ name: string;
13
+ routes?: (app: Express) => void;
14
+ services?: Array<{ identifier: string | symbol; factory: any; singleton?: boolean }>;
15
+ middlewares?: Array<(app: Express) => void>;
16
+ onInit?: () => void | Promise<void>;
17
+ onDestroy?: () => void | Promise<void>;
18
+ }
19
+
20
+ export class Module {
21
+ private config: ModuleConfig;
22
+
23
+ constructor(config: ModuleConfig) {
24
+ this.config = config;
25
+ }
26
+
27
+ /**
28
+ * Register module services
29
+ */
30
+ registerServices(): void {
31
+ if (this.config.services) {
32
+ this.config.services.forEach(({ identifier, factory, singleton = true }) => {
33
+ if (singleton) {
34
+ container.singleton(identifier, factory);
35
+ } else {
36
+ container.transient(identifier, factory);
37
+ }
38
+ });
39
+ }
40
+ }
41
+
42
+ /**
43
+ * Register module routes
44
+ */
45
+ registerRoutes(app: Express): void {
46
+ if (this.config.routes) {
47
+ this.config.routes(app);
48
+ }
49
+ }
50
+
51
+ /**
52
+ * Register module middlewares
53
+ */
54
+ registerMiddlewares(app: Express): void {
55
+ if (this.config.middlewares) {
56
+ this.config.middlewares.forEach((middleware) => middleware(app));
57
+ }
58
+ }
59
+
60
+ /**
61
+ * Initialize module
62
+ */
63
+ async init(): Promise<void> {
64
+ this.registerServices();
65
+ if (this.config.onInit) {
66
+ await this.config.onInit();
67
+ }
68
+ }
69
+
70
+ /**
71
+ * Destroy module
72
+ */
73
+ async destroy(): Promise<void> {
74
+ if (this.config.onDestroy) {
75
+ await this.config.onDestroy();
76
+ }
77
+ }
78
+
79
+ getName(): string {
80
+ return this.config.name;
81
+ }
82
+ }
83
+
84
+ /**
85
+ * Module registry
86
+ */
87
+ class ModuleRegistry {
88
+ private modules: Map<string, Module> = new Map();
89
+
90
+ /**
91
+ * Register a module
92
+ */
93
+ register(module: Module): void {
94
+ this.modules.set(module.getName(), module);
95
+ }
96
+
97
+ /**
98
+ * Get a module
99
+ */
100
+ get(name: string): Module | undefined {
101
+ return this.modules.get(name);
102
+ }
103
+
104
+ /**
105
+ * Get all modules
106
+ */
107
+ getAll(): Module[] {
108
+ return Array.from(this.modules.values());
109
+ }
110
+
111
+ /**
112
+ * Initialize all modules
113
+ */
114
+ async initAll(): Promise<void> {
115
+ for (const module of this.modules.values()) {
116
+ await module.init();
117
+ }
118
+ }
119
+
120
+ /**
121
+ * Register all routes
122
+ */
123
+ registerRoutes(app: Express): void {
124
+ for (const module of this.modules.values()) {
125
+ module.registerRoutes(app);
126
+ }
127
+ }
128
+
129
+ /**
130
+ * Register all middlewares
131
+ */
132
+ registerMiddlewares(app: Express): void {
133
+ for (const module of this.modules.values()) {
134
+ module.registerMiddlewares(app);
135
+ }
136
+ }
137
+ }
138
+
139
+ export const moduleRegistry = new ModuleRegistry();
140
+ `;
141
+
142
+ await fs.writeFile(path.join(modulesDir, 'module.ts'), moduleContent);
143
+
144
+ // Example module
145
+ const exampleModuleContent = `import { Module } from './module.js';
146
+ import { Express } from 'express';
147
+ import { healthRoutes } from '../routes/health.routes.js';
148
+
149
+ /**
150
+ * Example: Health Module
151
+ */
152
+ export const healthModule = new Module({
153
+ name: 'health',
154
+ routes: (app: Express) => {
155
+ app.use('/api/health', healthRoutes);
156
+ },
157
+ services: [
158
+ {
159
+ identifier: 'healthService',
160
+ factory: () => ({
161
+ check: () => ({ status: 'ok' }),
162
+ }),
163
+ singleton: true,
164
+ },
165
+ ],
166
+ });
167
+ `;
168
+
169
+ await fs.writeFile(path.join(modulesDir, 'examples.ts'), exampleModuleContent);
170
+ }
@@ -0,0 +1,160 @@
1
+ import { ProjectConfig } from '../../../types.js';
2
+ import fs from 'fs-extra';
3
+ import path from 'path';
4
+
5
+ export async function generateStructuredLogging(
6
+ utilsDir: string,
7
+ config: ProjectConfig
8
+ ): Promise<void> {
9
+ // Replace the existing logger with structured logging
10
+ const loggingContent = `import winston from 'winston';
11
+ import { config as envConfig } from '../config/env.js';
12
+ import fs from 'fs-extra';
13
+ import path from 'path';
14
+
15
+ // Ensure logs directory exists
16
+ const logsDir = path.join(process.cwd(), 'logs');
17
+ fs.ensureDirSync(logsDir);
18
+
19
+ /**
20
+ * Log channels configuration
21
+ */
22
+ const channels = {
23
+ // Application logs
24
+ app: winston.createLogger({
25
+ level: envConfig.NODE_ENV === 'production' ? 'info' : 'debug',
26
+ format: winston.format.combine(
27
+ winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
28
+ winston.format.errors({ stack: true }),
29
+ winston.format.json()
30
+ ),
31
+ transports: [
32
+ new winston.transports.File({
33
+ filename: path.join(logsDir, 'app.log'),
34
+ maxsize: 5242880, // 5MB
35
+ maxFiles: 5,
36
+ }),
37
+ ],
38
+ }),
39
+
40
+ // Error logs
41
+ error: winston.createLogger({
42
+ level: 'error',
43
+ format: winston.format.combine(
44
+ winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
45
+ winston.format.errors({ stack: true }),
46
+ winston.format.json()
47
+ ),
48
+ transports: [
49
+ new winston.transports.File({
50
+ filename: path.join(logsDir, 'error.log'),
51
+ maxsize: 5242880, // 5MB
52
+ maxFiles: 5,
53
+ }),
54
+ ],
55
+ }),
56
+
57
+ // Access logs (HTTP requests)
58
+ access: winston.createLogger({
59
+ level: 'info',
60
+ format: winston.format.combine(
61
+ winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
62
+ winston.format.json()
63
+ ),
64
+ transports: [
65
+ new winston.transports.File({
66
+ filename: path.join(logsDir, 'access.log'),
67
+ maxsize: 5242880, // 5MB
68
+ maxFiles: 5,
69
+ }),
70
+ ],
71
+ }),
72
+
73
+ // Query logs (Database queries)
74
+ query: winston.createLogger({
75
+ level: 'debug',
76
+ format: winston.format.combine(
77
+ winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }),
78
+ winston.format.json()
79
+ ),
80
+ transports: [
81
+ new winston.transports.File({
82
+ filename: path.join(logsDir, 'query.log'),
83
+ maxsize: 5242880, // 5MB
84
+ maxFiles: 5,
85
+ }),
86
+ ],
87
+ }),
88
+ };
89
+
90
+ // Add console transport in development
91
+ if (envConfig.NODE_ENV !== 'production') {
92
+ Object.values(channels).forEach((channel) => {
93
+ channel.add(
94
+ new winston.transports.Console({
95
+ format: winston.format.combine(
96
+ winston.format.colorize(),
97
+ winston.format.simple()
98
+ ),
99
+ })
100
+ );
101
+ });
102
+ }
103
+
104
+ /**
105
+ * Main logger (default channel: app)
106
+ */
107
+ export const logger = channels.app;
108
+
109
+ /**
110
+ * Channel-specific loggers
111
+ */
112
+ export const loggers = {
113
+ app: channels.app,
114
+ error: channels.error,
115
+ access: channels.access,
116
+ query: channels.query,
117
+ };
118
+
119
+ /**
120
+ * Log levels
121
+ */
122
+ export const LogLevel = {
123
+ ERROR: 'error',
124
+ WARN: 'warn',
125
+ INFO: 'info',
126
+ DEBUG: 'debug',
127
+ } as const;
128
+
129
+ /**
130
+ * Structured logging helper
131
+ */
132
+ export function log(level: keyof typeof LogLevel, message: string, meta?: any) {
133
+ const channel = level === 'error' ? channels.error : channels.app;
134
+ channel[level](message, meta);
135
+ }
136
+
137
+ /**
138
+ * Access log middleware
139
+ */
140
+ export function accessLog(req: any, res: any, next: any) {
141
+ const start = Date.now();
142
+
143
+ res.on('finish', () => {
144
+ const duration = Date.now() - start;
145
+ channels.access.info('HTTP Request', {
146
+ method: req.method,
147
+ url: req.url,
148
+ status: res.statusCode,
149
+ duration: \`\${duration}ms\`,
150
+ ip: req.ip,
151
+ userAgent: req.get('user-agent'),
152
+ });
153
+ });
154
+
155
+ next();
156
+ }
157
+ `;
158
+
159
+ await fs.writeFile(path.join(utilsDir, 'logger.ts'), loggingContent);
160
+ }
@@ -0,0 +1,114 @@
1
+ import { ProjectConfig } from '../../../types.js';
2
+ import fs from 'fs-extra';
3
+ import path from 'path';
4
+
5
+ export async function generateRepositories(repositoriesDir: string, config: ProjectConfig): Promise<void> {
6
+ if (config.includeAuth) {
7
+ const userRepositoryContent = `import { prisma } from '../config/database.js';
8
+
9
+ export const userRepository = {
10
+ async findByEmail(email: string) {
11
+ return prisma.user.findUnique({
12
+ where: { email },
13
+ });
14
+ },
15
+
16
+ async findById(id: string) {
17
+ return prisma.user.findUnique({
18
+ where: { id },
19
+ select: {
20
+ id: true,
21
+ email: true,
22
+ name: true,
23
+ createdAt: true,
24
+ updatedAt: true,
25
+ },
26
+ });
27
+ },
28
+
29
+ async create(data: { email: string; password: string; name?: string; emailVerificationToken?: string; emailVerificationExpires?: Date }) {
30
+ return prisma.user.create({
31
+ data,
32
+ select: {
33
+ id: true,
34
+ email: true,
35
+ name: true,
36
+ emailVerified: true,
37
+ createdAt: true,
38
+ updatedAt: true,
39
+ },
40
+ });
41
+ },
42
+
43
+ async updateEmailVerification(id: string, verified: boolean) {
44
+ return prisma.user.update({
45
+ where: { id },
46
+ data: {
47
+ emailVerified: verified,
48
+ emailVerificationToken: null,
49
+ emailVerificationExpires: null,
50
+ },
51
+ });
52
+ },
53
+
54
+ async findByVerificationToken(token: string) {
55
+ return prisma.user.findFirst({
56
+ where: {
57
+ emailVerificationToken: token,
58
+ emailVerificationExpires: {
59
+ gt: new Date(),
60
+ },
61
+ },
62
+ });
63
+ },
64
+
65
+ async updateVerificationToken(id: string, token: string, expires: Date) {
66
+ return prisma.user.update({
67
+ where: { id },
68
+ data: {
69
+ emailVerificationToken: token,
70
+ emailVerificationExpires: expires,
71
+ },
72
+ });
73
+ },
74
+
75
+ async updatePasswordResetToken(id: string, token: string, expires: Date) {
76
+ return prisma.user.update({
77
+ where: { id },
78
+ data: {
79
+ passwordResetToken: token,
80
+ passwordResetExpires: expires,
81
+ },
82
+ });
83
+ },
84
+
85
+ async findByPasswordResetToken(token: string) {
86
+ return prisma.user.findFirst({
87
+ where: {
88
+ passwordResetToken: token,
89
+ passwordResetExpires: {
90
+ gt: new Date(),
91
+ },
92
+ },
93
+ });
94
+ },
95
+
96
+ async updatePassword(id: string, password: string) {
97
+ return prisma.user.update({
98
+ where: { id },
99
+ data: {
100
+ password,
101
+ passwordResetToken: null,
102
+ passwordResetExpires: null,
103
+ },
104
+ });
105
+ },
106
+ };
107
+ `;
108
+
109
+ await fs.writeFile(
110
+ path.join(repositoriesDir, 'user.repository.ts'),
111
+ userRepositoryContent
112
+ );
113
+ }
114
+ }