@venizia/ignis-docs 0.2.0 → 0.2.1-1

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 (174) hide show
  1. package/README.md +14 -14
  2. package/content/best-practices/api-usage-examples.md +39 -19
  3. package/content/best-practices/architectural-patterns.md +24 -13
  4. package/content/best-practices/architecture-decisions.md +29 -16
  5. package/content/best-practices/code-style-standards/advanced-patterns.md +43 -31
  6. package/content/best-practices/code-style-standards/constants-configuration.md +19 -4
  7. package/content/best-practices/code-style-standards/control-flow.md +33 -1
  8. package/content/best-practices/code-style-standards/documentation.md +28 -8
  9. package/content/best-practices/code-style-standards/function-patterns.md +15 -4
  10. package/content/best-practices/code-style-standards/index.md +7 -2
  11. package/content/best-practices/code-style-standards/naming-conventions.md +27 -3
  12. package/content/best-practices/code-style-standards/route-definitions.md +9 -5
  13. package/content/best-practices/code-style-standards/tooling.md +14 -1
  14. package/content/best-practices/code-style-standards/type-safety.md +39 -6
  15. package/content/best-practices/common-pitfalls.md +59 -35
  16. package/content/best-practices/contribution-workflow.md +8 -4
  17. package/content/best-practices/data-modeling.md +78 -62
  18. package/content/best-practices/deployment-strategies.md +56 -19
  19. package/content/best-practices/error-handling.md +247 -153
  20. package/content/best-practices/index.md +6 -0
  21. package/content/best-practices/performance-optimization.md +26 -13
  22. package/content/best-practices/security-guidelines.md +35 -9
  23. package/content/best-practices/testing-strategies.md +7 -2
  24. package/content/best-practices/troubleshooting-tips.md +27 -17
  25. package/content/extensions/components/api-reference.md +109 -323
  26. package/content/extensions/components/authentication/api.md +489 -602
  27. package/content/extensions/components/authentication/errors.md +135 -498
  28. package/content/extensions/components/authentication/index.md +89 -801
  29. package/content/extensions/components/authentication/usage.md +231 -955
  30. package/content/extensions/components/authorization/api.md +991 -644
  31. package/content/extensions/components/authorization/errors.md +204 -208
  32. package/content/extensions/components/authorization/getting-started.md +227 -0
  33. package/content/extensions/components/authorization/index.md +88 -795
  34. package/content/extensions/components/authorization/usage.md +219 -528
  35. package/content/extensions/components/health-check.md +77 -243
  36. package/content/extensions/components/index.md +24 -90
  37. package/content/extensions/components/mail/api.md +553 -285
  38. package/content/extensions/components/mail/errors.md +76 -62
  39. package/content/extensions/components/mail/index.md +111 -463
  40. package/content/extensions/components/mail/usage.md +139 -173
  41. package/content/extensions/components/request-tracker.md +70 -173
  42. package/content/extensions/components/socket-io/api.md +462 -785
  43. package/content/extensions/components/socket-io/errors.md +49 -51
  44. package/content/extensions/components/socket-io/index.md +69 -372
  45. package/content/extensions/components/socket-io/usage.md +212 -105
  46. package/content/extensions/components/static-asset/api.md +461 -141
  47. package/content/extensions/components/static-asset/errors.md +121 -53
  48. package/content/extensions/components/static-asset/index.md +84 -606
  49. package/content/extensions/components/static-asset/usage.md +184 -299
  50. package/content/extensions/components/template/index.md +3 -3
  51. package/content/extensions/components/websocket/api.md +311 -404
  52. package/content/extensions/components/websocket/errors.md +47 -56
  53. package/content/extensions/components/websocket/index.md +75 -407
  54. package/content/extensions/components/websocket/usage.md +120 -338
  55. package/content/extensions/helpers/cron/index.md +52 -160
  56. package/content/extensions/helpers/crypto/index.md +67 -480
  57. package/content/extensions/helpers/crypto/reference.md +528 -0
  58. package/content/extensions/helpers/env/index.md +64 -178
  59. package/content/extensions/helpers/error/index.md +286 -196
  60. package/content/extensions/helpers/index.md +61 -47
  61. package/content/extensions/helpers/inversion/index.md +76 -550
  62. package/content/extensions/helpers/inversion/reference.md +530 -0
  63. package/content/extensions/helpers/kafka/admin.md +23 -3
  64. package/content/extensions/helpers/kafka/compile-binary.md +83 -52
  65. package/content/extensions/helpers/kafka/consumer.md +65 -28
  66. package/content/extensions/helpers/kafka/examples.md +46 -253
  67. package/content/extensions/helpers/kafka/index.md +55 -617
  68. package/content/extensions/helpers/kafka/producer.md +156 -22
  69. package/content/extensions/helpers/kafka/schema-registry.md +59 -79
  70. package/content/extensions/helpers/logger/hf-logger.md +220 -0
  71. package/content/extensions/helpers/logger/index.md +78 -552
  72. package/content/extensions/helpers/logger/pino.md +105 -0
  73. package/content/extensions/helpers/logger/reference.md +937 -0
  74. package/content/extensions/helpers/network/api.md +276 -195
  75. package/content/extensions/helpers/network/index.md +87 -524
  76. package/content/extensions/helpers/queue/index.md +80 -897
  77. package/content/extensions/helpers/queue/reference.md +494 -0
  78. package/content/extensions/helpers/redis/index.md +86 -640
  79. package/content/extensions/helpers/redis/reference.md +784 -0
  80. package/content/extensions/helpers/secrets/index.md +136 -0
  81. package/content/extensions/helpers/socket-io/api.md +325 -204
  82. package/content/extensions/helpers/socket-io/index.md +79 -429
  83. package/content/extensions/helpers/storage/api.md +584 -464
  84. package/content/extensions/helpers/storage/index.md +80 -573
  85. package/content/extensions/helpers/types/index.md +75 -495
  86. package/content/extensions/helpers/types/reference.md +689 -0
  87. package/content/extensions/helpers/uid/index.md +176 -189
  88. package/content/extensions/helpers/websocket/api.md +366 -214
  89. package/content/extensions/helpers/websocket/index.md +68 -503
  90. package/content/extensions/helpers/worker-thread/index.md +62 -396
  91. package/content/extensions/helpers/worker-thread/reference.md +428 -0
  92. package/content/extensions/index.md +38 -39
  93. package/content/extensions/src-details/mcp-server.md +96 -548
  94. package/content/guides/core-concepts/persistent/datasources.md +2 -2
  95. package/content/guides/core-concepts/persistent/index.md +5 -1
  96. package/content/guides/core-concepts/persistent/models.md +1 -1
  97. package/content/guides/core-concepts/persistent/pglite.md +218 -0
  98. package/content/guides/core-concepts/persistent/postgres-drivers.md +21 -15
  99. package/content/guides/core-concepts/persistent/search-meilisearch.md +22 -12
  100. package/content/guides/core-concepts/persistent/search-typesense.md +28 -16
  101. package/content/guides/core-concepts/persistent/sqlite.md +296 -0
  102. package/content/guides/core-concepts/persistent/transactions.md +12 -11
  103. package/content/guides/core-concepts/secrets-vault.md +177 -0
  104. package/content/guides/core-concepts/services.md +1 -1
  105. package/content/guides/get-started/5-minute-quickstart.md +59 -206
  106. package/content/guides/get-started/philosophy.md +135 -670
  107. package/content/guides/get-started/setup.md +53 -74
  108. package/content/guides/migrations/redis-helpers-migration.md +5 -4
  109. package/content/guides/migrations/scoped-rbac-migration.md +5 -5
  110. package/content/guides/migrations/unified-connectors-migration.md +8 -7
  111. package/content/guides/tutorials/ecommerce-api.md +3 -8
  112. package/content/guides/tutorials/realtime-chat.md +1 -1
  113. package/content/references/base/application.md +64 -22
  114. package/content/references/base/components.md +3 -3
  115. package/content/references/base/connectors.md +79 -136
  116. package/content/references/base/controllers.md +12 -12
  117. package/content/references/base/datasources-reference.md +600 -0
  118. package/content/references/base/datasources.md +84 -444
  119. package/content/references/base/dependency-injection.md +25 -46
  120. package/content/references/base/filter-system/application-usage.md +95 -123
  121. package/content/references/base/filter-system/array-operators.md +33 -43
  122. package/content/references/base/filter-system/comparison-operators.md +55 -63
  123. package/content/references/base/filter-system/default-filter.md +144 -350
  124. package/content/references/base/filter-system/fields-order-pagination.md +116 -148
  125. package/content/references/base/filter-system/index.md +114 -253
  126. package/content/references/base/filter-system/json-filtering.md +52 -181
  127. package/content/references/base/filter-system/list-operators.md +28 -44
  128. package/content/references/base/filter-system/logical-operators.md +69 -114
  129. package/content/references/base/filter-system/null-operators.md +41 -98
  130. package/content/references/base/filter-system/pattern-matching.md +48 -51
  131. package/content/references/base/filter-system/quick-reference.md +93 -196
  132. package/content/references/base/filter-system/range-operators.md +22 -38
  133. package/content/references/base/filter-system/tips.md +70 -133
  134. package/content/references/base/filter-system/use-cases.md +173 -232
  135. package/content/references/base/grpc-controllers.md +53 -17
  136. package/content/references/base/index.md +5 -3
  137. package/content/references/base/middlewares.md +43 -28
  138. package/content/references/base/models-reference.md +886 -0
  139. package/content/references/base/models.md +81 -1452
  140. package/content/references/base/providers.md +8 -8
  141. package/content/references/base/repositories/advanced.md +281 -419
  142. package/content/references/base/repositories/index.md +84 -644
  143. package/content/references/base/repositories/mixins.md +25 -21
  144. package/content/references/base/repositories/relations.md +194 -375
  145. package/content/references/base/repositories/soft-deletable.md +67 -55
  146. package/content/references/base/secrets.md +267 -0
  147. package/content/references/base/services.md +8 -6
  148. package/content/references/configuration/environment-variables.md +73 -21
  149. package/content/references/configuration/index.md +51 -31
  150. package/content/references/index.md +1 -1
  151. package/content/references/quick-reference.md +3 -16
  152. package/content/references/utilities/crypto.md +35 -76
  153. package/content/references/utilities/date.md +33 -73
  154. package/content/references/utilities/duration.md +85 -0
  155. package/content/references/utilities/index.md +6 -2
  156. package/content/references/utilities/jsx-reference.md +298 -0
  157. package/content/references/utilities/jsx.md +82 -525
  158. package/content/references/utilities/module.md +81 -61
  159. package/content/references/utilities/parse.md +34 -64
  160. package/content/references/utilities/performance.md +33 -58
  161. package/content/references/utilities/promise.md +28 -62
  162. package/content/references/utilities/request.md +58 -218
  163. package/content/references/utilities/retry.md +139 -0
  164. package/content/references/utilities/schema.md +43 -137
  165. package/content/references/utilities/statuses-reference.md +361 -0
  166. package/content/references/utilities/statuses.md +63 -667
  167. package/dist/mcp-server/index.js +0 -0
  168. package/dist/mcp-server/tools/github/list-project-files.tool.d.ts +1 -1
  169. package/dist/mcp-server/tools/github/list-project-files.tool.d.ts.map +1 -1
  170. package/dist/mcp-server/tools/github/list-project-files.tool.js +3 -3
  171. package/dist/mcp-server/tools/github/search-code.tool.js +1 -1
  172. package/dist/mcp-server/tools/github/verify-dependencies.tool.js +1 -1
  173. package/dist/mcp-server/tools/github/view-source-file.tool.js +1 -1
  174. package/package.json +24 -23
