@venizia/ignis-docs 0.2.1-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 (145) hide show
  1. package/content/best-practices/architectural-patterns.md +3 -3
  2. package/content/best-practices/code-style-standards/naming-conventions.md +1 -1
  3. package/content/best-practices/contribution-workflow.md +2 -2
  4. package/content/best-practices/error-handling.md +94 -89
  5. package/content/best-practices/security-guidelines.md +5 -5
  6. package/content/extensions/components/api-reference.md +22 -21
  7. package/content/extensions/components/authentication/api.md +64 -28
  8. package/content/extensions/components/authentication/errors.md +19 -5
  9. package/content/extensions/components/authentication/index.md +19 -18
  10. package/content/extensions/components/authentication/usage.md +55 -30
  11. package/content/extensions/components/authorization/api.md +351 -84
  12. package/content/extensions/components/authorization/errors.md +51 -17
  13. package/content/extensions/components/authorization/getting-started.md +227 -0
  14. package/content/extensions/components/authorization/index.md +24 -16
  15. package/content/extensions/components/authorization/usage.md +45 -21
  16. package/content/extensions/components/health-check.md +15 -9
  17. package/content/extensions/components/index.md +24 -90
  18. package/content/extensions/components/mail/api.md +105 -54
  19. package/content/extensions/components/mail/errors.md +12 -10
  20. package/content/extensions/components/mail/index.md +32 -13
  21. package/content/extensions/components/mail/usage.md +26 -18
  22. package/content/extensions/components/request-tracker.md +18 -14
  23. package/content/extensions/components/socket-io/api.md +377 -882
  24. package/content/extensions/components/socket-io/errors.md +49 -51
  25. package/content/extensions/components/socket-io/index.md +72 -88
  26. package/content/extensions/components/socket-io/usage.md +107 -117
  27. package/content/extensions/components/static-asset/api.md +83 -31
  28. package/content/extensions/components/static-asset/errors.md +18 -7
  29. package/content/extensions/components/static-asset/index.md +18 -11
  30. package/content/extensions/components/static-asset/usage.md +11 -6
  31. package/content/extensions/components/template/index.md +3 -3
  32. package/content/extensions/components/websocket/api.md +58 -27
  33. package/content/extensions/components/websocket/errors.md +3 -3
  34. package/content/extensions/components/websocket/index.md +8 -7
  35. package/content/extensions/components/websocket/usage.md +21 -8
  36. package/content/extensions/helpers/cron/index.md +8 -7
  37. package/content/extensions/helpers/crypto/index.md +16 -8
  38. package/content/extensions/helpers/crypto/reference.md +96 -24
  39. package/content/extensions/helpers/env/index.md +14 -10
  40. package/content/extensions/helpers/error/index.md +99 -23
  41. package/content/extensions/helpers/index.md +61 -47
  42. package/content/extensions/helpers/inversion/index.md +23 -6
  43. package/content/extensions/helpers/inversion/reference.md +30 -22
  44. package/content/extensions/helpers/kafka/admin.md +3 -2
  45. package/content/extensions/helpers/kafka/compile-binary.md +69 -44
  46. package/content/extensions/helpers/kafka/consumer.md +24 -21
  47. package/content/extensions/helpers/kafka/examples.md +22 -234
  48. package/content/extensions/helpers/kafka/index.md +30 -62
  49. package/content/extensions/helpers/kafka/producer.md +31 -26
  50. package/content/extensions/helpers/kafka/schema-registry.md +19 -14
  51. package/content/extensions/helpers/logger/hf-logger.md +49 -22
  52. package/content/extensions/helpers/logger/index.md +37 -12
  53. package/content/extensions/helpers/logger/pino.md +31 -11
  54. package/content/extensions/helpers/logger/reference.md +243 -52
  55. package/content/extensions/helpers/network/api.md +65 -30
  56. package/content/extensions/helpers/network/index.md +32 -11
  57. package/content/extensions/helpers/queue/index.md +17 -6
  58. package/content/extensions/helpers/queue/reference.md +52 -25
  59. package/content/extensions/helpers/redis/index.md +29 -11
  60. package/content/extensions/helpers/redis/reference.md +85 -28
  61. package/content/extensions/helpers/secrets/index.md +82 -12
  62. package/content/extensions/helpers/socket-io/api.md +40 -21
  63. package/content/extensions/helpers/socket-io/index.md +26 -10
  64. package/content/extensions/helpers/storage/api.md +42 -24
  65. package/content/extensions/helpers/storage/index.md +10 -7
  66. package/content/extensions/helpers/types/index.md +20 -7
  67. package/content/extensions/helpers/types/reference.md +53 -14
  68. package/content/extensions/helpers/uid/index.md +166 -10
  69. package/content/extensions/helpers/websocket/api.md +52 -13
  70. package/content/extensions/helpers/websocket/index.md +7 -4
  71. package/content/extensions/helpers/worker-thread/index.md +9 -5
  72. package/content/extensions/helpers/worker-thread/reference.md +20 -20
  73. package/content/extensions/index.md +38 -39
  74. package/content/extensions/src-details/mcp-server.md +96 -548
  75. package/content/guides/core-concepts/persistent/datasources.md +2 -2
  76. package/content/guides/core-concepts/persistent/index.md +5 -1
  77. package/content/guides/core-concepts/persistent/pglite.md +218 -0
  78. package/content/guides/core-concepts/persistent/postgres-drivers.md +21 -15
  79. package/content/guides/core-concepts/persistent/search-meilisearch.md +22 -12
  80. package/content/guides/core-concepts/persistent/search-typesense.md +26 -14
  81. package/content/guides/core-concepts/persistent/sqlite.md +296 -0
  82. package/content/guides/core-concepts/persistent/transactions.md +12 -11
  83. package/content/guides/get-started/5-minute-quickstart.md +59 -206
  84. package/content/guides/get-started/philosophy.md +135 -670
  85. package/content/guides/get-started/setup.md +53 -74
  86. package/content/guides/migrations/redis-helpers-migration.md +4 -3
  87. package/content/guides/migrations/scoped-rbac-migration.md +5 -5
  88. package/content/guides/migrations/unified-connectors-migration.md +7 -6
  89. package/content/guides/tutorials/realtime-chat.md +1 -1
  90. package/content/references/base/application.md +63 -21
  91. package/content/references/base/components.md +3 -3
  92. package/content/references/base/connectors.md +14 -14
  93. package/content/references/base/controllers.md +12 -12
  94. package/content/references/base/datasources-reference.md +32 -31
  95. package/content/references/base/datasources.md +6 -6
  96. package/content/references/base/dependency-injection.md +12 -11
  97. package/content/references/base/filter-system/application-usage.md +54 -30
  98. package/content/references/base/filter-system/array-operators.md +24 -46
  99. package/content/references/base/filter-system/comparison-operators.md +47 -67
  100. package/content/references/base/filter-system/default-filter.md +59 -53
  101. package/content/references/base/filter-system/fields-order-pagination.md +92 -146
  102. package/content/references/base/filter-system/index.md +25 -13
  103. package/content/references/base/filter-system/json-filtering.md +45 -184
  104. package/content/references/base/filter-system/list-operators.md +23 -53
  105. package/content/references/base/filter-system/logical-operators.md +63 -121
  106. package/content/references/base/filter-system/null-operators.md +34 -104
  107. package/content/references/base/filter-system/pattern-matching.md +40 -55
  108. package/content/references/base/filter-system/quick-reference.md +86 -198
  109. package/content/references/base/filter-system/range-operators.md +18 -46
  110. package/content/references/base/filter-system/tips.md +6 -6
  111. package/content/references/base/filter-system/use-cases.md +33 -15
  112. package/content/references/base/grpc-controllers.md +53 -17
  113. package/content/references/base/index.md +5 -3
  114. package/content/references/base/middlewares.md +11 -10
  115. package/content/references/base/models-reference.md +17 -17
  116. package/content/references/base/models.md +4 -3
  117. package/content/references/base/providers.md +8 -8
  118. package/content/references/base/repositories/advanced.md +224 -326
  119. package/content/references/base/repositories/index.md +19 -6
  120. package/content/references/base/repositories/mixins.md +5 -5
  121. package/content/references/base/repositories/relations.md +160 -293
  122. package/content/references/base/repositories/soft-deletable.md +16 -6
  123. package/content/references/base/secrets.md +17 -13
  124. package/content/references/base/services.md +6 -4
  125. package/content/references/configuration/environment-variables.md +31 -23
  126. package/content/references/configuration/index.md +6 -4
  127. package/content/references/index.md +1 -1
  128. package/content/references/utilities/duration.md +85 -0
  129. package/content/references/utilities/index.md +5 -1
  130. package/content/references/utilities/jsx-reference.md +11 -11
  131. package/content/references/utilities/jsx.md +2 -2
  132. package/content/references/utilities/module.md +78 -25
  133. package/content/references/utilities/request.md +2 -1
  134. package/content/references/utilities/retry.md +139 -0
  135. package/content/references/utilities/schema.md +2 -2
  136. package/content/references/utilities/statuses-reference.md +4 -4
  137. package/content/references/utilities/statuses.md +5 -5
  138. package/dist/mcp-server/index.js +0 -0
  139. package/dist/mcp-server/tools/github/list-project-files.tool.d.ts +1 -1
  140. package/dist/mcp-server/tools/github/list-project-files.tool.d.ts.map +1 -1
  141. package/dist/mcp-server/tools/github/list-project-files.tool.js +3 -3
  142. package/dist/mcp-server/tools/github/search-code.tool.js +1 -1
  143. package/dist/mcp-server/tools/github/verify-dependencies.tool.js +1 -1
  144. package/dist/mcp-server/tools/github/view-source-file.tool.js +1 -1
  145. package/package.json +17 -16
