@venizia/ignis-docs 0.2.0 → 0.2.1-1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/README.md +14 -14
  2. package/content/best-practices/api-usage-examples.md +39 -19
  3. package/content/best-practices/architectural-patterns.md +24 -13
  4. package/content/best-practices/architecture-decisions.md +29 -16
  5. package/content/best-practices/code-style-standards/advanced-patterns.md +43 -31
  6. package/content/best-practices/code-style-standards/constants-configuration.md +19 -4
  7. package/content/best-practices/code-style-standards/control-flow.md +33 -1
  8. package/content/best-practices/code-style-standards/documentation.md +28 -8
  9. package/content/best-practices/code-style-standards/function-patterns.md +15 -4
  10. package/content/best-practices/code-style-standards/index.md +7 -2
  11. package/content/best-practices/code-style-standards/naming-conventions.md +27 -3
  12. package/content/best-practices/code-style-standards/route-definitions.md +9 -5
  13. package/content/best-practices/code-style-standards/tooling.md +14 -1
  14. package/content/best-practices/code-style-standards/type-safety.md +39 -6
  15. package/content/best-practices/common-pitfalls.md +59 -35
  16. package/content/best-practices/contribution-workflow.md +8 -4
  17. package/content/best-practices/data-modeling.md +78 -62
  18. package/content/best-practices/deployment-strategies.md +56 -19
  19. package/content/best-practices/error-handling.md +247 -153
  20. package/content/best-practices/index.md +6 -0
  21. package/content/best-practices/performance-optimization.md +26 -13
  22. package/content/best-practices/security-guidelines.md +35 -9
  23. package/content/best-practices/testing-strategies.md +7 -2
  24. package/content/best-practices/troubleshooting-tips.md +27 -17
  25. package/content/extensions/components/api-reference.md +109 -323
  26. package/content/extensions/components/authentication/api.md +489 -602
  27. package/content/extensions/components/authentication/errors.md +135 -498
  28. package/content/extensions/components/authentication/index.md +89 -801
  29. package/content/extensions/components/authentication/usage.md +231 -955
  30. package/content/extensions/components/authorization/api.md +991 -644
  31. package/content/extensions/components/authorization/errors.md +204 -208
  32. package/content/extensions/components/authorization/getting-started.md +227 -0
  33. package/content/extensions/components/authorization/index.md +88 -795
  34. package/content/extensions/components/authorization/usage.md +219 -528
  35. package/content/extensions/components/health-check.md +77 -243
  36. package/content/extensions/components/index.md +24 -90
  37. package/content/extensions/components/mail/api.md +553 -285
  38. package/content/extensions/components/mail/errors.md +76 -62
  39. package/content/extensions/components/mail/index.md +111 -463
  40. package/content/extensions/components/mail/usage.md +139 -173
  41. package/content/extensions/components/request-tracker.md +70 -173
  42. package/content/extensions/components/socket-io/api.md +462 -785
  43. package/content/extensions/components/socket-io/errors.md +49 -51
  44. package/content/extensions/components/socket-io/index.md +69 -372
  45. package/content/extensions/components/socket-io/usage.md +212 -105
  46. package/content/extensions/components/static-asset/api.md +461 -141
  47. package/content/extensions/components/static-asset/errors.md +121 -53
  48. package/content/extensions/components/static-asset/index.md +84 -606
  49. package/content/extensions/components/static-asset/usage.md +184 -299
  50. package/content/extensions/components/template/index.md +3 -3
  51. package/content/extensions/components/websocket/api.md +311 -404
  52. package/content/extensions/components/websocket/errors.md +47 -56
  53. package/content/extensions/components/websocket/index.md +75 -407
  54. package/content/extensions/components/websocket/usage.md +120 -338
  55. package/content/extensions/helpers/cron/index.md +52 -160
  56. package/content/extensions/helpers/crypto/index.md +67 -480
  57. package/content/extensions/helpers/crypto/reference.md +528 -0
  58. package/content/extensions/helpers/env/index.md +64 -178
  59. package/content/extensions/helpers/error/index.md +286 -196
  60. package/content/extensions/helpers/index.md +61 -47
  61. package/content/extensions/helpers/inversion/index.md +76 -550
  62. package/content/extensions/helpers/inversion/reference.md +530 -0
  63. package/content/extensions/helpers/kafka/admin.md +23 -3
  64. package/content/extensions/helpers/kafka/compile-binary.md +83 -52
  65. package/content/extensions/helpers/kafka/consumer.md +65 -28
  66. package/content/extensions/helpers/kafka/examples.md +46 -253
  67. package/content/extensions/helpers/kafka/index.md +55 -617
  68. package/content/extensions/helpers/kafka/producer.md +156 -22
  69. package/content/extensions/helpers/kafka/schema-registry.md +59 -79
  70. package/content/extensions/helpers/logger/hf-logger.md +220 -0
  71. package/content/extensions/helpers/logger/index.md +78 -552
  72. package/content/extensions/helpers/logger/pino.md +105 -0
  73. package/content/extensions/helpers/logger/reference.md +937 -0
  74. package/content/extensions/helpers/network/api.md +276 -195
  75. package/content/extensions/helpers/network/index.md +87 -524
  76. package/content/extensions/helpers/queue/index.md +80 -897
  77. package/content/extensions/helpers/queue/reference.md +494 -0
  78. package/content/extensions/helpers/redis/index.md +86 -640
  79. package/content/extensions/helpers/redis/reference.md +784 -0
  80. package/content/extensions/helpers/secrets/index.md +136 -0
  81. package/content/extensions/helpers/socket-io/api.md +325 -204
  82. package/content/extensions/helpers/socket-io/index.md +79 -429
  83. package/content/extensions/helpers/storage/api.md +584 -464
  84. package/content/extensions/helpers/storage/index.md +80 -573
  85. package/content/extensions/helpers/types/index.md +75 -495
  86. package/content/extensions/helpers/types/reference.md +689 -0
  87. package/content/extensions/helpers/uid/index.md +176 -189
  88. package/content/extensions/helpers/websocket/api.md +366 -214
  89. package/content/extensions/helpers/websocket/index.md +68 -503
  90. package/content/extensions/helpers/worker-thread/index.md +62 -396
  91. package/content/extensions/helpers/worker-thread/reference.md +428 -0
  92. package/content/extensions/index.md +38 -39
  93. package/content/extensions/src-details/mcp-server.md +96 -548
  94. package/content/guides/core-concepts/persistent/datasources.md +2 -2
  95. package/content/guides/core-concepts/persistent/index.md +5 -1
  96. package/content/guides/core-concepts/persistent/models.md +1 -1
  97. package/content/guides/core-concepts/persistent/pglite.md +218 -0
  98. package/content/guides/core-concepts/persistent/postgres-drivers.md +21 -15
  99. package/content/guides/core-concepts/persistent/search-meilisearch.md +22 -12
  100. package/content/guides/core-concepts/persistent/search-typesense.md +28 -16
  101. package/content/guides/core-concepts/persistent/sqlite.md +296 -0
  102. package/content/guides/core-concepts/persistent/transactions.md +12 -11
  103. package/content/guides/core-concepts/secrets-vault.md +177 -0
  104. package/content/guides/core-concepts/services.md +1 -1
  105. package/content/guides/get-started/5-minute-quickstart.md +59 -206
  106. package/content/guides/get-started/philosophy.md +135 -670
  107. package/content/guides/get-started/setup.md +53 -74
  108. package/content/guides/migrations/redis-helpers-migration.md +5 -4
  109. package/content/guides/migrations/scoped-rbac-migration.md +5 -5
  110. package/content/guides/migrations/unified-connectors-migration.md +8 -7
  111. package/content/guides/tutorials/ecommerce-api.md +3 -8
  112. package/content/guides/tutorials/realtime-chat.md +1 -1
  113. package/content/references/base/application.md +64 -22
  114. package/content/references/base/components.md +3 -3
  115. package/content/references/base/connectors.md +79 -136
  116. package/content/references/base/controllers.md +12 -12
  117. package/content/references/base/datasources-reference.md +600 -0
  118. package/content/references/base/datasources.md +84 -444
  119. package/content/references/base/dependency-injection.md +25 -46
  120. package/content/references/base/filter-system/application-usage.md +95 -123
  121. package/content/references/base/filter-system/array-operators.md +33 -43
  122. package/content/references/base/filter-system/comparison-operators.md +55 -63
  123. package/content/references/base/filter-system/default-filter.md +144 -350
  124. package/content/references/base/filter-system/fields-order-pagination.md +116 -148
  125. package/content/references/base/filter-system/index.md +114 -253
  126. package/content/references/base/filter-system/json-filtering.md +52 -181
  127. package/content/references/base/filter-system/list-operators.md +28 -44
  128. package/content/references/base/filter-system/logical-operators.md +69 -114
  129. package/content/references/base/filter-system/null-operators.md +41 -98
  130. package/content/references/base/filter-system/pattern-matching.md +48 -51
  131. package/content/references/base/filter-system/quick-reference.md +93 -196
  132. package/content/references/base/filter-system/range-operators.md +22 -38
  133. package/content/references/base/filter-system/tips.md +70 -133
  134. package/content/references/base/filter-system/use-cases.md +173 -232
  135. package/content/references/base/grpc-controllers.md +53 -17
  136. package/content/references/base/index.md +5 -3
  137. package/content/references/base/middlewares.md +43 -28
  138. package/content/references/base/models-reference.md +886 -0
  139. package/content/references/base/models.md +81 -1452
  140. package/content/references/base/providers.md +8 -8
  141. package/content/references/base/repositories/advanced.md +281 -419
  142. package/content/references/base/repositories/index.md +84 -644
  143. package/content/references/base/repositories/mixins.md +25 -21
  144. package/content/references/base/repositories/relations.md +194 -375
  145. package/content/references/base/repositories/soft-deletable.md +67 -55
  146. package/content/references/base/secrets.md +267 -0
  147. package/content/references/base/services.md +8 -6
  148. package/content/references/configuration/environment-variables.md +73 -21
  149. package/content/references/configuration/index.md +51 -31
  150. package/content/references/index.md +1 -1
  151. package/content/references/quick-reference.md +3 -16
  152. package/content/references/utilities/crypto.md +35 -76
  153. package/content/references/utilities/date.md +33 -73
  154. package/content/references/utilities/duration.md +85 -0
  155. package/content/references/utilities/index.md +6 -2
  156. package/content/references/utilities/jsx-reference.md +298 -0
  157. package/content/references/utilities/jsx.md +82 -525
  158. package/content/references/utilities/module.md +81 -61
  159. package/content/references/utilities/parse.md +34 -64
  160. package/content/references/utilities/performance.md +33 -58
  161. package/content/references/utilities/promise.md +28 -62
  162. package/content/references/utilities/request.md +58 -218
  163. package/content/references/utilities/retry.md +139 -0
  164. package/content/references/utilities/schema.md +43 -137
  165. package/content/references/utilities/statuses-reference.md +361 -0
  166. package/content/references/utilities/statuses.md +63 -667
  167. package/dist/mcp-server/index.js +0 -0
  168. package/dist/mcp-server/tools/github/list-project-files.tool.d.ts +1 -1
  169. package/dist/mcp-server/tools/github/list-project-files.tool.d.ts.map +1 -1
  170. package/dist/mcp-server/tools/github/list-project-files.tool.js +3 -3
  171. package/dist/mcp-server/tools/github/search-code.tool.js +1 -1
  172. package/dist/mcp-server/tools/github/verify-dependencies.tool.js +1 -1
  173. package/dist/mcp-server/tools/github/view-source-file.tool.js +1 -1
  174. package/package.json +24 -23