@@ -6,212 +6,149 @@ difficulty: intermediate
6
6
 
7
7
  # Pro Tips & Edge Cases
8
8
 
9
- Advanced tips and common edge cases when working with filters.
9
+ A filter can return the wrong rows even when every operator name looks right. Each entry below is verified against `FilterBuilder`/`PostgresQueryOperators` in `packages/core-server`.
10
10
 
11
+ ## `NOT IN` and `!=` silently exclude `NULL`
11
12
 
12
- ## Tip 1: JSON Numeric vs String Comparison
13
+ This is SQL three-valued logic, not an IGNIS quirk. A row whose column is `NULL` never matches `nin`, `ne`, or `neq`, because `NULL <> value` evaluates to UNKNOWN rather than TRUE.
13
14
 
14
15
  ```typescript
15
- // JSON field contains: { "priority": "3" } (string)
16
- // Numeric comparison uses safe casting:
17
- { where: { 'metadata.priority': { gt: 2 } } }
18
- // The regex '^-?[0-9]+(\.[0-9]+)?$' matches "3", so it casts to numeric 3
19
- // Result: 3 > 2 -> matches
20
-
21
- // But if JSON field contains: { "priority": "high" }
22
- { where: { 'metadata.priority': { gt: 2 } } }
23
- // "high" fails regex -> NULL -> no match
16
+ { where: { status: { nin: ['deleted'] } } }
17
+ // Rows where status IS NULL are NOT returned
24
18
 
25
- // Best practice: ensure your data stores numbers as JSON numbers
26
- { "priority": 3 } // Store as number, not string "3"
19
+ // To include them, add an explicit NULL branch:
20
+ { where: { or: [{ status: { nin: ['deleted'] } }, { status: { is: null } }] } }
27
21
  ```
