@iamkirbki/database-handler-core 4.3.0 → 4.4.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.
Files changed (135) hide show
  1. package/dist/abstract/Controller.d.ts +17 -0
  2. package/dist/abstract/Controller.d.ts.map +1 -0
  3. package/dist/abstract/Controller.js +47 -0
  4. package/dist/abstract/Model.d.ts +33 -19
  5. package/dist/abstract/Model.d.ts.map +1 -1
  6. package/dist/abstract/Model.js +177 -120
  7. package/dist/abstract/SchemaTableBuilder.d.ts +1 -1
  8. package/dist/abstract/SchemaTableBuilder.d.ts.map +1 -1
  9. package/dist/abstract/model/ModelRelation.d.ts +23 -0
  10. package/dist/abstract/model/ModelRelation.d.ts.map +1 -0
  11. package/dist/abstract/model/ModelRelation.js +130 -0
  12. package/dist/base/Query.d.ts +10 -13
  13. package/dist/base/Query.d.ts.map +1 -1
  14. package/dist/base/Query.js +68 -26
  15. package/dist/base/Record.d.ts +4 -2
  16. package/dist/base/Record.d.ts.map +1 -1
  17. package/dist/base/Record.js +24 -14
  18. package/dist/base/Table.d.ts +12 -7
  19. package/dist/base/Table.d.ts.map +1 -1
  20. package/dist/base/Table.js +87 -47
  21. package/dist/helpers/Errors/AdapterErrors/AdapterNotFoundError.d.ts +4 -0
  22. package/dist/helpers/Errors/AdapterErrors/AdapterNotFoundError.d.ts.map +1 -0
  23. package/dist/helpers/Errors/AdapterErrors/AdapterNotFoundError.js +6 -0
  24. package/dist/helpers/Errors/AdapterErrors/ConnectionFailedError.d.ts +4 -0
  25. package/dist/helpers/Errors/AdapterErrors/ConnectionFailedError.d.ts.map +1 -0
  26. package/dist/helpers/Errors/AdapterErrors/ConnectionFailedError.js +6 -0
  27. package/dist/helpers/Errors/AdapterErrors/NoDefaultAdapterError.d.ts +4 -0
  28. package/dist/helpers/Errors/AdapterErrors/NoDefaultAdapterError.d.ts.map +1 -0
  29. package/dist/helpers/Errors/AdapterErrors/NoDefaultAdapterError.js +6 -0
  30. package/dist/helpers/Errors/ExpressionErrors/InvalidExpressionParametersError.d.ts +4 -0
  31. package/dist/helpers/Errors/ExpressionErrors/InvalidExpressionParametersError.d.ts.map +1 -0
  32. package/dist/helpers/Errors/ExpressionErrors/InvalidExpressionParametersError.js +6 -0
  33. package/dist/helpers/Errors/ExpressionErrors/UnknownExpressionTypeError.d.ts +4 -0
  34. package/dist/helpers/Errors/ExpressionErrors/UnknownExpressionTypeError.d.ts.map +1 -0
  35. package/dist/helpers/Errors/ExpressionErrors/UnknownExpressionTypeError.js +6 -0
  36. package/dist/helpers/Errors/ExpressionErrors/UnsupportedQueryPhaseError.d.ts +4 -0
  37. package/dist/helpers/Errors/ExpressionErrors/UnsupportedQueryPhaseError.d.ts.map +1 -0
  38. package/dist/helpers/Errors/ExpressionErrors/UnsupportedQueryPhaseError.js +6 -0
  39. package/dist/helpers/Errors/QueryErrors/UnexpectedEmptyQueryError.d.ts +4 -0
  40. package/dist/helpers/Errors/QueryErrors/UnexpectedEmptyQueryError.d.ts.map +1 -0
  41. package/dist/helpers/Errors/QueryErrors/UnexpectedEmptyQueryError.js +6 -0
  42. package/dist/helpers/Errors/TableErrors/UnknownTableError.d.ts +4 -0
  43. package/dist/helpers/Errors/TableErrors/UnknownTableError.d.ts.map +1 -0
  44. package/dist/helpers/Errors/TableErrors/UnknownTableError.js +6 -0
  45. package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseDeleteQueryBuilder.d.ts +1 -0
  46. package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseDeleteQueryBuilder.d.ts.map +1 -0
  47. package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseDeleteQueryBuilder.js +1 -0
  48. package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseInsertQueryBuilder.d.ts +1 -0
  49. package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseInsertQueryBuilder.d.ts.map +1 -0
  50. package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseInsertQueryBuilder.js +11 -0
  51. package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseSelectQueryBuilder.d.ts +11 -0
  52. package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseSelectQueryBuilder.d.ts.map +1 -0
  53. package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseSelectQueryBuilder.js +27 -0
  54. package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseUpdateQueryBuilder.d.ts +1 -0
  55. package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseUpdateQueryBuilder.d.ts.map +1 -0
  56. package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseUpdateQueryBuilder.js +1 -0
  57. package/dist/helpers/QueryBuilders/ExpressionBuilders/JsonAggregateExpression.d.ts +9 -0
  58. package/dist/helpers/QueryBuilders/ExpressionBuilders/JsonAggregateExpression.d.ts.map +1 -0
  59. package/dist/helpers/QueryBuilders/ExpressionBuilders/JsonAggregateExpression.js +102 -0
  60. package/dist/helpers/QueryBuilders/ExpressionBuilders/SpatialDistanceExpression.d.ts +8 -0
  61. package/dist/helpers/QueryBuilders/ExpressionBuilders/SpatialDistanceExpression.d.ts.map +1 -0
  62. package/dist/helpers/QueryBuilders/ExpressionBuilders/SpatialDistanceExpression.js +63 -0
  63. package/dist/helpers/QueryBuilders/ExpressionBuilders/TextRelevanceExpression.d.ts +8 -0
  64. package/dist/helpers/QueryBuilders/ExpressionBuilders/TextRelevanceExpression.d.ts.map +1 -0
  65. package/dist/helpers/QueryBuilders/ExpressionBuilders/TextRelevanceExpression.js +49 -0
  66. package/dist/helpers/QueryBuilders/QueryDecorators/ExpressionDecorator.d.ts +19 -0
  67. package/dist/helpers/QueryBuilders/QueryDecorators/ExpressionDecorator.d.ts.map +1 -0
  68. package/dist/helpers/QueryBuilders/QueryDecorators/ExpressionDecorator.js +60 -0
  69. package/dist/helpers/QueryBuilders/QueryDecorators/GroupByDecorator.d.ts +9 -0
  70. package/dist/helpers/QueryBuilders/QueryDecorators/GroupByDecorator.d.ts.map +1 -0
  71. package/dist/helpers/QueryBuilders/QueryDecorators/GroupByDecorator.js +27 -0
  72. package/dist/helpers/QueryBuilders/QueryDecorators/JoinDecorator.d.ts +15 -0
  73. package/dist/helpers/QueryBuilders/QueryDecorators/JoinDecorator.d.ts.map +1 -0
  74. package/dist/helpers/QueryBuilders/QueryDecorators/JoinDecorator.js +74 -0
  75. package/dist/helpers/QueryBuilders/QueryDecorators/LimitDecorator.d.ts +10 -0
  76. package/dist/helpers/QueryBuilders/QueryDecorators/LimitDecorator.d.ts.map +1 -0
  77. package/dist/helpers/QueryBuilders/QueryDecorators/LimitDecorator.js +29 -0
  78. package/dist/helpers/QueryBuilders/QueryDecorators/OrderByDecorator.d.ts +9 -0
  79. package/dist/helpers/QueryBuilders/QueryDecorators/OrderByDecorator.d.ts.map +1 -0
  80. package/dist/helpers/QueryBuilders/QueryDecorators/OrderByDecorator.js +27 -0
  81. package/dist/helpers/QueryBuilders/QueryDecorators/QueryDecorator.d.ts +8 -0
  82. package/dist/helpers/QueryBuilders/QueryDecorators/QueryDecorator.d.ts.map +1 -0
  83. package/dist/helpers/QueryBuilders/QueryDecorators/QueryDecorator.js +5 -0
  84. package/dist/helpers/QueryBuilders/QueryDecorators/ValuesDecorator.d.ts +1 -0
  85. package/dist/helpers/QueryBuilders/QueryDecorators/ValuesDecorator.d.ts.map +1 -0
  86. package/dist/helpers/QueryBuilders/QueryDecorators/ValuesDecorator.js +17 -0
  87. package/dist/helpers/QueryBuilders/QueryDecorators/WhereDecorator.d.ts +9 -0
  88. package/dist/helpers/QueryBuilders/QueryDecorators/WhereDecorator.d.ts.map +1 -0
  89. package/dist/helpers/QueryBuilders/QueryDecorators/WhereDecorator.js +29 -0
  90. package/dist/helpers/QueryBuilders/QueryExpressionBuilder.d.ts +54 -0
  91. package/dist/helpers/QueryBuilders/QueryExpressionBuilder.d.ts.map +1 -0
  92. package/dist/helpers/QueryBuilders/QueryExpressionBuilder.js +102 -0
  93. package/dist/helpers/QueryBuilders/QueryStatementBuilder.d.ts +16 -0
  94. package/dist/helpers/QueryBuilders/QueryStatementBuilder.d.ts.map +1 -0
  95. package/dist/helpers/QueryBuilders/QueryStatementBuilder.js +169 -0
  96. package/dist/helpers/QueryBuilders/SqlRenderer.d.ts +15 -0
  97. package/dist/helpers/QueryBuilders/SqlRenderer.d.ts.map +1 -0
  98. package/dist/helpers/QueryBuilders/SqlRenderer.js +79 -0
  99. package/dist/helpers/QueryBuilders/oldQueryStatementBuilder.d.ts +160 -0
  100. package/dist/helpers/QueryBuilders/oldQueryStatementBuilder.d.ts.map +1 -0
  101. package/dist/helpers/QueryBuilders/oldQueryStatementBuilder.js +217 -0
  102. package/dist/interfaces/IExpressionBuilder.d.ts +7 -0
  103. package/dist/interfaces/IExpressionBuilder.d.ts.map +1 -0
  104. package/dist/interfaces/IExpressionBuilder.js +1 -0
  105. package/dist/interfaces/IQueryBuilder.d.ts +5 -0
  106. package/dist/interfaces/IQueryBuilder.d.ts.map +1 -0
  107. package/dist/interfaces/IQueryBuilder.js +1 -0
  108. package/dist/interfaces/ISchemaBuilder.d.ts +1 -1
  109. package/dist/interfaces/ISchemaBuilder.d.ts.map +1 -1
  110. package/dist/runtime/Container.d.ts +3 -0
  111. package/dist/runtime/Container.d.ts.map +1 -1
  112. package/dist/runtime/Container.js +12 -2
  113. package/dist/runtime/QueryCache.d.ts +12 -0
  114. package/dist/runtime/QueryCache.d.ts.map +1 -0
  115. package/dist/runtime/QueryCache.js +26 -0
  116. package/dist/runtime/Repository.d.ts +13 -7
  117. package/dist/runtime/Repository.d.ts.map +1 -1
  118. package/dist/runtime/Repository.js +114 -70
  119. package/dist/types/expressions.d.ts +154 -0
  120. package/dist/types/expressions.d.ts.map +1 -0
  121. package/dist/types/expressions.js +6 -0
  122. package/dist/types/factories.d.ts +7 -0
  123. package/dist/types/factories.d.ts.map +1 -0
  124. package/dist/types/factories.js +1 -0
  125. package/dist/types/index.d.ts +2 -0
  126. package/dist/types/index.d.ts.map +1 -1
  127. package/dist/types/index.js +2 -0
  128. package/dist/types/model.d.ts +8 -8
  129. package/dist/types/model.d.ts.map +1 -1
  130. package/dist/types/query.d.ts +63 -1
  131. package/dist/types/query.d.ts.map +1 -1
  132. package/package.json +11 -3
  133. package/dist/helpers/QueryStatementBuilder.d.ts +0 -304
  134. package/dist/helpers/QueryStatementBuilder.d.ts.map +0 -1
  135. package/dist/helpers/QueryStatementBuilder.js +0 -417
