@venizia/ignis-docs 0.0.8-3 → 0.1.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 (213) hide show
  1. package/README.md +7 -7
  2. package/{wiki → content}/best-practices/api-usage-examples.md +15 -12
  3. package/{wiki → content}/best-practices/architectural-patterns.md +70 -78
  4. package/{wiki → content}/best-practices/architecture-decisions.md +91 -60
  5. package/{wiki → content}/best-practices/code-style-standards/advanced-patterns.md +56 -44
  6. package/{wiki → content}/best-practices/code-style-standards/constants-configuration.md +11 -11
  7. package/{wiki → content}/best-practices/code-style-standards/control-flow.md +5 -2
  8. package/{wiki → content}/best-practices/code-style-standards/documentation.md +13 -13
  9. package/{wiki → content}/best-practices/code-style-standards/function-patterns.md +9 -10
  10. package/{wiki → content}/best-practices/code-style-standards/index.md +1 -1
  11. package/{wiki → content}/best-practices/code-style-standards/naming-conventions.md +10 -8
  12. package/{wiki → content}/best-practices/code-style-standards/route-definitions.md +30 -12
  13. package/{wiki → content}/best-practices/code-style-standards/tooling.md +8 -5
  14. package/{wiki → content}/best-practices/code-style-standards/type-safety.md +13 -12
  15. package/{wiki → content}/best-practices/common-pitfalls.md +56 -37
  16. package/{wiki → content}/best-practices/contribution-workflow.md +13 -14
  17. package/{wiki → content}/best-practices/data-modeling.md +44 -20
  18. package/{wiki → content}/best-practices/deployment-strategies.md +28 -27
  19. package/{wiki → content}/best-practices/error-handling.md +48 -24
  20. package/{wiki → content}/best-practices/index.md +5 -5
  21. package/{wiki → content}/best-practices/performance-optimization.md +36 -28
  22. package/{wiki → content}/best-practices/security-guidelines.md +52 -23
  23. package/{wiki → content}/best-practices/testing-strategies.md +65 -51
  24. package/{wiki → content}/best-practices/troubleshooting-tips.md +24 -24
  25. package/{wiki/extensions/components/swagger.md → content/extensions/components/api-reference.md} +40 -31
  26. package/{wiki → content}/extensions/components/authentication/api.md +19 -19
  27. package/{wiki → content}/extensions/components/authentication/errors.md +7 -7
  28. package/{wiki → content}/extensions/components/authentication/index.md +10 -8
  29. package/{wiki → content}/extensions/components/authentication/usage.md +101 -6
  30. package/{wiki → content}/extensions/components/authorization/api.md +45 -25
  31. package/{wiki → content}/extensions/components/authorization/errors.md +6 -6
  32. package/{wiki → content}/extensions/components/authorization/index.md +11 -10
  33. package/{wiki → content}/extensions/components/authorization/usage.md +21 -21
  34. package/{wiki → content}/extensions/components/health-check.md +1 -1
  35. package/{wiki → content}/extensions/components/index.md +5 -5
  36. package/{wiki → content}/extensions/components/mail/errors.md +15 -15
  37. package/{wiki → content}/extensions/components/mail/index.md +1 -2
  38. package/{wiki → content}/extensions/components/mail/usage.md +1 -1
  39. package/{wiki → content}/extensions/components/request-tracker.md +1 -1
  40. package/{wiki → content}/extensions/components/socket-io/api.md +9 -9
  41. package/{wiki → content}/extensions/components/socket-io/errors.md +5 -5
  42. package/{wiki → content}/extensions/components/socket-io/index.md +8 -8
  43. package/{wiki → content}/extensions/components/socket-io/usage.md +1 -1
  44. package/{wiki → content}/extensions/components/static-asset/api.md +17 -4
  45. package/{wiki → content}/extensions/components/static-asset/errors.md +4 -4
  46. package/{wiki → content}/extensions/components/static-asset/index.md +26 -28
  47. package/{wiki → content}/extensions/components/static-asset/usage.md +13 -12
  48. package/{wiki → content}/extensions/components/template/index.md +2 -2
  49. package/{wiki → content}/extensions/components/template/setup-page.md +1 -1
  50. package/{wiki → content}/extensions/components/websocket/api.md +3 -3
  51. package/{wiki → content}/extensions/components/websocket/errors.md +5 -5
  52. package/{wiki → content}/extensions/components/websocket/index.md +5 -5
  53. package/{wiki → content}/extensions/components/websocket/usage.md +3 -3
  54. package/{wiki → content}/extensions/helpers/cron/index.md +2 -2
  55. package/{wiki → content}/extensions/helpers/crypto/index.md +1 -1
  56. package/{wiki → content}/extensions/helpers/env/index.md +27 -12
  57. package/content/extensions/helpers/error/index.md +283 -0
  58. package/{wiki → content}/extensions/helpers/index.md +2 -3
  59. package/{wiki → content}/extensions/helpers/inversion/index.md +15 -7
  60. package/{wiki → content}/extensions/helpers/kafka/examples.md +1 -1
  61. package/{wiki → content}/extensions/helpers/logger/index.md +32 -2
  62. package/{wiki → content}/extensions/helpers/network/index.md +6 -0
  63. package/{wiki → content}/extensions/helpers/queue/index.md +14 -17
  64. package/content/extensions/helpers/redis/index.md +713 -0
  65. package/{wiki → content}/extensions/helpers/socket-io/index.md +14 -10
  66. package/{wiki → content}/extensions/helpers/storage/api.md +44 -8
  67. package/{wiki → content}/extensions/helpers/storage/index.md +43 -7
  68. package/{wiki → content}/extensions/helpers/template/index.md +6 -3
  69. package/{wiki → content}/extensions/helpers/types/index.md +11 -8
  70. package/{wiki → content}/extensions/helpers/websocket/api.md +9 -9
  71. package/{wiki → content}/extensions/helpers/websocket/index.md +7 -7
  72. package/{wiki → content}/extensions/helpers/worker-thread/index.md +2 -2
  73. package/{wiki → content}/extensions/index.md +3 -4
  74. package/{wiki → content}/extensions/src-details/mcp-server.md +18 -24
  75. package/{wiki → content}/guides/core-concepts/application/bootstrapping.md +11 -14
  76. package/{wiki → content}/guides/core-concepts/application/index.md +3 -3
  77. package/{wiki → content}/guides/core-concepts/components.md +19 -10
  78. package/{wiki → content}/guides/core-concepts/dependency-injection.md +6 -3
  79. package/{wiki → content}/guides/core-concepts/grpc-controllers.md +6 -5
  80. package/{wiki → content}/guides/core-concepts/persistent/datasources.md +33 -27
  81. package/{wiki → content}/guides/core-concepts/persistent/index.md +16 -5
  82. package/{wiki → content}/guides/core-concepts/persistent/models.md +24 -20
  83. package/content/guides/core-concepts/persistent/postgres-drivers.md +167 -0
  84. package/{wiki → content}/guides/core-concepts/persistent/repositories.md +40 -23
  85. package/content/guides/core-concepts/persistent/search-meilisearch.md +183 -0
  86. package/content/guides/core-concepts/persistent/search-typesense.md +429 -0
  87. package/{wiki → content}/guides/core-concepts/persistent/transactions.md +61 -25
  88. package/{wiki → content}/guides/core-concepts/rest-controllers.md +12 -9
  89. package/content/guides/core-concepts/services.md +389 -0
  90. package/{wiki → content}/guides/get-started/5-minute-quickstart.md +19 -19
  91. package/{wiki → content}/guides/get-started/philosophy.md +36 -36
  92. package/{wiki → content}/guides/get-started/setup.md +3 -3
  93. package/{wiki → content}/guides/index.md +3 -3
  94. package/content/guides/migrations/redis-helpers-migration.md +177 -0
  95. package/{wiki → content}/guides/migrations/scoped-rbac-migration.md +17 -17
  96. package/content/guides/migrations/unified-connectors-migration.md +113 -0
  97. package/{wiki → content}/guides/reference/glossary.md +19 -12
  98. package/{wiki → content}/guides/reference/mcp-docs-server.md +22 -18
  99. package/{wiki → content}/guides/tutorials/building-a-crud-api.md +30 -33
  100. package/{wiki → content}/guides/tutorials/complete-installation.md +17 -17
  101. package/{wiki → content}/guides/tutorials/ecommerce-api.md +158 -119
  102. package/{wiki → content}/guides/tutorials/realtime-chat.md +176 -130
  103. package/content/guides/tutorials/testing.md +264 -0
  104. package/content/index.md +5 -0
  105. package/content/public/apple-touch-icon.png +0 -0
  106. package/content/public/og-image.png +0 -0
  107. package/content/public/site.webmanifest +11 -0
  108. package/{wiki → content}/references/base/application.md +4 -5
  109. package/{wiki → content}/references/base/bootstrapping.md +18 -5
  110. package/{wiki → content}/references/base/components.md +149 -120
  111. package/content/references/base/connectors.md +178 -0
  112. package/{wiki → content}/references/base/controllers.md +41 -30
  113. package/content/references/base/datasources.md +527 -0
  114. package/{wiki → content}/references/base/dependency-injection.md +34 -22
  115. package/{wiki → content}/references/base/filter-system/application-usage.md +17 -14
  116. package/{wiki → content}/references/base/filter-system/array-operators.md +7 -2
  117. package/{wiki → content}/references/base/filter-system/comparison-operators.md +3 -0
  118. package/{wiki → content}/references/base/filter-system/default-filter.md +89 -71
  119. package/{wiki → content}/references/base/filter-system/fields-order-pagination.md +22 -22
  120. package/{wiki → content}/references/base/filter-system/index.md +6 -3
  121. package/{wiki → content}/references/base/filter-system/json-filtering.md +20 -1
  122. package/{wiki → content}/references/base/filter-system/list-operators.md +1 -1
  123. package/{wiki → content}/references/base/filter-system/logical-operators.md +33 -1
  124. package/{wiki → content}/references/base/filter-system/null-operators.md +30 -1
  125. package/{wiki → content}/references/base/filter-system/quick-reference.md +23 -4
  126. package/{wiki → content}/references/base/filter-system/tips.md +5 -5
  127. package/{wiki → content}/references/base/filter-system/use-cases.md +12 -12
  128. package/{wiki → content}/references/base/grpc-controllers.md +13 -13
  129. package/{wiki → content}/references/base/index.md +24 -12
  130. package/{wiki/references/base/middleware.md → content/references/base/middlewares.md} +205 -24
  131. package/{wiki → content}/references/base/models.md +63 -49
  132. package/{wiki → content}/references/base/providers.md +136 -130
  133. package/{wiki → content}/references/base/repositories/advanced.md +59 -58
  134. package/{wiki → content}/references/base/repositories/index.md +115 -91
  135. package/content/references/base/repositories/mixins.md +99 -0
  136. package/{wiki → content}/references/base/repositories/relations.md +54 -64
  137. package/{wiki → content}/references/base/repositories/soft-deletable.md +31 -30
  138. package/content/references/base/services.md +404 -0
  139. package/{wiki → content}/references/configuration/environment-variables.md +46 -30
  140. package/{wiki → content}/references/configuration/index.md +6 -6
  141. package/{wiki → content}/references/index.md +17 -12
  142. package/{wiki → content}/references/quick-reference.md +65 -106
  143. package/content/references/utilities/crypto.md +98 -0
  144. package/{wiki → content}/references/utilities/index.md +3 -3
  145. package/{wiki → content}/references/utilities/jsx.md +6 -4
  146. package/content/references/utilities/module.md +90 -0
  147. package/{wiki → content}/references/utilities/parse.md +4 -14
  148. package/{wiki → content}/references/utilities/promise.md +9 -7
  149. package/{wiki → content}/references/utilities/schema.md +5 -3
  150. package/dist/mcp-server/common/guards.d.ts +8 -0
  151. package/dist/mcp-server/common/guards.d.ts.map +1 -0
  152. package/dist/mcp-server/common/guards.js +14 -0
  153. package/dist/mcp-server/common/guards.js.map +1 -0
  154. package/dist/mcp-server/common/index.d.ts +1 -0
  155. package/dist/mcp-server/common/index.d.ts.map +1 -1
  156. package/dist/mcp-server/common/index.js +1 -0
  157. package/dist/mcp-server/common/index.js.map +1 -1
  158. package/dist/mcp-server/common/paths.d.ts.map +1 -1
  159. package/dist/mcp-server/common/paths.js +2 -2
  160. package/dist/mcp-server/common/paths.js.map +1 -1
  161. package/dist/mcp-server/helpers/docs.helper.d.ts.map +1 -1
  162. package/dist/mcp-server/helpers/docs.helper.js +4 -2
  163. package/dist/mcp-server/helpers/docs.helper.js.map +1 -1
  164. package/dist/mcp-server/helpers/github.helper.js +1 -1
  165. package/dist/mcp-server/index.js +7 -2
  166. package/dist/mcp-server/index.js.map +1 -1
  167. package/dist/mcp-server/tools/base.tool.d.ts +6 -2
  168. package/dist/mcp-server/tools/base.tool.d.ts.map +1 -1
  169. package/dist/mcp-server/tools/base.tool.js.map +1 -1
  170. package/dist/mcp-server/tools/docs/search-documents.tool.d.ts +1 -1
  171. package/dist/mcp-server/tools/github/list-project-files.tool.d.ts +1 -1
  172. package/dist/mcp-server/tools/github/search-code.tool.d.ts +1 -1
  173. package/dist/mcp-server/tools/github/search-code.tool.d.ts.map +1 -1
  174. package/dist/mcp-server/tools/github/search-code.tool.js +4 -1
  175. package/dist/mcp-server/tools/github/search-code.tool.js.map +1 -1
  176. package/dist/mcp-server/tools/github/verify-dependencies.tool.d.ts.map +1 -1
  177. package/dist/mcp-server/tools/github/verify-dependencies.tool.js +3 -1
  178. package/dist/mcp-server/tools/github/verify-dependencies.tool.js.map +1 -1
  179. package/package.json +12 -12
  180. package/wiki/extensions/helpers/error/index.md +0 -227
  181. package/wiki/extensions/helpers/redis/index.md +0 -488
  182. package/wiki/extensions/helpers/testing/index.md +0 -510
  183. package/wiki/guides/core-concepts/services.md +0 -119
  184. package/wiki/guides/tutorials/testing.md +0 -722
  185. package/wiki/index.md +0 -183
  186. package/wiki/references/base/datasources.md +0 -454
  187. package/wiki/references/base/middlewares.md +0 -590
  188. package/wiki/references/base/repositories/mixins.md +0 -335
  189. package/wiki/references/base/services.md +0 -201
  190. package/wiki/references/utilities/crypto.md +0 -56
  191. package/wiki/references/utilities/module.md +0 -42
  192. /package/{wiki → content}/extensions/components/mail/api.md +0 -0
  193. /package/{wiki → content}/extensions/components/template/api-page.md +0 -0
  194. /package/{wiki → content}/extensions/components/template/errors-page.md +0 -0
  195. /package/{wiki → content}/extensions/components/template/single-page.md +0 -0
  196. /package/{wiki → content}/extensions/components/template/usage-page.md +0 -0
  197. /package/{wiki → content}/extensions/helpers/kafka/admin.md +0 -0
  198. /package/{wiki → content}/extensions/helpers/kafka/consumer.md +0 -0
  199. /package/{wiki → content}/extensions/helpers/kafka/index.md +0 -0
  200. /package/{wiki → content}/extensions/helpers/kafka/producer.md +0 -0
  201. /package/{wiki → content}/extensions/helpers/kafka/schema-registry.md +0 -0
  202. /package/{wiki → content}/extensions/helpers/network/api.md +0 -0
  203. /package/{wiki → content}/extensions/helpers/socket-io/api.md +0 -0
  204. /package/{wiki → content}/extensions/helpers/template/single-page.md +0 -0
  205. /package/{wiki → content}/extensions/helpers/uid/index.md +0 -0
  206. /package/{wiki → content}/guides/core-concepts/components-guide.md +0 -0
  207. /package/{wiki → content}/public/logo.svg +0 -0
  208. /package/{wiki → content}/references/base/filter-system/pattern-matching.md +0 -0
  209. /package/{wiki → content}/references/base/filter-system/range-operators.md +0 -0
  210. /package/{wiki → content}/references/utilities/date.md +0 -0
  211. /package/{wiki → content}/references/utilities/performance.md +0 -0
  212. /package/{wiki → content}/references/utilities/request.md +0 -0
  213. /package/{wiki → content}/references/utilities/statuses.md +0 -0
