@iamkirbki/database-handler-core 3.1.3 → 4.0.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 (71) hide show
  1. package/dist/abstract/Model.d.ts +39 -16
  2. package/dist/abstract/Model.d.ts.map +1 -1
  3. package/dist/abstract/Model.js +148 -36
  4. package/dist/abstract/{Schema.d.ts → SchemaTableBuilder.d.ts} +3 -8
  5. package/dist/abstract/SchemaTableBuilder.d.ts.map +1 -0
  6. package/dist/abstract/{Schema.js → SchemaTableBuilder.js} +1 -3
  7. package/dist/base/Database.d.ts +13 -0
  8. package/dist/base/Database.d.ts.map +1 -0
  9. package/dist/base/Database.js +27 -0
  10. package/dist/base/Query.d.ts +43 -0
  11. package/dist/base/Query.d.ts.map +1 -0
  12. package/dist/base/Query.js +87 -0
  13. package/dist/base/Record.d.ts +23 -0
  14. package/dist/base/Record.d.ts.map +1 -0
  15. package/dist/base/Record.js +72 -0
  16. package/dist/base/Table.d.ts +27 -0
  17. package/dist/base/Table.d.ts.map +1 -0
  18. package/dist/base/Table.js +128 -0
  19. package/dist/helpers/QueryStatementBuilder.d.ts +4 -35
  20. package/dist/helpers/QueryStatementBuilder.d.ts.map +1 -1
  21. package/dist/helpers/QueryStatementBuilder.js +6 -37
  22. package/dist/index.d.ts +13 -9
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +8 -8
  25. package/dist/interfaces/IController.d.ts +8 -0
  26. package/dist/interfaces/IController.d.ts.map +1 -0
  27. package/dist/interfaces/IController.js +1 -0
  28. package/dist/interfaces/IDatabaseAdapter.d.ts.map +1 -1
  29. package/dist/interfaces/IMigration.d.ts +6 -0
  30. package/dist/interfaces/IMigration.d.ts.map +1 -0
  31. package/dist/interfaces/IMigration.js +1 -0
  32. package/dist/interfaces/ISchemaBuilder.d.ts +7 -0
  33. package/dist/interfaces/ISchemaBuilder.d.ts.map +1 -0
  34. package/dist/interfaces/ISchemaBuilder.js +1 -0
  35. package/dist/runtime/Container.d.ts +12 -0
  36. package/dist/runtime/Container.d.ts.map +1 -0
  37. package/dist/runtime/Container.js +29 -0
  38. package/dist/runtime/Repository.d.ts +17 -0
  39. package/dist/runtime/Repository.d.ts.map +1 -0
  40. package/dist/runtime/Repository.js +101 -0
  41. package/dist/types/index.d.ts +1 -4
  42. package/dist/types/index.d.ts.map +1 -1
  43. package/dist/types/index.js +1 -0
  44. package/dist/types/model.d.ts +71 -0
  45. package/dist/types/model.d.ts.map +1 -0
  46. package/dist/types/model.js +2 -0
  47. package/dist/types/table.d.ts +6 -2
  48. package/dist/types/table.d.ts.map +1 -1
  49. package/package.json +5 -4
  50. package/dist/Database.d.ts +0 -98
  51. package/dist/Database.d.ts.map +0 -1
  52. package/dist/Database.js +0 -126
  53. package/dist/Query.d.ts +0 -143
  54. package/dist/Query.d.ts.map +0 -1
  55. package/dist/Query.js +0 -205
  56. package/dist/Record.d.ts +0 -125
  57. package/dist/Record.d.ts.map +0 -1
  58. package/dist/Record.js +0 -174
  59. package/dist/Table.d.ts +0 -158
  60. package/dist/Table.d.ts.map +0 -1
  61. package/dist/Table.js +0 -258
  62. package/dist/abstract/Controller.d.ts +0 -13
  63. package/dist/abstract/Controller.d.ts.map +0 -1
  64. package/dist/abstract/Controller.js +0 -6
  65. package/dist/abstract/Migration.d.ts +0 -6
  66. package/dist/abstract/Migration.d.ts.map +0 -1
  67. package/dist/abstract/Migration.js +0 -2
  68. package/dist/abstract/Schema.d.ts.map +0 -1
  69. package/dist/abstract/User.d.ts +0 -8
  70. package/dist/abstract/User.d.ts.map +0 -1
  71. package/dist/abstract/User.js +0 -6
