@iamkirbki/database-handler-core 4.3.0 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/dist/abstract/Controller.d.ts +17 -0
  2. package/dist/abstract/Controller.d.ts.map +1 -0
  3. package/dist/abstract/Controller.js +47 -0
  4. package/dist/abstract/Model.d.ts +33 -19
  5. package/dist/abstract/Model.d.ts.map +1 -1
  6. package/dist/abstract/Model.js +177 -120
  7. package/dist/abstract/SchemaTableBuilder.d.ts +1 -1
  8. package/dist/abstract/SchemaTableBuilder.d.ts.map +1 -1
  9. package/dist/abstract/model/ModelRelation.d.ts +23 -0
  10. package/dist/abstract/model/ModelRelation.d.ts.map +1 -0
  11. package/dist/abstract/model/ModelRelation.js +130 -0
  12. package/dist/base/Query.d.ts +10 -13
  13. package/dist/base/Query.d.ts.map +1 -1
  14. package/dist/base/Query.js +68 -26
  15. package/dist/base/Record.d.ts +4 -2
  16. package/dist/base/Record.d.ts.map +1 -1
  17. package/dist/base/Record.js +24 -14
  18. package/dist/base/Table.d.ts +12 -7
  19. package/dist/base/Table.d.ts.map +1 -1
  20. package/dist/base/Table.js +87 -47
  21. package/dist/helpers/Errors/AdapterErrors/AdapterNotFoundError.d.ts +4 -0
  22. package/dist/helpers/Errors/AdapterErrors/AdapterNotFoundError.d.ts.map +1 -0
  23. package/dist/helpers/Errors/AdapterErrors/AdapterNotFoundError.js +6 -0
  24. package/dist/helpers/Errors/AdapterErrors/ConnectionFailedError.d.ts +4 -0
  25. package/dist/helpers/Errors/AdapterErrors/ConnectionFailedError.d.ts.map +1 -0
  26. package/dist/helpers/Errors/AdapterErrors/ConnectionFailedError.js +6 -0
  27. package/dist/helpers/Errors/AdapterErrors/NoDefaultAdapterError.d.ts +4 -0
  28. package/dist/helpers/Errors/AdapterErrors/NoDefaultAdapterError.d.ts.map +1 -0
  29. package/dist/helpers/Errors/AdapterErrors/NoDefaultAdapterError.js +6 -0
  30. package/dist/helpers/Errors/ExpressionErrors/InvalidExpressionParametersError.d.ts +4 -0
  31. package/dist/helpers/Errors/ExpressionErrors/InvalidExpressionParametersError.d.ts.map +1 -0
  32. package/dist/helpers/Errors/ExpressionErrors/InvalidExpressionParametersError.js +6 -0
  33. package/dist/helpers/Errors/ExpressionErrors/UnknownExpressionTypeError.d.ts +4 -0
  34. package/dist/helpers/Errors/ExpressionErrors/UnknownExpressionTypeError.d.ts.map +1 -0
  35. package/dist/helpers/Errors/ExpressionErrors/UnknownExpressionTypeError.js +6 -0
  36. package/dist/helpers/Errors/ExpressionErrors/UnsupportedQueryPhaseError.d.ts +4 -0
  37. package/dist/helpers/Errors/ExpressionErrors/UnsupportedQueryPhaseError.d.ts.map +1 -0
  38. package/dist/helpers/Errors/ExpressionErrors/UnsupportedQueryPhaseError.js +6 -0
  39. package/dist/helpers/Errors/QueryErrors/UnexpectedEmptyQueryError.d.ts +4 -0
  40. package/dist/helpers/Errors/QueryErrors/UnexpectedEmptyQueryError.d.ts.map +1 -0
  41. package/dist/helpers/Errors/QueryErrors/UnexpectedEmptyQueryError.js +6 -0
  42. package/dist/helpers/Errors/TableErrors/UnknownTableError.d.ts +4 -0
  43. package/dist/helpers/Errors/TableErrors/UnknownTableError.d.ts.map +1 -0
  44. package/dist/helpers/Errors/TableErrors/UnknownTableError.js +6 -0
  45. package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseDeleteQueryBuilder.d.ts +1 -0
  46. package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseDeleteQueryBuilder.d.ts.map +1 -0
  47. package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseDeleteQueryBuilder.js +1 -0
  48. package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseInsertQueryBuilder.d.ts +1 -0
  49. package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseInsertQueryBuilder.d.ts.map +1 -0
  50. package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseInsertQueryBuilder.js +11 -0
  51. package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseSelectQueryBuilder.d.ts +11 -0
  52. package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseSelectQueryBuilder.d.ts.map +1 -0
  53. package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseSelectQueryBuilder.js +27 -0
  54. package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseUpdateQueryBuilder.d.ts +1 -0
  55. package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseUpdateQueryBuilder.d.ts.map +1 -0
  56. package/dist/helpers/QueryBuilders/BaseQueryBuilders/BaseUpdateQueryBuilder.js +1 -0
  57. package/dist/helpers/QueryBuilders/ExpressionBuilders/JsonAggregateExpression.d.ts +9 -0
  58. package/dist/helpers/QueryBuilders/ExpressionBuilders/JsonAggregateExpression.d.ts.map +1 -0
  59. package/dist/helpers/QueryBuilders/ExpressionBuilders/JsonAggregateExpression.js +102 -0
  60. package/dist/helpers/QueryBuilders/ExpressionBuilders/SpatialDistanceExpression.d.ts +8 -0
  61. package/dist/helpers/QueryBuilders/ExpressionBuilders/SpatialDistanceExpression.d.ts.map +1 -0
  62. package/dist/helpers/QueryBuilders/ExpressionBuilders/SpatialDistanceExpression.js +63 -0
  63. package/dist/helpers/QueryBuilders/ExpressionBuilders/TextRelevanceExpression.d.ts +8 -0
  64. package/dist/helpers/QueryBuilders/ExpressionBuilders/TextRelevanceExpression.d.ts.map +1 -0
  65. package/dist/helpers/QueryBuilders/ExpressionBuilders/TextRelevanceExpression.js +49 -0
  66. package/dist/helpers/QueryBuilders/QueryDecorators/ExpressionDecorator.d.ts +19 -0
  67. package/dist/helpers/QueryBuilders/QueryDecorators/ExpressionDecorator.d.ts.map +1 -0
  68. package/dist/helpers/QueryBuilders/QueryDecorators/ExpressionDecorator.js +60 -0
  69. package/dist/helpers/QueryBuilders/QueryDecorators/GroupByDecorator.d.ts +9 -0
  70. package/dist/helpers/QueryBuilders/QueryDecorators/GroupByDecorator.d.ts.map +1 -0
  71. package/dist/helpers/QueryBuilders/QueryDecorators/GroupByDecorator.js +27 -0
  72. package/dist/helpers/QueryBuilders/QueryDecorators/JoinDecorator.d.ts +15 -0
  73. package/dist/helpers/QueryBuilders/QueryDecorators/JoinDecorator.d.ts.map +1 -0
  74. package/dist/helpers/QueryBuilders/QueryDecorators/JoinDecorator.js +74 -0
  75. package/dist/helpers/QueryBuilders/QueryDecorators/LimitDecorator.d.ts +10 -0
  76. package/dist/helpers/QueryBuilders/QueryDecorators/LimitDecorator.d.ts.map +1 -0
  77. package/dist/helpers/QueryBuilders/QueryDecorators/LimitDecorator.js +29 -0
  78. package/dist/helpers/QueryBuilders/QueryDecorators/OrderByDecorator.d.ts +9 -0
  79. package/dist/helpers/QueryBuilders/QueryDecorators/OrderByDecorator.d.ts.map +1 -0
  80. package/dist/helpers/QueryBuilders/QueryDecorators/OrderByDecorator.js +27 -0
  81. package/dist/helpers/QueryBuilders/QueryDecorators/QueryDecorator.d.ts +8 -0
  82. package/dist/helpers/QueryBuilders/QueryDecorators/QueryDecorator.d.ts.map +1 -0
  83. package/dist/helpers/QueryBuilders/QueryDecorators/QueryDecorator.js +5 -0
  84. package/dist/helpers/QueryBuilders/QueryDecorators/ValuesDecorator.d.ts +1 -0
  85. package/dist/helpers/QueryBuilders/QueryDecorators/ValuesDecorator.d.ts.map +1 -0
  86. package/dist/helpers/QueryBuilders/QueryDecorators/ValuesDecorator.js +17 -0
  87. package/dist/helpers/QueryBuilders/QueryDecorators/WhereDecorator.d.ts +9 -0
  88. package/dist/helpers/QueryBuilders/QueryDecorators/WhereDecorator.d.ts.map +1 -0
  89. package/dist/helpers/QueryBuilders/QueryDecorators/WhereDecorator.js +29 -0
  90. package/dist/helpers/QueryBuilders/QueryExpressionBuilder.d.ts +54 -0
  91. package/dist/helpers/QueryBuilders/QueryExpressionBuilder.d.ts.map +1 -0
  92. package/dist/helpers/QueryBuilders/QueryExpressionBuilder.js +102 -0
  93. package/dist/helpers/QueryBuilders/QueryStatementBuilder.d.ts +16 -0
  94. package/dist/helpers/QueryBuilders/QueryStatementBuilder.d.ts.map +1 -0
  95. package/dist/helpers/QueryBuilders/QueryStatementBuilder.js +169 -0
  96. package/dist/helpers/QueryBuilders/SqlRenderer.d.ts +15 -0
  97. package/dist/helpers/QueryBuilders/SqlRenderer.d.ts.map +1 -0
  98. package/dist/helpers/QueryBuilders/SqlRenderer.js +79 -0
  99. package/dist/helpers/QueryBuilders/oldQueryStatementBuilder.d.ts +160 -0
  100. package/dist/helpers/QueryBuilders/oldQueryStatementBuilder.d.ts.map +1 -0
  101. package/dist/helpers/QueryBuilders/oldQueryStatementBuilder.js +217 -0
  102. package/dist/interfaces/IExpressionBuilder.d.ts +7 -0
  103. package/dist/interfaces/IExpressionBuilder.d.ts.map +1 -0
  104. package/dist/interfaces/IExpressionBuilder.js +1 -0
  105. package/dist/interfaces/IQueryBuilder.d.ts +5 -0
  106. package/dist/interfaces/IQueryBuilder.d.ts.map +1 -0
  107. package/dist/interfaces/IQueryBuilder.js +1 -0
  108. package/dist/interfaces/ISchemaBuilder.d.ts +1 -1
  109. package/dist/interfaces/ISchemaBuilder.d.ts.map +1 -1
  110. package/dist/runtime/Container.d.ts +3 -0
  111. package/dist/runtime/Container.d.ts.map +1 -1
  112. package/dist/runtime/Container.js +12 -2
  113. package/dist/runtime/QueryCache.d.ts +12 -0
  114. package/dist/runtime/QueryCache.d.ts.map +1 -0
  115. package/dist/runtime/QueryCache.js +26 -0
  116. package/dist/runtime/Repository.d.ts +13 -7
  117. package/dist/runtime/Repository.d.ts.map +1 -1
  118. package/dist/runtime/Repository.js +114 -70
  119. package/dist/types/expressions.d.ts +154 -0
  120. package/dist/types/expressions.d.ts.map +1 -0
  121. package/dist/types/expressions.js +6 -0
  122. package/dist/types/factories.d.ts +7 -0
  123. package/dist/types/factories.d.ts.map +1 -0
  124. package/dist/types/factories.js +1 -0
  125. package/dist/types/index.d.ts +2 -0
  126. package/dist/types/index.d.ts.map +1 -1
  127. package/dist/types/index.js +2 -0
  128. package/dist/types/model.d.ts +8 -8
  129. package/dist/types/model.d.ts.map +1 -1
  130. package/dist/types/query.d.ts +63 -1
  131. package/dist/types/query.d.ts.map +1 -1
  132. package/package.json +11 -3
  133. package/dist/helpers/QueryStatementBuilder.d.ts +0 -304
  134. package/dist/helpers/QueryStatementBuilder.d.ts.map +0 -1
  135. package/dist/helpers/QueryStatementBuilder.js +0 -417