@@ -1,6 +1,6 @@
1
1
  # 5-Minute Quickstart
2
2
 
3
- Build your first Ignis API endpoint in 5 minutes. No database, no complex setup - just a working "Hello World" API.
3
+ Build your first IGNIS API endpoint in 5 minutes. No database, no complex setup - just a working "Hello World" API.
4
4
 
5
5
  **Time to Complete:** ~5 minutes
6
6
 
@@ -64,7 +64,7 @@ node_modules
64
64
  ## Step 3: Write Your API (2 minutes)
65
65
 
66
66
  :::info What is a Decorator?
67
- A decorator is a TypeScript feature that adds behavior to classes, methods, or properties. It's the `@something` syntax you see before definitions (like `@controller`, `@get`, `@inject`). Decorators in Ignis handle routing, dependency injection, and API documentation automatically.
67
+ A decorator is a TypeScript feature that adds behavior to classes, methods, or properties. It's the `@something` syntax you see before definitions (like `@controller`, `@get`, `@inject`). Decorators in IGNIS handle routing, dependency injection, and API documentation automatically.
68
68
 
69
69
  [Learn more →](/guides/reference/glossary#decorators)
70
70
  :::
@@ -86,7 +86,7 @@ import {
86
86
  get,
87
87
  IApplicationInfo,
88
88
  jsonContent,
89
- SwaggerComponent,
89
+ ApiReferenceComponent,
90
90
  } from "@venizia/ignis";
91
91
  import { HTTP } from "@venizia/ignis-helpers";
92
92
  import { Context } from "hono";
@@ -115,7 +115,7 @@ class HelloController extends BaseRestController {
115
115
  },
116
116
  })