28
22
 
29
-
30
- ## Tip 2: Empty Array Handling
23
+ ## Empty arrays are not no-ops
31
24
 
32
25
  ```typescript
33
- // Empty IN -> no results
34
- { where: { id: { in: [] } } } // SQL: WHERE false
26
+ { where: { id: { in: [] } } } // SQL: WHERE false - matches nothing
27
+ { where: { id: { nin: [] } } } // SQL: WHERE true - matches everything
28
+ ```
35
29
 
36
- // Empty NIN -> all results
37
- { where: { id: { nin: [] } } } // SQL: WHERE true
30
+ This matters most when the array comes from user input - check its length before building the filter:
38
31
 
39
- // Check array length before filtering
32
+ ```typescript
40
33
  const ids = getUserSelectedIds();
41
34
  if (ids.length === 0) {
42
- return []; // Early return instead of empty IN
35
+ return []; // early return instead of an accidental WHERE false or WHERE true
43
36
  }
44
37
  ```
45
38
 
39
+ ## JSON numeric comparisons need actual JSON numbers
46
40
 
47
- ## Tip 3: Null-Safe JSON Paths
41
+ A JSON path comparison casts safely with `CASE WHEN (...) ~ '^-?[0-9]+(\.[0-9]+)?$' THEN (...)::numeric ELSE NULL END`. The regex has to match, or the cast yields `NULL` and the row is excluded:
48
42
 