@@ -1,178 +1,121 @@
1
1
  ---
2
- title: Connectors Reference
3
- description: How IGNIS separates engine-neutral base classes from per-engine connectors, dual-door exports, and adding a new engine
4
- difficulty: advanced
2
+ title: Connectors
3
+ description: How IGNIS supports multiple database and search engines behind one engine-neutral contract
4
+ difficulty: intermediate
5
5
  ---
6
6
 
7
- # Deep Dive: Connectors
7
+ # Connectors
8
8
 
9
- IGNIS's persistence layer is split into two layers: an **engine-neutral root** and a set of **connectors**, one per storage engine. This page documents that architecture, the dual-door export strategy, naming symmetry between engines, and how to add a new connector.
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
- **Files:** `packages/core/src/base/**` (neutral) and `packages/core/src/connectors/{postgres,typesense,meilisearch,search}/**` (per-engine)
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
- ## Why the split
13
+ ## In one example
14
14
 
15
- Before the restructure, `AbstractDataSource`/`AbstractRepository`/`AbstractEntity` were PostgreSQL-and-Drizzle-aware from the start - `pool`, `connector` (Drizzle instance), and SQL-shaped `TWhere`/`TFilter` lived directly in `src/base`. Adding typesense (a document search engine, not a relational database) exposed the coupling: it has no connection pool, doesn't speak SQL, and doesn't support transactions or row-level locking.
16
-
17
- The fix moves everything engine-specific out of `src/base` and into `src/connectors/<engine>/`, leaving `src/base` with only what every engine can implement:
18
-
19
- | Concept | Neutral (`src/base`) | PostgreSQL (`connectors/postgres`) | Typesense (`connectors/typesense`) |
20
- |---|---|---|---|
21
- | DataSource | `AbstractDataSource` | `AbstractPostgresDataSource` → `BasePostgresDataSource` | `AbstractSearchDataSource` → `BaseSearchDataSource` → `TypesenseDataSource` |
22
- | Entity | `AbstractEntity` | `BasePostgresEntity` (alias `BaseEntity`) | `BaseSearchEntity` |
23
- | Repository | `AbstractRepository` | `PostgresBaseRepository` → `ReadableRepository`/`PersistableRepository`/`DefaultCRUDRepository`/`SoftDeletableRepository` | `TypesenseBaseRepository` → `ReadableSearchRepository`/`PersistableSearchRepository`/`DefaultSearchRepository` |
24
- | Transactions | throws `NotSupported` by default | real transactions, 3 isolation levels | throws `NotSupported` |
25
- | Filtering | neutral `TWhere`/`TFilter` | SQL WHERE via Drizzle | typesense query DSL via `TypesenseQueryDialect` |
26
-
27
- ## The neutral contract
28
-
29
- ### `AbstractDataSource`
30
-
31
- `packages/core/src/base/datasources/abstract.ts` declares:
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:
32
16
 