117
117
  sayHello(c: Context) {
118
- return c.json({ message: "Hello from Ignis!" }, HTTP.ResultCodes.RS_2.Ok);
118
+ return c.json({ message: "Hello from IGNIS!" }, HTTP.ResultCodes.RS_2.Ok);
119
119
  }
120
120
  }
121
121
 
@@ -130,7 +130,7 @@ class App extends BaseApplication {
130
130
  }
131
131
 
132
132
  preConfigure() {
133
- this.component(SwaggerComponent);
133
+ this.component(ApiReferenceComponent);
134
134
  this.controller(HelloController);
135
135
  }
136
136
 
@@ -177,18 +177,18 @@ Update `package.json` to add build scripts:
177
177
  "server:prod": "NODE_ENV=production bun run dist/index.js"
178
178
  },
179
179
  "dependencies": {
180
- "hono": "^4.12.1",
180
+ "hono": "^4.12.25",
181
181
  "@hono/zod-openapi": "latest",
182
182
  "@scalar/hono-api-reference": "latest",
183
183
  "@venizia/ignis": "latest",
184
184
  "@venizia/ignis-helpers": "latest"
185
185
  },
186
186
  "devDependencies": {
187
- "typescript": "^5.5.3",
187
+ "typescript": "^6.0.3",
188
188
  "@types/bun": "latest",
189
189
  "@venizia/dev-configs": "latest",
190
- "eslint": "^9.36.0",
191
- "prettier": "^3.6.2",
190
+ "eslint": "^10.5.0",
191
+ "prettier": "^3.8.4",
192
192
  "tsc-alias": "^1.8.10"
193
193
  }
194
194
  }
@@ -222,7 +222,7 @@ Visit `http://localhost:3000/api/hello` in your browser!
222
222
  **Response:**
