@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.
- package/dist/abstract/Controller.d.ts +17 -0
- package/dist/abstract/Controller.d.ts.map +1 -0
- package/dist/abstract/Controller.js +47 -0
- package/dist/abstract/Model.d.ts +33 -19
- package/dist/abstract/Model.d.ts.map +1 -1
- package/dist/abstract/Model.js +177 -120
- package/dist/abstract/SchemaTableBuilder.d.ts +1 -1
- package/dist/abstract/SchemaTableBuilder.d.ts.map +1 -1
- package/dist/abstract/model/ModelRelation.d.ts +23 -0
- package/dist/abstract/model/ModelRelation.d.ts.map +1 -0
- package/dist/abstract/model/ModelRelation.js +130 -0
- package/dist/base/Query.d.ts +10 -13
- package/dist/base/Query.d.ts.map +1 -1
- package/dist/base/Query.js +68 -26
- package/dist/base/Record.d.ts +4 -2
- package/dist/base/Record.d.ts.map +1 -1
- package/dist/base/Record.js +24 -14
- package/dist/base/Table.d.ts +12 -7
- package/dist/base/Table.d.ts.map +1 -1
- package/dist/base/Table.js +87 -47
- package/dist/helpers/Errors/AdapterErrors/AdapterNotFoundError.d.ts +4 -0
- package/dist/helpers/Errors/AdapterErrors/AdapterNotFoundError.d.ts.map +1 -0
- package/dist/helpers/Errors/AdapterErrors/AdapterNotFoundError.js +6 -0
- package/dist/helpers/Errors/AdapterErrors/ConnectionFailedError.d.ts +4 -0
- package/dist/helpers/Errors/AdapterErrors/ConnectionFailedError.d.ts.map +1 -0
- package/dist/helpers/Errors/AdapterErrors/ConnectionFailedError.js +6 -0
- package/dist/helpers/Errors/AdapterErrors/NoDefaultAdapterError.d.ts +4 -0
- package/dist/helpers/Errors/AdapterErrors/NoDefaultAdapterError.d.ts.map +1 -0
- package/dist/helpers/Errors/AdapterErrors/NoDefaultAdapterError.js +6 -0
- package/dist/helpers/Errors/ExpressionErrors/InvalidExpressionParametersError.d.ts +4 -0
- package/dist/helpers/Errors/ExpressionErrors/InvalidExpressionParametersError.d.ts.map +1 -0
- package/dist/helpers/Errors/ExpressionErrors/InvalidExpressionParametersError.js +6 -0
- package/dist/helpers/Errors/ExpressionErrors/UnknownExpressionTypeError.d.ts +4 -0
- package/dist/helpers/Errors/ExpressionErrors/UnknownExpressionTypeError.d.ts.map +1 -0
- package/dist/helpers/Errors/ExpressionErrors/UnknownExpressionTypeError.js +6 -0
- package/dist/helpers/Errors/ExpressionErrors/UnsupportedQueryPhaseError.d.ts +4 -0
- package/dist/helpers/Errors/ExpressionErrors/UnsupportedQueryPhaseError.d.ts.map +1 -0
- package/dist/helpers/Errors/ExpressionErrors/UnsupportedQueryPhaseError.js +6 -0
- package/dist/helpers/Errors/QueryErrors/UnexpectedEmptyQueryError.d.ts +4 -0
- package/dist/helpers/Errors/QueryErrors/UnexpectedEmptyQueryError.d.ts.map +1 -0
- package/dist/helpers/Errors/QueryErrors/UnexpectedEmptyQueryError.js +6 -0
- package/dist/helpers/Errors/TableErrors/UnknownTableError.d.ts +4 -0
- package/dist/helpers/Errors/TableErrors/UnknownTableError.d.ts.map +1 -0
- package/dist/helpers/Errors/TableErrors/UnknownTableError.js +6 -0
- package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseDeleteQueryBuilder.d.ts +1 -0
- package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseDeleteQueryBuilder.d.ts.map +1 -0
- package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseDeleteQueryBuilder.js +1 -0
- package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseInsertQueryBuilder.d.ts +1 -0
- package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseInsertQueryBuilder.d.ts.map +1 -0
- package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseInsertQueryBuilder.js +11 -0
- package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseSelectQueryBuilder.d.ts +11 -0
- package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseSelectQueryBuilder.d.ts.map +1 -0
- package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseSelectQueryBuilder.js +27 -0
- package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseUpdateQueryBuilder.d.ts +1 -0
- package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseUpdateQueryBuilder.d.ts.map +1 -0
- package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseUpdateQueryBuilder.js +1 -0
- package/dist/helpers/QueryBuilders/ExpressionBuilders/JsonAggregateExpression.d.ts +9 -0
- package/dist/helpers/QueryBuilders/ExpressionBuilders/JsonAggregateExpression.d.ts.map +1 -0
- package/dist/helpers/QueryBuilders/ExpressionBuilders/JsonAggregateExpression.js +102 -0
- package/dist/helpers/QueryBuilders/ExpressionBuilders/SpatialDistanceExpression.d.ts +8 -0
- package/dist/helpers/QueryBuilders/ExpressionBuilders/SpatialDistanceExpression.d.ts.map +1 -0
- package/dist/helpers/QueryBuilders/ExpressionBuilders/SpatialDistanceExpression.js +63 -0
- package/dist/helpers/QueryBuilders/ExpressionBuilders/TextRelevanceExpression.d.ts +8 -0
- package/dist/helpers/QueryBuilders/ExpressionBuilders/TextRelevanceExpression.d.ts.map +1 -0
- package/dist/helpers/QueryBuilders/ExpressionBuilders/TextRelevanceExpression.js +49 -0
- package/dist/helpers/QueryBuilders/QueryDecorators/ExpressionDecorator.d.ts +19 -0
- package/dist/helpers/QueryBuilders/QueryDecorators/ExpressionDecorator.d.ts.map +1 -0
- package/dist/helpers/QueryBuilders/QueryDecorators/ExpressionDecorator.js +60 -0
- package/dist/helpers/QueryBuilders/QueryDecorators/GroupByDecorator.d.ts +9 -0
- package/dist/helpers/QueryBuilders/QueryDecorators/GroupByDecorator.d.ts.map +1 -0
- package/dist/helpers/QueryBuilders/QueryDecorators/GroupByDecorator.js +27 -0
- package/dist/helpers/QueryBuilders/QueryDecorators/JoinDecorator.d.ts +15 -0
- package/dist/helpers/QueryBuilders/QueryDecorators/JoinDecorator.d.ts.map +1 -0
- package/dist/helpers/QueryBuilders/QueryDecorators/JoinDecorator.js +74 -0
- package/dist/helpers/QueryBuilders/QueryDecorators/LimitDecorator.d.ts +10 -0
- package/dist/helpers/QueryBuilders/QueryDecorators/LimitDecorator.d.ts.map +1 -0
- package/dist/helpers/QueryBuilders/QueryDecorators/LimitDecorator.js +29 -0
- package/dist/helpers/QueryBuilders/QueryDecorators/OrderByDecorator.d.ts +9 -0
- package/dist/helpers/QueryBuilders/QueryDecorators/OrderByDecorator.d.ts.map +1 -0
- package/dist/helpers/QueryBuilders/QueryDecorators/OrderByDecorator.js +27 -0
- package/dist/helpers/QueryBuilders/QueryDecorators/QueryDecorator.d.ts +8 -0
- package/dist/helpers/QueryBuilders/QueryDecorators/QueryDecorator.d.ts.map +1 -0
- package/dist/helpers/QueryBuilders/QueryDecorators/QueryDecorator.js +5 -0
- package/dist/helpers/QueryBuilders/QueryDecorators/ValuesDecorator.d.ts +1 -0
- package/dist/helpers/QueryBuilders/QueryDecorators/ValuesDecorator.d.ts.map +1 -0
- package/dist/helpers/QueryBuilders/QueryDecorators/ValuesDecorator.js +17 -0
- package/dist/helpers/QueryBuilders/QueryDecorators/WhereDecorator.d.ts +9 -0
- package/dist/helpers/QueryBuilders/QueryDecorators/WhereDecorator.d.ts.map +1 -0
- package/dist/helpers/QueryBuilders/QueryDecorators/WhereDecorator.js +29 -0
- package/dist/helpers/QueryBuilders/QueryExpressionBuilder.d.ts +54 -0
- package/dist/helpers/QueryBuilders/QueryExpressionBuilder.d.ts.map +1 -0
- package/dist/helpers/QueryBuilders/QueryExpressionBuilder.js +102 -0
- package/dist/helpers/QueryBuilders/QueryStatementBuilder.d.ts +16 -0
- package/dist/helpers/QueryBuilders/QueryStatementBuilder.d.ts.map +1 -0
- package/dist/helpers/QueryBuilders/QueryStatementBuilder.js +169 -0
- package/dist/helpers/QueryBuilders/SqlRenderer.d.ts +15 -0
- package/dist/helpers/QueryBuilders/SqlRenderer.d.ts.map +1 -0
- package/dist/helpers/QueryBuilders/SqlRenderer.js +79 -0
- package/dist/helpers/QueryBuilders/oldQueryStatementBuilder.d.ts +160 -0
- package/dist/helpers/QueryBuilders/oldQueryStatementBuilder.d.ts.map +1 -0
- package/dist/helpers/QueryBuilders/oldQueryStatementBuilder.js +217 -0
- package/dist/interfaces/IExpressionBuilder.d.ts +7 -0
- package/dist/interfaces/IExpressionBuilder.d.ts.map +1 -0
- package/dist/interfaces/IExpressionBuilder.js +1 -0
- package/dist/interfaces/IQueryBuilder.d.ts +5 -0
- package/dist/interfaces/IQueryBuilder.d.ts.map +1 -0
- package/dist/interfaces/IQueryBuilder.js +1 -0
- package/dist/interfaces/ISchemaBuilder.d.ts +1 -1
- package/dist/interfaces/ISchemaBuilder.d.ts.map +1 -1
- package/dist/runtime/Container.d.ts +3 -0
- package/dist/runtime/Container.d.ts.map +1 -1
- package/dist/runtime/Container.js +12 -2
- package/dist/runtime/QueryCache.d.ts +12 -0
- package/dist/runtime/QueryCache.d.ts.map +1 -0
- package/dist/runtime/QueryCache.js +26 -0
- package/dist/runtime/Repository.d.ts +13 -7
- package/dist/runtime/Repository.d.ts.map +1 -1
- package/dist/runtime/Repository.js +114 -70
- package/dist/types/expressions.d.ts +154 -0
- package/dist/types/expressions.d.ts.map +1 -0
- package/dist/types/expressions.js +6 -0
- package/dist/types/factories.d.ts +7 -0
- package/dist/types/factories.d.ts.map +1 -0
- package/dist/types/factories.js +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +2 -0
- package/dist/types/model.d.ts +8 -8
- package/dist/types/model.d.ts.map +1 -1
- package/dist/types/query.d.ts +63 -1
- package/dist/types/query.d.ts.map +1 -1
- package/package.json +11 -3
- package/dist/helpers/QueryStatementBuilder.d.ts +0 -304
- package/dist/helpers/QueryStatementBuilder.d.ts.map +0 -1
- 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.
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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(
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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(
|
|
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
|
|
89
|
-
record =
|
|
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(
|
|
97
|
+
record = yield this.Table.Record(queryLayers);
|
|
93
98
|
}
|
|
94
|
-
return record ? record.values
|
|
99
|
+
return record === null || record === void 0 ? void 0 : record.values;
|
|
95
100
|
});
|
|
96
101
|
}
|
|
97
|
-
get(
|
|
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,
|
|
105
|
+
return yield this.join(Model, QueryLayers);
|
|
101
106
|
}
|
|
102
107
|
else {
|
|
103
|
-
const records = yield this.Table.Records(
|
|
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,
|
|
113
|
+
all(Model, QueryLayers) {
|
|
109
114
|
return __awaiter(this, void 0, void 0, function* () {
|
|
110
|
-
|
|
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,
|
|
126
|
+
join(Model, queryLayers) {
|
|
128
127
|
return __awaiter(this, void 0, void 0, function* () {
|
|
129
|
-
const
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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
|
|
161
|
-
joinType
|
|
174
|
+
baseTable,
|
|
175
|
+
joinType,
|
|
162
176
|
on: [
|
|
163
|
-
{ [relation.foreignKey]:
|
|
177
|
+
{ [relation.foreignKey]: baseKey }
|
|
164
178
|
]
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
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
|
-
|
|
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":"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"}
|
|
@@ -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 {};
|
package/dist/types/index.d.ts
CHANGED
|
@@ -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"}
|
package/dist/types/index.js
CHANGED
package/dist/types/model.d.ts
CHANGED
|
@@ -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
|
|
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
|
|
20
|
+
};
|
|
21
|
+
export type ModelScope = {
|
|
22
22
|
(query: any): void;
|
|
23
|
-
}
|
|
24
|
-
export
|
|
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
|
|
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":"AAAA,oCAAoC;AAEpC,OAAO,KAAK,MAAM,sBAAsB,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAE1D,MAAM,MAAM,cAAc,GACpB,WAAW,GACX,UAAU,GACV,SAAS,GACT,UAAU,GACV,SAAS,GACT,QAAQ,GACR,OAAO,GACP,UAAU,GACV,SAAS,GACT,WAAW,GACX,UAAU,GACV,eAAe,GACf,cAAc,CAAC;AAErB,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEtE,MAAM,
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/types/model.ts"],"names":[],"mappings":"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"}
|
package/dist/types/query.d.ts
CHANGED
|
@@ -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?:
|
|
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;
|
|
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
|
+
"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
|
-
"
|
|
36
|
+
"vitest": "^4.0.15"
|
|
37
|
+
},
|
|
38
|
+
"dependencies": {
|
|
39
|
+
"ts-node": "^10.9.2"
|
|
32
40
|
}
|
|
33
41
|
}
|