33
17
  ```typescript
34
- abstract class AbstractDataSource<
35
- Settings extends object = {},
36
- Schema extends TAnyDataSourceSchema = TAnyDataSourceSchema,
37
- ConfigurableOptions extends object = {},
38
- > extends BaseHelper implements IDataSource<Settings, Schema, ConfigurableOptions> {
39
- abstract configure(opts?: ConfigurableOptions): ValueOrPromise<void>;
40
-
41
- getCapabilities(): IDataSourceCapabilities {
42
- return { transactions: false };
43
- }
44
-
45
- async beginTransaction(_opts?: ITransactionOptions): Promise<ITransaction> {
46
- return throwNotSupported({
47
- scope: this.constructor.name,
48
- feature: 'Transactions',
49
- logger: this.logger,
50
- });
51
- }
18
+ import { Pool } from 'pg';
19
+ import { datasource } from '@venizia/ignis';
20
+ import { BasePostgresDataSource } from '@venizia/ignis/postgres';
21
+ import { NodePostgresDriver } from '@venizia/ignis/postgres/node-postgres';
22
+
23
+ interface IDataSourceConfigs {
24
+ host: string;
25
+ port: number;
26
+ database: string;
27
+ user: string;
28
+ password: string;
52
29
  }
53
- ```
54
-
55
- No `pool`, no `connector`, no SQL types. Every engine either overrides `getCapabilities()`/`beginTransaction()` (PostgreSQL) or accepts the neutral default (typesense).
56
-
57
- ### `AbstractEntity`
58
30
 