@@ -1,18 +1,41 @@
1
- import IDatabaseAdapter from "../interfaces/IDatabaseAdapter.js";
2
- import { QueryCondition } from "../types/query.js";
3
- import Table from "../Table.js";
4
- import Record from "../Record.js";
5
- export default abstract class Model<T extends object> {
6
- private Table;
7
- private QueryParams;
8
- constructor(table: Table);
9
- static connect<M extends Model<object>>(this: new (table: Table) => M, adapter: IDatabaseAdapter): Promise<M>;
10
- private RecordGet;
11
- get(): Promise<T | undefined>;
12
- all(): Promise<T[]>;
13
- where(QueryCondition: QueryCondition): this;
14
- create(data: T): Promise<Record<T> | undefined>;
15
- update(data: T): Promise<void>;
16
- delete(): Promise<void>;
1
+ import Repository from "../runtime/Repository.js";
2
+ import { columnType, QueryCondition, QueryValues, ModelConfig, relation } from "../types/index.js";
3
+ /** Abstract Model class for ORM-style database interactions */
4
+ export default abstract class Model<ModelType extends columnType> {
5
+ private _repository?;
6
+ protected get repository(): Repository<ModelType, Model<ModelType>>;
7
+ protected configuration: ModelConfig;
8
+ get Configuration(): ModelConfig;
9
+ protected originalAttributes: Partial<ModelType>;
10
+ protected attributes: Partial<ModelType>;
11
+ protected exists: boolean;
12
+ protected dirty: boolean;
13
+ protected queryScopes?: QueryCondition;
14
+ get primaryKeyColumn(): string;
15
+ get primaryKey(): QueryValues | undefined;
16
+ get values(): Partial<ModelType> | ModelType;
17
+ static where<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType, conditions: QueryCondition): ParamterModelType;
18
+ where(conditions: QueryCondition): this;
19
+ static whereId<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType, id: QueryValues): ParamterModelType;
20
+ whereId(id: QueryValues): this;
21
+ static find<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType, primaryKeyValue: QueryValues): ParamterModelType;
22
+ find(primaryKeyValue: QueryValues): this;
23
+ static findOrFail<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType, primaryKeyValue: QueryValues): Partial<columnType>;
24
+ findOrFail(primaryKeyValue?: QueryValues): Partial<ModelType> | ModelType;
25
+ get(): Promise<Partial<ModelType> | ModelType>;
26
+ static set<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType, attributes: Partial<columnType>): ParamterModelType;
27
+ set(attributes: Partial<ModelType>): this;
28
+ save(): this;
29
+ update(attributes: Partial<ModelType>): this;
30
+ all(): Promise<Partial<ModelType>[]>;
31
+ protected joinedEntities: string[];
32
+ protected relations: relation[];
33
+ get JoinedEntities(): string[];
34
+ get Relations(): relation[];
35
+ hasMany<modelType extends Model<columnType>>(model: modelType, foreignKey?: string, localKey?: string): this;
36
+ hasOne<modelType extends Model<columnType>>(model: modelType, foreignKey?: string, localKey?: string): this;
37
+ belongsTo<modelType extends Model<columnType>>(model: modelType, foreignKey?: string, localKey?: string): this;
38
+ static with<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType, tableName: string): ParamterModelType;
39
+ with(relationName: string): this;
17
40
  }
18
41
  //# sourceMappingURL=Model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"Model.d.ts","sourceRoot":"","sources":["../../src/abstract/Model.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,cAAc,EAAwB,MAAM,mBAAmB,CAAC;AACzE,OAAO,KAAK,MAAM,aAAa,CAAC;AAChC,OAAO,MAAM,MAAM,cAAc,CAAC;AAElC,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,KAAK,CAAC,CAAC,SAAS,MAAM;IAChD,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,WAAW,CAAsB;gBAEtB,KAAK,EAAE,KAAK;WAIX,OAAO,CAAC,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,EAE/C,IAAI,EAAE,KAAK,KAAK,EAAE,KAAK,KAAK,CAAC,EAC7B,OAAO,EAAE,gBAAgB,GAC1B,OAAO,CAAC,CAAC,CAAC;YAKC,SAAS;IAIV,GAAG,IAAI,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAK7B,GAAG,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC;IAKzB,KAAK,CAAC,cAAc,EAAE,cAAc,GAAG,IAAI;IAKrC,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC;IAI/C,MAAM,CAAC,IAAI,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAO9B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAMvC"}