@@ -1,59 +1,51 @@
1
- # Setup
1
+ # Set Up Your Development Environment
2
2
 
3
- Everything you need to start building with IGNIS. This guide covers installation for macOS, Linux, and Windows (via WSL2).
3
+ Get your machine ready to build with IGNIS: a runtime, a database, and an editor. This guide
4
+ covers macOS, Linux, and Windows through WSL2.
4
5
 
5
6
  ## Requirements
6
7
 
7
- | Tool | Version | Required | Notes |
8
- |------|---------|----------|-------|
9
- | **Bun** | >= 1.3 | Yes | Primary runtime, fastest performance |
10
- | **Node.js** | >= 18 | Alternative | Use if Bun isn't available |
11
- | **PostgreSQL** | >= 14 | Yes | Primary database |
12
- | **VS Code** | Latest | Recommended | Best IDE experience with extensions |
8
+ | Tool | Version | Required | Why |
9
+ |------|---------|----------|-----|
10
+ | **Bun** | >= 1.3 | Yes | Installs packages and runs every build; IGNIS never uses npm, yarn, or pnpm |
11
+ | **PostgreSQL** | >= 14 | Yes | Primary database; the repository system assumes Drizzle + `pg` |
12
+ | **VS Code** | Latest | Optional | Best editor support, through ESLint and Prettier extensions |
13
13
 
14
- ## Install Runtime
14
+ > IGNIS apps can also run on Node.js 18+ in production, through `@hono/node-server`. That is a
15
+ > deployment choice, not a setup choice - Bun still installs packages and runs every command in
16
+ > this guide.
15
17
 
16
- ### Bun (Recommended)
18
+ ## Preconditions
17
19
 
18
- ```bash
19
- # macOS / Linux
20
- curl -fsSL https://bun.sh/install | bash
21
-
22
- # Windows (use WSL2)
23
- # First install WSL2: wsl --install
24
- # Then run the curl command above in WSL
20
+ - A terminal with permission to install packages (`sudo` on Linux, admin rights on Windows).
21
+ - On Windows, WSL2 installed (`wsl --install`). Run every command in this guide inside WSL2.
25
22
 
26
- # Verify
27
- bun --version # Should be 1.3+
28
- ```
29
-
30
- ### Node.js (Alternative)
23
+ ## Step 1: Install Bun
31
24
 
32
25
  ```bash
33
- # macOS (Homebrew)
34
- brew install node@18
26
+ curl -fsSL https://bun.sh/install | bash
27
+ ```
35
28
 
36
- # Ubuntu/Debian
37
- curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
38
- sudo apt-get install -y nodejs
29
+ On Windows, run this command inside WSL2.
39
30
 
