@venizia/ignis-docs 0.0.2 → 0.0.4-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/README.md +1 -1
- package/package.json +4 -2
- package/wiki/best-practices/api-usage-examples.md +591 -0
- package/wiki/best-practices/architectural-patterns.md +415 -0
- package/wiki/best-practices/architecture-decisions.md +488 -0
- package/wiki/{get-started/best-practices → best-practices}/code-style-standards.md +647 -182
- package/wiki/{get-started/best-practices → best-practices}/common-pitfalls.md +109 -4
- package/wiki/{get-started/best-practices → best-practices}/contribution-workflow.md +34 -7
- package/wiki/best-practices/data-modeling.md +376 -0
- package/wiki/best-practices/deployment-strategies.md +698 -0
- package/wiki/best-practices/index.md +27 -0
- package/wiki/best-practices/performance-optimization.md +196 -0
- package/wiki/best-practices/security-guidelines.md +218 -0
- package/wiki/{get-started/best-practices → best-practices}/troubleshooting-tips.md +97 -1
- package/wiki/changelogs/2025-12-16-initial-architecture.md +1 -1
- package/wiki/changelogs/2025-12-16-model-repo-datasource-refactor.md +1 -1
- package/wiki/changelogs/2025-12-17-refactor.md +1 -1
- package/wiki/changelogs/2025-12-18-performance-optimizations.md +5 -5
- package/wiki/changelogs/2025-12-18-repository-validation-security.md +13 -7
- package/wiki/changelogs/2025-12-26-nested-relations-and-generics.md +86 -0
- package/wiki/changelogs/2025-12-26-transaction-support.md +57 -0
- package/wiki/changelogs/2025-12-29-dynamic-binding-registration.md +104 -0
- package/wiki/changelogs/2025-12-29-snowflake-uid-helper.md +100 -0
- package/wiki/changelogs/2025-12-30-repository-enhancements.md +214 -0
- package/wiki/changelogs/2025-12-31-json-path-filtering-array-operators.md +214 -0
- package/wiki/changelogs/2025-12-31-string-id-custom-generator.md +137 -0
- package/wiki/changelogs/2026-01-02-default-filter-and-repository-mixins.md +418 -0
- package/wiki/changelogs/index.md +8 -1
- package/wiki/changelogs/planned-schema-migrator.md +2 -10
- package/wiki/{get-started/core-concepts → guides/core-concepts/application}/bootstrapping.md +18 -5
- package/wiki/{get-started/core-concepts/application.md → guides/core-concepts/application/index.md} +47 -104
- package/wiki/guides/core-concepts/components-guide.md +509 -0
- package/wiki/guides/core-concepts/components.md +122 -0
- package/wiki/{get-started → guides}/core-concepts/controllers.md +30 -13
- package/wiki/{get-started → guides}/core-concepts/dependency-injection.md +97 -0
- package/wiki/guides/core-concepts/persistent/datasources.md +179 -0
- package/wiki/guides/core-concepts/persistent/index.md +119 -0
- package/wiki/guides/core-concepts/persistent/models.md +241 -0
- package/wiki/guides/core-concepts/persistent/repositories.md +219 -0
- package/wiki/guides/core-concepts/persistent/transactions.md +170 -0
- package/wiki/{get-started → guides}/core-concepts/services.md +26 -3
- package/wiki/{get-started → guides/get-started}/5-minute-quickstart.md +59 -14
- package/wiki/guides/get-started/philosophy.md +682 -0
- package/wiki/guides/get-started/setup.md +157 -0
- package/wiki/guides/index.md +89 -0
- package/wiki/guides/reference/glossary.md +243 -0
- package/wiki/{get-started → guides/reference}/mcp-docs-server.md +0 -10
- package/wiki/{get-started → guides/tutorials}/building-a-crud-api.md +134 -132
- package/wiki/{get-started/quickstart.md → guides/tutorials/complete-installation.md} +107 -71
- package/wiki/guides/tutorials/ecommerce-api.md +1399 -0
- package/wiki/guides/tutorials/realtime-chat.md +1261 -0
- package/wiki/guides/tutorials/testing.md +723 -0
- package/wiki/index.md +176 -37
- package/wiki/references/base/application.md +27 -0
- package/wiki/references/base/bootstrapping.md +30 -26
- package/wiki/references/base/components.md +532 -31
- package/wiki/references/base/controllers.md +136 -38
- package/wiki/references/base/datasources.md +108 -5
- package/wiki/references/base/dependency-injection.md +39 -3
- package/wiki/references/base/filter-system/application-usage.md +224 -0
- package/wiki/references/base/filter-system/array-operators.md +132 -0
- package/wiki/references/base/filter-system/comparison-operators.md +109 -0
- package/wiki/references/base/filter-system/default-filter.md +428 -0
- package/wiki/references/base/filter-system/fields-order-pagination.md +155 -0
- package/wiki/references/base/filter-system/index.md +127 -0
- package/wiki/references/base/filter-system/json-filtering.md +197 -0
- package/wiki/references/base/filter-system/list-operators.md +71 -0
- package/wiki/references/base/filter-system/logical-operators.md +156 -0
- package/wiki/references/base/filter-system/null-operators.md +58 -0
- package/wiki/references/base/filter-system/pattern-matching.md +108 -0
- package/wiki/references/base/filter-system/quick-reference.md +431 -0
- package/wiki/references/base/filter-system/range-operators.md +63 -0
- package/wiki/references/base/filter-system/tips.md +190 -0
- package/wiki/references/base/filter-system/use-cases.md +452 -0
- package/wiki/references/base/index.md +90 -0
- package/wiki/references/base/middlewares.md +602 -0
- package/wiki/references/base/models.md +215 -23
- package/wiki/references/base/providers.md +732 -0
- package/wiki/references/base/repositories/advanced.md +555 -0
- package/wiki/references/base/repositories/index.md +228 -0
- package/wiki/references/base/repositories/mixins.md +331 -0
- package/wiki/references/base/repositories/relations.md +486 -0
- package/wiki/references/base/repositories.md +40 -549
- package/wiki/references/base/services.md +28 -4
- package/wiki/references/components/authentication.md +22 -2
- package/wiki/references/components/health-check.md +12 -0
- package/wiki/references/components/index.md +23 -0
- package/wiki/references/components/mail.md +687 -0
- package/wiki/references/components/request-tracker.md +16 -0
- package/wiki/references/components/socket-io.md +18 -0
- package/wiki/references/components/static-asset.md +14 -26
- package/wiki/references/components/swagger.md +17 -0
- package/wiki/references/configuration/environment-variables.md +427 -0
- package/wiki/references/configuration/index.md +73 -0
- package/wiki/references/helpers/cron.md +14 -0
- package/wiki/references/helpers/crypto.md +15 -0
- package/wiki/references/helpers/env.md +16 -0
- package/wiki/references/helpers/error.md +17 -0
- package/wiki/references/helpers/index.md +15 -0
- package/wiki/references/helpers/inversion.md +24 -4
- package/wiki/references/helpers/logger.md +19 -0
- package/wiki/references/helpers/network.md +11 -0
- package/wiki/references/helpers/queue.md +19 -0
- package/wiki/references/helpers/redis.md +21 -0
- package/wiki/references/helpers/socket-io.md +24 -5
- package/wiki/references/helpers/storage.md +18 -10
- package/wiki/references/helpers/testing.md +18 -0
- package/wiki/references/helpers/types.md +167 -0
- package/wiki/references/helpers/uid.md +167 -0
- package/wiki/references/helpers/worker-thread.md +16 -0
- package/wiki/references/index.md +177 -0
- package/wiki/references/quick-reference.md +634 -0
- package/wiki/references/src-details/boot.md +3 -3
- package/wiki/references/src-details/dev-configs.md +0 -4
- package/wiki/references/src-details/docs.md +2 -2
- package/wiki/references/src-details/index.md +86 -0
- package/wiki/references/src-details/inversion.md +1 -6
- package/wiki/references/src-details/mcp-server.md +3 -15
- package/wiki/references/utilities/index.md +86 -10
- package/wiki/references/utilities/jsx.md +577 -0
- package/wiki/references/utilities/request.md +0 -2
- package/wiki/references/utilities/statuses.md +740 -0
- package/wiki/changelogs/planned-transaction-support.md +0 -216
- package/wiki/get-started/best-practices/api-usage-examples.md +0 -266
- package/wiki/get-started/best-practices/architectural-patterns.md +0 -170
- package/wiki/get-started/best-practices/data-modeling.md +0 -177
- package/wiki/get-started/best-practices/deployment-strategies.md +0 -121
- package/wiki/get-started/best-practices/performance-optimization.md +0 -88
- package/wiki/get-started/best-practices/security-guidelines.md +0 -99
- package/wiki/get-started/core-concepts/components.md +0 -98
- package/wiki/get-started/core-concepts/persistent.md +0 -543
- package/wiki/get-started/index.md +0 -65
- package/wiki/get-started/philosophy.md +0 -296
- package/wiki/get-started/prerequisites.md +0 -113
|
@@ -92,3 +92,17 @@ Creates a new `CronHelper` instance with the same configuration but a new `cronT
|
|
|
92
92
|
const anotherJob = myJob.duplicate({ cronTime: '0 0 * * *' }); // Runs once at midnight
|
|
93
93
|
anotherJob.start();
|
|
94
94
|
```
|
|
95
|
+
|
|
96
|
+
## See Also
|
|
97
|
+
|
|
98
|
+
- **Related Concepts:**
|
|
99
|
+
- [Services](/guides/core-concepts/services) - Scheduling jobs in services
|
|
100
|
+
- [Application](/guides/core-concepts/application/) - Scheduling on app startup
|
|
101
|
+
|
|
102
|
+
- **Other Helpers:**
|
|
103
|
+
- [Helpers Index](./index) - All available helpers
|
|
104
|
+
- [Queue Helper](./queue) - Message queue processing
|
|
105
|
+
|
|
106
|
+
- **External Resources:**
|
|
107
|
+
- [Cron Expression Guide](https://crontab.guru/) - Cron syntax reference
|
|
108
|
+
- [node-cron Documentation](https://github.com/node-cron/node-cron) - Cron library
|
|
@@ -115,3 +115,18 @@ const sha256Hash = hash('some text', {
|
|
|
115
115
|
outputType: 'hex',
|
|
116
116
|
});
|
|
117
117
|
```
|
|
118
|
+
|
|
119
|
+
## See Also
|
|
120
|
+
|
|
121
|
+
- **Related Concepts:**
|
|
122
|
+
- [Services](/guides/core-concepts/services) - Password hashing in user service
|
|
123
|
+
|
|
124
|
+
- **Other Helpers:**
|
|
125
|
+
- [Helpers Index](./index) - All available helpers
|
|
126
|
+
|
|
127
|
+
- **References:**
|
|
128
|
+
- [Crypto Utility](/references/utilities/crypto) - Pure crypto utilities
|
|
129
|
+
- [Authentication Component](/references/components/authentication) - JWT and password verification
|
|
130
|
+
|
|
131
|
+
- **Best Practices:**
|
|
132
|
+
- [Security Guidelines](/best-practices/security-guidelines) - Cryptographic best practices
|
|
@@ -65,3 +65,19 @@ APPLICATION_ENV_PREFIX=MY_APP_ENV
|
|
|
65
65
|
MY_APP_ENV_SERVER_HOST=0.0.0.0
|
|
66
66
|
MY_APP_ENV_SERVER_PORT=3000
|
|
67
67
|
```
|
|
68
|
+
|
|
69
|
+
## See Also
|
|
70
|
+
|
|
71
|
+
- **Related Concepts:**
|
|
72
|
+
- [Application](/guides/core-concepts/application/) - Environment validation
|
|
73
|
+
- [DataSources](/guides/core-concepts/persistent/datasources) - Database configuration
|
|
74
|
+
|
|
75
|
+
- **Other Helpers:**
|
|
76
|
+
- [Helpers Index](./index) - All available helpers
|
|
77
|
+
|
|
78
|
+
- **References:**
|
|
79
|
+
- [Environment Variables](/references/configuration/environment-variables) - Complete environment reference
|
|
80
|
+
|
|
81
|
+
- **Best Practices:**
|
|
82
|
+
- [Security Guidelines](/best-practices/security-guidelines) - Environment variable security
|
|
83
|
+
- [Deployment Strategies](/best-practices/deployment-strategies) - Environment management
|
|
@@ -78,3 +78,20 @@ In development mode, the response will include the stack trace and error cause f
|
|
|
78
78
|
"path": "/api/users/123"
|
|
79
79
|
}
|
|
80
80
|
```
|
|
81
|
+
|
|
82
|
+
## See Also
|
|
83
|
+
|
|
84
|
+
- **Related Concepts:**
|
|
85
|
+
- [Controllers](/guides/core-concepts/controllers) - Throwing errors in controllers
|
|
86
|
+
- [Services](/guides/core-concepts/services) - Error handling in services
|
|
87
|
+
|
|
88
|
+
- **Other Helpers:**
|
|
89
|
+
- [Helpers Index](./index) - All available helpers
|
|
90
|
+
- [Logger Helper](./logger) - Logging errors
|
|
91
|
+
|
|
92
|
+
- **References:**
|
|
93
|
+
- [Middlewares](/references/base/middlewares) - Error handler middleware
|
|
94
|
+
|
|
95
|
+
- **Best Practices:**
|
|
96
|
+
- [Common Pitfalls](/best-practices/common-pitfalls) - Error handling anti-patterns
|
|
97
|
+
- [Troubleshooting Tips](/best-practices/troubleshooting-tips) - Debugging errors
|
|
@@ -6,6 +6,7 @@ Reusable classes and functions providing common functionality - designed for eas
|
|
|
6
6
|
|
|
7
7
|
| Helper | Purpose | Key Features |
|
|
8
8
|
|--------|---------|--------------|
|
|
9
|
+
| [Common Types](./types.md) | Utility types | Nullable, resolvers, class types |
|
|
9
10
|
| [Cron](./cron.md) | Job scheduling | Cron expressions, task management |
|
|
10
11
|
| [Crypto](./crypto.md) | Cryptographic operations | Hashing, AES/RSA encryption/decryption |
|
|
11
12
|
| [Environment](./env.md) | Environment variables | Centralized config access |
|
|
@@ -18,4 +19,18 @@ Reusable classes and functions providing common functionality - designed for eas
|
|
|
18
19
|
| [Socket.IO](./socket-io.md) | Real-time communication | Socket.IO client/server helpers |
|
|
19
20
|
| [Storage](./storage.md) | File storage | In-memory, Minio object storage |
|
|
20
21
|
| [Testing](./testing.md) | Test utilities | Test plan runner, base test classes |
|
|
22
|
+
| [UID](./uid.md) | Unique ID generation | Snowflake IDs, Base62 encoding |
|
|
21
23
|
| [Worker Thread](./worker-thread.md) | Worker threads | Node.js worker management |
|
|
24
|
+
|
|
25
|
+
## See Also
|
|
26
|
+
|
|
27
|
+
- **Related Concepts:**
|
|
28
|
+
- [Services](/guides/core-concepts/services) - Using helpers in service layer
|
|
29
|
+
- [Controllers](/guides/core-concepts/controllers) - Using helpers in controllers
|
|
30
|
+
|
|
31
|
+
- **References:**
|
|
32
|
+
- [Utilities](/references/utilities/) - Pure utility functions
|
|
33
|
+
- [Components](/references/components/) - Framework components
|
|
34
|
+
|
|
35
|
+
- **Best Practices:**
|
|
36
|
+
- [Code Style Standards](/best-practices/code-style-standards) - Helper usage patterns
|
|
@@ -111,12 +111,13 @@ import { UserService } from '../services/user.service';
|
|
|
111
111
|
@controller({ path: '/users' })
|
|
112
112
|
export class UserController extends BaseController {
|
|
113
113
|
constructor(
|
|
114
|
-
@inject({ key: 'services.UserService' })
|
|
114
|
+
@inject({ key: 'services.UserService' })
|
|
115
|
+
private _userService: UserService
|
|
115
116
|
) {
|
|
116
117
|
super({ scope: UserController.name, path: '/users' });
|
|
117
118
|
}
|
|
118
119
|
|
|
119
|
-
// ... use this.
|
|
120
|
+
// ... use this._userService
|
|
120
121
|
}
|
|
121
122
|
```
|
|
122
123
|
|
|
@@ -131,13 +132,13 @@ import { UserService } from '../services/user.service';
|
|
|
131
132
|
@controller({ path: '/users' })
|
|
132
133
|
export class UserController extends BaseController {
|
|
133
134
|
@inject({ key: 'services.UserService' })
|
|
134
|
-
private
|
|
135
|
+
private _userService: UserService;
|
|
135
136
|
|
|
136
137
|
constructor() {
|
|
137
138
|
super({ scope: UserController.name, path: '/users' });
|
|
138
139
|
}
|
|
139
140
|
|
|
140
|
-
// ... use this.
|
|
141
|
+
// ... use this._userService
|
|
141
142
|
}
|
|
142
143
|
```
|
|
143
144
|
|
|
@@ -154,3 +155,22 @@ The `MetadataRegistry` is a crucial part of the DI and routing systems. It's a s
|
|
|
154
155
|
- When the `Container` instantiates a class, it queries the `MetadataRegistry` to find out which dependencies need to be injected and where.
|
|
155
156
|
|
|
156
157
|
You typically won't interact with the `MetadataRegistry` directly, but it's the underlying mechanism that makes the decorator-based DI and routing systems work seamlessly.
|
|
158
|
+
|
|
159
|
+
## See Also
|
|
160
|
+
|
|
161
|
+
- **Related Concepts:**
|
|
162
|
+
- [Dependency Injection Guide](/guides/core-concepts/dependency-injection) - DI fundamentals
|
|
163
|
+
- [Application](/guides/core-concepts/application/) - Application extends Container
|
|
164
|
+
|
|
165
|
+
- **Other Helpers:**
|
|
166
|
+
- [Helpers Index](./index) - All available helpers
|
|
167
|
+
|
|
168
|
+
- **References:**
|
|
169
|
+
- [Dependency Injection API](/references/base/dependency-injection) - Complete DI reference
|
|
170
|
+
- [Glossary](/guides/reference/glossary#dependency-injection-di) - DI concepts
|
|
171
|
+
|
|
172
|
+
- **Tutorials:**
|
|
173
|
+
- [Testing](/guides/tutorials/testing) - Unit testing with DI
|
|
174
|
+
|
|
175
|
+
- **Best Practices:**
|
|
176
|
+
- [Architectural Patterns](/best-practices/architectural-patterns) - DI patterns
|
|
@@ -96,3 +96,22 @@ const myCustomWinstonLogger = defineCustomLogger({
|
|
|
96
96
|
const myLogger = new Logger({ customLogger: myCustomWinstonLogger });
|
|
97
97
|
myLogger.withScope('CustomScope').info('This is a custom log message.');
|
|
98
98
|
```
|
|
99
|
+
|
|
100
|
+
## See Also
|
|
101
|
+
|
|
102
|
+
- **Related Concepts:**
|
|
103
|
+
- [Services](/guides/core-concepts/services) - Logging in services
|
|
104
|
+
- [Controllers](/guides/core-concepts/controllers) - Logging in controllers
|
|
105
|
+
|
|
106
|
+
- **Other Helpers:**
|
|
107
|
+
- [Helpers Index](./index) - All available helpers
|
|
108
|
+
- [Error Helper](./error) - Error handling utilities
|
|
109
|
+
|
|
110
|
+
- **References:**
|
|
111
|
+
- [Request Tracker Component](/references/components/request-tracker) - Request logging
|
|
112
|
+
|
|
113
|
+
- **External Resources:**
|
|
114
|
+
- [Winston Documentation](https://github.com/winstonjs/winston) - Winston logging library
|
|
115
|
+
|
|
116
|
+
- **Best Practices:**
|
|
117
|
+
- [Troubleshooting Tips](/best-practices/troubleshooting-tips) - Using logs for debugging
|
|
@@ -141,3 +141,14 @@ const udpClient = new NetworkUdpClient({
|
|
|
141
141
|
|
|
142
142
|
udpClient.connect();
|
|
143
143
|
```
|
|
144
|
+
|
|
145
|
+
## See Also
|
|
146
|
+
|
|
147
|
+
- **Related Concepts:**
|
|
148
|
+
- [Services](/guides/core-concepts/services) - Network operations in services
|
|
149
|
+
|
|
150
|
+
- **Other Helpers:**
|
|
151
|
+
- [Helpers Index](./index) - All available helpers
|
|
152
|
+
|
|
153
|
+
- **Best Practices:**
|
|
154
|
+
- [Security Guidelines](/best-practices/security-guidelines) - Network security
|
|
@@ -129,3 +129,22 @@ const myQueue = new QueueHelper<string>({
|
|
|
129
129
|
myQueue.enqueue('message 1');
|
|
130
130
|
myQueue.enqueue('message 2');
|
|
131
131
|
```
|
|
132
|
+
|
|
133
|
+
## See Also
|
|
134
|
+
|
|
135
|
+
- **Related Concepts:**
|
|
136
|
+
- [Services](/guides/core-concepts/services) - Background job processing
|
|
137
|
+
|
|
138
|
+
- **Other Helpers:**
|
|
139
|
+
- [Helpers Index](./index) - All available helpers
|
|
140
|
+
- [Cron Helper](./cron) - Scheduled tasks
|
|
141
|
+
- [Redis Helper](./redis) - Redis pub/sub
|
|
142
|
+
|
|
143
|
+
- **References:**
|
|
144
|
+
- [Mail Component](/references/components/mail) - Email queue integration
|
|
145
|
+
|
|
146
|
+
- **External Resources:**
|
|
147
|
+
- [BullMQ Documentation](https://docs.bullmq.io/) - BullMQ queue library
|
|
148
|
+
|
|
149
|
+
- **Best Practices:**
|
|
150
|
+
- [Performance Optimization](/best-practices/performance-optimization) - Queue optimization
|
|
@@ -119,3 +119,24 @@ await redisClient.publish({
|
|
|
119
119
|
payload: { data: 'some important update' },
|
|
120
120
|
});
|
|
121
121
|
```
|
|
122
|
+
|
|
123
|
+
## See Also
|
|
124
|
+
|
|
125
|
+
- **Related Concepts:**
|
|
126
|
+
- [Services](/guides/core-concepts/services) - Using Redis in services
|
|
127
|
+
|
|
128
|
+
- **Other Helpers:**
|
|
129
|
+
- [Helpers Index](./index) - All available helpers
|
|
130
|
+
- [Queue Helper](./queue) - BullMQ uses Redis as backend
|
|
131
|
+
|
|
132
|
+
- **References:**
|
|
133
|
+
- [DataSources](/references/base/datasources) - Database connections
|
|
134
|
+
|
|
135
|
+
- **External Resources:**
|
|
136
|
+
- [ioredis Documentation](https://github.com/redis/ioredis) - Redis client library
|
|
137
|
+
- [Redis Commands](https://redis.io/commands/) - Redis command reference
|
|
138
|
+
- [RedisJSON](https://redis.io/docs/stack/json/) - JSON module documentation
|
|
139
|
+
|
|
140
|
+
- **Best Practices:**
|
|
141
|
+
- [Performance Optimization](/best-practices/performance-optimization) - Caching strategies
|
|
142
|
+
- [Security Guidelines](/best-practices/security-guidelines) - Redis security
|
|
@@ -40,14 +40,14 @@ import { SocketIOServerHelper, SocketIOBindingKeys, inject } from '@venizia/igni
|
|
|
40
40
|
// ... in a service or controller
|
|
41
41
|
|
|
42
42
|
@inject({ key: SocketIOBindingKeys.SOCKET_IO_INSTANCE })
|
|
43
|
-
private
|
|
43
|
+
private _io: SocketIOServerHelper;
|
|
44
44
|
|
|
45
|
-
sendNotification(userId: string
|
|
46
|
-
this.
|
|
47
|
-
destination: userId, // Room or socket ID
|
|
45
|
+
sendNotification(opts: { userId: string; message: string }) {
|
|
46
|
+
this._io.send({
|
|
47
|
+
destination: opts.userId, // Room or socket ID
|
|
48
48
|
payload: {
|
|
49
49
|
topic: 'notification',
|
|
50
|
-
data: { message },
|
|
50
|
+
data: { message: opts.message },
|
|
51
51
|
},
|
|
52
52
|
});
|
|
53
53
|
}
|
|
@@ -101,3 +101,22 @@ socketClient.subscribe({
|
|
|
101
101
|
},
|
|
102
102
|
});
|
|
103
103
|
```
|
|
104
|
+
|
|
105
|
+
## See Also
|
|
106
|
+
|
|
107
|
+
- **Related Concepts:**
|
|
108
|
+
- [Services](/guides/core-concepts/services) - Real-time communication in services
|
|
109
|
+
|
|
110
|
+
- **Other Helpers:**
|
|
111
|
+
- [Helpers Index](./index) - All available helpers
|
|
112
|
+
- [Redis Helper](./redis) - For Socket.IO scaling with Redis adapter
|
|
113
|
+
|
|
114
|
+
- **References:**
|
|
115
|
+
- [Socket.IO Component](/references/components/socket-io) - Full component setup
|
|
116
|
+
|
|
117
|
+
- **External Resources:**
|
|
118
|
+
- [Socket.IO Documentation](https://socket.io/docs/) - Official Socket.IO docs
|
|
119
|
+
- [Socket.IO Redis Adapter](https://socket.io/docs/v4/redis-adapter/) - Scaling guide
|
|
120
|
+
|
|
121
|
+
- **Tutorials:**
|
|
122
|
+
- [Real-Time Chat Application](/guides/tutorials/real-time-chat) - Socket.IO tutorial
|
|
@@ -128,7 +128,6 @@ const allKeys = memoryStore.keys();
|
|
|
128
128
|
memoryStore.clear();
|
|
129
129
|
```
|
|
130
130
|
|
|
131
|
-
---
|
|
132
131
|
|
|
133
132
|
## `DiskHelper`
|
|
134
133
|
|
|
@@ -345,7 +344,6 @@ const cloudStorage = new MinioHelper({ /* ... */ });
|
|
|
345
344
|
const localStorage = new DiskHelper({ basePath: './system-files' });
|
|
346
345
|
```
|
|
347
346
|
|
|
348
|
-
---
|
|
349
347
|
|
|
350
348
|
## `MinioHelper`
|
|
351
349
|
|
|
@@ -443,7 +441,6 @@ await minioClient.removeObject({ bucket: 'my-bucket', name: 'my-file.txt' });
|
|
|
443
441
|
await minioClient.removeObjects({ bucket: 'my-bucket', names: ['file1.txt', 'file2.txt'] });
|
|
444
442
|
```
|
|
445
443
|
|
|
446
|
-
---
|
|
447
444
|
|
|
448
445
|
## DiskHelper vs MinioHelper Comparison
|
|
449
446
|
|
|
@@ -495,7 +492,6 @@ const systemStorage = new DiskHelper({ basePath: './system' });
|
|
|
495
492
|
const tempStorage = new DiskHelper({ basePath: './temp' });
|
|
496
493
|
```
|
|
497
494
|
|
|
498
|
-
---
|
|
499
495
|
|
|
500
496
|
## Common Patterns
|
|
501
497
|
|
|
@@ -573,15 +569,27 @@ const storage = new ResilientStorage(
|
|
|
573
569
|
);
|
|
574
570
|
```
|
|
575
571
|
|
|
576
|
-
---
|
|
577
572
|
|
|
578
|
-
##
|
|
573
|
+
## See Also
|
|
579
574
|
|
|
580
|
-
-
|
|
581
|
-
- [
|
|
582
|
-
|
|
575
|
+
- **Related Concepts:**
|
|
576
|
+
- [Services](/guides/core-concepts/services) - File storage in services
|
|
577
|
+
|
|
578
|
+
- **Other Helpers:**
|
|
579
|
+
- [Helpers Index](./index) - All available helpers
|
|
580
|
+
|
|
581
|
+
- **References:**
|
|
582
|
+
- [Static Asset Component](/references/components/static-asset) - Serving stored files
|
|
583
|
+
- [Request Utilities](/references/utilities/request) - `parseMultipartBody` for file uploads
|
|
584
|
+
|
|
585
|
+
- **External Resources:**
|
|
586
|
+
- [MinIO Documentation](https://min.io/docs/minio/linux/index.html) - MinIO object storage
|
|
587
|
+
- [AWS S3 API](https://docs.aws.amazon.com/AmazonS3/latest/API/Welcome.html) - S3-compatible API reference
|
|
588
|
+
|
|
589
|
+
- **Best Practices:**
|
|
590
|
+
- [Security Guidelines](/best-practices/security-guidelines) - File upload security
|
|
591
|
+
- [Deployment Strategies](/best-practices/deployment-strategies) - Storage in production
|
|
583
592
|
|
|
584
|
-
---
|
|
585
593
|
|
|
586
594
|
## TypeScript Interfaces Reference
|
|
587
595
|
|
|
@@ -113,3 +113,21 @@ const authTestPlan = TestPlan.newInstance({
|
|
|
113
113
|
|
|
114
114
|
TestDescribe.withTestPlan({ testPlan: authTestPlan }).run();
|
|
115
115
|
```
|
|
116
|
+
|
|
117
|
+
## See Also
|
|
118
|
+
|
|
119
|
+
- **Related Concepts:**
|
|
120
|
+
- [Dependency Injection](/guides/core-concepts/dependency-injection) - Testing with DI
|
|
121
|
+
- [Application](/guides/core-concepts/application/) - Application lifecycle in tests
|
|
122
|
+
|
|
123
|
+
- **Other Helpers:**
|
|
124
|
+
- [Helpers Index](./index) - All available helpers
|
|
125
|
+
|
|
126
|
+
- **External Resources:**
|
|
127
|
+
- [Node.js Test Runner](https://nodejs.org/api/test.html) - Native test module
|
|
128
|
+
|
|
129
|
+
- **Tutorials:**
|
|
130
|
+
- [Testing Guide](/guides/tutorials/testing) - Complete testing tutorial
|
|
131
|
+
|
|
132
|
+
- **Best Practices:**
|
|
133
|
+
- [Troubleshooting Tips](/best-practices/troubleshooting-tips) - Debugging tests
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# Common Types
|
|
2
|
+
|
|
3
|
+
Utility types and helper functions for common TypeScript patterns.
|
|
4
|
+
|
|
5
|
+
## Value Resolution Types
|
|
6
|
+
|
|
7
|
+
Types for lazy/deferred value resolution patterns.
|
|
8
|
+
|
|
9
|
+
### TResolver / TAsyncResolver
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
type TResolver<T> = (...args: any[]) => T;
|
|
13
|
+
type TAsyncResolver<T> = (...args: any[]) => T | Promise<T>;
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
Function types that resolve to a value. `TAsyncResolver` supports async functions.
|
|
17
|
+
|
|
18
|
+
### TValueOrResolver / TValueOrAsyncResolver
|
|
19
|
+
|
|
20
|
+
```typescript
|
|
21
|
+
type TValueOrResolver<T> = T | TResolver<T>;
|
|
22
|
+
type TValueOrAsyncResolver<T> = T | TAsyncResolver<T>;
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Union types allowing either a direct value or a resolver function.
|
|
26
|
+
|
|
27
|
+
**Usage:**
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
import { TValueOrAsyncResolver, resolveValueAsync } from '@venizia/ignis-helpers';
|
|
31
|
+
|
|
32
|
+
interface DatabaseConfig {
|
|
33
|
+
host: string;
|
|
34
|
+
port: number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
type ConfigOption = TValueOrAsyncResolver<DatabaseConfig>;
|
|
38
|
+
|
|
39
|
+
// Direct value
|
|
40
|
+
const config1: ConfigOption = { host: 'localhost', port: 5432 };
|
|
41
|
+
|
|
42
|
+
// Sync resolver
|
|
43
|
+
const config2: ConfigOption = () => ({ host: 'localhost', port: 5432 });
|
|
44
|
+
|
|
45
|
+
// Async resolver
|
|
46
|
+
const config3: ConfigOption = async () => {
|
|
47
|
+
const config = await fetchConfigFromVault();
|
|
48
|
+
return config;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
// Resolve any of the above
|
|
52
|
+
const resolved = await resolveValueAsync(config3);
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### resolveValue / resolveValueAsync
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
const resolveValue: <T>(valueOrResolver: TValueOrResolver<T>) => T;
|
|
59
|
+
const resolveValueAsync: <T>(valueOrResolver: TValueOrAsyncResolver<T>) => Promise<T>;
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Helper functions to resolve lazy values. They handle:
|
|
63
|
+
- **Direct values**: returned as-is
|
|
64
|
+
- **Class constructors**: returned as-is (not invoked)
|
|
65
|
+
- **Resolver functions**: invoked and result returned
|
|
66
|
+
|
|
67
|
+
## Nullable Types
|
|
68
|
+
|
|
69
|
+
### TNullable
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
type TNullable<T> = T | undefined | null;
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Makes a type nullable (can be `undefined` or `null`).
|
|
76
|
+
|
|
77
|
+
### ValueOrPromise
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
type ValueOrPromise<T> = T | Promise<T>;
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
A value that may or may not be wrapped in a Promise.
|
|
84
|
+
|
|
85
|
+
## Class Types
|
|
86
|
+
|
|
87
|
+
### TConstructor / TAbstractConstructor
|
|
88
|
+
|
|
89
|
+
```typescript
|
|
90
|
+
type TConstructor<T> = new (...args: any[]) => T;
|
|
91
|
+
type TAbstractConstructor<T> = abstract new (...args: any[]) => T;
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
Types representing class constructors.
|
|
95
|
+
|
|
96
|
+
### TClass / TAbstractClass
|
|
97
|
+
|
|
98
|
+
```typescript
|
|
99
|
+
type TClass<T> = TConstructor<T> & { [property: string]: any };
|
|
100
|
+
type TAbstractClass<T> = TAbstractConstructor<T> & { [property: string]: any };
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
Class types with static properties.
|
|
104
|
+
|
|
105
|
+
### TMixinTarget / TAbstractMixinTarget
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
type TMixinTarget<T> = TConstructor<{ [P in keyof T]: T[P] }>;
|
|
109
|
+
type TAbstractMixinTarget<T> = TAbstractConstructor<{ [P in keyof T]: T[P] }>;
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Types for mixin pattern targets.
|
|
113
|
+
|
|
114
|
+
## Object Utility Types
|
|
115
|
+
|
|
116
|
+
### ValueOf
|
|
117
|
+
|
|
118
|
+
```typescript
|
|
119
|
+
type ValueOf<T> = T[keyof T];
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
Extracts the value types from an object type.
|
|
123
|
+
|
|
124
|
+
### ValueOptional / ValueOptionalExcept
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
type ValueOptional<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>;
|
|
128
|
+
type ValueOptionalExcept<T, K extends keyof T> = Pick<T, K> & Partial<Omit<T, K>>;
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
Make specific keys optional while keeping others required, or vice versa.
|
|
132
|
+
|
|
133
|
+
### TPrettify
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
type TPrettify<T> = { [K in keyof T]: T[K] } & {};
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Flattens intersection types for better IDE display.
|
|
140
|
+
|
|
141
|
+
## Const Value Types
|
|
142
|
+
|
|
143
|
+
### TStringConstValue / TNumberConstValue / TConstValue
|
|
144
|
+
|
|
145
|
+
```typescript
|
|
146
|
+
type TStringConstValue<T extends TClass<any>> = Extract<ValueOf<T>, string>;
|
|
147
|
+
type TNumberConstValue<T extends TClass<any>> = Extract<ValueOf<T>, number>;
|
|
148
|
+
type TConstValue<T extends TClass<any>> = Extract<ValueOf<T>, string | number>;
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Extract constant value types from a class.
|
|
152
|
+
|
|
153
|
+
## See Also
|
|
154
|
+
|
|
155
|
+
- **Related Concepts:**
|
|
156
|
+
- [Dependency Injection](/guides/core-concepts/dependency-injection) - DI types and patterns
|
|
157
|
+
- [Repositories](/guides/core-concepts/persistent/repositories) - Repository mixins use these types
|
|
158
|
+
|
|
159
|
+
- **Other Helpers:**
|
|
160
|
+
- [Helpers Index](./index) - All available helpers
|
|
161
|
+
|
|
162
|
+
- **References:**
|
|
163
|
+
- [Repository Mixins](/references/base/repositories/mixins) - Uses mixin types
|
|
164
|
+
- [Utilities Index](/references/utilities/index) - Type utilities
|
|
165
|
+
|
|
166
|
+
- **Best Practices:**
|
|
167
|
+
- [Architectural Patterns](/best-practices/architectural-patterns) - TypeScript patterns
|