@@ -0,0 +1,17 @@
1
+ import Model from './Model.js';
2
+ import { columnType } from '../types/index.js';
3
+ export default abstract class Controller<Type extends columnType> {
4
+ abstract index(): Promise<Model<Type>[]>;
5
+ abstract show(value: string | number): Promise<Model<Type>>;
6
+ abstract edit(value: string | number): Promise<Model<Type>>;
7
+ abstract update(id: string | number, newValues: Type): Promise<Model<Type>>;
8
+ abstract create(data: Type): Promise<Model<Type>>;
9
+ abstract delete(id: string | number): Promise<boolean>;
10
+ static index<StaticType extends columnType>(this: new () => Controller<StaticType>): Promise<Model<StaticType>[]>;
11
+ static show<StaticType extends columnType>(this: new () => Controller<StaticType>, value: string | number): Promise<Model<StaticType>>;
12
+ static edit<StaticType extends columnType>(this: new () => Controller<StaticType>, value: string | number): Promise<Model<StaticType>>;
13
+ static update<StaticType extends columnType>(this: new () => Controller<StaticType>, id: string | number, newValues: StaticType): Promise<Model<StaticType>>;
14
+ static create<StaticType extends columnType>(this: new () => Controller<StaticType>, data: StaticType): Promise<Model<StaticType>>;
15
+ static delete<StaticType extends columnType>(this: new () => Controller<StaticType>, id: string | number): Promise<boolean>;
16
+ }
17
+ //# sourceMappingURL=Controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Controller.d.ts","sourceRoot":"","sources":["../../src/abstract/Controller.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,UAAU,CAAC,IAAI,SAAS,UAAU;IAC9D,QAAQ,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;IACxC,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3D,QAAQ,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3D,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3E,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjD,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;WAElC,KAAK,CAAC,UAAU,SAAS,UAAU,EACrD,IAAI,EAAE,UAAU,UAAU,CAAC,UAAU,CAAC,GACrC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,CAAC;WAKX,IAAI,CAAC,UAAU,SAAS,UAAU,EACpD,IAAI,EAAE,UAAU,UAAU,CAAC,UAAU,CAAC,EACtC,KAAK,EAAE,MAAM,GAAG,MAAM,GACrB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;WAKT,IAAI,CAAC,UAAU,SAAS,UAAU,EACpD,IAAI,EAAE,UAAU,UAAU,CAAC,UAAU,CAAC,EACtC,KAAK,EAAE,MAAM,GAAG,MAAM,GACrB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;WAKT,MAAM,CAAC,UAAU,SAAS,UAAU,EACtD,IAAI,EAAE,UAAU,UAAU,CAAC,UAAU,CAAC,EACtC,EAAE,EAAE,MAAM,GAAG,MAAM,EACnB,SAAS,EAAE,UAAU,GACpB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;WAKT,MAAM,CAAC,UAAU,SAAS,UAAU,EACtD,IAAI,EAAE,UAAU,UAAU,CAAC,UAAU,CAAC,EACtC,IAAI,EAAE,UAAU,GACf,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;WAKT,MAAM,CAAC,UAAU,SAAS,UAAU,EACtD,IAAI,EAAE,UAAU,UAAU,CAAC,UAAU,CAAC,EACtC,EAAE,EAAE,MAAM,GAAG,MAAM,GAClB,OAAO,CAAC,OAAO,CAAC;CAIpB"}
@@ -0,0 +1,47 @@
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
+ export default class Controller {
11
+ static index() {
12
+ return __awaiter(this, void 0, void 0, function* () {
13
+ const instance = new this();
14
+ return yield instance.index();
15
+ });
16
+ }
17
+ static show(value) {
18
+ return __awaiter(this, void 0, void 0, function* () {
19
+ const instance = new this();
20
+ return yield instance.show(value);
21
+ });
22
+ }
23
+ static edit(value) {
24
+ return __awaiter(this, void 0, void 0, function* () {
25
+ const instance = new this();
26
+ return yield instance.edit(value);
27
+ });
28
+ }
29
+ static update(id, newValues) {
30
+ return __awaiter(this, void 0, void 0, function* () {
31
+ const instance = new this();
32
+ return yield instance.update(id, newValues);
33
+ });
34
+ }
35
+ static create(data) {
36
+ return __awaiter(this, void 0, void 0, function* () {
37
+ const instance = new this();
38
+ return yield instance.create(data);
39
+ });
40
+ }
41
+ static delete(id) {
42
+ return __awaiter(this, void 0, void 0, function* () {
43
+ const instance = new this();
44
+ return yield instance.delete(id);
45
+ });
46
+ }
47
+ }
@@ -1,17 +1,18 @@
1
- import Repository from "../runtime/Repository.js";
2
- import { columnType, QueryWhereCondition, QueryValues, ModelConfig, relation, ExtraQueryParameters, joinedEntity } from "../types/index.js";
1
+ import Repository from '../runtime/Repository.js';
2
+ import ModelRelations from '../abstract/model/ModelRelation.js';
3
+ import { columnType, QueryWhereCondition, QueryValues, ModelConfig, SpatialPoint, SpatialPointColumns, NestedJsonAggregateDefinition, QueryLayers } from '../types/index.js';
3
4
  /** Abstract Model class for ORM-style database interactions */