40
- # Windows
41
- # Download from https://nodejs.org/
31
+ Reload your shell, then confirm the version:
42
32
 
43
- # Verify
44
- node --version # Should be 18+
33
+ ```bash
34
+ bun --version # >= 1.3
45
35
  ```
46
36
 
47
- ## Install PostgreSQL
37
+ ## Step 2: Install PostgreSQL
38
+
39
+ Install and start the server for your OS.
48
40
 
49
- ### macOS
41
+ macOS:
50
42
 
51
43
  ```bash
52
44
  brew install postgresql@14
53
45
  brew services start postgresql@14
54
46
  ```
55
47
 
56
- ### Ubuntu/Debian
48
+ Ubuntu/Debian:
57
49
 
58
50
  ```bash
59
51
  sudo apt-get update
@@ -61,11 +53,11 @@ sudo apt-get install postgresql-14
61
53
  sudo service postgresql start
62
54
  ```
63
55
 
64
- ### Windows
56
+ Windows: download the installer from
57
+ [postgresql.org/download/windows](https://www.postgresql.org/download/windows/), or install
58
+ inside WSL2 with the Ubuntu/Debian commands above.
65
59
 
66
- Download from [postgresql.org/download/windows](https://www.postgresql.org/download/windows/) or use WSL2.
67
-
68
- ### Create Database
60
+ Then create a database for local development:
69
61
 
70
62
  ```bash
71
63
  # macOS
@@ -73,29 +65,20 @@ psql postgres -c "CREATE DATABASE my_app_db;"
73
65
 
74
66
  # Linux (Ubuntu/Debian)
75
67
  sudo -u postgres psql -c "CREATE DATABASE my_app_db;"
76
-
77
- # Verify
78
- psql my_app_db -c "SELECT 1;" # Should return 1
79
68
  ```
80
69
 
81
- ## VS Code Setup (Recommended)
70
+ ## Step 3: Configure Your Editor (Optional)
82
71
 
83
- ### Extensions
72
+ Install the extensions that match IGNIS' ESLint and Prettier setup:
84
73
 
85
74
  ```bash
86
- # Essential
87
75
  code --install-extension dbaeumer.vscode-eslint
88
76
  code --install-extension esbenp.prettier-vscode
89
-
90
- # Recommended
91
77
  code --install-extension usernamehw.errorlens
92
78
  code --install-extension humao.rest-client
93
- code --install-extension prisma.prisma # Works with Drizzle too
94
79
  ```
95
80
 
96
- ### Settings
97
-
98
- Create `.vscode/settings.json`:
81
+ Create `.vscode/settings.json` in your project:
99
82
 
100
83
  ```json
101
84
  {
@@ -107,51 +90,47 @@ Create `.vscode/settings.json`:
107
90
  }
108
91
  ```
109
92
 
110
- ## Verify Setup
93
+ ## Verify Your Setup
111
94
 
112
95
  ```bash
113
- bun --version # >= 1.3 (or node --version >= 18)
114
- psql --version # >= 14
96
+ bun --version # >= 1.3
97
+ psql my_app_db -c "SELECT 1;" # returns 1
115
98
  ```
116
99
 
100
+ Both commands must succeed before you continue.
101
+
117
102
  ## Troubleshooting
118
103
 
119
- ### Bun not found after install
104
+ ### Bun command not found after install
105
+
106
+ Add Bun to your shell profile, then reload it:
120
107
 
121
108
  ```bash
122
- # Add to ~/.bashrc or ~/.zshrc
123
109
  export BUN_INSTALL="$HOME/.bun"
124
110
  export PATH="$BUN_INSTALL/bin:$PATH"
125
-
126
- # Then reload
127
- source ~/.bashrc # or ~/.zshrc
111
+ source ~/.bashrc # or ~/.zshrc
128
112
  ```
129
113
 
130
- ### PostgreSQL permission denied
114
+ ### PostgreSQL: permission denied for database
115
+
116
+ Run the command as the `postgres` user:
131
117
 
132
118
  ```bash
133
- # Linux: Use sudo -u postgres
134
119
  sudo -u postgres psql -c "CREATE DATABASE my_app_db;"
135
-
136
- # macOS: Check if PostgreSQL is running
137
- brew services list | grep postgresql
138
120
  ```
139
121
 
140
- ### PostgreSQL connection refused
122
+ ### PostgreSQL: connection refused
123
+
124
+ Check that the server is running, then start it:
141
125
 
142
126
  ```bash
143
- # Check if running
144
127
  pg_isready
145
128
 
146
- # Start service
147
- # macOS
148
- brew services start postgresql@14
149
-
150
- # Linux
151
- sudo service postgresql start
129
+ brew services start postgresql@14 # macOS
130
+ sudo service postgresql start # Linux
152
131
  ```
153
132
 
154
- ## Next Steps
133
+ ## See Also
155
134
 
156
- - [5-Minute Quickstart](./5-minute-quickstart.md) - Build your first API
157
- - [Complete Installation](../tutorials/complete-installation.md) - Full project setup
135
+ - [5-Minute Quickstart](./5-minute-quickstart.md) - build your first API
136
+ - [Complete Installation](../tutorials/complete-installation.md) - full project setup
@@ -99,15 +99,16 @@ function useRedis(connection: IRedisHelper) { /* ... */ }
99
99
 
100
100
  ### instanceof checks and concrete bindings
101
101
 
102
- Use the concrete base class (you cannot `instanceof` an interface):
102
+ Use the `isRedisHelper` brand check (you cannot `instanceof` an interface, and `instanceof` against
103
+ the base class answers `false` for a helper built by a second installed copy of the package):
103
104
 
104
105
  ```typescript
105
106
  // Before
106
107
  if (connection instanceof DefaultRedisHelper) { /* ... */ }
107
108
 
108
109
  // After
109
- import { AbstractRedisHelper } from '@venizia/ignis-helpers';
110
- if (connection instanceof AbstractRedisHelper) { /* ... */ }
110
+ import { isRedisHelper } from '@venizia/ignis-helpers';
111
+ if (isRedisHelper(connection)) { /* ... */ }
111
112
  ```
112
113
 
113
114
  ### Options type rename
@@ -47,18 +47,18 @@ Both are described below with exact before/after.
47
47
 
48
48
  When you bump ignis, these stop compiling/working:
49
49
 
50
- 1. **`packages/core/src/security/application-casbin-adapter.ts`**
50
+ 1. **`packages/core-server/src/security/application-casbin-adapter.ts`**
51
51
  - `extends DrizzleCasbinAdapter` → class removed.
52
52
  - `import { DrizzleCasbinAdapter, IDrizzleCasbinAdapterOptions, ICasbinPolicyFilter } from '@venizia/ignis'` → first two removed; `ICasbinPolicyFilter` still exists but its **shape changed**.
53
53
  - `filter.principalValue` / `filter.principalType` → now `filter.principal.id` / `filter.principal.type`.
54
54
  - `CasbinRuleVariants.GROUP` / `CasbinRuleVariants.POLICY` → removed.
55
55
  - `this.entities.role.principalType` / `this.entities.permission.principalType` → `entities` no longer provided by the base.
56
56
 
57
- 2. **`packages/core/src/repositories/public/policy-definition.repository.ts`**
57
+ 2. **`packages/core-server/src/repositories/public/policy-definition.repository.ts`**
58
58
  - Many `eq(pd.variant, CasbinRuleVariants.GROUP)` / `.POLICY` → constant removed. This file is the
59
59
  biggest single breakage surface outside the adapter.
60
60
 
61
- 3. **`packages/core/src/application/verifier.ts`** (enforcer registration)
61
+ 3. **`packages/core-server/src/application/verifier.ts`** (enforcer registration)
62
62
  - The Redis-absent fallback uses `CasbinEnforcerCachedDrivers.IN_MEMORY` → removed. You must pick
63
63
  Redis or `{ use: false }`.
64
64
 
@@ -78,7 +78,7 @@ your `group`/`policy` variant values, and all bespoke logic (global roles, HQ-ow
78
78
  Own these strings locally so you are decoupled from ignis's casbin-prefix enum:
79
79
 
80
80
  ```ts
81
- // packages/core/src/security/policy-variant.ts
81
+ // packages/core-server/src/security/policy-variant.ts
82
82
  export class PolicyDefinitionVariant {
83
83
  /** user→role assignment + user→merchant membership rows. */
84
84
  static readonly GROUP = 'group';
@@ -292,7 +292,7 @@ the bespoke adapter and gain resource/action/domain hierarchies for free.
292
292
 
293
293
  ## 7. Reference - current nx-seller wiring (before)
294
294
 
295
- For context, the current registration (`packages/core/src/application/verifier.ts`) uses:
295
+ For context, the current registration (`packages/core-server/src/application/verifier.ts`) uses:
296
296
  `ApplicationCasbinAdapter` (subclass of removed `DrizzleCasbinAdapter`), `CASBIN_RBAC_MODEL` (flat
297
297
  `g + p`, exact `r.obj == p.obj`), a Redis-or-in-memory `cached`, `domainMatching { roleDefinition: 'g',
298
298
  fn: keyMatch }`, and a `normalizePayloadFn` mapping subject/domain via
@@ -7,7 +7,7 @@ description: What changed in @venizia/ignis 0.0.11-0 / @venizia/ignis-helpers 0.
7
7
 
8
8
  **Target audience:** the BANA (nx-seller) team, and any application upgrading from `@venizia/ignis@0.0.10-x` / `@venizia/ignis-helpers@0.0.9-x`.
9
9
 
10
- **Verification status:** every step below was validated against a full copy of BANA's `packages/core` source compiled against the release tarballs - the migration ends at **zero compile errors**. The search branch was additionally validated end to end against a live 3-node Typesense cluster.
10
+ **Verification status:** every step below was validated against a full copy of BANA's `packages/core-server` source compiled against the release tarballs. The migration ends at **zero compile errors**. The search branch was additionally validated end to end against a live 3-node Typesense cluster.
11
11
 
12
12
  ## What changed (summary)
13
13
 
@@ -15,7 +15,8 @@ IGNIS core was restructured around ONE engine-neutral repository family:
15
15
 
16
16
  - `src/base` now holds a single `AbstractRepository` / `AbstractDataSource` / `AbstractEntity` family. Every engine implements it under `src/connectors/{postgres,typesense}`.
17
17
  - Postgres remains re-exported from the root barrel - **your imports keep working unchanged**. Every connector is also addressable explicitly: `@venizia/ignis/postgres`, `@venizia/ignis/typesense` (typesense is subpath-only; its client is an optional peer).
18
- - Canonical class names are the paradigm-family names (`BaseRelationalDataSource`, `BaseRelationalEntity`, `DefaultRelationalRepository`, ...); the engine name appears only at the concrete datasource (`TypesenseDataSource`) and the query dialect (`PostgresQueryOperators`). The historical names (`BaseDataSource`, `BaseEntity`, `BasePostgresDataSource`, `BasePostgresEntity`, `RDBQueryOperators`, `DefaultCRUDRepository`, ...) all remain as alias re-exports of the SAME classes - `instanceof`, metadata, and bindings are unaffected. No action required; prefer the family names in new code.
18
+ - Canonical class names are the paradigm-family names (`BaseRelationalDataSource`, `BaseRelationalEntity`, `DefaultRelationalRepository`, ...). The engine name appears only at the concrete datasource (`TypesenseDataSource`) and the query dialect (`PostgresQueryOperators`).
19
+ - The historical names (`BaseDataSource`, `BaseEntity`, `BasePostgresDataSource`, `BasePostgresEntity`, `RDBQueryOperators`, `DefaultCRUDRepository`, ...) all keep resolving from the same import paths. Most are alias re-exports of the SAME classes; the five repository names (`PostgresBaseRepository`, `ReadableRepository`, `PersistableRepository`, `DefaultCRUDRepository`, `SoftDeletableRepository`) are Postgres subclasses of the neutral chain, so they are distinct class objects from their neutral parents. `instanceof`, metadata, and bindings are unaffected. No action required.
19
20
  - New capabilities model: `dataSource.getCapabilities()` and a standardized NotSupported error (HTTP 501, `normalized.code` `core.not_supported`) for engine gaps (e.g. transactions on search engines).
20
21
  - New engine: the **Typesense search branch** (`BaseSearchEntity`, `defineSearchCollection`, typed `TSearchDocument`, `DefaultSearchRepository`). It does not affect existing postgres code.
21
22
 
@@ -38,7 +39,7 @@ grep -rl 'ITransaction\|IExtraOptions' packages/*/src --include='*.ts' \
38
39
  | xargs sed -i 's/\bITransaction\b/IDatabaseTransaction/g; s/\bIExtraOptions\b/IDatabaseExtraOptions/g'
39
40
  ```
40
41
 
41
- Note: `options?.transaction?.connector` inside `DefaultCRUDRepository` (alias of `DefaultRelationalRepository`) subclasses needs NO change - the postgres tiers now default their options generic to `IDatabaseExtraOptions`, so that path stays typed automatically.
42
+ Note: `options?.transaction?.connector` inside `DefaultCRUDRepository` (alias of `DefaultRelationalRepository`) subclasses needs NO change. The postgres tiers now default their options generic to `IDatabaseExtraOptions`, so that path stays typed automatically.
42
43
 
43
44
  ### 2. `applicationEnvironment.get` - options object
44
45
 
@@ -68,7 +69,7 @@ New helpers: `toDelimitedArray(input, separator?)` (split + trim + drop empties)
68
69
 
69
70
  ### 3. Purge stale TypeScript build info
70
71
 
71
- The package's `exports` map changed; stale incremental caches replay phantom diagnostics for unchanged files (a page of bogus "missing property" errors while new files compile clean):
72
+ The package's `exports` map changed. Stale incremental caches replay phantom diagnostics for unchanged files - a page of bogus "missing property" errors while new files compile clean:
72
73
 
73
74
  ```bash
74
75
  find . -name '*.tsbuildinfo' -not -path '*/node_modules/*' -delete
@@ -78,7 +79,7 @@ Run this once after the version bump, before trusting the first `tsc` run.
78
79
 
79
80
  ### 4. Auth endpoint error contract (only if you assert on it)
80
81
 
81
- The three auth endpoints backed by unimplemented service methods (`refreshToken`, `getUserInformation`) now return the standardized NotSupported error: HTTP 501 with `normalized.code` `core.not_supported` and message `[AuthController] <feature> is not supported.` (previously a plain `Method not implemented`). BANA was scanned: no code asserts on the old string - listed for completeness.
82
+ The three auth endpoints backed by unimplemented service methods (`refreshToken`, `getUserInformation`) now return the standardized NotSupported error: HTTP 501 with `normalized.code` `core.not_supported` and message `[AuthController] <feature> is not supported.`. Previously this was a plain `Method not implemented`. BANA was scanned: no code asserts on the old string - listed for completeness.
82
83
 
83
84
  ## Strongly recommended (not compile-blocking)
84
85
 
@@ -109,5 +110,5 @@ All IGNIS examples now declare these explicitly.
109
110
 
110
111
  - No import-path changes: root-barrel imports of `BaseDataSource`, `BaseEntity`, `DefaultCRUDRepository`, decorators, etc. all keep working (dual-door export model + compatibility aliases).
111
112
  - No repository/generic signature changes: `DefaultCRUDRepository<Schema, DataObject, PersistObject, ...>` call sites are unchanged (a 4th options generic was APPENDED with a default).
112
- - No runtime behavior changes on the postgres path: the whole pre-existing RDB behavior suite runs unchanged inside the release gates, and every behavior delta was verified to have no trigger inside BANA (`@model` tableName divergence: 0 occurrences; message-string assertions: 0).
113
+ - No runtime behavior changes on the postgres path: the whole pre-existing RDB behavior suite runs unchanged inside the release gates. Every behavior delta was verified to have no trigger inside BANA (`@model` tableName divergence: 0 occurrences; message-string assertions: 0).
113
114
  - Nothing search-related: BANA imports zero search symbols today.
@@ -973,7 +973,7 @@ export class ChatService extends BaseService {
973
973
  ```
974
974
 
975
975
  > [!IMPORTANT]
976
- > **Lazy getter pattern**: `SocketIOServerHelper` is bound via a post-start hook, so it's not available during DI construction. The `private get socketIOHelper()` getter resolves it lazily on first access. See [Socket.IO Component](/extensions/components/socket-io/#step-3-use-in-servicescontrollers) for details.
976
+ > **Lazy getter pattern**: `SocketIOServerHelper` is bound via a post-start hook, so it's not available during DI construction. The `private get socketIOHelper()` getter resolves it lazily on first access. See [Send a message from a service](/extensions/components/socket-io/#send-a-message-from-a-service) for details.
977
977
 
978
978
  ## 6. Application Setup
979
979
 
@@ -1,35 +1,40 @@
1
1
  ---
2
2
  title: Application Reference
3
- description: Technical reference for AbstractApplication and BaseApplication classes
3
+ description: Technical reference for the four application layers - AbstractApplication, RestApplication, ServerApplication and BaseApplication
4
4
  difficulty: beginner
5
5
  ---
6
6
 
7
7
  # Deep Dive: Application
8
8
 
9
- Technical reference for `AbstractApplication` and `BaseApplication` - the foundation classes for every IGNIS application.
9
+ Extend `BaseApplication`. The three classes above it exist so a host that cannot open a socket - a browser Worker, a test harness - can still serve the same controllers.
10
10
 
11
11
  **Files:**
12
- - `packages/core/src/base/applications/abstract.ts`
13
- - `packages/core/src/base/applications/base.ts`
14
- - `packages/core/src/base/applications/types.ts`
12
+ - `packages/kernel/src/base/applications/abstract.ts`
13
+ - `packages/kernel/src/base/applications/rest.ts`
14
+ - `packages/core-server/src/base/applications/server.ts`
15
+ - `packages/core-server/src/base/applications/base.ts`
16
+ - `packages/kernel/src/base/applications/types.ts`
15
17
 
16
18
  ## Quick Reference
17
19
 
18
- | Class | Purpose | Key Methods |
19
- |-------|---------|-------------|
20
- | **AbstractApplication** | Base class with lifecycle management, server start/stop | `start()`, `stop()`, `init()`, `validateEnvs()` |
21
- | **BaseApplication** | Concrete implementation with resource registration and boot support | `component()`, `controller()`, `service()`, `repository()`, `dataSource()`, `boot()` |
20
+ Each layer adds one capability. The first two ship from `@venizia/ignis-kernel` and touch no node builtin; the last two ship from `@venizia/ignis`.
21
+
22
+ | Class | Adds | Key Methods |
23
+ |-------|------|-------------|
24
+ | **AbstractApplication** | config, lifecycle hooks, the DI container | `init()`, `registerPostStartHook()`, `registerPostStopHook()` |
25
+ | **RestApplication** | the two `OpenAPIHono` routers | `getServer()`, `getRootRouter()`, `inspectRoutes()` |
26
+ | **ServerApplication** | the socket | `start()`, `stop()`, `getServerHost()`, `getServerPort()`, `getServerAddress()` |
27
+ | **BaseApplication** | resource registration, secrets, boot | `component()`, `controller()`, `service()`, `repository()`, `dataSource()`, `boot()`, `validateEnvs()` |
28
+
29
+ > [!NOTE]
30
+ > Every symbol still resolves from `@venizia/ignis` - `packages/core-server` re-exports the kernel wholesale. The split changed no import path.
22
31
 
23
32
  ## `AbstractApplication`
24
33
 
25
- Base class responsible for core lifecycle and server management. Extends `Container` (IoC container) and implements `IApplication`.
34
+ Config, lifecycle and the container. No router, no server. Extends `Container`.
26
35
 
27
36
  ```typescript
28
- abstract class AbstractApplication<
29
- AppEnv extends Env = Env,
30
- AppSchema extends Schema = {},
31
- BasePath extends string = '/',
32
- > extends Container implements IApplication<AppEnv, AppSchema, BasePath>
37
+ abstract class AbstractApplication extends Container
33
38
  ```
34
39
 
35
40
  ### Constructor
@@ -39,10 +44,47 @@ constructor(opts: { scope: string; config: IApplicationConfigs })
39
44
  ```
40
45
 
41
46
  The constructor:
42
- 1. Merges the provided config with defaults (host from `HOST` or `APP_ENV_SERVER_HOST` env, port from `PORT` or `APP_ENV_SERVER_PORT` env, defaults to `localhost:3000`)
43
- 2. Enables `asyncContext` by default (`{ enable: true }`)
44
- 3. Sets `strictPath` to `true` by default for the Hono instance
45
- 4. Creates two `OpenAPIHono` instances: the main server and a `rootRouter`
47
+ 1. Merges the provided config with defaults, taking host and port from `getEnvServerHost()` / `getEnvServerPort()` and falling back to `localhost:3000`
48
+ 2. Resolves `asyncContext.enable` from `getDefaultAsyncContextEnabled()`
49
+ 3. Sets `projectRoot` from `getProjectRoot()`
50
+
51
+ Port `0` survives that merge on purpose - it asks the operating system for an ephemeral port.
52
+
53
+ The constructor binds nothing. `registerCoreBindings()` runs from `init()`, and `init()` is not called for you - see [Lifecycle](#lifecycle) below.
54
+
55
+ ### The four constructor hooks
56
+
57
+ `getEnvServerHost()`, `getEnvServerPort()`, `getDefaultAsyncContextEnabled()` and `getProjectRoot()` return `undefined`, `undefined`, `false` and `''` here. `ServerApplication` overrides all four to restore server behaviour - `process.env.HOST`, `process.env.PORT`, `true`, and `process.cwd()`. The kernel layers read no `process`, because a browser Worker has none.
58
+
59
+ > [!WARNING]
60
+ > All four run inside this constructor, before any subclass field is assigned. An override must return a literal or read module-level state only. Reading `this.something` from one yields `undefined`, silently. `getProjectRoot()` is the one applications most often override - keep it free of instance state.
61
+
62
+ ## `RestApplication`
63
+
64
+ Adds the routers, and nothing that opens a socket.
65
+
66
+ ```typescript
67
+ abstract class RestApplication<
68
+ AppEnv extends Env = Env,
69
+ AppSchema extends Schema = {},
70
+ BasePath extends string = '/',
71
+ > extends AbstractApplication
72
+ ```
73
+
74
+ It builds the two `OpenAPIHono` instances - the main server and the `rootRouter` - and binds them as `APPLICATION_SERVER` and `APPLICATION_ROOT_ROUTER`.
75
+
76
+ ## `ServerApplication`
77
+
78
+ Adds `start()`, `stop()` and the runtime detection that picks `Bun.serve` or `@hono/node-server`.
79
+
80
+ ```typescript
81
+ abstract class ServerApplication<
82
+ AppEnv extends Env = Env,
83
+ AppSchema extends Schema = {},
84
+ BasePath extends string = '/',
85
+ > extends RestApplication<AppEnv, AppSchema, BasePath>
86
+ implements IApplication<AppEnv, AppSchema, BasePath>
87
+ ```
46
88
  5. Auto-detects the runtime (Bun or Node.js)
47
89
 
48
90
  ### Key Features
@@ -120,11 +162,11 @@ protected server:
120
162
 
121
163
  ## `BaseApplication`
122
164
 
123
- Extends `AbstractApplication` with concrete lifecycle implementations, resource registration, and boot support. Implements `IRestApplication` and `IBootableApplication`.
165
+ Extends `ServerApplication` with concrete lifecycle implementations, resource registration, secrets hydration and boot support. Implements `IRestApplication` and `IBootableApplication`. This is the class your application extends.
124
166
 
125
167
  ```typescript
126
168
  abstract class BaseApplication
127
- extends AbstractApplication
169
+ extends ServerApplication
128
170
  implements IRestApplication, IBootableApplication
129
171
  ```
130
172
 
@@ -8,7 +8,7 @@ difficulty: advanced
8
8
 
9
9
  Technical reference for `BaseComponent`-the foundation for creating reusable, pluggable features in IGNIS. Components are powerful containers that can group together multiple providers, services, controllers, repositories, and even entire mini-applications into a single, redistributable module.
10
10
 
11
- **File:** `packages/core/src/base/components/base.ts`
11
+ **File:** `packages/core-server/src/base/components/base.ts`
12
12
 
13
13
  ## Quick Reference
14
14
 
@@ -379,7 +379,7 @@ If gRPC controllers are discovered but the `'grpc'` transport is not in the `tra
379
379
 
380
380
  ### `RestComponent`
381
381
 
382
- **File:** `packages/core/src/components/controller/rest/rest.component.ts`
382
+ **File:** `packages/core-server/src/components/controller/rest/rest.component.ts`
383
383
 
384
384
  Discovers all controller bindings tagged with `BindingNamespaces.CONTROLLER`, skips any whose metadata has `transport === ControllerTransports.GRPC`, and configures the rest as REST controllers.
385
385
 
@@ -422,7 +422,7 @@ export class RestBindingKeys {
422
422
 
423
423
  ### `GrpcComponent`
424
424
 
425
- **File:** `packages/core/src/components/controller/grpc/grpc.component.ts`
425
+ **File:** `packages/core-server/src/components/controller/grpc/grpc.component.ts`
426
426
 
427
427
  Discovers all controller bindings tagged with `BindingNamespaces.CONTROLLER`, skips any whose metadata does **not** have `transport === ControllerTransports.GRPC`, and configures gRPC controllers.
428
428
 
@@ -6,13 +6,13 @@ difficulty: intermediate
6
6
 
7
7
  # Connectors
8
8
 
9
- A connector is how IGNIS adds a storage engine - PostgreSQL, Typesense, Meilisearch - behind one engine-neutral contract, so `DataSource`, `Entity`, and `Repository` mean the same thing no matter which engine backs them.
9
+ A connector is how IGNIS adds a storage engine - PostgreSQL, Typesense, Meilisearch - behind one engine-neutral contract. `DataSource`, `Entity`, and `Repository` mean the same thing no matter which engine backs them.
10
10
 
11
- "A connector" (this page) means an engine-integration module; "the connector" means the Drizzle instance exposed as `this.connector` on a datasource or repository - the two senses are unrelated despite the shared word.
11
+ "A connector" (this page) means an engine-integration module. "The connector" means the Drizzle instance exposed as `this.connector` on a datasource or repository. The two senses are unrelated despite the shared word.
12
12
 
13
13
  ## In one example
14
14
 
15
- The neutral `AbstractDataSource` has no SQL, no pool, no Drizzle - the postgres connector's `BasePostgresDataSource` adds all of that, and `@datasource({ driver })` names the concrete client class:
15
+ The neutral `AbstractDataSource` has no SQL, no pool, no Drizzle. The postgres connector's `BasePostgresDataSource` adds all of that, and `@datasource({ driver })` names the concrete client class:
16
16
 
17
17
  ```typescript
18
18
  import { Pool } from 'pg';
@@ -45,7 +45,7 @@ A Typesense datasource follows the same shape but extends the search connector's
45
45
 
46
46
  ## How it works
47
47
 
48
- - **Three engine-neutral roots.** `packages/core/src/base` declares three roots every connector implements:
48
+ - **Three engine-neutral roots.** `packages/core-server/src/base` declares three roots every connector implements:
49
49
 
50
50
  | Root | Purpose | Neutral default |
51
51
  |---|---|---|
@@ -53,16 +53,16 @@ A Typesense datasource follows the same shape but extends the search connector's
53
53
  | `AbstractEntity` | Model/schema contract | `name`, `getSchema()`, `getIdType()` |
54
54
  | `AbstractRepository` | Data access contract | Generics named for role (data/persist/options), not any one engine's vocabulary |
55
55
 
56
- - **Connectors narrow the roots into a real engine.** `packages/core/src/connectors/<engine>` adds engine-specific members:
56
+ - **Connectors narrow the roots into a real engine.** `packages/core-server/src/connectors/<engine>` adds engine-specific members:
57
57
 
58
58
  | Connector | Adds | `getCapabilities()` |
59
59
  |---|---|---|
60
60
  | **postgres** (`connectors/postgres`) | `pool`, Drizzle `connector`, SQL-shaped `TWhere`/`TFilter`, real transactions with isolation levels | `{ transactions: true }` |
61
61
  | **search** (`connectors/search`) | Engine-neutral search base - no SQL, no transactions. Both typesense and meilisearch extend it (not `AbstractDataSource` directly), sharing one query-dialect and capability shape | inherited neutral default |
62
62
 
63
- - **`@datasource({ driver })` picks the concrete client, within an engine.** Postgres takes a driver **class** (`NodePostgresDriver` or `PostgresJsDriver`), never a driver-name string - a bundler packages values, not text, so a string would leave the peer dependency uninstalled.
63
+ - **`@datasource({ driver })` picks the concrete client, within an engine.** Postgres takes a driver **class** (`NodePostgresDriver` or `PostgresJsDriver`), never a driver-name string. A bundler packages values, not text, so a string would leave the peer dependency uninstalled.
64
64
  - **All engine clients stay optional peer dependencies.** Importing `@venizia/ignis/postgres` alone loads zero client libraries.
65
- - **Search connectors are subpath-only.** `@venizia/ignis/typesense` and `@venizia/ignis/meilisearch` are excluded from the root `@venizia/ignis` barrel, so an app that never touches search never pulls a search client into its bundle.
65
+ - **Search connectors are subpath-only.** `@venizia/ignis/typesense` and `@venizia/ignis/meilisearch` are excluded from the root `@venizia/ignis` barrel. An app that never touches search never pulls a search client into its bundle.
66
66
 
67
67
  **Canonical names and aliases**
68
68
 
@@ -98,9 +98,9 @@ import { MeilisearchDataSource } from '@venizia/ignis/meilisearch';
98
98
 
99
99
  ### Add a new engine connector
100
100
 
101
- - **Mirror the shape.** Under `src/connectors/<engine>/`: a `datasources/` extending `AbstractDataSource`, a `models/` extending `AbstractEntity` (if the engine needs entity definitions), and a `repositories/core/` extending `AbstractRepository` with a `Readable`/`Persistable`/`DefaultCRUD`-style tier ladder.
101
+ - **Mirror the shape.** Under `src/connectors/<engine>/`, add a `datasources/` extending `AbstractDataSource` and a `repositories/core/` extending `AbstractRepository` with a `Readable`/`Persistable`/`DefaultCRUD`-style tier ladder. Add a `models/` extending `AbstractEntity` too, if the engine needs entity definitions.
102
102
  - **Override transactions only if supported.** Override `getCapabilities()` and `beginTransaction()` only if the engine truly supports transactions - otherwise inherit the neutral `NotSupported` default.
103
- - **Export as a subpath.** Add the connector to `package.json` `exports` as `./<engine>`; if its driver is an optional peer dependency, keep it out of `connectors/index.ts` and register it as a subpath-only export instead, mirroring typesense and meilisearch.
103
+ - **Export as a subpath.** Add the connector to `package.json` `exports` as `./<engine>`. If its driver is an optional peer dependency, keep it out of `connectors/index.ts` and register it as a subpath-only export instead, mirroring typesense and meilisearch.
104
104
 
105
105
  ## See also
106
106
 
@@ -114,8 +114,8 @@ import { MeilisearchDataSource } from '@venizia/ignis/meilisearch';
114
114
 
115
115
  **Files:**
116
116
 
117
- - [`packages/core/src/base/datasources/abstract.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/core/src/base/datasources/abstract.ts) - neutral `AbstractDataSource`
118
- - [`packages/core/src/base/models/base.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/core/src/base/models/base.ts) - neutral `AbstractEntity`
119
- - [`packages/core/src/base/repositories/core/abstract.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/core/src/base/repositories/core/abstract.ts) - neutral `AbstractRepository`
120
- - [`packages/core/src/connectors/postgres/datasources/base.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/core/src/connectors/postgres/datasources/base.ts) - `BaseRelationalDataSource` (alias `BasePostgresDataSource`)
121
- - [`packages/core/src/connectors/search/datasources/base.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/core/src/connectors/search/datasources/base.ts) - `BaseSearchDataSource`, shared by typesense and meilisearch
117
+ - [`packages/core-server/src/base/datasources/abstract.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/core-server/src/base/datasources/abstract.ts) - neutral `AbstractDataSource`
118
+ - [`packages/core-server/src/base/models/base.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/core-server/src/base/models/base.ts) - neutral `AbstractEntity`
119
+ - [`packages/core-server/src/base/repositories/core/abstract.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/core-server/src/base/repositories/core/abstract.ts) - neutral `AbstractRepository`
120
+ - [`packages/core-server/src/connectors/postgres/datasources/base.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/core-server/src/connectors/postgres/datasources/base.ts) - `BaseRelationalDataSource` (alias `BasePostgresDataSource`)
121
+ - [`packages/core-server/src/connectors/search/datasources/base.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/core-server/src/connectors/search/datasources/base.ts) - `BaseSearchDataSource`, shared by typesense and meilisearch
@@ -12,14 +12,14 @@ Technical reference for REST controller classes - the foundation for creating HT
12
12
  > This page covers **REST controllers** (HTTP/JSON). For gRPC controllers using ConnectRPC, see the [gRPC Controllers Reference](./grpc-controllers.md).
13
13
 
14
14
  **Files:**
15
- - `packages/core/src/base/controllers/rest/abstract.ts` - Abstract base class
16
- - `packages/core/src/base/controllers/rest/base.ts` - Concrete base class
17
- - `packages/core/src/base/controllers/common/types.ts` - Shared types and interfaces
18
- - `packages/core/src/base/controllers/common/constants.ts` - Transport constants and headers
19
- - `packages/core/src/base/metadata/routes/rest.ts` - Route decorators (`@api`, `@get`, `@post`, etc.)
20
- - `packages/core/src/base/metadata/routes/controller.ts` - `@controller` decorator
21
- - `packages/core/src/base/controllers/factory/controller.ts` - CRUD controller factory
22
- - `packages/core/src/components/controller/rest/rest.component.ts` - RestComponent
15
+ - `packages/core-server/src/base/controllers/rest/abstract.ts` - Abstract base class
16
+ - `packages/core-server/src/base/controllers/rest/base.ts` - Concrete base class
17
+ - `packages/core-server/src/base/controllers/common/types.ts` - Shared types and interfaces
18
+ - `packages/core-server/src/base/controllers/common/constants.ts` - Transport constants and headers
19
+ - `packages/core-server/src/base/metadata/routes/rest.ts` - Route decorators (`@api`, `@get`, `@post`, etc.)
20
+ - `packages/core-server/src/base/metadata/routes/controller.ts` - `@controller` decorator
21
+ - `packages/core-server/src/base/controllers/factory/controller.ts` - CRUD controller factory
22
+ - `packages/core-server/src/components/controller/rest/rest.component.ts` - RestComponent
23
23
 
24
24
  ## Quick Reference
25
25
 
@@ -89,7 +89,7 @@ During `registerControllers()`, the application creates a `RestComponent` for RE
89
89
 
90
90
  ## `RestComponent`
91
91
 
92
- **File:** `packages/core/src/components/controller/rest/rest.component.ts`
92
+ **File:** `packages/core-server/src/components/controller/rest/rest.component.ts`
93
93
 
94
94
  The `RestComponent` is responsible for discovering, configuring, and mounting all REST controllers onto the application's root Hono router. It is automatically instantiated by `BaseApplication.registerControllers()` when the REST transport is enabled.
95
95
 
@@ -400,7 +400,7 @@ interface ICustomizableRoutes<
400
400
 
401
401
  ## Route Decorators
402
402
 
403
- **File:** `packages/core/src/base/metadata/routes/rest.ts`
403
+ **File:** `packages/core-server/src/base/metadata/routes/rest.ts`
404
404
 
405
405
  ### `@controller` Decorator
406
406
 
@@ -618,7 +618,7 @@ request: {
618
618
 
619
619
  ## Standard Headers and Constants
620
620
 
621
- **File:** `packages/core/src/base/controllers/common/constants.ts`
621
+ **File:** `packages/core-server/src/base/controllers/common/constants.ts`
622
622
 
623
623
  ### `RestPaths`
624
624
 
@@ -644,7 +644,7 @@ class RestPaths {
644
644
 
645
645
  The `ControllerFactory` provides a static method `defineCrudController` to quickly generate a pre-configured CRUD controller for any given `AbstractEntity` subclass (e.g. `BaseEntity` for Postgres) and its corresponding repository.
646
646
 
647
- **File:** `packages/core/src/base/controllers/factory/controller.ts`
647
+ **File:** `packages/core-server/src/base/controllers/factory/controller.ts`
648
648
 
649
649
  ### `static defineCrudController<TDataObject, TPersistObject = TDataObject, Routes extends ICustomizableRoutes = ICustomizableRoutes>(opts: ICrudControllerOptions<Routes>)`
650
650