@venizia/ignis-docs 0.2.0 → 0.2.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.
- package/README.md +14 -14
- package/content/best-practices/api-usage-examples.md +39 -19
- package/content/best-practices/architectural-patterns.md +22 -11
- package/content/best-practices/architecture-decisions.md +29 -16
- package/content/best-practices/code-style-standards/advanced-patterns.md +43 -31
- package/content/best-practices/code-style-standards/constants-configuration.md +19 -4
- package/content/best-practices/code-style-standards/control-flow.md +33 -1
- package/content/best-practices/code-style-standards/documentation.md +28 -8
- package/content/best-practices/code-style-standards/function-patterns.md +15 -4
- package/content/best-practices/code-style-standards/index.md +7 -2
- package/content/best-practices/code-style-standards/naming-conventions.md +26 -2
- package/content/best-practices/code-style-standards/route-definitions.md +9 -5
- package/content/best-practices/code-style-standards/tooling.md +14 -1
- package/content/best-practices/code-style-standards/type-safety.md +39 -6
- package/content/best-practices/common-pitfalls.md +59 -35
- package/content/best-practices/contribution-workflow.md +6 -2
- package/content/best-practices/data-modeling.md +78 -62
- package/content/best-practices/deployment-strategies.md +56 -19
- package/content/best-practices/error-handling.md +182 -93
- package/content/best-practices/index.md +6 -0
- package/content/best-practices/performance-optimization.md +26 -13
- package/content/best-practices/security-guidelines.md +35 -9
- package/content/best-practices/testing-strategies.md +7 -2
- package/content/best-practices/troubleshooting-tips.md +27 -17
- package/content/extensions/components/api-reference.md +107 -322
- package/content/extensions/components/authentication/api.md +454 -603
- package/content/extensions/components/authentication/errors.md +121 -498
- package/content/extensions/components/authentication/index.md +88 -801
- package/content/extensions/components/authentication/usage.md +207 -956
- package/content/extensions/components/authorization/api.md +736 -656
- package/content/extensions/components/authorization/errors.md +168 -206
- package/content/extensions/components/authorization/index.md +82 -797
- package/content/extensions/components/authorization/usage.md +194 -527
- package/content/extensions/components/health-check.md +71 -243
- package/content/extensions/components/mail/api.md +504 -287
- package/content/extensions/components/mail/errors.md +73 -61
- package/content/extensions/components/mail/index.md +96 -467
- package/content/extensions/components/mail/usage.md +130 -172
- package/content/extensions/components/request-tracker.md +66 -173
- package/content/extensions/components/socket-io/api.md +195 -13
- package/content/extensions/components/socket-io/errors.md +3 -3
- package/content/extensions/components/socket-io/index.md +50 -337
- package/content/extensions/components/socket-io/usage.md +143 -26
- package/content/extensions/components/static-asset/api.md +410 -142
- package/content/extensions/components/static-asset/errors.md +110 -53
- package/content/extensions/components/static-asset/index.md +79 -608
- package/content/extensions/components/static-asset/usage.md +180 -300
- package/content/extensions/components/websocket/api.md +275 -399
- package/content/extensions/components/websocket/errors.md +47 -56
- package/content/extensions/components/websocket/index.md +74 -407
- package/content/extensions/components/websocket/usage.md +110 -341
- package/content/extensions/helpers/cron/index.md +51 -160
- package/content/extensions/helpers/crypto/index.md +62 -483
- package/content/extensions/helpers/crypto/reference.md +456 -0
- package/content/extensions/helpers/env/index.md +60 -178
- package/content/extensions/helpers/error/index.md +221 -207
- package/content/extensions/helpers/inversion/index.md +65 -556
- package/content/extensions/helpers/inversion/reference.md +522 -0
- package/content/extensions/helpers/kafka/admin.md +20 -1
- package/content/extensions/helpers/kafka/compile-binary.md +41 -35
- package/content/extensions/helpers/kafka/consumer.md +54 -20
- package/content/extensions/helpers/kafka/examples.md +21 -16
- package/content/extensions/helpers/kafka/index.md +80 -610
- package/content/extensions/helpers/kafka/producer.md +134 -5
- package/content/extensions/helpers/kafka/schema-registry.md +45 -70
- package/content/extensions/helpers/logger/hf-logger.md +193 -0
- package/content/extensions/helpers/logger/index.md +64 -563
- package/content/extensions/helpers/logger/pino.md +85 -0
- package/content/extensions/helpers/logger/reference.md +746 -0
- package/content/extensions/helpers/network/api.md +241 -195
- package/content/extensions/helpers/network/index.md +72 -530
- package/content/extensions/helpers/queue/index.md +72 -900
- package/content/extensions/helpers/queue/reference.md +467 -0
- package/content/extensions/helpers/redis/index.md +73 -645
- package/content/extensions/helpers/redis/reference.md +727 -0
- package/content/extensions/helpers/secrets/index.md +66 -0
- package/content/extensions/helpers/socket-io/api.md +305 -203
- package/content/extensions/helpers/socket-io/index.md +66 -432
- package/content/extensions/helpers/storage/api.md +564 -462
- package/content/extensions/helpers/storage/index.md +77 -573
- package/content/extensions/helpers/types/index.md +66 -499
- package/content/extensions/helpers/types/reference.md +650 -0
- package/content/extensions/helpers/uid/index.md +58 -227
- package/content/extensions/helpers/websocket/api.md +329 -216
- package/content/extensions/helpers/websocket/index.md +65 -503
- package/content/extensions/helpers/worker-thread/index.md +58 -396
- package/content/extensions/helpers/worker-thread/reference.md +428 -0
- package/content/guides/core-concepts/persistent/models.md +1 -1
- package/content/guides/core-concepts/persistent/search-typesense.md +3 -3
- package/content/guides/core-concepts/persistent/transactions.md +1 -1
- package/content/guides/core-concepts/secrets-vault.md +177 -0
- package/content/guides/core-concepts/services.md +1 -1
- package/content/guides/migrations/redis-helpers-migration.md +1 -1
- package/content/guides/migrations/unified-connectors-migration.md +2 -2
- package/content/guides/tutorials/ecommerce-api.md +3 -8
- package/content/references/base/application.md +1 -1
- package/content/references/base/connectors.md +79 -136
- package/content/references/base/datasources-reference.md +599 -0
- package/content/references/base/datasources.md +84 -444
- package/content/references/base/dependency-injection.md +17 -39
- package/content/references/base/filter-system/application-usage.md +69 -121
- package/content/references/base/filter-system/array-operators.md +12 -0
- package/content/references/base/filter-system/comparison-operators.md +12 -0
- package/content/references/base/filter-system/default-filter.md +136 -348
- package/content/references/base/filter-system/fields-order-pagination.md +38 -16
- package/content/references/base/filter-system/index.md +106 -257
- package/content/references/base/filter-system/json-filtering.md +12 -2
- package/content/references/base/filter-system/list-operators.md +16 -2
- package/content/references/base/filter-system/logical-operators.md +13 -0
- package/content/references/base/filter-system/null-operators.md +13 -0
- package/content/references/base/filter-system/pattern-matching.md +12 -0
- package/content/references/base/filter-system/quick-reference.md +11 -2
- package/content/references/base/filter-system/range-operators.md +12 -0
- package/content/references/base/filter-system/tips.md +70 -133
- package/content/references/base/filter-system/use-cases.md +156 -233
- package/content/references/base/middlewares.md +35 -21
- package/content/references/base/models-reference.md +886 -0
- package/content/references/base/models.md +80 -1452
- package/content/references/base/repositories/advanced.md +156 -192
- package/content/references/base/repositories/index.md +77 -650
- package/content/references/base/repositories/mixins.md +22 -18
- package/content/references/base/repositories/relations.md +123 -171
- package/content/references/base/repositories/soft-deletable.md +58 -56
- package/content/references/base/secrets.md +263 -0
- package/content/references/base/services.md +2 -2
- package/content/references/configuration/environment-variables.md +48 -4
- package/content/references/configuration/index.md +49 -31
- package/content/references/quick-reference.md +3 -16
- package/content/references/utilities/crypto.md +35 -76
- package/content/references/utilities/date.md +33 -73
- package/content/references/utilities/index.md +1 -1
- package/content/references/utilities/jsx-reference.md +298 -0
- package/content/references/utilities/jsx.md +82 -525
- package/content/references/utilities/module.md +29 -62
- package/content/references/utilities/parse.md +34 -64
- package/content/references/utilities/performance.md +33 -58
- package/content/references/utilities/promise.md +28 -62
- package/content/references/utilities/request.md +57 -218
- package/content/references/utilities/schema.md +43 -137
- package/content/references/utilities/statuses-reference.md +361 -0
- package/content/references/utilities/statuses.md +63 -667
- package/package.json +8 -8
|
@@ -16,7 +16,7 @@ IGNIS core was restructured around ONE engine-neutral repository family:
|
|
|
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
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.
|
|
19
|
-
- New capabilities model: `dataSource.getCapabilities()` and a standardized NotSupported error (HTTP 501,
|
|
19
|
+
- 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
20
|
- New engine: the **Typesense search branch** (`BaseSearchEntity`, `defineSearchCollection`, typed `TSearchDocument`, `DefaultSearchRepository`). It does not affect existing postgres code.
|
|
21
21
|
|
|
22
22
|
## Required migrations (in order)
|
|
@@ -78,7 +78,7 @@ Run this once after the version bump, before trusting the first `tsc` run.
|
|
|
78
78
|
|
|
79
79
|
### 4. Auth endpoint error contract (only if you assert on it)
|
|
80
80
|
|
|
81
|
-
The three auth endpoints backed by unimplemented service methods (`refreshToken`, `getUserInformation`) now return the standardized NotSupported error: HTTP 501 with
|
|
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
82
|
|
|
83
83
|
## Strongly recommended (not compile-blocking)
|
|
84
84
|
|
|
@@ -526,12 +526,11 @@ export class OrderRepository extends DefaultCRUDRepository<typeof Order.schema>
|
|
|
526
526
|
|
|
527
527
|
```typescript
|
|
528
528
|
// src/services/product.service.ts
|
|
529
|
-
import {
|
|
529
|
+
import { inject } from '@venizia/ignis';
|
|
530
530
|
import { BaseService } from '@venizia/ignis';
|
|
531
531
|
import { ProductRepository } from '../repositories/product.repository';
|
|
532
532
|
import { getError } from '@venizia/ignis-helpers';
|
|
533
533
|
|
|
534
|
-
@injectable({})
|
|
535
534
|
export class ProductService extends BaseService {
|
|
536
535
|
constructor(
|
|
537
536
|
@inject({ key: 'repositories.ProductRepository' })
|
|
@@ -595,7 +594,7 @@ export class ProductService extends BaseService {
|
|
|
595
594
|
|
|
596
595
|
```typescript
|
|
597
596
|
// src/services/cart.service.ts
|
|
598
|
-
import {
|
|
597
|
+
import { inject } from '@venizia/ignis';
|
|
599
598
|
import { BaseService } from '@venizia/ignis';
|
|
600
599
|
import { CartRepository } from '../repositories/cart.repository';
|
|
601
600
|
import { ProductService } from './product.service';
|
|
@@ -606,7 +605,6 @@ interface ICartItem {
|
|
|
606
605
|
quantity: number;
|
|
607
606
|
}
|
|
608
607
|
|
|
609
|
-
@injectable({})
|
|
610
608
|
export class CartService extends BaseService {
|
|
611
609
|
constructor(
|
|
612
610
|
@inject({ key: 'repositories.CartRepository' })
|
|
@@ -733,7 +731,7 @@ export class CartService extends BaseService {
|
|
|
733
731
|
|
|
734
732
|
```typescript
|
|
735
733
|
// src/services/order.service.ts
|
|
736
|
-
import {
|
|
734
|
+
import { inject } from '@venizia/ignis';
|
|
737
735
|
import { BaseService } from '@venizia/ignis';
|
|
738
736
|
import { OrderRepository } from '../repositories/order.repository';
|
|
739
737
|
import { CartService } from './cart.service';
|
|
@@ -758,7 +756,6 @@ interface ICreateOrderInput {
|
|
|
758
756
|
billingAddress?: IOrderAddress;
|
|
759
757
|
}
|
|
760
758
|
|
|
761
|
-
@injectable({})
|
|
762
759
|
export class OrderService extends BaseService {
|
|
763
760
|
constructor(
|
|
764
761
|
@inject({ key: 'repositories.OrderRepository' })
|
|
@@ -906,12 +903,10 @@ export class OrderService extends BaseService {
|
|
|
906
903
|
|
|
907
904
|
```typescript
|
|
908
905
|
// src/services/payment.service.ts
|
|
909
|
-
import { injectable } from '@venizia/ignis';
|
|
910
906
|
import { BaseService } from '@venizia/ignis';
|
|
911
907
|
import Stripe from 'stripe';
|
|
912
908
|
import { applicationEnvironment } from '@venizia/ignis-helpers';
|
|
913
909
|
|
|
914
|
-
@injectable({})
|
|
915
910
|
export class PaymentService extends BaseService {
|
|
916
911
|
private _stripe: Stripe;
|
|
917
912
|
|
|
@@ -266,7 +266,7 @@ graph TD
|
|
|
266
266
|
|
|
267
267
|
Automatically registers these default middlewares during `initialize()`:
|
|
268
268
|
|
|
269
|
-
1. **Error handler** (`
|
|
269
|
+
1. **Error handler** (`AppErrorMiddleware`) - with optional `rootKey` from `configs.error.rootKey`
|
|
270
270
|
2. **Async context storage** (`contextStorage`) - enabled by default via `configs.asyncContext.enable`
|
|
271
271
|
3. **Not-found handler** (`notFoundHandler`)
|
|
272
272
|
4. **RequestTrackerComponent** - assigns `x-request-id` to every request, includes request body parsing
|
|
@@ -1,178 +1,121 @@
|
|
|
1
1
|
---
|
|
2
|
-
title: Connectors
|
|
3
|
-
description: How IGNIS
|
|
4
|
-
difficulty:
|
|
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
|
-
#
|
|
7
|
+
# Connectors
|
|
8
8
|
|
|
9
|
-
|
|
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.
|
|
10
10
|
|
|
11
|
-
|
|
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
|
-
|
|
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
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
-
|
|
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
|
-
|
|
62
|
-
|
|
63
|
-
|
|
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
|
-
|
|
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
|
-
|
|
46
|
+
## How it works
|
|
72
47
|
|
|
73
|
-
`packages/core/src/base
|
|
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/src/base` declares three roots every connector implements:
|
|
82
49
|
|
|
83
|
-
|
|
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
|
-
|
|
56
|
+
- **Connectors narrow the roots into a real engine.** `packages/core/src/connectors/<engine>` adds engine-specific members:
|
|
86
57
|
|
|
87
|
-
|
|
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
|
-
|
|
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, so an app that never touches search never pulls a search client into its bundle.
|
|
90
66
|
|
|
91
|
-
|
|
67
|
+
**Canonical names and aliases**
|
|
92
68
|
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
-
|
|
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
|
-
//
|
|
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
|
-
//
|
|
133
|
-
import { TypesenseDataSource
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
99
|
+
### Add a new engine connector
|
|
158
100
|
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
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>/`: 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.
|
|
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
|
|
105
|
+
## See also
|
|
167
106
|
|
|
168
|
-
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
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
|
-
|
|
175
|
-
- [Search & Typesense](/guides/core-concepts/persistent/search-typesense) - The typesense connector in depth
|
|
115
|
+
**Files:**
|
|
176
116
|
|
|
177
|
-
-
|
|
178
|
-
|
|
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
|