223
223
 
224
224
  ```json
225
- { "message": "Hello from Ignis!" }
225
+ { "message": "Hello from IGNIS!" }
226
226
  ```
227
227
 
228
228
  ## View API Docs
@@ -240,27 +240,27 @@ Open `http://localhost:3000/doc/explorer` to see interactive Swagger UI document
240
240
  | `Zod schema` | Validates request/response and auto-generates OpenAPI docs |
241
241
  | `BaseRestController` | Provides lifecycle hooks, route binding, and OpenAPI integration for REST controllers |
242
242
  | `BaseApplication` | Manages dependency injection, middleware, and server startup |
243
- | `SwaggerComponent` | Generates interactive API docs at `/doc/explorer` |
243
+ | `ApiReferenceComponent` | Generates interactive API docs at `/doc/explorer` |
244
244
  | `app.start()` | Runs the full lifecycle (preConfigure → register resources → middlewares) then starts HTTP server on port 3000 |
245
245
 
246
246
  ### Why Development Configs?
247
247
 
248
248
  You might wonder why we set up TypeScript, ESLint, and Prettier configs in a "quickstart". Here's why:
249
249
 
250
- **Ignis is opinionated about code quality.** We believe clean, consistent code from day one prevents technical debt later. The `@venizia/dev-configs` package provides pre-configured settings that:
250
+ **IGNIS is opinionated about code quality.** We believe clean, consistent code from day one prevents technical debt later. The `@venizia/dev-configs` package provides pre-configured settings that:
251
251
 
252
252
  | Config | Purpose |
253
253
  |--------|---------|
254
- | `tsconfig.json` | Strict TypeScript settings optimized for Ignis decorators and path aliases |
254
+ | `tsconfig.json` | Strict TypeScript settings optimized for IGNIS decorators and path aliases |
255
255
  | `eslint.config.mjs` | Catches common errors, enforces best practices, works with TypeScript |
256
- | `.prettierrc.mjs` | Consistent formatting across your team no more style debates |
256
+ | `.prettierrc.mjs` | Consistent formatting across your team - no more style debates |
257
257
 
258
- **Benefits of starting with Ignis code style:**
258
+ **Benefits of starting with IGNIS code style:**
259
259
 
260
- - **Consistency** Same patterns across all Ignis projects
261
- - **IDE Support** Better autocomplete, error detection, and refactoring
262
- - **Team Ready** New developers can onboard faster with familiar structure
263
- - **CI/CD Friendly** Lint and format checks work out of the box
260
+ - **Consistency** - Same patterns across all IGNIS projects
261
+ - **IDE Support** - Better autocomplete, error detection, and refactoring
262
+ - **Team Ready** - New developers can onboard faster with familiar structure
263
+ - **CI/CD Friendly** - Lint and format checks work out of the box
264
264
 
265
265
  > [!TIP]
266
266
  > All configs extend from `@venizia/dev-configs`, so you get updates automatically. Customize by overriding specific rules in your local config files.
@@ -1,6 +1,6 @@
1
1
  # Philosophy: The Best of Two Worlds
2
2
 
3
- Ignis combines the structured, enterprise-grade development experience of **LoopBack 4** with the speed and simplicity of **Hono**.
3
+ IGNIS combines the structured, enterprise-grade development experience of **LoopBack 4** with the speed and simplicity of **Hono**.
4
4
 
5
5
  <div class="philosophy-hero">
6
6
  <div class="hero-content">
@@ -34,7 +34,7 @@ When building REST APIs and server applications with Node.js/Bun, developers cho
34
34
 
35
35
  <div class="landscape-card balanced">
36
36
  <div class="card-header">
37
- <h3>Ignis, Ts.ED</h3>
37
+ <h3>IGNIS, Ts.ED</h3>
38
38
  <span class="card-badge">Balanced</span>
39
39
  </div>
40
40
  <p class="card-motto">Structure with lighter footprint</p>
@@ -86,7 +86,7 @@ When building REST APIs and server applications with Node.js/Bun, developers cho
86
86
 
87
87
  <div class="perf-row highlight">
88
88
  <div class="perf-info">
89
- <span class="perf-name">Ignis</span>
89
+ <span class="perf-name">IGNIS</span>
90
90
  <span class="perf-meta">~30ms startup · ~30MB</span>
91
91
  </div>
92
92
  <div class="perf-bar-container">
@@ -162,7 +162,7 @@ When building REST APIs and server applications with Node.js/Bun, developers cho
162
162
  <th>Aspect</th>
163
163
  <th>Minimal (Hono/Express)</th>
164
164
  <th>Enterprise (NestJS/LoopBack)</th>
165
- <th class="highlight-col">Ignis</th>
165
+ <th class="highlight-col">IGNIS</th>
166
166
  </tr>
167
167
  </thead>
168
168
  <tbody>
@@ -221,7 +221,7 @@ When building REST APIs and server applications with Node.js/Bun, developers cho
221
221
  <th>Feature</th>
222
222
  <th>Minimal</th>
223
223
  <th>Enterprise</th>
224
- <th class="highlight-col">Ignis</th>
224
+ <th class="highlight-col">IGNIS</th>
225
225
  </tr>
226
226
  </thead>
227
227
  <tbody>
@@ -274,7 +274,7 @@ When building REST APIs and server applications with Node.js/Bun, developers cho
274
274
  <th>Aspect</th>
275
275
  <th>Hono</th>
276
276
  <th>NestJS</th>
277
- <th class="highlight-col">Ignis</th>
277
+ <th class="highlight-col">IGNIS</th>
278
278
  </tr>
279
279
  </thead>
280
280
  <tbody>
@@ -330,7 +330,7 @@ When building REST APIs and server applications with Node.js/Bun, developers cho
330
330
  </table>
331
331
  </div>
332
332
 
333
- ## The Ignis Synthesis
333
+ ## The IGNIS Synthesis
334
334
 
335
335
  <div class="synthesis">
336
336
 
@@ -359,7 +359,7 @@ When building REST APIs and server applications with Node.js/Bun, developers cho
359
359
  <div class="synthesis-operator">=</div>
360
360
 
361
361
  <div class="synthesis-box result">
362
- <h4>Ignis</h4>
362
+ <h4>IGNIS</h4>
363
363
  <ul>
364
364
  <li>DI + Speed</li>
365
365
  <li>Structure + Simplicity</li>
@@ -400,7 +400,7 @@ When building REST APIs and server applications with Node.js/Bun, developers cho
400
400
  </div>
401
401
 
402
402
  <div class="excel-card ignis">
403
- <h3>Ignis</h3>
403
+ <h3>IGNIS</h3>
404
404
  <p class="excel-subtitle">The balanced choice</p>
405
405
  <div class="excel-pros">
