@riktajs/core 0.4.1 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -179
- package/dist/core/constants.d.ts.map +1 -1
- package/dist/core/constants.js +14 -13
- package/dist/core/constants.js.map +1 -1
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -0
- package/dist/core/index.js.map +1 -1
- package/dist/core/metadata.d.ts +66 -0
- package/dist/core/metadata.d.ts.map +1 -0
- package/dist/core/metadata.js +152 -0
- package/dist/core/metadata.js.map +1 -0
- package/package.json +2 -9
- package/LICENSE +0 -21
- package/dist/core/decorators/provider-config.decorator.d.ts +0 -107
- package/dist/core/decorators/provider-config.decorator.d.ts.map +0 -1
- package/dist/core/decorators/provider-config.decorator.js +0 -156
- package/dist/core/decorators/provider-config.decorator.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,179 +1,54 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
// 2. Define a Schema (Type-safe!)
|
|
58
|
-
const CreateUserSchema = z.object({
|
|
59
|
-
name: z.string().min(3)
|
|
60
|
-
});
|
|
61
|
-
|
|
62
|
-
// 3. Define a Controller (Auto-discovered!)
|
|
63
|
-
@Controller('/users')
|
|
64
|
-
export class UserController {
|
|
65
|
-
@Autowired()
|
|
66
|
-
private userService!: UserService; // Dependency Injection works like magic
|
|
67
|
-
|
|
68
|
-
@Get()
|
|
69
|
-
getUsers() {
|
|
70
|
-
return this.userService.findAll();
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
@Post()
|
|
74
|
-
createUser(@Body(CreateUserSchema) body: z.infer<typeof CreateUserSchema>) {
|
|
75
|
-
// 'body' is fully typed here!
|
|
76
|
-
return this.userService.create(body.name);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// 4. Run it!
|
|
81
|
-
// autowired paths are resolved relative to your project, not node_modules!
|
|
82
|
-
const app = await Rikta.create({
|
|
83
|
-
port: 3000,
|
|
84
|
-
autowired: ['./src'] // Relative paths are resolved from YOUR project directory
|
|
85
|
-
});
|
|
86
|
-
await app.listen();
|
|
87
|
-
console.log('🚀 Server running on http://localhost:3000');
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
---
|
|
91
|
-
|
|
92
|
-
## 📚 Documentation
|
|
93
|
-
|
|
94
|
-
Everything you need to build production-ready APIs.
|
|
95
|
-
|
|
96
|
-
| Guide | Description |
|
|
97
|
-
|-------|-------------|
|
|
98
|
-
| [**Architecture**](./docs/guide/architecture.md) | How Rikta's auto-discovery works under the hood. |
|
|
99
|
-
| [**Dependency Injection**](./docs/guide/dependency-injection.md) | Using `@Autowired`, tokens, and scopes. |
|
|
100
|
-
| [**Configuration**](./docs/guide/configuration.md) | Type-safe configuration with .env and Zod validation. |
|
|
101
|
-
| [**Routing**](./docs/guide/routing.md) | Controllers, methods, and parameter handling. |
|
|
102
|
-
| [**Validation**](./docs/guide/validation.md) | **New!** Type-safe validation with Zod. |
|
|
103
|
-
| [**Lifecycle**](./docs/guide/lifecycle.md) | Hooks (`OnProviderInit`) and the Event Bus. |
|
|
104
|
-
| [**Error Handling**](./docs/guide/error-handling.md) | Exception filters and standard JSON responses. |
|
|
105
|
-
| [**Benchmarks**](./benchmarks/README.md) | Performance comparison with Fastify & NestJS. |
|
|
106
|
-
|
|
107
|
-
---
|
|
108
|
-
|
|
109
|
-
## ⚡ Performance
|
|
110
|
-
|
|
111
|
-
Rikta is built on Fastify and delivers **excellent performance**. From our [benchmarks](./benchmarks/README.md):
|
|
112
|
-
|
|
113
|
-
| Metric | Rikta vs NestJS | Result |
|
|
114
|
-
|--------|-----------------|--------|
|
|
115
|
-
| **Startup** | 🟢 **-37.7%** | Rikta is faster |
|
|
116
|
-
| **GET requests** | 🟢 **-44.3%** | Rikta is faster |
|
|
117
|
-
| **POST requests** | 🟢 **-14.8%** | Rikta is faster |
|
|
118
|
-
| **Param requests** | 🟢 **-36.7%** | Rikta is faster |
|
|
119
|
-
| **Average** | 🟢 **-32.0%** | Rikta is faster |
|
|
120
|
-
|
|
121
|
-
For detailed tests:
|
|
122
|
-
```bash
|
|
123
|
-
cd benchmarks
|
|
124
|
-
npm install
|
|
125
|
-
npm run bench
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
### Production Mode
|
|
129
|
-
|
|
130
|
-
For maximum performance, use silent mode:
|
|
131
|
-
|
|
132
|
-
```typescript
|
|
133
|
-
const app = await Rikta.create({
|
|
134
|
-
port: 3000,
|
|
135
|
-
silent: true, // Disable all console output
|
|
136
|
-
logger: false // Disable Fastify logging
|
|
137
|
-
});
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
---
|
|
141
|
-
|
|
142
|
-
## ✨ Key Features
|
|
143
|
-
|
|
144
|
-
### 🚫 No Modules, Just Logic
|
|
145
|
-
Forget about `AppModule`, `UserModule`, `SharedModule`. Rikta scans your code and resolves dependencies automatically.
|
|
146
|
-
|
|
147
|
-
### ✅ Native Zod Validation
|
|
148
|
-
Don't duplicate your types. Define a Zod schema, and Rikta validates the request *and* gives you the TypeScript type.
|
|
149
|
-
|
|
150
|
-
```typescript
|
|
151
|
-
@Post()
|
|
152
|
-
create(@Body(UserSchema) user: z.infer<typeof UserSchema>) {
|
|
153
|
-
// If we get here, 'user' is valid and typed.
|
|
154
|
-
// If not, Rikta returns a 400 Bad Request automatically.
|
|
155
|
-
}
|
|
156
|
-
```
|
|
157
|
-
|
|
158
|
-
### 🔌 Powerful Dependency Injection
|
|
159
|
-
Support for Singleton (default) and Transient scopes, factory providers, and value tokens.
|
|
160
|
-
|
|
161
|
-
```typescript
|
|
162
|
-
@Injectable()
|
|
163
|
-
class AuthService {
|
|
164
|
-
constructor(
|
|
165
|
-
@Autowired(DB_CONFIG) private config: Config,
|
|
166
|
-
@Autowired() private logger: LoggerService
|
|
167
|
-
) {}
|
|
168
|
-
}
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
---
|
|
172
|
-
|
|
173
|
-
## 🤝 Contributing
|
|
174
|
-
|
|
175
|
-
We love contributions! Please check our [Contributing Guide](CONTRIBUTING.md) (Coming Soon) and join our community.
|
|
176
|
-
|
|
177
|
-
## 📄 License
|
|
178
|
-
|
|
179
|
-
Rikta is [MIT licensed](LICENSE).
|
|
1
|
+
# @riktajs/core
|
|
2
|
+
|
|
3
|
+
The core package of the Rikta framework.
|
|
4
|
+
|
|
5
|
+
See the [main repository README](../../README.md) for full documentation.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @riktajs/core
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Quick Start
|
|
14
|
+
|
|
15
|
+
```typescript
|
|
16
|
+
import { Rikta, Controller, Injectable, Get, Autowired } from '@riktajs/core';
|
|
17
|
+
|
|
18
|
+
@Injectable()
|
|
19
|
+
class HelloService {
|
|
20
|
+
getMessage() {
|
|
21
|
+
return { message: 'Hello from Rikta!' };
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
@Controller('/api')
|
|
26
|
+
class HelloController {
|
|
27
|
+
@Autowired()
|
|
28
|
+
private helloService!: HelloService;
|
|
29
|
+
|
|
30
|
+
@Get('/hello')
|
|
31
|
+
getHello() {
|
|
32
|
+
return this.helloService.getMessage();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const app = await Rikta.create({
|
|
37
|
+
port: 3000,
|
|
38
|
+
autowired: ['./src']
|
|
39
|
+
});
|
|
40
|
+
await app.listen();
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Features
|
|
44
|
+
|
|
45
|
+
- 🚀 Zero-Config Autowiring
|
|
46
|
+
- ⚡ Fastify Powered
|
|
47
|
+
- 🛡️ Type-Safe by Default
|
|
48
|
+
- 🔄 Hybrid Lifecycle
|
|
49
|
+
- 📦 Built-in Dependency Injection
|
|
50
|
+
- ✅ Zod Validation Integration
|
|
51
|
+
|
|
52
|
+
## License
|
|
53
|
+
|
|
54
|
+
MIT
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,eAAO,MAAM,mBAAmB,eAA0C,CAAC;AAE3E;;GAEG;AACH,eAAO,MAAM,eAAe,eAAsC,CAAC;AAEnE;;GAEG;AACH,eAAO,MAAM,mBAAmB,eAA0C,CAAC;AAE3E;;GAEG;AACH,eAAO,MAAM,cAAc,eAAqC,CAAC;AAEjE;;GAEG;AACH,eAAO,MAAM,eAAe,eAAsC,CAAC;AAEnE;;GAEG;AACH,eAAO,MAAM,qBAAqB,eAA4C,CAAC;AAE/E;;GAEG;AACH,eAAO,MAAM,mBAAmB,eAA0C,CAAC;AAE3E;;GAEG;AACH,eAAO,MAAM,kBAAkB,eAAyC,CAAC;AAEzE;;GAEG;AACH,eAAO,MAAM,gBAAgB,eAAuC,CAAC;AAErE;;GAEG;AACH,eAAO,MAAM,eAAe,eAAsC,CAAC;AAEnE;;GAEG;AACH,eAAO,MAAM,mBAAmB,eAA0C,CAAC;AAE3E;;GAEG;AACH,eAAO,MAAM,kBAAkB,eAAyC,CAAC;AAEzE;;GAEG;AACH,eAAO,MAAM,iBAAiB,eAAwC,CAAC;AAMvE;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,wBAAwB,eAAqC,CAAC;AAE3E;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,wBAAwB,eAAqC,CAAC;AAE3E;;GAEG;AACH,oBAAY,SAAS;IACnB,IAAI,SAAS;IACb,KAAK,UAAU;IACf,KAAK,UAAU;IACf,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,KAAK,UAAU;IACf,OAAO,YAAY;CACpB;AAED;;GAEG;AACH,eAAO,MAAM,cAAc;;;;;CAKjB,CAAC"}
|
package/dist/core/constants.js
CHANGED
|
@@ -1,61 +1,62 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
// ============================================================================
|
|
3
3
|
// Metadata Keys for Reflect API
|
|
4
|
+
// Using Symbol.for() to ensure symbols are shared across packages
|
|
4
5
|
// ============================================================================
|
|
5
6
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
7
|
exports.DEFAULT_CONFIG = exports.ParamType = exports.CONFIG_PROPERTY_METADATA = exports.CONFIG_PROVIDER_METADATA = exports.PROVIDER_METADATA = exports.AUTOWIRED_METADATA = exports.ZOD_SCHEMA_METADATA = exports.INJECT_METADATA = exports.HEADERS_METADATA = exports.HTTP_CODE_METADATA = exports.MIDDLEWARE_METADATA = exports.INTERCEPTORS_METADATA = exports.GUARDS_METADATA = exports.PARAM_METADATA = exports.INJECTABLE_METADATA = exports.ROUTES_METADATA = exports.CONTROLLER_METADATA = void 0;
|
|
7
8
|
/**
|
|
8
9
|
* Key for storing controller metadata (prefix, routes)
|
|
9
10
|
*/
|
|
10
|
-
exports.CONTROLLER_METADATA = Symbol('controller:metadata');
|
|
11
|
+
exports.CONTROLLER_METADATA = Symbol.for('rikta:controller:metadata');
|
|
11
12
|
/**
|
|
12
13
|
* Key for storing route definitions on a controller
|
|
13
14
|
*/
|
|
14
|
-
exports.ROUTES_METADATA = Symbol('routes:metadata');
|
|
15
|
+
exports.ROUTES_METADATA = Symbol.for('rikta:routes:metadata');
|
|
15
16
|
/**
|
|
16
17
|
* Key for storing injectable options
|
|
17
18
|
*/
|
|
18
|
-
exports.INJECTABLE_METADATA = Symbol('injectable:metadata');
|
|
19
|
+
exports.INJECTABLE_METADATA = Symbol.for('rikta:injectable:metadata');
|
|
19
20
|
/**
|
|
20
21
|
* Key for storing parameter injection metadata
|
|
21
22
|
*/
|
|
22
|
-
exports.PARAM_METADATA = Symbol('param:metadata');
|
|
23
|
+
exports.PARAM_METADATA = Symbol.for('rikta:param:metadata');
|
|
23
24
|
/**
|
|
24
25
|
* Key for storing guards
|
|
25
26
|
*/
|
|
26
|
-
exports.GUARDS_METADATA = Symbol('guards:metadata');
|
|
27
|
+
exports.GUARDS_METADATA = Symbol.for('rikta:guards:metadata');
|
|
27
28
|
/**
|
|
28
29
|
* Key for storing interceptors
|
|
29
30
|
*/
|
|
30
|
-
exports.INTERCEPTORS_METADATA = Symbol('interceptors:metadata');
|
|
31
|
+
exports.INTERCEPTORS_METADATA = Symbol.for('rikta:interceptors:metadata');
|
|
31
32
|
/**
|
|
32
33
|
* Key for storing middleware
|
|
33
34
|
*/
|
|
34
|
-
exports.MIDDLEWARE_METADATA = Symbol('middleware:metadata');
|
|
35
|
+
exports.MIDDLEWARE_METADATA = Symbol.for('rikta:middleware:metadata');
|
|
35
36
|
/**
|
|
36
37
|
* Key for storing response status code
|
|
37
38
|
*/
|
|
38
|
-
exports.HTTP_CODE_METADATA = Symbol('http:code:metadata');
|
|
39
|
+
exports.HTTP_CODE_METADATA = Symbol.for('rikta:http:code:metadata');
|
|
39
40
|
/**
|
|
40
41
|
* Key for storing response headers
|
|
41
42
|
*/
|
|
42
|
-
exports.HEADERS_METADATA = Symbol('headers:metadata');
|
|
43
|
+
exports.HEADERS_METADATA = Symbol.for('rikta:headers:metadata');
|
|
43
44
|
/**
|
|
44
45
|
* Key for storing @Inject() metadata on constructor parameters
|
|
45
46
|
*/
|
|
46
|
-
exports.INJECT_METADATA = Symbol('inject:metadata');
|
|
47
|
+
exports.INJECT_METADATA = Symbol.for('rikta:inject:metadata');
|
|
47
48
|
/**
|
|
48
49
|
* Key for storing Zod validation schema on parameters
|
|
49
50
|
*/
|
|
50
|
-
exports.ZOD_SCHEMA_METADATA = Symbol('zod:schema:metadata');
|
|
51
|
+
exports.ZOD_SCHEMA_METADATA = Symbol.for('rikta:zod:schema:metadata');
|
|
51
52
|
/**
|
|
52
53
|
* Key for storing @Autowired() property injection metadata
|
|
53
54
|
*/
|
|
54
|
-
exports.AUTOWIRED_METADATA = Symbol('autowired:metadata');
|
|
55
|
+
exports.AUTOWIRED_METADATA = Symbol.for('rikta:autowired:metadata');
|
|
55
56
|
/**
|
|
56
57
|
* Key for storing @Provider() metadata
|
|
57
58
|
*/
|
|
58
|
-
exports.PROVIDER_METADATA = Symbol('provider:metadata');
|
|
59
|
+
exports.PROVIDER_METADATA = Symbol.for('rikta:provider:metadata');
|
|
59
60
|
// ============================================================================
|
|
60
61
|
// Configuration Metadata Keys
|
|
61
62
|
// ============================================================================
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":";AAAA,+EAA+E;AAC/E,gCAAgC;AAChC,+EAA+E;;;AAE/E;;GAEG;AACU,QAAA,mBAAmB,GAAG,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/core/constants.ts"],"names":[],"mappings":";AAAA,+EAA+E;AAC/E,gCAAgC;AAChC,kEAAkE;AAClE,+EAA+E;;;AAE/E;;GAEG;AACU,QAAA,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;AAE3E;;GAEG;AACU,QAAA,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AAEnE;;GAEG;AACU,QAAA,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;AAE3E;;GAEG;AACU,QAAA,cAAc,GAAG,MAAM,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;AAEjE;;GAEG;AACU,QAAA,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AAEnE;;GAEG;AACU,QAAA,qBAAqB,GAAG,MAAM,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;AAE/E;;GAEG;AACU,QAAA,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;AAE3E;;GAEG;AACU,QAAA,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;AAEzE;;GAEG;AACU,QAAA,gBAAgB,GAAG,MAAM,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;AAErE;;GAEG;AACU,QAAA,eAAe,GAAG,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;AAEnE;;GAEG;AACU,QAAA,mBAAmB,GAAG,MAAM,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;AAE3E;;GAEG;AACU,QAAA,kBAAkB,GAAG,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;AAEzE;;GAEG;AACU,QAAA,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;AAEvE,+EAA+E;AAC/E,8BAA8B;AAC9B,+EAA+E;AAE/E;;;;;;;;;;;;;GAaG;AACU,QAAA,wBAAwB,GAAG,MAAM,CAAC,0BAA0B,CAAC,CAAC;AAE3E;;;;;;;;;;;;;;;;;GAiBG;AACU,QAAA,wBAAwB,GAAG,MAAM,CAAC,0BAA0B,CAAC,CAAC;AAE3E;;GAEG;AACH,IAAY,SAQX;AARD,WAAY,SAAS;IACnB,0BAAa,CAAA;IACb,4BAAe,CAAA;IACf,4BAAe,CAAA;IACf,gCAAmB,CAAA;IACnB,gCAAmB,CAAA;IACnB,4BAAe,CAAA;IACf,gCAAmB,CAAA;AACrB,CAAC,EARW,SAAS,yBAAT,SAAS,QAQpB;AAED;;GAEG;AACU,QAAA,cAAc,GAAG;IAC5B,IAAI,EAAE,IAAI;IACV,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,IAAI;IACZ,MAAM,EAAE,EAAE;CACF,CAAC"}
|
package/dist/core/index.d.ts
CHANGED
|
@@ -10,6 +10,7 @@ export * from './decorators';
|
|
|
10
10
|
export * from './exceptions';
|
|
11
11
|
export * from './guards';
|
|
12
12
|
export * from './config';
|
|
13
|
+
export * from './metadata';
|
|
13
14
|
export { z } from 'zod';
|
|
14
15
|
export type { ZodType, ZodSchema, ZodError, ZodIssue, infer as ZodInfer } from 'zod';
|
|
15
16
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/core/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AACA,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AACA,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,iBAAiB,CAAC;AAChC,cAAc,eAAe,CAAC;AAC9B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAK3B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,IAAI,QAAQ,EAAE,MAAM,KAAK,CAAC"}
|
package/dist/core/index.js
CHANGED
|
@@ -28,6 +28,7 @@ __exportStar(require("./decorators"), exports);
|
|
|
28
28
|
__exportStar(require("./exceptions"), exports);
|
|
29
29
|
__exportStar(require("./guards"), exports);
|
|
30
30
|
__exportStar(require("./config"), exports);
|
|
31
|
+
__exportStar(require("./metadata"), exports);
|
|
31
32
|
// Re-export Zod for convenience
|
|
32
33
|
// This allows users to import everything from '@riktajs/core':
|
|
33
34
|
// import { z, Body, Controller } from '@riktajs/core';
|
package/dist/core/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,eAAe;AACf,0CAAwB;AACxB,8CAA4B;AAC5B,8CAA4B;AAC5B,6CAA2B;AAC3B,8CAA4B;AAC5B,8CAA4B;AAC5B,kDAAgC;AAChC,gDAA8B;AAC9B,+CAA6B;AAC7B,+CAA6B;AAC7B,2CAAyB;AACzB,2CAAyB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,eAAe;AACf,0CAAwB;AACxB,8CAA4B;AAC5B,8CAA4B;AAC5B,6CAA2B;AAC3B,8CAA4B;AAC5B,8CAA4B;AAC5B,kDAAgC;AAChC,gDAA8B;AAC9B,+CAA6B;AAC7B,+CAA6B;AAC7B,2CAAyB;AACzB,2CAAyB;AACzB,6CAA2B;AAE3B,gCAAgC;AAChC,+DAA+D;AAC/D,uDAAuD;AACvD,2BAAwB;AAAf,wFAAA,CAAC,OAAA"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import type { RouteDefinition, ControllerMetadata } from './types';
|
|
3
|
+
import type { ParamMetadata } from './decorators/param.decorator';
|
|
4
|
+
type Constructor<T = unknown> = new (...args: any[]) => T;
|
|
5
|
+
/**
|
|
6
|
+
* Get controller metadata (path prefix, etc.)
|
|
7
|
+
*/
|
|
8
|
+
export declare function getControllerMetadata(target: Constructor): ControllerMetadata | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Check if a class is a controller
|
|
11
|
+
*/
|
|
12
|
+
export declare function isController(target: Constructor): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Get controller path prefix
|
|
15
|
+
*/
|
|
16
|
+
export declare function getControllerPath(target: Constructor): string;
|
|
17
|
+
/**
|
|
18
|
+
* Get all routes defined on a controller
|
|
19
|
+
*/
|
|
20
|
+
export declare function getRoutes(target: Constructor): RouteDefinition[];
|
|
21
|
+
/**
|
|
22
|
+
* Check if a controller has any routes
|
|
23
|
+
*/
|
|
24
|
+
export declare function hasRoutes(target: Constructor): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Get parameter metadata for a specific method
|
|
27
|
+
*/
|
|
28
|
+
export declare function getParamMetadata(target: Constructor, methodName: string | symbol): ParamMetadata[];
|
|
29
|
+
/**
|
|
30
|
+
* Get parameter metadata by index
|
|
31
|
+
*/
|
|
32
|
+
export declare function getParamMetadataByIndex(target: Constructor, methodName: string | symbol, paramIndex: number): ParamMetadata | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* Get custom HTTP status code for a method
|
|
35
|
+
*/
|
|
36
|
+
export declare function getHttpCode(target: Constructor, methodName: string | symbol): number | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Get guards for a controller or method
|
|
39
|
+
*/
|
|
40
|
+
export declare function getGuards(target: Constructor, methodName?: string | symbol): Function[];
|
|
41
|
+
/**
|
|
42
|
+
* Get Zod schema metadata for a method parameter
|
|
43
|
+
*/
|
|
44
|
+
export declare function getZodSchema(target: Constructor, methodName: string | symbol): unknown;
|
|
45
|
+
/**
|
|
46
|
+
* Get any metadata from a class
|
|
47
|
+
*/
|
|
48
|
+
export declare function getClassMetadata<T = unknown>(metadataKey: symbol, target: Constructor): T | undefined;
|
|
49
|
+
/**
|
|
50
|
+
* Get any metadata from a method
|
|
51
|
+
*/
|
|
52
|
+
export declare function getMethodMetadata<T = unknown>(metadataKey: symbol, target: Constructor, methodName: string | symbol): T | undefined;
|
|
53
|
+
/**
|
|
54
|
+
* Check if a class has specific metadata
|
|
55
|
+
*/
|
|
56
|
+
export declare function hasClassMetadata(metadataKey: symbol, target: Constructor): boolean;
|
|
57
|
+
/**
|
|
58
|
+
* Check if a method has specific metadata
|
|
59
|
+
*/
|
|
60
|
+
export declare function hasMethodMetadata(metadataKey: symbol, target: Constructor, methodName: string | symbol): boolean;
|
|
61
|
+
/**
|
|
62
|
+
* Get all method names that have a specific metadata key
|
|
63
|
+
*/
|
|
64
|
+
export declare function getMethodsWithMetadata(metadataKey: symbol, target: Constructor): (string | symbol)[];
|
|
65
|
+
export {};
|
|
66
|
+
//# sourceMappingURL=metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/core/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAS1B,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAGlE,KAAK,WAAW,CAAC,CAAC,GAAG,OAAO,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;AAM1D;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,GAAG,kBAAkB,GAAG,SAAS,CAEzF;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAEzD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAG7D;AAMD;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,eAAe,EAAE,CAEhE;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAGtD;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,MAAM,GAAG,MAAM,GAC1B,aAAa,EAAE,CAEjB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,MAAM,GAAG,MAAM,EAC3B,UAAU,EAAE,MAAM,GACjB,aAAa,GAAG,SAAS,CAG3B;AAMD;;GAEG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,MAAM,GAAG,MAAM,GAC1B,MAAM,GAAG,SAAS,CAEpB;AAMD;;GAEG;AACH,wBAAgB,SAAS,CACvB,MAAM,EAAE,WAAW,EACnB,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAC3B,QAAQ,EAAE,CAUZ;AAMD;;GAEG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,MAAM,GAAG,MAAM,GAC1B,OAAO,CAET;AAMD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,GAAG,OAAO,EAC1C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,GAClB,CAAC,GAAG,SAAS,CAEf;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,CAAC,GAAG,OAAO,EAC3C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,MAAM,GAAG,MAAM,GAC1B,CAAC,GAAG,SAAS,CAEf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,GAClB,OAAO,CAET;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,EACnB,UAAU,EAAE,MAAM,GAAG,MAAM,GAC1B,OAAO,CAET;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,WAAW,GAClB,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAerB"}
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getControllerMetadata = getControllerMetadata;
|
|
4
|
+
exports.isController = isController;
|
|
5
|
+
exports.getControllerPath = getControllerPath;
|
|
6
|
+
exports.getRoutes = getRoutes;
|
|
7
|
+
exports.hasRoutes = hasRoutes;
|
|
8
|
+
exports.getParamMetadata = getParamMetadata;
|
|
9
|
+
exports.getParamMetadataByIndex = getParamMetadataByIndex;
|
|
10
|
+
exports.getHttpCode = getHttpCode;
|
|
11
|
+
exports.getGuards = getGuards;
|
|
12
|
+
exports.getZodSchema = getZodSchema;
|
|
13
|
+
exports.getClassMetadata = getClassMetadata;
|
|
14
|
+
exports.getMethodMetadata = getMethodMetadata;
|
|
15
|
+
exports.hasClassMetadata = hasClassMetadata;
|
|
16
|
+
exports.hasMethodMetadata = hasMethodMetadata;
|
|
17
|
+
exports.getMethodsWithMetadata = getMethodsWithMetadata;
|
|
18
|
+
require("reflect-metadata");
|
|
19
|
+
const constants_1 = require("./constants");
|
|
20
|
+
// ============================================================================
|
|
21
|
+
// Controller Metadata
|
|
22
|
+
// ============================================================================
|
|
23
|
+
/**
|
|
24
|
+
* Get controller metadata (path prefix, etc.)
|
|
25
|
+
*/
|
|
26
|
+
function getControllerMetadata(target) {
|
|
27
|
+
return Reflect.getMetadata(constants_1.CONTROLLER_METADATA, target);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Check if a class is a controller
|
|
31
|
+
*/
|
|
32
|
+
function isController(target) {
|
|
33
|
+
return Reflect.hasMetadata(constants_1.CONTROLLER_METADATA, target);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get controller path prefix
|
|
37
|
+
*/
|
|
38
|
+
function getControllerPath(target) {
|
|
39
|
+
const meta = getControllerMetadata(target);
|
|
40
|
+
return meta?.prefix ?? '';
|
|
41
|
+
}
|
|
42
|
+
// ============================================================================
|
|
43
|
+
// Route Metadata
|
|
44
|
+
// ============================================================================
|
|
45
|
+
/**
|
|
46
|
+
* Get all routes defined on a controller
|
|
47
|
+
*/
|
|
48
|
+
function getRoutes(target) {
|
|
49
|
+
return Reflect.getMetadata(constants_1.ROUTES_METADATA, target) || [];
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Check if a controller has any routes
|
|
53
|
+
*/
|
|
54
|
+
function hasRoutes(target) {
|
|
55
|
+
const routes = getRoutes(target);
|
|
56
|
+
return routes.length > 0;
|
|
57
|
+
}
|
|
58
|
+
// ============================================================================
|
|
59
|
+
// Parameter Metadata
|
|
60
|
+
// ============================================================================
|
|
61
|
+
/**
|
|
62
|
+
* Get parameter metadata for a specific method
|
|
63
|
+
*/
|
|
64
|
+
function getParamMetadata(target, methodName) {
|
|
65
|
+
return Reflect.getMetadata(constants_1.PARAM_METADATA, target.prototype, methodName) || [];
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get parameter metadata by index
|
|
69
|
+
*/
|
|
70
|
+
function getParamMetadataByIndex(target, methodName, paramIndex) {
|
|
71
|
+
const params = getParamMetadata(target, methodName);
|
|
72
|
+
return params.find(p => p.index === paramIndex);
|
|
73
|
+
}
|
|
74
|
+
// ============================================================================
|
|
75
|
+
// HTTP Code Metadata
|
|
76
|
+
// ============================================================================
|
|
77
|
+
/**
|
|
78
|
+
* Get custom HTTP status code for a method
|
|
79
|
+
*/
|
|
80
|
+
function getHttpCode(target, methodName) {
|
|
81
|
+
return Reflect.getMetadata(constants_1.HTTP_CODE_METADATA, target.prototype, methodName);
|
|
82
|
+
}
|
|
83
|
+
// ============================================================================
|
|
84
|
+
// Guards Metadata
|
|
85
|
+
// ============================================================================
|
|
86
|
+
/**
|
|
87
|
+
* Get guards for a controller or method
|
|
88
|
+
*/
|
|
89
|
+
function getGuards(target, methodName) {
|
|
90
|
+
if (methodName) {
|
|
91
|
+
// Method-level guards
|
|
92
|
+
const methodGuards = Reflect.getMetadata(constants_1.GUARDS_METADATA, target.prototype, methodName) || [];
|
|
93
|
+
// Controller-level guards
|
|
94
|
+
const controllerGuards = Reflect.getMetadata(constants_1.GUARDS_METADATA, target) || [];
|
|
95
|
+
return [...controllerGuards, ...methodGuards];
|
|
96
|
+
}
|
|
97
|
+
// Controller-level only
|
|
98
|
+
return Reflect.getMetadata(constants_1.GUARDS_METADATA, target) || [];
|
|
99
|
+
}
|
|
100
|
+
// ============================================================================
|
|
101
|
+
// Zod Schema Metadata
|
|
102
|
+
// ============================================================================
|
|
103
|
+
/**
|
|
104
|
+
* Get Zod schema metadata for a method parameter
|
|
105
|
+
*/
|
|
106
|
+
function getZodSchema(target, methodName) {
|
|
107
|
+
return Reflect.getMetadata(constants_1.ZOD_SCHEMA_METADATA, target.prototype, methodName);
|
|
108
|
+
}
|
|
109
|
+
// ============================================================================
|
|
110
|
+
// Generic Metadata Access
|
|
111
|
+
// ============================================================================
|
|
112
|
+
/**
|
|
113
|
+
* Get any metadata from a class
|
|
114
|
+
*/
|
|
115
|
+
function getClassMetadata(metadataKey, target) {
|
|
116
|
+
return Reflect.getMetadata(metadataKey, target);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get any metadata from a method
|
|
120
|
+
*/
|
|
121
|
+
function getMethodMetadata(metadataKey, target, methodName) {
|
|
122
|
+
return Reflect.getMetadata(metadataKey, target.prototype, methodName);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Check if a class has specific metadata
|
|
126
|
+
*/
|
|
127
|
+
function hasClassMetadata(metadataKey, target) {
|
|
128
|
+
return Reflect.hasMetadata(metadataKey, target);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Check if a method has specific metadata
|
|
132
|
+
*/
|
|
133
|
+
function hasMethodMetadata(metadataKey, target, methodName) {
|
|
134
|
+
return Reflect.hasMetadata(metadataKey, target.prototype, methodName);
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Get all method names that have a specific metadata key
|
|
138
|
+
*/
|
|
139
|
+
function getMethodsWithMetadata(metadataKey, target) {
|
|
140
|
+
const methods = [];
|
|
141
|
+
const prototype = target.prototype;
|
|
142
|
+
// Get all property names including symbols
|
|
143
|
+
const propertyNames = Object.getOwnPropertyNames(prototype);
|
|
144
|
+
const propertySymbols = Object.getOwnPropertySymbols(prototype);
|
|
145
|
+
for (const name of [...propertyNames, ...propertySymbols]) {
|
|
146
|
+
if (name !== 'constructor' && Reflect.hasMetadata(metadataKey, prototype, name)) {
|
|
147
|
+
methods.push(name);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
return methods;
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/core/metadata.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@riktajs/core",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.2",
|
|
4
4
|
"description": "A fast and modern TypeScript backend framework with zero-config autowiring, powered by Fastify",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -10,16 +10,9 @@
|
|
|
10
10
|
"scripts": {
|
|
11
11
|
"build": "tsc",
|
|
12
12
|
"dev": "ts-node-dev --respawn src/index.ts",
|
|
13
|
-
"example": "ts-node example/src/main.ts",
|
|
14
13
|
"test": "vitest run",
|
|
15
14
|
"test:watch": "vitest",
|
|
16
|
-
"test:coverage": "vitest run --coverage"
|
|
17
|
-
"lint": "eslint src --ext .ts",
|
|
18
|
-
"prepublishOnly": "npm run build",
|
|
19
|
-
"bench": "cd benchmarks && npm install && npm run bench",
|
|
20
|
-
"bench:startup": "cd benchmarks && npm install && npm run bench:startup",
|
|
21
|
-
"bench:requests": "cd benchmarks && npm install && npm run bench:requests",
|
|
22
|
-
"bench:autocannon": "cd benchmarks && npm install && npm run bench:autocannon"
|
|
15
|
+
"test:coverage": "vitest run --coverage"
|
|
23
16
|
},
|
|
24
17
|
"keywords": [
|
|
25
18
|
"framework",
|
package/LICENSE
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
MIT License
|
|
2
|
-
|
|
3
|
-
Copyright (c) 2025 riktaHQ
|
|
4
|
-
|
|
5
|
-
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
-
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
-
in the Software without restriction, including without limitation the rights
|
|
8
|
-
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
-
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
-
furnished to do so, subject to the following conditions:
|
|
11
|
-
|
|
12
|
-
The above copyright notice and this permission notice shall be included in all
|
|
13
|
-
copies or substantial portions of the Software.
|
|
14
|
-
|
|
15
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
-
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
-
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
-
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
-
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
-
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
-
SOFTWARE.
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import 'reflect-metadata';
|
|
2
|
-
import { Constructor } from '../types';
|
|
3
|
-
/**
|
|
4
|
-
* Config provider metadata stored on the class
|
|
5
|
-
*/
|
|
6
|
-
export interface ConfigProviderMetadata {
|
|
7
|
-
/**
|
|
8
|
-
* The injection token for this config provider
|
|
9
|
-
* @example 'APP_CONFIG', 'DATABASE_CONFIG'
|
|
10
|
-
*/
|
|
11
|
-
token: string;
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* @ProviderConfig() decorator
|
|
15
|
-
*
|
|
16
|
-
* Marks a class as a configuration provider that will be auto-discovered.
|
|
17
|
-
* Config providers extend AbstractConfigProvider and manage environment variables,
|
|
18
|
-
* validation with Zod schemas, and property mapping via @ConfigProperty.
|
|
19
|
-
*
|
|
20
|
-
* The decorator automatically generates an injection token from the class name
|
|
21
|
-
* if not explicitly provided, following the pattern: ClassName → CLASS_NAME_CONFIG
|
|
22
|
-
*
|
|
23
|
-
* @param token - Optional custom injection token (must be UPPERCASE)
|
|
24
|
-
*
|
|
25
|
-
* @example Auto-generated token:
|
|
26
|
-
* ```typescript
|
|
27
|
-
* import { ProviderConfig, AbstractConfigProvider } from '@riktajs/core';
|
|
28
|
-
* import { z } from 'zod';
|
|
29
|
-
*
|
|
30
|
-
* @ProviderConfig() // Token: 'APP_CONFIG'
|
|
31
|
-
* export class AppConfigProvider extends AbstractConfigProvider {
|
|
32
|
-
* schema() {
|
|
33
|
-
* return z.object({
|
|
34
|
-
* PORT: z.coerce.number().int().min(1).max(65535),
|
|
35
|
-
* HOST: z.string().default('localhost'),
|
|
36
|
-
* });
|
|
37
|
-
* }
|
|
38
|
-
*
|
|
39
|
-
* @ConfigProperty()
|
|
40
|
-
* port!: number;
|
|
41
|
-
*
|
|
42
|
-
* @ConfigProperty()
|
|
43
|
-
* host!: string;
|
|
44
|
-
* }
|
|
45
|
-
*
|
|
46
|
-
* // Inject with auto-generated token
|
|
47
|
-
* @Injectable()
|
|
48
|
-
* class MyService {
|
|
49
|
-
* @Autowired('APP_CONFIG')
|
|
50
|
-
* private config!: AppConfigProvider;
|
|
51
|
-
* }
|
|
52
|
-
* ```
|
|
53
|
-
*
|
|
54
|
-
* @example Custom token:
|
|
55
|
-
* ```typescript
|
|
56
|
-
* @ProviderConfig('DATABASE_CONFIG')
|
|
57
|
-
* export class DbConfigProvider extends AbstractConfigProvider {
|
|
58
|
-
* schema() {
|
|
59
|
-
* return z.object({
|
|
60
|
-
* DB_HOST: z.string(),
|
|
61
|
-
* DB_PORT: z.coerce.number().int(),
|
|
62
|
-
* DB_NAME: z.string(),
|
|
63
|
-
* });
|
|
64
|
-
* }
|
|
65
|
-
* }
|
|
66
|
-
*
|
|
67
|
-
* // Inject with custom token
|
|
68
|
-
* @Injectable()
|
|
69
|
-
* class DatabaseService {
|
|
70
|
-
* @Autowired('DATABASE_CONFIG')
|
|
71
|
-
* private config!: DbConfigProvider;
|
|
72
|
-
* }
|
|
73
|
-
* ```
|
|
74
|
-
*
|
|
75
|
-
* @example Type-safe token export:
|
|
76
|
-
* ```typescript
|
|
77
|
-
* export const APP_CONFIG = 'APP_CONFIG' as const;
|
|
78
|
-
*
|
|
79
|
-
* @ProviderConfig(APP_CONFIG)
|
|
80
|
-
* export class AppConfigProvider extends AbstractConfigProvider {
|
|
81
|
-
* // ...
|
|
82
|
-
* }
|
|
83
|
-
*
|
|
84
|
-
* // Type-safe injection
|
|
85
|
-
* @Injectable()
|
|
86
|
-
* class MyService {
|
|
87
|
-
* @Autowired(APP_CONFIG)
|
|
88
|
-
* private config!: AppConfigProvider;
|
|
89
|
-
* }
|
|
90
|
-
* ```
|
|
91
|
-
*/
|
|
92
|
-
export declare function ProviderConfig(token?: string): ClassDecorator;
|
|
93
|
-
/**
|
|
94
|
-
* Helper to retrieve config provider metadata from a class
|
|
95
|
-
*
|
|
96
|
-
* @param target - The class to retrieve metadata from
|
|
97
|
-
* @returns The config provider metadata or undefined
|
|
98
|
-
*/
|
|
99
|
-
export declare function getConfigProviderMetadata(target: Constructor): ConfigProviderMetadata | undefined;
|
|
100
|
-
/**
|
|
101
|
-
* Check if a class has @ProviderConfig decorator
|
|
102
|
-
*
|
|
103
|
-
* @param target - The class to check
|
|
104
|
-
* @returns True if the class is decorated with @ProviderConfig
|
|
105
|
-
*/
|
|
106
|
-
export declare function isConfigProvider(target: Constructor): boolean;
|
|
107
|
-
//# sourceMappingURL=provider-config.decorator.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"provider-config.decorator.d.ts","sourceRoot":"","sources":["../../../src/core/decorators/provider-config.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;OAGG;IACH,KAAK,EAAE,MAAM,CAAC;CACf;AAkCD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8EG;AACH,wBAAgB,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,cAAc,CAgC7D;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,WAAW,GAClB,sBAAsB,GAAG,SAAS,CAEpC;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAE7D"}
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ProviderConfig = ProviderConfig;
|
|
4
|
-
exports.getConfigProviderMetadata = getConfigProviderMetadata;
|
|
5
|
-
exports.isConfigProvider = isConfigProvider;
|
|
6
|
-
require("reflect-metadata");
|
|
7
|
-
const constants_1 = require("../constants");
|
|
8
|
-
/**
|
|
9
|
-
* Convert a class name to an uppercase config token
|
|
10
|
-
*
|
|
11
|
-
* @param className - The class name to convert
|
|
12
|
-
* @returns Uppercase token name
|
|
13
|
-
*
|
|
14
|
-
* @example
|
|
15
|
-
* ```typescript
|
|
16
|
-
* generateToken('AppConfigProvider') // Returns 'APP_CONFIG'
|
|
17
|
-
* generateToken('DatabaseConfigProvider') // Returns 'DATABASE_CONFIG'
|
|
18
|
-
* generateToken('MyCustomConfig') // Returns 'MY_CUSTOM_CONFIG'
|
|
19
|
-
* ```
|
|
20
|
-
*/
|
|
21
|
-
function generateTokenFromClassName(className) {
|
|
22
|
-
// Remove 'Provider' suffix if present
|
|
23
|
-
let tokenName = className.replace(/Provider$/, '');
|
|
24
|
-
// Convert camelCase/PascalCase to UPPER_SNAKE_CASE
|
|
25
|
-
tokenName = tokenName
|
|
26
|
-
.replace(/([A-Z])/g, '_$1')
|
|
27
|
-
.toUpperCase()
|
|
28
|
-
.replace(/^_/, '');
|
|
29
|
-
// Ensure it ends with _CONFIG if not already present
|
|
30
|
-
// But don't add it if the name already ends with CONFIG (after conversion)
|
|
31
|
-
if (!tokenName.endsWith('_CONFIG') && tokenName !== 'CONFIG') {
|
|
32
|
-
tokenName = `${tokenName}_CONFIG`;
|
|
33
|
-
}
|
|
34
|
-
return tokenName;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* @ProviderConfig() decorator
|
|
38
|
-
*
|
|
39
|
-
* Marks a class as a configuration provider that will be auto-discovered.
|
|
40
|
-
* Config providers extend AbstractConfigProvider and manage environment variables,
|
|
41
|
-
* validation with Zod schemas, and property mapping via @ConfigProperty.
|
|
42
|
-
*
|
|
43
|
-
* The decorator automatically generates an injection token from the class name
|
|
44
|
-
* if not explicitly provided, following the pattern: ClassName → CLASS_NAME_CONFIG
|
|
45
|
-
*
|
|
46
|
-
* @param token - Optional custom injection token (must be UPPERCASE)
|
|
47
|
-
*
|
|
48
|
-
* @example Auto-generated token:
|
|
49
|
-
* ```typescript
|
|
50
|
-
* import { ProviderConfig, AbstractConfigProvider } from '@riktajs/core';
|
|
51
|
-
* import { z } from 'zod';
|
|
52
|
-
*
|
|
53
|
-
* @ProviderConfig() // Token: 'APP_CONFIG'
|
|
54
|
-
* export class AppConfigProvider extends AbstractConfigProvider {
|
|
55
|
-
* schema() {
|
|
56
|
-
* return z.object({
|
|
57
|
-
* PORT: z.coerce.number().int().min(1).max(65535),
|
|
58
|
-
* HOST: z.string().default('localhost'),
|
|
59
|
-
* });
|
|
60
|
-
* }
|
|
61
|
-
*
|
|
62
|
-
* @ConfigProperty()
|
|
63
|
-
* port!: number;
|
|
64
|
-
*
|
|
65
|
-
* @ConfigProperty()
|
|
66
|
-
* host!: string;
|
|
67
|
-
* }
|
|
68
|
-
*
|
|
69
|
-
* // Inject with auto-generated token
|
|
70
|
-
* @Injectable()
|
|
71
|
-
* class MyService {
|
|
72
|
-
* @Autowired('APP_CONFIG')
|
|
73
|
-
* private config!: AppConfigProvider;
|
|
74
|
-
* }
|
|
75
|
-
* ```
|
|
76
|
-
*
|
|
77
|
-
* @example Custom token:
|
|
78
|
-
* ```typescript
|
|
79
|
-
* @ProviderConfig('DATABASE_CONFIG')
|
|
80
|
-
* export class DbConfigProvider extends AbstractConfigProvider {
|
|
81
|
-
* schema() {
|
|
82
|
-
* return z.object({
|
|
83
|
-
* DB_HOST: z.string(),
|
|
84
|
-
* DB_PORT: z.coerce.number().int(),
|
|
85
|
-
* DB_NAME: z.string(),
|
|
86
|
-
* });
|
|
87
|
-
* }
|
|
88
|
-
* }
|
|
89
|
-
*
|
|
90
|
-
* // Inject with custom token
|
|
91
|
-
* @Injectable()
|
|
92
|
-
* class DatabaseService {
|
|
93
|
-
* @Autowired('DATABASE_CONFIG')
|
|
94
|
-
* private config!: DbConfigProvider;
|
|
95
|
-
* }
|
|
96
|
-
* ```
|
|
97
|
-
*
|
|
98
|
-
* @example Type-safe token export:
|
|
99
|
-
* ```typescript
|
|
100
|
-
* export const APP_CONFIG = 'APP_CONFIG' as const;
|
|
101
|
-
*
|
|
102
|
-
* @ProviderConfig(APP_CONFIG)
|
|
103
|
-
* export class AppConfigProvider extends AbstractConfigProvider {
|
|
104
|
-
* // ...
|
|
105
|
-
* }
|
|
106
|
-
*
|
|
107
|
-
* // Type-safe injection
|
|
108
|
-
* @Injectable()
|
|
109
|
-
* class MyService {
|
|
110
|
-
* @Autowired(APP_CONFIG)
|
|
111
|
-
* private config!: AppConfigProvider;
|
|
112
|
-
* }
|
|
113
|
-
* ```
|
|
114
|
-
*/
|
|
115
|
-
function ProviderConfig(token) {
|
|
116
|
-
return (target) => {
|
|
117
|
-
const className = target.name;
|
|
118
|
-
// Generate token from class name if not provided
|
|
119
|
-
const configToken = token ?? generateTokenFromClassName(className);
|
|
120
|
-
// Validate token format
|
|
121
|
-
if (!configToken || typeof configToken !== 'string') {
|
|
122
|
-
throw new Error(`@ProviderConfig: Invalid token for class "${className}". Token must be a non-empty string.`);
|
|
123
|
-
}
|
|
124
|
-
// Ensure token is uppercase (convention)
|
|
125
|
-
if (configToken !== configToken.toUpperCase()) {
|
|
126
|
-
throw new Error(`@ProviderConfig: Token "${configToken}" for class "${className}" must be UPPERCASE. ` +
|
|
127
|
-
`Use "${configToken.toUpperCase()}" instead.`);
|
|
128
|
-
}
|
|
129
|
-
// Store metadata
|
|
130
|
-
const metadata = {
|
|
131
|
-
token: configToken,
|
|
132
|
-
};
|
|
133
|
-
Reflect.defineMetadata(constants_1.CONFIG_PROVIDER_METADATA, metadata, target);
|
|
134
|
-
// Note: Registration with the Registry will happen during auto-discovery (Step 3)
|
|
135
|
-
// For now, we just store the metadata
|
|
136
|
-
};
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Helper to retrieve config provider metadata from a class
|
|
140
|
-
*
|
|
141
|
-
* @param target - The class to retrieve metadata from
|
|
142
|
-
* @returns The config provider metadata or undefined
|
|
143
|
-
*/
|
|
144
|
-
function getConfigProviderMetadata(target) {
|
|
145
|
-
return Reflect.getMetadata(constants_1.CONFIG_PROVIDER_METADATA, target);
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* Check if a class has @ProviderConfig decorator
|
|
149
|
-
*
|
|
150
|
-
* @param target - The class to check
|
|
151
|
-
* @returns True if the class is decorated with @ProviderConfig
|
|
152
|
-
*/
|
|
153
|
-
function isConfigProvider(target) {
|
|
154
|
-
return Reflect.hasMetadata(constants_1.CONFIG_PROVIDER_METADATA, target);
|
|
155
|
-
}
|
|
156
|
-
//# sourceMappingURL=provider-config.decorator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"provider-config.decorator.js","sourceRoot":"","sources":["../../../src/core/decorators/provider-config.decorator.ts"],"names":[],"mappings":";;AA8HA,wCAgCC;AAQD,8DAIC;AAQD,4CAEC;AApLD,4BAA0B;AAC1B,4CAAwD;AAcxD;;;;;;;;;;;;GAYG;AACH,SAAS,0BAA0B,CAAC,SAAiB;IACnD,sCAAsC;IACtC,IAAI,SAAS,GAAG,SAAS,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAEnD,mDAAmD;IACnD,SAAS,GAAG,SAAS;SAClB,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC;SAC1B,WAAW,EAAE;SACb,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAErB,qDAAqD;IACrD,2EAA2E;IAC3E,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;QAC7D,SAAS,GAAG,GAAG,SAAS,SAAS,CAAC;IACpC,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8EG;AACH,SAAgB,cAAc,CAAC,KAAc;IAC3C,OAAO,CAA6B,MAAiB,EAAE,EAAE;QACvD,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC;QAE9B,iDAAiD;QACjD,MAAM,WAAW,GAAG,KAAK,IAAI,0BAA0B,CAAC,SAAS,CAAC,CAAC;QAEnE,wBAAwB;QACxB,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CACb,6CAA6C,SAAS,sCAAsC,CAC7F,CAAC;QACJ,CAAC;QAED,yCAAyC;QACzC,IAAI,WAAW,KAAK,WAAW,CAAC,WAAW,EAAE,EAAE,CAAC;YAC9C,MAAM,IAAI,KAAK,CACb,2BAA2B,WAAW,gBAAgB,SAAS,uBAAuB;gBACtF,QAAQ,WAAW,CAAC,WAAW,EAAE,YAAY,CAC9C,CAAC;QACJ,CAAC;QAED,iBAAiB;QACjB,MAAM,QAAQ,GAA2B;YACvC,KAAK,EAAE,WAAqB;SAC7B,CAAC;QAEF,OAAO,CAAC,cAAc,CAAC,oCAAwB,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;QAEnE,kFAAkF;QAClF,sCAAsC;IACxC,CAAC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAgB,yBAAyB,CACvC,MAAmB;IAEnB,OAAO,OAAO,CAAC,WAAW,CAAC,oCAAwB,EAAE,MAAM,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;GAKG;AACH,SAAgB,gBAAgB,CAAC,MAAmB;IAClD,OAAO,OAAO,CAAC,WAAW,CAAC,oCAAwB,EAAE,MAAM,CAAC,CAAC;AAC/D,CAAC"}
|