fragment-ts 1.0.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 (123) hide show
  1. package/.env.example +0 -0
  2. package/base.ts +1810 -0
  3. package/base2.ts +968 -0
  4. package/bin/frg.ts +5 -0
  5. package/config/fragment.lock.yaml +0 -0
  6. package/config/fragment.yaml +0 -0
  7. package/dist/app.d.ts +15 -0
  8. package/dist/app.js +90 -0
  9. package/dist/auth/auth.controller.d.ts +10 -0
  10. package/dist/auth/auth.controller.js +87 -0
  11. package/dist/auth/auth.middleware.d.ts +2 -0
  12. package/dist/auth/auth.middleware.js +24 -0
  13. package/dist/auth/auth.service.d.ts +20 -0
  14. package/dist/auth/auth.service.js +143 -0
  15. package/dist/auth/dto/login.dto.d.ts +9 -0
  16. package/dist/auth/dto/login.dto.js +2 -0
  17. package/dist/cli/cli.d.ts +12 -0
  18. package/dist/cli/cli.js +186 -0
  19. package/dist/cli/commands/build.command.d.ts +3 -0
  20. package/dist/cli/commands/build.command.js +23 -0
  21. package/dist/cli/commands/config.command.d.ts +6 -0
  22. package/dist/cli/commands/config.command.js +284 -0
  23. package/dist/cli/commands/generate.command.d.ts +8 -0
  24. package/dist/cli/commands/generate.command.js +180 -0
  25. package/dist/cli/commands/init.command.d.ts +7 -0
  26. package/dist/cli/commands/init.command.js +380 -0
  27. package/dist/cli/commands/migrate.command.d.ts +7 -0
  28. package/dist/cli/commands/migrate.command.js +116 -0
  29. package/dist/cli/commands/serve.command.d.ts +6 -0
  30. package/dist/cli/commands/serve.command.js +31 -0
  31. package/dist/cli/templates/controller.template.d.ts +1 -0
  32. package/dist/cli/templates/controller.template.js +52 -0
  33. package/dist/cli/templates/entity.template.d.ts +1 -0
  34. package/dist/cli/templates/entity.template.js +23 -0
  35. package/dist/cli/templates/repository.template.d.ts +1 -0
  36. package/dist/cli/templates/repository.template.js +43 -0
  37. package/dist/cli/templates/service.template.d.ts +1 -0
  38. package/dist/cli/templates/service.template.js +43 -0
  39. package/dist/cli/utils/file-generator.d.ts +9 -0
  40. package/dist/cli/utils/file-generator.js +67 -0
  41. package/dist/cli/utils/logger.d.ts +14 -0
  42. package/dist/cli/utils/logger.js +49 -0
  43. package/dist/controllers/health.controller.d.ts +13 -0
  44. package/dist/controllers/health.controller.js +50 -0
  45. package/dist/core/config/config-loader.d.ts +31 -0
  46. package/dist/core/config/config-loader.js +98 -0
  47. package/dist/core/container/di-container.d.ts +9 -0
  48. package/dist/core/container/di-container.js +37 -0
  49. package/dist/core/decorators/auth-guard.decorator.d.ts +3 -0
  50. package/dist/core/decorators/auth-guard.decorator.js +18 -0
  51. package/dist/core/decorators/autowire.decorator.d.ts +3 -0
  52. package/dist/core/decorators/autowire.decorator.js +17 -0
  53. package/dist/core/decorators/controller.decorator.d.ts +4 -0
  54. package/dist/core/decorators/controller.decorator.js +16 -0
  55. package/dist/core/decorators/injectable.decorator.d.ts +3 -0
  56. package/dist/core/decorators/injectable.decorator.js +14 -0
  57. package/dist/core/decorators/middleware.decorator.d.ts +3 -0
  58. package/dist/core/decorators/middleware.decorator.js +20 -0
  59. package/dist/core/decorators/repository.decorator.d.ts +1 -0
  60. package/dist/core/decorators/repository.decorator.js +7 -0
  61. package/dist/core/decorators/route.decorator.d.ts +14 -0
  62. package/dist/core/decorators/route.decorator.js +32 -0
  63. package/dist/core/decorators/service.decorator.d.ts +1 -0
  64. package/dist/core/decorators/service.decorator.js +7 -0
  65. package/dist/core/openai/openai-client.d.ts +12 -0
  66. package/dist/core/openai/openai-client.js +93 -0
  67. package/dist/database/data-source.d.ts +4 -0
  68. package/dist/database/data-source.js +26 -0
  69. package/dist/entities/session.entity.d.ts +9 -0
  70. package/dist/entities/session.entity.js +45 -0
  71. package/dist/entities/user.entity.d.ts +10 -0
  72. package/dist/entities/user.entity.js +48 -0
  73. package/dist/middlewares/logging.middleware.d.ts +2 -0
  74. package/dist/middlewares/logging.middleware.js +28 -0
  75. package/dist/repositories/session.repository.d.ts +9 -0
  76. package/dist/repositories/session.repository.js +50 -0
  77. package/dist/repositories/user.repository.d.ts +10 -0
  78. package/dist/repositories/user.repository.js +43 -0
  79. package/dist/server.d.ts +1 -0
  80. package/dist/server.js +30 -0
  81. package/dist/services/health.service.d.ts +13 -0
  82. package/dist/services/health.service.js +44 -0
  83. package/package.json +46 -0
  84. package/readme.md +120 -0
  85. package/src/app.ts +121 -0
  86. package/src/auth/auth.controller.ts +52 -0
  87. package/src/auth/auth.middleware.ts +27 -0
  88. package/src/auth/auth.service.ts +110 -0
  89. package/src/auth/dto/login.dto.ts +11 -0
  90. package/src/cli/cli.ts +212 -0
  91. package/src/cli/commands/build.command.ts +24 -0
  92. package/src/cli/commands/config.command.ts +280 -0
  93. package/src/cli/commands/generate.command.ts +170 -0
  94. package/src/cli/commands/init.command.ts +395 -0
  95. package/src/cli/commands/migrate.command.ts +118 -0
  96. package/src/cli/commands/serve.command.ts +37 -0
  97. package/src/cli/templates/controller.template.ts +51 -0
  98. package/src/cli/templates/entity.template.ts +22 -0
  99. package/src/cli/templates/repository.template.ts +42 -0
  100. package/src/cli/templates/service.template.ts +42 -0
  101. package/src/cli/utils/file-generator.ts +37 -0
  102. package/src/cli/utils/logger.ts +52 -0
  103. package/src/controllers/health.controller.ts +24 -0
  104. package/src/core/config/config-loader.ts +98 -0
  105. package/src/core/container/di-container.ts +43 -0
  106. package/src/core/decorators/auth-guard.decorator.ts +15 -0
  107. package/src/core/decorators/autowire.decorator.ts +18 -0
  108. package/src/core/decorators/controller.decorator.ts +15 -0
  109. package/src/core/decorators/injectable.decorator.ts +13 -0
  110. package/src/core/decorators/middleware.decorator.ts +18 -0
  111. package/src/core/decorators/repository.decorator.ts +6 -0
  112. package/src/core/decorators/route.decorator.ts +33 -0
  113. package/src/core/decorators/service.decorator.ts +6 -0
  114. package/src/core/openai/openai-client.ts +99 -0
  115. package/src/database/data-source.ts +29 -0
  116. package/src/entities/session.entity.ts +25 -0
  117. package/src/entities/user.entity.ts +27 -0
  118. package/src/middlewares/logging.middleware.ts +28 -0
  119. package/src/repositories/session.repository.ts +42 -0
  120. package/src/repositories/user.repository.ts +37 -0
  121. package/src/server.ts +32 -0
  122. package/src/services/health.service.ts +29 -0
  123. package/tsconfig.json +20 -0