4
- export default abstract class Model<ModelType extends columnType> {
5
+ export default abstract class Model<ModelType extends columnType> extends ModelRelations<ModelType> {
5
6
  private _repository?;
6
7
  protected get repository(): Repository<ModelType, Model<ModelType>>;
8
+ protected get self(): Model<ModelType>;
7
9
  protected configuration: ModelConfig;
8
10
  get Configuration(): ModelConfig;
9
11
  protected originalAttributes: Partial<ModelType>;
10
12
  protected attributes: Partial<ModelType>;
11
13
  protected exists: boolean;
12
14
  protected dirty: boolean;
13
- protected queryScopes?: QueryWhereCondition;
14
- protected queryOptions: ExtraQueryParameters;
15
+ protected queryLayers: QueryLayers;
15
16
  get primaryKeyColumn(): string;
16
17
  get primaryKey(): QueryValues | undefined;
17
18
  get values(): Partial<ModelType> | ModelType;
@@ -22,6 +23,7 @@ export default abstract class Model<ModelType extends columnType> {
22
23
  static orderBy<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType, column: string, direction?: 'ASC' | 'DESC'): ParamterModelType;
23
24
  orderBy(column: string, direction?: 'ASC' | 'DESC'): this;
24
25
  static where<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType, conditions: QueryWhereCondition): ParamterModelType;
26
+ private normalizeConditions;
25
27
  where(conditions: QueryWhereCondition): this;
26
28
  static whereId<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType, id: QueryValues): ParamterModelType;