1
+ {"version":3,"file":"Model.d.ts","sourceRoot":"","sources":["../../src/abstract/Model.ts"],"names":[],"mappings":"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"}
@@ -7,58 +7,170 @@ 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 Table from "../Table.js";
10
+ import Repository from "../runtime/Repository.js";
11
+ /** Abstract Model class for ORM-style database interactions */
11
12
  export default class Model {
12
- constructor(table) {
13
- this.QueryParams = {};
14
- this.Table = table;
13
+ constructor() {
14
+ this.configuration = {
15
+ table: '', // Must be set by subclass
16
+ primaryKey: 'id',
17
+ incrementing: true,
18
+ keyType: 'number',
19
+ timestamps: true,
20
+ createdAtColumn: 'created_at',
21
+ updatedAtColumn: 'updated_at',
22
+ guarded: ['*'],
23
+ };
24
+ this.originalAttributes = {};
25
+ this.attributes = {};
26
+ this.exists = false;
27
+ this.dirty = false;
28
+ this.joinedEntities = [];
29
+ this.relations = [];
15
30
  }
16
- static connect(adapter) {
17
- return __awaiter(this, void 0, void 0, function* () {
18
- const table = yield Table.create(this.name, adapter);
19
- return new this(table);
20
- });
31
+ get repository() {
32
+ if (!this._repository) {
33
+ this._repository = Repository.getInstance(this.constructor, this.Configuration.table);
34
+ }
35
+ return this._repository;
21
36
  }
22
- RecordGet() {
23
- return __awaiter(this, void 0, void 0, function* () {
24
- return yield this.Table.Record({ where: this.QueryParams });
37
+ get Configuration() {
38
+ return this.configuration;
39
+ }
40
+ get primaryKeyColumn() {
41
+ return this.configuration.primaryKey;
42
+ }
43
+ get primaryKey() {
44
+ return this.attributes[this.configuration.primaryKey];
45
+ }
46
+ get values() {
47
+ return this.attributes;
48
+ }
49
+ static where(conditions) {
50
+ const instance = new this();
51
+ return instance.where(conditions);
52
+ }
53
+ where(conditions) {
54
+ this.queryScopes = conditions;
55
+ return this;
56
+ }
57
+ static whereId(id) {
58
+ const instance = new this();
59
+ return instance.whereId(id);
60
+ }
61
+ whereId(id) {
62
+ this.queryScopes = { id: id };
63
+ return this;
64
+ }
65
+ static find(primaryKeyValue) {
66
+ const instance = new this();
67
+ return instance.find(primaryKeyValue);
68
+ }
69
+ find(primaryKeyValue) {
70
+ this.queryScopes = { [this.primaryKeyColumn]: primaryKeyValue };
71
+ return this;
72
+ }
73
+ static findOrFail(primaryKeyValue) {
74
+ const instance = new this();
75
+ return instance.findOrFail(primaryKeyValue);
76
+ }
77
+ findOrFail(primaryKeyValue) {
78
+ var _a;
79
+ if (primaryKeyValue) {
80
+ this.queryScopes = { [this.primaryKeyColumn]: primaryKeyValue };
81
+ }
82
+ const query = this.queryScopes || {};
83
+ (_a = this.repository) === null || _a === void 0 ? void 0 : _a.get(query, this).then((record) => {
84
+ if (!record) {
85
+ throw new Error(`Record with primary key ${primaryKeyValue} not found.`);
86
+ }
87
+ this.set(record);
25
88
  });
89
+ return this.attributes;
26
90
  }
27
91
  get() {
28
92
  return __awaiter(this, void 0, void 0, function* () {
29
- const record = yield this.RecordGet();
30
- return record === null || record === void 0 ? void 0 : record.values;
93
+ var _a;
94
+ this.attributes = (yield ((_a = this.repository) === null || _a === void 0 ? void 0 : _a.get(this.queryScopes || {}, this)));
95
+ return this.attributes;
31
96
  });
32
97
  }
33
- all() {
34
- return __awaiter(this, void 0, void 0, function* () {
35
- const records = yield this.Table.Records({ where: this.QueryParams });
36
- return records.map(record => record.values);
37
- });
98
+ static set(attributes) {
99
+ const instance = new this();
100
+ return instance.set(attributes);
38
101
  }
39
- where(QueryCondition) {
40
- this.QueryParams = QueryCondition;
102
+ set(attributes) {
103
+ if (attributes[this.primaryKeyColumn] !== undefined && !this.exists) {
104
+ this.repository.syncModel(this);
105
+ }
106
+ this.attributes = Object.assign(Object.assign({}, this.attributes), attributes);
107
+ this.dirty = true;
41
108
  return this;
42
109
  }
43
- create(data) {
44
- return __awaiter(this, void 0, void 0, function* () {
45
- return yield this.Table.Insert(data);
110
+ save() {
111
+ this.repository.save(this.attributes, this.originalAttributes);
112
+ this.originalAttributes = Object.assign(Object.assign({}, this.originalAttributes), this.attributes);
113
+ this.exists = true;
114
+ this.dirty = false;
115
+ return this;
116
+ }
117
+ update(attributes) {
118
+ var _a;
119
+ if (!this.exists) {
120
+ throw new Error("Cannot update a model that does not exist in the database.");
121
+ }
122
+ (_a = this.repository) === null || _a === void 0 ? void 0 : _a.update(attributes);
123
+ return this;
124
+ }
125
+ all() {
126
+ return this.repository.all(this);
127
+ }
128
+ get JoinedEntities() {
129
+ return this.joinedEntities;
130
+ }
131
+ get Relations() {
132
+ return this.relations;
133
+ }
134
+ hasMany(model, foreignKey = `${this.Configuration.table}_${this.Configuration.primaryKey}`, localKey = this.Configuration.primaryKey) {
135
+ this.relations.push({
136
+ type: 'hasMany',
137
+ model: model,
138
+ foreignKey: foreignKey,
139
+ localKey: localKey,
46
140
  });
141
+ return this;
47
142
  }
48
- update(data) {
49
- return __awaiter(this, void 0, void 0, function* () {
50
- const record = yield this.RecordGet();
51
- if (record) {
52
- yield record.Update(data);
53
- }
143
+ hasOne(model, foreignKey = `${model.Configuration.primaryKey}`, localKey = `${model.Configuration.table}_${model.Configuration.primaryKey}`) {
144
+ this.relations.push({
145
+ type: 'hasOne',
146
+ model: model,
147
+ foreignKey: foreignKey,
148
+ localKey: localKey,
54
149
  });
150
+ return this;
55
151
  }
56
- delete() {
57
- return __awaiter(this, void 0, void 0, function* () {
58
- const record = yield this.RecordGet();
59
- if (record) {
60
- yield record.Delete();
61
- }
152
+ belongsTo(model, foreignKey = `${model.Configuration.table}_${model.Configuration.primaryKey}`, localKey = model.Configuration.primaryKey) {
153
+ this.relations.push({
154
+ type: 'belongsTo',
155
+ model: model,
156
+ foreignKey: foreignKey,
157
+ localKey: localKey,
62
158
  });
159
+ return this;
160
+ }
161
+ static with(tableName) {
162
+ const instance = new this();
163
+ return instance.with(tableName);
164
+ }
165
+ with(relationName) {
166
+ this.joinedEntities.push(relationName);
167
+ const method = Reflect.get(this, relationName);
168
+ if (typeof method === 'function') {
169
+ method.call(this);
170
+ }
171
+ else {
172
+ throw new Error(`Relation method '${relationName}' does not exist on ${this.constructor.name}`);
173
+ }
174
+ return this;
63
175
  }
64
176
  }
@@ -1,10 +1,5 @@
1
- import { ColumnDefinition } from "@core/types/index";
2
- export declare abstract class AbstractSchemaBuilder {
3
- abstract createTable(name: string, callback: (table: SchemaTableBuilder) => void): Promise<void>;
4
- abstract dropTable(name: string): Promise<void>;
5
- abstract alterTable(oldName: string, callback: (table: SchemaTableBuilder) => void): Promise<void>;
6
- }
7
- export declare abstract class SchemaTableBuilder {
1
+ import { ColumnDefinition } from "../types/index";
2
+ export default abstract class SchemaTableBuilder {
8
3
  protected columns: ColumnDefinition[];
9
4
  protected addColumn(data: ColumnDefinition): this;
10
5
  abstract build(): string;
@@ -17,4 +12,4 @@ export declare abstract class SchemaTableBuilder {
17
12
  abstract boolean(name: string): this;
18
13
  abstract timestamps(): this;
19
14
  }
20
- //# sourceMappingURL=Schema.d.ts.map
15
+ //# sourceMappingURL=SchemaTableBuilder.d.ts.map
@@ -0,0 +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;IAoBjD,QAAQ,CAAC,KAAK,IAAI,MAAM;IAExB,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IACvC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IACvC,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,IAAI;IAExF,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IACjC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI;IACpD,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IACpC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IACpC,QAAQ,CAAC,UAAU,IAAI,IAAI;CAC9B"}
@@ -1,6 +1,4 @@
1
- export class AbstractSchemaBuilder {
2
- }
3
- export class SchemaTableBuilder {
1
+ export default class SchemaTableBuilder {
4
2
  constructor() {
5
3
  this.columns = [];
6
4
  }
@@ -0,0 +1,13 @@
1
+ import Table from "./Table.js";
2
+ import Query from "./Query.js";
3
+ import IDatabaseAdapter from "../interfaces/IDatabaseAdapter.js";
4
+ /** Main Database class */
5
+ export default class Database {
6
+ adapter: IDatabaseAdapter;
7
+ constructor(adapter: IDatabaseAdapter);
8
+ /** Get a Table instance for an existing table */
9
+ Table(name: string): Promise<Table>;
10
+ /** Create a Query object for executing custom SQL */
11
+ Query(table: Table, query: string): Query;
12
+ }
13
+ //# sourceMappingURL=Database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Database.d.ts","sourceRoot":"","sources":["../../src/base/Database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,gBAAgB,MAAM,sCAAsC,CAAC;AAEpE,0BAA0B;AAC1B,MAAM,CAAC,OAAO,OAAO,QAAQ;IACpB,OAAO,EAAE,gBAAgB,CAAC;gBAErB,OAAO,EAAE,gBAAgB;IAIrC,iDAAiD;IACpC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAIhD,qDAAqD;IAC9C,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK;CAGjD"}
@@ -0,0 +1,27 @@
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 Table from "./Table.js";
11
+ import Query from "./Query.js";
12
+ /** Main Database class */
13
+ export default class Database {
14
+ constructor(adapter) {
15
+ this.adapter = adapter;
16
+ }
17
+ /** Get a Table instance for an existing table */
18
+ Table(name) {
19
+ return __awaiter(this, void 0, void 0, function* () {
20
+ return new Table(name);
21
+ });
22
+ }
23
+ /** Create a Query object for executing custom SQL */
24
+ Query(table, query) {
25
+ return new Query(table, query, this.adapter);
26
+ }
27
+ }
@@ -0,0 +1,43 @@
1
+ import Table from "./Table.js";
2
+ import { QueryCondition, QueryWhereParameters } from "../types/index.js";
3
+ import Record from "./Record.js";
4
+ import IDatabaseAdapter from "../interfaces/IDatabaseAdapter.js";
5
+ /** Query class for executing custom SQL queries */
6
+ export default class Query {
7
+ readonly Table: Table;
8
+ private readonly _adapter;
9
+ private _query;
10
+ private _parameters;
11
+ get Parameters(): QueryCondition;
12
+ set Parameters(value: QueryCondition);
13
+ constructor(Table: Table, Query: string, adapter: IDatabaseAdapter);
14
+ /**
15
+ * Execute a query that modifies data (INSERT, UPDATE, DELETE)
16
+ *
17
+ * @template Type - Expected return type (typically { lastInsertRowid: number, changes: number })
18
+ * @returns Result object with lastInsertRowid and changes count
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * // INSERT query
23
+ * const query = db.Query(users, 'INSERT INTO users (name, age) VALUES (@name, @age)');
24
+ * query.Parameters = { name: 'John', age: 30 };
25
+ * const result = query.Run<{ lastInsertRowid: number, changes: number }>();
26
+ * console.log(`Inserted ID: ${result.lastInsertRowid}`);
27
+ *
28
+ * // UPDATE query
29
+ * const update = db.Query(users, 'UPDATE users SET age = @age WHERE id = @id');
30
+ * update.Parameters = { age: 31, id: 1 };
31
+ * const updateResult = update.Run<{ changes: number }>();
32
+ * console.log(`Updated ${updateResult.changes} rows`);
33
+ * ```
34
+ */
35
+ Run<Type>(): Promise<Type>;
36
+ /** Execute a SELECT query and return all matching rows */
37
+ All<Type>(): Promise<Record<Type>[]>;
38
+ static ConvertParamsToObject(params: QueryCondition): QueryWhereParameters;
39
+ static ConvertIdToString(params: QueryWhereParameters): QueryWhereParameters;
40
+ /** Execute a SELECT query and return the first matching row */
41
+ Get<Type>(): Promise<Record<Type> | undefined>;
42
+ }
43
+ //# sourceMappingURL=Query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Query.d.ts","sourceRoot":"","sources":["../../src/base/Query.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5E,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,gBAAgB,MAAM,sCAAsC,CAAC;AAEpE,mDAAmD;AACnD,MAAM,CAAC,OAAO,OAAO,KAAK;IACxB,SAAgB,KAAK,EAAE,KAAK,CAAC;IAE7B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,WAAW,CAAsB;IAEzC,IAAW,UAAU,IAAI,cAAc,CAEtC;IAED,IAAW,UAAU,CAAC,KAAK,EAAE,cAAc,EAE1C;gBAEW,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB;IAMlE;;;;;;;;;;;;;;;;;;;;OAoBG;IACU,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,IAAI,CAAC;IAKvC,0DAA0D;IAC7C,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;WAMnC,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,oBAAoB;WAanE,iBAAiB,CAAC,MAAM,EAAE,oBAAoB,GAAG,oBAAoB;IAQnF,+DAA+D;IAClD,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;CAK5D"}
@@ -0,0 +1,87 @@
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 Record from "./Record.js";
11
+ /** Query class for executing custom SQL queries */
12
+ export default class Query {
13
+ get Parameters() {
14
+ return this._parameters;
15
+ }
16
+ set Parameters(value) {
17
+ this._parameters = Query.ConvertParamsToObject(value);
18
+ }
19
+ constructor(Table, Query, adapter) {
20
+ this._query = "";
21
+ this._parameters = {};
22
+ this.Table = Table;
23
+ this._query = Query;
24
+ this._adapter = adapter;
25
+ }
26
+ /**
27
+ * Execute a query that modifies data (INSERT, UPDATE, DELETE)
28
+ *
29
+ * @template Type - Expected return type (typically { lastInsertRowid: number, changes: number })
30
+ * @returns Result object with lastInsertRowid and changes count
31
+ *
32
+ * @example
33
+ * ```typescript
34
+ * // INSERT query
35
+ * const query = db.Query(users, 'INSERT INTO users (name, age) VALUES (@name, @age)');
36
+ * query.Parameters = { name: 'John', age: 30 };
37
+ * const result = query.Run<{ lastInsertRowid: number, changes: number }>();
38
+ * console.log(`Inserted ID: ${result.lastInsertRowid}`);
39
+ *
40
+ * // UPDATE query
41
+ * const update = db.Query(users, 'UPDATE users SET age = @age WHERE id = @id');
42
+ * update.Parameters = { age: 31, id: 1 };
43
+ * const updateResult = update.Run<{ changes: number }>();
44
+ * console.log(`Updated ${updateResult.changes} rows`);
45
+ * ```
46
+ */
47
+ Run() {
48
+ return __awaiter(this, void 0, void 0, function* () {
49
+ const stmt = yield this._adapter.prepare(this._query);
50
+ return yield stmt.run(this.Parameters);
51
+ });
52
+ }
53
+ /** Execute a SELECT query and return all matching rows */
54
+ All() {
55
+ return __awaiter(this, void 0, void 0, function* () {
56
+ const stmt = yield this._adapter.prepare(this._query);
57
+ const results = yield stmt.all(this.Parameters);
58
+ return results.map(res => new Record(res, this._adapter, this.Table));
59
+ });
60
+ }
61
+ static ConvertParamsToObject(params) {
62
+ const paramObject = {};
63
+ if (Array.isArray(params)) {
64
+ params.forEach(param => {
65
+ paramObject[param.column] = param.value;
66
+ });
67
+ }
68
+ else {
69
+ Object.assign(paramObject, params);
70
+ }
71
+ return this.ConvertIdToString(paramObject);
72
+ }
73
+ static ConvertIdToString(params) {
74
+ if (params.id && typeof params.id === 'number') {
75
+ return Object.assign(Object.assign({}, params), { id: params.id.toString() });
76
+ }
77
+ return params;
78
+ }
79
+ /** Execute a SELECT query and return the first matching row */
80
+ Get() {
81
+ return __awaiter(this, void 0, void 0, function* () {
82
+ const stmt = yield this._adapter.prepare(this._query);
83
+ const results = yield stmt.get(this.Parameters);
84
+ return results ? new Record(results, this._adapter, this.Table) : undefined;
85
+ });
86
+ }
87
+ }
@@ -0,0 +1,23 @@
1
+ import { inspect } from "util";
2
+ import Table from "./Table.js";
3
+ import IDatabaseAdapter from "../interfaces/IDatabaseAdapter.js";
4
+ /** Record class represents a single database row */
5
+ export default class Record<ColumnValuesType> {
6
+ private readonly _adapter;
7
+ private _values;
8
+ private readonly _table;
9
+ constructor(values: ColumnValuesType, adapter: IDatabaseAdapter, table: Table);
10
+ /** Get the raw values object for this record */
11
+ get values(): ColumnValuesType;
12
+ /** Update this record in the database */
13
+ Update(newValues: object): Promise<void>;
14
+ /** Delete this record from the database */
15
+ Delete(): Promise<void>;
16
+ /** Returns the values object for JSON.stringify() */
17
+ toJSON(): ColumnValuesType;
18
+ /** Convert record to pretty-printed JSON string */
19
+ toString(): string;
20
+ /** Custom inspect for console.log() */
21
+ [inspect.custom](): ColumnValuesType;
22
+ }
23
+ //# sourceMappingURL=Record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Record.d.ts","sourceRoot":"","sources":["../../src/base/Record.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,KAAK,MAAM,YAAY,CAAC;AAE/B,OAAO,gBAAgB,MAAM,sCAAsC,CAAC;AAGpE,oDAAoD;AACpD,MAAM,CAAC,OAAO,OAAO,MAAM,CAAC,gBAAgB;IACxC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmB;IAC5C,OAAO,CAAC,OAAO,CAA4C;IAC3D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;gBAEnB,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,gBAAgB,EAAE,KAAK,EAAE,KAAK;IAM7E,gDAAgD;IAChD,IAAW,MAAM,IAAI,gBAAgB,CAEpC;IAED,yCAAyC;IAC5B,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BrD,2CAA2C;IAC9B,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;IAUpC,qDAAqD;IAC9C,MAAM,IAAI,gBAAgB;IAIjC,mDAAmD;IAC5C,QAAQ,IAAI,MAAM;IAIzB,uCAAuC;IACvC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,gBAAgB;CAGvC"}
@@ -0,0 +1,72 @@
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 { inspect } from "util";
11
+ import Query from "./Query.js";
12
+ /** Record class represents a single database row */
13
+ export default class Record {
14
+ constructor(values, adapter, table) {
15
+ this._values = {};
16
+ this._values = values;
17
+ this._adapter = adapter;
18
+ this._table = table;
19
+ }
20
+ /** Get the raw values object for this record */
21
+ get values() {
22
+ return this._values;
23
+ }
24
+ ;
25
+ /** Update this record in the database */
26
+ Update(newValues) {
27
+ return __awaiter(this, void 0, void 0, function* () {
28
+ const setClauses = Object.keys(newValues)
29
+ .map(key => `${key} = @${key}`)
30
+ .join(", ");
31
+ const originalValues = this._values;
32
+ if (originalValues.updated_at !== undefined) {
33
+ newValues.updated_at = new Date().toISOString();
34
+ }
35
+ const whereClauses = Object.keys(originalValues)
36
+ .map(key => `${key} = @where_${key}`)
37
+ .join(" AND ");
38
+ const query = `UPDATE "${this._table.Name}" SET ${setClauses} WHERE ${whereClauses};`;
39
+ const _query = new Query(this._table, query, this._adapter);
40
+ const params = Object.assign({}, newValues);
41
+ Object.entries(originalValues).forEach(([key, value]) => {
42
+ params[`where_${key}`] = value;
43
+ });
44
+ _query.Parameters = params;
45
+ yield _query.Run();
46
+ this._values = Object.assign(Object.assign({}, this._values), newValues);
47
+ });
48
+ }
49
+ /** Delete this record from the database */
50
+ Delete() {
51
+ return __awaiter(this, void 0, void 0, function* () {
52
+ const whereClauses = Object.keys(this._values)
53
+ .map(key => `${key} = @${key}`)
54
+ .join(" AND ");
55
+ const _query = new Query(this._table, `DELETE FROM "${this._table.Name}" WHERE ${whereClauses};`, this._adapter);
56
+ _query.Parameters = Object.assign({}, this._values);
57
+ yield _query.Run();
58
+ });
59
+ }
60
+ /** Returns the values object for JSON.stringify() */
61
+ toJSON() {
62
+ return this._values;
63
+ }
64
+ /** Convert record to pretty-printed JSON string */
65
+ toString() {
66
+ return JSON.stringify(this._values, null, 2);
67
+ }
68
+ /** Custom inspect for console.log() */
69
+ [inspect.custom]() {
70
+ return this._values;
71
+ }
72
+ }
@@ -0,0 +1,27 @@
1
+ import { DefaultQueryOptions, Join, QueryOptions, ReadableTableColumnInfo, TableColumnInfo, columnType } from "../types/index.js";
2
+ import Record from "../base/Record.js";
3
+ /** Table class for interacting with a database table */
4
+ export default class Table {
5
+ private readonly _name;
6
+ private readonly _adapter;
7
+ /** Private constructor - use Table.create() */
8
+ constructor(name: string);
9
+ /** Get the table name */
10
+ get Name(): string;
11
+ /** Get raw column information */
12
+ TableColumnInformation(): Promise<TableColumnInfo[]>;
13
+ /** Get readable, formatted column information */
14
+ ReadableTableColumnInformation(): Promise<ReadableTableColumnInfo[]>;
15
+ Drop(): Promise<void>;
16
+ /** Fetch records with optional filtering, ordering, and pagination */
17
+ Records<Type>(options?: DefaultQueryOptions & QueryOptions): Promise<Record<Type>[]>;
18
+ /** Fetch a single record from the table */
19
+ Record<Type>(options?: DefaultQueryOptions & QueryOptions): Promise<Record<Type> | undefined>;
20
+ /** Get the total count of records */
21
+ RecordsCount(): Promise<number>;
22
+ /** Insert a record into the table */
23
+ Insert<Type>(values: columnType): Promise<Record<Type> | undefined>;
24
+ /** Perform JOIN operations with other tables */
25
+ Join<Type>(Joins: Join | Join[], options?: DefaultQueryOptions & QueryOptions): Promise<Record<Type>[]>;
26
+ }
27
+ //# sourceMappingURL=Table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Table.d.ts","sourceRoot":"","sources":["../../src/base/Table.ts"],"names":[],"mappings":"AACA,OAAO,EACH,mBAAmB,EACnB,IAAI,EACJ,YAAY,EACZ,uBAAuB,EAEvB,eAAe,EAEf,UAAU,EACb,MAAM,sBAAsB,CAAC;AAE9B,OAAO,MAAM,MAAM,sBAAsB,CAAC;AAI1C,wDAAwD;AACxD,MAAM,CAAC,OAAO,OAAO,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0D;IAEnF,+CAA+C;gBACnC,IAAI,EAAE,MAAM;IAIxB,yBAAyB;IACzB,IAAW,IAAI,IAAI,MAAM,CAExB;IAED,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,EACrB,OAAO,CAAC,EAAE,mBAAmB,GAAG,YAAY,GAC7C,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;IAoB1B,2CAA2C;IAC9B,MAAM,CAAC,IAAI,EACpB,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,EAAE,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;IA+BhF,gDAAgD;IACnC,IAAI,CAAC,IAAI,EAClB,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,EACpB,OAAO,CAAC,EAAE,mBAAmB,GAAG,YAAY,GAC7C,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;CAW7B"}