406
406
  <h4>Strengths</h4>
@@ -452,7 +452,7 @@ When building REST APIs and server applications with Node.js/Bun, developers cho
452
452
 
453
453
  </div>
454
454
 
455
- ## When Should You Use Ignis?
455
+ ## When Should You Use IGNIS?
456
456
 
457
457
  <div class="decision-matrix">
458
458
 
@@ -530,7 +530,7 @@ When building REST APIs and server applications with Node.js/Bun, developers cho
530
530
 
531
531
  <div class="perfect-card">
532
532
  <h4>Production APIs</h4>
533
- <p>10-100+ endpoints with enterprise patterns. Controllers, services, repositories all built-in and ready.</p>
533
+ <p>10-100+ endpoints with enterprise patterns. Controllers, services, repositories - all built-in and ready.</p>
534
534
  </div>
535
535
 
536
536
  <div class="perfect-card">
@@ -557,42 +557,42 @@ When building REST APIs and server applications with Node.js/Bun, developers cho
557
557
  <div class="choose-card">
558
558
  <h3>Use Hono/Fastify/Express When:</h3>
559
559
  <ul>
560
- <li><strong>Simple webhook handler</strong> No structure overhead needed</li>
561
- <li><strong>Edge/serverless functions</strong> Minimal cold start, tiny bundle</li>
562
- <li><strong>Rapid prototyping</strong> Get something running in minutes</li>
563
- <li><strong>1-5 endpoint microservices</strong> Structure adds complexity</li>
564
- <li><strong>Maximum control needed</strong> No conventions to follow</li>
565
- <li><strong>Learning web development</strong> Simpler mental model</li>
560
+ <li><strong>Simple webhook handler</strong> - No structure overhead needed</li>
561
+ <li><strong>Edge/serverless functions</strong> - Minimal cold start, tiny bundle</li>
562
+ <li><strong>Rapid prototyping</strong> - Get something running in minutes</li>
563
+ <li><strong>1-5 endpoint microservices</strong> - Structure adds complexity</li>
564
+ <li><strong>Maximum control needed</strong> - No conventions to follow</li>
565
+ <li><strong>Learning web development</strong> - Simpler mental model</li>
566
566
  </ul>
567
567
  </div>
568
568
 
569
569
  <div class="choose-card">
570
570
  <h3>Use NestJS/LoopBack When:</h3>
571
571
  <ul>
572
- <li><strong>Large team (10+ developers)</strong> Strong conventions prevent chaos</li>
573
- <li><strong>Enterprise with strict standards</strong> Mature, battle-tested, auditable</li>
574
- <li><strong>Extensive ecosystem needed</strong> Many official and community modules</li>
575
- <li><strong>Complex microservices</strong> Built-in support for messaging, CQRS</li>
576
- <li><strong>Hiring is a priority</strong> Large talent pool familiar with it</li>
577
- <li><strong>Long-term support critical</strong> Corporate backing, LTS versions</li>
572
+ <li><strong>Large team (10+ developers)</strong> - Strong conventions prevent chaos</li>
573
+ <li><strong>Enterprise with strict standards</strong> - Mature, battle-tested, auditable</li>
574
+ <li><strong>Extensive ecosystem needed</strong> - Many official and community modules</li>
575
+ <li><strong>Complex microservices</strong> - Built-in support for messaging, CQRS</li>
576
+ <li><strong>Hiring is a priority</strong> - Large talent pool familiar with it</li>
577
+ <li><strong>Long-term support critical</strong> - Corporate backing, LTS versions</li>
578
578
  </ul>
579
579
  </div>
580
580
 
581
581
  <div class="choose-card highlight">
582
- <h3>Use Ignis When:</h3>
582
+ <h3>Use IGNIS When:</h3>
583
583
  <ul>
584
- <li><strong>Any size API (10-100+ endpoints)</strong> Structure without heavy overhead</li>
585
- <li><strong>Any team size</strong> Scales from solo dev to enterprise teams</li>
586
- <li><strong>Performance matters</strong> Hono's speed with enterprise patterns</li>
587
- <li><strong>Modern stack preferred</strong> ESM native, Bun optimized, TypeScript-first</li>
588
- <li><strong>Coming from NestJS/LoopBack</strong> Familiar patterns, better performance</li>
589
- <li><strong>Need built-in features</strong> DI, validation, OpenAPI, auth ready to use</li>
584
+ <li><strong>Any size API (10-100+ endpoints)</strong> - Structure without heavy overhead</li>
585
+ <li><strong>Any team size</strong> - Scales from solo dev to enterprise teams</li>
586
+ <li><strong>Performance matters</strong> - Hono's speed with enterprise patterns</li>
587
+ <li><strong>Modern stack preferred</strong> - ESM native, Bun optimized, TypeScript-first</li>
588
+ <li><strong>Coming from NestJS/LoopBack</strong> - Familiar patterns, better performance</li>
589
+ <li><strong>Need built-in features</strong> - DI, validation, OpenAPI, auth ready to use</li>
590
590
  </ul>
591
591
  </div>
592
592
 
593
593
  </div>
594
594
 
595
- ## Why Choose Ignis
595
+ ## Why Choose IGNIS
596
596
 
597
597
  <div class="tradeoffs">
598
598
 
@@ -603,7 +603,7 @@ When building REST APIs and server applications with Node.js/Bun, developers cho
603
603
  <li><span class="highlight-text">Built-in DI</span>, validation, OpenAPI, auth</li>
604
604
  <li><span class="highlight-text">Structured codebase</span> from day one</li>
605
605
  <li><span class="highlight-text">Easier testing</span> with dependency injection</li>
606
- <li><span class="highlight-text">Single file build</span> compile to one executable with Bun</li>
606
+ <li><span class="highlight-text">Single file build</span> - compile to one executable with Bun</li>
607
607
  <li><span class="highlight-text">Scales</span> from solo dev to enterprise teams</li>
608
608
  </ul>
609
609
  </div>
@@ -611,10 +611,10 @@ When building REST APIs and server applications with Node.js/Bun, developers cho
611
611
  <div class="tradeoff cost">
612
612
  <h3>What's Growing</h3>
613
613
  <ul>
614
- <li><span class="highlight-text">Community</span> expanding every day</li>
615
- <li><span class="highlight-text">Documentation</span> continuously improving</li>
616
- <li><span class="highlight-text">Ecosystem</span> core features ready, plugins coming</li>
617
- <li><span class="highlight-text">LTS</span> planning for long-term support</li>
614
+ <li><span class="highlight-text">Community</span> - expanding every day</li>
615
+ <li><span class="highlight-text">Documentation</span> - continuously improving</li>
616
+ <li><span class="highlight-text">Ecosystem</span> - core features ready, plugins coming</li>
617
+ <li><span class="highlight-text">LTS</span> - planning for long-term support</li>
618
618
  </ul>