package/bin/frg.ts ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env node
2
+ import { CLI } from '../src/cli/cli';
3
+
4
+ const cli = new CLI();
5
+ cli.run(process.argv.slice(2));
File without changes
File without changes
package/dist/app.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ import { Express } from 'express';
2
+ import './controllers/health.controller';
3
+ import './auth/auth.controller';
4
+ import './services/health.service';
5
+ import './repositories/user.repository';
6
+ import './repositories/session.repository';
7
+ import './auth/auth.service';
8
+ import './core/openai/openai-client';
9
+ export declare class FragmentApplication {
10
+ private app;
11
+ constructor();
12
+ initialize(): Promise<Express>;
13
+ private registerControllers;
14
+ getExpressApp(): Express;
15
+ }
package/dist/app.js ADDED
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.FragmentApplication = void 0;
7
+ const express_1 = __importDefault(require("express"));
8
+ const di_container_1 = require("./core/container/di-container");
9
+ const config_loader_1 = require("./core/config/config-loader");
10
+ const data_source_1 = require("./database/data-source");
11
+ const logging_middleware_1 = require("./middlewares/logging.middleware");
12
+ const auth_middleware_1 = require("./auth/auth.middleware");
13
+ const controller_decorator_1 = require("./core/decorators/controller.decorator");
14
+ const route_decorator_1 = require("./core/decorators/route.decorator");
15
+ const auth_guard_decorator_1 = require("./core/decorators/auth-guard.decorator");
16
+ const middleware_decorator_1 = require("./core/decorators/middleware.decorator");
17
+ // Import all controllers, services, repositories
18
+ require("./controllers/health.controller");
19
+ require("./auth/auth.controller");
20
+ require("./services/health.service");
21
+ require("./repositories/user.repository");
22
+ require("./repositories/session.repository");
23
+ require("./auth/auth.service");
24
+ require("./core/openai/openai-client");
25
+ class FragmentApplication {
26
+ constructor() {
27
+ this.app = (0, express_1.default)();
28
+ }
29
+ async initialize() {
30
+ // Load configuration
31
+ config_loader_1.ConfigLoader.load(true);
32
+ // Initialize database
33
+ const dataSource = (0, data_source_1.initializeDataSource)();
34
+ await dataSource.initialize();
35
+ console.log('✅ Database connected');
36
+ // Middleware
37
+ this.app.use(express_1.default.json());
38
+ this.app.use(express_1.default.urlencoded({ extended: true }));
39
+ this.app.use(logging_middleware_1.loggingMiddleware);
40
+ // Register all controllers
41
+ this.registerControllers();
42
+ // Error handling
43
+ this.app.use((err, req, res, next) => {
44
+ console.error(err.stack);
45
+ res.status(500).json({ error: 'Internal server error' });
46
+ });
47
+ return this.app;
48
+ }
49
+ registerControllers() {
50
+ const registeredClasses = di_container_1.DIContainer.getRegisteredClasses();
51
+ registeredClasses.forEach((controllerClass) => {
52
+ const isController = Reflect.getMetadata(controller_decorator_1.CONTROLLER_METADATA, controllerClass);
53
+ if (!isController)
54
+ return;
55
+ const basePath = Reflect.getMetadata(controller_decorator_1.CONTROLLER_PATH, controllerClass) || '';
56
+ const routes = Reflect.getMetadata(route_decorator_1.ROUTE_METADATA, controllerClass) || [];
57
+ const classMiddlewares = Reflect.getMetadata(middleware_decorator_1.MIDDLEWARE_METADATA, controllerClass) || [];
58
+ const classAuthGuard = Reflect.getMetadata(auth_guard_decorator_1.AUTH_GUARD_METADATA, controllerClass);
59
+ const controllerInstance = di_container_1.DIContainer.resolve(controllerClass);
60
+ routes.forEach((route) => {
61
+ const fullPath = basePath + route.path;
62
+ const handler = controllerInstance[route.handlerName].bind(controllerInstance);
63
+ const middlewares = [...classMiddlewares];
64
+ const methodAuthGuard = Reflect.getMetadata(auth_guard_decorator_1.AUTH_GUARD_METADATA, controllerClass, route.handlerName);
65
+ if (classAuthGuard || methodAuthGuard) {
66
+ middlewares.push(auth_middleware_1.authMiddleware);
67
+ }
68
+ const methodMiddlewares = Reflect.getMetadata(middleware_decorator_1.MIDDLEWARE_METADATA, controllerClass, route.handlerName) || [];
69
+ middlewares.push(...methodMiddlewares);
70
+ const asyncHandler = async (req, res, next) => {
71
+ try {
72
+ const result = await handler(req, res, next);
73
+ if (result && !res.headersSent) {
74
+ res.json(result);
75
+ }
76
+ }
77
+ catch (error) {
78
+ next(error);
79
+ }
80
+ };
81
+ this.app[route.method](fullPath, ...middlewares, asyncHandler);
82
+ console.log(`📍 ${route.method.toUpperCase().padEnd(6)} ${fullPath}`);
83
+ });
84
+ });
85
+ }
86
+ getExpressApp() {
87
+ return this.app;
88
+ }
89
+ }
90
+ exports.FragmentApplication = FragmentApplication;
@@ -0,0 +1,10 @@
1
+ import { AuthService } from './auth.service';
2
+ import { Request, Response } from 'express';
3
+ export declare class AuthController {
4
+ private authService;
5
+ constructor(authService: AuthService);
6
+ register(req: Request, res: Response): Promise<Response<any, Record<string, any>>>;
7
+ login(req: Request, res: Response): Promise<Response<any, Record<string, any>>>;
8
+ logout(req: Request, res: Response): Promise<Response<any, Record<string, any>>>;
9
+ getCurrentUser(req: Request, res: Response): Promise<Response<any, Record<string, any>>>;
10
+ }
@@ -0,0 +1,87 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.AuthController = void 0;
16
+ const controller_decorator_1 = require("../core/decorators/controller.decorator");
17
+ const route_decorator_1 = require("../core/decorators/route.decorator");
18
+ const injectable_decorator_1 = require("../core/decorators/injectable.decorator");
19
+ const autowire_decorator_1 = require("../core/decorators/autowire.decorator");
20
+ const auth_guard_decorator_1 = require("../core/decorators/auth-guard.decorator");
21
+ const auth_service_1 = require("./auth.service");
22
+ let AuthController = class AuthController {
23
+ constructor(authService) {
24
+ this.authService = authService;
25
+ }
26
+ async register(req, res) {
27
+ try {
28
+ const result = await this.authService.register(req.body);
29
+ return res.json(result);
30
+ }
31
+ catch (error) {
32
+ return res.status(400).json({ error: error.message });
33
+ }
34
+ }
35
+ async login(req, res) {
36
+ try {
37
+ const result = await this.authService.login(req.body);
38
+ return res.json(result);
39
+ }
40
+ catch (error) {
41
+ return res.status(401).json({ error: error.message });
42
+ }
43
+ }
44
+ async logout(req, res) {
45
+ const token = req.headers.authorization?.replace('Bearer ', '');
46
+ if (token) {
47
+ await this.authService.logout(token);
48
+ }
49
+ return res.json({ message: 'Logged out successfully' });
50
+ }
51
+ async getCurrentUser(req, res) {
52
+ return res.json({ user: req.user });
53
+ }
54
+ };
55
+ exports.AuthController = AuthController;
56
+ __decorate([
57
+ (0, route_decorator_1.Post)('/register'),
58
+ __metadata("design:type", Function),
59
+ __metadata("design:paramtypes", [Object, Object]),
60
+ __metadata("design:returntype", Promise)
61
+ ], AuthController.prototype, "register", null);
62
+ __decorate([
63
+ (0, route_decorator_1.Post)('/login'),
64
+ __metadata("design:type", Function),
65
+ __metadata("design:paramtypes", [Object, Object]),
66
+ __metadata("design:returntype", Promise)
67
+ ], AuthController.prototype, "login", null);
68
+ __decorate([
69
+ (0, route_decorator_1.Post)('/logout'),
70
+ (0, auth_guard_decorator_1.AuthGuard)(),
71
+ __metadata("design:type", Function),
72
+ __metadata("design:paramtypes", [Object, Object]),
73
+ __metadata("design:returntype", Promise)
74
+ ], AuthController.prototype, "logout", null);
75
+ __decorate([
76
+ (0, route_decorator_1.Get)('/me'),
77
+ (0, auth_guard_decorator_1.AuthGuard)(),
78
+ __metadata("design:type", Function),
79
+ __metadata("design:paramtypes", [Object, Object]),
80
+ __metadata("design:returntype", Promise)
81
+ ], AuthController.prototype, "getCurrentUser", null);
82
+ exports.AuthController = AuthController = __decorate([
83
+ (0, controller_decorator_1.Controller)('/api/auth'),
84
+ (0, injectable_decorator_1.Injectable)(),
85
+ __param(0, (0, autowire_decorator_1.Autowire)()),
86
+ __metadata("design:paramtypes", [auth_service_1.AuthService])
87
+ ], AuthController);
@@ -0,0 +1,2 @@
1
+ import { Request, Response, NextFunction } from 'express';
2
+ export declare function authMiddleware(req: Request, res: Response, next: NextFunction): Promise<Response<any, Record<string, any>> | undefined>;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.authMiddleware = authMiddleware;
4
+ const di_container_1 = require("../core/container/di-container");
5
+ const auth_service_1 = require("./auth.service");
6
+ async function authMiddleware(req, res, next) {
7
+ const authHeader = req.headers.authorization;
8
+ if (!authHeader || !authHeader.startsWith('Bearer ')) {
9
+ return res.status(401).json({ error: 'Unauthorized' });
10
+ }
11
+ const token = authHeader.replace('Bearer ', '');
12
+ const authService = di_container_1.DIContainer.resolve(auth_service_1.AuthService);
13
+ try {
14
+ const user = await authService.validateToken(token);
15
+ if (!user) {
16
+ return res.status(401).json({ error: 'Invalid token' });
17
+ }
18
+ req.user = user;
19
+ next();
20
+ }
21
+ catch (error) {
22
+ return res.status(401).json({ error: 'Unauthorized' });
23
+ }
24
+ }
@@ -0,0 +1,20 @@
1
+ import { UserRepository } from '../repositories/user.repository';
2
+ import { SessionRepository } from '../repositories/session.repository';
3
+ import { LoginDTO, RegisterDTO } from './dto/login.dto';
4
+ export declare class AuthService {
5
+ private userRepository;
6
+ private sessionRepository;
7
+ constructor(userRepository: UserRepository, sessionRepository: SessionRepository);
8
+ register(dto: RegisterDTO): Promise<{
9
+ user: any;
10
+ token: string;
11
+ }>;
12
+ login(dto: LoginDTO): Promise<{
13
+ user: any;
14
+ token: string;
15
+ }>;
16
+ logout(token: string): Promise<void>;
17
+ validateToken(token: string): Promise<any>;
18
+ private createSession;
19
+ private parseExpiry;
20
+ }
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ 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;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
45
+ return function (target, key) { decorator(target, key, paramIndex); }
46
+ };
47
+ Object.defineProperty(exports, "__esModule", { value: true });
48
+ exports.AuthService = void 0;
49
+ const crypto = __importStar(require("crypto"));
50
+ const bcrypt = __importStar(require("bcrypt"));
51
+ const service_decorator_1 = require("../core/decorators/service.decorator");
52
+ const autowire_decorator_1 = require("../core/decorators/autowire.decorator");
53
+ const user_repository_1 = require("../repositories/user.repository");
54
+ const session_repository_1 = require("../repositories/session.repository");
55
+ const config_loader_1 = require("../core/config/config-loader");
56
+ let AuthService = class AuthService {
57
+ constructor(userRepository, sessionRepository) {
58
+ this.userRepository = userRepository;
59
+ this.sessionRepository = sessionRepository;
60
+ }
61
+ async register(dto) {
62
+ const existingUser = await this.userRepository.findByEmail(dto.email);
63
+ if (existingUser) {
64
+ throw new Error('User already exists');
65
+ }
66
+ const passwordHash = await bcrypt.hash(dto.password, 10);
67
+ const user = await this.userRepository.create({
68
+ name: dto.name,
69
+ email: dto.email,
70
+ passwordHash
71
+ });
72
+ const token = await this.createSession(user.id);
73
+ return {
74
+ user: { id: user.id, name: user.name, email: user.email },
75
+ token
76
+ };
77
+ }
78
+ async login(dto) {
79
+ const user = await this.userRepository.findByEmail(dto.email);
80
+ if (!user) {
81
+ throw new Error('Invalid credentials');
82
+ }
83
+ const isValidPassword = await bcrypt.compare(dto.password, user.passwordHash);
84
+ if (!isValidPassword) {
85
+ throw new Error('Invalid credentials');
86
+ }
87
+ const token = await this.createSession(user.id);
88
+ return {
89
+ user: { id: user.id, name: user.name, email: user.email },
90
+ token
91
+ };
92
+ }
93
+ async logout(token) {
94
+ await this.sessionRepository.deleteByToken(token);
95
+ }
96
+ async validateToken(token) {
97
+ const session = await this.sessionRepository.findByToken(token);
98
+ if (!session) {
99
+ return null;
100
+ }
101
+ return {
102
+ id: session.user.id,
103
+ name: session.user.name,
104
+ email: session.user.email
105
+ };
106
+ }
107
+ async createSession(userId) {
108
+ const token = crypto.randomBytes(32).toString('hex');
109
+ const config = config_loader_1.ConfigLoader.get();
110
+ // Parse token expiry (e.g., "7d" = 7 days)
111
+ const expiryMs = this.parseExpiry(config.auth.tokenExpiry);
112
+ const expiresAt = new Date(Date.now() + expiryMs);
113
+ await this.sessionRepository.create({
114
+ token,
115
+ userId,
116
+ expiresAt
117
+ });
118
+ return token;
119
+ }
120
+ parseExpiry(expiry) {
121
+ const match = expiry.match(/^(\d+)([dhms])$/);
122
+ if (!match) {
123
+ return 7 * 24 * 60 * 60 * 1000; // default 7 days
124
+ }
125
+ const value = parseInt(match[1]);
126
+ const unit = match[2];
127
+ const multipliers = {
128
+ 's': 1000,
129
+ 'm': 60 * 1000,
130
+ 'h': 60 * 60 * 1000,
131
+ 'd': 24 * 60 * 60 * 1000
132
+ };
133
+ return value * multipliers[unit];
134
+ }
135
+ };
136
+ exports.AuthService = AuthService;
137
+ exports.AuthService = AuthService = __decorate([
138
+ (0, service_decorator_1.Service)(),
139
+ __param(0, (0, autowire_decorator_1.Autowire)()),
140
+ __param(1, (0, autowire_decorator_1.Autowire)()),
141
+ __metadata("design:paramtypes", [user_repository_1.UserRepository,
142
+ session_repository_1.SessionRepository])
143
+ ], AuthService);
@@ -0,0 +1,9 @@
1
+ export interface LoginDTO {
2
+ email: string;
3
+ password: string;
4
+ }
5
+ export interface RegisterDTO {
6
+ name: string;
7
+ email: string;
8
+ password: string;
9
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,12 @@
1
+ export declare class CLI {
2
+ private program;
3
+ private initCommand;
4
+ private generateCommand;
5
+ private configCommand;
6
+ private serveCommand;
7
+ private buildCommand;
8
+ private migrateCommand;
9
+ constructor();
10
+ private setupCommands;
11
+ run(args: string[]): void;
12
+ }
@@ -0,0 +1,186 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CLI = void 0;
7
+ const chalk_1 = __importDefault(require("chalk"));
8
+ const commander_1 = require("commander");
9
+ const init_command_1 = require("./commands/init.command");
10
+ const generate_command_1 = require("./commands/generate.command");
11
+ const config_command_1 = require("./commands/config.command");
12
+ const serve_command_1 = require("./commands/serve.command");
13
+ const build_command_1 = require("./commands/build.command");
14
+ const migrate_command_1 = require("./commands/migrate.command");
15
+ const logger_1 = require("./utils/logger");
16
+ class CLI {
17
+ constructor() {
18
+ this.program = new commander_1.Command();
19
+ this.initCommand = new init_command_1.InitCommand();
20
+ this.generateCommand = new generate_command_1.GenerateCommand();
21
+ this.configCommand = new config_command_1.ConfigCommand();
22
+ this.serveCommand = new serve_command_1.ServeCommand();
23
+ this.buildCommand = new build_command_1.BuildCommand();
24
+ this.migrateCommand = new migrate_command_1.MigrateCommand();
25
+ this.setupCommands();
26
+ }
27
+ setupCommands() {
28
+ this.program
29
+ .name('frg')
30
+ .description('Fragment Framework CLI - Build powerful TypeScript backends')
31
+ .version('1.0.0');
32
+ // ASCII Art Banner
33
+ this.program
34
+ .addHelpText('beforeAll', () => {
35
+ return chalk_1.default.cyan(`
36
+ ╔═══════════════════════════════════════════════════════════╗
37
+ ║ ║
38
+ ║ ███████╗██████╗ █████╗ ██████╗ ███╗ ███╗███████╗ ║
39
+ ║ ██╔════╝██╔══██╗██╔══██╗██╔════╝ ████╗ ████║██╔════╝ ║
40
+ ║ █████╗ ██████╔╝███████║██║ ███╗██╔████╔██║█████╗ ║
41
+ ║ ██╔══╝ ██╔══██╗██╔══██║██║ ██║██║╚██╔╝██║██╔══╝ ║
42
+ ║ ██║ ██║ ██║██║ ██║╚██████╔╝██║ ╚═╝ ██║███████╗ ║
43
+ ║ ╚═╝ ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ ║
44
+ ║ ║
45
+ ║ TypeScript Backend Framework (v1.0.0) ║
46
+ ╚═══════════════════════════════════════════════════════════╝
47
+ `);
48
+ });
49
+ // Init command
50
+ this.program
51
+ .command('init [project-name]')
52
+ .description('Initialize a new Fragment project')
53
+ .action(async (projectName) => {
54
+ await this.initCommand.execute(projectName);
55
+ });
56
+ // Generate commands
57
+ const generate = this.program
58
+ .command('generate')
59
+ .alias('g')
60
+ .description('Generate application components');
61
+ generate
62
+ .command('controller [name]')
63
+ .alias('c')
64
+ .description('Generate a new controller')
65
+ .action(async (name) => {
66
+ await this.generateCommand.execute('controller', name);
67
+ });
68
+ generate
69
+ .command('service [name]')
70
+ .alias('s')
71
+ .description('Generate a new service')
72
+ .action(async (name) => {
73
+ await this.generateCommand.execute('service', name);
74
+ });
75
+ generate
76
+ .command('repository [name]')
77
+ .alias('r')
78
+ .description('Generate a new repository')
79
+ .action(async (name) => {
80
+ await this.generateCommand.execute('repository', name);
81
+ });
82
+ generate
83
+ .command('entity [name]')
84
+ .alias('e')
85
+ .description('Generate a new entity')
86
+ .action(async (name) => {
87
+ await this.generateCommand.execute('entity', name);
88
+ });
89
+ generate
90
+ .command('resource [name]')
91
+ .alias('res')
92
+ .description('Generate a complete resource (controller, service, repository, entity)')
93
+ .action(async (name) => {
94
+ await this.generateCommand.execute('resource', name);
95
+ });
96
+ // Config commands
97
+ const config = this.program
98
+ .command('config')
99
+ .description('Configure Fragment application');
100
+ config
101
+ .command('ai')
102
+ .description('Configure OpenAI integration')
103
+ .action(async () => {
104
+ await this.configCommand.execute('ai');
105
+ });
106
+ config
107
+ .command('db')
108
+ .alias('database')
109
+ .description('Configure database connection')
110
+ .action(async () => {
111
+ await this.configCommand.execute('db');
112
+ });
113
+ config
114
+ .command('show')
115
+ .description('Show current configuration')
116
+ .action(async () => {
117
+ await this.configCommand.execute('show');
118
+ });
119
+ // Serve command
120
+ this.program
121
+ .command('serve')
122
+ .alias('dev')
123
+ .description('Start development server')
124
+ .option('-p, --port <port>', 'Port number', parseInt)
125
+ .option('--no-watch', 'Disable file watching')
126
+ .action(async (options) => {
127
+ await this.serveCommand.execute(options);
128
+ });
129
+ // Build command
130
+ this.program
131
+ .command('build')
132
+ .description('Build application for production')
133
+ .action(async () => {
134
+ await this.buildCommand.execute();
135
+ });
136
+ // Migrate commands
137
+ const migrate = this.program
138
+ .command('migrate')
139
+ .alias('migration')
140
+ .description('Database migration commands');
141
+ migrate
142
+ .command('run')
143
+ .description('Run pending migrations')
144
+ .action(async () => {
145
+ await this.migrateCommand.execute('run');
146
+ });
147
+ migrate
148
+ .command('generate')
149
+ .alias('create')
150
+ .description('Generate a new migration')
151
+ .action(async () => {
152
+ await this.migrateCommand.execute('generate');
153
+ });
154
+ migrate
155
+ .command('revert')
156
+ .description('Revert last migration')
157
+ .action(async () => {
158
+ await this.migrateCommand.execute('revert');
159
+ });
160
+ migrate
161
+ .command('show')
162
+ .alias('status')
163
+ .description('Show migration status')
164
+ .action(async () => {
165
+ await this.migrateCommand.execute('show');
166
+ });
167
+ // Info command
168
+ this.program
169
+ .command('info')
170
+ .description('Display Fragment CLI information')
171
+ .action(() => {
172
+ logger_1.CLILogger.box('Fragment Framework CLI', [
173
+ 'Version: 1.0.0',
174
+ 'TypeScript Backend Framework',
175
+ 'OOP + Decorators + DI',
176
+ '',
177
+ 'Documentation: https://fragment-framework.dev',
178
+ 'Repository: https://github.com/fragment/framework'
179
+ ]);
180
+ });
181
+ }
182
+ run(args) {
183
+ this.program.parse(['node', 'frg', ...args]);
184
+ }
185
+ }
186
+ exports.CLI = CLI;
@@ -0,0 +1,3 @@
1
+ export declare class BuildCommand {
2
+ execute(): Promise<void>;
3
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BuildCommand = void 0;
4
+ const child_process_1 = require("child_process");
5
+ const logger_1 = require("../utils/logger");
6
+ class BuildCommand {
7
+ async execute() {
8
+ logger_1.CLILogger.title('🔨 Building Fragment Application');
9
+ const spinner = logger_1.CLILogger.spinner('Compiling TypeScript...');
10
+ try {
11
+ (0, child_process_1.execSync)('tsc', { stdio: 'pipe' });
12
+ spinner.succeed('Build completed successfully');
13
+ logger_1.CLILogger.success('Output directory: ./dist');
14
+ logger_1.CLILogger.info('Run "node dist/server.js" to start the production server');
15
+ }
16
+ catch (error) {
17
+ spinner.fail('Build failed');
18
+ logger_1.CLILogger.error(error.message);
19
+ process.exit(1);
20
+ }
21
+ }
22
+ }
23
+ exports.BuildCommand = BuildCommand;
@@ -0,0 +1,6 @@
1
+ export declare class ConfigCommand {
2
+ execute(target: string): Promise<void>;
3
+ private configureAI;
4
+ private configureDatabase;
5
+ private showConfig;
6
+ }