@iamkirbki/database-handler-core 4.2.0 → 4.3.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.
@@ -1,5 +1,5 @@
1
1
  import Repository from "../runtime/Repository.js";
2
- import { columnType, QueryCondition, QueryValues, ModelConfig, relation, QueryOptions, joinedEntity } from "../types/index.js";
2
+ import { columnType, QueryWhereCondition, QueryValues, ModelConfig, relation, ExtraQueryParameters, joinedEntity } from "../types/index.js";
3
3
  /** Abstract Model class for ORM-style database interactions */
4
4
  export default abstract class Model<ModelType extends columnType> {
5
5
  private _repository?;
@@ -10,8 +10,8 @@ export default abstract class Model<ModelType extends columnType> {
10
10
  protected attributes: Partial<ModelType>;
11
11
  protected exists: boolean;
12
12
  protected dirty: boolean;
13
- protected queryScopes?: QueryCondition;
14
- protected queryOptions: QueryOptions;
13
+ protected queryScopes?: QueryWhereCondition;
14
+ protected queryOptions: ExtraQueryParameters;
15
15
  get primaryKeyColumn(): string;
16
16
  get primaryKey(): QueryValues | undefined;
17
17
  get values(): Partial<ModelType> | ModelType;
@@ -21,8 +21,8 @@ export default abstract class Model<ModelType extends columnType> {
21
21
  offset(value: number): this;
22
22
  static orderBy<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType, column: string, direction?: 'ASC' | 'DESC'): ParamterModelType;
23
23
  orderBy(column: string, direction?: 'ASC' | 'DESC'): this;
24
- static where<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType, conditions: QueryCondition): ParamterModelType;
25
- where(conditions: QueryCondition): this;
24
+ static where<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType, conditions: QueryWhereCondition): ParamterModelType;
25
+ where(conditions: QueryWhereCondition): this;
26
26
  static whereId<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType, id: QueryValues): ParamterModelType;
27
27
  whereId(id: QueryValues): this;
28
28
  static find<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType, primaryKeyValue: QueryValues): ParamterModelType;
@@ -42,12 +42,15 @@ export default abstract class Model<ModelType extends columnType> {
42
42
  protected relations: relation[];
43
43
  get JoinedEntities(): joinedEntity[];
44
44
  get Relations(): relation[];
45
- hasMany<modelType extends Model<columnType>>(model: modelType, foreignKey?: string, localKey?: string): this;
46
- hasOne<modelType extends Model<columnType>>(model: modelType, foreignKey?: string, localKey?: string): this;
47
- belongsTo<modelType extends Model<columnType>>(model: modelType, foreignKey?: string, localKey?: string): this;
48
- static with<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType, relation: string, queryScopes?: QueryCondition): ParamterModelType;
49
- with(relation: string, queryScopes?: QueryCondition): this;
50
- private callRelationMethod;
45
+ insertRecordIntoPivotTable(otherTable: string, foreignKey: string): Promise<void>;
46
+ protected ManyToMany<modelType extends Model<columnType>>(model: modelType, pivotTable?: string, localKey?: string, foreignKey?: string, pivotForeignKey?: string, pivotLocalKey?: string): Promise<this>;
47
+ protected hasMany<modelType extends Model<columnType>>(model: modelType, foreignKey?: string, localKey?: string): this;
48
+ protected hasOne<modelType extends Model<columnType>>(model: modelType, foreignKey?: string, localKey?: string): this;
49
+ protected belongsTo<modelType extends Model<columnType>>(model: modelType, foreignKey?: string, localKey?: string): this;
50
+ static with<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType, relation: string, queryScopes?: QueryWhereCondition): ParamterModelType;
51
+ with(relation: string, queryScopes?: QueryWhereCondition): this;
52
+ asyncWith(relation: string, queryScopes?: QueryWhereCondition): Promise<this>;
53
+ callRelationMethod(relation: string): void | Promise<void>;
51
54
  private normalizeQueryScopes;
52
55
  toJSON(): Partial<ModelType> | ModelType;
53
56
  toObject(): Partial<ModelType> | ModelType;
