@iamkirbki/database-handler-core 4.1.6 → 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,33 +21,38 @@ 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;
29
29
  find(primaryKeyValue: QueryValues): this;
30
- static findOrFail<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType, primaryKeyValue: QueryValues): Partial<columnType>;
31
- findOrFail(primaryKeyValue?: QueryValues): Partial<ModelType> | ModelType;
32
- static first<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType, primaryKeyValue?: string | number): Promise<Partial<columnType> | ParamterModelType>;
33
- first(primaryKeyValue?: string | number): Promise<Partial<ModelType>>;
34
- get(): Promise<Partial<ModelType>[]>;
35
- static all<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType): Promise<Partial<columnType>[]>;
36
- all(): Promise<Partial<ModelType>[]>;
30
+ static findOrFail<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType, primaryKeyValue: QueryValues): Promise<ParamterModelType>;
31
+ findOrFail(primaryKeyValue?: QueryValues): Promise<this>;
32
+ static first<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType, primaryKeyValue?: string | number): Promise<ParamterModelType>;
33
+ first(primaryKeyValue?: string | number): Promise<this>;
34
+ get(): Promise<this[]>;
35
+ static all<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType): Promise<ParamterModelType[]>;
36
+ all(): Promise<this[]>;
37
37
  static set<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType, attributes: Partial<columnType>): ParamterModelType;
38
38
  set(attributes: Partial<ModelType>): this;
39
39
  save(): Promise<this>;
40
- update(attributes: Partial<ModelType>): this;
40
+ update(attributes: Partial<ModelType>): Promise<this>;
41
41
  protected joinedEntities: joinedEntity[];
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;
55
+ toJSON(): Partial<ModelType> | ModelType;
56
+ toObject(): Partial<ModelType> | ModelType;
52
57
  }
