@venizia/ignis-docs 0.0.8 → 0.2.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.
Files changed (180) hide show
  1. package/README.md +7 -7
  2. package/content/best-practices/api-usage-examples.md +15 -12
  3. package/content/best-practices/architectural-patterns.md +70 -78
  4. package/content/best-practices/architecture-decisions.md +91 -60
  5. package/content/best-practices/code-style-standards/advanced-patterns.md +56 -44
  6. package/content/best-practices/code-style-standards/constants-configuration.md +11 -11
  7. package/content/best-practices/code-style-standards/control-flow.md +5 -2
  8. package/content/best-practices/code-style-standards/documentation.md +13 -13
  9. package/content/best-practices/code-style-standards/function-patterns.md +9 -10
  10. package/content/best-practices/code-style-standards/index.md +1 -1
  11. package/content/best-practices/code-style-standards/naming-conventions.md +10 -8
  12. package/content/best-practices/code-style-standards/route-definitions.md +30 -12
  13. package/content/best-practices/code-style-standards/tooling.md +8 -5
  14. package/content/best-practices/code-style-standards/type-safety.md +13 -12
  15. package/content/best-practices/common-pitfalls.md +56 -37
  16. package/content/best-practices/contribution-workflow.md +13 -14
  17. package/content/best-practices/data-modeling.md +46 -22
  18. package/content/best-practices/deployment-strategies.md +28 -27
  19. package/content/best-practices/error-handling.md +48 -24
  20. package/content/best-practices/index.md +5 -5
  21. package/content/best-practices/performance-optimization.md +40 -31
  22. package/content/best-practices/security-guidelines.md +52 -23
  23. package/content/best-practices/testing-strategies.md +65 -51
  24. package/content/best-practices/troubleshooting-tips.md +24 -24
  25. package/content/extensions/components/{swagger.md → api-reference.md} +40 -31
  26. package/content/extensions/components/authentication/api.md +19 -19
  27. package/content/extensions/components/authentication/errors.md +7 -7
  28. package/content/extensions/components/authentication/index.md +10 -8
  29. package/content/extensions/components/authentication/usage.md +101 -6
  30. package/content/extensions/components/authorization/api.md +45 -25
  31. package/content/extensions/components/authorization/errors.md +6 -6
  32. package/content/extensions/components/authorization/index.md +11 -10
  33. package/content/extensions/components/authorization/usage.md +21 -21
  34. package/content/extensions/components/health-check.md +1 -1
  35. package/content/extensions/components/index.md +5 -5
  36. package/content/extensions/components/mail/errors.md +15 -15
  37. package/content/extensions/components/mail/index.md +1 -2
  38. package/content/extensions/components/mail/usage.md +1 -1
  39. package/content/extensions/components/request-tracker.md +1 -1
  40. package/content/extensions/components/socket-io/api.md +9 -9
  41. package/content/extensions/components/socket-io/errors.md +5 -5
  42. package/content/extensions/components/socket-io/index.md +8 -8
  43. package/content/extensions/components/socket-io/usage.md +1 -1
  44. package/content/extensions/components/static-asset/api.md +17 -4
  45. package/content/extensions/components/static-asset/errors.md +4 -4
  46. package/content/extensions/components/static-asset/index.md +26 -28
  47. package/content/extensions/components/static-asset/usage.md +13 -12
  48. package/content/extensions/components/template/index.md +2 -2
  49. package/content/extensions/components/template/setup-page.md +1 -1
  50. package/content/extensions/components/websocket/api.md +3 -3
  51. package/content/extensions/components/websocket/errors.md +5 -5
  52. package/content/extensions/components/websocket/index.md +5 -5
  53. package/content/extensions/components/websocket/usage.md +3 -3
  54. package/content/extensions/helpers/cron/index.md +2 -2
  55. package/content/extensions/helpers/crypto/index.md +1 -1
  56. package/content/extensions/helpers/env/index.md +27 -12
  57. package/content/extensions/helpers/error/index.md +81 -25
  58. package/content/extensions/helpers/index.md +2 -3
  59. package/content/extensions/helpers/inversion/index.md +15 -7
  60. package/content/extensions/helpers/kafka/compile-binary.md +92 -0
  61. package/content/extensions/helpers/kafka/examples.md +1 -1
  62. package/content/extensions/helpers/kafka/index.md +3 -0
  63. package/content/extensions/helpers/logger/index.md +32 -2
  64. package/content/extensions/helpers/network/index.md +6 -0
  65. package/content/extensions/helpers/queue/index.md +14 -17
  66. package/content/extensions/helpers/redis/index.md +548 -323
  67. package/content/extensions/helpers/socket-io/index.md +14 -10
  68. package/content/extensions/helpers/storage/api.md +44 -8
  69. package/content/extensions/helpers/storage/index.md +43 -7
  70. package/content/extensions/helpers/template/index.md +6 -3
  71. package/content/extensions/helpers/types/index.md +11 -8
  72. package/content/extensions/helpers/websocket/api.md +9 -9
  73. package/content/extensions/helpers/websocket/index.md +7 -7
  74. package/content/extensions/helpers/worker-thread/index.md +2 -2
  75. package/content/extensions/index.md +3 -4
  76. package/content/extensions/src-details/mcp-server.md +18 -24
  77. package/content/guides/core-concepts/application/bootstrapping.md +11 -14
  78. package/content/guides/core-concepts/application/index.md +3 -3
  79. package/content/guides/core-concepts/components.md +19 -10
  80. package/content/guides/core-concepts/dependency-injection.md +6 -3
  81. package/content/guides/core-concepts/grpc-controllers.md +6 -5
  82. package/content/guides/core-concepts/persistent/datasources.md +42 -43
  83. package/content/guides/core-concepts/persistent/index.md +16 -7
  84. package/content/guides/core-concepts/persistent/models.md +24 -20
  85. package/content/guides/core-concepts/persistent/postgres-drivers.md +201 -0
  86. package/content/guides/core-concepts/persistent/repositories.md +40 -23
  87. package/content/guides/core-concepts/persistent/search-meilisearch.md +185 -0
  88. package/content/guides/core-concepts/persistent/search-typesense.md +431 -0
  89. package/content/guides/core-concepts/persistent/transactions.md +61 -25
  90. package/content/guides/core-concepts/rest-controllers.md +12 -9
  91. package/content/guides/core-concepts/services.md +330 -60
  92. package/content/guides/get-started/5-minute-quickstart.md +15 -15
  93. package/content/guides/get-started/philosophy.md +36 -36
  94. package/content/guides/get-started/setup.md +3 -3
  95. package/content/guides/index.md +3 -3
  96. package/content/guides/migrations/redis-helpers-migration.md +177 -0
  97. package/content/guides/migrations/scoped-rbac-migration.md +17 -17
  98. package/content/guides/migrations/unified-connectors-migration.md +113 -0
  99. package/content/guides/reference/glossary.md +19 -12
  100. package/content/guides/reference/mcp-docs-server.md +22 -18
  101. package/content/guides/tutorials/building-a-crud-api.md +37 -44
  102. package/content/guides/tutorials/complete-installation.md +17 -17
  103. package/content/guides/tutorials/ecommerce-api.md +163 -124
  104. package/content/guides/tutorials/realtime-chat.md +181 -135
  105. package/content/guides/tutorials/testing.md +65 -523
  106. package/content/index.md +2 -180
  107. package/content/public/apple-touch-icon.png +0 -0
  108. package/content/public/og-image.png +0 -0
  109. package/content/public/site.webmanifest +11 -0
  110. package/content/references/base/application.md +4 -5
  111. package/content/references/base/bootstrapping.md +18 -5
  112. package/content/references/base/components.md +149 -120
  113. package/content/references/base/connectors.md +178 -0
  114. package/content/references/base/controllers.md +41 -30
  115. package/content/references/base/datasources.md +163 -92
  116. package/content/references/base/dependency-injection.md +34 -22
  117. package/content/references/base/filter-system/application-usage.md +17 -14
  118. package/content/references/base/filter-system/array-operators.md +7 -2
  119. package/content/references/base/filter-system/comparison-operators.md +3 -0
  120. package/content/references/base/filter-system/default-filter.md +89 -71
  121. package/content/references/base/filter-system/fields-order-pagination.md +22 -22
  122. package/content/references/base/filter-system/index.md +6 -3
  123. package/content/references/base/filter-system/json-filtering.md +20 -1
  124. package/content/references/base/filter-system/list-operators.md +1 -1
  125. package/content/references/base/filter-system/logical-operators.md +33 -1
  126. package/content/references/base/filter-system/null-operators.md +30 -1
  127. package/content/references/base/filter-system/quick-reference.md +23 -4
  128. package/content/references/base/filter-system/tips.md +5 -5
  129. package/content/references/base/filter-system/use-cases.md +12 -12
  130. package/content/references/base/grpc-controllers.md +13 -13
  131. package/content/references/base/index.md +24 -12
  132. package/content/references/base/middlewares.md +265 -327
  133. package/content/references/base/models.md +63 -49
  134. package/content/references/base/providers.md +136 -130
  135. package/content/references/base/repositories/advanced.md +59 -58
  136. package/content/references/base/repositories/index.md +115 -91
  137. package/content/references/base/repositories/mixins.md +55 -291
  138. package/content/references/base/repositories/relations.md +54 -64
  139. package/content/references/base/repositories/soft-deletable.md +31 -30
  140. package/content/references/base/services.md +296 -93
  141. package/content/references/configuration/environment-variables.md +49 -31
  142. package/content/references/configuration/index.md +6 -6
  143. package/content/references/index.md +17 -12
  144. package/content/references/quick-reference.md +65 -106
  145. package/content/references/utilities/crypto.md +65 -23
  146. package/content/references/utilities/index.md +3 -3
  147. package/content/references/utilities/jsx.md +6 -4
  148. package/content/references/utilities/module.md +68 -20
  149. package/content/references/utilities/parse.md +4 -14
  150. package/content/references/utilities/promise.md +9 -7
  151. package/content/references/utilities/schema.md +5 -3
  152. package/dist/mcp-server/common/guards.d.ts +8 -0
  153. package/dist/mcp-server/common/guards.d.ts.map +1 -0
  154. package/dist/mcp-server/common/guards.js +14 -0
  155. package/dist/mcp-server/common/guards.js.map +1 -0
  156. package/dist/mcp-server/common/index.d.ts +1 -0
  157. package/dist/mcp-server/common/index.d.ts.map +1 -1
  158. package/dist/mcp-server/common/index.js +1 -0
  159. package/dist/mcp-server/common/index.js.map +1 -1
  160. package/dist/mcp-server/helpers/docs.helper.d.ts.map +1 -1
  161. package/dist/mcp-server/helpers/docs.helper.js +4 -2
  162. package/dist/mcp-server/helpers/docs.helper.js.map +1 -1
  163. package/dist/mcp-server/helpers/github.helper.js +1 -1
  164. package/dist/mcp-server/index.js +7 -2
  165. package/dist/mcp-server/index.js.map +1 -1
  166. package/dist/mcp-server/tools/base.tool.d.ts +6 -2
  167. package/dist/mcp-server/tools/base.tool.d.ts.map +1 -1
  168. package/dist/mcp-server/tools/base.tool.js.map +1 -1
  169. package/dist/mcp-server/tools/docs/search-documents.tool.d.ts +1 -1
  170. package/dist/mcp-server/tools/github/list-project-files.tool.d.ts +1 -1
  171. package/dist/mcp-server/tools/github/search-code.tool.d.ts +1 -1
  172. package/dist/mcp-server/tools/github/search-code.tool.d.ts.map +1 -1
  173. package/dist/mcp-server/tools/github/search-code.tool.js +4 -1
  174. package/dist/mcp-server/tools/github/search-code.tool.js.map +1 -1
  175. package/dist/mcp-server/tools/github/verify-dependencies.tool.d.ts.map +1 -1
  176. package/dist/mcp-server/tools/github/verify-dependencies.tool.js +3 -1
  177. package/dist/mcp-server/tools/github/verify-dependencies.tool.js.map +1 -1
  178. package/package.json +9 -9
  179. package/content/extensions/helpers/testing/index.md +0 -510
  180. package/content/references/base/middleware.md +0 -347
