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.
- package/.env.example +0 -0
- package/base.ts +1810 -0
- package/base2.ts +968 -0
- package/bin/frg.ts +5 -0
- package/config/fragment.lock.yaml +0 -0
- package/config/fragment.yaml +0 -0
- package/dist/app.d.ts +15 -0
- package/dist/app.js +90 -0
- package/dist/auth/auth.controller.d.ts +10 -0
- package/dist/auth/auth.controller.js +87 -0
- package/dist/auth/auth.middleware.d.ts +2 -0
- package/dist/auth/auth.middleware.js +24 -0
- package/dist/auth/auth.service.d.ts +20 -0
- package/dist/auth/auth.service.js +143 -0
- package/dist/auth/dto/login.dto.d.ts +9 -0
- package/dist/auth/dto/login.dto.js +2 -0
- package/dist/cli/cli.d.ts +12 -0
- package/dist/cli/cli.js +186 -0
- package/dist/cli/commands/build.command.d.ts +3 -0
- package/dist/cli/commands/build.command.js +23 -0
- package/dist/cli/commands/config.command.d.ts +6 -0
- package/dist/cli/commands/config.command.js +284 -0
- package/dist/cli/commands/generate.command.d.ts +8 -0
- package/dist/cli/commands/generate.command.js +180 -0
- package/dist/cli/commands/init.command.d.ts +7 -0
- package/dist/cli/commands/init.command.js +380 -0
- package/dist/cli/commands/migrate.command.d.ts +7 -0
- package/dist/cli/commands/migrate.command.js +116 -0
- package/dist/cli/commands/serve.command.d.ts +6 -0
- package/dist/cli/commands/serve.command.js +31 -0
- package/dist/cli/templates/controller.template.d.ts +1 -0
- package/dist/cli/templates/controller.template.js +52 -0
- package/dist/cli/templates/entity.template.d.ts +1 -0
- package/dist/cli/templates/entity.template.js +23 -0
- package/dist/cli/templates/repository.template.d.ts +1 -0
- package/dist/cli/templates/repository.template.js +43 -0
- package/dist/cli/templates/service.template.d.ts +1 -0
- package/dist/cli/templates/service.template.js +43 -0
- package/dist/cli/utils/file-generator.d.ts +9 -0
- package/dist/cli/utils/file-generator.js +67 -0
- package/dist/cli/utils/logger.d.ts +14 -0
- package/dist/cli/utils/logger.js +49 -0
- package/dist/controllers/health.controller.d.ts +13 -0
- package/dist/controllers/health.controller.js +50 -0
- package/dist/core/config/config-loader.d.ts +31 -0
- package/dist/core/config/config-loader.js +98 -0
- package/dist/core/container/di-container.d.ts +9 -0
- package/dist/core/container/di-container.js +37 -0
- package/dist/core/decorators/auth-guard.decorator.d.ts +3 -0
- package/dist/core/decorators/auth-guard.decorator.js +18 -0
- package/dist/core/decorators/autowire.decorator.d.ts +3 -0
- package/dist/core/decorators/autowire.decorator.js +17 -0
- package/dist/core/decorators/controller.decorator.d.ts +4 -0
- package/dist/core/decorators/controller.decorator.js +16 -0
- package/dist/core/decorators/injectable.decorator.d.ts +3 -0
- package/dist/core/decorators/injectable.decorator.js +14 -0
- package/dist/core/decorators/middleware.decorator.d.ts +3 -0
- package/dist/core/decorators/middleware.decorator.js +20 -0
- package/dist/core/decorators/repository.decorator.d.ts +1 -0
- package/dist/core/decorators/repository.decorator.js +7 -0
- package/dist/core/decorators/route.decorator.d.ts +14 -0
- package/dist/core/decorators/route.decorator.js +32 -0
- package/dist/core/decorators/service.decorator.d.ts +1 -0
- package/dist/core/decorators/service.decorator.js +7 -0
- package/dist/core/openai/openai-client.d.ts +12 -0
- package/dist/core/openai/openai-client.js +93 -0
- package/dist/database/data-source.d.ts +4 -0
- package/dist/database/data-source.js +26 -0
- package/dist/entities/session.entity.d.ts +9 -0
- package/dist/entities/session.entity.js +45 -0
- package/dist/entities/user.entity.d.ts +10 -0
- package/dist/entities/user.entity.js +48 -0
- package/dist/middlewares/logging.middleware.d.ts +2 -0
- package/dist/middlewares/logging.middleware.js +28 -0
- package/dist/repositories/session.repository.d.ts +9 -0
- package/dist/repositories/session.repository.js +50 -0
- package/dist/repositories/user.repository.d.ts +10 -0
- package/dist/repositories/user.repository.js +43 -0
- package/dist/server.d.ts +1 -0
- package/dist/server.js +30 -0
- package/dist/services/health.service.d.ts +13 -0
- package/dist/services/health.service.js +44 -0
- package/package.json +46 -0
- package/readme.md +120 -0
- package/src/app.ts +121 -0
- package/src/auth/auth.controller.ts +52 -0
- package/src/auth/auth.middleware.ts +27 -0
- package/src/auth/auth.service.ts +110 -0
- package/src/auth/dto/login.dto.ts +11 -0
- package/src/cli/cli.ts +212 -0
- package/src/cli/commands/build.command.ts +24 -0
- package/src/cli/commands/config.command.ts +280 -0
- package/src/cli/commands/generate.command.ts +170 -0
- package/src/cli/commands/init.command.ts +395 -0
- package/src/cli/commands/migrate.command.ts +118 -0
- package/src/cli/commands/serve.command.ts +37 -0
- package/src/cli/templates/controller.template.ts +51 -0
- package/src/cli/templates/entity.template.ts +22 -0
- package/src/cli/templates/repository.template.ts +42 -0
- package/src/cli/templates/service.template.ts +42 -0
- package/src/cli/utils/file-generator.ts +37 -0
- package/src/cli/utils/logger.ts +52 -0
- package/src/controllers/health.controller.ts +24 -0
- package/src/core/config/config-loader.ts +98 -0
- package/src/core/container/di-container.ts +43 -0
- package/src/core/decorators/auth-guard.decorator.ts +15 -0
- package/src/core/decorators/autowire.decorator.ts +18 -0
- package/src/core/decorators/controller.decorator.ts +15 -0
- package/src/core/decorators/injectable.decorator.ts +13 -0
- package/src/core/decorators/middleware.decorator.ts +18 -0
- package/src/core/decorators/repository.decorator.ts +6 -0
- package/src/core/decorators/route.decorator.ts +33 -0
- package/src/core/decorators/service.decorator.ts +6 -0
- package/src/core/openai/openai-client.ts +99 -0
- package/src/database/data-source.ts +29 -0
- package/src/entities/session.entity.ts +25 -0
- package/src/entities/user.entity.ts +27 -0
- package/src/middlewares/logging.middleware.ts +28 -0
- package/src/repositories/session.repository.ts +42 -0
- package/src/repositories/user.repository.ts +37 -0
- package/src/server.ts +32 -0
- package/src/services/health.service.ts +29 -0
- package/tsconfig.json +20 -0
package/bin/frg.ts
ADDED
|
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,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,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
|
+
}
|
package/dist/cli/cli.js
ADDED
|
@@ -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,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;
|