53
58
  //# sourceMappingURL=Model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Model.d.ts","sourceRoot":"","sources":["../../src/abstract/Model.ts"],"names":[],"mappings":"AACA,OAAO,UAAU,MAAM,6BAA6B,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,EAAE,YAAY,EAAmB,MAAM,sBAAsB,CAAC;AAEnJ,+DAA+D;AAC/D,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,KAAK,CAAC,SAAS,SAAS,UAAU;IAC5D,OAAO,CAAC,WAAW,CAAC,CAA0C;IAE9D,SAAS,KAAK,UAAU,IAAI,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,CAQlE;IAED,SAAS,CAAC,aAAa,EAAE,WAAW,CASlC;IAEF,IAAW,aAAa,IAAI,WAAW,CAEtC;IAED,SAAS,CAAC,kBAAkB,EAAE,OAAO,CAAC,SAAS,CAAC,CAAM;IACtD,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,CAAM;IAC9C,SAAS,CAAC,MAAM,EAAE,OAAO,CAAS;IAClC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAS;IACjC,SAAS,CAAC,WAAW,CAAC,EAAE,cAAc,CAAC;IACvC,SAAS,CAAC,YAAY,EAAE,YAAY,CAAM;IAE1C,IAAW,gBAAgB,IAAI,MAAM,CAEpC;IAED,IAAW,UAAU,IAAI,WAAW,GAAG,SAAS,CAE/C;IAED,IAAW,MAAM,IAAI,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,CAElD;WAEa,KAAK,CAAC,iBAAiB,SAAS,KAAK,CAAC,UAAU,CAAC,EAC3D,IAAI,EAAE,UAAU,iBAAiB,EACjC,KAAK,EAAE,MAAM,GACd,iBAAiB;IAKb,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;WAKnB,MAAM,CAAC,iBAAiB,SAAS,KAAK,CAAC,UAAU,CAAC,EAC5D,IAAI,EAAE,UAAU,iBAAiB,EACjC,KAAK,EAAE,MAAM,GACd,iBAAiB;IAKb,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;WASpB,OAAO,CAAC,iBAAiB,SAAS,KAAK,CAAC,UAAU,CAAC,EAC7D,IAAI,EAAE,UAAU,iBAAiB,EACjC,MAAM,EAAE,MAAM,EACd,SAAS,GAAE,KAAK,GAAG,MAAc,GAClC,iBAAiB;IAKb,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,KAAK,GAAG,MAAc,GAAG,IAAI;WAKzD,KAAK,CAAC,iBAAiB,SAAS,KAAK,CAAC,UAAU,CAAC,EAC3D,IAAI,EAAE,UAAU,iBAAiB,EACjC,UAAU,EAAE,cAAc,GAC3B,iBAAiB;IAKb,KAAK,CAAC,UAAU,EAAE,cAAc,GAAG,IAAI;WAKhC,OAAO,CAAC,iBAAiB,SAAS,KAAK,CAAC,UAAU,CAAC,EAC7D,IAAI,EAAE,UAAU,iBAAiB,EACjC,EAAE,EAAE,WAAW,GAChB,iBAAiB;IAKb,OAAO,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI;WAKvB,IAAI,CAAC,iBAAiB,SAAS,KAAK,CAAC,UAAU,CAAC,EAC1D,IAAI,EAAE,UAAU,iBAAiB,EACjC,eAAe,EAAE,WAAW,GAC7B,iBAAiB;IAKb,IAAI,CAAC,eAAe,EAAE,WAAW,GAAG,IAAI;WAKjC,UAAU,CAAC,iBAAiB,SAAS,KAAK,CAAC,UAAU,CAAC,EAChE,IAAI,EAAE,UAAU,iBAAiB,EACjC,eAAe,EAAE,WAAW,GAC7B,OAAO,CAAC,UAAU,CAAC;IAKf,UAAU,CAAC,eAAe,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS;WAoB5D,KAAK,CAAC,iBAAiB,SAAS,KAAK,CAAC,UAAU,CAAC,EACjE,IAAI,EAAE,UAAU,iBAAiB,EACjC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,GAClC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,iBAAiB,CAAC;IAKtC,KAAK,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAKrE,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;WAInC,GAAG,CAAC,iBAAiB,SAAS,KAAK,CAAC,UAAU,CAAC,EAEzD,IAAI,EAAE,UAAU,iBAAiB,GAClC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;IAK1B,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;WAI7B,GAAG,CAAC,iBAAiB,SAAS,KAAK,CAAC,UAAU,CAAC,EACzD,IAAI,EAAE,UAAU,iBAAiB,EACjC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,GAChC,iBAAiB;IAKb,GAAG,CAAC,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI;IASnC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAQ3B,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI;IASnD,SAAS,CAAC,cAAc,EAAE,YAAY,EAAE,CAAM;IAC9C,SAAS,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAM;IAErC,IAAW,cAAc,IAAI,YAAY,EAAE,CAE1C;IAED,IAAW,SAAS,IAAI,QAAQ,EAAE,CAEjC;IAEM,OAAO,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU,CAAC,EAC9C,KAAK,EAAE,SAAS,EAChB,UAAU,GAAE,MAAuE,EACnF,QAAQ,GAAE,MAAsC,GACjD,IAAI;IAUA,MAAM,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU,CAAC,EAC7C,KAAK,EAAE,SAAS,EAChB,UAAU,GAAE,MAA4C,EACxD,QAAQ,GAAE,MAAyE,GACpF,IAAI;IAUA,SAAS,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU,CAAC,EAChD,KAAK,EAAE,SAAS,EAChB,UAAU,GAAE,MAAyE,EACrF,QAAQ,GAAE,MAAuC,GAClD,IAAI;WAUO,IAAI,CAAC,iBAAiB,SAAS,KAAK,CAAC,UAAU,CAAC,EAC1D,IAAI,EAAE,UAAU,iBAAiB,EACjC,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,cAAc,GAC7B,iBAAiB;IAKb,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,cAAc,GAAG,IAAI;IAgBjE,OAAO,CAAC,kBAAkB;IAY1B,OAAO,CAAC,oBAAoB;CAuB/B"}
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
  }
@@ -43,7 +43,7 @@ export default class Model {
43
43
  return this.configuration.primaryKey;
44
44
  }
45
45
  get primaryKey() {
46
- return this.attributes[this.configuration.primaryKey];
46
+ return this.originalAttributes[this.configuration.primaryKey];
47
47
  }