@@ -1,347 +0,0 @@
1
- ---
2
- title: Middleware Reference
3
- description: Technical reference for built-in middlewares in IGNIS
4
- difficulty: intermediate
5
- lastUpdated: 2026-03-15
6
- ---
7
-
8
- # Middleware Reference
9
-
10
- IGNIS provides built-in middleware functions and a provider-based middleware class for handling common HTTP concerns: error handling, request logging, 404 responses, and favicon serving. These are registered automatically by `BaseApplication` during startup.
11
-
12
- **Files:**
13
- - `packages/core/src/base/middlewares/app-error.middleware.ts`
14
- - `packages/core/src/base/middlewares/not-found.middleware.ts`
15
- - `packages/core/src/base/middlewares/request-spy.middleware.ts`
16
- - `packages/core/src/base/middlewares/emoji-favicon.middleware.ts`
17
-
18
- ## Prerequisites
19
-
20
- Before reading this document, you should understand:
21
- - [Hono middleware](https://hono.dev/docs/guides/middleware) basics
22
- - [Application lifecycle](./application.md)
23
- - [Providers](./providers.md) - `RequestSpyMiddleware` implements `IProvider`
24
-
25
- ## Quick Reference
26
-
27
- | Middleware | Type | Purpose |
28
- |-----------|------|---------|
29
- | `appErrorHandler` | `ErrorHandler` | Global error handler (Zod, DB constraints, generic) |
30
- | `notFoundHandler` | `NotFoundHandler` | JSON 404 response for unknown routes |
31
- | `RequestSpyMiddleware` | `IProvider<MiddlewareHandler>` | Request/response logging with timing |
32
- | `emojiFavicon` | `MiddlewareHandler` | Serves an emoji as SVG favicon |
33
-
34
- ## Default Registration Order
35
-
36
- `BaseApplication.registerDefaultMiddlewares()` registers middleware in this order during `initialize()`:
37
-
38
- ```typescript
39
- protected async registerDefaultMiddlewares() {
40
- const server = this.getServer();
41
-
42
- // 1. Global error handler
43
- server.onError(appErrorHandler({ logger, rootKey }));
44
-
45
- // 2. Async context storage (if enabled)
46
- if (this.configs.asyncContext?.enable) {
47
- server.use(contextStorage());
48
- }
49
-
50
- // 3. Not-found handler
51
- server.notFound(notFoundHandler({ logger }));
52
-
53
- // 4. RequestTrackerComponent (requestId + RequestSpyMiddleware)
54
- this.component(RequestTrackerComponent);
55
-
56
- // 5. Emoji favicon
57
- server.use(emojiFavicon({ icon: this.configs.favicon ?? '🔥' }));
58
- }
59
- ```
60
-
61
- After `registerDefaultMiddlewares()`, the application calls user-defined `staticConfigure()`, `preConfigure()`, and so on. The user's `setupMiddlewares()` hook runs after `initialize()` but before the server starts.
62
-
63
- ## appErrorHandler
64
-
65
- Global error handler registered via `server.onError()`. Handles ZodError validation errors, PostgreSQL constraint violations, and generic errors.
66
-
67
- ### Signature
68
-
69
- ```typescript
70
- function appErrorHandler(opts: {
71
- logger: Logger;
72
- rootKey?: string;
73
- }): ErrorHandler
74
- ```
75
-
76
- | Parameter | Type | Description |
77
- |-----------|------|-------------|
78
- | `logger` | `Logger` | Logger instance for error logging |
79
- | `rootKey` | `string \| undefined` | Optional root key to wrap the error response object |
80
-
81
- ### Error Handling Logic
82
-
83
- #### 1. ZodError (Validation Errors)
84
-
85
- When `error.name === 'ZodError'`, returns HTTP `422 Unprocessable Entity`:
86
-
87
- ```json
88
- {
89
- "message": "ValidationError",
90
- "statusCode": 422,
91
- "requestId": "abc-123",
92
- "details": {
93
- "url": "http://localhost:3000/users",
94
- "path": "/users",
95
- "stack": "...(non-production only)",
96
- "cause": [
97
- {
98
- "path": "email",
99
- "message": "Invalid email",
100
- "code": "invalid_string",
101
- "expected": "string",
102
- "received": "undefined"
103
- }
104
- ]
105
- }
106
- }
107
- ```
108
-
109
- #### 2. PostgreSQL Constraint Violations
110
-
111
- Database errors with recognized SQLSTATE codes return HTTP `400 Bad Request` instead of 500:
112
-
113
- | SQLSTATE Code | Error Type |
114
- |--------------|------------|
115
- | `23505` | Unique constraint violation |
116
- | `23503` | Foreign key constraint violation |
117
- | `23502` | Not null constraint violation |
118
- | `23514` | Check constraint violation |
119
- | `23P01` | Exclusion constraint violation |
120
- | `22P02` | Invalid text representation |
121
- | `22003` | Numeric value out of range |
122
- | `22001` | String data too long |
123
-
124
- The error response includes detail, table, and constraint information when available from the database error's `cause` property.
125
-
126
- #### 3. Generic Errors
127
-
128
- All other errors use the `statusCode` property from the error if present, otherwise default to HTTP `500 Internal Server Error`.
129
-
130
- ### Response Format
131
-
132
- ```json
133
- {
134
- "message": "Error message",
135
- "statusCode": 500,
136
- "requestId": "abc-123",
137
- "details": {
138
- "url": "http://localhost:3000/users",
139
- "path": "/users",
140
- "stack": "...(non-production only)",
141
- "cause": "...(non-production only)"
142
- }
143
- }
144
- ```
145
-
146
- When `rootKey` is provided (e.g., `rootKey: 'error'`), the response is wrapped:
147
-
148
- ```json
149
- {
150
- "error": {
151
- "message": "Error message",
152
- "statusCode": 500,
153
- "requestId": "abc-123",
154
- "details": { ... }
155
- }
156
- }
157
- ```
158
-
159
- **Production behavior:** `stack` and `cause` fields are omitted when `NODE_ENV` is `'production'`.
160
-
161
-
162
- ## notFoundHandler
163
-
164
- Returns a JSON 404 response when no route matches. Registered via `server.notFound()`.
165
-
166
- ### Signature
167
-
168
- ```typescript
169
- function notFoundHandler(opts: {
170
- logger?: Logger;
171
- }): NotFoundHandler
172
- ```
173
-
174
- | Parameter | Type | Description |
175
- |-----------|------|-------------|
176
- | `logger` | `Logger \| undefined` | Logger instance (defaults to `console`) |
177
-
178
- ### Response Format
179
-
180
- ```json
181
- {
182
- "message": "URL NOT FOUND",
183
- "statusCode": 404,
184
- "requestId": "abc-123",
185
- "path": "/unknown",
186
- "url": "http://localhost:3000/unknown"
187
- }
188
- ```
189
-
190
- The handler logs the 404 at error level with the request ID, path, and full URL.
191
-
192
-
193
- ## RequestSpyMiddleware
194
-
195
- A provider-based middleware class that logs incoming request details and outgoing response timing. It extends `BaseHelper` and implements `IProvider<MiddlewareHandler>`.
196
-
197
- ### Class Definition
198
-
199
- ```typescript
200
- export class RequestSpyMiddleware extends BaseHelper implements IProvider<MiddlewareHandler> {
201
- static readonly REQUEST_ID_KEY = 'requestId';
202
-
203
- constructor() {
204
- super({ scope: 'SpyMW' });
205
- }
206
-
207
- async parseBody(opts: { req: TContext['req'] }): Promise<unknown>;
208
- value(): MiddlewareHandler;
209
- }
210
- ```
211
-
212
- ### How It Is Registered
213
-
214
- `RequestSpyMiddleware` is not registered directly. Instead, `BaseApplication.registerDefaultMiddlewares()` registers a `RequestTrackerComponent`, which:
215
-
216
- 1. Adds the `requestId()` middleware from `hono/request-id` to assign a unique ID to every request
217
- 2. Binds `RequestSpyMiddleware` as a singleton provider in the DI container
218
- 3. Resolves the middleware via `IProvider.value()` and registers it with `server.use()`
219
-
220
- ### Request Logging
221
-
222
- In **non-production** mode, logs the full request including query and body:
223
-
224
- ```
225
- [requestId][clientIp][=>] METHOD /path | query: {...} | body: {...}
226
- ```
227
-
228
- In **production** mode, body is excluded:
229
-
230
- ```
231
- [requestId][clientIp][=>] METHOD /path | query: {...}
232
- ```
233
-
234
- ### Response Logging
235
-
236
- After the handler completes:
237
-
238
- ```
239
- [requestId][clientIp][<=] METHOD /path | Took: 12.34 (ms)
240
- ```
241
-
242
- ### Body Parsing
243
-
244
- The `parseBody` method parses the request body based on `Content-Type`:
245
-
246
- | Content-Type | Parse Method |
247
- |-------------|-------------|
248
- | `application/json` | `req.json()` |
249
- | `multipart/form-data` | `req.parseBody()` |
250
- | `application/x-www-form-urlencoded` | `req.parseBody()` |
251
- | Other | `req.text()` |
252
-
253
- Returns `null` if no `Content-Type` header or `Content-Length` is `0`/missing. Throws HTTP 400 `'Malformed Body Payload'` on parse failure.
254
-
255
- ### IP Detection
256
-
257
- The middleware resolves the client IP from the connection info or falls back to `x-real-ip` / `x-forwarded-for` headers. If neither is available, it throws HTTP 400 `'Malformed Connection Info'`.
258
-
259
-
260
- ## emojiFavicon
261
-
262
- A simple middleware that serves an emoji as an SVG favicon on `/favicon.ico`.
263
-
264
- ### Signature
265
-
266
- ```typescript
267
- function emojiFavicon(opts: { icon: string }): MiddlewareHandler
268
- ```
269
-
270
- | Parameter | Type | Description |
271
- |-----------|------|-------------|
272
- | `icon` | `string` | Emoji character to use as favicon |
273
-
274
- ### Behavior
275
-
276
- - Only intercepts requests to `/favicon.ico`
277
- - Returns an SVG with `content-type: image/svg+xml`
278
- - All other requests pass through via `next()`
279
-
280
- **Default icon:** The application uses `this.configs.favicon ?? '🔥'` when registering.
281
-
282
-
283
- ## Middleware Configuration via IApplicationConfigs
284
-
285
- Several middleware behaviors are configured through `IApplicationConfigs`:
286
-
287
- ```typescript
288
- interface IApplicationConfigs {
289
- favicon?: string; // Emoji for emojiFavicon (default: '🔥')
290
- error?: { rootKey: string }; // Root key wrapper for appErrorHandler
291
- asyncContext?: { enable: boolean }; // Enable Hono contextStorage() middleware
292
- // ...
293
- }
294
- ```
295
-
296
- ## User-Defined Middlewares
297
-
298
- The `setupMiddlewares()` abstract method on `AbstractApplication` is called after `initialize()` and before the server starts. Use this hook to register additional Hono middlewares:
299
-
300
- ```typescript
301
- export class MyApplication extends BaseApplication {
302
- async setupMiddlewares() {
303
- const server = this.getServer();
304
-
305
- // CORS
306
- server.use(cors({ origin: '*' }));
307
-
308
- // Body limit
309
- server.use(bodyLimit({ maxSize: 1024 * 1024 })); // 1MB
310
- }
311
- }
312
- ```
313
-
314
- The `IMiddlewareConfigs` type defines the shape for configurable middleware options:
315
-
316
- ```typescript
317
- interface IMiddlewareConfigs {
318
- requestId?: IRequestIdOptions;
319
- compress?: ICompressOptions;
320
- cors?: ICORSOptions;
321
- csrf?: ICSRFOptions;
322
- bodyLimit?: IBodyLimitOptions;
323
- ipRestriction?: IBaseMiddlewareOptions & IIPRestrictionRules;
324
- [extra: string | symbol]: any;
325
- }
326
- ```
327
-
328
- Each option interface extends `IBaseMiddlewareOptions`:
329
-
330
- ```typescript
331
- interface IBaseMiddlewareOptions {
332
- enable: boolean;
333
- path?: string;
334
- [extra: string | symbol]: any;
335
- }
336
- ```
337
-
338
-
339
- ## See Also
340
-
341
- - **Related References:**
342
- - [Application](./application.md) - Application lifecycle and initialization
343
- - [Providers](./providers.md) - Provider pattern (`RequestSpyMiddleware` implements `IProvider`)
344
- - [Components](./components.md) - `RequestTrackerComponent`
345
-
346
- - **Guides:**
347
- - [Application Guide](/guides/core-concepts/application/)