27
29
  whereId(id: QueryValues): this;
@@ -38,20 +40,32 @@ export default abstract class Model<ModelType extends columnType> {
38
40
  set(attributes: Partial<ModelType>): this;
39
41
  save(): Promise<this>;
40
42
  update(attributes: Partial<ModelType>): Promise<this>;
41
- protected joinedEntities: joinedEntity[];
42
- protected relations: relation[];
43
- get JoinedEntities(): joinedEntity[];
44
- get Relations(): relation[];
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>;
54
- private normalizeQueryScopes;
43
+ near(params: {
44
+ referencePoint: SpatialPoint;
45
+ targetColumns: SpatialPointColumns;
46
+ maxDistance: number;
47
+ unit: 'km' | 'miles';
48
+ orderByDistance: 'ASC' | 'DESC';
49
+ alias?: string;
50
+ }): this;
51
+ isTextRelevant(params: {
52
+ targetColumns: string[];
53
+ searchTerm: string;
54
+ minimumRelevance?: number;
55
+ alias?: string;
56
+ orderByRelevance?: 'ASC' | 'DESC';
57
+ }): this;
58
+ JsonAggregate(params: {
59
+ table: string;
60
+ columns: string[];
61
+ groupByColumns?: string[];
62
+ alias?: string;
63
+ nested?: NestedJsonAggregateDefinition<string>[];
64
+ having?: QueryWhereCondition;
65
+ }): this;
66
+ toSql(): Promise<string>;
67
+ private collectSelectAliases;
68
+ private collectTables;
55
69
  toJSON(): Partial<ModelType> | ModelType;
56
70
  toObject(): Partial<ModelType> | ModelType;
57
71
  }
@@ -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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"}
@@ -7,11 +7,13 @@ 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
- import Repository from "../runtime/Repository.js";
10
+ import Repository from '../runtime/Repository.js';
11
+ import ModelRelations from '../abstract/model/ModelRelation.js';
12
+ import { QueryEvaluationPhase, } from '../types/index.js';
12
13
  /** Abstract Model class for ORM-style database interactions */