48
48
  get values() {
49
49
  return this.attributes;
@@ -100,22 +100,27 @@ export default class Model {
100
100
  return this;
101
101
  }
102
102
  static findOrFail(primaryKeyValue) {
103
- const instance = new this();
104
- return instance.findOrFail(primaryKeyValue);
103
+ return __awaiter(this, void 0, void 0, function* () {
104
+ const instance = new this();
105
+ return yield instance.findOrFail(primaryKeyValue);
106
+ });
105
107
  }
106
108
  findOrFail(primaryKeyValue) {
107
- var _a;
108
- if (primaryKeyValue) {
109
- this.queryScopes = { [this.primaryKeyColumn]: primaryKeyValue };
110
- }
111
- const query = this.queryScopes || {};
112
- (_a = this.repository) === null || _a === void 0 ? void 0 : _a.first(query, this).then((record) => {
109
+ return __awaiter(this, void 0, void 0, function* () {
110
+ var _a;
111
+ if (primaryKeyValue) {
112
+ this.queryScopes = { [this.primaryKeyColumn]: primaryKeyValue };
113
+ }
114
+ const query = this.queryScopes || {};
115
+ const record = yield ((_a = this.repository) === null || _a === void 0 ? void 0 : _a.first(query, this));
113
116
  if (!record) {
114
117
  throw new Error(`Record with primary key ${primaryKeyValue} not found.`);
115
118
  }
116
- this.set(record);
119
+ this.attributes = record;
120
+ this.originalAttributes = Object.assign({}, this.attributes);
121
+ this.exists = true;
122
+ return this;
117
123
  });
118
- return this.attributes;
119
124
  }
120
125
  static first(primaryKeyValue) {
121
126
  return __awaiter(this, void 0, void 0, function* () {
@@ -126,13 +131,26 @@ export default class Model {
126
131
  first(primaryKeyValue) {
127
132
  return __awaiter(this, void 0, void 0, function* () {
128
133
  var _a;
129
- this.attributes = (yield ((_a = this.repository) === null || _a === void 0 ? void 0 : _a.first(primaryKeyValue ? { [this.configuration.primaryKey]: primaryKeyValue } : {}, this)));
130
- return this.attributes;
134
+ const attributes = yield ((_a = this.repository) === null || _a === void 0 ? void 0 : _a.first(primaryKeyValue ? { [this.configuration.primaryKey]: primaryKeyValue } : this.queryScopes || {}, this));
135
+ if (attributes) {
136
+ this.attributes = attributes;
137
+ this.originalAttributes = Object.assign({}, attributes);
138
+ this.exists = true;
139
+ }
140
+ return this;
131
141
  });
132
142
  }
133
143
  get() {
134
144
  return __awaiter(this, void 0, void 0, function* () {
135
- return this.repository.get(this.queryScopes || {}, this.queryOptions, this);
145
+ const records = yield this.repository.get(this.queryScopes || {}, this.queryOptions, this);
146
+ return records.map(record => {
147
+ const instance = new this.constructor();
148
+ instance.set(record);
149
+ instance.exists = true;
150
+ instance.originalAttributes = Object.assign({}, record);
151
+ instance.attributes = Object.assign({}, record);
152
+ return instance;
153
+ });
136
154
  });
137
155
  }
138
156
  static all() {
@@ -140,7 +158,17 @@ export default class Model {
140
158
  return instance.all();
141
159
  }
142
160
  all() {
143
- return this.repository.all(this, this.queryScopes, this.queryOptions);
161
+ 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 => {
164
+ const instance = new this.constructor();
165
+ instance.set(record);
166
+ instance.exists = true;
167
+ instance.originalAttributes = Object.assign({}, record);
168
+ instance.attributes = Object.assign({}, record);
169
+ return instance;
170
+ });
171
+ });
144
172
  }
145
173
  static set(attributes) {
146
174
  const instance = new this();
@@ -164,12 +192,21 @@ export default class Model {
164
192
  });
165
193
  }
166
194
  update(attributes) {
167
- var _a;
168
- if (!this.exists) {
169
- throw new Error("Cannot update a model that does not exist in the database.");
170
- }
171
- (_a = this.repository) === null || _a === void 0 ? void 0 : _a.update(attributes);
172
- return this;
195
+ return __awaiter(this, void 0, void 0, function* () {
196
+ var _a;
197
+ if (!this.exists) {
198
+ throw new Error("Cannot update a model that does not exist in the database.");
199
+ }
200
+ if (this.primaryKey === undefined) {
201
+ throw new Error("Primary key value is undefined. Cannot update record without a valid primary key.");
202
+ }
203
+ const newRecord = yield ((_a = this.repository) === null || _a === void 0 ? void 0 : _a.update({ [this.primaryKeyColumn]: this.primaryKey }, attributes));
204
+ if (newRecord) {
205
+ this.originalAttributes = newRecord.values;
206
+ this.exists = true;
207
+ }
208
+ return this;
209
+ });
173
210
  }
174
211
  get JoinedEntities() {
175
212
  return this.joinedEntities;
@@ -177,6 +214,29 @@ export default class Model {
177
214
  get Relations() {
178
215
  return this.relations;
179
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
+ }
180
240
  hasMany(model, foreignKey = `${this.Configuration.table}_${this.Configuration.primaryKey}`, localKey = this.Configuration.primaryKey) {
181
241
  this.relations.push({
182
242
  type: 'hasMany',
@@ -209,7 +269,10 @@ export default class Model {
209
269
  return instance.with(relation, queryScopes);
210
270
  }
211
271
  with(relation, queryScopes) {
212
- 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
+ }
213
276
  const lastRelation = this.relations[this.relations.length - 1];
214
277
  const tableName = lastRelation.model.Configuration.table;
215
278
  const normalizedScopes = this.normalizeQueryScopes(queryScopes, tableName);
@@ -219,12 +282,28 @@ export default class Model {
219
282
  });
220
283
  return this;
221
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
+ }
222
298
  callRelationMethod(relation) {
223
299
  const method = Reflect.get(this, relation);
224
300
  if (typeof method !== 'function') {
225
- throw new Error(`Relation method '${relation}' does not exist on ${this.constructor.name}`);
301
+ throw new Error(`Relation method '${relation}' does not exist`);
226
302
  }
227
- 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;
228
307
  }
229
308
  normalizeQueryScopes(queryScopes, tableName) {
230
309
  if (!queryScopes) {
@@ -239,4 +318,10 @@ export default class Model {
239
318
  : Query.ConvertParamsToArray(queryScopes);
240
319
  return scopesArray.map(scope => (Object.assign(Object.assign({}, scope), { column: `${tableName}.${scope.column}` })));
241
320
  }
321
+ toJSON() {
322
+ return this.attributes;
323
+ }
324
+ toObject() {
325
+ return this.attributes;
326
+ }
242
327
  }
@@ -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,GAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IAI7E,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;
@@ -90,7 +106,7 @@ export default class Query {
90
106
  /** Databases don't like numeric values when inserting with a query */
91
107
  static ConvertValueToString(params) {
92
108
  return Object.entries(params).map(([key, value]) => {
93
- return { [key]: value !== null && value !== undefined ? value.toString() : value };
109
+ return { [key]: value !== null && !(value instanceof Date) && value !== undefined ? value.toString() : value };
94
110
  }).reduce((acc, curr) => (Object.assign(Object.assign({}, acc), curr)), {});
95
111
  }
96
112
  }
@@ -1,17 +1,18 @@
1
1
  import { inspect } from "util";
2
- import { columnType } 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>): Promise<void>;
13
+ Update(newValues: Partial<ColumnValuesType>, whereParameters: QueryIsEqualParameter): Promise<this>;
13
14
  /** Delete this record from the database */
14
- Delete(): 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,EAA0D,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,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBxE,2CAA2C;IAC9B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAOpC,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,30 +65,43 @@ export default class Record {
56
65
  });
57
66
  }
58
67
  /** Update this record in the database */
59
- Update(newValues) {
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, originalValues);
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);
88
+ return this;
75
89
  });
76
90
  }
77
91
  /** Delete this record from the database */
78
- Delete() {
92
+ Delete(primaryKey) {
79
93
  return __awaiter(this, void 0, void 0, function* () {
94
+ const originalValues = this._values;
95
+ if (originalValues.deleted_at !== undefined) {
96
+ this._values.deleted_at = new Date().toISOString();
97
+ yield this.Update(this._values, this._values.id ? { id: this._values.id } : primaryKey || {});
98
+ return;
99
+ }
80
100
  const queryStr = QueryStatementBuilder.BuildDelete(this._tableName, this._values);
81
- const _query = new Query(this._tableName, queryStr);
82
- _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
+ });
83
105
  yield _query.Run();
84
106
  });
85
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"}