@iamkirbki/database-handler-core 4.0.1 → 4.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/abstract/Model.d.ts +8 -1
- package/dist/abstract/Model.d.ts.map +1 -1
- package/dist/abstract/Model.js +30 -2
- package/dist/base/Query.d.ts +13 -31
- package/dist/base/Query.d.ts.map +1 -1
- package/dist/base/Query.js +33 -40
- package/dist/base/Record.d.ts +6 -7
- package/dist/base/Record.d.ts.map +1 -1
- package/dist/base/Record.js +41 -15
- package/dist/base/Table.d.ts +6 -8
- package/dist/base/Table.d.ts.map +1 -1
- package/dist/base/Table.js +40 -41
- package/dist/helpers/QueryStatementBuilder.d.ts +8 -9
- package/dist/helpers/QueryStatementBuilder.d.ts.map +1 -1
- package/dist/helpers/QueryStatementBuilder.js +21 -21
- package/dist/index.d.ts +1 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -2
- package/dist/runtime/Container.d.ts.map +1 -1
- package/dist/runtime/Container.js +4 -0
- package/dist/runtime/Repository.d.ts +3 -3
- package/dist/runtime/Repository.d.ts.map +1 -1
- package/dist/runtime/Repository.js +6 -6
- package/dist/types/table.d.ts +1 -2
- package/dist/types/table.d.ts.map +1 -1
- package/package.json +1 -1
- package/dist/base/Database.d.ts +0 -13
- package/dist/base/Database.d.ts.map +0 -1
- package/dist/base/Database.js +0 -27
package/dist/abstract/Model.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import Repository from "../runtime/Repository.js";
|
|
2
|
-
import { columnType, QueryCondition, QueryValues, ModelConfig, relation } from "../types/index.js";
|
|
2
|
+
import { columnType, QueryCondition, QueryValues, ModelConfig, relation, QueryOptions } 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?;
|
|
@@ -11,9 +11,16 @@ export default abstract class Model<ModelType extends columnType> {
|
|
|
11
11
|
protected exists: boolean;
|
|
12
12
|
protected dirty: boolean;
|
|
13
13
|
protected queryScopes?: QueryCondition;
|
|
14
|
+
protected queryOptions: QueryOptions;
|
|
14
15
|
get primaryKeyColumn(): string;
|
|
15
16
|
get primaryKey(): QueryValues | undefined;
|
|
16
17
|
get values(): Partial<ModelType> | ModelType;
|
|
18
|
+
static limit<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType, value: number): ParamterModelType;
|
|
19
|
+
limit(value: number): this;
|
|
20
|
+
static offset<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType, value: number): ParamterModelType;
|
|
21
|
+
offset(value: number): this;
|
|
22
|
+
static orderBy<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType, column: string, direction?: 'ASC' | 'DESC'): ParamterModelType;
|
|
23
|
+
orderBy(column: string, direction?: 'ASC' | 'DESC'): this;
|
|
17
24
|
static where<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType, conditions: QueryCondition): ParamterModelType;
|
|
18
25
|
where(conditions: QueryCondition): this;
|
|
19
26
|
static whereId<ParamterModelType extends Model<columnType>>(this: new () => ParamterModelType, id: QueryValues): ParamterModelType;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Model.d.ts","sourceRoot":"","sources":["../../src/abstract/Model.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,6BAA6B,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"Model.d.ts","sourceRoot":"","sources":["../../src/abstract/Model.ts"],"names":[],"mappings":"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"}
|
package/dist/abstract/Model.js
CHANGED
|
@@ -25,6 +25,7 @@ export default class Model {
|
|
|
25
25
|
this.attributes = {};
|
|
26
26
|
this.exists = false;
|
|
27
27
|
this.dirty = false;
|
|
28
|
+
this.queryOptions = {};
|
|
28
29
|
this.joinedEntities = [];
|
|
29
30
|
this.relations = [];
|
|
30
31
|
}
|
|
@@ -46,6 +47,33 @@ export default class Model {
|
|
|
46
47
|
get values() {
|
|
47
48
|
return this.attributes;
|
|
48
49
|
}
|
|
50
|
+
static limit(value) {
|
|
51
|
+
const instance = new this();
|
|
52
|
+
return instance.limit(value);
|
|
53
|
+
}
|
|
54
|
+
limit(value) {
|
|
55
|
+
this.queryOptions.limit = value;
|
|
56
|
+
return this;
|
|
57
|
+
}
|
|
58
|
+
static offset(value) {
|
|
59
|
+
const instance = new this();
|
|
60
|
+
return instance.offset(value);
|
|
61
|
+
}
|
|
62
|
+
offset(value) {
|
|
63
|
+
if (!this.queryOptions.limit) {
|
|
64
|
+
throw new Error("Offset cannot be set without a limit.");
|
|
65
|
+
}
|
|
66
|
+
this.queryOptions.offset = value;
|
|
67
|
+
return this;
|
|
68
|
+
}
|
|
69
|
+
static orderBy(column, direction = 'ASC') {
|
|
70
|
+
const instance = new this();
|
|
71
|
+
return instance.orderBy(column, direction);
|
|
72
|
+
}
|
|
73
|
+
orderBy(column, direction = 'ASC') {
|
|
74
|
+
this.queryOptions.orderBy = column + " " + direction;
|
|
75
|
+
return this;
|
|
76
|
+
}
|
|
49
77
|
static where(conditions) {
|
|
50
78
|
const instance = new this();
|
|
51
79
|
return instance.where(conditions);
|
|
@@ -103,7 +131,7 @@ export default class Model {
|
|
|
103
131
|
}
|
|
104
132
|
get() {
|
|
105
133
|
return __awaiter(this, void 0, void 0, function* () {
|
|
106
|
-
return this.repository.get(this.queryScopes || {}, this);
|
|
134
|
+
return this.repository.get(this.queryScopes || {}, this.queryOptions, this);
|
|
107
135
|
});
|
|
108
136
|
}
|
|
109
137
|
static all() {
|
|
@@ -111,7 +139,7 @@ export default class Model {
|
|
|
111
139
|
return instance.all();
|
|
112
140
|
}
|
|
113
141
|
all() {
|
|
114
|
-
return this.repository.all(this);
|
|
142
|
+
return this.repository.all(this, this.queryOptions);
|
|
115
143
|
}
|
|
116
144
|
static set(attributes) {
|
|
117
145
|
const instance = new this();
|
package/dist/base/Query.d.ts
CHANGED
|
@@ -1,43 +1,25 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
3
|
-
import Record from "./Record.js";
|
|
4
|
-
import IDatabaseAdapter from "../interfaces/IDatabaseAdapter.js";
|
|
1
|
+
import { columnType, QueryCondition, QueryWhereParameters, TableColumnInfo } from "../types/index.js";
|
|
2
|
+
import { Record } from "../index.js";
|
|
5
3
|
/** Query class for executing custom SQL queries */
|
|
6
4
|
export default class Query {
|
|
7
|
-
readonly
|
|
5
|
+
readonly TableName: string;
|
|
8
6
|
private readonly _adapter;
|
|
9
7
|
private _query;
|
|
10
8
|
private _parameters;
|
|
11
9
|
get Parameters(): QueryCondition;
|
|
12
10
|
set Parameters(value: QueryCondition);
|
|
13
|
-
constructor(
|
|
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
|
-
*/
|
|
11
|
+
constructor(TableName: string, Query: string);
|
|
12
|
+
/** Execute a non-SELECT query (INSERT, UPDATE, DELETE, etc.) */
|
|
35
13
|
Run<Type>(): Promise<Type>;
|
|
36
14
|
/** 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;
|
|
15
|
+
All<Type extends columnType>(): Promise<Record<Type>[]>;
|
|
40
16
|
/** Execute a SELECT query and return the first matching row */
|
|
41
|
-
Get<Type>(): Promise<Record<Type> | undefined>;
|
|
17
|
+
Get<Type extends columnType>(): Promise<Record<Type> | undefined>;
|
|
18
|
+
static tableColumnInformation(tableName: string): Promise<TableColumnInfo[]>;
|
|
19
|
+
Count(): Promise<number>;
|
|
20
|
+
/** Convert various parameter formats to a consistent object format */
|
|
21
|
+
static ConvertParamsToObject(params: QueryCondition): QueryWhereParameters;
|
|
22
|
+
/** Databases don't like numeric values when inserting with a query */
|
|
23
|
+
static ConvertValueToString(params: QueryWhereParameters): QueryWhereParameters;
|
|
42
24
|
}
|
|
43
25
|
//# sourceMappingURL=Query.d.ts.map
|
package/dist/base/Query.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Query.d.ts","sourceRoot":"","sources":["../../src/base/Query.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
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,MAAM,sBAAsB,CAAC;AACzG,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;IAMrC,sEAAsE;WACxD,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,oBAAoB;IAajF,sEAAsE;WACxD,oBAAoB,CAAC,MAAM,EAAE,oBAAoB,GAAG,oBAAoB;CAKvF"}
|
package/dist/base/Query.js
CHANGED
|
@@ -7,7 +7,7 @@ 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 Record from "
|
|
10
|
+
import { Container, Record } from "../index.js";
|
|
11
11
|
/** Query class for executing custom SQL queries */
|
|
12
12
|
export default class Query {
|
|
13
13
|
get Parameters() {
|
|
@@ -16,34 +16,14 @@ export default class Query {
|
|
|
16
16
|
set Parameters(value) {
|
|
17
17
|
this._parameters = Query.ConvertParamsToObject(value);
|
|
18
18
|
}
|
|
19
|
-
constructor(
|
|
19
|
+
constructor(TableName, Query) {
|
|
20
|
+
this._adapter = Container.getInstance().getAdapter();
|
|
20
21
|
this._query = "";
|
|
21
22
|
this._parameters = {};
|
|
22
|
-
this.
|
|
23
|
+
this.TableName = TableName;
|
|
23
24
|
this._query = Query;
|
|
24
|
-
this._adapter = adapter;
|
|
25
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
|
-
*/
|
|
26
|
+
/** Execute a non-SELECT query (INSERT, UPDATE, DELETE, etc.) */
|
|
47
27
|
Run() {
|
|
48
28
|
return __awaiter(this, void 0, void 0, function* () {
|
|
49
29
|
const stmt = yield this._adapter.prepare(this._query);
|
|
@@ -55,9 +35,30 @@ export default class Query {
|
|
|
55
35
|
return __awaiter(this, void 0, void 0, function* () {
|
|
56
36
|
const stmt = yield this._adapter.prepare(this._query);
|
|
57
37
|
const results = yield stmt.all(this.Parameters);
|
|
58
|
-
return results.map(res => new Record(res, this.
|
|
38
|
+
return results.map(res => new Record(res, this.TableName));
|
|
59
39
|
});
|
|
60
40
|
}
|
|
41
|
+
/** Execute a SELECT query and return the first matching row */
|
|
42
|
+
Get() {
|
|
43
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
44
|
+
const stmt = yield this._adapter.prepare(this._query);
|
|
45
|
+
const results = yield stmt.get(this.Parameters);
|
|
46
|
+
return results ? new Record(results, this.TableName) : undefined;
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
static tableColumnInformation(tableName) {
|
|
50
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
51
|
+
return Container.getInstance().getAdapter().tableColumnInformation(tableName);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
Count() {
|
|
55
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
56
|
+
const stmt = yield this._adapter.prepare(this._query);
|
|
57
|
+
const result = yield stmt.get(this.Parameters);
|
|
58
|
+
return parseInt(result.count) || 0;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
/** Convert various parameter formats to a consistent object format */
|
|
61
62
|
static ConvertParamsToObject(params) {
|
|
62
63
|
const paramObject = {};
|
|
63
64
|
if (Array.isArray(params)) {
|
|
@@ -68,20 +69,12 @@ export default class Query {
|
|
|
68
69
|
else {
|
|
69
70
|
Object.assign(paramObject, params);
|
|
70
71
|
}
|
|
71
|
-
return this.
|
|
72
|
+
return this.ConvertValueToString(paramObject);
|
|
72
73
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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
|
-
});
|
|
74
|
+
/** Databases don't like numeric values when inserting with a query */
|
|
75
|
+
static ConvertValueToString(params) {
|
|
76
|
+
return Object.entries(params).map(([key, value]) => {
|
|
77
|
+
return { [key]: value !== null && value !== undefined ? value.toString() : value };
|
|
78
|
+
}).reduce((acc, curr) => (Object.assign(Object.assign({}, acc), curr)), {});
|
|
86
79
|
}
|
|
87
80
|
}
|
package/dist/base/Record.d.ts
CHANGED
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
import { inspect } from "util";
|
|
2
|
-
import
|
|
3
|
-
import IDatabaseAdapter from "../interfaces/IDatabaseAdapter.js";
|
|
2
|
+
import { columnType } from "../types/index.js";
|
|
4
3
|
/** Record class represents a single database row */
|
|
5
|
-
export default class Record<ColumnValuesType> {
|
|
6
|
-
private readonly _adapter;
|
|
4
|
+
export default class Record<ColumnValuesType extends columnType> {
|
|
7
5
|
private _values;
|
|
8
|
-
private readonly
|
|
9
|
-
constructor(values: ColumnValuesType,
|
|
6
|
+
private readonly _tableName;
|
|
7
|
+
constructor(values: ColumnValuesType, table: string);
|
|
10
8
|
/** Get the raw values object for this record */
|
|
11
9
|
get values(): ColumnValuesType;
|
|
10
|
+
Insert(): Promise<this | undefined>;
|
|
12
11
|
/** Update this record in the database */
|
|
13
|
-
Update(newValues:
|
|
12
|
+
Update(newValues: Partial<ColumnValuesType>): Promise<void>;
|
|
14
13
|
/** Delete this record from the database */
|
|
15
14
|
Delete(): Promise<void>;
|
|
16
15
|
/** Returns the values object for JSON.stringify() */
|
|
@@ -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;
|
|
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"}
|
package/dist/base/Record.js
CHANGED
|
@@ -9,34 +9,62 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
9
9
|
};
|
|
10
10
|
import { inspect } from "util";
|
|
11
11
|
import Query from "./Query.js";
|
|
12
|
+
import QueryStatementBuilder from "../helpers/QueryStatementBuilder.js";
|
|
12
13
|
/** Record class represents a single database row */
|
|
13
14
|
export default class Record {
|
|
14
|
-
constructor(values,
|
|
15
|
+
constructor(values, table) {
|
|
15
16
|
this._values = {};
|
|
16
17
|
this._values = values;
|
|
17
|
-
this.
|
|
18
|
-
this._table = table;
|
|
18
|
+
this._tableName = table;
|
|
19
19
|
}
|
|
20
20
|
/** Get the raw values object for this record */
|
|
21
21
|
get values() {
|
|
22
22
|
return this._values;
|
|
23
23
|
}
|
|
24
24
|
;
|
|
25
|
+
Insert() {
|
|
26
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
27
|
+
var _a, _b;
|
|
28
|
+
const columns = Object.keys(this._values);
|
|
29
|
+
if (columns.length === 0) {
|
|
30
|
+
throw new Error("Cannot insert record with no columns");
|
|
31
|
+
}
|
|
32
|
+
const queryStr = QueryStatementBuilder.BuildInsert(this._tableName, this._values);
|
|
33
|
+
const query = new Query(this._tableName, queryStr);
|
|
34
|
+
query.Parameters = this._values;
|
|
35
|
+
const result = yield query.Run();
|
|
36
|
+
let recordId;
|
|
37
|
+
// For PostgreSQL compatibility: use 'id' from values if lastInsertRowid is undefined
|
|
38
|
+
if (Array.isArray(this._values)) {
|
|
39
|
+
recordId = (_a = result === null || result === void 0 ? void 0 : result.lastInsertRowid) !== null && _a !== void 0 ? _a : this._values.map(v => v.column === 'id' ? v.value : undefined);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
recordId = (_b = result === null || result === void 0 ? void 0 : result.lastInsertRowid) !== null && _b !== void 0 ? _b : this._values.id;
|
|
43
|
+
}
|
|
44
|
+
if (recordId === undefined) {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
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);
|
|
50
|
+
const insertedRecord = yield querySelect.All();
|
|
51
|
+
if (insertedRecord.length > 0) {
|
|
52
|
+
this._values = insertedRecord[insertedRecord.length - 1].values;
|
|
53
|
+
}
|
|
54
|
+
this._values = Object.assign(Object.assign({}, this._values), { id: recordId });
|
|
55
|
+
return this;
|
|
56
|
+
});
|
|
57
|
+
}
|
|
25
58
|
/** Update this record in the database */
|
|
26
59
|
Update(newValues) {
|
|
27
60
|
return __awaiter(this, void 0, void 0, function* () {
|
|
28
|
-
const setClauses = Object.keys(newValues)
|
|
29
|
-
.map(key => `${key} = @${key}`)
|
|
30
|
-
.join(", ");
|
|
31
61
|
const originalValues = this._values;
|
|
32
62
|
if (originalValues.updated_at !== undefined) {
|
|
33
63
|
newValues.updated_at = new Date().toISOString();
|
|
34
64
|
}
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
const query = `UPDATE "${this._table.Name}" SET ${setClauses} WHERE ${whereClauses};`;
|
|
39
|
-
const _query = new Query(this._table, query, this._adapter);
|
|
65
|
+
const queryStr = QueryStatementBuilder.BuildUpdate(this._tableName, newValues, originalValues);
|
|
66
|
+
const _query = new Query(this._tableName, queryStr);
|
|
67
|
+
// Merge newValues and originalValues for parameters (with 'where_' prefix for where clause)
|
|
40
68
|
const params = Object.assign({}, newValues);
|
|
41
69
|
Object.entries(originalValues).forEach(([key, value]) => {
|
|
42
70
|
params[`where_${key}`] = value;
|
|
@@ -49,10 +77,8 @@ export default class Record {
|
|
|
49
77
|
/** Delete this record from the database */
|
|
50
78
|
Delete() {
|
|
51
79
|
return __awaiter(this, void 0, void 0, function* () {
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
.join(" AND ");
|
|
55
|
-
const _query = new Query(this._table, `DELETE FROM "${this._table.Name}" WHERE ${whereClauses};`, this._adapter);
|
|
80
|
+
const queryStr = QueryStatementBuilder.BuildDelete(this._tableName, this._values);
|
|
81
|
+
const _query = new Query(this._tableName, queryStr);
|
|
56
82
|
_query.Parameters = Object.assign({}, this._values);
|
|
57
83
|
yield _query.Run();
|
|
58
84
|
});
|
package/dist/base/Table.d.ts
CHANGED
|
@@ -1,27 +1,25 @@
|
|
|
1
1
|
import { DefaultQueryOptions, Join, QueryOptions, ReadableTableColumnInfo, TableColumnInfo, columnType } from "../types/index.js";
|
|
2
|
-
import Record from "../
|
|
2
|
+
import { Record } from "../index.js";
|
|
3
3
|
/** Table class for interacting with a database table */
|
|
4
4
|
export default class Table {
|
|
5
5
|
private readonly _name;
|
|
6
|
-
private readonly _adapter;
|
|
7
6
|
/** Private constructor - use Table.create() */
|
|
8
7
|
constructor(name: string);
|
|
9
|
-
/** Get the table name */
|
|
10
|
-
get Name(): string;
|
|
11
8
|
/** Get raw column information */
|
|
12
9
|
TableColumnInformation(): Promise<TableColumnInfo[]>;
|
|
13
10
|
/** Get readable, formatted column information */
|
|
14
11
|
ReadableTableColumnInformation(): Promise<ReadableTableColumnInfo[]>;
|
|
15
12
|
Drop(): Promise<void>;
|
|
16
13
|
/** Fetch records with optional filtering, ordering, and pagination */
|
|
17
|
-
Records<Type>(options?: DefaultQueryOptions & QueryOptions): Promise<Record<Type>[]>;
|
|
14
|
+
Records<Type extends columnType>(options?: DefaultQueryOptions & QueryOptions): Promise<Record<Type>[]>;
|
|
18
15
|
/** Fetch a single record from the table */
|
|
19
|
-
Record<Type>(options?: DefaultQueryOptions & QueryOptions): Promise<Record<Type> | undefined>;
|
|
16
|
+
Record<Type extends columnType>(options?: DefaultQueryOptions & QueryOptions): Promise<Record<Type> | undefined>;
|
|
20
17
|
/** Get the total count of records */
|
|
21
18
|
RecordsCount(): Promise<number>;
|
|
22
19
|
/** Insert a record into the table */
|
|
23
|
-
Insert<Type>(values:
|
|
20
|
+
Insert<Type extends columnType>(values: Type): Promise<Record<Type> | undefined>;
|
|
24
21
|
/** Perform JOIN operations with other tables */
|
|
25
|
-
Join<Type>(Joins: Join | Join[], options?: DefaultQueryOptions & QueryOptions): Promise<Record<Type>[]>;
|
|
22
|
+
Join<Type extends columnType>(Joins: Join | Join[], options?: DefaultQueryOptions & QueryOptions): Promise<Record<Type>[]>;
|
|
23
|
+
private splitJoinValues;
|
|
26
24
|
}
|
|
27
25
|
//# sourceMappingURL=Table.d.ts.map
|
package/dist/base/Table.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Table.d.ts","sourceRoot":"","sources":["../../src/base/Table.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/base/Table.js
CHANGED
|
@@ -7,24 +7,18 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
7
7
|
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
8
|
});
|
|
9
9
|
};
|
|
10
|
-
import Query from "../base/Query.js";
|
|
11
10
|
import QueryStatementBuilder from "../helpers/QueryStatementBuilder.js";
|
|
12
|
-
import
|
|
11
|
+
import { Record, Query } from "../index.js";
|
|
13
12
|
/** Table class for interacting with a database table */
|
|
14
13
|
export default class Table {
|
|
15
14
|
/** Private constructor - use Table.create() */
|
|
16
15
|
constructor(name) {
|
|
17
|
-
this._adapter = Container.getInstance().getAdapter();
|
|
18
16
|
this._name = name;
|
|
19
17
|
}
|
|
20
|
-
/** Get the table name */
|
|
21
|
-
get Name() {
|
|
22
|
-
return this._name;
|
|
23
|
-
}
|
|
24
18
|
/** Get raw column information */
|
|
25
19
|
TableColumnInformation() {
|
|
26
20
|
return __awaiter(this, void 0, void 0, function* () {
|
|
27
|
-
return
|
|
21
|
+
return Query.tableColumnInformation(this._name);
|
|
28
22
|
});
|
|
29
23
|
}
|
|
30
24
|
/** Get readable, formatted column information */
|
|
@@ -43,25 +37,24 @@ export default class Table {
|
|
|
43
37
|
Drop() {
|
|
44
38
|
return __awaiter(this, void 0, void 0, function* () {
|
|
45
39
|
const queryStr = `DROP TABLE IF EXISTS "${this._name}";`;
|
|
46
|
-
const query = new Query(this, queryStr
|
|
40
|
+
const query = new Query(this._name, queryStr);
|
|
47
41
|
yield query.Run();
|
|
48
42
|
});
|
|
49
43
|
}
|
|
50
44
|
/** Fetch records with optional filtering, ordering, and pagination */
|
|
51
45
|
Records(options) {
|
|
52
46
|
return __awaiter(this, void 0, void 0, function* () {
|
|
53
|
-
const queryStr = QueryStatementBuilder.BuildSelect(this, {
|
|
47
|
+
const queryStr = QueryStatementBuilder.BuildSelect(this._name, {
|
|
54
48
|
select: options === null || options === void 0 ? void 0 : options.select,
|
|
55
49
|
where: options === null || options === void 0 ? void 0 : options.where,
|
|
56
50
|
orderBy: options === null || options === void 0 ? void 0 : options.orderBy,
|
|
57
51
|
limit: options === null || options === void 0 ? void 0 : options.limit,
|
|
58
52
|
offset: options === null || options === void 0 ? void 0 : options.offset,
|
|
59
53
|
});
|
|
60
|
-
const query = new Query(this, queryStr
|
|
54
|
+
const query = new Query(this._name, queryStr);
|
|
61
55
|
if ((options === null || options === void 0 ? void 0 : options.where) && Object.keys(options.where).length > 0)
|
|
62
56
|
query.Parameters = options.where;
|
|
63
57
|
const results = yield query.All();
|
|
64
|
-
// Wrap each result in a Record object
|
|
65
58
|
return results;
|
|
66
59
|
});
|
|
67
60
|
}
|
|
@@ -80,49 +73,55 @@ export default class Table {
|
|
|
80
73
|
/** Get the total count of records */
|
|
81
74
|
RecordsCount() {
|
|
82
75
|
return __awaiter(this, void 0, void 0, function* () {
|
|
83
|
-
const
|
|
84
|
-
const count = yield
|
|
85
|
-
return
|
|
76
|
+
const query = new Query(this._name, `SELECT COUNT(*) as count FROM "${this._name}";`);
|
|
77
|
+
const count = yield query.Count();
|
|
78
|
+
return count || 0;
|
|
86
79
|
});
|
|
87
80
|
}
|
|
88
81
|
/** Insert a record into the table */
|
|
89
82
|
Insert(values) {
|
|
90
83
|
return __awaiter(this, void 0, void 0, function* () {
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
throw new Error("Cannot insert record with no columns");
|
|
95
|
-
}
|
|
96
|
-
const queryStr = QueryStatementBuilder.BuildInsert(this, values);
|
|
97
|
-
const query = new Query(this, queryStr, this._adapter);
|
|
98
|
-
query.Parameters = values;
|
|
99
|
-
const result = yield query.Run();
|
|
100
|
-
let recordId;
|
|
101
|
-
// For PostgreSQL compatibility: use 'id' from values if lastInsertRowid is undefined
|
|
102
|
-
if (Array.isArray(values)) {
|
|
103
|
-
recordId = (_a = result === null || result === void 0 ? void 0 : result.lastInsertRowid) !== null && _a !== void 0 ? _a : values.map(v => v.column === 'id' ? v.value : undefined);
|
|
104
|
-
}
|
|
105
|
-
else {
|
|
106
|
-
recordId = (_b = result === null || result === void 0 ? void 0 : result.lastInsertRowid) !== null && _b !== void 0 ? _b : values.id;
|
|
107
|
-
}
|
|
108
|
-
if (recordId === undefined) {
|
|
109
|
-
return undefined;
|
|
110
|
-
}
|
|
111
|
-
return this.Record({
|
|
112
|
-
where: { id: recordId }
|
|
113
|
-
});
|
|
84
|
+
const record = new Record(values, this._name);
|
|
85
|
+
yield record.Insert();
|
|
86
|
+
return record;
|
|
114
87
|
});
|
|
115
88
|
}
|
|
116
89
|
/** Perform JOIN operations with other tables */
|
|
117
90
|
Join(Joins, options) {
|
|
118
91
|
return __awaiter(this, void 0, void 0, function* () {
|
|
119
|
-
const queryString = QueryStatementBuilder.BuildJoin(this, Joins, options);
|
|
120
|
-
const query = new Query(this, queryString
|
|
92
|
+
const queryString = QueryStatementBuilder.BuildJoin(this._name, Joins, options);
|
|
93
|
+
const query = new Query(this._name, queryString);
|
|
121
94
|
// Set parameters if WHERE clause is present
|
|
122
95
|
if (options === null || options === void 0 ? void 0 : options.where) {
|
|
123
96
|
query.Parameters = options.where;
|
|
124
97
|
}
|
|
125
|
-
|
|
98
|
+
const joinedTables = Array.isArray(Joins) ? Joins.map(j => j.fromTable) : [Joins.fromTable];
|
|
99
|
+
const records = yield query.All();
|
|
100
|
+
return yield this.splitJoinValues(records, joinedTables);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
splitJoinValues(records, joinedTables) {
|
|
104
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
105
|
+
const thisRecordColumns = (yield this.TableColumnInformation()).map(col => col.name);
|
|
106
|
+
const tableColumnsMap = new Map();
|
|
107
|
+
for (const tableName of joinedTables) {
|
|
108
|
+
const columns = (yield Query.tableColumnInformation(tableName)).map(col => col.name);
|
|
109
|
+
tableColumnsMap.set(tableName, columns);
|
|
110
|
+
}
|
|
111
|
+
return records.map(record => {
|
|
112
|
+
if (!record.values)
|
|
113
|
+
return record;
|
|
114
|
+
const thisRecordEntries = thisRecordColumns
|
|
115
|
+
.map(colName => [colName, record.values[colName]])
|
|
116
|
+
.filter(([, value]) => value !== undefined);
|
|
117
|
+
const joinedRecords = {};
|
|
118
|
+
for (const [tableName, tableColumns] of tableColumnsMap) {
|
|
119
|
+
const joinedRecordEntries = Object.entries(record.values)
|
|
120
|
+
.filter(([key]) => tableColumns.includes(key));
|
|
121
|
+
joinedRecords[tableName] = Object.fromEntries(joinedRecordEntries);
|
|
122
|
+
}
|
|
123
|
+
return new Record(Object.assign(Object.assign({}, Object.fromEntries(thisRecordEntries)), joinedRecords), this._name);
|
|
124
|
+
});
|
|
126
125
|
});
|
|
127
126
|
}
|
|
128
127
|
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { DefaultQueryOptions, QueryOptions, QueryCondition, Join, QueryWhereParameters } from "../types/index.js";
|
|
2
|
-
import Table from "../base/Table";
|
|
3
2
|
/** Utility class for building SQL query strings */
|
|
4
3
|
export default class QueryStatementBuilder {
|
|
5
4
|
/**
|
|
@@ -26,7 +25,7 @@ export default class QueryStatementBuilder {
|
|
|
26
25
|
* // "SELECT id, name, email FROM users WHERE status = @status AND age = @age ORDER BY created_at DESC LIMIT 10 OFFSET 20"
|
|
27
26
|
* ```
|
|
28
27
|
*/
|
|
29
|
-
static BuildSelect(
|
|
28
|
+
static BuildSelect(tableName: string, options?: DefaultQueryOptions & QueryOptions): string;
|
|
30
29
|
/**
|
|
31
30
|
* Build an INSERT SQL statement with named parameter placeholders
|
|
32
31
|
*
|
|
@@ -46,7 +45,7 @@ export default class QueryStatementBuilder {
|
|
|
46
45
|
* // Note: The actual values will be bound separately using the Parameters object
|
|
47
46
|
* ```
|
|
48
47
|
*/
|
|
49
|
-
static BuildInsert(
|
|
48
|
+
static BuildInsert(tableName: string, record: QueryWhereParameters): string;
|
|
50
49
|
/**
|
|
51
50
|
* Build an UPDATE SQL statement with SET clause and WHERE conditions
|
|
52
51
|
*
|
|
@@ -73,7 +72,7 @@ export default class QueryStatementBuilder {
|
|
|
73
72
|
* // "UPDATE users SET status = @status WHERE status = @status AND last_login = @last_login"
|
|
74
73
|
* ```
|
|
75
74
|
*/
|
|
76
|
-
static BuildUpdate(
|
|
75
|
+
static BuildUpdate(tableName: string, record: QueryCondition, where: QueryCondition): string;
|
|
77
76
|
/**
|
|
78
77
|
* Build a DELETE SQL statement with WHERE conditions
|
|
79
78
|
*
|
|
@@ -94,7 +93,7 @@ export default class QueryStatementBuilder {
|
|
|
94
93
|
* // "DELETE FROM users WHERE status = @status AND last_login = @last_login"
|
|
95
94
|
* ```
|
|
96
95
|
*/
|
|
97
|
-
static BuildDelete(
|
|
96
|
+
static BuildDelete(tableName: string, where: QueryCondition): string;
|
|
98
97
|
/**
|
|
99
98
|
* Build a COUNT SQL statement to count rows, optionally with WHERE conditions
|
|
100
99
|
*
|
|
@@ -116,7 +115,7 @@ export default class QueryStatementBuilder {
|
|
|
116
115
|
* // "SELECT COUNT(*) as count FROM users WHERE status = @status AND age = @age"
|
|
117
116
|
* ```
|
|
118
117
|
*/
|
|
119
|
-
static BuildCount(
|
|
118
|
+
static BuildCount(tableName: string, where?: QueryCondition): string;
|
|
120
119
|
/**
|
|
121
120
|
* Build a WHERE clause from parameter conditions (helper method)
|
|
122
121
|
*
|
|
@@ -192,7 +191,7 @@ export default class QueryStatementBuilder {
|
|
|
192
191
|
* );
|
|
193
192
|
* ```
|
|
194
193
|
*/
|
|
195
|
-
static BuildJoin(
|
|
194
|
+
static BuildJoin(fromTableName: string, joins: Join | Join[], options?: DefaultQueryOptions & QueryOptions): string;
|
|
196
195
|
/**
|
|
197
196
|
* Build JOIN clause(s) recursively (helper method)
|
|
198
197
|
*
|
|
@@ -232,7 +231,7 @@ export default class QueryStatementBuilder {
|
|
|
232
231
|
* // "INNER JOIN orders ON users.id = orders.user_id INNER JOIN products ON orders.id = products.product_id"
|
|
233
232
|
* ```
|
|
234
233
|
*/
|
|
235
|
-
static BuildJoinPart(
|
|
234
|
+
static BuildJoinPart(fromTableName: string, joins: Join | Join[]): string;
|
|
236
235
|
/**
|
|
237
236
|
* Build ON clause for JOIN operations (helper method)
|
|
238
237
|
*
|
|
@@ -265,7 +264,7 @@ export default class QueryStatementBuilder {
|
|
|
265
264
|
* // "ON users.id = orders.user_id AND users.company_id = orders.company_id"
|
|
266
265
|
* ```
|
|
267
266
|
*/
|
|
268
|
-
static BuildJoinOnPart(
|
|
267
|
+
static BuildJoinOnPart(tableName: string, joinTableName: string, on: QueryWhereParameters | QueryWhereParameters[]): string;
|
|
269
268
|
/**
|
|
270
269
|
* Build query options clause (ORDER BY, LIMIT, OFFSET) (helper method)
|
|
271
270
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryStatementBuilder.d.ts","sourceRoot":"","sources":["../../src/helpers/QueryStatementBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,cAAc,EAAE,IAAI,EAAmB,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"QueryStatementBuilder.d.ts","sourceRoot":"","sources":["../../src/helpers/QueryStatementBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,cAAc,EAAE,IAAI,EAAmB,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAEtI,mDAAmD;AACnD,MAAM,CAAC,OAAO,OAAO,qBAAqB;IACtC;;;;;;;;;;;;;;;;;;;;;;;OAuBG;WACW,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,YAAY,GAAG,MAAM;IAWlG;;;;;;;;;;;;;;;;;;OAkBG;WACW,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,oBAAoB,GAAG,MAAM;IAYlF;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;WACW,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,KAAK,EAAE,cAAc,GAAG,MAAM;IAWnG;;;;;;;;;;;;;;;;;;;OAmBG;WACW,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,MAAM;IAS3E;;;;;;;;;;;;;;;;;;;;OAoBG;WACW,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,cAAc,GAAG,MAAM;IAQ3E;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;WACW,UAAU,CAAC,KAAK,CAAC,EAAE,cAAc,GAAG,MAAM;IAgBxD,OAAO,CAAC,MAAM,CAAC,uBAAuB;IAStC,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAK/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2CG;WACW,SAAS,CACnB,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,EACpB,OAAO,CAAC,EAAE,mBAAmB,GAAG,YAAY,GAC7C,MAAM;IAWT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsCG;WACW,aAAa,CACvB,aAAa,EAAE,MAAM,EACrB,KAAK,EAAE,IAAI,GAAG,IAAI,EAAE,GACrB,MAAM;IAcT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;WACW,eAAe,CACzB,SAAS,EAAE,MAAM,EACjB,aAAa,EAAE,MAAM,EACrB,EAAE,EAAE,oBAAoB,GAAG,oBAAoB,EAAE,GAClD,MAAM;IAWT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgCG;WACW,iBAAiB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM;CAiBjE"}
|
|
@@ -24,11 +24,11 @@ export default class QueryStatementBuilder {
|
|
|
24
24
|
* // "SELECT id, name, email FROM users WHERE status = @status AND age = @age ORDER BY created_at DESC LIMIT 10 OFFSET 20"
|
|
25
25
|
* ```
|
|
26
26
|
*/
|
|
27
|
-
static BuildSelect(
|
|
27
|
+
static BuildSelect(tableName, options) {
|
|
28
28
|
var _a;
|
|
29
29
|
const queryParts = [];
|
|
30
30
|
queryParts.push(`SELECT ${(_a = options === null || options === void 0 ? void 0 : options.select) !== null && _a !== void 0 ? _a : "*"}`);
|
|
31
|
-
queryParts.push(`FROM "${
|
|
31
|
+
queryParts.push(`FROM "${tableName}"`);
|
|
32
32
|
queryParts.push(this.BuildWhere(options === null || options === void 0 ? void 0 : options.where));
|
|
33
33
|
queryParts.push(this.BuildQueryOptions(options !== null && options !== void 0 ? options : {}));
|
|
34
34
|
return queryParts.join(" ");
|
|
@@ -52,12 +52,12 @@ export default class QueryStatementBuilder {
|
|
|
52
52
|
* // Note: The actual values will be bound separately using the Parameters object
|
|
53
53
|
* ```
|
|
54
54
|
*/
|
|
55
|
-
static BuildInsert(
|
|
55
|
+
static BuildInsert(tableName, record) {
|
|
56
56
|
const queryParts = [];
|
|
57
57
|
const columns = Object.keys(record);
|
|
58
58
|
const placeholders = columns.map(col => `@${col}`);
|
|
59
|
-
queryParts.push(`INSERT INTO "${
|
|
60
|
-
queryParts.push(`(${columns.join(", ")})`);
|
|
59
|
+
queryParts.push(`INSERT INTO "${tableName}"`);
|
|
60
|
+
queryParts.push(`(${columns.map(c => `"${c}"`).join(", ")})`);
|
|
61
61
|
queryParts.push(`VALUES (${placeholders.join(", ")})`);
|
|
62
62
|
return queryParts.join(" ");
|
|
63
63
|
}
|
|
@@ -87,10 +87,10 @@ export default class QueryStatementBuilder {
|
|
|
87
87
|
* // "UPDATE users SET status = @status WHERE status = @status AND last_login = @last_login"
|
|
88
88
|
* ```
|
|
89
89
|
*/
|
|
90
|
-
static BuildUpdate(
|
|
90
|
+
static BuildUpdate(tableName, record, where) {
|
|
91
91
|
const queryParts = [];
|
|
92
92
|
const setClauses = Object.keys(record).map(col => `${col} = @${col}`);
|
|
93
|
-
queryParts.push(`UPDATE "${
|
|
93
|
+
queryParts.push(`UPDATE "${tableName}"`);
|
|
94
94
|
queryParts.push(`SET ${setClauses.join(", ")}`);
|
|
95
95
|
queryParts.push(this.BuildWhere(where));
|
|
96
96
|
return queryParts.join(" ");
|
|
@@ -115,9 +115,9 @@ export default class QueryStatementBuilder {
|
|
|
115
115
|
* // "DELETE FROM users WHERE status = @status AND last_login = @last_login"
|
|
116
116
|
* ```
|
|
117
117
|
*/
|
|
118
|
-
static BuildDelete(
|
|
118
|
+
static BuildDelete(tableName, where) {
|
|
119
119
|
const queryParts = [];
|
|
120
|
-
queryParts.push(`DELETE FROM "${
|
|
120
|
+
queryParts.push(`DELETE FROM "${tableName}"`);
|
|
121
121
|
queryParts.push(this.BuildWhere(where));
|
|
122
122
|
return queryParts.join(" ");
|
|
123
123
|
}
|
|
@@ -142,9 +142,9 @@ export default class QueryStatementBuilder {
|
|
|
142
142
|
* // "SELECT COUNT(*) as count FROM users WHERE status = @status AND age = @age"
|
|
143
143
|
* ```
|
|
144
144
|
*/
|
|
145
|
-
static BuildCount(
|
|
145
|
+
static BuildCount(tableName, where) {
|
|
146
146
|
const queryParts = [];
|
|
147
|
-
queryParts.push(`SELECT COUNT(*) as count FROM "${
|
|
147
|
+
queryParts.push(`SELECT COUNT(*) as count FROM "${tableName}"`);
|
|
148
148
|
queryParts.push(this.BuildWhere(where));
|
|
149
149
|
return queryParts.join(" ");
|
|
150
150
|
}
|
|
@@ -245,12 +245,12 @@ export default class QueryStatementBuilder {
|
|
|
245
245
|
* );
|
|
246
246
|
* ```
|
|
247
247
|
*/
|
|
248
|
-
static BuildJoin(
|
|
248
|
+
static BuildJoin(fromTableName, joins, options) {
|
|
249
249
|
var _a;
|
|
250
250
|
const queryParts = [];
|
|
251
251
|
queryParts.push(`SELECT ${(_a = options === null || options === void 0 ? void 0 : options.select) !== null && _a !== void 0 ? _a : "*"}`);
|
|
252
|
-
queryParts.push(`FROM "${
|
|
253
|
-
queryParts.push(this.BuildJoinPart(
|
|
252
|
+
queryParts.push(`FROM "${fromTableName}"`);
|
|
253
|
+
queryParts.push(this.BuildJoinPart(fromTableName, joins));
|
|
254
254
|
queryParts.push(this.BuildWhere(options === null || options === void 0 ? void 0 : options.where));
|
|
255
255
|
queryParts.push(this.BuildQueryOptions(options !== null && options !== void 0 ? options : {}));
|
|
256
256
|
return queryParts.join(" ");
|
|
@@ -294,14 +294,14 @@ export default class QueryStatementBuilder {
|
|
|
294
294
|
* // "INNER JOIN orders ON users.id = orders.user_id INNER JOIN products ON orders.id = products.product_id"
|
|
295
295
|
* ```
|
|
296
296
|
*/
|
|
297
|
-
static BuildJoinPart(
|
|
297
|
+
static BuildJoinPart(fromTableName, joins) {
|
|
298
298
|
const queryParts = [];
|
|
299
299
|
const joinsArray = Array.isArray(joins) ? joins : [joins];
|
|
300
|
-
let
|
|
300
|
+
let currentTableName = fromTableName;
|
|
301
301
|
for (const join of joinsArray) {
|
|
302
|
-
queryParts.push(`${join.joinType} JOIN "${join.fromTable
|
|
303
|
-
queryParts.push(this.BuildJoinOnPart(
|
|
304
|
-
|
|
302
|
+
queryParts.push(`${join.joinType} JOIN "${join.fromTable}"`);
|
|
303
|
+
queryParts.push(this.BuildJoinOnPart(currentTableName, join.fromTable, join.on));
|
|
304
|
+
currentTableName = join.fromTable;
|
|
305
305
|
}
|
|
306
306
|
return queryParts.join(" ");
|
|
307
307
|
}
|
|
@@ -337,11 +337,11 @@ export default class QueryStatementBuilder {
|
|
|
337
337
|
* // "ON users.id = orders.user_id AND users.company_id = orders.company_id"
|
|
338
338
|
* ```
|
|
339
339
|
*/
|
|
340
|
-
static BuildJoinOnPart(
|
|
340
|
+
static BuildJoinOnPart(tableName, joinTableName, on) {
|
|
341
341
|
const queryParts = [];
|
|
342
342
|
const onArray = Array.isArray(on) ? on : [on];
|
|
343
343
|
for (const onPart of onArray) {
|
|
344
|
-
queryParts.push(`ON ${
|
|
344
|
+
queryParts.push(`ON ${tableName}.${Object.values(onPart)[0]} = ${joinTableName}.${Object.keys(onPart)[0]}`);
|
|
345
345
|
}
|
|
346
346
|
return queryParts.join(" AND ");
|
|
347
347
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -44,7 +44,6 @@
|
|
|
44
44
|
*
|
|
45
45
|
* @packageDocumentation
|
|
46
46
|
*/
|
|
47
|
-
import Database from "./base/Database.js";
|
|
48
47
|
import Table from "./base/Table.js";
|
|
49
48
|
import Record from "./base/Record.js";
|
|
50
49
|
import Query from "./base/Query.js";
|
|
@@ -58,6 +57,6 @@ import IStatementAdapter from "./interfaces/IStatementAdapter.js";
|
|
|
58
57
|
import IController from "./interfaces/IController.js";
|
|
59
58
|
import IMigration from "./interfaces/IMigration.js";
|
|
60
59
|
import ISchemaBuilder from "./interfaces/ISchemaBuilder.js";
|
|
61
|
-
export {
|
|
60
|
+
export { Model, Table, Query, Record, Repository, Container, SchemaTableBuilder, AbstractSchemaBuilder, IDatabaseAdapter, IStatementAdapter, IController, IMigration, ISchemaBuilder, };
|
|
62
61
|
export * from "./types/index.js";
|
|
63
62
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAEH,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAEH,OAAO,KAAK,MAAM,iBAAiB,CAAC;AACpC,OAAO,MAAM,MAAM,kBAAkB,CAAC;AACtC,OAAO,KAAK,MAAM,iBAAiB,CAAC;AAEpC,OAAO,KAAK,MAAM,qBAAqB,CAAC;AACxC,OAAO,kBAAkB,MAAM,kCAAkC,CAAC;AAClE,OAAO,qBAAqB,MAAM,oCAAoC,CAAC;AAEvE,OAAO,UAAU,MAAM,yBAAyB,CAAC;AACjD,OAAO,SAAS,MAAM,wBAAwB,CAAC;AAE/C,OAAO,gBAAgB,MAAM,sCAAsC,CAAC;AACpE,OAAO,iBAAiB,MAAM,uCAAuC,CAAC;AACtE,OAAO,WAAW,MAAM,iCAAiC,CAAC;AAC1D,OAAO,UAAU,MAAM,gCAAgC,CAAC;AACxD,OAAO,cAAc,MAAM,oCAAoC,CAAC;AAEhE,OAAO,EACH,KAAK,EACL,KAAK,EACL,KAAK,EACL,MAAM,EACN,UAAU,EACV,SAAS,EAET,kBAAkB,EAClB,qBAAqB,EAErB,gBAAgB,EAChB,iBAAiB,EACjB,WAAW,EACX,UAAU,EACV,cAAc,GACjB,CAAC;AAEF,cAAc,kBAAkB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -44,7 +44,6 @@
|
|
|
44
44
|
*
|
|
45
45
|
* @packageDocumentation
|
|
46
46
|
*/
|
|
47
|
-
import Database from "./base/Database.js";
|
|
48
47
|
import Table from "./base/Table.js";
|
|
49
48
|
import Record from "./base/Record.js";
|
|
50
49
|
import Query from "./base/Query.js";
|
|
@@ -52,5 +51,5 @@ import Model from "./abstract/Model.js";
|
|
|
52
51
|
import SchemaTableBuilder from "./abstract/SchemaTableBuilder.js";
|
|
53
52
|
import Repository from "./runtime/Repository.js";
|
|
54
53
|
import Container from "./runtime/Container.js";
|
|
55
|
-
export {
|
|
54
|
+
export { Model, Table, Query, Record, Repository, Container, SchemaTableBuilder, };
|
|
56
55
|
export * from "./types/index.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Container.d.ts","sourceRoot":"","sources":["../../src/runtime/Container.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,MAAM,sCAAsC,CAAC;AAEpE,cAAM,SAAS;IACX,OAAO,CAAC,MAAM,CAAC,SAAS,CAAY;IACpC,OAAO,CAAC,SAAS,CAA4C;IAC7D,OAAO,CAAC,eAAe,CAAC,CAAmB;IAE3C,OAAO;WAEO,WAAW,IAAI,SAAS;IAO/B,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,SAAS,UAAQ,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"Container.d.ts","sourceRoot":"","sources":["../../src/runtime/Container.ts"],"names":[],"mappings":"AAAA,OAAO,gBAAgB,MAAM,sCAAsC,CAAC;AAEpE,cAAM,SAAS;IACX,OAAO,CAAC,MAAM,CAAC,SAAS,CAAY;IACpC,OAAO,CAAC,SAAS,CAA4C;IAC7D,OAAO,CAAC,eAAe,CAAC,CAAmB;IAE3C,OAAO;WAEO,WAAW,IAAI,SAAS;IAO/B,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,EAAE,SAAS,UAAQ,GAAG,IAAI;IAYjF,UAAU,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,gBAAgB;CASrD;AAED,eAAe,SAAS,CAAC"}
|
|
@@ -11,6 +11,10 @@ class Container {
|
|
|
11
11
|
registerAdapter(name, adapter, isDefault = false) {
|
|
12
12
|
this._adapters.set(name, adapter);
|
|
13
13
|
if (isDefault || !this._defaultAdapter) {
|
|
14
|
+
if (this._defaultAdapter) {
|
|
15
|
+
// eslint-disable-next-line no-undef
|
|
16
|
+
console.warn(`Setting default adapter to '${name}'`);
|
|
17
|
+
}
|
|
14
18
|
this._defaultAdapter = adapter;
|
|
15
19
|
}
|
|
16
20
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type Model from "../abstract/Model.js";
|
|
2
|
-
import { columnType, QueryCondition } from "../types/index";
|
|
2
|
+
import { columnType, QueryCondition, QueryOptions } from "../types/index";
|
|
3
3
|
export default class Repository<Type extends columnType, ModelType extends Model<Type>> {
|
|
4
4
|
private static _instances;
|
|
5
5
|
private models;
|
|
@@ -10,8 +10,8 @@ export default class Repository<Type extends columnType, ModelType extends Model
|
|
|
10
10
|
getModel(name: string): ModelType;
|
|
11
11
|
save(attributes: Type): Promise<void>;
|
|
12
12
|
first(conditions: QueryCondition, Model: Model<Type>): Promise<Type | null>;
|
|
13
|
-
get(conditions: QueryCondition, Model: Model<Type>): Promise<Type[]>;
|
|
14
|
-
all(Model: Model<Type
|
|
13
|
+
get(conditions: QueryCondition, queryOptions: QueryOptions, Model: Model<Type>): Promise<Type[]>;
|
|
14
|
+
all(Model: Model<Type>, queryOptions?: QueryOptions): Promise<Type[]>;
|
|
15
15
|
update(attributes: Partial<Type>): Promise<this>;
|
|
16
16
|
private join;
|
|
17
17
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Repository.d.ts","sourceRoot":"","sources":["../../src/runtime/Repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,yBAAyB,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAQ,cAAc,
|
|
1
|
+
{"version":3,"file":"Repository.d.ts","sourceRoot":"","sources":["../../src/runtime/Repository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,yBAAyB,CAAC;AAEjD,OAAO,EAAE,UAAU,EAAQ,cAAc,EAAE,YAAY,EAAY,MAAM,mBAAmB,CAAC;AAE7F,MAAM,CAAC,OAAO,OAAO,UAAU,CAAC,IAAI,SAAS,UAAU,EAAE,SAAS,SAAS,KAAK,CAAC,IAAI,CAAC;IAClF,OAAO,CAAC,MAAM,CAAC,UAAU,CAAqE;IAC9F,OAAO,CAAC,MAAM,CAAqC;IACnD,OAAO,CAAC,KAAK,CAAO;gBAER,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS;WAMtC,WAAW,CAAC,SAAS,SAAS,UAAU,EAClD,UAAU,EAAE,UAAU,KAAK,CAAC,SAAS,CAAC,EACtC,SAAS,EAAE,MAAM,GAClB,UAAU,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;IAWnC,SAAS,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAKjC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS;IAI3B,IAAI,CAAC,UAAU,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAIrC,KAAK,CAAC,UAAU,EAAE,cAAc,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAW3E,GAAG,CAAC,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAQhG,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAQrE,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YAe/C,IAAI;CAoBrB"}
|
|
@@ -50,23 +50,23 @@ class Repository {
|
|
|
50
50
|
return record ? record.values : null;
|
|
51
51
|
});
|
|
52
52
|
}
|
|
53
|
-
get(conditions, Model) {
|
|
53
|
+
get(conditions, queryOptions, Model) {
|
|
54
54
|
return __awaiter(this, void 0, void 0, function* () {
|
|
55
55
|
if (Model.JoinedEntities.length > 0) {
|
|
56
|
-
return yield this.join(Model, conditions);
|
|
56
|
+
return yield this.join(Model, conditions, queryOptions);
|
|
57
57
|
}
|
|
58
58
|
else {
|
|
59
|
-
return yield this.Table.Records({ where: conditions }).then(records => records.map(record => record.values));
|
|
59
|
+
return yield this.Table.Records(Object.assign({ where: conditions }, queryOptions)).then(records => records.map(record => record.values));
|
|
60
60
|
}
|
|
61
61
|
});
|
|
62
62
|
}
|
|
63
|
-
all(Model) {
|
|
63
|
+
all(Model, queryOptions) {
|
|
64
64
|
return __awaiter(this, void 0, void 0, function* () {
|
|
65
65
|
if (Model.JoinedEntities.length > 0) {
|
|
66
66
|
return yield this.join(Model);
|
|
67
67
|
}
|
|
68
68
|
else {
|
|
69
|
-
return yield this.Table.Records().then(records => records.map(record => record.values));
|
|
69
|
+
return yield this.Table.Records(queryOptions).then(records => records.map(record => record.values));
|
|
70
70
|
}
|
|
71
71
|
});
|
|
72
72
|
}
|
|
@@ -95,7 +95,7 @@ class Repository {
|
|
|
95
95
|
}
|
|
96
96
|
const JoinType = relation.type === 'hasOne' || relation.type === 'belongsTo' ? 'INNER' : 'LEFT';
|
|
97
97
|
return {
|
|
98
|
-
fromTable:
|
|
98
|
+
fromTable: relation.model.Configuration.table,
|
|
99
99
|
joinType: JoinType,
|
|
100
100
|
on: [
|
|
101
101
|
{ [relation.foreignKey]: relation.localKey }
|
package/dist/types/table.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { QueryValues, QueryWhereParameters } from "../index";
|
|
2
|
-
import Table from "../base/Table.js";
|
|
3
2
|
export type TableColumnInfo = {
|
|
4
3
|
cid: number;
|
|
5
4
|
name: string;
|
|
@@ -25,7 +24,7 @@ export type ColumnDefinition = {
|
|
|
25
24
|
autoincrement?: boolean;
|
|
26
25
|
};
|
|
27
26
|
export type Join = {
|
|
28
|
-
fromTable:
|
|
27
|
+
fromTable: string;
|
|
29
28
|
joinType: 'INNER' | 'LEFT' | 'RIGHT' | 'FULL';
|
|
30
29
|
on: QueryWhereParameters | QueryWhereParameters[];
|
|
31
30
|
where?: QueryWhereParameters | QueryWhereParameters[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/types/table.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"table.d.ts","sourceRoot":"","sources":["../../src/types/table.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAE1D,MAAM,MAAM,eAAe,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,EAAE,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW,CAAA;CAAE,CAAC;AAExD,MAAM,MAAM,uBAAuB,GAAG;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,IAAI,GAAG;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;IAC9C,EAAE,EAAE,oBAAoB,GAAG,oBAAoB,EAAE,CAAC;IAClD,KAAK,CAAC,EAAE,oBAAoB,GAAG,oBAAoB,EAAE,CAAC;CACzD,CAAA"}
|
package/package.json
CHANGED
package/dist/base/Database.d.ts
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
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
|
|
@@ -1 +0,0 @@
|
|
|
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"}
|
package/dist/base/Database.js
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
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
|
-
}
|