13
- export default class Model {
14
+ export default class Model extends ModelRelations {
14
15
  constructor() {
16
+ super(...arguments);
15
17
  this.configuration = {
16
18
  table: '', // Must be set by subclass
17
19
  primaryKey: 'id',
@@ -26,9 +28,13 @@ export default class Model {
26
28
  this.attributes = {};
27
29
  this.exists = false;
28
30
  this.dirty = false;
29
- this.queryOptions = {};
30
- this.joinedEntities = [];
31
- this.relations = [];
31
+ this.queryLayers = {
32
+ base: {
33
+ from: this.Configuration.table,
34
+ },
35
+ pretty: {},
36
+ final: {}
37
+ };
32
38
  }
33
39
  get repository() {
34
40
  if (!this._repository) {
@@ -36,6 +42,9 @@ export default class Model {
36
42
  }
37
43
  return this._repository;
38
44
  }
45
+ get self() {
46
+ return this;
47
+ }
39
48
  get Configuration() {
40
49
  return this.configuration;
41
50
  }
@@ -53,7 +62,10 @@ export default class Model {
53
62
  return instance.limit(value);
54
63
  }
55
64
  limit(value) {
56
- this.queryOptions.limit = value;
65
+ var _a;
66
+ var _b;
67
+ (_a = (_b = this.queryLayers).final) !== null && _a !== void 0 ? _a : (_b.final = {});
68
+ this.queryLayers.final.limit = value;
57
69
  return this;
58
70
  }
59
71
  static offset(value) {
@@ -61,10 +73,11 @@ export default class Model {
61
73
  return instance.offset(value);
62
74
  }
63
75
  offset(value) {
64
- if (!this.queryOptions.limit) {
65
- throw new Error("Offset cannot be set without a limit.");
76
+ var _a;
77
+ if (!((_a = this.queryLayers.final) === null || _a === void 0 ? void 0 : _a.limit)) {
78
+ throw new Error('Offset cannot be set without a limit.');
66
79
  }
67
- this.queryOptions.offset = value;
80
+ this.queryLayers.final.offset = value;
68
81
  return this;
69
82
  }
70
83
  static orderBy(column, direction = 'ASC') {
@@ -72,15 +85,36 @@ export default class Model {
72
85
  return instance.orderBy(column, direction);
73
86
  }
74
87
  orderBy(column, direction = 'ASC') {
75
- this.queryOptions.orderBy = column + " " + direction;
88
+ var _a, _b;
89
+ var _c, _d;
90
+ (_a = (_c = this.queryLayers).final) !== null && _a !== void 0 ? _a : (_c.final = {});
91
+ (_b = (_d = this.queryLayers.final).orderBy) !== null && _b !== void 0 ? _b : (_d.orderBy = []);
92
+ this.queryLayers.final.orderBy.push({ column, direction });
76
93
  return this;
77
94
  }
78
95
  static where(conditions) {
79
96
  const instance = new this();
80
97
  return instance.where(conditions);
81
98
  }
99
+ normalizeConditions(conditions) {
100
+ if (Array.isArray(conditions)) {
101
+ return conditions;
102
+ }
103
+ return Object.entries(conditions).map(([column, value]) => ({
104
+ column,
105
+ operator: '=',
106
+ value,
107
+ }));
108
+ }
82
109
  where(conditions) {
83
- this.queryScopes = conditions;
110
+ const normalized = this.normalizeConditions(conditions);
111
+ if (!this.queryLayers.base.where) {
112
+ this.queryLayers.base.where = normalized;
113
+ }
114
+ else {
115
+ const existing = this.normalizeConditions(this.queryLayers.base.where);
116
+ this.queryLayers.base.where = [...existing, ...normalized];
117
+ }
84
118
  return this;
85
119
  }
86
120
  static whereId(id) {
@@ -88,7 +122,7 @@ export default class Model {
88
122
  return instance.whereId(id);
89
123
  }
90
124
  whereId(id) {
91
- this.queryScopes = { id: id };
125
+ this.queryLayers.base.where = [{ column: this.primaryKeyColumn, operator: '=', value: id }];
92
126
  return this;
93
127
  }
94
128
  static find(primaryKeyValue) {
@@ -96,22 +130,22 @@ export default class Model {
96
130
  return instance.find(primaryKeyValue);
97
131
  }
98
132
  find(primaryKeyValue) {
99
- this.queryScopes = { [this.primaryKeyColumn]: primaryKeyValue };
133
+ this.queryLayers.base.where = [{ column: this.primaryKeyColumn, operator: '=', value: primaryKeyValue }];
100
134
  return this;
101
135
  }
102
136
  static findOrFail(primaryKeyValue) {
103
137
  return __awaiter(this, void 0, void 0, function* () {
104
138
  const instance = new this();
105
- return yield instance.findOrFail(primaryKeyValue);
139
+ return (yield instance.findOrFail(primaryKeyValue));
106
140
  });
107
141
  }
108
142
  findOrFail(primaryKeyValue) {
109
143
  return __awaiter(this, void 0, void 0, function* () {
110
144
  var _a;
111
145
  if (primaryKeyValue) {
112
- this.queryScopes = { [this.primaryKeyColumn]: primaryKeyValue };
146
+ this.queryLayers.base.where = [{ column: this.primaryKeyColumn, operator: '=', value: primaryKeyValue }];
113
147
  }
114
- const query = this.queryScopes || {};
148
+ const query = this.queryLayers;
115
149
  const record = yield ((_a = this.repository) === null || _a === void 0 ? void 0 : _a.first(query, this));
116
150
  if (!record) {
117
151
  throw new Error(`Record with primary key ${primaryKeyValue} not found.`);
@@ -131,7 +165,10 @@ export default class Model {
131
165
  first(primaryKeyValue) {
132
166
  return __awaiter(this, void 0, void 0, function* () {
133
167
  var _a;
134
- const attributes = yield ((_a = this.repository) === null || _a === void 0 ? void 0 : _a.first(primaryKeyValue ? { [this.configuration.primaryKey]: primaryKeyValue } : this.queryScopes || {}, this));
168
+ if (primaryKeyValue !== undefined) {
169
+ this.queryLayers.base.where = [{ column: this.primaryKeyColumn, operator: '=', value: primaryKeyValue }, ...this.normalizeConditions(this.queryLayers.base.where || [])];
170
+ }
171
+ const attributes = (yield ((_a = this.repository) === null || _a === void 0 ? void 0 : _a.first(Object.assign(Object.assign({}, this.queryLayers), { base: Object.assign(Object.assign({}, this.queryLayers.base), { from: this.Configuration.table, where: this.normalizeConditions(this.queryLayers.base.where || []) }) }), this)));
135
172
  if (attributes) {
136
173
  this.attributes = attributes;
137
174
  this.originalAttributes = Object.assign({}, attributes);
@@ -142,8 +179,8 @@ export default class Model {
142
179
  }
143
180
  get() {
144
181
  return __awaiter(this, void 0, void 0, function* () {
145
- const records = yield this.repository.get(this.queryScopes || {}, this.queryOptions, this);
146
- return records.map(record => {
182
+ const records = yield this.repository.get(Object.assign(Object.assign({}, this.queryLayers), { base: Object.assign(Object.assign({}, this.queryLayers.base), { from: this.Configuration.table }) }), this);
183
+ return records.map((record) => {
147
184
  const instance = new this.constructor();
148
185
  instance.set(record);
149
186
  instance.exists = true;
@@ -159,8 +196,8 @@ export default class Model {
159
196
  }
160
197
  all() {
161
198
  return __awaiter(this, void 0, void 0, function* () {
162
- const records = yield this.repository.all(this, this.queryScopes, this.queryOptions);
163
- return records.map(record => {
199
+ const records = yield this.repository.all(this, Object.assign(Object.assign({}, this.queryLayers), { base: Object.assign(Object.assign({}, this.queryLayers.base), { from: this.Configuration.table }) }));
200
+ return records.map((record) => {
164
201
  const instance = new this.constructor();
165
202
  instance.set(record);
166
203
  instance.exists = true;
@@ -195,10 +232,10 @@ export default class Model {
195
232
  return __awaiter(this, void 0, void 0, function* () {
196
233
  var _a;
197
234
  if (!this.exists) {
198
- throw new Error("Cannot update a model that does not exist in the database.");
235
+ throw new Error('Cannot update a model that does not exist in the database.');
199
236
  }
200
237
  if (this.primaryKey === undefined) {
201
- throw new Error("Primary key value is undefined. Cannot update record without a valid primary key.");
238
+ throw new Error('Primary key value is undefined. Cannot update record without a valid primary key.');
202
239
  }
203
240
  const newRecord = yield ((_a = this.repository) === null || _a === void 0 ? void 0 : _a.update({ [this.primaryKeyColumn]: this.primaryKey }, attributes));
204
241
  if (newRecord) {
@@ -208,115 +245,135 @@ export default class Model {
208
245
  return this;
209
246
  });
210
247
  }
211
- get JoinedEntities() {
212
- return this.joinedEntities;
213
- }
214
- get Relations() {
215
- return this.relations;
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
- }
240
- hasMany(model, foreignKey = `${this.Configuration.table}_${this.Configuration.primaryKey}`, localKey = this.Configuration.primaryKey) {
241
- this.relations.push({
242
- type: 'hasMany',
243
- model: model,
244
- foreignKey: foreignKey,
245
- localKey: localKey,
246
- });
247
- return this;
248
- }
249
- hasOne(model, foreignKey = `${model.Configuration.primaryKey}`, localKey = `${model.Configuration.table}_${model.Configuration.primaryKey}`) {
250
- this.relations.push({
251
- type: 'hasOne',
252
- model: model,
253
- foreignKey: foreignKey,
254
- localKey: localKey,
255
- });
248
+ near(params) {
249
+ var _a;
250
+ var _b;
251
+ const { referencePoint, targetColumns, maxDistance, unit, orderByDistance, alias = 'distance' } = params;
252
+ const valueClauseKeywords = [`${alias}_lat`, `${alias}_lon`];
253
+ const expression = {
254
+ type: 'spatialDistance',
255
+ requirements: {
256
+ phase: QueryEvaluationPhase.PROJECTION,
257
+ cardinality: 'row',
258
+ requiresAlias: true,
259
+ requiresSelectWrapping: true,
260
+ },
261
+ parameters: {
262
+ referencePoint: referencePoint,
263
+ targetColumns: targetColumns,
264
+ alias: alias,
265
+ maxDistance: maxDistance,
266
+ orderByDistance: orderByDistance,
267
+ valueClauseKeywords: valueClauseKeywords,
268
+ unit: unit,
269
+ where: {
270
+ [valueClauseKeywords[0]]: referencePoint.lat,
271
+ [valueClauseKeywords[1]]: referencePoint.lon,
272
+ }
273
+ },
274
+ };
275
+ (_a = (_b = this.queryLayers.base).expressions) !== null && _a !== void 0 ? _a : (_b.expressions = []);
276
+ this.queryLayers.base.expressions.push(expression);
256
277
  return this;
257
278
  }
258
- belongsTo(model, foreignKey = `${model.Configuration.table}_${model.Configuration.primaryKey}`, localKey = model.Configuration.primaryKey) {
259
- this.relations.push({
260
- type: 'belongsTo',
261
- model: model,
262
- foreignKey: foreignKey,
263
- localKey: localKey,
279
+ isTextRelevant(params) {
280
+ var _a, _b, _c, _d;
281
+ var _e, _f, _g, _h;
282
+ const { targetColumns, searchTerm, minimumRelevance, alias = 'relevance', orderByRelevance = "ASC" } = params;
283
+ const valueClauseKeyword = `${alias}_searchTerm`;
284
+ const expression = {
285
+ type: 'textRelevance',
286
+ requirements: {
287
+ phase: QueryEvaluationPhase.PROJECTION,
288
+ cardinality: 'row',
289
+ requiresAlias: true,
290
+ requiresSelectWrapping: true,
291
+ },
292
+ parameters: {
293
+ targetColumns: targetColumns,
294
+ searchTerm: searchTerm,
295
+ alias: alias,
296
+ minimumRelevance: minimumRelevance,
297
+ orderByRelevance: orderByRelevance,
298
+ valueClauseKeywords: [valueClauseKeyword],
299
+ where: {
300
+ [valueClauseKeyword]: searchTerm,
301
+ }
302
+ },
303
+ };
304
+ (_a = (_e = this.queryLayers.base).expressions) !== null && _a !== void 0 ? _a : (_e.expressions = []);
305
+ this.queryLayers.base.expressions.push(expression);
306
+ (_b = (_f = this.queryLayers).pretty) !== null && _b !== void 0 ? _b : (_f.pretty = {});
307
+ (_c = (_g = this.queryLayers.pretty).where) !== null && _c !== void 0 ? _c : (_g.where = []);
308
+ this.queryLayers.pretty.where.push({
309
+ column: alias,
310
+ operator: '>=',
311
+ value: minimumRelevance || 1,
264
312
  });
313
+ (_d = (_h = this.queryLayers.pretty).select) !== null && _d !== void 0 ? _d : (_h.select = []);
314
+ this.queryLayers.pretty.select.push(alias);
265
315
  return this;
266
316
  }
267
- static with(relation, queryScopes) {
268
- const instance = new this();
269
- return instance.with(relation, queryScopes);
270
- }
271
- with(relation, queryScopes) {
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
- }
276
- const lastRelation = this.relations[this.relations.length - 1];
277
- const tableName = lastRelation.model.Configuration.table;
278
- const normalizedScopes = this.normalizeQueryScopes(queryScopes, tableName);
279
- this.joinedEntities.push({
280
- relation: relation,
281
- queryScopes: normalizedScopes
317
+ JsonAggregate(params) {
318
+ var _a, _b, _c, _d, _e;
319
+ var _f, _g, _h, _j, _k;
320
+ const { table, columns, groupByColumns = [], alias = table, nested, having, } = params;
321
+ const expression = {
322
+ type: 'jsonAggregate',
323
+ requirements: {
324
+ phase: QueryEvaluationPhase.PROJECTION,
325
+ cardinality: 'row',
326
+ requiresAlias: true,
327
+ requiresSelectWrapping: true,
328
+ },
329
+ parameters: {
330
+ columns: columns,
331
+ table: table,
332
+ groupByColumns: groupByColumns,
333
+ alias: alias,
334
+ nested: nested,
335
+ having: having,
336
+ },
337
+ };
338
+ (_a = (_f = this.queryLayers.base).expressionsSelect) !== null && _a !== void 0 ? _a : (_f.expressionsSelect = []);
339
+ const selectAliases = this.collectSelectAliases({
340
+ table,
341
+ columns,
342
+ nested: nested || [],
282
343
  });
344
+ this.queryLayers.base.expressionsSelect.push(...selectAliases);
345
+ (_b = (_g = this.queryLayers).pretty) !== null && _b !== void 0 ? _b : (_g.pretty = {});
346
+ (_c = (_h = this.queryLayers.pretty).expressions) !== null && _c !== void 0 ? _c : (_h.expressions = []);
347
+ this.queryLayers.pretty.expressions.push(expression);
348
+ (_d = (_j = this.queryLayers).final) !== null && _d !== void 0 ? _d : (_j.final = {});
349
+ (_e = (_k = this.queryLayers.final).blacklistTables) !== null && _e !== void 0 ? _e : (_k.blacklistTables = []);
350
+ this.queryLayers.final.blacklistTables.push(...Array.from(new Set(this.collectTables({ table, nested: nested || [] }))));
283
351
  return this;
284
352
  }
285
- asyncWith(relation, queryScopes) {
353
+ toSql() {
286
354
  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;
355
+ var _a;
356
+ const sql = yield ((_a = this.repository) === null || _a === void 0 ? void 0 : _a.toSql(Object.assign(Object.assign({}, this.queryLayers), { base: Object.assign(Object.assign({}, this.queryLayers.base), { from: this.Configuration.table }) }), this));
357
+ return sql === null || sql === void 0 ? void 0 : sql.replace(/\s+/g, ' ').replace(/\n/g, '');
296
358
  });
297
359
  }
298
- callRelationMethod(relation) {
299
- const method = Reflect.get(this, relation);
300
- if (typeof method !== 'function') {
301
- throw new Error(`Relation method '${relation}' does not exist`);
360
+ collectSelectAliases(def) {
361
+ const columnAliases = def.columns.map(col => `${def.table}.${col} AS ${def.table}_${col}`);
362
+ if (def.nested) {
363
+ for (const child of def.nested) {
364
+ columnAliases.push(...this.collectSelectAliases(child));
365
+ }
302
366
  }
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;
307
- }
308
- normalizeQueryScopes(queryScopes, tableName) {
309
- if (!queryScopes) {
310
- return undefined;
367
+ return columnAliases;
368
+ }
369
+ collectTables(def) {
370
+ const result = [def.table];
371
+ if (def.nested) {
372
+ for (const child of def.nested) {
373
+ result.push(...this.collectTables(child));
374
+ }
311
375
  }
312
- const isSingleParameter = Object.keys(queryScopes).length === 3 &&
313
- 'column' in queryScopes &&
314
- 'operator' in queryScopes &&
315
- 'value' in queryScopes;
316
- let scopesArray = isSingleParameter
317
- ? [queryScopes]
318
- : Query.ConvertParamsToArray(queryScopes);
319
- return scopesArray.map(scope => (Object.assign(Object.assign({}, scope), { column: `${tableName}.${scope.column}` })));
376
+ return result;
320
377
  }
321
378
  toJSON() {
322
379
  return this.attributes;
@@ -1,4 +1,4 @@
1
- import { ColumnDefinition } from "../types/index";
1
+ import { ColumnDefinition } from "../types/index.js";
2
2
  export default abstract class SchemaTableBuilder {
3
3
  protected columns: ColumnDefinition[];
4
4
  protected addColumn(data: ColumnDefinition): this;
@@ -1 +1 @@
1
- {"version":3,"file":"SchemaTableBuilder.d.ts","sourceRoot":"","sources":["../../src/abstract/SchemaTableBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,kBAAkB;IAC5C,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,CAAM;IAE3C,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IA2BjD,QAAQ,CAAC,KAAK,IAAI,MAAM;IAExB,QAAQ,CAAC,UAAU,IAAI,IAAI;IAC3B,QAAQ,CAAC,UAAU,IAAI,IAAI;IAC3B,QAAQ,CAAC,QAAQ,IAAI,IAAI;IACzB,QAAQ,CAAC,MAAM,IAAI,IAAI;IACvB,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IACxC,QAAQ,CAAC,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI;IAE1E,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IACjC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IACnD,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IACjC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAEpC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IACjC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAEpD,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IACpC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IACxE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAElC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IACjC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IACtC,QAAQ,CAAC,UAAU,IAAI,IAAI;IAE3B,QAAQ,CAAC,WAAW,IAAI,IAAI;IAC5B,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CACtC"}
1
+ {"version":3,"file":"SchemaTableBuilder.d.ts","sourceRoot":"","sources":["../../src/abstract/SchemaTableBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,kBAAkB;IAC5C,SAAS,CAAC,OAAO,EAAE,gBAAgB,EAAE,CAAM;IAE3C,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,gBAAgB,GAAG,IAAI;IA2BjD,QAAQ,CAAC,KAAK,IAAI,MAAM;IAExB,QAAQ,CAAC,UAAU,IAAI,IAAI;IAC3B,QAAQ,CAAC,UAAU,IAAI,IAAI;IAC3B,QAAQ,CAAC,QAAQ,IAAI,IAAI;IACzB,QAAQ,CAAC,MAAM,IAAI,IAAI;IACvB,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IACxC,QAAQ,CAAC,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI;IAE1E,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IACjC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,IAAI;IACnD,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IACjC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAEpC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IACjC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IAEpD,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IACpC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;IACxE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAElC,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IACjC,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IACtC,QAAQ,CAAC,UAAU,IAAI,IAAI;IAE3B,QAAQ,CAAC,WAAW,IAAI,IAAI;IAC5B,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;CACtC"}
@@ -0,0 +1,23 @@
1
+ import { columnType, joinedEntity, ModelConfig, QueryWhereCondition, relation } from "../../types/index.js";
2
+ import Model from "../../abstract/Model.js";
3
+ import Repository from '../../runtime/Repository.js';
4
+ export default abstract class ModelRelations<Type extends columnType, Self extends Model<Type> = Model<Type>> {
5
+ protected joinedEntities: joinedEntity[];
6
+ protected relations: relation[];
7
+ abstract get Configuration(): ModelConfig;
8
+ protected abstract get repository(): Repository<Type, Self>;
9
+ protected abstract get self(): Self;
10
+ get JoinedEntities(): joinedEntity[];
11
+ get Relations(): relation[];
12
+ insertRecordIntoPivotTable(otherTable: string, foreignKey: string): Promise<void>;
13
+ protected ManyToMany<modelType extends Model<columnType>>(model: modelType, pivotTable?: string, localKey?: string, foreignKey?: string, pivotForeignKey?: string, pivotLocalKey?: string): Promise<this>;
14
+ protected hasMany<modelType extends Model<columnType>>(model: modelType, foreignKey?: string, localKey?: string): this;
15
+ protected hasOne<modelType extends Model<columnType>>(model: modelType, foreignKey?: string, localKey?: string): this;
16
+ protected belongsTo<modelType extends Model<columnType>>(model: modelType, foreignKey?: string, localKey?: string): this;
17
+ static with<ParameterModelType extends Model<columnType>>(this: new () => ParameterModelType, relation: string, queryScopes?: QueryWhereCondition): ParameterModelType;
18
+ with(relation: string, queryScopes?: QueryWhereCondition): this;
19
+ asyncWith(relation: string, queryScopes?: QueryWhereCondition): Promise<this>;
20
+ callRelationMethod(relation: string): void | Promise<void>;
21
+ private normalizeQueryScopes;
22
+ }
23
+ //# sourceMappingURL=ModelRelation.d.ts.map