619
619
  </div>
620
620
 
@@ -1,6 +1,6 @@
1
1
  # Setup
2
2
 
3
- Everything you need to start building with Ignis. This guide covers installation for macOS, Linux, and Windows (via WSL2).
3
+ Everything you need to start building with IGNIS. This guide covers installation for macOS, Linux, and Windows (via WSL2).
4
4
 
5
5
  ## Requirements
6
6
 
@@ -153,5 +153,5 @@ sudo service postgresql start
153
153
 
154
154
  ## Next Steps
155
155
 
156
- - [5-Minute Quickstart](./5-minute-quickstart.md) Build your first API
157
- - [Complete Installation](../tutorials/complete-installation.md) Full project setup
156
+ - [5-Minute Quickstart](./5-minute-quickstart.md) - Build your first API
157
+ - [Complete Installation](../tutorials/complete-installation.md) - Full project setup
@@ -1,6 +1,6 @@
1
- # Getting Started with Ignis
1
+ # Getting Started with IGNIS
2
2
 
3
- Welcome to Ignis a TypeScript framework that combines enterprise architecture patterns with Hono's blazing performance. Whether you're building a SaaS backend, REST API, gRPC service, or microservice, these guides will take you from installation to production-ready code with type-safe database operations, auto-generated OpenAPI docs, and clean dependency injection.
3
+ Welcome to IGNIS - a TypeScript framework that combines enterprise architecture patterns with Hono's blazing performance. Whether you're building a SaaS backend, REST API, gRPC service, or microservice, these guides will take you from installation to production-ready code with type-safe database operations, auto-generated OpenAPI docs, and clean dependency injection.
4
4
 
5
5
  <div class="guide-cards">
6
6
 
@@ -31,7 +31,7 @@ Welcome to Ignis — a TypeScript framework that combines enterprise architectur
31
31
 
32
32
  <a href="./get-started/philosophy" class="guide-card">
33
33
  <h3>Philosophy</h3>
34
- <p>Why Ignis? Design decisions explained</p>
34
+ <p>Why IGNIS? Design decisions explained</p>
35
35
  </a>
36
36
 
37
37
  </div>
