bootifyjs 0.1.1 → 1.1.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/dist/api.d.ts +8 -27
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +68 -134
- package/dist/api.js.map +1 -1
- package/dist/cache/bootstrap.d.ts +6 -0
- package/dist/cache/bootstrap.d.ts.map +1 -0
- package/dist/cache/bootstrap.js +23 -0
- package/dist/cache/bootstrap.js.map +1 -0
- package/dist/cache/cache.service.d.ts +9 -0
- package/dist/cache/cache.service.d.ts.map +1 -0
- package/dist/cache/cache.service.js +40 -0
- package/dist/cache/cache.service.js.map +1 -0
- package/dist/cache/cache.types.d.ts +14 -0
- package/dist/cache/cache.types.d.ts.map +1 -0
- package/dist/cache/cache.types.js +8 -0
- package/dist/cache/cache.types.js.map +1 -0
- package/dist/cache/decorators.d.ts +12 -0
- package/dist/cache/decorators.d.ts.map +1 -0
- package/dist/cache/decorators.js +53 -0
- package/dist/cache/decorators.js.map +1 -0
- package/dist/cache/in-memory-cache.store.d.ts +8 -0
- package/dist/cache/in-memory-cache.store.d.ts.map +1 -0
- package/dist/cache/in-memory-cache.store.js +39 -0
- package/dist/cache/in-memory-cache.store.js.map +1 -0
- package/dist/cache/index.d.ts +5 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +21 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/core/component-registry.d.ts +7 -0
- package/dist/core/component-registry.d.ts.map +1 -0
- package/dist/core/component-registry.js +9 -0
- package/dist/core/component-registry.js.map +1 -0
- package/dist/core/decorators.d.ts +38 -22
- package/dist/core/decorators.d.ts.map +1 -0
- package/dist/core/decorators.js +155 -174
- package/dist/core/decorators.js.map +1 -1
- package/dist/core/di-container.d.ts +31 -0
- package/dist/core/di-container.d.ts.map +1 -0
- package/dist/core/di-container.js +219 -0
- package/dist/core/di-container.js.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +21 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/request-context.service.d.ts +24 -0
- package/dist/core/request-context.service.d.ts.map +1 -0
- package/dist/core/request-context.service.js +52 -0
- package/dist/core/request-context.service.js.map +1 -0
- package/dist/core/router.d.ts +4 -32
- package/dist/core/router.d.ts.map +1 -0
- package/dist/core/router.js +81 -258
- package/dist/core/router.js.map +1 -1
- package/dist/events/bootstrap.d.ts +8 -0
- package/dist/events/bootstrap.d.ts.map +1 -0
- package/dist/events/bootstrap.js +37 -0
- package/dist/events/bootstrap.js.map +1 -0
- package/dist/events/decorators.d.ts +16 -0
- package/dist/events/decorators.d.ts.map +1 -0
- package/dist/events/decorators.js +37 -0
- package/dist/events/decorators.js.map +1 -0
- package/dist/events/event-bus.service.d.ts +21 -0
- package/dist/events/event-bus.service.d.ts.map +1 -0
- package/dist/events/event-bus.service.js +78 -0
- package/dist/events/event-bus.service.js.map +1 -0
- package/dist/events/event.types.d.ts +17 -0
- package/dist/events/event.types.d.ts.map +1 -0
- package/dist/events/event.types.js.map +1 -0
- package/dist/events/index.d.ts +5 -13
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +4 -54
- package/dist/events/index.js.map +1 -1
- package/dist/examples/controllers/health.controller.d.ts +7 -0
- package/dist/examples/controllers/health.controller.d.ts.map +1 -0
- package/dist/{events/examples/system.events.js → examples/controllers/health.controller.js} +16 -15
- package/dist/examples/controllers/health.controller.js.map +1 -0
- package/dist/examples/controllers/todo.controller.d.ts +31 -0
- package/dist/examples/controllers/todo.controller.d.ts.map +1 -0
- package/dist/examples/controllers/todo.controller.js +102 -0
- package/dist/examples/controllers/todo.controller.js.map +1 -0
- package/dist/examples/events/TodoEventHandler.d.ts +2 -0
- package/dist/examples/events/TodoEventHandler.d.ts.map +1 -0
- package/dist/examples/events/TodoEventHandler.js +31 -0
- package/dist/examples/events/TodoEventHandler.js.map +1 -0
- package/dist/examples/events/todo.events.d.ts +16 -0
- package/dist/examples/events/todo.events.d.ts.map +1 -0
- package/dist/examples/events/todo.events.js +13 -0
- package/dist/examples/events/todo.events.js.map +1 -0
- package/dist/examples/index.d.ts +2 -0
- package/dist/examples/index.d.ts.map +1 -0
- package/dist/examples/index.js +35 -0
- package/dist/examples/index.js.map +1 -0
- package/dist/examples/repositories/todo.repository.d.ts +20 -0
- package/dist/examples/repositories/todo.repository.d.ts.map +1 -0
- package/dist/examples/repositories/todo.repository.js +33 -0
- package/dist/examples/repositories/todo.repository.js.map +1 -0
- package/dist/examples/services/todo.service.d.ts +33 -0
- package/dist/examples/services/todo.service.d.ts.map +1 -0
- package/dist/examples/services/todo.service.js +80 -0
- package/dist/examples/services/todo.service.js.map +1 -0
- package/dist/examples/todos/schema.d.ts +54 -0
- package/dist/examples/todos/schema.d.ts.map +1 -0
- package/dist/examples/todos/schema.js +20 -0
- package/dist/examples/todos/schema.js.map +1 -0
- package/dist/index.d.ts +7 -17
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +20 -95
- package/dist/index.js.map +1 -1
- package/dist/logging/config/logging.config.d.ts +31 -3
- package/dist/logging/config/logging.config.d.ts.map +1 -0
- package/dist/logging/config/logging.config.js +43 -93
- package/dist/logging/config/logging.config.js.map +1 -1
- package/dist/logging/core/decorators.d.ts +16 -0
- package/dist/logging/core/decorators.d.ts.map +1 -0
- package/dist/logging/core/decorators.js +74 -0
- package/dist/logging/core/decorators.js.map +1 -0
- package/dist/logging/core/logger.provider.d.ts +4 -0
- package/dist/logging/core/logger.provider.d.ts.map +1 -0
- package/dist/logging/core/logger.provider.js +68 -0
- package/dist/logging/core/logger.provider.js.map +1 -0
- package/dist/logging/core/logger.service.d.ts +9 -27
- package/dist/logging/core/logger.service.d.ts.map +1 -0
- package/dist/logging/core/logger.service.js +34 -164
- package/dist/logging/core/logger.service.js.map +1 -1
- package/dist/logging/core/{startup-logger.service.d.ts → startup.logger.d.ts} +4 -6
- package/dist/logging/core/startup.logger.d.ts.map +1 -0
- package/dist/logging/core/{startup-logger.service.js → startup.logger.js} +36 -42
- package/dist/logging/core/startup.logger.js.map +1 -0
- package/dist/logging/index.d.ts +7 -14
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +17 -28
- package/dist/logging/index.js.map +1 -1
- package/dist/middleware/auth.middleware.d.ts +3 -0
- package/dist/middleware/auth.middleware.d.ts.map +1 -0
- package/dist/middleware/auth.middleware.js +18 -0
- package/dist/middleware/auth.middleware.js.map +1 -0
- package/dist/middleware/context.middleware.d.ts +7 -0
- package/dist/middleware/context.middleware.d.ts.map +1 -0
- package/dist/middleware/context.middleware.js +25 -0
- package/dist/middleware/context.middleware.js.map +1 -0
- package/dist/middleware/index.d.ts +4 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +20 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/request-logger.middleware.d.ts +4 -0
- package/dist/middleware/request-logger.middleware.d.ts.map +1 -0
- package/dist/middleware/request-logger.middleware.js +18 -0
- package/dist/middleware/request-logger.middleware.js.map +1 -0
- package/package.json +52 -47
- package/LICENSE +0 -21
- package/README.md +0 -423
- package/dist/config/app.config.d.ts +0 -29
- package/dist/config/app.config.js +0 -55
- package/dist/config/app.config.js.map +0 -1
- package/dist/controllers/config.controller.d.ts +0 -16
- package/dist/controllers/config.controller.js +0 -66
- package/dist/controllers/config.controller.js.map +0 -1
- package/dist/controllers/events.controller.d.ts +0 -66
- package/dist/controllers/events.controller.js +0 -145
- package/dist/controllers/events.controller.js.map +0 -1
- package/dist/controllers/health.controller.d.ts +0 -20
- package/dist/controllers/health.controller.js +0 -92
- package/dist/controllers/health.controller.js.map +0 -1
- package/dist/controllers/user.controller.d.ts +0 -13
- package/dist/controllers/user.controller.js +0 -209
- package/dist/controllers/user.controller.js.map +0 -1
- package/dist/core/application.d.ts +0 -21
- package/dist/core/application.js +0 -90
- package/dist/core/application.js.map +0 -1
- package/dist/core/config.d.ts +0 -3
- package/dist/core/config.js +0 -78
- package/dist/core/config.js.map +0 -1
- package/dist/core/container.d.ts +0 -17
- package/dist/core/container.js +0 -92
- package/dist/core/container.js.map +0 -1
- package/dist/core/errors.d.ts +0 -18
- package/dist/core/errors.js +0 -74
- package/dist/core/errors.js.map +0 -1
- package/dist/core/middleware.d.ts +0 -8
- package/dist/core/middleware.js +0 -23
- package/dist/core/middleware.js.map +0 -1
- package/dist/core/openapi.d.ts +0 -80
- package/dist/core/openapi.js +0 -189
- package/dist/core/openapi.js.map +0 -1
- package/dist/core/utils.d.ts +0 -7
- package/dist/core/utils.js +0 -75
- package/dist/core/utils.js.map +0 -1
- package/dist/core/validation.d.ts +0 -15
- package/dist/core/validation.js +0 -161
- package/dist/core/validation.js.map +0 -1
- package/dist/events/core/event-bus.d.ts +0 -26
- package/dist/events/core/event-bus.js +0 -253
- package/dist/events/core/event-bus.js.map +0 -1
- package/dist/events/core/event-registry.d.ts +0 -31
- package/dist/events/core/event-registry.js +0 -170
- package/dist/events/core/event-registry.js.map +0 -1
- package/dist/events/decorators/event.decorators.d.ts +0 -11
- package/dist/events/decorators/event.decorators.js +0 -123
- package/dist/events/decorators/event.decorators.js.map +0 -1
- package/dist/events/examples/system.events.d.ts +0 -15
- package/dist/events/examples/system.events.js.map +0 -1
- package/dist/events/examples/user.events.d.ts +0 -68
- package/dist/events/examples/user.events.js +0 -73
- package/dist/events/examples/user.events.js.map +0 -1
- package/dist/events/examples/user.handlers.d.ts +0 -20
- package/dist/events/examples/user.handlers.js +0 -157
- package/dist/events/examples/user.handlers.js.map +0 -1
- package/dist/events/middleware/logging.middleware.d.ts +0 -7
- package/dist/events/middleware/logging.middleware.js +0 -44
- package/dist/events/middleware/logging.middleware.js.map +0 -1
- package/dist/events/middleware/metrics.middleware.d.ts +0 -11
- package/dist/events/middleware/metrics.middleware.js +0 -87
- package/dist/events/middleware/metrics.middleware.js.map +0 -1
- package/dist/events/middleware/validation.middleware.d.ts +0 -8
- package/dist/events/middleware/validation.middleware.js +0 -63
- package/dist/events/middleware/validation.middleware.js.map +0 -1
- package/dist/events/store/memory-event-store.d.ts +0 -21
- package/dist/events/store/memory-event-store.js +0 -81
- package/dist/events/store/memory-event-store.js.map +0 -1
- package/dist/events/types/event.types.d.ts +0 -57
- package/dist/events/types/event.types.js.map +0 -1
- package/dist/examples/basic-api.d.ts +0 -1
- package/dist/examples/basic-api.js +0 -120
- package/dist/examples/basic-api.js.map +0 -1
- package/dist/logging/core/log-context.service.d.ts +0 -11
- package/dist/logging/core/log-context.service.js +0 -40
- package/dist/logging/core/log-context.service.js.map +0 -1
- package/dist/logging/core/startup-logger.service.js.map +0 -1
- package/dist/logging/decorators/log.decorator.d.ts +0 -11
- package/dist/logging/decorators/log.decorator.js +0 -80
- package/dist/logging/decorators/log.decorator.js.map +0 -1
- package/dist/logging/middleware/context.middleware.d.ts +0 -2
- package/dist/logging/middleware/context.middleware.js +0 -29
- package/dist/logging/middleware/context.middleware.js.map +0 -1
- package/dist/logging/middleware/request-logging.middleware.d.ts +0 -3
- package/dist/logging/middleware/request-logging.middleware.js +0 -78
- package/dist/logging/middleware/request-logging.middleware.js.map +0 -1
- package/dist/logging/types/logging.types.d.ts +0 -79
- package/dist/logging/types/logging.types.js +0 -3
- package/dist/logging/types/logging.types.js.map +0 -1
- package/dist/middlewares/auth.middleware.d.ts +0 -2
- package/dist/middlewares/auth.middleware.js +0 -20
- package/dist/middlewares/auth.middleware.js.map +0 -1
- package/dist/middlewares/cors.middleware.d.ts +0 -2
- package/dist/middlewares/cors.middleware.js +0 -16
- package/dist/middlewares/cors.middleware.js.map +0 -1
- package/dist/middlewares/swagger.middleware.d.ts +0 -6
- package/dist/middlewares/swagger.middleware.js +0 -84
- package/dist/middlewares/swagger.middleware.js.map +0 -1
- package/dist/repositories/user.repository.d.ts +0 -16
- package/dist/repositories/user.repository.js +0 -110
- package/dist/repositories/user.repository.js.map +0 -1
- package/dist/schemas/user.schemas.d.ts +0 -214
- package/dist/schemas/user.schemas.js +0 -71
- package/dist/schemas/user.schemas.js.map +0 -1
- package/dist/services/config-demo.service.d.ts +0 -10
- package/dist/services/config-demo.service.js +0 -88
- package/dist/services/config-demo.service.js.map +0 -1
- package/dist/services/user.service.d.ts +0 -21
- package/dist/services/user.service.js +0 -201
- package/dist/services/user.service.js.map +0 -1
- /package/dist/events/{types/event.types.js → event.types.js} +0 -0
package/README.md
DELETED
@@ -1,423 +0,0 @@
|
|
1
|
-
# BootifyJS
|
2
|
-
|
3
|
-
A Spring Boot inspired Node.js framework with TypeScript, Dependency Injection, and Validation.
|
4
|
-
|
5
|
-
## Features
|
6
|
-
|
7
|
-
- **Dependency Injection**: Automatic constructor injection with `@Injectable`, `@Service`, and `@Repository` decorators
|
8
|
-
- **REST API**: Easy controller definition with `@Controller`, `@Get`, `@Post`, etc.
|
9
|
-
- **Validation**: Request validation with Zod schemas
|
10
|
-
- **Configuration**: Environment-based configuration with automatic mapping
|
11
|
-
- **OpenAPI**: Automatic OpenAPI documentation generation
|
12
|
-
- **Logging**: Comprehensive logging system with context tracking
|
13
|
-
- **Event System**: Type-safe event system with middleware support
|
14
|
-
|
15
|
-
## Installation
|
16
|
-
|
17
|
-
```bash
|
18
|
-
npm install bootifyjs
|
19
|
-
```
|
20
|
-
|
21
|
-
## Quick Start
|
22
|
-
|
23
|
-
```typescript
|
24
|
-
import { createBootifyApp, Controller, Get, Service } from 'bootifyjs';
|
25
|
-
|
26
|
-
@Service()
|
27
|
-
class GreetingService {
|
28
|
-
getGreeting(name: string) {
|
29
|
-
return `Hello, ${name}!`;
|
30
|
-
}
|
31
|
-
}
|
32
|
-
|
33
|
-
@Controller('/api')
|
34
|
-
class GreetingController {
|
35
|
-
constructor(private greetingService: GreetingService) {}
|
36
|
-
|
37
|
-
@Get('/hello')
|
38
|
-
sayHello() {
|
39
|
-
return { message: this.greetingService.getGreeting('World') };
|
40
|
-
}
|
41
|
-
}
|
42
|
-
|
43
|
-
async function main() {
|
44
|
-
const { start } = await createBootifyApp({
|
45
|
-
port: 3000,
|
46
|
-
controllers: [GreetingController],
|
47
|
-
enableSwagger: true
|
48
|
-
});
|
49
|
-
|
50
|
-
await start();
|
51
|
-
console.log('Server running at http://localhost:3000');
|
52
|
-
}
|
53
|
-
|
54
|
-
main().catch(console.error);
|
55
|
-
```
|
56
|
-
|
57
|
-
## Core Concepts
|
58
|
-
|
59
|
-
### Controllers
|
60
|
-
|
61
|
-
Controllers handle HTTP requests and define your API endpoints.
|
62
|
-
|
63
|
-
```typescript
|
64
|
-
import { Controller, Get, Post, Put, Delete, Param, Body, Query } from 'bootifyjs';
|
65
|
-
|
66
|
-
@Controller('/users')
|
67
|
-
export class UserController {
|
68
|
-
constructor(private userService: UserService) {}
|
69
|
-
|
70
|
-
@Get('/')
|
71
|
-
getAllUsers(@Query('limit') limit?: string) {
|
72
|
-
return this.userService.getAllUsers(limit ? parseInt(limit) : undefined);
|
73
|
-
}
|
74
|
-
|
75
|
-
@Get('/:id')
|
76
|
-
getUserById(@Param('id') id: string) {
|
77
|
-
return this.userService.getUserById(id);
|
78
|
-
}
|
79
|
-
|
80
|
-
@Post('/')
|
81
|
-
createUser(@Body() userData: CreateUserDto) {
|
82
|
-
return this.userService.createUser(userData);
|
83
|
-
}
|
84
|
-
|
85
|
-
@Put('/:id')
|
86
|
-
updateUser(@Param('id') id: string, @Body() userData: UpdateUserDto) {
|
87
|
-
return this.userService.updateUser(id, userData);
|
88
|
-
}
|
89
|
-
|
90
|
-
@Delete('/:id')
|
91
|
-
deleteUser(@Param('id') id: string) {
|
92
|
-
return this.userService.deleteUser(id);
|
93
|
-
}
|
94
|
-
}
|
95
|
-
```
|
96
|
-
|
97
|
-
### Services
|
98
|
-
|
99
|
-
Services contain your business logic and can be injected into controllers or other services.
|
100
|
-
|
101
|
-
```typescript
|
102
|
-
import { Service } from 'bootifyjs';
|
103
|
-
|
104
|
-
@Service()
|
105
|
-
export class UserService {
|
106
|
-
constructor(private userRepository: UserRepository) {}
|
107
|
-
|
108
|
-
getAllUsers(limit?: number) {
|
109
|
-
return this.userRepository.findAll(limit);
|
110
|
-
}
|
111
|
-
|
112
|
-
getUserById(id: string) {
|
113
|
-
return this.userRepository.findById(id);
|
114
|
-
}
|
115
|
-
|
116
|
-
// More methods...
|
117
|
-
}
|
118
|
-
```
|
119
|
-
|
120
|
-
### Repositories
|
121
|
-
|
122
|
-
Repositories handle data access and can be injected into services.
|
123
|
-
|
124
|
-
```typescript
|
125
|
-
import { Repository } from 'bootifyjs';
|
126
|
-
|
127
|
-
@Repository()
|
128
|
-
export class UserRepository {
|
129
|
-
private users = []; // In a real app, this would be a database connection
|
130
|
-
|
131
|
-
findAll(limit?: number) {
|
132
|
-
if (limit) {
|
133
|
-
return this.users.slice(0, limit);
|
134
|
-
}
|
135
|
-
return this.users;
|
136
|
-
}
|
137
|
-
|
138
|
-
findById(id: string) {
|
139
|
-
return this.users.find(user => user.id === id);
|
140
|
-
}
|
141
|
-
|
142
|
-
// More methods...
|
143
|
-
}
|
144
|
-
```
|
145
|
-
|
146
|
-
### Validation
|
147
|
-
|
148
|
-
Use Zod schemas to validate request data.
|
149
|
-
|
150
|
-
```typescript
|
151
|
-
import { z } from 'zod';
|
152
|
-
import { Controller, Post, Body, ValidateBody } from 'bootifyjs';
|
153
|
-
|
154
|
-
const createUserSchema = z.object({
|
155
|
-
email: z.string().email(),
|
156
|
-
name: z.string().min(2).max(100),
|
157
|
-
age: z.number().min(18).optional()
|
158
|
-
});
|
159
|
-
|
160
|
-
@Controller('/users')
|
161
|
-
export class UserController {
|
162
|
-
@Post('/')
|
163
|
-
@ValidateBody(createUserSchema)
|
164
|
-
createUser(@Body() userData: z.infer<typeof createUserSchema>) {
|
165
|
-
// userData is now validated and typed
|
166
|
-
return this.userService.createUser(userData);
|
167
|
-
}
|
168
|
-
}
|
169
|
-
```
|
170
|
-
|
171
|
-
### Configuration
|
172
|
-
|
173
|
-
Define your configuration structure and automatically map environment variables.
|
174
|
-
|
175
|
-
```typescript
|
176
|
-
import { Config, getConfigInstance } from 'bootifyjs';
|
177
|
-
|
178
|
-
@Config('APP')
|
179
|
-
export class AppConfig {
|
180
|
-
SERVICE_NAME: string = 'my-service';
|
181
|
-
|
182
|
-
server: {
|
183
|
-
port: number;
|
184
|
-
host: string;
|
185
|
-
} = {
|
186
|
-
port: 3000,
|
187
|
-
host: 'localhost'
|
188
|
-
};
|
189
|
-
|
190
|
-
database: {
|
191
|
-
url: string;
|
192
|
-
poolSize: number;
|
193
|
-
} = {
|
194
|
-
url: 'postgres://localhost:5432/mydb',
|
195
|
-
poolSize: 10
|
196
|
-
};
|
197
|
-
}
|
198
|
-
|
199
|
-
// Environment variables like APP_SERVER_PORT=8080 will be automatically mapped
|
200
|
-
const config = getConfigInstance(AppConfig);
|
201
|
-
console.log(config.server.port); // 8080
|
202
|
-
```
|
203
|
-
|
204
|
-
### Event System
|
205
|
-
|
206
|
-
Create a type-safe event system for decoupled communication.
|
207
|
-
|
208
|
-
```typescript
|
209
|
-
import { Event, EventEmitter, EventListener, EventHandler } from 'bootifyjs';
|
210
|
-
|
211
|
-
// Define an event
|
212
|
-
@Event('user.created')
|
213
|
-
class UserCreatedEvent {
|
214
|
-
id: string;
|
215
|
-
email: string;
|
216
|
-
timestamp: Date = new Date();
|
217
|
-
}
|
218
|
-
|
219
|
-
// Emit events from services
|
220
|
-
@Service()
|
221
|
-
@EventEmitter()
|
222
|
-
class UserService {
|
223
|
-
private eventBus; // Injected by @EventEmitter
|
224
|
-
|
225
|
-
async createUser(userData) {
|
226
|
-
const user = await this.userRepository.create(userData);
|
227
|
-
|
228
|
-
// Emit event
|
229
|
-
await this.eventBus.emit('user.created', {
|
230
|
-
id: user.id,
|
231
|
-
email: user.email
|
232
|
-
});
|
233
|
-
|
234
|
-
return user;
|
235
|
-
}
|
236
|
-
}
|
237
|
-
|
238
|
-
// Handle events
|
239
|
-
@EventListener()
|
240
|
-
class UserEventHandlers {
|
241
|
-
@EventHandler('user.created')
|
242
|
-
async onUserCreated(event: UserCreatedEvent) {
|
243
|
-
console.log(`User created: ${event.email}`);
|
244
|
-
// Send welcome email, update analytics, etc.
|
245
|
-
}
|
246
|
-
}
|
247
|
-
```
|
248
|
-
|
249
|
-
### Logging
|
250
|
-
|
251
|
-
Comprehensive logging system with context tracking.
|
252
|
-
|
253
|
-
```typescript
|
254
|
-
import { Logger, Log } from 'bootifyjs';
|
255
|
-
|
256
|
-
@Service()
|
257
|
-
@Logger('UserService')
|
258
|
-
export class UserService {
|
259
|
-
private logger; // Injected by @Logger
|
260
|
-
|
261
|
-
@Log({ logArgs: true, logDuration: true })
|
262
|
-
async createUser(userData) {
|
263
|
-
this.logger.info('Creating new user', { email: userData.email });
|
264
|
-
|
265
|
-
// Business logic...
|
266
|
-
|
267
|
-
this.logger.info('User created successfully');
|
268
|
-
return user;
|
269
|
-
}
|
270
|
-
}
|
271
|
-
```
|
272
|
-
|
273
|
-
## Bootstrapping Your Application
|
274
|
-
|
275
|
-
There are two ways to bootstrap your application:
|
276
|
-
|
277
|
-
### 1. Using createBootifyApp (Recommended)
|
278
|
-
|
279
|
-
```typescript
|
280
|
-
import { createBootifyApp } from 'bootifyjs';
|
281
|
-
import { UserController } from './controllers/user.controller';
|
282
|
-
|
283
|
-
async function main() {
|
284
|
-
const { app, start, stop } = await createBootifyApp({
|
285
|
-
port: 3000,
|
286
|
-
controllers: [UserController],
|
287
|
-
enableSwagger: true,
|
288
|
-
enableCors: true
|
289
|
-
});
|
290
|
-
|
291
|
-
await start();
|
292
|
-
console.log('Server running at http://localhost:3000');
|
293
|
-
console.log('API docs available at http://localhost:3000/api-docs');
|
294
|
-
}
|
295
|
-
|
296
|
-
main().catch(console.error);
|
297
|
-
```
|
298
|
-
|
299
|
-
### 2. Manual Bootstrap
|
300
|
-
|
301
|
-
```typescript
|
302
|
-
import {
|
303
|
-
Application,
|
304
|
-
configureLogging,
|
305
|
-
configureEventSystem,
|
306
|
-
corsMiddleware,
|
307
|
-
contextMiddleware,
|
308
|
-
createRequestLoggingMiddleware,
|
309
|
-
swaggerMiddleware,
|
310
|
-
OpenAPIGenerator
|
311
|
-
} from 'bootifyjs';
|
312
|
-
import { UserController } from './controllers/user.controller';
|
313
|
-
|
314
|
-
async function bootstrap() {
|
315
|
-
// Initialize logging
|
316
|
-
const { logger, startupLogger } = configureLogging();
|
317
|
-
|
318
|
-
// Initialize event system
|
319
|
-
const eventBus = configureEventSystem();
|
320
|
-
|
321
|
-
// Generate OpenAPI documentation
|
322
|
-
const openApiGenerator = new OpenAPIGenerator({
|
323
|
-
title: 'My API',
|
324
|
-
version: '1.0.0',
|
325
|
-
description: 'My API description'
|
326
|
-
});
|
327
|
-
|
328
|
-
const controllers = [UserController];
|
329
|
-
openApiGenerator.addControllers(controllers);
|
330
|
-
const openApiSpec = openApiGenerator.getSpec();
|
331
|
-
|
332
|
-
// Create application
|
333
|
-
const app = new Application({
|
334
|
-
controllers,
|
335
|
-
middlewares: [
|
336
|
-
contextMiddleware,
|
337
|
-
corsMiddleware,
|
338
|
-
createRequestLoggingMiddleware(),
|
339
|
-
swaggerMiddleware(openApiSpec)
|
340
|
-
],
|
341
|
-
port: 3000,
|
342
|
-
hostname: 'localhost'
|
343
|
-
});
|
344
|
-
|
345
|
-
await app.start();
|
346
|
-
logger.info('Server started');
|
347
|
-
}
|
348
|
-
|
349
|
-
bootstrap().catch(console.error);
|
350
|
-
```
|
351
|
-
|
352
|
-
## Middleware
|
353
|
-
|
354
|
-
Create custom middleware to handle cross-cutting concerns.
|
355
|
-
|
356
|
-
```typescript
|
357
|
-
import { Middleware } from 'bootifyjs';
|
358
|
-
|
359
|
-
export const loggingMiddleware: Middleware = async (req, res, next) => {
|
360
|
-
const start = Date.now();
|
361
|
-
console.log(`${req.method} ${req.url} - Request started`);
|
362
|
-
|
363
|
-
await next();
|
364
|
-
|
365
|
-
const duration = Date.now() - start;
|
366
|
-
console.log(`${req.method} ${req.url} - Request completed in ${duration}ms`);
|
367
|
-
};
|
368
|
-
```
|
369
|
-
|
370
|
-
## OpenAPI Documentation
|
371
|
-
|
372
|
-
BootifyJS automatically generates OpenAPI documentation for your API.
|
373
|
-
|
374
|
-
```typescript
|
375
|
-
import { Controller, Get, ApiTags, ApiOperation, ApiResponse } from 'bootifyjs';
|
376
|
-
|
377
|
-
@Controller('/health')
|
378
|
-
@ApiTags('Health')
|
379
|
-
export class HealthController {
|
380
|
-
@Get('/')
|
381
|
-
@ApiOperation({
|
382
|
-
summary: 'Health check',
|
383
|
-
description: 'Check if the API is running'
|
384
|
-
})
|
385
|
-
@ApiResponse(200, {
|
386
|
-
description: 'API is healthy',
|
387
|
-
schema: healthResponseSchema
|
388
|
-
})
|
389
|
-
health() {
|
390
|
-
return { status: 'OK', timestamp: new Date().toISOString() };
|
391
|
-
}
|
392
|
-
}
|
393
|
-
```
|
394
|
-
|
395
|
-
## Error Handling
|
396
|
-
|
397
|
-
BootifyJS provides built-in error classes for common HTTP errors.
|
398
|
-
|
399
|
-
```typescript
|
400
|
-
import { NotFoundError, ValidationError } from 'bootifyjs';
|
401
|
-
|
402
|
-
@Service()
|
403
|
-
export class UserService {
|
404
|
-
getUserById(id: string) {
|
405
|
-
const user = this.userRepository.findById(id);
|
406
|
-
if (!user) {
|
407
|
-
throw new NotFoundError(`User with id ${id} not found`);
|
408
|
-
}
|
409
|
-
return user;
|
410
|
-
}
|
411
|
-
|
412
|
-
createUser(userData) {
|
413
|
-
if (!userData.email) {
|
414
|
-
throw new ValidationError('Email is required');
|
415
|
-
}
|
416
|
-
// ...
|
417
|
-
}
|
418
|
-
}
|
419
|
-
```
|
420
|
-
|
421
|
-
## License
|
422
|
-
|
423
|
-
MIT
|
@@ -1,29 +0,0 @@
|
|
1
|
-
export declare class AppConfig {
|
2
|
-
SERVICE_NAME: string;
|
3
|
-
server: {
|
4
|
-
port: number;
|
5
|
-
host: string;
|
6
|
-
name?: string;
|
7
|
-
};
|
8
|
-
database: {
|
9
|
-
host: string;
|
10
|
-
port: number;
|
11
|
-
name: string;
|
12
|
-
username: string;
|
13
|
-
password: string;
|
14
|
-
};
|
15
|
-
logging: {
|
16
|
-
level: string;
|
17
|
-
enabled: boolean;
|
18
|
-
};
|
19
|
-
api: {
|
20
|
-
version: string;
|
21
|
-
};
|
22
|
-
cors: {
|
23
|
-
enabled: boolean;
|
24
|
-
};
|
25
|
-
jwt: {
|
26
|
-
secret: string;
|
27
|
-
expiresIn: number;
|
28
|
-
};
|
29
|
-
}
|
@@ -1,55 +0,0 @@
|
|
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
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
9
|
-
exports.AppConfig = void 0;
|
10
|
-
const config_1 = require("../core/config");
|
11
|
-
let AppConfig = class AppConfig {
|
12
|
-
constructor() {
|
13
|
-
// Service configuration
|
14
|
-
this.SERVICE_NAME = 'bootifyjs-app';
|
15
|
-
// Server configuration - will be populated from BOOTIFY_SERVER_* env vars
|
16
|
-
this.server = {
|
17
|
-
port: 3000,
|
18
|
-
host: 'localhost'
|
19
|
-
};
|
20
|
-
// Database configuration - will be populated from BOOTIFY_DATABASE_* env vars
|
21
|
-
this.database = {
|
22
|
-
host: 'localhost',
|
23
|
-
port: 5432,
|
24
|
-
name: 'bootifyjs',
|
25
|
-
username: 'admin',
|
26
|
-
password: 'password'
|
27
|
-
};
|
28
|
-
// Logging configuration - will be populated from BOOTIFY_LOGGING_* env vars
|
29
|
-
this.logging = {
|
30
|
-
level: 'info',
|
31
|
-
enabled: true
|
32
|
-
};
|
33
|
-
// Any other configuration can be added here
|
34
|
-
// The @Config decorator will automatically map environment variables
|
35
|
-
// based on the property structure
|
36
|
-
// API Configuration - will be populated from BOOTIFY_API_* env vars
|
37
|
-
this.api = {
|
38
|
-
version: 'v1'
|
39
|
-
};
|
40
|
-
// CORS Configuration - will be populated from BOOTIFY_CORS_* env vars
|
41
|
-
this.cors = {
|
42
|
-
enabled: true
|
43
|
-
};
|
44
|
-
// JWT Configuration - will be populated from BOOTIFY_JWT_* env vars
|
45
|
-
this.jwt = {
|
46
|
-
secret: 'default-secret',
|
47
|
-
expiresIn: 3600
|
48
|
-
};
|
49
|
-
}
|
50
|
-
};
|
51
|
-
exports.AppConfig = AppConfig;
|
52
|
-
exports.AppConfig = AppConfig = __decorate([
|
53
|
-
(0, config_1.Config)('BOOTIFY')
|
54
|
-
], AppConfig);
|
55
|
-
//# sourceMappingURL=app.config.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"app.config.js","sourceRoot":"","sources":["../../src/config/app.config.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAwC;AAGjC,IAAM,SAAS,GAAf,MAAM,SAAS;IAAf;QACL,wBAAwB;QACxB,iBAAY,GAAW,eAAe,CAAC;QAEvC,0EAA0E;QAC1E,WAAM,GAIF;YACF,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,WAAW;SAClB,CAAC;QAEF,8EAA8E;QAC9E,aAAQ,GAMJ;YACF,IAAI,EAAE,WAAW;YACjB,IAAI,EAAE,IAAI;YACV,IAAI,EAAE,WAAW;YACjB,QAAQ,EAAE,OAAO;YACjB,QAAQ,EAAE,UAAU;SACrB,CAAC;QAEF,4EAA4E;QAC5E,YAAO,GAGH;YACF,KAAK,EAAE,MAAM;YACb,OAAO,EAAE,IAAI;SACd,CAAC;QAEF,4CAA4C;QAC5C,qEAAqE;QACrE,kCAAkC;QAElC,oEAAoE;QACpE,QAAG,GAEC;YACF,OAAO,EAAE,IAAI;SACd,CAAC;QAEF,sEAAsE;QACtE,SAAI,GAEA;YACF,OAAO,EAAE,IAAI;SACd,CAAC;QAEF,oEAAoE;QACpE,QAAG,GAGC;YACF,MAAM,EAAE,gBAAgB;YACxB,SAAS,EAAE,IAAI;SAChB,CAAC;IACJ,CAAC;CAAA,CAAA;AAhEY,8BAAS;oBAAT,SAAS;IADrB,IAAA,eAAM,EAAC,SAAS,CAAC;GACL,SAAS,CAgErB"}
|
@@ -1,16 +0,0 @@
|
|
1
|
-
import { AppConfig } from '../config/app.config';
|
2
|
-
import { ConfigDemoService } from '../services/config-demo.service';
|
3
|
-
export declare class ConfigController {
|
4
|
-
private config;
|
5
|
-
private configDemoService;
|
6
|
-
constructor(config: AppConfig, configDemoService: ConfigDemoService);
|
7
|
-
getConfigInfo(): AppConfig;
|
8
|
-
getServerUrl(): {
|
9
|
-
url: string;
|
10
|
-
message: string;
|
11
|
-
};
|
12
|
-
runConfigDemo(): {
|
13
|
-
message: string;
|
14
|
-
timestamp: string;
|
15
|
-
};
|
16
|
-
}
|
@@ -1,66 +0,0 @@
|
|
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.ConfigController = void 0;
|
16
|
-
const decorators_1 = require("../core/decorators");
|
17
|
-
const app_config_1 = require("../config/app.config");
|
18
|
-
const config_demo_service_1 = require("../services/config-demo.service");
|
19
|
-
let ConfigController = class ConfigController {
|
20
|
-
constructor(config, configDemoService) {
|
21
|
-
this.config = config;
|
22
|
-
this.configDemoService = configDemoService;
|
23
|
-
}
|
24
|
-
getConfigInfo() {
|
25
|
-
return this.config;
|
26
|
-
}
|
27
|
-
getServerUrl() {
|
28
|
-
return {
|
29
|
-
url: this.configDemoService.getServerUrl(),
|
30
|
-
message: 'Current server URL based on configuration'
|
31
|
-
};
|
32
|
-
}
|
33
|
-
runConfigDemo() {
|
34
|
-
this.configDemoService.demonstrateConfig();
|
35
|
-
return {
|
36
|
-
message: 'Configuration demo completed. Check the logs for details.',
|
37
|
-
timestamp: new Date().toISOString()
|
38
|
-
};
|
39
|
-
}
|
40
|
-
};
|
41
|
-
exports.ConfigController = ConfigController;
|
42
|
-
__decorate([
|
43
|
-
(0, decorators_1.Get)('/info'),
|
44
|
-
__metadata("design:type", Function),
|
45
|
-
__metadata("design:paramtypes", []),
|
46
|
-
__metadata("design:returntype", void 0)
|
47
|
-
], ConfigController.prototype, "getConfigInfo", null);
|
48
|
-
__decorate([
|
49
|
-
(0, decorators_1.Get)('/server-url'),
|
50
|
-
__metadata("design:type", Function),
|
51
|
-
__metadata("design:paramtypes", []),
|
52
|
-
__metadata("design:returntype", void 0)
|
53
|
-
], ConfigController.prototype, "getServerUrl", null);
|
54
|
-
__decorate([
|
55
|
-
(0, decorators_1.Get)('/demo'),
|
56
|
-
__metadata("design:type", Function),
|
57
|
-
__metadata("design:paramtypes", []),
|
58
|
-
__metadata("design:returntype", void 0)
|
59
|
-
], ConfigController.prototype, "runConfigDemo", null);
|
60
|
-
exports.ConfigController = ConfigController = __decorate([
|
61
|
-
(0, decorators_1.Controller)('/config'),
|
62
|
-
__param(0, (0, decorators_1.InjectConfig)(app_config_1.AppConfig)),
|
63
|
-
__metadata("design:paramtypes", [app_config_1.AppConfig,
|
64
|
-
config_demo_service_1.ConfigDemoService])
|
65
|
-
], ConfigController);
|
66
|
-
//# sourceMappingURL=config.controller.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"config.controller.js","sourceRoot":"","sources":["../../src/controllers/config.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,mDAAmE;AACnE,qDAAiD;AACjD,yEAAoE;AAG7D,IAAM,gBAAgB,GAAtB,MAAM,gBAAgB;IAC3B,YACmC,MAAiB,EAC1C,iBAAoC;QADX,WAAM,GAAN,MAAM,CAAW;QAC1C,sBAAiB,GAAjB,iBAAiB,CAAmB;IAC3C,CAAC;IAGJ,aAAa;QACX,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAGD,YAAY;QACV,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,iBAAiB,CAAC,YAAY,EAAE;YAC1C,OAAO,EAAE,2CAA2C;SACrD,CAAC;IACJ,CAAC;IAGD,aAAa;QACX,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,EAAE,CAAC;QAC3C,OAAO;YACL,OAAO,EAAE,2DAA2D;YACpE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC;IACJ,CAAC;CACF,CAAA;AA3BY,4CAAgB;AAO3B;IADC,IAAA,gBAAG,EAAC,OAAO,CAAC;;;;qDAGZ;AAGD;IADC,IAAA,gBAAG,EAAC,aAAa,CAAC;;;;oDAMlB;AAGD;IADC,IAAA,gBAAG,EAAC,OAAO,CAAC;;;;qDAOZ;2BA1BU,gBAAgB;IAD5B,IAAA,uBAAU,EAAC,SAAS,CAAC;IAGjB,WAAA,IAAA,yBAAY,EAAC,sBAAS,CAAC,CAAA;qCAAiB,sBAAS;QACvB,uCAAiB;GAHnC,gBAAgB,CA2B5B"}
|
@@ -1,66 +0,0 @@
|
|
1
|
-
import { BaseEvent } from '../events/types/event.types';
|
2
|
-
export declare class EventsController {
|
3
|
-
private eventBus;
|
4
|
-
private registry;
|
5
|
-
private eventStore;
|
6
|
-
constructor();
|
7
|
-
getEventMetrics(): {
|
8
|
-
busMetrics: import("../events").EventMetrics;
|
9
|
-
registryStats: {
|
10
|
-
totalEventTypes: number;
|
11
|
-
totalSubscriptions: number;
|
12
|
-
subscriptionsByType: Record<string, number>;
|
13
|
-
activeSubscriptions: number;
|
14
|
-
};
|
15
|
-
storeStats: {
|
16
|
-
totalEvents: number;
|
17
|
-
eventsByType: Record<string, number>;
|
18
|
-
aggregateCount: number;
|
19
|
-
oldestEvent?: Date;
|
20
|
-
newestEvent?: Date;
|
21
|
-
};
|
22
|
-
};
|
23
|
-
getEventTypes(): {
|
24
|
-
registeredTypes: string[];
|
25
|
-
totalTypes: number;
|
26
|
-
};
|
27
|
-
getSubscriptions(): Record<string, any[]>;
|
28
|
-
getEventSystemHealth(): {
|
29
|
-
healthy: boolean;
|
30
|
-
metrics: import("../events").EventMetrics;
|
31
|
-
timestamp: string;
|
32
|
-
};
|
33
|
-
emitEvent(eventData: {
|
34
|
-
type: string;
|
35
|
-
data: any;
|
36
|
-
}): Promise<{
|
37
|
-
success: boolean;
|
38
|
-
message: string;
|
39
|
-
timestamp: string;
|
40
|
-
}>;
|
41
|
-
getEventHistory(eventType?: string, limit?: string): Promise<{
|
42
|
-
events: BaseEvent[];
|
43
|
-
total: number;
|
44
|
-
filtered: boolean;
|
45
|
-
}>;
|
46
|
-
getEventStats(): {
|
47
|
-
system: {
|
48
|
-
healthy: boolean;
|
49
|
-
uptime: number;
|
50
|
-
};
|
51
|
-
registry: {
|
52
|
-
totalEventTypes: number;
|
53
|
-
totalSubscriptions: number;
|
54
|
-
subscriptionsByType: Record<string, number>;
|
55
|
-
activeSubscriptions: number;
|
56
|
-
};
|
57
|
-
bus: import("../events").EventMetrics;
|
58
|
-
store: {
|
59
|
-
totalEvents: number;
|
60
|
-
eventsByType: Record<string, number>;
|
61
|
-
aggregateCount: number;
|
62
|
-
oldestEvent?: Date;
|
63
|
-
newestEvent?: Date;
|
64
|
-
};
|
65
|
-
};
|
66
|
-
}
|