@@ -7,25 +7,30 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
7
7
  step((generator = generator.apply(thisArg, _arguments || [])).next());
8
8
  });
9
9
  };
10
- import Query from "../base/Query.js";
11
10
  import Table from "../base/Table.js";
12
11
  class Repository {
13
- constructor(tableName, ModelClass, customDatabaseAdapter) {
12
+ constructor(tableName, ModelClass, customDatabaseAdapter, tableFactory = (name, adapter) => new Table(name, adapter)) {
14
13
  var _a;
15
14
  this.models = new Map();
16
15
  this.manyToManyRelations = new Map();
17
16
  const modelPk = ((_a = ModelClass.primaryKey) === null || _a === void 0 ? void 0 : _a.toString()) || ModelClass.constructor.name;
18
17
  this.models.set(modelPk, ModelClass);
19
- this.Table = new Table(tableName, customDatabaseAdapter);
20
- }
21
- static getInstance(ModelClass, tableName, customDatabaseAdapter) {
22
- const className = ModelClass.name;
23
- if (!this._instances.has(className)) {
24
- const instance = new Repository(tableName, new ModelClass(), customDatabaseAdapter);
25
- this._instances.set(className, instance);
18
+ this.tableFactory = tableFactory;
19
+ this.Table = this.tableFactory(tableName, customDatabaseAdapter);
20
+ this.customDatabaseAdapter = customDatabaseAdapter;
21
+ }
22
+ static getInstance(ModelClass, tableName, customDatabaseAdapter, tableFactory) {
23
+ // Use tableName as key to differentiate instances for different tables
24
+ const key = tableName || ModelClass.name;
25
+ if (!this._instances.has(key)) {
26
+ const instance = new Repository(tableName, new ModelClass(), customDatabaseAdapter, tableFactory);
27
+ this._instances.set(key, instance);
26
28
  return instance;
27
29
  }
28
- return this._instances.get(className);
30
+ return this._instances.get(key);
31
+ }
32
+ static clearInstances() {
33
+ this._instances.clear();
29
34
  }
30
35
  generatePivotTableKeys(foreignKey, modelOfOrigin, relation) {
31
36
  var _a;
@@ -37,14 +42,14 @@ class Repository {
37
42
  }
38
43
  insertRecordIntoPivotTable(foreignKey, modelOfOrigin, relation) {
39
44
  return __awaiter(this, void 0, void 0, function* () {
40
- const table = new Table(relation.pivotTable);
45
+ const table = this.tableFactory(relation.pivotTable, this.customDatabaseAdapter);
41
46
  yield table.Insert(this.generatePivotTableKeys(foreignKey, modelOfOrigin, relation));
42
47
  });
43
48
  }
44
49
  deleteRecordFromPivotTable(foreignKey, modelOfOrigin, relation) {
45
50
  return __awaiter(this, void 0, void 0, function* () {
46
- const table = new Table(relation.pivotTable);
47
- const record = yield table.Record(this.generatePivotTableKeys(foreignKey, modelOfOrigin, relation));
51
+ const table = this.tableFactory(relation.pivotTable, this.customDatabaseAdapter);
52
+ const record = yield table.Record({ base: { where: this.generatePivotTableKeys(foreignKey, modelOfOrigin, relation) } });
48
53
  yield (record === null || record === void 0 ? void 0 : record.Delete());
49
54
  });
50
55
  }
@@ -64,7 +69,7 @@ class Repository {
64
69
  }
65
70
  doesTableExist(name) {
66
71
  return __awaiter(this, void 0, void 0, function* () {
67
- const table = new Table(name);
72
+ const table = this.tableFactory(name, this.customDatabaseAdapter);
68
73
  return yield table.exists();
69
74
  });
70
75
  }
@@ -81,95 +86,134 @@ class Repository {
81
86
  yield this.Table.Insert(attributes);
82
87
  });
83
88
  }
84
- first(conditions, Model) {
89
+ first(queryLayers, Model) {
85
90
  return __awaiter(this, void 0, void 0, function* () {
86
91
  let record;
87
92
  if (Model.JoinedEntities.length > 0) {
88
- const results = yield this.join(Model, conditions, { limit: 1 });
89
- record = results[0] ? { values: results[0] } : undefined;
93
+ const result = (yield this.join(Model, Object.assign(Object.assign({}, queryLayers), { final: Object.assign(Object.assign({}, queryLayers.final), { limit: 1 }) })))[0];
94
+ record = result ? { values: result } : undefined;
90
95
  }
91
96
  else {
92
- record = yield this.Table.Record({ where: conditions });
97
+ record = yield this.Table.Record(queryLayers);
93
98
  }
94
- return record ? record.values : null;
99
+ return record === null || record === void 0 ? void 0 : record.values;
95
100
  });
96
101
  }
97
- get(conditions, queryOptions, Model) {
102
+ get(QueryLayers, Model) {
98
103
  return __awaiter(this, void 0, void 0, function* () {
99
104
  if (Model.JoinedEntities.length > 0) {
100
- return yield this.join(Model, conditions, queryOptions);
105
+ return yield this.join(Model, QueryLayers);
101
106
  }
102
107
  else {
103
- const records = yield this.Table.Records(Object.assign({ where: conditions }, queryOptions));
108
+ const records = yield this.Table.Records(QueryLayers);
104
109
  return records.map(record => record.values);
105
110
  }
106
111
  });
107
112
  }
108
- all(Model, queryscopes, queryOptions) {
113
+ all(Model, QueryLayers) {
109
114
  return __awaiter(this, void 0, void 0, function* () {
110
- if (Model.JoinedEntities.length > 0) {
111
- return yield this.join(Model);
112
- }
113
- else {
114
- const records = yield this.Table.Records(Object.assign({ where: queryscopes }, queryOptions));
115
- return records.map(record => record.values);
116
- }
115
+ return this.get(QueryLayers, Model);
117
116
  });
118
117
  }
119
118
  update(primaryKey, newAttributes) {
120
119
  return __awaiter(this, void 0, void 0, function* () {
121
- const record = yield this.Table.Record({ where: primaryKey });
120
+ const record = yield this.Table.Record({ base: { where: primaryKey } });
122
121
  if (record) {
123
122
  return yield record.Update(newAttributes, primaryKey);
124
123
  }
125
124
  });
126
125
  }
127
- join(Model, conditions, queryOptions) {
126
+ join(Model, queryLayers) {
128
127
  return __awaiter(this, void 0, void 0, function* () {
129
- const Join = Model.JoinedEntities.flatMap(join => {
130
- const relation = Model.Relations.find(rel => rel.model.Configuration.table.replace("_", "").toLowerCase() === join.relation.toLowerCase());
131
- if (join.queryScopes) {
132
- conditions = this.mergeQueryWhereConditions(conditions || {}, join.queryScopes);
133
- }
134
- if (!relation) {
135
- throw new Error(`Relation for joined entity ${join} not found.`);
136
- }
137
- if (relation.type === 'manyToMany') {
138
- return [
139
- {
140
- fromTable: relation.pivotTable,
141
- baseTable: Model.Configuration.table,
142
- joinType: 'INNER',
143
- on: [
144
- { [relation.pivotForeignKey]: relation.localKey }
145
- ]
146
- },
147
- {
148
- fromTable: relation.model.Configuration.table,
149
- baseTable: relation.pivotTable,
150
- joinType: 'INNER',
151
- on: [
152
- { [relation.foreignKey]: relation.pivotLocalKey }
153
- ]
154
- }
155
- ];
156
- }
157
- const JoinType = relation.type === 'hasOne' || relation.type === 'belongsTo' ? 'INNER' : 'LEFT';
158
- return [{
128
+ const { joins, queryLayers: nextLayers } = this.buildJoinObject(Model, queryLayers);
129
+ nextLayers.base.joins = joins;
130
+ const records = yield this.Table.Join(nextLayers);
131
+ return records.map(record => record.values);
132
+ });
133
+ }
134
+ toSql(queryLayers, Model) {
135
+ return __awaiter(this, void 0, void 0, function* () {
136
+ let nextLayers = queryLayers;
137
+ if (Model.JoinedEntities.length > 0) {
138
+ const result = this.buildJoinObject(Model, queryLayers);
139
+ nextLayers = result.queryLayers;
140
+ nextLayers.base.joins = result.joins;
141
+ }
142
+ return this.Table.toSql(nextLayers);
143
+ });
144
+ }
145
+ buildJoinObject(Model, inputLayers) {
146
+ var _a;
147
+ const queryLayers = Object.assign(Object.assign({}, inputLayers), { base: Object.assign(Object.assign({}, inputLayers.base), { where: Object.assign({}, ((_a = inputLayers.base.where) !== null && _a !== void 0 ? _a : {})) }), final: inputLayers.final
148
+ ? Object.assign({}, inputLayers.final) : undefined });
149
+ const joins = Model.JoinedEntities.flatMap(join => {
150
+ var _a, _b;
151
+ var _c;
152
+ const relation = Model.Relations.find(rel => rel.model.Configuration.table
153
+ .replace("_", "")
154
+ .toLowerCase() === join.relation.toLowerCase());
155
+ if (!relation) {
156
+ throw new Error(`Relation for joined entity ${join.relation} not found.`);
157
+ }
158
+ if (join.queryScopes && queryLayers.base.where) {
159
+ queryLayers.base.where = this.mergeQueryWhereConditions(queryLayers.base.where, join.queryScopes);
160
+ }
161
+ else {
162
+ queryLayers.base.where = join.queryScopes;
163
+ }
164
+ if (relation.type !== 'manyToMany') {
165
+ const joinType = relation.type === 'hasOne' || relation.type === 'belongsTo'
166
+ ? 'INNER'
167
+ : 'LEFT';
168
+ const [baseTable, baseKey] = relation.localKey.includes('.')
169
+ ? relation.localKey.split('.')
170
+ : [Model.Configuration.table, relation.localKey];
171
+ return [
172
+ {
159
173
  fromTable: relation.model.Configuration.table,
160
- baseTable: Model.Configuration.table,
161
- joinType: JoinType,
174
+ baseTable,
175
+ joinType,
162
176
  on: [
163
- { [relation.foreignKey]: relation.localKey }
177
+ { [relation.foreignKey]: baseKey }
164
178
  ]
165
- }];
166
- });
167
- const records = yield this.Table.Join(Join, Object.assign({ where: conditions }, queryOptions));
168
- return records.map(record => record.values);
179
+ }
180
+ ];
181
+ }
182
+ // many to many
183
+ (_a = queryLayers.final) !== null && _a !== void 0 ? _a : (queryLayers.final = {});
184
+ (_b = (_c = queryLayers.final).blacklistTables) !== null && _b !== void 0 ? _b : (_c.blacklistTables = []);
185
+ queryLayers.final.blacklistTables = [
186
+ ...queryLayers.final.blacklistTables,
187
+ relation.pivotTable
188
+ ];
189
+ return [
190
+ {
191
+ fromTable: relation.pivotTable,
192
+ baseTable: Model.Configuration.table,
193
+ joinType: 'INNER',
194
+ on: [
195
+ { [relation.pivotForeignKey]: relation.localKey }
196
+ ]
197
+ },
198
+ {
199
+ fromTable: relation.model.Configuration.table,
200
+ baseTable: relation.pivotTable,
201
+ joinType: 'INNER',
202
+ on: [
203
+ { [relation.foreignKey]: relation.pivotLocalKey }
204
+ ]
205
+ }
206
+ ];
169
207
  });
208
+ return { joins, queryLayers };
170
209
  }
171
210
  mergeQueryWhereConditions(base, additional) {
172
- return [...Query.ConvertParamsToArray(base), ...Query.ConvertParamsToArray(additional)];
211
+ const query = this.Table.QueryHelperObject;
212
+ return [...query.ConvertParamsToArray(base), ...query.ConvertParamsToArray(additional)];
213
+ }
214
+ ConvertParamsToArray(params) {
215
+ const query = this.Table.QueryHelperObject;
216
+ return query.ConvertParamsToArray(params);
173
217
  }
174
218
  }
175
219
  Repository._instances = new Map();
@@ -0,0 +1,154 @@
1
+ import { OrderByDefinition, QueryWhereCondition } from "../types/index.js";
2
+ export type expressionClause = {
3
+ /**
4
+ * SQL fragment that produces the expression value.
5
+ * Must include an alias if it needs to be referenced later.
6
+ *
7
+ * Example:
8
+ * 6371 * acos(...) AS distance
9
+ */
10
+ baseExpressionClause: string;
11
+ /**
12
+ * Determines *where* in the query lifecycle this expression is evaluated.
13
+ *
14
+ * - base: Can live directly in SELECT
15
+ * - projection: Must be computed in a subquery
16
+ */
17
+ phase?: QueryEvaluationPhase;
18
+ /**
19
+ * Signals that this expression cannot safely exist in the same
20
+ * SELECT level where it is filtered or ordered on.
21
+ *
22
+ * This is the “SQL is dumb, wrap it” flag.
23
+ */
24
+ requiresWrapping?: boolean;
25
+ selectClause?: string;
26
+ /**
27
+ * ORDER BY fragment derived from the expression.
28
+ *
29
+ * Example:
30
+ * distance ASC
31
+ */
32
+ orderByClause?: OrderByDefinition;
33
+ whereClause?: QueryWhereCondition;
34
+ valueClauseKeywords?: string[];
35
+ groupByClause?: string;
36
+ havingClause?: QueryWhereCondition;
37
+ };
38
+ /**
39
+ * Generic function signature for expression builders.
40
+ *
41
+ * Each builder:
42
+ * - receives a strongly-typed expression definition
43
+ * - returns a normalized expressionClause
44
+ */
45
+ export type ExpressionBuilderFunction<T extends PossibleExpressions = PossibleExpressions> = (expression: T) => expressionClause;
46
+ export type QueryExpression<T extends string = string> = {
47
+ type: T;
48
+ requirements: QueryExpressionRequirements;
49
+ };
50
+ export type PossibleExpressions = SpatialQueryExpression | TextRelevanceQueryExpression | JsonAggregateQueryExpression;
51
+ export type ComputedExpression<T extends string = string> = {
52
+ type: T;
53
+ };
54
+ export type PossibleComputedExpressions = SpatialComputedExpression | TextRelevanceComputedExpression;
55
+ export type QueryExpressionRequirements = {
56
+ phase: QueryEvaluationPhase;
57
+ cardinality: 'row' | 'aggregate';
58
+ select?: string;
59
+ where?: QueryWhereCondition;
60
+ having?: QueryWhereCondition;
61
+ orderBy?: string;
62
+ requiresAlias: boolean;
63
+ requiresSelectWrapping: boolean;
64
+ };
65
+ export type QueryShape = {
66
+ kind: 'flat';
67
+ } | {
68
+ kind: 'wrapped';
69
+ reason: 'projection-expressions';
70
+ };
71
+ export type SpatialDistanceDefinition = {
72
+ referencePoint: SpatialPoint;
73
+ targetColumns: SpatialPointColumns;
74
+ unit: 'km' | 'miles';
75
+ earthRadius?: number;
76
+ alias: string;
77
+ valueClauseKeywords: string[];
78
+ where?: QueryWhereCondition;
79
+ maxDistance: number;
80
+ orderByDistance?: 'ASC' | 'DESC';
81
+ isComputed?: boolean;
82
+ };
83
+ export type SpatialQueryExpression = QueryExpression<'spatialDistance'> & {
84
+ parameters: SpatialDistanceDefinition;
85
+ };
86
+ export type SpatialComputedExpression = ComputedExpression<'spatialDistance'> & {
87
+ parameters: SpatialDistanceDefinition;
88
+ };
89
+ export type SpatialPointColumns = {
90
+ lat: string;
91
+ lon: string;
92
+ };
93
+ export type SpatialPoint = {
94
+ lat: number;
95
+ lon: number;
96
+ };
97
+ export type TextRelevanceDefinition = {
98
+ targetColumns: string[];
99
+ searchTerm: string;
100
+ alias: string;
101
+ where?: QueryWhereCondition;
102
+ valueClauseKeywords: string[];
103
+ minimumRelevance?: number;
104
+ orderByRelevance?: 'ASC' | 'DESC';
105
+ };
106
+ export type TextRelevanceQueryExpression = QueryExpression<'textRelevance'> & {
107
+ parameters: TextRelevanceDefinition;
108
+ };
109
+ export type TextRelevanceComputedExpression = ComputedExpression<'textRelevance'> & {
110
+ parameters: TextRelevanceDefinition;
111
+ };
112
+ export type JsonAggregateDefinition<Tables extends string = string> = {
113
+ /** Table this aggregate is built from */
114
+ table: Tables;
115
+ /** Columns selected from this table */
116
+ columns: string[];
117
+ nonTableColumns?: string[];
118
+ /** GROUP BY columns required for this level */
119
+ groupByColumns: string[];
120
+ /** Alias of this JSON object / array */
121
+ alias: string;
122
+ /** Computed expressions */
123
+ computed?: PossibleComputedExpressions[];
124
+ /** Having clause */
125
+ having?: QueryWhereCondition;
126
+ /** Nested JSON objects or arrays */
127
+ nested?: NestedJsonAggregateDefinition<Tables>[];
128
+ };
129
+ export type NestedJsonAggregateDefinition<Tables extends string = string> = {
130
+ /** Table this aggregate is built from */
131
+ table: Tables;
132
+ /** Columns selected from this table */
133
+ columns: string[];
134
+ nonTableColumns?: string[];
135
+ /** Alias of this JSON object / array */
136
+ alias: string;
137
+ /** Computed expressions */
138
+ computed?: PossibleComputedExpressions[];
139
+ /** Having clause */
140
+ having?: QueryWhereCondition;
141
+ /** Nested JSON objects or arrays */
142
+ nested?: NestedJsonAggregateDefinition<Tables>[];
143
+ };
144
+ export type JsonAggregateQueryExpression = QueryExpression<'jsonAggregate'> & {
145
+ parameters: JsonAggregateDefinition;
146
+ };
147
+ export declare enum QueryEvaluationPhase {
148
+ BASE = "base",
149
+ PROJECTION = "projection",
150
+ LATERAL = "lateral"
151
+ }
152
+ export type PossibleBaseExpressions = SpatialQueryExpression | TextRelevanceQueryExpression;
153
+ export type PossiblePrettyExpressions = JsonAggregateQueryExpression;
154
+ //# sourceMappingURL=expressions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expressions.d.ts","sourceRoot":"","sources":["../../src/types/expressions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAE9E,MAAM,MAAM,gBAAgB,GAAG;IAC3B;;;;;;OAMG;IACH,oBAAoB,EAAE,MAAM,CAAC;IAE7B;;;;;OAKG;IACH,KAAK,CAAC,EAAE,oBAAoB,CAAC;IAE7B;;;;;OAKG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,iBAAiB,CAAC;IAElC,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAElC,mBAAmB,CAAC,EAAE,MAAM,EAAE,CAAC;IAE/B,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,YAAY,CAAC,EAAE,mBAAmB,CAAC;CACtC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,MAAM,yBAAyB,CAAC,CAAC,SAAS,mBAAmB,GAAG,mBAAmB,IAErF,CAAC,UAAU,EAAE,CAAC,KAAK,gBAAgB,CAAC;AAIxC,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI;IACrD,IAAI,EAAE,CAAC,CAAC;IACR,YAAY,EAAE,2BAA2B,CAAC;CAC7C,CAAC;AAGF,MAAM,MAAM,mBAAmB,GAC3B,sBAAsB,GACtB,4BAA4B,GAC5B,4BAA4B,CAAC;AAEjC,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,IAAI;IACxD,IAAI,EAAE,CAAC,CAAC;CACX,CAAA;AAED,MAAM,MAAM,2BAA2B,GACnC,yBAAyB,GACzB,+BAA+B,CAAC;AAEpC,MAAM,MAAM,2BAA2B,GAAG;IACtC,KAAK,EAAE,oBAAoB,CAAC;IAE5B,WAAW,EAAE,KAAK,GAAG,WAAW,CAAC;IAEjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,aAAa,EAAE,OAAO,CAAC;IACvB,sBAAsB,EAAE,OAAO,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,UAAU,GAChB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAChB;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,wBAAwB,CAAA;CAAE,CAAC;AAE5D,MAAM,MAAM,yBAAyB,GAAG;IACpC,cAAc,EAAE,YAAY,CAAC;IAE7B,aAAa,EAAE,mBAAmB,CAAC;IAEnC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IAEd,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAC9B,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAE5B,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,sBAAsB,GAAG,eAAe,CAAC,iBAAiB,CAAC,GAAG;IACtE,UAAU,EAAE,yBAAyB,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG,kBAAkB,CAAC,iBAAiB,CAAC,GAAG;IAC5E,UAAU,EAAE,yBAAyB,CAAC;CACzC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IAClC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IAEnB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,mBAAmB,CAAC;IAC5B,mBAAmB,EAAE,MAAM,EAAE,CAAC;IAE9B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,gBAAgB,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;CACrC,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG,eAAe,CAAC,eAAe,CAAC,GAAG;IAC1E,UAAU,EAAE,uBAAuB,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,+BAA+B,GAAG,kBAAkB,CAAC,eAAe,CAAC,GAAG;IAChF,UAAU,EAAE,uBAAuB,CAAC;CACvC,CAAC;AAEF,MAAM,MAAM,uBAAuB,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM,IAAI;IAClE,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IAEd,uCAAuC;IACvC,OAAO,EAAE,MAAM,EAAE,CAAC;IAElB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAE3B,+CAA+C;IAC/C,cAAc,EAAE,MAAM,EAAE,CAAC;IAEzB,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IAEd,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,2BAA2B,EAAE,CAAC;IAEzC,oBAAoB;IACpB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAE7B,oCAAoC;IACpC,MAAM,CAAC,EAAE,6BAA6B,CAAC,MAAM,CAAC,EAAE,CAAC;CACpD,CAAC;AAEF,MAAM,MAAM,6BAA6B,CAAC,MAAM,SAAS,MAAM,GAAG,MAAM,IAAI;IACxE,yCAAyC;IACzC,KAAK,EAAE,MAAM,CAAC;IAEd,uCAAuC;IACvC,OAAO,EAAE,MAAM,EAAE,CAAC;IAElB,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAE3B,wCAAwC;IACxC,KAAK,EAAE,MAAM,CAAC;IAEd,2BAA2B;IAC3B,QAAQ,CAAC,EAAE,2BAA2B,EAAE,CAAC;IAEzC,oBAAoB;IACpB,MAAM,CAAC,EAAE,mBAAmB,CAAC;IAE7B,oCAAoC;IACpC,MAAM,CAAC,EAAE,6BAA6B,CAAC,MAAM,CAAC,EAAE,CAAC;CACpD,CAAA;AAED,MAAM,MAAM,4BAA4B,GAAG,eAAe,CAAC,eAAe,CAAC,GAAG;IAC1E,UAAU,EAAE,uBAAuB,CAAC;CACvC,CAAC;AAEF,oBAAY,oBAAoB;IAC5B,IAAI,SAAS;IACb,UAAU,eAAe;IACzB,OAAO,YAAY;CACtB;AAED,MAAM,MAAM,uBAAuB,GAC/B,sBAAsB,GACtB,4BAA4B,CAAC;AAEjC,MAAM,MAAM,yBAAyB,GACjC,4BAA4B,CAAC"}
@@ -0,0 +1,6 @@
1
+ export var QueryEvaluationPhase;
2
+ (function (QueryEvaluationPhase) {
3
+ QueryEvaluationPhase["BASE"] = "base";
4
+ QueryEvaluationPhase["PROJECTION"] = "projection";
5
+ QueryEvaluationPhase["LATERAL"] = "lateral";
6
+ })(QueryEvaluationPhase || (QueryEvaluationPhase = {}));
@@ -0,0 +1,7 @@
1
+ import type Table from "../base/Table.js";
2
+ import type { columnType, Model, Query, QueryConstructorType, Record, Repository } from "../index.js";
3
+ export type TableFactory = (name: string, adapter?: string) => Table;
4
+ export type QueryFactory = (config: QueryConstructorType) => Query;
5
+ export type RecordFactory = <T extends columnType>(table: string, values: T, adapter?: string, queryFactory?: QueryFactory, recordFactory?: RecordFactory) => Record<T>;
6
+ export type RepositoryFactory<ModelType extends columnType> = (model: Model<ModelType>) => Repository<ModelType, Model<ModelType>>;
7
+ //# sourceMappingURL=factories.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factories.d.ts","sourceRoot":"","sources":["../../src/types/factories.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,qBAAqB,CAAC;AAC7C,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEzG,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,KAAK,KAAK,CAAC;AACrE,MAAM,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,oBAAoB,KAAK,KAAK,CAAC;AACnE,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,SAAS,UAAU,EAC7C,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,CAAC,EACT,OAAO,CAAC,EAAE,MAAM,EAChB,YAAY,CAAC,EAAE,YAAY,EAC3B,aAAa,CAAC,EAAE,aAAa,KAC5B,MAAM,CAAC,CAAC,CAAC,CAAC;AAEf,MAAM,MAAM,iBAAiB,CAAC,SAAS,SAAS,UAAU,IAAI,CAC1D,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,KACtB,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -4,4 +4,6 @@ export type RequireAtLeastOne<T, Keys extends keyof T = keyof T> = Pick<T, Exclu
4
4
  export * from './query.js';
5
5
  export * from './table.js';
6
6
  export * from './model.js';
7
+ export * from './factories.js';
8
+ export * from './expressions.js';
7
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,iBAAiB,CAAC,CAAC,EAAE,IAAI,SAAS,MAAM,CAAC,GAAG,MAAM,CAAC,IAC3D,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,GAC7B;KACG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;CAC3E,CAAC,IAAI,CAAC,CAAA;AAEX,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,iBAAiB,CAAC,CAAC,EAAE,IAAI,SAAS,MAAM,CAAC,GAAG,MAAM,CAAC,IAC3D,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,GAC7B;KACG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;CAC3E,CAAC,IAAI,CAAC,CAAA;AAEX,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,kBAAkB,CAAC"}
@@ -4,3 +4,5 @@
4
4
  export * from './query.js';
5
5
  export * from './table.js';
6
6
  export * from './model.js';
7
+ export * from './factories.js';
8
+ export * from './expressions.js';
@@ -3,7 +3,7 @@ import Model from "../abstract/Model";
3
3
  import { columnType, QueryWhereCondition } from "./index";
4
4
  export type ModelEventType = 'retrieved' | 'creating' | 'created' | 'updating' | 'updated' | 'saving' | 'saved' | 'deleting' | 'deleted' | 'restoring' | 'restored' | 'forceDeleting' | 'forceDeleted';
5
5
  export type ModelEventHandler<T> = (model: T) => void | Promise<void>;
6
- export interface ModelObserver<T> {
6
+ export type ModelObserver<T> = {
7
7
  retrieved?(model: T): void | Promise<void>;
8
8
  creating?(model: T): void | Promise<void>;
9
9
  created?(model: T): void | Promise<void>;
@@ -17,11 +17,11 @@ export interface ModelObserver<T> {
17
17
  restored?(model: T): void | Promise<void>;
18
18
  forceDeleting?(model: T): void | Promise<void>;
19
19
  forceDeleted?(model: T): void | Promise<void>;
20
- }
21
- export interface ModelScope {
20
+ };
21
+ export type ModelScope = {
22
22
  (query: any): void;
23
- }
24
- export interface ModelConfig {
23
+ };
24
+ export type ModelConfig = {
25
25
  /** Table name - defaults to lowercase class name */
26
26
  table: string;
27
27
  /** Custom adapter name - defaults to default name */
@@ -56,7 +56,7 @@ export interface ModelConfig {
56
56
  attributes?: Record<string, any>;
57
57
  /** Date format for serialization */
58
58
  dateFormat?: string;
59
- }
59
+ };
60
60
  export type relation = {
61
61
  type: 'hasOne' | 'hasMany' | 'belongsTo' | 'manyToMany';
62
62
  model: unknown & Model<columnType>;
@@ -66,9 +66,9 @@ export type relation = {
66
66
  pivotForeignKey?: string;
67
67
  pivotLocalKey?: string;
68
68
  };
69
- export interface SoftDeletable {
69
+ export type SoftDeletable = {
70
70
  deleted_at?: string | Date | null;
71
- }
71
+ };
72
72
  export type ModelWithTimestamps = {
73
73
  created_at?: string | number | Date;
74
74
  updated_at?: string | number | Date;
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/types/model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/types/model.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { expressionClause, Join, PossibleBaseExpressions, PossibleExpressions, PossiblePrettyExpressions, RecordFactory } from "../index.js";
1
2
  export type QueryIsEqualParameter = {
2
3
  [key: string]: QueryValues;
3
4
  };
@@ -13,7 +14,68 @@ export type DefaultQueryParameters = {
13
14
  where?: QueryWhereCondition;
14
15
  };
15
16
  export type ExtraQueryParameters = {
16
- orderBy?: string;
17
+ orderBy?: OrderByDefinition[];
18
+ limit?: number;
19
+ offset?: number;
20
+ groupBy?: string[];
21
+ expressions?: PossibleExpressions[];
22
+ blacklistTables?: string[];
23
+ };
24
+ export type QueryConstructorType = {
25
+ tableName: string;
26
+ query?: string;
27
+ parameters?: QueryWhereCondition;
28
+ adapterName?: string;
29
+ recordFactory?: RecordFactory;
30
+ };
31
+ export type QueryLayers = {
32
+ base: BaseQueryOptions;
33
+ pretty?: PrettyQueryOptions;
34
+ final?: FinalQueryOptions;
35
+ };
36
+ export type BaseQueryOptions = {
37
+ from?: string;
38
+ joins?: Join[];
39
+ where?: QueryWhereCondition;
40
+ orderBy?: OrderByDefinition[];
41
+ expressions?: PossibleBaseExpressions[];
42
+ select?: string[];
43
+ joinsSelect?: string[];
44
+ expressionsSelect?: string[];
45
+ };
46
+ export type PrettyQueryOptions = {
47
+ expressions?: PossiblePrettyExpressions[];
48
+ groupBy?: string[];
49
+ having?: QueryComparisonParameters[];
50
+ where?: QueryComparisonParameters[];
51
+ select?: string[];
52
+ };
53
+ export type FinalQueryOptions = {
54
+ orderBy?: OrderByDefinition[];
55
+ limit?: number;
56
+ offset?: number;
57
+ blacklistTables?: string[];
58
+ select?: string[];
59
+ groupBy?: string[];
60
+ };
61
+ export type OrderByDirection = 'ASC' | 'DESC';
62
+ export type OrderByDefinition = {
63
+ column: string;
64
+ direction: OrderByDirection;
65
+ };
66
+ export type QueryContext = {
67
+ from?: string;
68
+ select?: string[];
69
+ joinsSelect?: string[];
70
+ expressionSelect?: string[];
71
+ joins?: string[];
72
+ conditions?: {
73
+ where?: QueryComparisonParameters[];
74
+ having?: QueryComparisonParameters[];
75
+ };
76
+ expressions?: expressionClause[];
77
+ groupBy?: string[];
78
+ orderBy?: OrderByDefinition[];
17
79
  limit?: number;
18
80
  offset?: number;
19
81
  };
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/types/query.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG;IAChC,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,yBAAyB,GAAG;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,GAAG,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,GAAG,QAAQ,CAAC;IAC1E,KAAK,EAAE,WAAW,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG,qBAAqB,GAAG,yBAAyB,EAAE,CAAC;AAEtF,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;AAE3E,MAAM,MAAM,sBAAsB,GAAG;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,mBAAmB,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/types/query.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iamkirbki/database-handler-core",
3
- "version": "4.3.0",
3
+ "version": "4.4.0",
4
4
  "author": "iamkirbki",
5
5
  "description": "Core database abstractions and interfaces",
6
6
  "license": "ISC",
@@ -23,11 +23,19 @@
23
23
  "directory": "packages/core"
24
24
  },
25
25
  "scripts": {
26
- "build": "tsc --build && tsc-alias"
26
+ "build": "tsc --build && tsc-alias",
27
+ "test": "vitest run",
28
+ "test:watch": "vitest",
29
+ "test:coverage": "vitest run --coverage",
30
+ "test:ui": "vitest --ui"
27
31
  },
28
32
  "devDependencies": {
29
33
  "@types/node": "^24.10.1",
34
+ "tsc-alias": "^1.8.16",
30
35
  "typescript": "^5.9.3",
31
- "tsc-alias": "^1.8.16"
36
+ "vitest": "^4.0.15"
37
+ },
38
+ "dependencies": {
39
+ "ts-node": "^10.9.2"
32
40
  }
33
41
  }