orchid-orm 0.0.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.
package/src/orm.ts ADDED
@@ -0,0 +1,74 @@
1
+ import { Adapter, Db, AdapterOptions, QueryLogOptions, columnTypes } from 'pqb';
2
+ import { DbModel, Model, ModelClasses } from './model';
3
+ import { applyRelations } from './relations/relations';
4
+ import { transaction } from './transaction';
5
+
6
+ export type OrchidORM<T extends ModelClasses> = {
7
+ [K in keyof T]: DbModel<T[K]>;
8
+ } & {
9
+ $transaction: typeof transaction;
10
+ $adapter: Adapter;
11
+ $queryBuilder: Db;
12
+ $close(): Promise<void>;
13
+ };
14
+
15
+ export const orchidORM = <T extends ModelClasses>(
16
+ {
17
+ log,
18
+ logger,
19
+ ...options
20
+ }: ({ adapter: Adapter } | Omit<AdapterOptions, 'log'>) & QueryLogOptions,
21
+ models: T,
22
+ ): OrchidORM<T> => {
23
+ const adapter = 'adapter' in options ? options.adapter : new Adapter(options);
24
+ const commonOptions = { log, logger };
25
+ const qb = new Db(
26
+ adapter,
27
+ undefined as unknown as Db,
28
+ undefined,
29
+ {},
30
+ columnTypes,
31
+ commonOptions,
32
+ );
33
+ qb.queryBuilder = qb as unknown as Db;
34
+
35
+ const result = {
36
+ $transaction: transaction,
37
+ $adapter: adapter,
38
+ $queryBuilder: qb,
39
+ $close: () => adapter.close(),
40
+ } as unknown as OrchidORM<ModelClasses>;
41
+
42
+ const modelInstances: Record<string, Model> = {};
43
+
44
+ for (const key in models) {
45
+ if (key[0] === '$') {
46
+ throw new Error(`Model name must not start with $`);
47
+ }
48
+
49
+ const model = new models[key]();
50
+ modelInstances[key] = model;
51
+
52
+ const dbModel = new Db(
53
+ adapter,
54
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
55
+ qb as any,
56
+ model.table,
57
+ model.columns.shape,
58
+ model.columnTypes,
59
+ {
60
+ ...commonOptions,
61
+ schema: model.schema,
62
+ },
63
+ );
64
+
65
+ (dbModel as unknown as { definedAs: string }).definedAs = key;
66
+ (dbModel as unknown as { db: unknown }).db = result;
67
+
68
+ (result as Record<string, unknown>)[key] = dbModel;
69
+ }
70
+
71
+ applyRelations(qb, modelInstances, result);
72
+
73
+ return result as unknown as OrchidORM<T>;
74
+ };