49
43
  ```typescript
50
- // If JSON field doesn't exist, #>> returns NULL
51
- // This is safe - no errors, just no matches
52
- { where: { 'metadata.nonexistent.field': 'value' } }
53
- // SQL: "metadata" #>> '{nonexistent,field}' = 'value'
54
- // Result: No rows (NULL != 'value')
44
+ // { "priority": "3" } (string) - regex matches "3" -> casts to numeric 3 -> 3 > 2 matches
45
+ { where: { 'metadata.priority': { gt: 2 } } }
46
+
47
+ // { "priority": "high" } - regex fails -> NULL -> never matches
48
+ { where: { 'metadata.priority': { gt: 2 } } }
55
49
  ```
56
50
 
51
+ Store numbers as JSON numbers (`{ "priority": 3 }`), not numeric strings, to avoid depending on the cast.
57
52
 
58
- ## Tip 4: Performance with Large IN Arrays
53
+ ## A missing JSON path is a null-safe miss, not an error
59
54
 
60
55
  ```typescript
61
- // For very large arrays (1000+ items), consider chunking
62
- const allIds = getLargeIdList(); // 5000 IDs
63
-
64
- const chunkSize = 500;
65
- const results = [];
66
- for (let i = 0; i < allIds.length; i += chunkSize) {
67
- const chunk = allIds.slice(i, i + chunkSize);
68
- const chunkResults = await repository.find({
69
- filter: { where: { id: { in: chunk } } }
70
- });
71
- results.push(...chunkResults);
72
- }
56
+ { where: { 'metadata.nonexistent.field': 'value' } }
57
+ // SQL: "metadata" #>> '{nonexistent,field}' = 'value'
58
+ // No rows match (NULL != 'value') - no exception either
73
59
  ```