@@ -0,0 +1,177 @@
1
+ ---
2
+ title: Migrating to the new Redis Helper API
3
+ description: Breaking changes and migration steps for the IGNIS Redis helper refactor - folder-per-topology, AbstractRedisHelper, camelCase methods, Sentinel, and the createRedisHelper factory
4
+ ---
5
+
6
+ # Migrating to the new Redis Helper API
7
+
8
+ > **Audience:** any application upgrading `@venizia/ignis-helpers` (and `@venizia/ignis`) across the Redis helper refactor release. This guide describes exactly what breaks and how to migrate. It applies to every consumer - it is not specific to any one app.
9
+
10
+ ---
11
+
12
+ ## 0. TL;DR
13
+
14
+ The IGNIS Redis module was restructured into one base class plus three topologies (single / cluster / sentinel) behind a segregated `IRedisHelper` interface. Several public symbols were **renamed with no back-compat aliases (clean break)**, and the lowercase hash/multi methods were removed in favor of camelCase. Your project **will not compile** against the new version until you apply the renames in §1.
15
+
16
+ Nothing in your data or Redis server changes - this is a code-level rename plus a few additive features. The single and cluster connection behavior is byte-for-byte identical to before; only the new `RedisSentinelHelper` introduces new behavior.
17
+
18
+ | Effort | What |
19
+ |--------|------|
20
+ | **Low - mechanical renames** | Apply the rename table in §1 and the method renames in §1.2. Compiler-guided: every stale reference becomes a type error. |
21
+
22
+ ---
23
+
24
+ ## 1. What changed (breaking)
25
+
26
+ ### 1.1 Class and type renames (no aliases)
27
+
28
+ | Old (removed) | New |
29
+ |---------------|-----|
30
+ | `DefaultRedisHelper` | `AbstractRedisHelper` |
31
+ | `RedisHelper` | `RedisSingleHelper` |
32
+ | `IRedisHelperOptions` | `IRedisSingleHelperOptions` |
33
+ | `IRedisHelperProps` | `IRedisSingleHelperProps` |
34
+
35
+ `RedisClusterHelper` is **unchanged** in name and behavior.
36
+
37
+ `AbstractRedisHelper` is the base class (never constructed directly). Use it only where you need an `instanceof` check or a concrete-class binding; for plain typing prefer the `IRedisHelper` interface.
38
+
39
+ ### 1.2 Lowercase methods removed - use camelCase
40
+
41
+ The duplicate lowercase aliases were removed. The camelCase forms are now the only API.
42
+
43
+ | Old (removed) | New |
44
+ |---------------|-----|
45
+ | `.hset(...)` | `.hSet(...)` |
46
+ | `.hgetall(...)` | `.hGetAll(...)` |
47
+ | `.mset(...)` | `.mSet(...)` |
48
+ | `.mget(...)` | `.mGet(...)` |
49
+
50
+ Single-word methods (`get`, `set`, `del`, `keys`, `publish`, `subscribe`) are unchanged.
51
+
52
+ ### 1.3 Callback type narrowed
53
+
54
+ `IRedisHelperCallbacks.onError` now receives `error: unknown` (was `error: any`). This only affects you if you access properties on `error` without narrowing first.
55
+
56
+ ---
57
+
58
+ ## 2. Find every affected site
59
+
60
+ Run this in your project root. Every match is a site to migrate:
61
+
62
+ ```bash
63
+ grep -rnE 'DefaultRedisHelper|\bRedisHelper\b|IRedisHelper(Options|Props)\b|\.(hset|mset|hgetall|mget)\(' src
64
+ ```
65
+
66
+ `\bRedisHelper\b` matches the bare class only - it will not match `RedisClusterHelper` / `RedisSingleHelper`.
67
+
68
+ After migrating, re-run it; a clean result plus a green `tsc` means you are done.
69
+
70
+ ---
71
+
72
+ ## 3. Migration steps (before / after)
73
+
74
+ ### Constructing a single-node connection
75
+
76
+ ```typescript
77
+ // Before
78
+ import { RedisHelper } from '@venizia/ignis-helpers';
79
+ const redis = new RedisHelper({ name: 'cache', host, port, password });
80
+
81
+ // After
82
+ import { RedisSingleHelper } from '@venizia/ignis-helpers';
83
+ const redis = new RedisSingleHelper({ name: 'cache', host, port, password });
84
+ ```
85
+
86
+ ### Typing a Redis connection (config, fields, params)
87
+
88
+ Prefer the interface for plain typing:
89
+
90
+ ```typescript
91
+ // Before
92
+ import { DefaultRedisHelper } from '@venizia/ignis-helpers';
93
+ function useRedis(connection: DefaultRedisHelper) { /* ... */ }
94
+
95
+ // After
96
+ import type { IRedisHelper } from '@venizia/ignis-helpers';
97
+ function useRedis(connection: IRedisHelper) { /* ... */ }
98
+ ```
99
+
100
+ ### instanceof checks and concrete bindings
101
+
102
+ Use the concrete base class (you cannot `instanceof` an interface):
103
+
104
+ ```typescript
105
+ // Before
106
+ if (connection instanceof DefaultRedisHelper) { /* ... */ }
107
+
108
+ // After
109
+ import { AbstractRedisHelper } from '@venizia/ignis-helpers';
110
+ if (connection instanceof AbstractRedisHelper) { /* ... */ }
111
+ ```
112
+
113
+ ### Options type rename
114
+
115
+ ```typescript
116
+ // Before
117
+ import type { IRedisHelperOptions } from '@venizia/ignis-helpers';
118
+
119
+ // After
120
+ import type { IRedisSingleHelperOptions } from '@venizia/ignis-helpers';
121
+ ```
122
+
123
+ ### Hash and multi-key calls
124
+
125
+ ```typescript
126
+ // Before
127
+ await redis.hset({ key, value });
128
+ const all = await redis.hgetall({ key });
129
+ await redis.mset({ payload });
130
+ const many = await redis.mget({ keys });
131
+
132
+ // After
133
+ await redis.hSet({ key, value });
134
+ const all = await redis.hGetAll({ key });
135
+ await redis.mSet({ payload });
136
+ const many = await redis.mGet({ keys });
137
+ ```
138
+
139
+ ---
140
+
141
+ ## 4. Runtime behavior changes to verify
142
+
143
+ These compile unchanged but behave slightly differently. All are strictly safer; verify only if your code depended on the old behavior.
144
+
145
+ | Method | Old behavior | New behavior |
146
+ |--------|--------------|--------------|
147
+ | `subscribe` / `unsubscribe` | threw inside the ioredis callback on a subscription error (an unhandled async throw) | logs the error and returns; never throws |
148
+ | `del` / `mGet` / `mSet` | forwarded empty input to Redis, which throws "wrong number of arguments" | empty input is a no-op: returns `0` / `[]` / void without a Redis call |
149
+
150
+ If you wrapped `subscribe(...)` in a `try/catch` expecting it to throw, that branch no longer fires. If you relied on `del([])` throwing, it now returns `0`.
151
+
152
+ ---
153
+
154
+ ## 5. What you gain (additive - no action required)
155
+
156
+ These are new and do not break anything:
157
+
158
+ - **`RedisSentinelHelper`** - Redis Sentinel topology with automatic failover. See the [Redis Helper reference](/extensions/helpers/redis/) (Sentinel section).
159
+ - **`createRedisHelper({ mode })`** - a factory that builds the right helper from `RedisModes.SINGLE | CLUSTER | SENTINEL`, so you can pick a topology from config.
160
+ - **`RedisModes`** and **`RedisSentinelRoles`** - const-classes for the enumerable mode/role strings, with matching `TRedisMode` / `TRedisSentinelRole` types.
161
+ - **Expanded data API** - key lifecycle and counters (`exists`, `expire`, `expireAt`, `ttl`, `persist`, `incr`, `decr`, `incrBy`, `decrBy`), hash completion (`hGet`, `hDel`, `hExists`, `hKeys`, `hVals`, `hIncrBy`, `hLen`), sets (`sAdd`, `sRem`, `sMembers`, `sIsMember`, `sCard`), and lists (`lPush`, `rPush`, `lPop`, `rPop`, `lRange`, `lLen`).
162
+ - **`set` TTL option** - `set({ key, value, options: { expiresIn } })` where `expiresIn` is milliseconds (uses `PX`).
163
+ - **All three topologies are interchangeable** - anywhere an `IRedisHelper` is accepted (BullMQ, Socket.IO, WebSocket, the Casbin cache), you can now pass a single, cluster, or sentinel helper without changing the consumer.
164
+
165
+ ---
166
+
167
+ ## 6. Migration checklist
168
+
169
+ - [ ] Run the grep in §2; note every match.
170
+ - [ ] Apply the §1.1 class/type renames.
171
+ - [ ] Apply the §1.2 lowercase to camelCase method renames.
172
+ - [ ] Switch plain-typed connection references to `IRedisHelper`; keep `AbstractRedisHelper` for `instanceof` / concrete bindings.
173
+ - [ ] Narrow `onError` usage if you read fields off `error`.
174
+ - [ ] Review §4 if you relied on subscribe throwing or empty-input throwing.
175
+ - [ ] Re-run the grep (clean) and `tsc` (green); run your test suite.
176
+
177
+ When the grep is clean and the build is green, the migration is complete - there is no data or server-side change to perform.
@@ -16,8 +16,8 @@ You have two paths:
16
16
 
17
17
  | Path | Effort | When |
18
18
  |------|--------|------|
19
- | **B Bridge** (re-base your custom adapter on `BaseFilteredAdapter`, keep your flat model) | Low code only, **no data migration** | Do this first to unblock the upgrade |
20
- | **A Adopt scoped** (delete your custom adapter, use `ScopedCasbinAdapter` + scoped model) | High needs a **data migration** | The intended long-term target |
19
+ | **B - Bridge** (re-base your custom adapter on `BaseFilteredAdapter`, keep your flat model) | Low - code only, **no data migration** | Do this first to unblock the upgrade |
20
+ | **A - Adopt scoped** (delete your custom adapter, use `ScopedCasbinAdapter` + scoped model) | High - needs a **data migration** | The intended long-term target |
21
21
 
22
22
  Both are described below with exact before/after.
23
23
 
@@ -67,9 +67,9 @@ When you bump ignis, these stop compiling/working:
67
67
 
68
68
  ---
69
69
 
70
- ## 3. Path B Bridge (recommended first step, no data migration)
70
+ ## 3. Path B - Bridge (recommended first step, no data migration)
71
71
 
72
- Goal: compile against new ignis with **identical runtime behavior** keep your flat `CASBIN_RBAC_MODEL`,
72
+ Goal: compile against new ignis with **identical runtime behavior** - keep your flat `CASBIN_RBAC_MODEL`,
73
73
  your `group`/`policy` variant values, and all bespoke logic (global roles, HQ-owner expansion).
74
74
 
75
75
  ### 3.1 Define your own variant constants
@@ -147,24 +147,24 @@ Key swaps inside the class:
147
147
  - `filter.principalValue` → `filter.principal.id`; `filter.principalType` → `filter.principal.type`.
148
148
  - `this.entities.role.principalType` / `this.entities.permission.principalType` → from your own