59
- `packages/core/src/base/models/base.ts` declares the minimal entity contract, including `getIdType()`:
31
+ @datasource({ driver: NodePostgresDriver })
32
+ export class PostgresDataSource extends BasePostgresDataSource<IDataSourceConfigs> {
33
+ override configure(): void {
34
+ this.client = new Pool(this.settings);
35
+ }
60
36
 
61
- ```typescript
62
- abstract class AbstractEntity extends BaseHelper {
63
- getIdType(): TIdSchemaType {
64
- return 'string';
37
+ override getConnectionString(): string {
38
+ const { host, port, user, password, database } = this.settings;
39
+ return `postgresql://${user}:${password}@${host}:${port}/${database}`;
65
40
  }
66
41
  }
67
42
  ```
68
43
 
69
- `BasePostgresEntity` overrides `getIdType()` based on the Drizzle column's actual data type; other engines can override it per their own ID representation.
44
+ A Typesense datasource follows the same shape but extends the search connector's `BaseSearchDataSource` instead - no pool, no `getConnectionString()`, no transactions.
70
45
 
71
- ### `AbstractRepository`
46
+ ## How it works
72
47
 
73
- `packages/core/src/base/repositories/core/abstract.ts`:
74
-
75
- ```typescript
76
- abstract class AbstractRepository<
77
- TDataObject extends object,
78
- TPersistObject extends object = TDataObject,
79
- TOptions extends IExtraOptions = IExtraOptions,
80
- > extends BaseHelper implements IPersistableRepository<TDataObject, TPersistObject, TOptions>
81
- ```
48
+ - **Three engine-neutral roots.** `packages/core-server/src/base` declares three roots every connector implements:
82
49
 
83
- Notice the generic parameters are named for their role (`TDataObject`, `TPersistObject`, `TOptions`), not for Drizzle concepts (`EntitySchema`, `TTableObject`) - those Drizzle-flavored names now belong to `PostgresBaseRepository` and its subclasses, which narrow `AbstractRepository`'s generics into a `TTableSchemaWithId`-based signature. `AbstractRepository` does **not** compose `FieldsVisibilityMixin`/`DefaultFilterMixin` - see [Repository Mixins](./repositories/mixins) for what happened to those.
50
+ | Root | Purpose | Neutral default |
51
+ |---|---|---|
52
+ | `AbstractDataSource` | Connection ownership | No `pool`, no Drizzle `connector`; `beginTransaction()` throws `NotSupported` |
53
+ | `AbstractEntity` | Model/schema contract | `name`, `getSchema()`, `getIdType()` |
54
+ | `AbstractRepository` | Data access contract | Generics named for role (data/persist/options), not any one engine's vocabulary |
84
55
 
85
- ### Neutral `TFilter`/`TWhere` and `ITransaction`
56
+ - **Connectors narrow the roots into a real engine.** `packages/core-server/src/connectors/<engine>` adds engine-specific members:
86
57
 
87
- `packages/core/src/base/repositories/common/types.ts` and `packages/core/src/base/datasources/common/types.ts` define engine-neutral filter and transaction shapes shared by both connectors. `ITransaction` has no `connector` field - each engine that supports transactions (currently only PostgreSQL) narrows it with `IDatabaseTransaction`, whose `connector` is a `TRelationalConnector<Schema>` bound to the transaction's dedicated connection (the older `TNodePostgresTransactionConnector` name is kept as a `@deprecated` alias). Its `commit()`/`rollback()` **throw** on failure (a failed `COMMIT` no longer resolves as success) and destroy the poisoned connection rather than pooling it under the `node-postgres` driver; a failed `BEGIN` likewise destroys the acquired connection instead of leaking it. See [Transactions](/guides/core-concepts/persistent/transactions).
58
+ | Connector | Adds | `getCapabilities()` |
59
+ |---|---|---|
60
+ | **postgres** (`connectors/postgres`) | `pool`, Drizzle `connector`, SQL-shaped `TWhere`/`TFilter`, real transactions with isolation levels | `{ transactions: true }` |
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 |
88
62
 
89
- ## Dual-door exports
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
+ - **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. An app that never touches search never pulls a search client into its bundle.
90
66
 
91
- IGNIS ships both a **root barrel** (backward-compatible default) and **per-engine subpaths** (opt-in, tree-shakeable). Both resolve to the exact same compiled classes - there is no duplicated implementation.
67
+ **Canonical names and aliases**
92
68
 
93
- ```json
94
- // packages/core/package.json - exports map (persistence-relevant entries)
95
- {
96
- ".": "dist/index.js", // framework + postgres (compatibility default)
97
- "./postgres": "dist/connectors/postgres/index.js", // relational connector - loads ZERO client library
98
- "./postgres/node-postgres": "dist/connectors/postgres/drivers/node-postgres.js", // concrete driver (value-imports `pg`)
99
- "./postgres/postgres-js": "dist/connectors/postgres/drivers/postgres-js.js", // concrete driver (value-imports `postgres`)
100
- "./postgres/supabase": "dist/connectors/postgres/supabase/index.js", // Supabase pooler + RLS helpers
101
- "./search": "dist/connectors/search/index.js", // engine-neutral search paradigm (no engine client)
102
- "./typesense": "dist/connectors/typesense/index.js", // subpath-only, optional peer
103
- "./meilisearch": "dist/connectors/meilisearch/index.js" // subpath-only, optional peer
104
- }
105
- ```
69
+ | Layer | Canonical (`Relational` paradigm) | Compatibility alias (`Postgres`-prefixed) |
70
+ |---|---|---|
71
+ | DataSource | `BaseRelationalDataSource` | `BasePostgresDataSource` |
72
+ | Entity | `BaseRelationalEntity` | `BasePostgresEntity` |
73
+ | Repository | `RelationalBaseRepository` | `PostgresBaseRepository` |
106
74
 
107
- > [!IMPORTANT] Concrete Postgres drivers are sub-path only
108
- > `pg` and `postgres` are **both optional peer dependencies** (`peerDependenciesMeta.pg.optional` / `.postgres.optional`). The root barrel, `@venizia/ignis/postgres`, and the drivers barrel (`connectors/postgres/drivers/index.ts`) load **zero** `pg`/`postgres` modules - the drivers barrel exports only the neutral `IRelationalDriver` contract. A concrete driver value-imports its own client, so reach it by its own sub-path only: `@venizia/ignis/postgres/node-postgres` or `@venizia/ignis/postgres/postgres-js`. There is no structural client sniffing: `@datasource({ driver })` names the driver **class** directly (`NodePostgresDriver`/`PostgresJsDriver`), and the base datasource's `wireDriverFromMetadata()` instantiates that named class over `this.client` lazily, on first `getConnector()`/`beginTransaction()`. Naming a class rather than a driver-name string is what carries `pg`/`postgres` into the app's bundle - a bundler only packages a real value reference, never text, and a bare side-effect import would not survive `sideEffects: false`. This is what keeps IGNIS from forcing a database client on a project that does not use one. See [Postgres Drivers & Supabase](/guides/core-concepts/persistent/postgres-drivers).
75
+ Both names resolve to the same class - existing imports keep working.
109
76
 
110
- > [!NOTE] `internal/` modules are not public API
111
- > The search connectors (`search`/`typesense`/`meilisearch`) no longer re-export their `internal/` barrels (`SearchConnectorInternal`, `TypesenseInternal`, `MeilisearchInternal`) from the connector barrel. There is no sub-path export for them either, and package `exports` blocks deep imports - so no specifier reaches them from outside the package. They are implementation detail; if you need what they do, ask for a supported API.
77
+ ## Common tasks
112
78
 
113
- ```typescript
114
- // packages/core/src/index.ts - root barrel
115
- export * from './base';
116
- export * from './common';
117
- export * from './components';
118
- export * from './connectors'; // -> connectors/index.ts: export * from './postgres';
119
- export * from './helpers';
120
- export * from './utilities';
121
- ```
79
+ ### Pick an engine
122
80
 
123
- - **Root (`@venizia/ignis`)** re-exports the framework plus the `postgres` connector - existing code that imports `BaseDataSource`/`DefaultCRUDRepository` from the root keeps working unchanged.
124
- - **`@venizia/ignis/postgres`** re-exports the same connector in isolation, for code that wants to be explicit about which engine it depends on.
125
- - **`@venizia/ignis/typesense`** is **subpath-only** - it is deliberately excluded from the root barrel because `typesense` is an optional peer dependency (`"peerDependenciesMeta": { "typesense": { "optional": true } }`). Importing from the root must never force-install the typesense client for apps that don't use search.
81
+ Import the connector for the engine you need - `@venizia/ignis/postgres` for a relational database with transactions, `@venizia/ignis/typesense` or `@venizia/ignis/meilisearch` for document search. The root `@venizia/ignis` barrel re-exports postgres for backward compatibility; search engines are always subpath-only:
126
82
 
127
83
  ```typescript
