linkgress-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.
Files changed (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +196 -0
  3. package/dist/database/database-client.interface.d.ts +45 -0
  4. package/dist/database/database-client.interface.d.ts.map +1 -0
  5. package/dist/database/database-client.interface.js +20 -0
  6. package/dist/database/database-client.interface.js.map +1 -0
  7. package/dist/database/index.d.ts +5 -0
  8. package/dist/database/index.d.ts.map +1 -0
  9. package/dist/database/index.js +10 -0
  10. package/dist/database/index.js.map +1 -0
  11. package/dist/database/pg-client.d.ts +30 -0
  12. package/dist/database/pg-client.d.ts.map +1 -0
  13. package/dist/database/pg-client.js +76 -0
  14. package/dist/database/pg-client.js.map +1 -0
  15. package/dist/database/postgres-client.d.ts +44 -0
  16. package/dist/database/postgres-client.d.ts.map +1 -0
  17. package/dist/database/postgres-client.js +111 -0
  18. package/dist/database/postgres-client.js.map +1 -0
  19. package/dist/database/types.d.ts +200 -0
  20. package/dist/database/types.d.ts.map +1 -0
  21. package/dist/database/types.js +8 -0
  22. package/dist/database/types.js.map +1 -0
  23. package/dist/entity/base-entity.d.ts +21 -0
  24. package/dist/entity/base-entity.d.ts.map +1 -0
  25. package/dist/entity/base-entity.js +27 -0
  26. package/dist/entity/base-entity.js.map +1 -0
  27. package/dist/entity/db-column.d.ts +61 -0
  28. package/dist/entity/db-column.d.ts.map +1 -0
  29. package/dist/entity/db-column.js +35 -0
  30. package/dist/entity/db-column.js.map +1 -0
  31. package/dist/entity/db-context.d.ts +665 -0
  32. package/dist/entity/db-context.d.ts.map +1 -0
  33. package/dist/entity/db-context.js +1463 -0
  34. package/dist/entity/db-context.js.map +1 -0
  35. package/dist/entity/entity-base.d.ts +76 -0
  36. package/dist/entity/entity-base.d.ts.map +1 -0
  37. package/dist/entity/entity-base.js +42 -0
  38. package/dist/entity/entity-base.js.map +1 -0
  39. package/dist/entity/entity-builder.d.ts +171 -0
  40. package/dist/entity/entity-builder.d.ts.map +1 -0
  41. package/dist/entity/entity-builder.js +376 -0
  42. package/dist/entity/entity-builder.js.map +1 -0
  43. package/dist/entity/model-config.d.ts +18 -0
  44. package/dist/entity/model-config.d.ts.map +1 -0
  45. package/dist/entity/model-config.js +157 -0
  46. package/dist/entity/model-config.js.map +1 -0
  47. package/dist/index.d.ts +27 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +142 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/migration/db-schema-manager.d.ts +228 -0
  52. package/dist/migration/db-schema-manager.d.ts.map +1 -0
  53. package/dist/migration/db-schema-manager.js +1055 -0
  54. package/dist/migration/db-schema-manager.js.map +1 -0
  55. package/dist/migration/enum-migrator.d.ts +29 -0
  56. package/dist/migration/enum-migrator.d.ts.map +1 -0
  57. package/dist/migration/enum-migrator.js +137 -0
  58. package/dist/migration/enum-migrator.js.map +1 -0
  59. package/dist/query/collection-strategy.factory.d.ts +16 -0
  60. package/dist/query/collection-strategy.factory.d.ts.map +1 -0
  61. package/dist/query/collection-strategy.factory.js +37 -0
  62. package/dist/query/collection-strategy.factory.js.map +1 -0
  63. package/dist/query/collection-strategy.interface.d.ts +146 -0
  64. package/dist/query/collection-strategy.interface.d.ts.map +1 -0
  65. package/dist/query/collection-strategy.interface.js +3 -0
  66. package/dist/query/collection-strategy.interface.js.map +1 -0
  67. package/dist/query/conditions.d.ts +222 -0
  68. package/dist/query/conditions.d.ts.map +1 -0
  69. package/dist/query/conditions.js +446 -0
  70. package/dist/query/conditions.js.map +1 -0
  71. package/dist/query/cte-builder.d.ts +95 -0
  72. package/dist/query/cte-builder.d.ts.map +1 -0
  73. package/dist/query/cte-builder.js +172 -0
  74. package/dist/query/cte-builder.js.map +1 -0
  75. package/dist/query/grouped-query.d.ts +186 -0
  76. package/dist/query/grouped-query.d.ts.map +1 -0
  77. package/dist/query/grouped-query.js +588 -0
  78. package/dist/query/grouped-query.js.map +1 -0
  79. package/dist/query/join-builder.d.ts +106 -0
  80. package/dist/query/join-builder.d.ts.map +1 -0
  81. package/dist/query/join-builder.js +275 -0
  82. package/dist/query/join-builder.js.map +1 -0
  83. package/dist/query/query-builder.d.ts +543 -0
  84. package/dist/query/query-builder.d.ts.map +1 -0
  85. package/dist/query/query-builder.js +2649 -0
  86. package/dist/query/query-builder.js.map +1 -0
  87. package/dist/query/strategies/jsonb-collection-strategy.d.ts +51 -0
  88. package/dist/query/strategies/jsonb-collection-strategy.d.ts.map +1 -0
  89. package/dist/query/strategies/jsonb-collection-strategy.js +210 -0
  90. package/dist/query/strategies/jsonb-collection-strategy.js.map +1 -0
  91. package/dist/query/strategies/temptable-collection-strategy.d.ts +95 -0
  92. package/dist/query/strategies/temptable-collection-strategy.d.ts.map +1 -0
  93. package/dist/query/strategies/temptable-collection-strategy.js +456 -0
  94. package/dist/query/strategies/temptable-collection-strategy.js.map +1 -0
  95. package/dist/query/subquery.d.ts +152 -0
  96. package/dist/query/subquery.d.ts.map +1 -0
  97. package/dist/query/subquery.js +206 -0
  98. package/dist/query/subquery.js.map +1 -0
  99. package/dist/schema/column-builder.d.ts +127 -0
  100. package/dist/schema/column-builder.d.ts.map +1 -0
  101. package/dist/schema/column-builder.js +184 -0
  102. package/dist/schema/column-builder.js.map +1 -0
  103. package/dist/schema/inference.d.ts +26 -0
  104. package/dist/schema/inference.d.ts.map +1 -0
  105. package/dist/schema/inference.js +3 -0
  106. package/dist/schema/inference.js.map +1 -0
  107. package/dist/schema/navigation.d.ts +215 -0
  108. package/dist/schema/navigation.d.ts.map +1 -0
  109. package/dist/schema/navigation.js +233 -0
  110. package/dist/schema/navigation.js.map +1 -0
  111. package/dist/schema/row-type.d.ts +26 -0
  112. package/dist/schema/row-type.d.ts.map +1 -0
  113. package/dist/schema/row-type.js +3 -0
  114. package/dist/schema/row-type.js.map +1 -0
  115. package/dist/schema/sequence-builder.d.ts +87 -0
  116. package/dist/schema/sequence-builder.d.ts.map +1 -0
  117. package/dist/schema/sequence-builder.js +123 -0
  118. package/dist/schema/sequence-builder.js.map +1 -0
  119. package/dist/schema/table-builder.d.ts +122 -0
  120. package/dist/schema/table-builder.d.ts.map +1 -0
  121. package/dist/schema/table-builder.js +132 -0
  122. package/dist/schema/table-builder.js.map +1 -0
  123. package/dist/schema/typed-schema.d.ts +22 -0
  124. package/dist/schema/typed-schema.d.ts.map +1 -0
  125. package/dist/schema/typed-schema.js +28 -0
  126. package/dist/schema/typed-schema.js.map +1 -0
  127. package/dist/types/column-types.d.ts +20 -0
  128. package/dist/types/column-types.d.ts.map +1 -0
  129. package/dist/types/column-types.js +14 -0
  130. package/dist/types/column-types.js.map +1 -0
  131. package/dist/types/custom-types.d.ts +85 -0
  132. package/dist/types/custom-types.d.ts.map +1 -0
  133. package/dist/types/custom-types.js +132 -0
  134. package/dist/types/custom-types.js.map +1 -0
  135. package/dist/types/enum-builder.d.ts +31 -0
  136. package/dist/types/enum-builder.d.ts.map +1 -0
  137. package/dist/types/enum-builder.js +46 -0
  138. package/dist/types/enum-builder.js.map +1 -0
  139. package/dist/types/metadata.d.ts +67 -0
  140. package/dist/types/metadata.d.ts.map +1 -0
  141. package/dist/types/metadata.js +57 -0
  142. package/dist/types/metadata.js.map +1 -0
  143. package/dist/types/type-mapper.d.ts +49 -0
  144. package/dist/types/type-mapper.d.ts.map +1 -0
  145. package/dist/types/type-mapper.js +49 -0
  146. package/dist/types/type-mapper.js.map +1 -0
  147. package/package.json +77 -0
@@ -0,0 +1,106 @@
1
+ import { Condition } from './conditions';
2
+ import { TableSchema } from '../schema/table-builder';
3
+ import type { DatabaseClient } from '../database/database-client.interface';
4
+ import type { QueryExecutor } from '../entity/db-context';
5
+ /**
6
+ * Join type
7
+ */
8
+ export type JoinType = 'INNER' | 'LEFT';
9
+ /**
10
+ * Join definition
11
+ */
12
+ export interface JoinDefinition {
13
+ type: JoinType;
14
+ table: string;
15
+ alias: string;
16
+ schema: TableSchema;
17
+ condition: Condition;
18
+ }
19
+ /**
20
+ * Query context for join queries
21
+ */
22
+ export interface JoinQueryContext {
23
+ paramCounter: number;
24
+ allParams: any[];
25
+ }
26
+ /**
27
+ * Join query builder with strong typing for joined tables
28
+ */
29
+ export declare class JoinQueryBuilder<TLeft, TRight> {
30
+ private leftSchema;
31
+ private leftAlias;
32
+ private rightSchema;
33
+ private rightAlias;
34
+ private joinType;
35
+ private joinCondition;
36
+ private client;
37
+ private joins;
38
+ private selection?;
39
+ private whereCond?;
40
+ private limitValue?;
41
+ private offsetValue?;
42
+ private orderByFields;
43
+ private executor?;
44
+ constructor(leftSchema: TableSchema, leftAlias: string, rightSchema: TableSchema, rightAlias: string, joinType: JoinType, joinCondition: Condition, client: DatabaseClient, executor?: QueryExecutor);
45
+ /**
46
+ * Add another left join
47
+ */
48
+ leftJoin<TThird>(rightTable: {
49
+ _schema: TableSchema;
50
+ _alias: string;
51
+ }, condition: (left: TLeft, right: TRight, third: TThird) => Condition, selector: (left: TLeft, right: TRight, third: TThird) => any): any;
52
+ /**
53
+ * Add another inner join
54
+ */
55
+ innerJoin<TThird>(rightTable: {
56
+ _schema: TableSchema;
57
+ _alias: string;
58
+ }, condition: (left: TLeft, right: TRight, third: TThird) => Condition, selector: (left: TLeft, right: TRight, third: TThird) => any): any;
59
+ /**
60
+ * Add WHERE condition
61
+ */
62
+ where(condition: (left: TLeft, right: TRight) => Condition): this;
63
+ /**
64
+ * Limit results
65
+ */
66
+ limit(count: number): this;
67
+ /**
68
+ * Offset results
69
+ */
70
+ offset(count: number): this;
71
+ /**
72
+ * Order by field(s) from joined tables
73
+ * @example
74
+ * .orderBy((l, r) => l.colName)
75
+ * .orderBy((l, r) => [l.colName, r.otherCol])
76
+ * .orderBy((l, r) => [[l.colName, 'ASC'], [r.otherCol, 'DESC']])
77
+ */
78
+ orderBy(selector: (left: TLeft, right: TRight) => any): this;
79
+ orderBy(selector: (left: TLeft, right: TRight) => any[]): this;
80
+ orderBy(selector: (left: TLeft, right: TRight) => Array<[any, 'ASC' | 'DESC']>): this;
81
+ /**
82
+ * Execute query and return results
83
+ */
84
+ toList(): Promise<any[]>;
85
+ /**
86
+ * Execute query and return first result or null
87
+ */
88
+ first(): Promise<any | null>;
89
+ /**
90
+ * Execute query and return first result or throw
91
+ */
92
+ firstOrThrow(): Promise<any>;
93
+ /**
94
+ * Set the selection (called internally)
95
+ */
96
+ _setSelection(selector: (left: TLeft, right: TRight) => any): void;
97
+ /**
98
+ * Create mock row for a table
99
+ */
100
+ private createMockRow;
101
+ /**
102
+ * Build SQL query for the join
103
+ */
104
+ private buildQuery;
105
+ }
106
+ //# sourceMappingURL=join-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"join-builder.d.ts","sourceRoot":"","sources":["../../src/query/join-builder.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,275 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.JoinQueryBuilder = void 0;
4
+ const conditions_1 = require("./conditions");
5
+ /**
6
+ * Join query builder with strong typing for joined tables
7
+ */
8
+ class JoinQueryBuilder {
9
+ constructor(leftSchema, leftAlias, rightSchema, rightAlias, joinType, joinCondition, client, executor) {
10
+ this.leftSchema = leftSchema;
11
+ this.leftAlias = leftAlias;
12
+ this.rightSchema = rightSchema;
13
+ this.rightAlias = rightAlias;
14
+ this.joinType = joinType;
15
+ this.joinCondition = joinCondition;
16
+ this.client = client;
17
+ this.joins = [];
18
+ this.orderByFields = [];
19
+ this.executor = executor;
20
+ // Store the first join
21
+ this.joins.push({
22
+ type: joinType,
23
+ table: rightSchema.name,
24
+ alias: rightAlias,
25
+ schema: rightSchema,
26
+ condition: joinCondition,
27
+ });
28
+ }
29
+ /**
30
+ * Add another left join
31
+ */
32
+ leftJoin(rightTable, condition, selector) {
33
+ // This would require extending the type parameters dynamically
34
+ // For now, we'll support chaining up to 2 joins
35
+ throw new Error('Additional joins not yet implemented. Use the final selector after the first join.');
36
+ }
37
+ /**
38
+ * Add another inner join
39
+ */
40
+ innerJoin(rightTable, condition, selector) {
41
+ throw new Error('Additional joins not yet implemented. Use the final selector after the first join.');
42
+ }
43
+ /**
44
+ * Add WHERE condition
45
+ */
46
+ where(condition) {
47
+ const mockLeft = this.createMockRow(this.leftSchema, this.leftAlias);
48
+ const mockRight = this.createMockRow(this.rightSchema, this.rightAlias);
49
+ this.whereCond = condition(mockLeft, mockRight);
50
+ return this;
51
+ }
52
+ /**
53
+ * Limit results
54
+ */
55
+ limit(count) {
56
+ this.limitValue = count;
57
+ return this;
58
+ }
59
+ /**
60
+ * Offset results
61
+ */
62
+ offset(count) {
63
+ this.offsetValue = count;
64
+ return this;
65
+ }
66
+ orderBy(selector) {
67
+ const mockLeft = this.createMockRow(this.leftSchema, this.leftAlias);
68
+ const mockRight = this.createMockRow(this.rightSchema, this.rightAlias);
69
+ const result = selector(mockLeft, mockRight);
70
+ // Handle array of [field, direction] tuples
71
+ if (Array.isArray(result) && result.length > 0 && Array.isArray(result[0])) {
72
+ for (const [fieldRef, direction] of result) {
73
+ if (fieldRef && typeof fieldRef === 'object' && '__fieldName' in fieldRef) {
74
+ this.orderByFields.push({
75
+ table: fieldRef.__tableAlias || this.leftAlias,
76
+ field: fieldRef.__dbColumnName || fieldRef.__fieldName,
77
+ direction: direction || 'ASC'
78
+ });
79
+ }
80
+ }
81
+ }
82
+ // Handle array of fields (all ASC)
83
+ else if (Array.isArray(result)) {
84
+ for (const fieldRef of result) {
85
+ if (fieldRef && typeof fieldRef === 'object' && '__fieldName' in fieldRef) {
86
+ this.orderByFields.push({
87
+ table: fieldRef.__tableAlias || this.leftAlias,
88
+ field: fieldRef.__dbColumnName || fieldRef.__fieldName,
89
+ direction: 'ASC'
90
+ });
91
+ }
92
+ }
93
+ }
94
+ // Handle single field
95
+ else if (result && typeof result === 'object' && '__fieldName' in result) {
96
+ this.orderByFields.push({
97
+ table: result.__tableAlias || this.leftAlias,
98
+ field: result.__dbColumnName || result.__fieldName,
99
+ direction: 'ASC'
100
+ });
101
+ }
102
+ return this;
103
+ }
104
+ /**
105
+ * Execute query and return results
106
+ */
107
+ async toList() {
108
+ if (!this.selection) {
109
+ throw new Error('Selection is required. Call the join method with a selector.');
110
+ }
111
+ const context = {
112
+ paramCounter: 1,
113
+ allParams: [],
114
+ };
115
+ // Build the query
116
+ const { sql, params } = this.buildQuery(context);
117
+ // Execute using executor if available (for logging), otherwise use client directly
118
+ const result = this.executor
119
+ ? await this.executor.query(sql, params)
120
+ : await this.client.query(sql, params);
121
+ return result.rows;
122
+ }
123
+ /**
124
+ * Execute query and return first result or null
125
+ */
126
+ async first() {
127
+ const results = await this.limit(1).toList();
128
+ return results.length > 0 ? results[0] : null;
129
+ }
130
+ /**
131
+ * Execute query and return first result or throw
132
+ */
133
+ async firstOrThrow() {
134
+ const result = await this.first();
135
+ if (!result) {
136
+ throw new Error('No results found');
137
+ }
138
+ return result;
139
+ }
140
+ /**
141
+ * Set the selection (called internally)
142
+ */
143
+ _setSelection(selector) {
144
+ this.selection = selector;
145
+ }
146
+ /**
147
+ * Create mock row for a table
148
+ */
149
+ createMockRow(schema, alias) {
150
+ const mock = {};
151
+ // Add columns as FieldRef objects
152
+ for (const [colName, colBuilder] of Object.entries(schema.columns)) {
153
+ const dbColumnName = colBuilder.build().name;
154
+ Object.defineProperty(mock, colName, {
155
+ get: () => ({
156
+ __fieldName: colName,
157
+ __dbColumnName: dbColumnName,
158
+ __tableAlias: alias,
159
+ }),
160
+ enumerable: true,
161
+ configurable: true,
162
+ });
163
+ }
164
+ // Add navigation properties for nested joins
165
+ for (const [relName, relConfig] of Object.entries(schema.relations)) {
166
+ if (relConfig.type === 'one') {
167
+ Object.defineProperty(mock, relName, {
168
+ get: () => {
169
+ const targetSchema = relConfig.targetTableBuilder?.build();
170
+ if (!targetSchema) {
171
+ // Fallback proxy
172
+ return new Proxy({}, {
173
+ get: (target, prop) => ({
174
+ __fieldName: prop,
175
+ __dbColumnName: prop,
176
+ __tableAlias: `${alias}_${relName}`,
177
+ })
178
+ });
179
+ }
180
+ const nestedMock = {};
181
+ for (const [nestedColName, nestedColBuilder] of Object.entries(targetSchema.columns)) {
182
+ const nestedDbColumnName = nestedColBuilder.build().name;
183
+ Object.defineProperty(nestedMock, nestedColName, {
184
+ get: () => ({
185
+ __fieldName: nestedColName,
186
+ __dbColumnName: nestedDbColumnName,
187
+ __tableAlias: `${alias}_${relName}`,
188
+ __navigationPath: [alias, relName],
189
+ }),
190
+ enumerable: true,
191
+ configurable: true,
192
+ });
193
+ }
194
+ return nestedMock;
195
+ },
196
+ enumerable: true,
197
+ configurable: true,
198
+ });
199
+ }
200
+ }
201
+ return mock;
202
+ }
203
+ /**
204
+ * Build SQL query for the join
205
+ */
206
+ buildQuery(context) {
207
+ if (!this.selection) {
208
+ throw new Error('Selection is required');
209
+ }
210
+ const selectParts = [];
211
+ // Analyze the selection
212
+ const mockLeft = this.createMockRow(this.leftSchema, this.leftAlias);
213
+ const mockRight = this.createMockRow(this.rightSchema, this.rightAlias);
214
+ const selectedFields = this.selection(mockLeft, mockRight);
215
+ // Process selection
216
+ for (const [key, value] of Object.entries(selectedFields)) {
217
+ if (typeof value === 'object' && value !== null && '__dbColumnName' in value) {
218
+ // FieldRef object
219
+ const tableAlias = value.__tableAlias || this.leftAlias;
220
+ selectParts.push(`"${tableAlias}"."${value.__dbColumnName}" as "${key}"`);
221
+ }
222
+ else if (typeof value === 'string') {
223
+ // Simple column reference
224
+ selectParts.push(`"${this.leftAlias}"."${value}" as "${key}"`);
225
+ }
226
+ else {
227
+ // Literal value
228
+ selectParts.push(`$${context.paramCounter++} as "${key}"`);
229
+ context.allParams.push(value);
230
+ }
231
+ }
232
+ // Build FROM clause
233
+ let fromClause = `FROM "${this.leftSchema.name}" AS "${this.leftAlias}"`;
234
+ // Add JOINs
235
+ for (const join of this.joins) {
236
+ const joinType = join.type === 'INNER' ? 'INNER JOIN' : 'LEFT JOIN';
237
+ // Build ON condition
238
+ const condBuilder = new conditions_1.ConditionBuilder();
239
+ const { sql: condSql, params: condParams } = condBuilder.build(join.condition, context.paramCounter);
240
+ context.paramCounter += condParams.length;
241
+ context.allParams.push(...condParams);
242
+ fromClause += `\n${joinType} "${join.table}" AS "${join.alias}" ON ${condSql}`;
243
+ }
244
+ // Build WHERE clause
245
+ let whereClause = '';
246
+ if (this.whereCond) {
247
+ const condBuilder = new conditions_1.ConditionBuilder();
248
+ const { sql, params } = condBuilder.build(this.whereCond, context.paramCounter);
249
+ whereClause = `WHERE ${sql}`;
250
+ context.paramCounter += params.length;
251
+ context.allParams.push(...params);
252
+ }
253
+ // Build ORDER BY clause
254
+ let orderByClause = '';
255
+ if (this.orderByFields.length > 0) {
256
+ const orderParts = this.orderByFields.map(({ table, field, direction }) => `"${table}"."${field}" ${direction}`);
257
+ orderByClause = `ORDER BY ${orderParts.join(', ')}`;
258
+ }
259
+ // Build LIMIT/OFFSET
260
+ let limitClause = '';
261
+ if (this.limitValue !== undefined) {
262
+ limitClause = `LIMIT ${this.limitValue}`;
263
+ }
264
+ if (this.offsetValue !== undefined) {
265
+ limitClause += ` OFFSET ${this.offsetValue}`;
266
+ }
267
+ const finalQuery = `SELECT ${selectParts.join(', ')}\n${fromClause}\n${whereClause}\n${orderByClause}\n${limitClause}`.trim();
268
+ return {
269
+ sql: finalQuery,
270
+ params: context.allParams,
271
+ };
272
+ }
273
+ }
274
+ exports.JoinQueryBuilder = JoinQueryBuilder;
275
+ //# sourceMappingURL=join-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"join-builder.js","sourceRoot":"","sources":["../../src/query/join-builder.ts"],"names":[],"mappings":"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"}