149
149
  `entities` (pass the same values you pass today; drop the `tableName`/`policyDefinition` parts the
150
- base used to require you import the Drizzle tables directly already).
150
+ base used to require - you import the Drizzle tables directly already).
151
151
  - `CasbinRuleVariants.GROUP/.POLICY` → `PolicyDefinitionVariant.GROUP/.POLICY` (§3.1).
152
152
 
153
153
  ### 3.3 Fix the cache fallback in `verifier.ts`
154
154
 
155
155
  ```ts
156
- // BEFORE in-memory fallback (driver removed)
156
+ // BEFORE - in-memory fallback (driver removed)
157
157
  const cached: ICasbinEnforcerOptions['cached'] = redis
158
158
  ? { use: true, driver: CasbinEnforcerCachedDrivers.REDIS, options: { ... } }
159
159
  : { use: true, driver: CasbinEnforcerCachedDrivers.IN_MEMORY, options: { expiresIn: 5*60*1000 } };
160
160
 
161
- // AFTER Redis or no cache
161
+ // AFTER - Redis or no cache
162
162
  const cached: ICasbinEnforcerOptions['cached'] = redis
163
163
  ? { use: true, driver: CasbinEnforcerCachedDrivers.REDIS, options: { connection: redis, expiresIn: 5*60*1000, keyFn: ({ user }) => `casbin:${user.principalType}:${user.userId}` } }
164
164
  : { use: false };
165
165
  ```
166
166
 
167
- > **Decide:** in prod, **always provide Redis** without it every request rebuilds the policy from the
167
+ > **Decide:** in prod, **always provide Redis** - without it every request rebuilds the policy from the
168
168
  > DB (no per-user cache). The pool still protects you from the concurrency race, but you lose the line cache.
169
169
 
170
170
  ### 3.4 Adapter construction (`verifier.ts`)
@@ -187,7 +187,7 @@ stays. **Result: behavior identical, compiles on new ignis, zero data migration.
187
187
 
188
188
  ---
189
189
 
190
- ## 4. Path A Adopt the scoped model (target state)
190
+ ## 4. Path A - Adopt the scoped model (target state)
191
191
 
192
192
  This deletes `ApplicationCasbinAdapter` entirely and uses the generic `ScopedCasbinAdapter`. The
193
193
  bespoke logic moves from **code** into **data (edges)**. Do this once Path B has unblocked you.
@@ -221,7 +221,7 @@ const adapter = new ScopedCasbinAdapter({
221
221
  // pass the request domain via the provider's domain resolver instead)
222
222
  ```
223
223
 
224
- ### 4.2 Data migration the `variant` column
224
+ ### 4.2 Data migration - the `variant` column
225
225
 
226
226
  The scoped adapter filters on `AuthorizationPolicyVariants.*.action`, not `group`/`policy`. You must
227
227
  re-classify rows:
@@ -234,11 +234,11 @@ re-classify rows:
234
234
  | `policy` (role→perm or user→perm) | `grant` | permission grant |
235
235
 
236
236
  New edge types you may need to **add** (no equivalent today):
237
- - `domain_inherits` (Merchant ⊂ Organizer / HQ) **this replaces the bespoke `queryHqOwnerOrgMerchants`
237
+ - `domain_inherits` (Merchant ⊂ Organizer / HQ) - **this replaces the bespoke `queryHqOwnerOrgMerchants`
238
238
  JOIN**. Materialize one row per Merchant→Organizer (or →HQ-merchant) relationship; the scoped model's
239
239
  `g3` then cascades a grant on the parent domain to all child merchants automatically. Maintain these
240
240
  rows when merchants/organizers are created or moved.
241
- - `resource_inherits` (`g4`) / `action_inherits` (`g5`) only if you want resource/action hierarchies.
241
+ - `resource_inherits` (`g4`) / `action_inherits` (`g5`) - only if you want resource/action hierarchies.
242
242
 
243
243
  ### 4.3 Re-express bespoke behavior as data
244
244
 
@@ -249,7 +249,7 @@ New edge types you may need to **add** (no equivalent today):
249
249
  | HQ-owner expansion (live JOIN) | `domain_inherits` (`g3`) edges (see §4.2) |
250
250
  | Domain-agnostic role permissions (`p, Role, *, ...`) | Grant rows with domain `ANY_MEMBER` (default when `domain` is NULL) |
251
251
 
252
- ### 4.4 Behavioral caveat resource matching changes
252
+ ### 4.4 Behavioral caveat - resource matching changes
253
253
 
254
254
  Your flat model uses exact `r.obj == p.obj`. The scoped model uses **`objectMatch`** (dotted-prefix +
255
255
  wildcard): a grant on `Order` will now **also** match `Order.findById`, and `p.obj = '*'` matches any
@@ -277,20 +277,20 @@ the bespoke adapter and gain resource/action/domain hierarchies for free.
277
277
 
278
278
  ## 6. Verification checklist (either path)
279
279
 
280
- - [ ] `bun run build` (or `tsc -p .`) is clean no references to `DrizzleCasbinAdapter`,
280
+ - [ ] `bun run build` (or `tsc -p .`) is clean - no references to `DrizzleCasbinAdapter`,
281
281
  `IDrizzleCasbinAdapterOptions`, `CasbinRuleVariants.GROUP/.POLICY`, `CasbinEnforcerCachedDrivers.IN_MEMORY`,
282
282
  `IAuthorizationCacheInvalidator`.
283
283
  - [ ] `SELECT DISTINCT variant FROM identity."PolicyDefinition"` matches what your adapter filters on
284
284
  (`group`/`policy` for Path B; the new `*.action` set for Path A).
285
285
  - [ ] A request for a user with a role-inherited / per-merchant / global permission resolves the same
286
- ALLOW/DENY as before the upgrade (pick 34 representative users and diff).
286
+ ALLOW/DENY as before the upgrade (pick 3-4 representative users and diff).
287
287
  - [ ] If `cached.use: true`, Redis is reachable; if a permission changes, call
288
- `enforcer.invalidateUserCache({ user })` (or rely on TTL) see the ignis authorization docs.
288
+ `enforcer.invalidateUserCache({ user })` (or rely on TTL) - see the ignis authorization docs.
289
289
  - [ ] Super-admin / always-allow-roles still short-circuit (these run in the provider before the enforcer).
290
290
 
291
291
  ---
292
292
 
293
- ## 7. Reference current nx-seller wiring (before)
293
+ ## 7. Reference - current nx-seller wiring (before)
294
294
 
295
295
  For context, the current registration (`packages/core/src/application/verifier.ts`) uses:
296
296
  `ApplicationCasbinAdapter` (subclass of removed `DrizzleCasbinAdapter`), `CASBIN_RBAC_MODEL` (flat