128
- // Both of these resolve to the same BasePostgresDataSource class:
84
+ // Postgres: available at the root or the subpath - same class either way
129
85
  import { BaseDataSource } from '@venizia/ignis';
130
86
  import { BasePostgresDataSource } from '@venizia/ignis/postgres';
131
87
 
132
- // Typesense must be imported from its subpath - not available at the root:
133
- import { TypesenseDataSource, defineSearchCollection } from '@venizia/ignis/typesense';
88
+ // Search engines: subpath only, never at the root
89
+ import { TypesenseDataSource } from '@venizia/ignis/typesense';
90
+ import { MeilisearchDataSource } from '@venizia/ignis/meilisearch';
134
91
  ```
135
92
 
136
- ## Naming symmetry and compatibility aliases
137
-
138
- Each connector's canonical class names carry the engine name (`BasePostgresDataSource`, `BasePostgresEntity`), matching the pattern typesense follows (`TypesenseDataSource`). PostgreSQL additionally re-exports the pre-restructure names as aliases, so existing imports do not break:
139
-
140
- ```typescript
141
- // packages/core/src/connectors/postgres/datasources/index.ts
142
- export { BasePostgresDataSource as BaseDataSource } from './base-datasource';
143
-
144
- // packages/core/src/connectors/postgres/models/index.ts
145
- export { BasePostgresEntity as BaseEntity } from './base';
146
- ```
147
-
148
- | Canonical (new, engine-carrying) | Alias (compatibility) | Notes |
149
- |---|---|---|
150
- | `BasePostgresDataSource` | `BaseDataSource` | Same class, re-exported |
151
- | `BasePostgresEntity` | `BaseEntity` | Same class, re-exported |
152
-
153
- Write new code against the canonical names - they make it unambiguous which engine a class belongs to once you have more than one connector in play. Existing code using the aliases needs no changes.
93
+ ### Know what lives in base vs a connector
154
94
 
155
- ## Adding a new engine connector
95
+ - **Engine-specific -> connector.** A connection pool, query dialect, isolation level, or transaction lives in a connector, not `src/base`.
96
+ - **Engine-universal -> base.** `src/base` only ever grows members every engine can implement, such as `getSchema()` or `getIdType()`.
97
+ - **Litmus test.** Could typesense (no pool, no SQL, no transactions) implement it? If not, it belongs in the postgres connector, not the neutral root.
156
98
 
157
- To add a third connector (e.g. a Redis-backed cache connector), follow the shape the two existing connectors share:
99
+ ### Add a new engine connector
158
100
 
159
- 1. **`src/connectors/<engine>/datasources/`** - `Abstract<Engine>DataSource extends AbstractDataSource`, then `Base<Engine>DataSource` (or a single concrete `<Engine>DataSource` if there's no useful abstract/base split) implementing `configure()`/`getConnectionString()`. Override `getCapabilities()` and `beginTransaction()` only if the engine truly supports transactions - otherwise inherit the neutral `NotSupported` default.
160
- 2. **`src/connectors/<engine>/models/`** (if the engine needs entity definitions beyond plain objects) - extend `AbstractEntity`, override `getIdType()` if the engine's ID representation differs from the neutral default.
161
- 3. **`src/connectors/<engine>/repositories/core/`** - `<Engine>BaseRepository extends AbstractRepository`, narrowing the generics to the engine's data/persist/options shapes, followed by a `Readable`/`Persistable`/`DefaultCRUD`-style tier ladder mirroring the postgres and typesense connectors. Any operation the engine cannot support (transactions, locks) should call `throwNotSupported({ scope, feature, logger: this.logger })` for consistency.
162
- 4. **`src/connectors/<engine>/index.ts`** - barrel export for the connector.
163
- 5. **`src/connectors/index.ts`** - add `export * from './<engine>'` **only if** the engine has no optional runtime peer dependency (mirroring `postgres`). If the engine driver is an optional peer (like `typesense`), leave it out of `connectors/index.ts` and register it as a subpath-only export in `package.json`.
164
- 6. **`package.json` `exports`** - add `"./​<engine>": "dist/connectors/<engine>/index.js"`. If the driver is an optional peer, add it to `peerDependencies` + `peerDependenciesMeta.<driver>.optional: true`.
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
+ - **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.
165
104
 
166
- ## See Also
105
+ ## See also
167
106
 
168
- - **Related Concepts:**
169
- - [DataSources](./datasources) - Full DataSource reference (neutral contract + PostgreSQL connector)
170
- - [Models & Enrichers](./models) - Entity reference (neutral `AbstractEntity` + PostgreSQL `BasePostgresEntity`)
171
- - [Repositories](./repositories/) - Repository hierarchy reference
172
- - [Repository Mixins](./repositories/mixins) - Legacy mixins, now orphaned from the public API
107
+ - [DataSources](./datasources) - the engine-neutral contract and the PostgreSQL connector in depth
108
+ - [Models & Enrichers](./models) - the engine-neutral entity contract and the PostgreSQL connector's entity
109
+ - [Repositories](/references/base/repositories/) - the CRUD layer built on top of a connector's datasource
110
+ - [Filter System](/references/base/filter-system/) - querying through a connector's repository
111
+ - [Persistent Layer](/guides/core-concepts/persistent/) - the guide these reference pages support
112
+ - [Search & Typesense](/guides/core-concepts/persistent/search-typesense) - the typesense connector in depth
113
+ - [Search & Meilisearch](/guides/core-concepts/persistent/search-meilisearch) - the meilisearch connector in depth
173
114
 
174
- - **Guides:**
175
- - [Search & Typesense](/guides/core-concepts/persistent/search-typesense) - The typesense connector in depth
115
+ **Files:**
176
116
 
177
- - **Best Practices:**
178
- - [Architectural Patterns](/best-practices/architectural-patterns) - Layered architecture and separation of concerns
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