@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 CHANGED
@@ -1,179 +1,54 @@
1
- # 🧭 Rikta
2
-
3
- > **The Zero-Config TypeScript Framework for Modern Backends.**
4
-
5
- Build scalable APIs with the power of Fastify and the elegance of decorators. No modules. No boilerplate. Just code.
6
-
7
- [![NPM Version](https://img.shields.io/npm/v/@riktajs/core)](https://www.npmjs.com/package/@riktajs/core)
8
- [![License](https://img.shields.io/npm/l/@riktajs/core)](LICENSE)
9
-
10
- ---
11
-
12
- ## 🤔 Why Rikta?
13
-
14
- Are you tired of **"Module Hell"** in NestJS? Do you miss the simplicity of Express but need the structure of a real framework?
15
-
16
- **Rikta** is designed for developers who want to move fast without breaking things.
17
-
18
- * 🚀 **Zero-Config Autowiring:** No `imports: []`, `exports: []`, or `providers: []` arrays. Just decorate your class, and it works.
19
- * ⚡ **Fastify Powered:** Built on top of Fastify for maximum performance and low overhead.
20
- * 🛡️ **Type-Safe by Default:** Native Zod integration for validation that infers your TypeScript types automatically.
21
- * 🔄 **Hybrid Lifecycle:** Powerful hooks and an event bus for complex application flows.
22
-
23
- Rikta is nordic for "guide". Let Rikta guide you to build better backends, faster.
24
-
25
- ---
26
-
27
- ## ⚡ Quick Start
28
-
29
- ### 1. Install
30
-
31
- ```bash
32
- npm install @riktajs/core
33
- ```
34
-
35
- ### 2. Create your App
36
-
37
- No complex setup. Just one file is enough to start.
38
-
39
- ```typescript
40
- // main.ts
41
- import { Rikta, Controller, Injectable, Get, Post, Body, Autowired, z } from '@riktajs/core';
42
-
43
- // 1. Define a Service (Auto-discovered!)
44
- @Injectable()
45
- class UserService {
46
- private users = [{ id: 1, name: 'Rikta User' }];
47
-
48
- findAll() { return this.users; }
49
-
50
- create(name: string) {
51
- const user = { id: this.users.length + 1, name };
52
- this.users.push(user);
53
- return user;
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":"AAIA;;GAEG;AACH,eAAO,MAAM,mBAAmB,eAAgC,CAAC;AAEjE;;GAEG;AACH,eAAO,MAAM,eAAe,eAA4B,CAAC;AAEzD;;GAEG;AACH,eAAO,MAAM,mBAAmB,eAAgC,CAAC;AAEjE;;GAEG;AACH,eAAO,MAAM,cAAc,eAA2B,CAAC;AAEvD;;GAEG;AACH,eAAO,MAAM,eAAe,eAA4B,CAAC;AAEzD;;GAEG;AACH,eAAO,MAAM,qBAAqB,eAAkC,CAAC;AAErE;;GAEG;AACH,eAAO,MAAM,mBAAmB,eAAgC,CAAC;AAEjE;;GAEG;AACH,eAAO,MAAM,kBAAkB,eAA+B,CAAC;AAE/D;;GAEG;AACH,eAAO,MAAM,gBAAgB,eAA6B,CAAC;AAE3D;;GAEG;AACH,eAAO,MAAM,eAAe,eAA4B,CAAC;AAEzD;;GAEG;AACH,eAAO,MAAM,mBAAmB,eAAgC,CAAC;AAEjE;;GAEG;AACH,eAAO,MAAM,kBAAkB,eAA+B,CAAC;AAE/D;;GAEG;AACH,eAAO,MAAM,iBAAiB,eAA8B,CAAC;AAM7D;;;;;;;;;;;;;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"}
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"}
@@ -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,qBAAqB,CAAC,CAAC;AAEjE;;GAEG;AACU,QAAA,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAEzD;;GAEG;AACU,QAAA,mBAAmB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAEjE;;GAEG;AACU,QAAA,cAAc,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAEvD;;GAEG;AACU,QAAA,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAEzD;;GAEG;AACU,QAAA,qBAAqB,GAAG,MAAM,CAAC,uBAAuB,CAAC,CAAC;AAErE;;GAEG;AACU,QAAA,mBAAmB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAEjE;;GAEG;AACU,QAAA,kBAAkB,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAE/D;;GAEG;AACU,QAAA,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAE3D;;GAEG;AACU,QAAA,eAAe,GAAG,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAEzD;;GAEG;AACU,QAAA,mBAAmB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAEjE;;GAEG;AACU,QAAA,kBAAkB,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAE/D;;GAEG;AACU,QAAA,iBAAiB,GAAG,MAAM,CAAC,mBAAmB,CAAC,CAAC;AAE7D,+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"}
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"}
@@ -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
@@ -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;AAKzB,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"}
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"}
@@ -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';
@@ -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;AAEzB,gCAAgC;AAChC,+DAA+D;AAC/D,uDAAuD;AACvD,2BAAwB;AAAf,wFAAA,CAAC,OAAA"}
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.1",
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"}