74
60
 
61
+ ## JSON `order` uses `#>`, not `#>>`
75
62
 
76
- ## Tip 5: Order By JSON Fields
63
+ `#>` returns JSONB and preserves the value's type; the equality/comparison operators above use `#>>` (text) instead, because sorting needs JSONB's native ordering:
77
64
 
78
65
  ```typescript
79
- // JSON ordering uses #> (returns JSONB, preserves types) not #>> (returns text)
80
66
  { order: ['metadata.priority DESC'] }
81
67
  // SQL: "metadata" #> '{priority}' DESC
82
68
 
83
- // JSONB comparison order:
84
- // null < boolean < number < string < array < object
69
+ // JSONB comparison order: null < boolean < number < string < array < object
85
70
  ```
86
71
 
72
+ ## Array operators accept a bare value
87
73
 
88
- ## Tip 6: Debugging Filters
74
+ `contains`, `containedBy`, and `overlaps` wrap a non-array operand in a single-element array automatically:
89
75
 
90
76
  ```typescript
91
- // Enable logging to see generated SQL
92
- const result = await repository.find({
93
- filter: complexFilter,
94
- options: {
95
- log: { use: true, level: 'debug' },
96
- },
97
- });
98
-
99
- // Or use buildQuery to inspect without executing
100
- const queryOptions = repository.buildQuery({ filter: complexFilter });
101
- console.log('Generated query options:', queryOptions);
77
+ { where: { tags: { contains: ['featured'] } } }
78
+ { where: { tags: { contains: 'featured' } } }
79
+ // Equivalent
102
80
  ```
103
81
 
104
-
105
- ## Tip 7: NOT IN with NULL Columns
82
+ ## `fields` as an object only supports inclusion
106
83
 
107
84
  ```typescript
108
- // NOT IN excludes NULL values!
109
- { where: { status: { nin: ['deleted'] } } }
110
- // Rows where status IS NULL will NOT be returned
111
-
112
- // Include NULL values explicitly
113
- {
114
- where: {
115
- or: [
116
- { status: { nin: ['deleted'] } },
117
- { status: { is: null } }
118
- ]
119
- }
120
- }
85
+ { fields: { id: true, name: true, email: true } }
86
+
87
+ // Setting a key to `false` does NOT exclude it - the key is ignored.
88
+ // To exclude fields, list only the ones you want, as an array:
89
+ { fields: ['id', 'name', 'email'] }
121
90
  ```
122
91
 
92
+ ## Combining multiple array conditions
123
93
 
124
- ## Tip 8: Combining Multiple Array Conditions
94
+ `contains`, `containedBy`, and `overlaps` compose like any other operators - as separate keys under an implicit AND:
125
95
 
126
96
  ```typescript
127
97
  await productRepository.find({
128
98
  filter: {
129
99
  where: {
130
- // Must have ALL these categories
131
- categories: { contains: ['electronics', 'portable'] },
132
- // Tags must be subset of allowed tags
133
- tags: { containedBy: ['new', 'sale', 'featured', 'popular'] },
134
- // Must have at least one of these suppliers
135
- suppliers: { overlaps: ['supplier-a', 'supplier-b'] }
136
- }
137
- }
100
+ categories: { contains: ['electronics', 'portable'] }, // must have ALL these
101
+ tags: { containedBy: ['new', 'sale', 'featured', 'popular'] }, // must be a subset
102
+ suppliers: { overlaps: ['supplier-a', 'supplier-b'] }, // at least one match
103
+ },
104
+ },
138
105
  });
139
106
  ```
140
107
 
108
+ ## Chunk very large `in` arrays
141
109
 
142
- ## Tip 9: Date Range Queries
110
+ Postgres has no hard `IN`-list limit, but a multi-thousand-element array is worth chunking for query-plan and payload-size reasons:
143
111
 
