micro-generate 1.0.1
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/README.md +104 -0
- package/dist/cli/generators/feature-generator.d.ts +2 -0
- package/dist/cli/generators/feature-generator.js +164 -0
- package/dist/cli/generators/feature-generator.js.map +1 -0
- package/dist/cli/generators/graphql-generator.d.ts +2 -0
- package/dist/cli/generators/graphql-generator.js +117 -0
- package/dist/cli/generators/graphql-generator.js.map +1 -0
- package/dist/cli/generators/init-generator.d.ts +2 -0
- package/dist/cli/generators/init-generator.js +400 -0
- package/dist/cli/generators/init-generator.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +87 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/utils/types.d.ts +10 -0
- package/dist/cli/utils/types.js +2 -0
- package/dist/cli/utils/types.js.map +1 -0
- package/dist/config/database.d.ts +2 -0
- package/dist/config/database.js +27 -0
- package/dist/config/database.js.map +1 -0
- package/dist/config/env.d.ts +12 -0
- package/dist/config/env.js +17 -0
- package/dist/config/env.js.map +1 -0
- package/dist/core/MicroserviceServer.d.ts +24 -0
- package/dist/core/MicroserviceServer.js +85 -0
- package/dist/core/MicroserviceServer.js.map +1 -0
- package/dist/database/redis.d.ts +31 -0
- package/dist/database/redis.js +115 -0
- package/dist/database/redis.js.map +1 -0
- package/dist/features/hello/resolvers.d.ts +5 -0
- package/dist/features/hello/resolvers.js +6 -0
- package/dist/features/hello/resolvers.js.map +1 -0
- package/dist/features/hello/typeDefs.d.ts +1 -0
- package/dist/features/hello/typeDefs.js +6 -0
- package/dist/features/hello/typeDefs.js.map +1 -0
- package/dist/features/index.d.ts +6 -0
- package/dist/features/index.js +5 -0
- package/dist/features/index.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +1 -0
- package/dist/server.js +43 -0
- package/dist/server.js.map +1 -0
- package/dist/utils/logger.d.ts +3 -0
- package/dist/utils/logger.js +21 -0
- package/dist/utils/logger.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
import fs from 'fs-extra';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
export const generateInit = async (options) => {
|
|
5
|
+
const { name, useMongo = true, useRedis = true } = options;
|
|
6
|
+
const projectPath = path.join(process.cwd(), name);
|
|
7
|
+
console.log(chalk.blue("Initializing project in " + projectPath + "..."));
|
|
8
|
+
// 1. Create Directories
|
|
9
|
+
const dirs = [
|
|
10
|
+
projectPath,
|
|
11
|
+
path.join(projectPath, 'src'),
|
|
12
|
+
path.join(projectPath, 'src', 'features'),
|
|
13
|
+
path.join(projectPath, 'src', 'services'),
|
|
14
|
+
path.join(projectPath, 'src', 'utils'),
|
|
15
|
+
path.join(projectPath, 'src', 'config'),
|
|
16
|
+
];
|
|
17
|
+
if (useRedis) {
|
|
18
|
+
dirs.push(path.join(projectPath, 'src', 'db', 'redis'));
|
|
19
|
+
}
|
|
20
|
+
if (useMongo) {
|
|
21
|
+
dirs.push(path.join(projectPath, 'src', 'db', 'mongo'));
|
|
22
|
+
}
|
|
23
|
+
for (const dir of dirs) {
|
|
24
|
+
await fs.ensureDir(dir);
|
|
25
|
+
}
|
|
26
|
+
// 2. src/services/api.ts
|
|
27
|
+
const apiContent = `import axios from 'axios';
|
|
28
|
+
|
|
29
|
+
export default class ApiClient {
|
|
30
|
+
public baseUrl: string;
|
|
31
|
+
public timeout: number;
|
|
32
|
+
|
|
33
|
+
constructor(url: string) {
|
|
34
|
+
this.baseUrl = url;
|
|
35
|
+
this.timeout = 600000; // 10 minutes
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
private getHeaders(token?: string) {
|
|
39
|
+
const headers: Record<string, string> = {
|
|
40
|
+
'Content-Type': 'application/json',
|
|
41
|
+
};
|
|
42
|
+
if (token) {
|
|
43
|
+
headers['Authorization'] = token;
|
|
44
|
+
}
|
|
45
|
+
return headers;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
protected async get<T>(endpoint: string, params: Record<string, any> = {}, token?: string): Promise<T> {
|
|
49
|
+
const response = await axios.get(\`\${this.baseUrl}/\${endpoint}\`, {
|
|
50
|
+
headers: this.getHeaders(token),
|
|
51
|
+
params,
|
|
52
|
+
timeout: this.timeout,
|
|
53
|
+
});
|
|
54
|
+
return response.data;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
protected async post<T>(endpoint: string, data: Record<string, any>, token?: string): Promise<T> {
|
|
58
|
+
const response = await axios.post(\`\${this.baseUrl}/\${endpoint}\`, data, {
|
|
59
|
+
headers: this.getHeaders(token),
|
|
60
|
+
timeout: this.timeout,
|
|
61
|
+
});
|
|
62
|
+
return response.data;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
`;
|
|
66
|
+
await fs.writeFile(path.join(projectPath, 'src', 'services', 'api.ts'), apiContent);
|
|
67
|
+
// 3. src/utils/sanitize.ts
|
|
68
|
+
const sanitizeContent = `import DOMPurify from 'dompurify';
|
|
69
|
+
import { JSDOM } from 'jsdom';
|
|
70
|
+
|
|
71
|
+
const window = new JSDOM('').window;
|
|
72
|
+
const purify = DOMPurify(window as any);
|
|
73
|
+
|
|
74
|
+
export function sanitize(dirty: string): string {
|
|
75
|
+
return purify.sanitize(dirty, { ALLOWED_TAGS: [], ALLOWED_ATTR: [] });
|
|
76
|
+
}
|
|
77
|
+
`;
|
|
78
|
+
await fs.writeFile(path.join(projectPath, 'src', 'utils', 'sanitize.ts'), sanitizeContent);
|
|
79
|
+
// 4. src/utils/config.ts
|
|
80
|
+
const configUtilContent = `import * as dotenv from 'dotenv';
|
|
81
|
+
dotenv.config();
|
|
82
|
+
|
|
83
|
+
export function getEnv(name: string): string {
|
|
84
|
+
const value = process.env[name];
|
|
85
|
+
if (!value) {
|
|
86
|
+
throw new Error(\`❌ Variable de entorno requerida no definida: \${name}\`);
|
|
87
|
+
}
|
|
88
|
+
return value;
|
|
89
|
+
}
|
|
90
|
+
`;
|
|
91
|
+
await fs.writeFile(path.join(projectPath, 'src', 'utils', 'config.ts'), configUtilContent);
|
|
92
|
+
// 5. src/db/redis/client.ts (Only if Redis is enabled)
|
|
93
|
+
if (useRedis) {
|
|
94
|
+
const redisClientContent = `import { Redis } from 'ioredis';
|
|
95
|
+
|
|
96
|
+
let redisInstance: Redis | null = null;
|
|
97
|
+
|
|
98
|
+
export function setRedisClient(client: Redis): void {
|
|
99
|
+
redisInstance = client;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
export function getRedisClient(): Redis {
|
|
103
|
+
if (!redisInstance) {
|
|
104
|
+
throw new Error('Redis client not initialized.');
|
|
105
|
+
}
|
|
106
|
+
return redisInstance;
|
|
107
|
+
}
|
|
108
|
+
`;
|
|
109
|
+
await fs.writeFile(path.join(projectPath, 'src', 'db', 'redis', 'client.ts'), redisClientContent);
|
|
110
|
+
// Standardized Redis Repository
|
|
111
|
+
const redisRepositoryContent = `import { Redis } from 'ioredis';
|
|
112
|
+
|
|
113
|
+
// --- Repository Factory ---
|
|
114
|
+
|
|
115
|
+
export const createRedisRepository = (getDb: () => Redis, keyPrefix: string) => {
|
|
116
|
+
|
|
117
|
+
// Función helper para manejar callbacks como promesas
|
|
118
|
+
const promiseFunct = (err: any, response: any, resolve: (value: any) => void, reject: (reason?: any) => void) => {
|
|
119
|
+
if (err) {
|
|
120
|
+
reject(err);
|
|
121
|
+
} else {
|
|
122
|
+
resolve(response);
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
return {
|
|
127
|
+
find: async (_id: string) => {
|
|
128
|
+
const db = getDb();
|
|
129
|
+
return new Promise((resolve, reject) => {
|
|
130
|
+
db.get(_id, (err, response) => {
|
|
131
|
+
promiseFunct(err, response, resolve, reject);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
},
|
|
135
|
+
|
|
136
|
+
findKeys: async (_id: string) => {
|
|
137
|
+
const db = getDb();
|
|
138
|
+
return new Promise((resolve, reject) => {
|
|
139
|
+
db.keys(_id, (err, response) => {
|
|
140
|
+
if (response && response.length > 0) {
|
|
141
|
+
promiseFunct(err, response, resolve, reject);
|
|
142
|
+
} else {
|
|
143
|
+
promiseFunct(null, ['No genero datos'], resolve, reject);
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
});
|
|
147
|
+
},
|
|
148
|
+
|
|
149
|
+
findAll: async () => {
|
|
150
|
+
const db = getDb();
|
|
151
|
+
return new Promise((resolve, reject) => {
|
|
152
|
+
db.keys(keyPrefix + '*', (err, response) => {
|
|
153
|
+
if (response && response.length > 0) {
|
|
154
|
+
db.mget(response, (err, response2) => {
|
|
155
|
+
promiseFunct(err, response2, resolve, reject);
|
|
156
|
+
});
|
|
157
|
+
} else {
|
|
158
|
+
promiseFunct(null, ['No genero datos'], resolve, reject);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
},
|
|
163
|
+
|
|
164
|
+
save: async (_id: string, _data: any) => {
|
|
165
|
+
const db = getDb();
|
|
166
|
+
return new Promise((resolve, reject) => {
|
|
167
|
+
db.set(_id, _data, (err, response) => {
|
|
168
|
+
promiseFunct(err, response, resolve, reject);
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
},
|
|
172
|
+
|
|
173
|
+
saveTTL: async (_id: string, _data: any, ttl: number) => {
|
|
174
|
+
const db = getDb();
|
|
175
|
+
return new Promise((resolve, reject) => {
|
|
176
|
+
db.set(_id, _data, (err, response) => {
|
|
177
|
+
if (err) {
|
|
178
|
+
reject(err);
|
|
179
|
+
} else {
|
|
180
|
+
db.expire(_id, ttl);
|
|
181
|
+
resolve(response);
|
|
182
|
+
}
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
},
|
|
186
|
+
|
|
187
|
+
addTTL: async (_id: string, ttl: number) => {
|
|
188
|
+
const db = getDb();
|
|
189
|
+
return db.expire(_id, ttl);
|
|
190
|
+
},
|
|
191
|
+
|
|
192
|
+
getTTL: async (_id: string) => {
|
|
193
|
+
const db = getDb();
|
|
194
|
+
return new Promise((resolve, reject) => {
|
|
195
|
+
db.ttl(_id, (err, response) => {
|
|
196
|
+
promiseFunct(err, response, resolve, reject);
|
|
197
|
+
});
|
|
198
|
+
});
|
|
199
|
+
},
|
|
200
|
+
|
|
201
|
+
incr: async (_id: string) => {
|
|
202
|
+
const db = getDb();
|
|
203
|
+
return new Promise((resolve, reject) => {
|
|
204
|
+
db.incr(_id, (err, response) => {
|
|
205
|
+
promiseFunct(err, response, resolve, reject);
|
|
206
|
+
});
|
|
207
|
+
});
|
|
208
|
+
},
|
|
209
|
+
|
|
210
|
+
sadd: async (_id: string, _data: any) => {
|
|
211
|
+
const db = getDb();
|
|
212
|
+
return new Promise((resolve, reject) => {
|
|
213
|
+
db.sadd(_id, _data, (err, response) => {
|
|
214
|
+
promiseFunct(err, response, resolve, reject);
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
},
|
|
218
|
+
|
|
219
|
+
sismember: async (_id: string, _data: any) => {
|
|
220
|
+
const db = getDb();
|
|
221
|
+
return new Promise((resolve, reject) => {
|
|
222
|
+
db.sismember(_id, _data, (err, response) => {
|
|
223
|
+
promiseFunct(err, response, resolve, reject);
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
},
|
|
227
|
+
|
|
228
|
+
sisremove: async (_id: string, _data: any) => {
|
|
229
|
+
const db = getDb();
|
|
230
|
+
return new Promise((resolve, reject) => {
|
|
231
|
+
db.srem(_id, _data, (err, response) => {
|
|
232
|
+
promiseFunct(err, response, resolve, reject);
|
|
233
|
+
});
|
|
234
|
+
});
|
|
235
|
+
},
|
|
236
|
+
|
|
237
|
+
smembers: async (_id: string) => {
|
|
238
|
+
const db = getDb();
|
|
239
|
+
return new Promise((resolve, reject) => {
|
|
240
|
+
db.smembers(_id, (err, response) => {
|
|
241
|
+
promiseFunct(err, response, resolve, reject);
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
},
|
|
245
|
+
|
|
246
|
+
sdiff: async (_id: string) => {
|
|
247
|
+
return new Promise((resolve, reject) => {
|
|
248
|
+
console.log('sdiff called with', _id);
|
|
249
|
+
resolve([]);
|
|
250
|
+
});
|
|
251
|
+
},
|
|
252
|
+
|
|
253
|
+
clear: async (key: string) => {
|
|
254
|
+
const db = getDb();
|
|
255
|
+
return new Promise((resolve, reject) => {
|
|
256
|
+
db.del(key, (err, response) => {
|
|
257
|
+
promiseFunct(err, response, resolve, reject);
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
};
|
|
262
|
+
};
|
|
263
|
+
`;
|
|
264
|
+
await fs.writeFile(path.join(projectPath, 'src', 'db', 'redis', 'redis.ts'), redisRepositoryContent);
|
|
265
|
+
}
|
|
266
|
+
// 6. src/index.ts (Entry Point)
|
|
267
|
+
let indexImports = `import { MicroserviceServer } from 'micro-generate';
|
|
268
|
+
import { typeDefs, resolvers } from './features/index.js';
|
|
269
|
+
import * as dotenv from 'dotenv';\n`;
|
|
270
|
+
if (useRedis) {
|
|
271
|
+
indexImports += `import { setRedisClient } from './db/redis/client.js';\n`;
|
|
272
|
+
}
|
|
273
|
+
const indexConfig = [];
|
|
274
|
+
indexConfig.push(`port: parseInt(process.env.PORT || '4000')`);
|
|
275
|
+
if (useMongo) {
|
|
276
|
+
indexConfig.push(`mongoUri: process.env.MONGO_URI`);
|
|
277
|
+
}
|
|
278
|
+
if (useRedis) {
|
|
279
|
+
indexConfig.push(`redisHost: process.env.REDIS_HOST`);
|
|
280
|
+
indexConfig.push(`redisPort: parseInt(process.env.REDIS_PORT || '6379')`);
|
|
281
|
+
indexConfig.push(`redisPassword: process.env.REDIS_PASSWORD`);
|
|
282
|
+
indexConfig.push(`redisDb: parseInt(process.env.REDIS_DB || '0')`);
|
|
283
|
+
indexConfig.push(`onRedisConnected: (client) => setRedisClient(client)`);
|
|
284
|
+
}
|
|
285
|
+
indexConfig.push(`playground: process.env.GRAPHQL_PLAYGROUND === 'true'`);
|
|
286
|
+
indexConfig.push(`introspection: process.env.GRAPHQL_INTROSPECTION === 'true'`);
|
|
287
|
+
const indexContent = `${indexImports}
|
|
288
|
+
dotenv.config();
|
|
289
|
+
|
|
290
|
+
const server = new MicroserviceServer({
|
|
291
|
+
${indexConfig.join(',\n ')},
|
|
292
|
+
typeDefs,
|
|
293
|
+
resolvers,
|
|
294
|
+
});
|
|
295
|
+
|
|
296
|
+
server.start().then(() => {
|
|
297
|
+
console.log('Server initialized');
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
const gracefulShutdown = async () => {
|
|
301
|
+
console.log('Starting graceful shutdown...');
|
|
302
|
+
await server.stop();
|
|
303
|
+
console.log('Graceful shutdown complete.');
|
|
304
|
+
process.exit(0);
|
|
305
|
+
};
|
|
306
|
+
|
|
307
|
+
process.on('SIGINT', gracefulShutdown);
|
|
308
|
+
process.on('SIGTERM', gracefulShutdown);
|
|
309
|
+
`;
|
|
310
|
+
await fs.writeFile(path.join(projectPath, 'src', 'index.ts'), indexContent);
|
|
311
|
+
// 7. src/features/index.ts
|
|
312
|
+
const featuresIndexContent = `export const typeDefs = ['type Query { status: String }'];
|
|
313
|
+
export const resolvers = [{ Query: { status: () => 'Functioning' } }];
|
|
314
|
+
`;
|
|
315
|
+
await fs.writeFile(path.join(projectPath, 'src', 'features', 'index.ts'), featuresIndexContent);
|
|
316
|
+
// 8. .env
|
|
317
|
+
let envContent = `PORT=4000
|
|
318
|
+
NODE_ENV=development
|
|
319
|
+
`;
|
|
320
|
+
if (useMongo) {
|
|
321
|
+
envContent += `MONGO_URI=mongodb://localhost:27017/${name}\n`;
|
|
322
|
+
}
|
|
323
|
+
if (useRedis) {
|
|
324
|
+
envContent += `REDIS_HOST=localhost
|
|
325
|
+
REDIS_PORT=6379
|
|
326
|
+
REDIS_PASSWORD=
|
|
327
|
+
REDIS_DB=0
|
|
328
|
+
`;
|
|
329
|
+
}
|
|
330
|
+
envContent += `GRAPHQL_PLAYGROUND=true
|
|
331
|
+
GRAPHQL_INTROSPECTION=true
|
|
332
|
+
LOG_LEVEL=info
|
|
333
|
+
`;
|
|
334
|
+
await fs.writeFile(path.join(projectPath, '.env'), envContent);
|
|
335
|
+
await fs.writeFile(path.join(projectPath, '.env.example'), envContent);
|
|
336
|
+
// 9. package.json
|
|
337
|
+
const dependencies = {
|
|
338
|
+
'micro-generate': '*',
|
|
339
|
+
'axios': '^1.6.0',
|
|
340
|
+
'dotenv': '^16.4.0',
|
|
341
|
+
'dompurify': '^3.0.0',
|
|
342
|
+
'jsdom': '^23.0.0',
|
|
343
|
+
'zod': '^3.22.4',
|
|
344
|
+
'graphql': '^16.8.1',
|
|
345
|
+
'pino': '^8.17.2'
|
|
346
|
+
};
|
|
347
|
+
if (useRedis) {
|
|
348
|
+
dependencies['ioredis'] = '^5.3.2';
|
|
349
|
+
}
|
|
350
|
+
const packageJson = {
|
|
351
|
+
name: name,
|
|
352
|
+
version: '1.0.0',
|
|
353
|
+
type: 'module',
|
|
354
|
+
main: './dist/index.js',
|
|
355
|
+
scripts: {
|
|
356
|
+
dev: 'tsx watch src/index.ts',
|
|
357
|
+
build: 'tsc',
|
|
358
|
+
start: 'node dist/index.js',
|
|
359
|
+
generate: 'npx micro-generate generate:feature'
|
|
360
|
+
},
|
|
361
|
+
dependencies: dependencies,
|
|
362
|
+
devDependencies: {
|
|
363
|
+
'@types/dompurify': '^3.0.0',
|
|
364
|
+
'@types/jsdom': '^21.1.0',
|
|
365
|
+
'@types/node': '^20.11.0',
|
|
366
|
+
'tsx': '^4.7.0',
|
|
367
|
+
'typescript': '^5.3.3',
|
|
368
|
+
'pino-pretty': '^10.3.1'
|
|
369
|
+
}
|
|
370
|
+
};
|
|
371
|
+
await fs.writeFile(path.join(projectPath, 'package.json'), JSON.stringify(packageJson, null, 2));
|
|
372
|
+
// 10. tsconfig.json
|
|
373
|
+
const tsConfigContent = `{
|
|
374
|
+
"compilerOptions": {
|
|
375
|
+
"target": "ES2020",
|
|
376
|
+
"module": "NodeNext",
|
|
377
|
+
"moduleResolution": "NodeNext",
|
|
378
|
+
"outDir": "./dist",
|
|
379
|
+
"rootDir": "./src",
|
|
380
|
+
"strict": true,
|
|
381
|
+
"esModuleInterop": true,
|
|
382
|
+
"skipLibCheck": true,
|
|
383
|
+
"forceConsistentCasingInFileNames": true
|
|
384
|
+
},
|
|
385
|
+
"include": ["src/**/*"],
|
|
386
|
+
"exclude": ["node_modules", "**/*.spec.ts"]
|
|
387
|
+
}
|
|
388
|
+
`;
|
|
389
|
+
await fs.writeFile(path.join(projectPath, 'tsconfig.json'), tsConfigContent);
|
|
390
|
+
console.log(chalk.green("Project " + name + " initialized successfully in " + projectPath + "!"));
|
|
391
|
+
if (useMongo)
|
|
392
|
+
console.log(chalk.blue("- MongoDB: Enabled"));
|
|
393
|
+
if (useRedis)
|
|
394
|
+
console.log(chalk.blue("- Redis: Enabled"));
|
|
395
|
+
console.log(chalk.yellow('Next steps:'));
|
|
396
|
+
console.log(chalk.white("1. cd " + name));
|
|
397
|
+
console.log(chalk.white('2. npm install'));
|
|
398
|
+
console.log(chalk.white('3. npm run dev'));
|
|
399
|
+
};
|
|
400
|
+
//# sourceMappingURL=init-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init-generator.js","sourceRoot":"","sources":["../../../src/cli/generators/init-generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAAE,OAA+B,EAAE,EAAE;IAClE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,EAAE,QAAQ,GAAG,IAAI,EAAE,GAAG,OAAO,CAAC;IAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IAEnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,0BAA0B,GAAG,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC;IAE1E,wBAAwB;IACxB,MAAM,IAAI,GAAG;QACT,WAAW;QACX,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC;QAC7B,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC;QACzC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC;QACtC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,QAAQ,CAAC;KAC1C,CAAC;IAEF,IAAI,QAAQ,EAAE,CAAC;QACX,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACX,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IAED,yBAAyB;IACzB,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsCtB,CAAC;IACE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,UAAU,CAAC,CAAC;IAEpF,2BAA2B;IAC3B,MAAM,eAAe,GAAG;;;;;;;;;CAS3B,CAAC;IACE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,aAAa,CAAC,EAAE,eAAe,CAAC,CAAC;IAE3F,yBAAyB;IACzB,MAAM,iBAAiB,GAAG;;;;;;;;;;CAU7B,CAAC;IACE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAE3F,uDAAuD;IACvD,IAAI,QAAQ,EAAE,CAAC;QACX,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;CAclC,CAAC;QACM,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,EAAE,kBAAkB,CAAC,CAAC;QAElG,gCAAgC;QAChC,MAAM,sBAAsB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAwJtC,CAAC;QACM,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,sBAAsB,CAAC,CAAC;IACzG,CAAC;IAED,gCAAgC;IAChC,IAAI,YAAY,GAAG;;oCAEa,CAAC;IAEjC,IAAI,QAAQ,EAAE,CAAC;QACX,YAAY,IAAI,0DAA0D,CAAC;IAC/E,CAAC;IAED,MAAM,WAAW,GAAG,EAAE,CAAC;IACvB,WAAW,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAE/D,IAAI,QAAQ,EAAE,CAAC;QACX,WAAW,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IACxD,CAAC;IAED,IAAI,QAAQ,EAAE,CAAC;QACX,WAAW,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;QACtD,WAAW,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;QAC1E,WAAW,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;QAC9D,WAAW,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QACnE,WAAW,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;IAC7E,CAAC;IAED,WAAW,CAAC,IAAI,CAAC,uDAAuD,CAAC,CAAC;IAC1E,WAAW,CAAC,IAAI,CAAC,6DAA6D,CAAC,CAAC;IAEhF,MAAM,YAAY,GAAG,GAAG,YAAY;;;;IAIpC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;;;;;;;;;;;;;;;;;;CAkB5B,CAAC;IACE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,UAAU,CAAC,EAAE,YAAY,CAAC,CAAC;IAE5E,2BAA2B;IAC3B,MAAM,oBAAoB,GAAG;;CAEhC,CAAC;IACE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,oBAAoB,CAAC,CAAC;IAEhG,UAAU;IACV,IAAI,UAAU,GAAG;;CAEpB,CAAC;IACE,IAAI,QAAQ,EAAE,CAAC;QACX,UAAU,IAAI,uCAAuC,IAAI,IAAI,CAAC;IAClE,CAAC;IACD,IAAI,QAAQ,EAAE,CAAC;QACX,UAAU,IAAI;;;;CAIrB,CAAC;IACE,CAAC;IAED,UAAU,IAAI;;;CAGjB,CAAC;IAEE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,UAAU,CAAC,CAAC;IAC/D,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,UAAU,CAAC,CAAC;IAEvE,kBAAkB;IAClB,MAAM,YAAY,GAA2B;QACzC,gBAAgB,EAAE,GAAG;QACrB,OAAO,EAAE,QAAQ;QACjB,QAAQ,EAAE,SAAS;QACnB,WAAW,EAAE,QAAQ;QACrB,OAAO,EAAE,SAAS;QAClB,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,SAAS;QACpB,MAAM,EAAE,SAAS;KACpB,CAAC;IAEF,IAAI,QAAQ,EAAE,CAAC;QACX,YAAY,CAAC,SAAS,CAAC,GAAG,QAAQ,CAAC;IACvC,CAAC;IAED,MAAM,WAAW,GAAG;QAChB,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE,QAAQ;QACd,IAAI,EAAE,iBAAiB;QACvB,OAAO,EAAE;YACL,GAAG,EAAE,wBAAwB;YAC7B,KAAK,EAAE,KAAK;YACZ,KAAK,EAAE,oBAAoB;YAC3B,QAAQ,EAAE,qCAAqC;SAClD;QACD,YAAY,EAAE,YAAY;QAC1B,eAAe,EAAE;YACb,kBAAkB,EAAE,QAAQ;YAC5B,cAAc,EAAE,SAAS;YACzB,aAAa,EAAE,UAAU;YACzB,KAAK,EAAE,QAAQ;YACf,YAAY,EAAE,QAAQ;YACtB,aAAa,EAAE,SAAS;SAC3B;KACJ,CAAC;IACF,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAEjG,oBAAoB;IACpB,MAAM,eAAe,GAAG;;;;;;;;;;;;;;;CAe3B,CAAC;IACE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,EAAE,eAAe,CAAC,CAAC;IAE7E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,GAAG,+BAA+B,GAAG,WAAW,GAAG,GAAG,CAAC,CAAC,CAAC;IAClG,IAAI,QAAQ;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;IAC5D,IAAI,QAAQ;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAE1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC,CAAC;AAC/C,CAAC,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Command } from 'commander';
|
|
3
|
+
import inquirer from 'inquirer';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import { generateFeature } from './generators/feature-generator.js';
|
|
6
|
+
import { generateInit } from './generators/init-generator.js';
|
|
7
|
+
const program = new Command();
|
|
8
|
+
program
|
|
9
|
+
.name('micro-generate')
|
|
10
|
+
.description('CLI to generate microservices boilerplate')
|
|
11
|
+
.version('1.0.0');
|
|
12
|
+
program
|
|
13
|
+
.command('feature')
|
|
14
|
+
.description('Generate a new feature')
|
|
15
|
+
.action(async () => {
|
|
16
|
+
const answers = await inquirer.prompt([
|
|
17
|
+
{
|
|
18
|
+
type: 'input',
|
|
19
|
+
name: 'name',
|
|
20
|
+
message: 'Feature name:',
|
|
21
|
+
validate: (input) => input ? true : 'Name is required',
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
type: 'confirm',
|
|
25
|
+
name: 'useMongo',
|
|
26
|
+
message: 'Do you want to use MongoDB in this feature?',
|
|
27
|
+
default: true,
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
type: 'confirm',
|
|
31
|
+
name: 'useRedis',
|
|
32
|
+
message: 'Do you want to use Redis in this feature?',
|
|
33
|
+
default: true,
|
|
34
|
+
},
|
|
35
|
+
]);
|
|
36
|
+
await generateFeature({
|
|
37
|
+
name: answers.name,
|
|
38
|
+
useMongo: answers.useMongo,
|
|
39
|
+
useRedis: answers.useRedis
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
program
|
|
43
|
+
.command('init')
|
|
44
|
+
.description('Initialize a new project')
|
|
45
|
+
.action(async () => {
|
|
46
|
+
const answers = await inquirer.prompt([
|
|
47
|
+
{
|
|
48
|
+
type: 'input',
|
|
49
|
+
name: 'name',
|
|
50
|
+
message: 'Project name (default: current directory):',
|
|
51
|
+
default: path.basename(process.cwd()),
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
type: 'confirm',
|
|
55
|
+
name: 'useMongo',
|
|
56
|
+
message: 'Do you want to use MongoDB?',
|
|
57
|
+
default: true,
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
type: 'confirm',
|
|
61
|
+
name: 'useRedis',
|
|
62
|
+
message: 'Do you want to use Redis?',
|
|
63
|
+
default: true,
|
|
64
|
+
},
|
|
65
|
+
]);
|
|
66
|
+
await generateInit({
|
|
67
|
+
name: answers.name,
|
|
68
|
+
useMongo: answers.useMongo,
|
|
69
|
+
useRedis: answers.useRedis,
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
program
|
|
73
|
+
.command('query')
|
|
74
|
+
.description('Generate a new GraphQL Query in an existing feature')
|
|
75
|
+
.action(async () => {
|
|
76
|
+
const { generateQuery } = await import('./generators/graphql-generator.js');
|
|
77
|
+
await generateQuery();
|
|
78
|
+
});
|
|
79
|
+
program
|
|
80
|
+
.command('mutation')
|
|
81
|
+
.description('Generate a new GraphQL Mutation in an existing feature')
|
|
82
|
+
.action(async () => {
|
|
83
|
+
const { generateMutation } = await import('./generators/graphql-generator.js');
|
|
84
|
+
await generateMutation();
|
|
85
|
+
});
|
|
86
|
+
program.parse();
|
|
87
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/cli/utils/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import mongoose from 'mongoose';
|
|
2
|
+
import { env } from './env.js';
|
|
3
|
+
import { logger } from '../utils/logger.js';
|
|
4
|
+
export const connectDatabase = async (uri) => {
|
|
5
|
+
try {
|
|
6
|
+
const connectionString = uri || env.MONGO_URI;
|
|
7
|
+
if (!connectionString) {
|
|
8
|
+
throw new Error('MongoDB URI is not defined in config or env vars');
|
|
9
|
+
}
|
|
10
|
+
await mongoose.connect(connectionString);
|
|
11
|
+
logger.info('📦 Connected to MongoDB');
|
|
12
|
+
}
|
|
13
|
+
catch (error) {
|
|
14
|
+
logger.error(error, '❌ MongoDB connection error');
|
|
15
|
+
process.exit(1);
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
export const disconnectDatabase = async () => {
|
|
19
|
+
try {
|
|
20
|
+
await mongoose.disconnect();
|
|
21
|
+
logger.info('📦 Disconnected from MongoDB');
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
logger.error(error, '❌ MongoDB disconnection error');
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
//# sourceMappingURL=database.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/config/database.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAE5C,MAAM,CAAC,MAAM,eAAe,GAAG,KAAK,EAAE,GAAY,EAAE,EAAE;IAClD,IAAI,CAAC;QACD,MAAM,gBAAgB,GAAG,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC;QAE9C,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;QACxE,CAAC;QAED,MAAM,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QACzC,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IAC3C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,4BAA4B,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACL,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,KAAK,IAAI,EAAE;IACzC,IAAI,CAAC;QACD,MAAM,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC5B,MAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAChD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,+BAA+B,CAAC,CAAC;IACzD,CAAC;AACL,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const env: {
|
|
2
|
+
PORT: string;
|
|
3
|
+
NODE_ENV: "development" | "production" | "test";
|
|
4
|
+
REDIS_PORT: string;
|
|
5
|
+
REDIS_DB: string;
|
|
6
|
+
LOG_LEVEL: "fatal" | "error" | "warn" | "info" | "debug" | "trace";
|
|
7
|
+
MONGO_URI?: string | undefined;
|
|
8
|
+
REDIS_HOST?: string | undefined;
|
|
9
|
+
REDIS_PASSWORD?: string | undefined;
|
|
10
|
+
GRAPHQL_PLAYGROUND?: string | undefined;
|
|
11
|
+
GRAPHQL_INTROSPECTION?: string | undefined;
|
|
12
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as dotenv from 'dotenv';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
dotenv.config();
|
|
4
|
+
const envSchema = z.object({
|
|
5
|
+
PORT: z.string().default('4000'),
|
|
6
|
+
NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),
|
|
7
|
+
MONGO_URI: z.string().optional(),
|
|
8
|
+
REDIS_HOST: z.string().optional(),
|
|
9
|
+
REDIS_PORT: z.string().default('6379'),
|
|
10
|
+
REDIS_PASSWORD: z.string().optional(),
|
|
11
|
+
REDIS_DB: z.string().default('0'),
|
|
12
|
+
GRAPHQL_PLAYGROUND: z.string().optional(),
|
|
13
|
+
GRAPHQL_INTROSPECTION: z.string().optional(),
|
|
14
|
+
LOG_LEVEL: z.enum(['fatal', 'error', 'warn', 'info', 'debug', 'trace']).default('info'),
|
|
15
|
+
});
|
|
16
|
+
export const env = envSchema.parse(process.env);
|
|
17
|
+
//# sourceMappingURL=env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/config/env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,QAAQ,CAAC;AACjC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,EAAE,CAAC;AAEhB,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IACvB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;IAChC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;IAC9E,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAChC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC;IACtC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACrC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;IACjC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACzC,qBAAqB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5C,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;CAC1F,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,GAAG,GAAG,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export interface MicroserviceConfig {
|
|
2
|
+
port: number;
|
|
3
|
+
mongoUri: string;
|
|
4
|
+
redisHost: string;
|
|
5
|
+
redisPort: number;
|
|
6
|
+
redisDb?: number;
|
|
7
|
+
redisPassword?: string;
|
|
8
|
+
typeDefs: any;
|
|
9
|
+
resolvers: any;
|
|
10
|
+
onRedisConnected?: (client: any) => void;
|
|
11
|
+
playground?: boolean;
|
|
12
|
+
introspection?: boolean;
|
|
13
|
+
}
|
|
14
|
+
export declare class MicroserviceServer {
|
|
15
|
+
private config;
|
|
16
|
+
private app;
|
|
17
|
+
private httpServer;
|
|
18
|
+
private apolloServer;
|
|
19
|
+
private redisConnector;
|
|
20
|
+
constructor(config: MicroserviceConfig);
|
|
21
|
+
start(): Promise<void>;
|
|
22
|
+
stop(): Promise<void>;
|
|
23
|
+
getRedisClient(): import("ioredis").default;
|
|
24
|
+
}
|