@@ -1 +1 @@
1
- {"version":3,"file":"Model.d.ts","sourceRoot":"","sources":["../../src/abstract/Model.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Model.d.ts","sourceRoot":"","sources":["../../src/abstract/Model.ts"],"names":[],"mappings":"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"}
@@ -32,7 +32,7 @@ export default class Model {
32
32
  }
33
33
  get repository() {
34
34
  if (!this._repository) {
35
- this._repository = Repository.getInstance(this.constructor, this.Configuration.table);
35
+ this._repository = Repository.getInstance(this.constructor, this.Configuration.table, this.Configuration.customAdapter);
36
36
  }
37
37
  return this._repository;
38
38
  }
@@ -214,6 +214,29 @@ export default class Model {
214
214
  get Relations() {
215
215
  return this.relations;
216
216
  }
217
+ insertRecordIntoPivotTable(otherTable, foreignKey) {
218
+ return __awaiter(this, void 0, void 0, function* () {
219
+ yield this.callRelationMethod(otherTable);
220
+ const relation = this.relations[this.relations.length - 1];
221
+ this.relations.pop();
222
+ yield this.repository.insertRecordIntoPivotTable(foreignKey, this, relation);
223
+ });
224
+ }
225
+ ManyToMany(model_1) {
226
+ return __awaiter(this, arguments, void 0, function* (model, pivotTable = [this.Configuration.table, model.Configuration.table].sort().join('_'), localKey = this.Configuration.primaryKey, foreignKey = model.Configuration.primaryKey, pivotForeignKey = `${this.Configuration.table}_${localKey}`, pivotLocalKey = `${model.Configuration.table}_${foreignKey}`) {
227
+ const relation = yield this.repository.getManyToManyRelation({
228
+ type: 'manyToMany',
229
+ model: model,
230
+ pivotTable: pivotTable,
231
+ foreignKey: foreignKey,
232
+ pivotForeignKey: pivotForeignKey,
233
+ localKey: localKey,
234
+ pivotLocalKey: pivotLocalKey,
235
+ });
236
+ this.relations.push(relation);
237
+ return this;
238
+ });
239
+ }
217
240
  hasMany(model, foreignKey = `${this.Configuration.table}_${this.Configuration.primaryKey}`, localKey = this.Configuration.primaryKey) {
218
241
  this.relations.push({
219
242
  type: 'hasMany',
@@ -246,7 +269,10 @@ export default class Model {
246
269
  return instance.with(relation, queryScopes);
247
270
  }
248
271
  with(relation, queryScopes) {
249
- this.callRelationMethod(relation);
272
+ const result = this.callRelationMethod(relation);
273
+ if (result instanceof Promise) {
274
+ throw new Error(`Relation method '${relation}' is asynchronous. Use asyncWith() instead of with().`);
275
+ }
250
276
  const lastRelation = this.relations[this.relations.length - 1];
251
277
  const tableName = lastRelation.model.Configuration.table;
252
278
  const normalizedScopes = this.normalizeQueryScopes(queryScopes, tableName);
@@ -256,12 +282,28 @@ export default class Model {
256
282
  });
257
283
  return this;
258
284
  }
285
+ asyncWith(relation, queryScopes) {
286
+ return __awaiter(this, void 0, void 0, function* () {
287
+ yield this.callRelationMethod(relation);
288
+ const lastRelation = this.relations[this.relations.length - 1];
289
+ const tableName = lastRelation.model.Configuration.table;
290
+ const normalizedScopes = this.normalizeQueryScopes(queryScopes, tableName);
291
+ this.joinedEntities.push({
292
+ relation: relation,
293
+ queryScopes: normalizedScopes
294
+ });
295
+ return this;
296
+ });
297
+ }
259
298
  callRelationMethod(relation) {
260
299
  const method = Reflect.get(this, relation);
261
300
  if (typeof method !== 'function') {
262
- throw new Error(`Relation method '${relation}' does not exist on ${this.constructor.name}`);
301
+ throw new Error(`Relation method '${relation}' does not exist`);
263
302
  }
264
- method.call(this);
303
+ const result = method.call(this);
304
+ //@TODO: check if method is not static
305
+ // Only return promise if the method is actually async
306
+ return result instanceof Promise ? result : undefined;
265
307
  }
266
308
  normalizeQueryScopes(queryScopes, tableName) {
267
309
  if (!queryScopes) {
@@ -1,26 +1,32 @@
1
- import { columnType, QueryCondition, QueryWhereParameters, TableColumnInfo, QueryParameters } from "../types/index.js";
1
+ import { columnType, QueryWhereCondition, QueryIsEqualParameter, TableColumnInfo, QueryComparisonParameters } from "../types/index.js";
2
2
  import { Record } from "../index.js";
3
+ export type QueryConstructorType = {
4
+ tableName: string;
5
+ query?: string;
6
+ parameters?: QueryWhereCondition;
7
+ adapterName?: string;
8
+ };
3
9
  /** Query class for executing custom SQL queries */
4
10
  export default class Query {
5
11
  readonly TableName: string;
6
12
  private readonly _adapter;
7
- private _query;
13
+ private _query?;
8
14
  private _parameters;
9
- get Parameters(): QueryCondition;
10
- set Parameters(value: QueryCondition);
11
- constructor(TableName: string, Query: string);
15
+ get Parameters(): QueryWhereCondition;
16
+ constructor({ tableName, query, parameters, adapterName }: QueryConstructorType);
12
17
  /** Execute a non-SELECT query (INSERT, UPDATE, DELETE, etc.) */
13
18
  Run<Type>(): Promise<Type>;
14
19
  /** Execute a SELECT query and return all matching rows */
15
20
  All<Type extends columnType>(): Promise<Record<Type>[]>;
16
21
  /** Execute a SELECT query and return the first matching row */
17
22
  Get<Type extends columnType>(): Promise<Record<Type> | undefined>;
18
- static tableColumnInformation(tableName: string): Promise<TableColumnInfo[]>;
23
+ static TableColumnInformation(tableName: string, customAdapter?: string): Promise<TableColumnInfo[]>;
24
+ DoesTableExist(): Promise<boolean>;
19
25
  Count(): Promise<number>;
20
- static ConvertParamsToArray(params: QueryCondition): QueryParameters[];
26
+ static ConvertParamsToArray(params: QueryWhereCondition): QueryComparisonParameters[];
21
27
  /** Convert various parameter formats to a consistent object format */
22
- static ConvertParamsToObject(params: QueryCondition): QueryWhereParameters;
28
+ static ConvertParamsToObject(params: QueryWhereCondition): QueryIsEqualParameter;
23
29
  /** Databases don't like numeric values when inserting with a query */
24
- static ConvertValueToString(params: QueryWhereParameters): QueryWhereParameters;
30
+ static ConvertValueToString(params: QueryIsEqualParameter): QueryIsEqualParameter;
25
31
  }
26
32
  //# sourceMappingURL=Query.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Query.d.ts","sourceRoot":"","sources":["../../src/base/Query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,oBAAoB,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC1H,OAAO,EAAa,MAAM,EAAoB,MAAM,gBAAgB,CAAC;AAErE,mDAAmD;AACnD,MAAM,CAAC,OAAO,OAAO,KAAK;IACxB,SAAgB,SAAS,EAAE,MAAM,CAAC;IAElC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0D;IACnF,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,WAAW,CAAsB;IAEzC,IAAW,UAAU,IAAI,cAAc,CAEtC;IAED,IAAW,UAAU,CAAC,KAAK,EAAE,cAAc,EAE1C;gBAEW,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM;IAK5C,gEAAgE;IACnD,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC;IAKvC,0DAA0D;IAC7C,GAAG,CAAC,IAAI,SAAS,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;IAMpE,+DAA+D;IAClD,GAAG,CAAC,IAAI,SAAS,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;WAM1D,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAI5E,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;WAMvB,oBAAoB,CAAC,MAAM,EAAE,cAAc,GAAG,eAAe,EAAE;IAkB7E,sEAAsE;WACxD,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,oBAAoB;IAajF,sEAAsE;WACxD,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,GAAG,oBAAoB;CAKvF"}
1
+ {"version":3,"file":"Query.d.ts","sourceRoot":"","sources":["../../src/base/Query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AAC1I,OAAO,EAAa,MAAM,EAAoB,MAAM,gBAAgB,CAAC;AAErE,MAAM,MAAM,oBAAoB,GAAG;IACjC,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,mDAAmD;AACnD,MAAM,CAAC,OAAO,OAAO,KAAK;IACxB,SAAgB,SAAS,EAAE,MAAM,CAAC;IAElC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,MAAM,CAAC,CAAc;IAC7B,OAAO,CAAC,WAAW,CAA2B;IAE9C,IAAW,UAAU,IAAI,mBAAmB,CAE3C;gBAEW,EACV,SAAS,EACT,KAAK,EACL,UAAU,EACV,WAAW,EACZ,EAAE,oBAAoB;IAUvB,gEAAgE;IACnD,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC;IAQvC,0DAA0D;IAC7C,GAAG,CAAC,IAAI,SAAS,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;IAUpE,+DAA+D;IAClD,GAAG,CAAC,IAAI,SAAS,UAAU,KAAK,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;WAS1D,sBAAsB,CAAC,SAAS,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAIpG,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC;IAIlC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC;WASvB,oBAAoB,CAAC,MAAM,EAAE,mBAAmB,GAAG,yBAAyB,EAAE;IAkB5F,sEAAsE;WACxD,qBAAqB,CAAC,MAAM,EAAE,mBAAmB,GAAG,qBAAqB;IAavF,sEAAsE;WACxD,oBAAoB,CAAC,MAAM,EAAE,qBAAqB,GAAG,qBAAqB;CAKzF"}
@@ -13,19 +13,21 @@ export default class Query {
13
13
  get Parameters() {
14
14
  return this._parameters;
15
15
  }
16
- set Parameters(value) {
17
- this._parameters = Query.ConvertParamsToObject(value);
18
- }
19
- constructor(TableName, Query) {
20
- this._adapter = Container.getInstance().getAdapter();
16
+ constructor({ tableName, query, parameters, adapterName }) {
21
17
  this._query = "";
22
18
  this._parameters = {};
23
- this.TableName = TableName;
24
- this._query = Query;
19
+ this.TableName = tableName;
20
+ this._query = query;
21
+ if (parameters)
22
+ this._parameters = Query.ConvertParamsToObject(parameters);
23
+ this._adapter = Container.getInstance().getAdapter(adapterName);
25
24
  }
26
25
  /** Execute a non-SELECT query (INSERT, UPDATE, DELETE, etc.) */
27
26
  Run() {
28
27
  return __awaiter(this, void 0, void 0, function* () {
28
+ if (!this._query) {
29
+ throw new Error("No query defined to run.");
30
+ }
29
31
  const stmt = yield this._adapter.prepare(this._query);
30
32
  return yield stmt.run(this.Parameters);
31
33
  });
@@ -33,26 +35,40 @@ export default class Query {
33
35
  /** Execute a SELECT query and return all matching rows */
34
36
  All() {
35
37
  return __awaiter(this, void 0, void 0, function* () {
38
+ if (!this._query) {
39
+ throw new Error("No query defined to run.");
40
+ }
36
41
  const stmt = yield this._adapter.prepare(this._query);
37
42
  const results = yield stmt.all(this.Parameters);
38
- return results.map(res => new Record(res, this.TableName));
43
+ return results.map(res => new Record(this.TableName, res));
39
44
  });
40
45
  }
41
46
  /** Execute a SELECT query and return the first matching row */
42
47
  Get() {
43
48
  return __awaiter(this, void 0, void 0, function* () {
49
+ if (!this._query) {
50
+ throw new Error("No query defined to run.");
51
+ }
44
52
  const stmt = yield this._adapter.prepare(this._query);
45
53
  const results = yield stmt.get(this.Parameters);
46
- return results ? new Record(results, this.TableName) : undefined;
54
+ return results ? new Record(this.TableName, results) : undefined;
55
+ });
56
+ }
57
+ static TableColumnInformation(tableName, customAdapter) {
58
+ return __awaiter(this, void 0, void 0, function* () {
59
+ return Container.getInstance().getAdapter(customAdapter).tableColumnInformation(tableName);
47
60
  });
48
61
  }
49
- static tableColumnInformation(tableName) {
62
+ DoesTableExist() {
50
63
  return __awaiter(this, void 0, void 0, function* () {
51
- return Container.getInstance().getAdapter().tableColumnInformation(tableName);
64
+ return yield this._adapter.tableExists(this.TableName);
52
65
  });
53
66
  }
54
67
  Count() {
55
68
  return __awaiter(this, void 0, void 0, function* () {
69
+ if (!this._query) {
70
+ throw new Error("No query defined to run.");
71
+ }
56
72
  const stmt = yield this._adapter.prepare(this._query);
57
73
  const result = yield stmt.get(this.Parameters);
58
74
  return parseInt(result.count) || 0;
@@ -1,17 +1,18 @@
1
1
  import { inspect } from "util";
2
- import { columnType, QueryWhereParameters } from "../types/index.js";
2
+ import { columnType, QueryIsEqualParameter } from "../types/index.js";
3
3
  /** Record class represents a single database row */
4
4
  export default class Record<ColumnValuesType extends columnType> {
5
5
  private _values;
6
6
  private readonly _tableName;
7
- constructor(values: ColumnValuesType, table: string);
7
+ private readonly _customAdapter?;
8
+ constructor(table: string, values: ColumnValuesType, adapter?: string);
8
9
  /** Get the raw values object for this record */
9
10
  get values(): ColumnValuesType;
10
11
  Insert(): Promise<this | undefined>;
11
12
  /** Update this record in the database */
12
- Update(newValues: Partial<ColumnValuesType>, primaryKey: QueryWhereParameters): Promise<this>;
13
+ Update(newValues: Partial<ColumnValuesType>, whereParameters: QueryIsEqualParameter): Promise<this>;
13
14
  /** Delete this record from the database */
14
- Delete(primaryKey: QueryWhereParameters): Promise<void>;
15
+ Delete(primaryKey?: QueryIsEqualParameter): Promise<void>;
15
16
  /** Returns the values object for JSON.stringify() */
16
17
  toJSON(): ColumnValuesType;
17
18
  /** Convert record to pretty-printed JSON string */
@@ -1 +1 @@
1
- {"version":3,"file":"Record.d.ts","sourceRoot":"","sources":["../../src/base/Record.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,OAAO,EAAE,UAAU,EAAoC,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAG1G,oDAAoD;AACpD,MAAM,CAAC,OAAO,OAAO,MAAM,CAAC,gBAAgB,SAAS,UAAU;IAC3D,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM;IAKnD,gDAAgD;IAChD,IAAW,MAAM,IAAI,gBAAgB,CAEpC;IAEY,MAAM,IAAI,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;IAuChD,yCAAyC;IAC5B,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,gBAAgB,CAAC,EAAE,UAAU,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB1G,2CAA2C;IAC9B,MAAM,CAAC,UAAU,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC;IAcpE,qDAAqD;IAC9C,MAAM,IAAI,gBAAgB;IAIjC,mDAAmD;IAC5C,QAAQ,IAAI,MAAM;IAIzB,uCAAuC;IACvC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,gBAAgB;CAGvC"}
1
+ {"version":3,"file":"Record.d.ts","sourceRoot":"","sources":["../../src/base/Record.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAE/B,OAAO,EAAE,UAAU,EAAoC,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAG3G,oDAAoD;AACpD,MAAM,CAAC,OAAO,OAAO,MAAM,CAAC,gBAAgB,SAAS,UAAU;IAC3D,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAS;gBAE7B,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,OAAO,CAAC,EAAE,MAAM;IAMrE,gDAAgD;IAChD,IAAW,MAAM,IAAI,gBAAgB,CAEpC;IAEY,MAAM,IAAI,OAAO,CAAC,IAAI,GAAG,SAAS,CAAC;IA+ChD,yCAAyC;IAC5B,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,gBAAgB,CAAC,EAAE,eAAe,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BhH,2CAA2C;IAC9B,MAAM,CAAC,UAAU,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkBtE,qDAAqD;IAC9C,MAAM,IAAI,gBAAgB;IAIjC,mDAAmD;IAC5C,QAAQ,IAAI,MAAM;IAIzB,uCAAuC;IACvC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,gBAAgB;CAGvC"}
@@ -12,10 +12,11 @@ import Query from "./Query.js";
12
12
  import QueryStatementBuilder from "../helpers/QueryStatementBuilder.js";
13
13
  /** Record class represents a single database row */
14
14
  export default class Record {
15
- constructor(values, table) {
15
+ constructor(table, values, adapter) {
16
16
  this._values = {};
17
- this._values = values;
18
17
  this._tableName = table;
18
+ this._values = values;
19
+ this._customAdapter = adapter;
19
20
  }
20
21
  /** Get the raw values object for this record */
21
22
  get values() {
@@ -30,8 +31,12 @@ export default class Record {
30
31
  throw new Error("Cannot insert record with no columns");
31
32
  }
32
33
  const queryStr = QueryStatementBuilder.BuildInsert(this._tableName, this._values);
33
- const query = new Query(this._tableName, queryStr);
34
- query.Parameters = this._values;
34
+ const query = new Query({
35
+ tableName: this._tableName,
36
+ query: queryStr,
37
+ parameters: this._values,
38
+ adapterName: this._customAdapter
39
+ });
35
40
  const result = yield query.Run();
36
41
  let recordId;
37
42
  // For PostgreSQL compatibility: use 'id' from values if lastInsertRowid is undefined
@@ -45,8 +50,12 @@ export default class Record {
45
50
  return undefined;
46
51
  }
47
52
  const queryStrSelect = QueryStatementBuilder.BuildSelect(this._tableName, { where: Object.assign({}, this._values) });
48
- const querySelect = new Query(this._tableName, queryStrSelect);
49
- querySelect.Parameters = Object.assign({}, this._values);
53
+ const querySelect = new Query({
54
+ tableName: this._tableName,
55
+ query: queryStrSelect,
56
+ parameters: this._values,
57
+ adapterName: this._customAdapter
58
+ });
50
59
  const insertedRecord = yield querySelect.All();
51
60
  if (insertedRecord.length > 0) {
52
61
  this._values = insertedRecord[insertedRecord.length - 1].values;
@@ -56,20 +65,24 @@ export default class Record {
56
65
  });
57
66
  }
58
67
  /** Update this record in the database */
59
- Update(newValues, primaryKey) {
68
+ Update(newValues, whereParameters) {
60
69
  return __awaiter(this, void 0, void 0, function* () {
61
70
  const originalValues = this._values;
62
71
  if (originalValues.updated_at !== undefined) {
63
72
  newValues.updated_at = new Date().toISOString();
64
73
  }
65
- const queryStr = QueryStatementBuilder.BuildUpdate(this._tableName, newValues, primaryKey);
66
- const _query = new Query(this._tableName, queryStr);
74
+ const queryStr = QueryStatementBuilder.BuildUpdate(this._tableName, newValues, whereParameters);
67
75
  // Merge newValues and originalValues for parameters (with 'where_' prefix for where clause)
68
76
  const params = Object.assign({}, newValues);
69
77
  Object.entries(originalValues).forEach(([key, value]) => {
70
78
  params[`where_${key}`] = value;
71
79
  });
72
- _query.Parameters = params;
80
+ const _query = new Query({
81
+ tableName: this._tableName,
82
+ query: queryStr,
83
+ parameters: params,
84
+ adapterName: this._customAdapter
85
+ });
73
86
  yield _query.Run();
74
87
  this._values = Object.assign(Object.assign({}, this._values), newValues);
75
88
  return this;
@@ -81,12 +94,14 @@ export default class Record {
81
94
  const originalValues = this._values;
82
95
  if (originalValues.deleted_at !== undefined) {
83
96
  this._values.deleted_at = new Date().toISOString();
84
- this.Update(this._values, primaryKey);
97
+ yield this.Update(this._values, this._values.id ? { id: this._values.id } : primaryKey || {});
85
98
  return;
86
99
  }
87
100
  const queryStr = QueryStatementBuilder.BuildDelete(this._tableName, this._values);
88
- const _query = new Query(this._tableName, queryStr);
89
- _query.Parameters = Object.assign({}, this._values);
101
+ const _query = new Query({
102
+ tableName: this._tableName,
103
+ query: queryStr, parameters: this.values, adapterName: this._customAdapter
104
+ });
90
105
  yield _query.Run();
91
106
  });
92
107
  }
@@ -1,25 +1,27 @@
1
- import { DefaultQueryOptions, Join, QueryOptions, ReadableTableColumnInfo, TableColumnInfo, columnType } from "../types/index.js";
1
+ import { DefaultQueryParameters, Join, ExtraQueryParameters, ReadableTableColumnInfo, TableColumnInfo, columnType } from "../types/index.js";
2
2
  import { Record } from "../index.js";
3
3
  /** Table class for interacting with a database table */
4
4
  export default class Table {
5
+ private readonly _customAdapter?;
5
6
  private readonly _name;
6
7
  /** Private constructor - use Table.create() */
7
- constructor(name: string);
8
+ constructor(name: string, customAdapter?: string);
8
9
  /** Get raw column information */
9
10
  TableColumnInformation(): Promise<TableColumnInfo[]>;
10
11
  /** Get readable, formatted column information */
11
12
  ReadableTableColumnInformation(): Promise<ReadableTableColumnInfo[]>;
12
13
  Drop(): Promise<void>;
13
14
  /** Fetch records with optional filtering, ordering, and pagination */
14
- Records<Type extends columnType>(options?: DefaultQueryOptions & QueryOptions): Promise<Record<Type>[]>;
15
+ Records<Type extends columnType>(options?: DefaultQueryParameters & ExtraQueryParameters): Promise<Record<Type>[]>;
15
16
  /** Fetch a single record from the table */
16
- Record<Type extends columnType>(options?: DefaultQueryOptions & QueryOptions): Promise<Record<Type> | undefined>;
17
+ Record<Type extends columnType>(options?: DefaultQueryParameters & ExtraQueryParameters): Promise<Record<Type> | undefined>;
17
18
  /** Get the total count of records */
18
19
  RecordsCount(): Promise<number>;
20
+ exists(): Promise<boolean>;
19
21
  /** Insert a record into the table */
20
22
  Insert<Type extends columnType>(values: Type): Promise<Record<Type> | undefined>;
21
23
  /** Perform JOIN operations with other tables */
22
- Join<Type extends columnType>(Joins: Join | Join[], options?: DefaultQueryOptions & QueryOptions): Promise<Record<Type>[]>;
24
+ Join<Type extends columnType>(Joins: Join | Join[], options?: DefaultQueryParameters & ExtraQueryParameters): Promise<Record<Type>[]>;
23
25
  private splitJoinValues;
24
26
  }
25
27
  //# sourceMappingURL=Table.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Table.d.ts","sourceRoot":"","sources":["../../src/base/Table.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,mBAAmB,EACnB,IAAI,EACJ,YAAY,EACZ,uBAAuB,EACvB,eAAe,EACf,UAAU,EACb,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,MAAM,EAAS,MAAM,gBAAgB,CAAC;AAE/C,wDAAwD;AACxD,MAAM,CAAC,OAAO,OAAO,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAE/B,+CAA+C;gBACnC,IAAI,EAAE,MAAM;IAIxB,iCAAiC;IACpB,sBAAsB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAIjE,iDAAiD;IACpC,8BAA8B,IAAI,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAWpE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAMlC,sEAAsE;IACzD,OAAO,CAAC,IAAI,SAAS,UAAU,EACxC,OAAO,CAAC,EAAE,mBAAmB,GAAG,YAAY,GAC7C,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;IAkB1B,2CAA2C;IAC9B,MAAM,CAAC,IAAI,SAAS,UAAU,EACvC,OAAO,CAAC,EAAE,mBAAmB,GAAG,YAAY,GAC7C,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;IAWpC,qCAAqC;IACxB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAM5C,qCAAqC;IACxB,MAAM,CAAC,IAAI,SAAS,UAAU,EAAE,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;IAM7F,gDAAgD;IACnC,IAAI,CAAC,IAAI,SAAS,UAAU,EACrC,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,EACpB,OAAO,CAAC,EAAE,mBAAmB,GAAG,YAAY,GAC7C,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAcZ,eAAe;CA0BhC"}
1
+ {"version":3,"file":"Table.d.ts","sourceRoot":"","sources":["../../src/base/Table.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,sBAAsB,EACtB,IAAI,EACJ,oBAAoB,EACpB,uBAAuB,EACvB,eAAe,EACf,UAAU,EACb,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,MAAM,EAAS,MAAM,gBAAgB,CAAC;AAE/C,wDAAwD;AACxD,MAAM,CAAC,OAAO,OAAO,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAS;IACzC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAE/B,+CAA+C;gBACnC,IAAI,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM;IAKhD,iCAAiC;IACpB,sBAAsB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAIjE,iDAAiD;IACpC,8BAA8B,IAAI,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAWpE,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAUlC,sEAAsE;IACzD,OAAO,CAAC,IAAI,SAAS,UAAU,EACxC,OAAO,CAAC,EAAE,sBAAsB,GAAG,oBAAoB,GACxD,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;IAsB1B,2CAA2C;IAC9B,MAAM,CAAC,IAAI,SAAS,UAAU,EACvC,OAAO,CAAC,EAAE,sBAAsB,GAAG,oBAAoB,GACxD,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;IAWpC,qCAAqC;IACxB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAS/B,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;IASvC,qCAAqC;IACxB,MAAM,CAAC,IAAI,SAAS,UAAU,EAAE,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;IAM7F,gDAAgD;IACnC,IAAI,CAAC,IAAI,SAAS,UAAU,EACrC,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,EACpB,OAAO,CAAC,EAAE,sBAAsB,GAAG,oBAAoB,GACxD,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YAsBZ,eAAe;CAgChC"}
@@ -12,13 +12,14 @@ import { Record, Query } from "../index.js";
12
12
  /** Table class for interacting with a database table */
13
13
  export default class Table {
14
14
  /** Private constructor - use Table.create() */
15
- constructor(name) {
15
+ constructor(name, customAdapter) {
16
16
  this._name = name;
17
+ this._customAdapter = customAdapter;
17
18
  }
18
19
  /** Get raw column information */
19
20
  TableColumnInformation() {
20
21
  return __awaiter(this, void 0, void 0, function* () {
21
- return Query.tableColumnInformation(this._name);
22
+ return Query.TableColumnInformation(this._name, this._customAdapter);
22
23
  });
23
24
  }
24
25
  /** Get readable, formatted column information */
@@ -37,7 +38,11 @@ export default class Table {
37
38
  Drop() {
38
39
  return __awaiter(this, void 0, void 0, function* () {
39
40
  const queryStr = `DROP TABLE IF EXISTS "${this._name}";`;
40
- const query = new Query(this._name, queryStr);
41
+ const query = new Query({
42
+ tableName: this._name,
43
+ query: queryStr,
44
+ adapterName: this._customAdapter
45
+ });
41
46
  yield query.Run();
42
47
  });
43
48
  }
@@ -51,9 +56,14 @@ export default class Table {
51
56
  limit: options === null || options === void 0 ? void 0 : options.limit,
52
57
  offset: options === null || options === void 0 ? void 0 : options.offset,
53
58
  });
54
- const query = new Query(this._name, queryStr);
59
+ let params = {};
55
60
  if ((options === null || options === void 0 ? void 0 : options.where) && Object.keys(options.where).length > 0)
56
- query.Parameters = options.where;
61
+ params = options.where;
62
+ const query = new Query({
63
+ tableName: this._name,
64
+ query: queryStr,
65
+ parameters: params
66
+ });
57
67
  const results = yield query.All();
58
68
  return results;
59
69
  });
@@ -73,15 +83,27 @@ export default class Table {
73
83
  /** Get the total count of records */
74
84
  RecordsCount() {
75
85
  return __awaiter(this, void 0, void 0, function* () {
76
- const query = new Query(this._name, `SELECT COUNT(*) as count FROM "${this._name}";`);
86
+ const query = new Query({
87
+ tableName: this._name,
88
+ query: `SELECT COUNT(*) as count FROM "${this._name}"`
89
+ });
77
90
  const count = yield query.Count();
78
91
  return count || 0;
79
92
  });
80
93
  }
94
+ exists() {
95
+ return __awaiter(this, void 0, void 0, function* () {
96
+ const query = new Query({
97
+ tableName: this._name,
98
+ adapterName: this._customAdapter
99
+ });
100
+ return yield query.DoesTableExist();
101
+ });
102
+ }
81
103
  /** Insert a record into the table */
82
104
  Insert(values) {
83
105
  return __awaiter(this, void 0, void 0, function* () {
84
- const record = new Record(values, this._name);
106
+ const record = new Record(this._name, values);
85
107
  yield record.Insert();
86
108
  return record;
87
109
  });
@@ -89,38 +111,51 @@ export default class Table {
89
111
  /** Perform JOIN operations with other tables */
90
112
  Join(Joins, options) {
91
113
  return __awaiter(this, void 0, void 0, function* () {
92
- const queryString = QueryStatementBuilder.BuildJoin(this._name, Joins, options);
93
- const query = new Query(this._name, queryString);
94
- // Set parameters if WHERE clause is present
95
- if (options === null || options === void 0 ? void 0 : options.where) {
96
- query.Parameters = options.where;
97
- }
114
+ const queryString = yield QueryStatementBuilder.BuildJoin(this._name, Joins, options);
115
+ let params = {};
116
+ if (options === null || options === void 0 ? void 0 : options.where)
117
+ params = options.where;
118
+ const query = new Query({
119
+ tableName: this._name,
120
+ query: queryString,
121
+ parameters: params
122
+ });
98
123
  const joinedTables = Array.isArray(Joins) ? Joins.map(j => j.fromTable) : [Joins.fromTable];
124
+ if (options) {
125
+ options.select = joinedTables.map(table => `${table}.*`).join(', ');
126
+ }
99
127
  const records = yield query.All();
100
- return yield this.splitJoinValues(records, joinedTables);
128
+ const splitTables = yield this.splitJoinValues(records, joinedTables);
129
+ return splitTables;
101
130
  });
102
131
  }
103
132
  splitJoinValues(records, joinedTables) {
104
133
  return __awaiter(this, void 0, void 0, function* () {
105
- const thisRecordColumns = (yield this.TableColumnInformation()).map(col => col.name);
106
- const tableColumnsMap = new Map();
107
- for (const tableName of joinedTables) {
108
- const columns = (yield Query.tableColumnInformation(tableName)).map(col => col.name);
109
- tableColumnsMap.set(tableName, columns);
110
- }
111
134
  return records.map(record => {
112
135
  if (!record.values)
113
136
  return record;
114
- const thisRecordEntries = thisRecordColumns
115
- .map(colName => [colName, record.values[colName]])
116
- .filter(([, value]) => value !== undefined);
117
- const joinedRecords = {};
118
- for (const [tableName, tableColumns] of tableColumnsMap) {
119
- const joinedRecordEntries = Object.entries(record.values)
120
- .filter(([key]) => tableColumns.includes(key));
121
- joinedRecords[tableName] = Object.fromEntries(joinedRecordEntries);
137
+ const mainTableData = {};
138
+ const joinedTableData = {};
139
+ for (const tableName of joinedTables) {
140
+ joinedTableData[tableName] = {};
141
+ }
142
+ for (const [aliasedKey, value] of Object.entries(record.values)) {
143
+ if (aliasedKey.includes('__')) {
144
+ const [tableName, columnName] = aliasedKey.split('__');
145
+ if (tableName === this._name) {
146
+ mainTableData[columnName] = value;
147
+ }
148
+ else if (joinedTables.includes(tableName)) {
149
+ joinedTableData[tableName][columnName] = value;
150
+ }
151
+ }
152
+ else {
153
+ mainTableData[aliasedKey] = value;
154
+ }
122
155
  }
123
- return new Record(Object.assign(Object.assign({}, Object.fromEntries(thisRecordEntries)), joinedRecords), this._name);
156
+ // Combine main table data with nested joined table data
157
+ const combinedData = Object.assign(Object.assign({}, mainTableData), joinedTableData);
158
+ return new Record(this._name, combinedData);
124
159
  });
125
160
  });
126
161
  }
@@ -1,4 +1,4 @@
1
- import { DefaultQueryOptions, QueryOptions, QueryCondition, Join, QueryWhereParameters } from "../types/index.js";
1
+ import { DefaultQueryParameters, ExtraQueryParameters, QueryWhereCondition, Join, QueryIsEqualParameter } from "../types/index.js";
2
2
  /** Utility class for building SQL query strings */
3
3
  export default class QueryStatementBuilder {
4
4
  /**
@@ -25,7 +25,7 @@ export default class QueryStatementBuilder {
25
25
  * // "SELECT id, name, email FROM users WHERE status = @status AND age = @age ORDER BY created_at DESC LIMIT 10 OFFSET 20"
26
26
  * ```
27
27
  */
28
- static BuildSelect(tableName: string, options?: DefaultQueryOptions & QueryOptions): string;
28
+ static BuildSelect(tableName: string, options?: DefaultQueryParameters & ExtraQueryParameters): string;
29
29
  /**
30
30
  * Build an INSERT SQL statement with named parameter placeholders
31
31
  *
@@ -45,7 +45,7 @@ export default class QueryStatementBuilder {
45
45
  * // Note: The actual values will be bound separately using the Parameters object
46
46
  * ```
47
47
  */
48
- static BuildInsert(tableName: string, record: QueryWhereParameters): string;
48
+ static BuildInsert(tableName: string, record: QueryIsEqualParameter): string;
49
49
  /**
50
50
  * Build an UPDATE SQL statement with SET clause and WHERE conditions
51
51
  *
@@ -72,7 +72,7 @@ export default class QueryStatementBuilder {
72
72
  * // "UPDATE users SET status = @status WHERE status = @status AND last_login = @last_login"
73
73
  * ```
74
74
  */
75
- static BuildUpdate(tableName: string, record: QueryCondition, where: QueryCondition): string;
75
+ static BuildUpdate(tableName: string, record: QueryWhereCondition, where: QueryWhereCondition): string;
76
76
  /**
77
77
  * Build a DELETE SQL statement with WHERE conditions
78
78
  *
@@ -93,7 +93,7 @@ export default class QueryStatementBuilder {
93
93
  * // "DELETE FROM users WHERE status = @status AND last_login = @last_login"
94
94
  * ```
95
95
  */
96
- static BuildDelete(tableName: string, where: QueryCondition): string;
96
+ static BuildDelete(tableName: string, where: QueryWhereCondition): string;
97
97
  /**
98
98
  * Build a COUNT SQL statement to count rows, optionally with WHERE conditions
99
99
  *
@@ -115,7 +115,7 @@ export default class QueryStatementBuilder {
115
115
  * // "SELECT COUNT(*) as count FROM users WHERE status = @status AND age = @age"
116
116
  * ```
117
117
  */
118
- static BuildCount(tableName: string, where?: QueryCondition): string;
118
+ static BuildCount(tableName: string, where?: QueryWhereCondition): string;
119
119
  /**
120
120
  * Build a WHERE clause from parameter conditions (helper method)
121
121
  *
@@ -144,7 +144,7 @@ export default class QueryStatementBuilder {
144
144
  * // ""
145
145
  * ```
146
146
  */
147
- static BuildWhere(where?: QueryCondition): string;
147
+ static BuildWhere(where?: QueryWhereCondition): string;
148
148
  private static buildWhereWithOperators;
149
149
  private static buildWhereSimple;
150
150
  /**
@@ -191,7 +191,8 @@ export default class QueryStatementBuilder {
191
191
  * );
192
192
  * ```
193
193
  */
194
- static BuildJoin(fromTableName: string, joins: Join | Join[], options?: DefaultQueryOptions & QueryOptions): string;
194
+ static BuildJoin(fromTableName: string, joins: Join | Join[], options?: DefaultQueryParameters & ExtraQueryParameters): Promise<string>;
195
+ static BuildJoinSelect(fromTableName: string, joins: Join | Join[]): Promise<string>;
195
196
  /**
196
197
  * Build JOIN clause(s) recursively (helper method)
197
198
  *
@@ -264,7 +265,7 @@ export default class QueryStatementBuilder {
264
265
  * // "ON users.id = orders.user_id AND users.company_id = orders.company_id"
265
266
  * ```
266
267
  */
267
- static BuildJoinOnPart(tableName: string, joinTableName: string, on: QueryWhereParameters | QueryWhereParameters[]): string;
268
+ static BuildJoinOnPart(tableName: string, joinTableName: string, on: QueryIsEqualParameter | QueryIsEqualParameter[]): string;
268
269
  /**
269
270
  * Build query options clause (ORDER BY, LIMIT, OFFSET) (helper method)
270
271
  *
@@ -298,6 +299,6 @@ export default class QueryStatementBuilder {
298
299
  * // "LIMIT 25 OFFSET 50"
299
300
  * ```
300
301
  */
301
- static BuildQueryOptions(options: QueryOptions): string;
302
+ static BuildQueryOptions(options: ExtraQueryParameters): string;
302
303
  }
303
304
  //# sourceMappingURL=QueryStatementBuilder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"QueryStatementBuilder.d.ts","sourceRoot":"","sources":["../../src/helpers/QueryStatementBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,cAAc,EAAE,IAAI,EAAmB,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEtI,mDAAmD;AACnD,MAAM,CAAC,OAAO,OAAO,qBAAqB;IACtC;;;;;;;;;;;;;;;;;;;;;;;OAuBG;WACW,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,YAAY,GAAG,MAAM;IAWlG;;;;;;;;;;;;;;;;;;OAkBG;WACW,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAAG,MAAM;IAYlF;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;WACW,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,GAAG,MAAM;IAWnG;;;;;;;;;;;;;;;;;;;OAmBG;WACW,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,MAAM;IAS3E;;;;;;;;;;;;;;;;;;;;OAoBG;WACW,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,cAAc,GAAG,MAAM;IAQ3E;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;WACW,UAAU,CAAC,KAAK,CAAC,EAAE,cAAc,GAAG,MAAM;IAgBxD,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAStC,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAK/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2CG;WACW,SAAS,CACnB,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,EACpB,OAAO,CAAC,EAAE,mBAAmB,GAAG,YAAY,GAC7C,MAAM;IAWT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsCG;WACW,aAAa,CACvB,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,GACrB,MAAM;IAcT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;WACW,eAAe,CACzB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,EAAE,EAAE,oBAAoB,GAAG,oBAAoB,EAAE,GAClD,MAAM;IAWT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;WACW,iBAAiB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM;CAiBjE"}
1
+ {"version":3,"file":"QueryStatementBuilder.d.ts","sourceRoot":"","sources":["../../src/helpers/QueryStatementBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,IAAI,EAA6B,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAEjK,mDAAmD;AACnD,MAAM,CAAC,OAAO,OAAO,qBAAqB;IACtC;;;;;;;;;;;;;;;;;;;;;;;OAuBG;WACW,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,sBAAsB,GAAG,oBAAoB,GAAG,MAAM;IAW7G;;;;;;;;;;;;;;;;;;OAkBG;WACW,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,GAAG,MAAM;IAYnF;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;WACW,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,mBAAmB,EAAE,KAAK,EAAE,mBAAmB,GAAG,MAAM;IAW7G;;;;;;;;;;;;;;;;;;;OAmBG;WACW,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,mBAAmB,GAAG,MAAM;IAShF;;;;;;;;;;;;;;;;;;;;OAoBG;WACW,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,mBAAmB,GAAG,MAAM;IAQhF;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;WACW,UAAU,CAAC,KAAK,CAAC,EAAE,mBAAmB,GAAG,MAAM;IAgB7D,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAStC,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAK/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2CG;WACiB,SAAS,CACzB,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,EACpB,OAAO,CAAC,EAAE,sBAAsB,GAAG,oBAAoB,GACxD,OAAO,CAAC,MAAM,CAAC;WAaE,eAAe,CAC/B,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,GACrB,OAAO,CAAC,MAAM,CAAC;IAmBlB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsCG;WACW,aAAa,CACvB,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,GACrB,MAAM;IAaT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;WACW,eAAe,CACzB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,EAAE,EAAE,qBAAqB,GAAG,qBAAqB,EAAE,GACpD,MAAM;IAWT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;WACW,iBAAiB,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM;CAiBzE"}
@@ -1,3 +1,13 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import { Query } from "../index.js";
1
11
  /** Utility class for building SQL query strings */
2
12
  export default class QueryStatementBuilder {
3
13
  /**
@@ -246,14 +256,28 @@ export default class QueryStatementBuilder {
246
256
  * ```
247
257
  */
248
258
  static BuildJoin(fromTableName, joins, options) {
249
- var _a;
250
- const queryParts = [];
251
- queryParts.push(`SELECT ${(_a = options === null || options === void 0 ? void 0 : options.select) !== null && _a !== void 0 ? _a : "*"}`);
252
- queryParts.push(`FROM "${fromTableName}"`);
253
- queryParts.push(this.BuildJoinPart(fromTableName, joins));
254
- queryParts.push(this.BuildWhere(options === null || options === void 0 ? void 0 : options.where));
255
- queryParts.push(this.BuildQueryOptions(options !== null && options !== void 0 ? options : {}));
256
- return queryParts.join(" ");
259
+ return __awaiter(this, void 0, void 0, function* () {
260
+ const queryParts = [];
261
+ const selectClause = yield QueryStatementBuilder.BuildJoinSelect(fromTableName, joins);
262
+ queryParts.push(`SELECT ${selectClause}`);
263
+ queryParts.push(`FROM "${fromTableName}"`);
264
+ queryParts.push(this.BuildJoinPart(fromTableName, joins));
265
+ queryParts.push(this.BuildWhere(options === null || options === void 0 ? void 0 : options.where));
266
+ queryParts.push(this.BuildQueryOptions(options !== null && options !== void 0 ? options : {}));
267
+ return queryParts.join(" ");
268
+ });
269
+ }
270
+ static BuildJoinSelect(fromTableName, joins) {
271
+ return __awaiter(this, void 0, void 0, function* () {
272
+ const mainTableCols = yield Query.TableColumnInformation(fromTableName);
273
+ const mainTableSelect = mainTableCols.map(col => `"${fromTableName}"."${col.name}" AS "${fromTableName}__${col.name}"`).join(', ');
274
+ const joinArray = Array.isArray(joins) ? joins : [joins];
275
+ const joinedSelects = yield Promise.all(joinArray.map((join) => __awaiter(this, void 0, void 0, function* () {
276
+ const cols = yield Query.TableColumnInformation(join.fromTable);
277
+ return cols.map(col => `"${join.fromTable}"."${col.name}" AS "${join.fromTable}__${col.name}"`).join(', ');
278
+ })));
279
+ return [mainTableSelect, ...joinedSelects].join(', ');
280
+ });
257
281
  }
258
282
  /**
259
283
  * Build JOIN clause(s) recursively (helper method)
@@ -296,12 +320,11 @@ export default class QueryStatementBuilder {
296
320
  */
297
321
  static BuildJoinPart(fromTableName, joins) {
298
322
  const queryParts = [];
299
- const joinsArray = Array.isArray(joins) ? joins : [joins];
300
- let currentTableName = fromTableName;
301
- for (const join of joinsArray) {
323
+ joins = Array.isArray(joins) ? joins : [joins];
324
+ for (const join of joins) {
325
+ const baseTable = join.baseTable || fromTableName; // Use explicit base or default
302
326
  queryParts.push(`${join.joinType} JOIN "${join.fromTable}"`);
303
- queryParts.push(this.BuildJoinOnPart(currentTableName, join.fromTable, join.on));
304
- currentTableName = join.fromTable;
327
+ queryParts.push(this.BuildJoinOnPart(baseTable, join.fromTable, join.on));
305
328
  }
306
329
  return queryParts.join(" ");
307
330
  }
@@ -6,6 +6,7 @@ export default interface IDatabaseAdapter {
6
6
  exec(query: string): Promise<void>;
7
7
  transaction(fn: (items: any[]) => void): Promise<Function>;
8
8
  tableColumnInformation(tableName: string): Promise<TableColumnInfo[]>;
9
+ tableExists(tableName: string): Promise<boolean>;
9
10
  close(): Promise<void>;
10
11
  }
11
12
  //# sourceMappingURL=IDatabaseAdapter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"IDatabaseAdapter.d.ts","sourceRoot":"","sources":["../../src/interfaces/IDatabaseAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,iBAAiB,MAAM,wBAAwB,CAAC;AAEvD,MAAM,CAAC,OAAO,WAAW,gBAAgB;IACrC,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACnD,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,WAAW,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3D,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACtE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B"}
1
+ {"version":3,"file":"IDatabaseAdapter.d.ts","sourceRoot":"","sources":["../../src/interfaces/IDatabaseAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,iBAAiB,MAAM,wBAAwB,CAAC;AAEvD,MAAM,CAAC,OAAO,WAAW,gBAAgB;IACrC,OAAO,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACnD,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,WAAW,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,KAAK,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3D,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACtE,WAAW,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B"}
@@ -1,20 +1,26 @@
1
1
  import type Model from "../abstract/Model.js";
2
2
  import Record from "../base/Record.js";
3
- import { columnType, QueryCondition, QueryOptions, QueryWhereParameters } from "../types/index.js";
3
+ import { columnType, QueryWhereCondition, ExtraQueryParameters, relation, QueryIsEqualParameter } from "../types/index.js";
4
4
  export default class Repository<Type extends columnType, ModelType extends Model<Type>> {
5
5
  private static _instances;
6
6
  private models;
7
+ private manyToManyRelations;
7
8
  private Table;
8
- constructor(tableName: string, ModelClass: ModelType);
9
- static getInstance<ModelType extends columnType>(ModelClass: new () => Model<ModelType>, tableName: string): Repository<ModelType, Model<ModelType>>;
9
+ constructor(tableName: string, ModelClass: ModelType, customDatabaseAdapter?: string);
10
+ static getInstance<ModelType extends columnType>(ModelClass: new () => Model<ModelType>, tableName: string, customDatabaseAdapter?: string): Repository<ModelType, Model<ModelType>>;
11
+ private generatePivotTableKeys;
12
+ insertRecordIntoPivotTable(foreignKey: string, modelOfOrigin: ModelType, relation: relation): Promise<void>;
13
+ deleteRecordFromPivotTable(foreignKey: string, modelOfOrigin: ModelType, relation: relation): Promise<void>;
14
+ getManyToManyRelation(relation: relation): Promise<relation | undefined>;
15
+ doesTableExist(name: string): Promise<boolean>;
10
16
  syncModel(model: ModelType): void;
11
17
  getModel(name: string): ModelType;
12
18
  save(attributes: Type): Promise<void>;
13
- first(conditions: QueryCondition, Model: Model<Type>): Promise<Type | null>;
14
- get(conditions: QueryCondition, queryOptions: QueryOptions, Model: Model<Type>): Promise<Type[]>;
15
- all(Model: Model<Type>, queryscopes?: QueryCondition, queryOptions?: QueryOptions): Promise<Type[]>;
16
- update(primaryKey: QueryWhereParameters, newAttributes: Partial<Type>): Promise<Record<Type> | undefined>;
19
+ first(conditions: QueryWhereCondition, Model: Model<Type>): Promise<Type | null>;
20
+ get(conditions: QueryWhereCondition, queryOptions: ExtraQueryParameters, Model: Model<Type>): Promise<Type[]>;
21
+ all(Model: Model<Type>, queryscopes?: QueryWhereCondition, queryOptions?: ExtraQueryParameters): Promise<Type[]>;
22
+ update(primaryKey: QueryIsEqualParameter, newAttributes: Partial<Type>): Promise<Record<Type> | undefined>;
17
23
  private join;
18
- private mergeQueryConditions;
24
+ private mergeQueryWhereConditions;
19
25
  }
20
26
  //# sourceMappingURL=Repository.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Repository.d.ts","sourceRoot":"","sources":["../../src/runtime/Repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,yBAAyB,CAAC;AACjD,OAAO,MAAM,MAAM,sBAAsB,CAAC;AAG1C,OAAO,EAAE,UAAU,EAAQ,cAAc,EAAE,YAAY,EAA6B,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEvI,MAAM,CAAC,OAAO,OAAO,UAAU,CAAC,IAAI,SAAS,UAAU,EAAE,SAAS,SAAS,KAAK,CAAC,IAAI,CAAC;IAClF,OAAO,CAAC,MAAM,CAAC,UAAU,CAAqE;IAC9F,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,KAAK,CAAO;gBAER,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS;WAMtC,WAAW,CAAC,SAAS,SAAS,UAAU,EAClD,UAAU,EAAE,UAAU,KAAK,CAAC,SAAS,CAAC,EACtC,SAAS,EAAE,MAAM,GAClB,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAWnC,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAKjC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;IAI3B,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,KAAK,CAAC,UAAU,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAW3E,GAAG,CAAC,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAQhG,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,EAAE,cAAc,EAAE,YAAY,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAQnG,MAAM,CAAC,UAAU,EAAE,oBAAoB,EAAE,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;YAOxG,IAAI;IAyBlB,OAAO,CAAC,oBAAoB;CAG/B"}
1
+ {"version":3,"file":"Repository.d.ts","sourceRoot":"","sources":["../../src/runtime/Repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,yBAAyB,CAAC;AACjD,OAAO,MAAM,MAAM,sBAAsB,CAAC;AAG1C,OAAO,EAAE,UAAU,EAAQ,mBAAmB,EAAE,oBAAoB,EAAE,QAAQ,EAA6B,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE/J,MAAM,CAAC,OAAO,OAAO,UAAU,CAAC,IAAI,SAAS,UAAU,EAAE,SAAS,SAAS,KAAK,CAAC,IAAI,CAAC;IAClF,OAAO,CAAC,MAAM,CAAC,UAAU,CAAqE;IAC9F,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,mBAAmB,CAAoC;IAC/D,OAAO,CAAC,KAAK,CAAO;gBAER,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,qBAAqB,CAAC,EAAE,MAAM;WAMtE,WAAW,CAAC,SAAS,SAAS,UAAU,EAClD,UAAU,EAAE,UAAU,KAAK,CAAC,SAAS,CAAC,EACtC,SAAS,EAAE,MAAM,EACjB,qBAAqB,CAAC,EAAE,MAAM,GAC/B,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAW1C,OAAO,CAAC,sBAAsB;IAajB,0BAA0B,CACnC,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,SAAS,EACxB,QAAQ,EAAE,QAAQ,GACnB,OAAO,CAAC,IAAI,CAAC;IAKH,0BAA0B,CACnC,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,SAAS,EACxB,QAAQ,EAAE,QAAQ,GACnB,OAAO,CAAC,IAAI,CAAC;IAMH,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,GAAG,SAAS,CAAC;IAaxE,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKpD,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAKjC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;IAI3B,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,KAAK,CAAC,UAAU,EAAE,mBAAmB,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAYhF,GAAG,CAAC,UAAU,EAAE,mBAAmB,EAAE,YAAY,EAAE,oBAAoB,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAS7G,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,EAAE,mBAAmB,EAAE,YAAY,CAAC,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAShH,MAAM,CAAC,UAAU,EAAE,qBAAqB,EAAE,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;YAOzG,IAAI;IAgDlB,OAAO,CAAC,yBAAyB;CAGpC"}
@@ -10,22 +10,64 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
10
10
  import Query from "../base/Query.js";
11
11
  import Table from "../base/Table.js";
12
12
  class Repository {
13
- constructor(tableName, ModelClass) {
13
+ constructor(tableName, ModelClass, customDatabaseAdapter) {
14
14
  var _a;
15
15
  this.models = new Map();
16
+ this.manyToManyRelations = new Map();
16
17
  const modelPk = ((_a = ModelClass.primaryKey) === null || _a === void 0 ? void 0 : _a.toString()) || ModelClass.constructor.name;
17
18
  this.models.set(modelPk, ModelClass);
18
- this.Table = new Table(tableName);
19
+ this.Table = new Table(tableName, customDatabaseAdapter);
19
20
  }
20
- static getInstance(ModelClass, tableName) {
21
+ static getInstance(ModelClass, tableName, customDatabaseAdapter) {
21
22
  const className = ModelClass.name;
22
23
  if (!this._instances.has(className)) {
23
- const instance = new Repository(tableName, new ModelClass());
24
+ const instance = new Repository(tableName, new ModelClass(), customDatabaseAdapter);
24
25
  this._instances.set(className, instance);
25
26
  return instance;
26
27
  }
27
28
  return this._instances.get(className);
28
29
  }
30
+ generatePivotTableKeys(foreignKey, modelOfOrigin, relation) {
31
+ var _a;
32
+ const isLocal = !((_a = relation.pivotLocalKey) === null || _a === void 0 ? void 0 : _a.includes(modelOfOrigin.Configuration.table));
33
+ return {
34
+ [relation.pivotLocalKey]: isLocal ? foreignKey : modelOfOrigin.values[relation.foreignKey],
35
+ [relation.pivotForeignKey]: isLocal ? modelOfOrigin.values[relation.foreignKey] : foreignKey
36
+ };
37
+ }
38
+ insertRecordIntoPivotTable(foreignKey, modelOfOrigin, relation) {
39
+ return __awaiter(this, void 0, void 0, function* () {
40
+ const table = new Table(relation.pivotTable);
41
+ yield table.Insert(this.generatePivotTableKeys(foreignKey, modelOfOrigin, relation));
42
+ });
43
+ }
44
+ deleteRecordFromPivotTable(foreignKey, modelOfOrigin, relation) {
45
+ 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));
48
+ yield (record === null || record === void 0 ? void 0 : record.Delete());
49
+ });
50
+ }
51
+ getManyToManyRelation(relation) {
52
+ return __awaiter(this, void 0, void 0, function* () {
53
+ if (relation.pivotTable && this.manyToManyRelations.has(relation.pivotTable)) {
54
+ return this.manyToManyRelations.get(relation.pivotTable);
55
+ }
56
+ if (yield this.doesTableExist(relation.pivotTable)) {
57
+ this.manyToManyRelations.set(relation.pivotTable, relation);
58
+ return relation;
59
+ }
60
+ else {
61
+ throw new Error(`Pivot table ${relation.pivotTable} does not exist. Create it in alphabetical order before using many-to-many relationships.`);
62
+ }
63
+ });
64
+ }
65
+ doesTableExist(name) {
66
+ return __awaiter(this, void 0, void 0, function* () {
67
+ const table = new Table(name);
68
+ return yield table.exists();
69
+ });
70
+ }
29
71
  syncModel(model) {
30
72
  var _a;
31
73
  const modelPk = ((_a = model.primaryKey) === null || _a === void 0 ? void 0 : _a.toString()) || model.constructor.name;
@@ -43,7 +85,8 @@ class Repository {
43
85
  return __awaiter(this, void 0, void 0, function* () {
44
86
  let record;
45
87
  if (Model.JoinedEntities.length > 0) {
46
- record = yield this.join(Model, conditions, { limit: 1 }).then(results => results[0]);
88
+ const results = yield this.join(Model, conditions, { limit: 1 });
89
+ record = results[0] ? { values: results[0] } : undefined;
47
90
  }
48
91
  else {
49
92
  record = yield this.Table.Record({ where: conditions });
@@ -57,7 +100,8 @@ class Repository {
57
100
  return yield this.join(Model, conditions, queryOptions);
58
101
  }
59
102
  else {
60
- return yield this.Table.Records(Object.assign({ where: conditions }, queryOptions)).then(records => records.map(record => record.values));
103
+ const records = yield this.Table.Records(Object.assign({ where: conditions }, queryOptions));
104
+ return records.map(record => record.values);
61
105
  }
62
106
  });
63
107
  }
@@ -67,7 +111,8 @@ class Repository {
67
111
  return yield this.join(Model);
68
112
  }
69
113
  else {
70
- return yield this.Table.Records(Object.assign({ where: queryscopes }, queryOptions)).then(records => records.map(record => record.values));
114
+ const records = yield this.Table.Records(Object.assign({ where: queryscopes }, queryOptions));
115
+ return records.map(record => record.values);
71
116
  }
72
117
  });
73
118
  }
@@ -81,27 +126,49 @@ class Repository {
81
126
  }
82
127
  join(Model, conditions, queryOptions) {
83
128
  return __awaiter(this, void 0, void 0, function* () {
84
- const Join = Model.JoinedEntities.map(join => {
85
- const relation = Model.Relations.find(rel => rel.model.Configuration.table.toLowerCase() === join.relation.toLowerCase());
129
+ const Join = Model.JoinedEntities.flatMap(join => {
130
+ const relation = Model.Relations.find(rel => rel.model.Configuration.table.replace("_", "").toLowerCase() === join.relation.toLowerCase());
86
131
  if (join.queryScopes) {
87
- conditions = this.mergeQueryConditions(conditions || {}, join.queryScopes);
132
+ conditions = this.mergeQueryWhereConditions(conditions || {}, join.queryScopes);
88
133
  }
89
134
  if (!relation) {
90
135
  throw new Error(`Relation for joined entity ${join} not found.`);
91
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
+ }
92
157
  const JoinType = relation.type === 'hasOne' || relation.type === 'belongsTo' ? 'INNER' : 'LEFT';
93
- return {
94
- fromTable: relation.model.Configuration.table,
95
- joinType: JoinType,
96
- on: [
97
- { [relation.foreignKey]: relation.localKey }
98
- ]
99
- };
158
+ return [{
159
+ fromTable: relation.model.Configuration.table,
160
+ baseTable: Model.Configuration.table,
161
+ joinType: JoinType,
162
+ on: [
163
+ { [relation.foreignKey]: relation.localKey }
164
+ ]
165
+ }];
100
166
  });
101
- return (yield this.Table.Join(Join, Object.assign({ where: conditions }, queryOptions))).map(record => record.values);
167
+ const records = yield this.Table.Join(Join, Object.assign({ where: conditions }, queryOptions));
168
+ return records.map(record => record.values);
102
169
  });
103
170
  }
104
- mergeQueryConditions(base, additional) {
171
+ mergeQueryWhereConditions(base, additional) {
105
172
  return [...Query.ConvertParamsToArray(base), ...Query.ConvertParamsToArray(additional)];
106
173
  }
107
174
  }
@@ -1,6 +1,6 @@
1
1
  /** Model configuration and types */
2
2
  import Model from "../abstract/Model";
3
- import { columnType, QueryCondition } from "./index";
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
6
  export interface ModelObserver<T> {
@@ -24,6 +24,8 @@ export interface ModelScope {
24
24
  export interface ModelConfig {
25
25
  /** Table name - defaults to lowercase class name */
26
26
  table: string;
27
+ /** Custom adapter name - defaults to default name */
28
+ customAdapter?: string;
27
29
  /** Primary key column - defaults to 'id' */
28
30
  primaryKey: string;
29
31
  /** Whether to auto-increment primary key - defaults to true */
@@ -56,10 +58,13 @@ export interface ModelConfig {
56
58
  dateFormat?: string;
57
59
  }
58
60
  export type relation = {
59
- type: 'hasOne' | 'hasMany' | 'belongsTo';
61
+ type: 'hasOne' | 'hasMany' | 'belongsTo' | 'manyToMany';
60
62
  model: unknown & Model<columnType>;
61
63
  foreignKey: string;
62
- localKey?: string;
64
+ localKey: string;
65
+ pivotTable?: string;
66
+ pivotForeignKey?: string;
67
+ pivotLocalKey?: string;
63
68
  };
64
69
  export interface SoftDeletable {
65
70
  deleted_at?: string | Date | null;
@@ -71,6 +76,6 @@ export type ModelWithTimestamps = {
71
76
  };
72
77
  export type joinedEntity = {
73
78
  relation: string;
74
- queryScopes?: QueryCondition;
79
+ queryScopes?: QueryWhereCondition;
75
80
  };
76
81
  //# sourceMappingURL=model.d.ts.map
@@ -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,18 +1,18 @@
1
- export type QueryWhereParameters = {
1
+ export type QueryIsEqualParameter = {
2
2
  [key: string]: QueryValues;
3
3
  };
4
- export type QueryParameters = {
4
+ export type QueryComparisonParameters = {
5
5
  column: string;
6
6
  operator: '=' | '!=' | '<' | '<=' | '>' | '>=' | 'LIKE' | 'IN' | 'NOT IN';
7
7
  value: QueryValues;
8
8
  };
9
- export type QueryCondition = QueryWhereParameters | QueryParameters[];
9
+ export type QueryWhereCondition = QueryIsEqualParameter | QueryComparisonParameters[];
10
10
  export type QueryValues = string | number | boolean | null | bigint | Date;
11
- export type DefaultQueryOptions = {
11
+ export type DefaultQueryParameters = {
12
12
  select?: string;
13
- where?: QueryCondition;
13
+ where?: QueryWhereCondition;
14
14
  };
15
- export type QueryOptions = {
15
+ export type ExtraQueryParameters = {
16
16
  orderBy?: string;
17
17
  limit?: number;
18
18
  offset?: number;
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/types/query.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,oBAAoB,GAAG;IAC/B,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAAC;CAC9B,CAAA;AAED,MAAM,MAAM,eAAe,GAAG;IAC1B,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,cAAc,GAAG,oBAAoB,GAAG,eAAe,EAAE,CAAC;AAEtE,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI,CAAC;AAE3E,MAAM,MAAM,mBAAmB,GAAG;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,cAAc,CAAC;CAC1B,CAAA;AAED,MAAM,MAAM,YAAY,GAAG;IACvB,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":"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,4 +1,4 @@
1
- import { QueryValues, QueryWhereParameters } from "../index";
1
+ import { QueryValues, QueryIsEqualParameter } from "../index";
2
2
  export type TableColumnInfo = {
3
3
  cid: number;
4
4
  name: string;
@@ -25,8 +25,9 @@ export type ColumnDefinition = {
25
25
  };
26
26
  export type Join = {
27
27
  fromTable: string;
28
+ baseTable: string;
28
29
  joinType: 'INNER' | 'LEFT' | 'RIGHT' | 'FULL';
29
- on: QueryWhereParameters | QueryWhereParameters[];
30
- where?: QueryWhereParameters | QueryWhereParameters[];
30
+ on: QueryIsEqualParameter | QueryIsEqualParameter[];
31
+ where?: QueryIsEqualParameter | QueryIsEqualParameter[];
31
32
  };
32
33
  //# sourceMappingURL=table.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/types/table.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAE1D,MAAM,MAAM,eAAe,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAAA;CAAE,CAAC;AAExD,MAAM,MAAM,uBAAuB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAC9C,EAAE,EAAE,oBAAoB,GAAG,oBAAoB,EAAE,CAAC;IAClD,KAAK,CAAC,EAAE,oBAAoB,GAAG,oBAAoB,EAAE,CAAC;CACzD,CAAA"}
1
+ {"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/types/table.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAC;AAE3D,MAAM,MAAM,eAAe,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAAA;CAAE,CAAC;AAExD,MAAM,MAAM,uBAAuB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAC9C,EAAE,EAAE,qBAAqB,GAAG,qBAAqB,EAAE,CAAC;IACpD,KAAK,CAAC,EAAE,qBAAqB,GAAG,qBAAqB,EAAE,CAAC;CAC3D,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iamkirbki/database-handler-core",
3
- "version": "4.2.0",
3
+ "version": "4.3.0",
4
4
  "author": "iamkirbki",
5
5
  "description": "Core database abstractions and interfaces",
6
6
  "license": "ISC",