144
112
  ```typescript
145
- // This week's events
146
- const startOfWeek = new Date();
147
- startOfWeek.setDate(startOfWeek.getDate() - startOfWeek.getDay());
148
- const endOfWeek = new Date(startOfWeek);
149
- endOfWeek.setDate(endOfWeek.getDate() + 6);
150
-
151
- {
152
- where: {
153
- eventDate: { between: [startOfWeek, endOfWeek] }
154
- }
155
- }
156
-
157
- // Last 30 days
158
- const thirtyDaysAgo = new Date();
159
- thirtyDaysAgo.setDate(thirtyDaysAgo.getDate() - 30);
113
+ const allIds = getLargeIdList(); // e.g. 5000 IDs
114
+ const chunkSize = 500;
115
+ const results = [];
160
116
 
161
- {
162
- where: {
163
- createdAt: { gte: thirtyDaysAgo }
164
- }
117
+ for (let i = 0; i < allIds.length; i += chunkSize) {
118
+ const chunk = allIds.slice(i, i + chunkSize);
119
+ results.push(...(await repository.find({ filter: { where: { id: { in: chunk } } } })));
165
120
  }
166
121
  ```
167
122
 
123
+ ## Factor out reusable `where`/pagination fragments
168
124
 
169
- ## Tip 10: Reusable Filter Builders
125
+ A `filter` is a plain object, so common fragments compose with spreads instead of being rewritten per call site:
170
126
 
171
127
  ```typescript
172
- // Create reusable filter builders
173
- const createActiveFilter = <T extends { status: string; deletedAt: Date | null }>(): TWhere<T> => ({
174
- status: 'active',
175
- deletedAt: { is: null },
176
- } as TWhere<T>);
128
+ const createActiveFilter = <T extends { status: string; deletedAt: Date | null }>(): TWhere<T> =>
129
+ ({ status: 'active', deletedAt: { is: null } }) as TWhere<T>;
177
130
 
178
- const createPaginationFilter = (page: number, size: number = 20) => ({
131
+ const createPaginationFilter = (page: number, size = 20) => ({
179
132
  limit: size,
180
133
  skip: (page - 1) * size,
181
134
  });
182
135
 
183
- // Usage
184
136
  const products = await productRepository.find({
185
137
  filter: {
186
- where: {
187
- ...createActiveFilter(),
188
- category: 'electronics',
189
- },
138
+ where: { ...createActiveFilter(), category: 'electronics' },
190
139
  ...createPaginationFilter(3),
191
- }
140
+ },
192
141
  });
193
142
  ```
194
143
 
144
+ ## See also
195
145
 
196
- ## Tip 11: Array Operators Accept Single Values
146
+ - [Filter System Overview](./) - the `filter` shape and every `where` operator family
147
+ - [Application Usage -> Debugging a filter](./application-usage#debugging-a-filter) - `buildQuery`, and why `options.log` doesn't apply to `find`
148
+ - [Use Case Gallery](./use-cases) - full runnable filters, including date-range and multi-condition examples
149
+ - [JSON Filtering](./json-filtering) - the full JSON path operator reference
197
150
 
198
- ```typescript
199
- // These are equivalent:
200
- { where: { tags: { contains: ['featured'] } } }
201
- { where: { tags: { contains: 'featured' } } }
202
-
203
- // Single values are automatically wrapped in an array
204
- // This works for contains, containedBy, and overlaps
205
- ```
151
+ **Files:**
206
152
 
207
-
208
- ## Tip 12: Field Selection Object Format
209
-
210
- ```typescript
211
- // Object format only supports inclusion (true values)
212
- { fields: { id: true, name: true, email: true } }
213
-
214
- // Setting a field to false does NOT exclude it -- it just ignores that key
215
- // If you want to exclude fields, list only the ones you want:
216
- { fields: ['id', 'name', 'email'] } // Array format is clearer for this
217
- ```
153
+ - [`packages/core-server/src/connectors/relational/repositories/dialect/filter.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/core-server/src/connectors/relational/repositories/dialect/filter.ts) - `FilterBuilder`, JSON path casting, `toColumns`
154
+ - [`packages/core-server/src/connectors/postgres/repositories/dialect/query.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/core-server/src/connectors/postgres/repositories/dialect/query.ts) - `PostgresQueryOperators.FNS`, empty-array and array-operator handling